fortplot_doc_media.f90 Source File


Source Code

module fortplot_doc_media
    !! Media file scanning for documentation generation
    use fortplot_doc_constants, only: FILENAME_MAX_LEN, PATH_MAX_LEN, MAX_MEDIA_FILES
    implicit none
    private
    
    ! Public interface
    public :: scan_directory_for_media, add_if_exists
    
contains

    subroutine scan_directory_for_media(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        n_media = 0
        
        select case(trim(dir))
        case('output/example/fortran/animation')
            call add_animation_files(dir, media_files, n_media)
        case('output/example/fortran/basic_plots')
            call add_basic_plot_files(dir, media_files, n_media)
        case('output/example/fortran/line_styles')
            call add_line_style_files(dir, media_files, n_media)
        case('output/example/fortran/contour_demo')
            call add_contour_files(dir, media_files, n_media)
        case('output/example/fortran/scale_examples')
            call add_scale_files(dir, media_files, n_media)
        case('output/example/fortran/marker_demo')
            call add_marker_files(dir, media_files, n_media)
        case('output/example/fortran/colored_contours')
            call add_colored_contour_files(dir, media_files, n_media)
        case('output/example/fortran/legend_demo')
            call add_legend_files(dir, media_files, n_media)
        case('output/example/fortran/legend_box_demo')
            call add_legend_box_files(dir, media_files, n_media)
        case('output/example/fortran/format_string_demo')
            call add_format_string_files(dir, media_files, n_media)
        case('output/example/fortran/pcolormesh_demo')
            call add_pcolormesh_files(dir, media_files, n_media)
        case('output/example/fortran/streamplot_demo')
            call add_streamplot_files(dir, media_files, n_media)
        case('output/example/fortran/unicode_demo')
            call add_unicode_files(dir, media_files, n_media)
        case('output/example/fortran/annotation_demo')
            call add_annotation_demo_files(dir, media_files, n_media)
        case default
            call add_default_pattern_files(dir, media_files, n_media)
        end select
    end subroutine scan_directory_for_media
    
    subroutine add_animation_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'animation.mp4', media_files, n_media)
    end subroutine add_animation_files
    
    subroutine add_basic_plot_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'simple_plot.png', media_files, n_media)
        call add_if_exists(dir, 'multi_line.png', media_files, n_media)
    end subroutine add_basic_plot_files
    
    subroutine add_line_style_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'line_styles.png', media_files, n_media)
    end subroutine add_line_style_files
    
    subroutine add_contour_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'contour_gaussian.png', media_files, n_media)
        call add_if_exists(dir, 'mixed_plot.png', media_files, n_media)
    end subroutine add_contour_files
    
    subroutine add_scale_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'log_scale.png', media_files, n_media)
        call add_if_exists(dir, 'symlog_scale.png', media_files, n_media)
    end subroutine add_scale_files
    
    subroutine add_marker_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'scatter_plot.png', media_files, n_media)
        call add_if_exists(dir, 'all_marker_types.png', media_files, n_media)
        call add_if_exists(dir, 'marker_colors.png', media_files, n_media)
    end subroutine add_marker_files
    
    subroutine add_colored_contour_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'gaussian_default.png', media_files, n_media)
        call add_if_exists(dir, 'ripple_jet.png', media_files, n_media)
        call add_if_exists(dir, 'ripple_coolwarm.png', media_files, n_media)
        call add_if_exists(dir, 'ripple_inferno.png', media_files, n_media)
        call add_if_exists(dir, 'saddle_plasma.png', media_files, n_media)
    end subroutine add_colored_contour_files
    
    subroutine add_legend_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'basic_legend.png', media_files, n_media)
        call add_if_exists(dir, 'legend_upper_left.png', media_files, n_media)
        call add_if_exists(dir, 'legend_upper_right.png', media_files, n_media)
        call add_if_exists(dir, 'legend_lower_left.png', media_files, n_media)
        call add_if_exists(dir, 'legend_lower_right.png', media_files, n_media)
        call add_if_exists(dir, 'multi_function_legend.png', media_files, n_media)
    end subroutine add_legend_files
    
    subroutine add_legend_box_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'legend_box_demo_default.png', media_files, n_media)
        call add_if_exists(dir, 'legend_box_demo_upper_left.png', media_files, n_media)
        call add_if_exists(dir, 'legend_box_demo_lower_right.png', media_files, n_media)
    end subroutine add_legend_box_files
    
    subroutine add_format_string_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'format_string_demo.png', media_files, n_media)
    end subroutine add_format_string_files
    
    subroutine add_pcolormesh_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'pcolormesh_basic.png', media_files, n_media)
        call add_if_exists(dir, 'pcolormesh_plasma.png', media_files, n_media)
        call add_if_exists(dir, 'pcolormesh_sinusoidal.png', media_files, n_media)
    end subroutine add_pcolormesh_files
    
    subroutine add_streamplot_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'streamplot_demo.png', media_files, n_media)
    end subroutine add_streamplot_files
    
    subroutine add_unicode_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'unicode_demo.png', media_files, n_media)
        call add_if_exists(dir, 'math_examples.png', media_files, n_media)
    end subroutine add_unicode_files
    
    
    subroutine add_annotation_demo_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        call add_if_exists(dir, 'annotation_demo.png', media_files, n_media)
    end subroutine add_annotation_demo_files
    
    subroutine add_default_pattern_files(dir, media_files, n_media)
        character(len=*), intent(in) :: dir
        character(len=*), intent(out) :: media_files(:)
        integer, intent(out) :: n_media
        
        character(len=FILENAME_MAX_LEN) :: test_file
        
        test_file = dir(index(dir, '/', back=.true.)+1:) // '.png'
        call add_if_exists(dir, test_file, media_files, n_media)
    end subroutine add_default_pattern_files
    
    subroutine add_if_exists(dir, filename, files, n)
        character(len=*), intent(in) :: dir, filename
        character(len=*), intent(inout) :: files(:)
        integer, intent(inout) :: n
        
        character(len=PATH_MAX_LEN) :: full_path
        logical :: exists
        
        full_path = trim(dir) // '/' // trim(filename)
        inquire(file=trim(full_path), exist=exists)
        if (exists .and. n < size(files)) then
            n = n + 1
            files(n) = filename
        end if
    end subroutine add_if_exists

end module fortplot_doc_media