NAFPack_ANSI_ASCII.f90 Source File


This file depends on

sourcefile~~nafpack_ansi_ascii.f90~~EfferentGraph sourcefile~nafpack_ansi_ascii.f90 NAFPack_ANSI_ASCII.f90 sourcefile~nafpack_ansi.f90 NAFPack_ANSI.f90 sourcefile~nafpack_ansi_ascii.f90->sourcefile~nafpack_ansi.f90 sourcefile~nafpack_io_utils.f90 NAFPack_io_utils.f90 sourcefile~nafpack_ansi.f90->sourcefile~nafpack_io_utils.f90 sourcefile~nafpack_kinds.f90 NAFPack_kinds.f90 sourcefile~nafpack_ansi.f90->sourcefile~nafpack_kinds.f90 sourcefile~nafpack_io_utils.f90->sourcefile~nafpack_kinds.f90

Source Code

submodule(NAFPack_ANSI) NAFPack_ANSI_ASCII

    character(len=1, kind=ascii), parameter :: esc = char(27)
    character(len=2, kind=ascii), parameter :: CSI = esc//"["
    character(len=1, kind=ascii), parameter :: final_character = "m"
    character(len=1, kind=ascii), parameter :: delimiter = ";"

contains

    module subroutine init_colors_ascii(this)
        class(ColorsAscii), intent(out) :: this
        this%reset = create_ansi_ascii(Ansi_Constants%STYLE_RESET)
        this%bold = create_ansi_ascii(Ansi_Constants%STYLE_BOLD)
        this%faint = create_ansi_ascii(Ansi_Constants%STYLE_FAINT)
        this%italic = create_ansi_ascii(Ansi_Constants%STYLE_ITALIC)
        this%underline = create_ansi_ascii(Ansi_Constants%STYLE_UNDERLINE)
        this%blink = create_ansi_ascii(Ansi_Constants%STYLE_BLINK)
        this%reverse = create_ansi_ascii(Ansi_Constants%STYLE_REVERSE)
        this%hidden = create_ansi_ascii(Ansi_Constants%STYLE_HIDDEN)
        this%strikethrough = create_ansi_ascii(Ansi_Constants%STYLE_STRIKETHROUGH)
        this%red = create_ansi_ascii(Ansi_Constants%FG_RED)
        this%green = create_ansi_ascii(Ansi_Constants%FG_GREEN)
        this%yellow = create_ansi_ascii(Ansi_Constants%FG_YELLOW)
        this%blue = create_ansi_ascii(Ansi_Constants%FG_BLUE)
        this%magenta = create_ansi_ascii(Ansi_Constants%FG_MAGENTA)
        this%cyan = create_ansi_ascii(Ansi_Constants%FG_CYAN)
        this%white = create_ansi_ascii(Ansi_Constants%FG_WHITE)
        this%bright_red = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_RED)
        this%bright_green = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_GREEN)
        this%bright_yellow = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_YELLOW)
        this%bright_blue = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_BLUE)
        this%bright_magenta = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_MAGENTA)
        this%bright_cyan = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_CYAN)
        this%bright_white = create_ansi_ascii(Ansi_Constants%FG_BRIGHT_WHITE)
    end subroutine init_colors_ascii

    pure module function create_ansi_ascii(ansi_code) result(ansi_string)
        type(AnsiCode), intent(in) :: ansi_code
        character(len=:, kind=ascii), allocatable :: ansi_string
        integer(i8) :: style
        integer(i16) :: fg, bg

        ansi_string = CSI//"0" !Always reset

        if (ansi_code%use_style) then
            style = ansi_code%style
            ansi_string = ansi_string//delimiter//to_str_ascii(style)
        end if

        if (ansi_code%use_fg) then
            fg = int(ansi_code%fg, kind=i16)
            ansi_string = ansi_string//delimiter//"38;5;"//to_str_ascii(fg)
        end if

        if (ansi_code%use_bg) then
            bg = int(ansi_code%bg, kind=i16)
            ansi_string = ansi_string//delimiter//"48;5;"//to_str_ascii(bg)
        end if

        if (.not. (ansi_code%use_style .or. ansi_code%use_fg .or. ansi_code%use_bg)) then
            style = ansi_code%style
            ansi_string = ansi_string//delimiter//to_str_ascii(style)
        end if

        ansi_string = ansi_string//"m"

    end function create_ansi_ascii

    pure module function apply_style_ascii(text, style) result(styled_text)
        character(*, kind=ascii), intent(in) :: text
        type(AnsiCode), intent(in) :: style
        character(:, kind=ascii), allocatable :: styled_text

        styled_text = create_ansi_ascii(style)//text//create_ansi_ascii(Ansi_Constants%STYLE_RESET)
    end function apply_style_ascii

    pure module function colorize_text_ascii(text, color) result(colored_text)
        character(*, kind=ascii), intent(in) :: text
        integer(i16), intent(in) :: color
        character(:, kind=ascii), allocatable :: colored_text

        colored_text = apply_style_ascii(text, set_ansi_code(fg_color=color))
    end function colorize_text_ascii

    subroutine cursor_position_ascii(row, col)
        integer, intent(in) :: row, col
        character(:, kind=ascii), allocatable :: sequence
        character(:, kind=ascii), allocatable :: temp

        write (temp, '(I0,A,I0)') row, delimiter, col
        sequence = CSI//temp//'H'
        write (output_unit, '(A)', advance='no') sequence
    end subroutine cursor_position_ascii

    subroutine clear_screen_ascii()
        write (*, '(A)', advance='no') CSI//'2J'
    end subroutine clear_screen_ascii

    subroutine clear_line_ascii()
        write (*, '(A)', advance='no') CSI//'2K'
    end subroutine clear_line_ascii

    subroutine save_cursor_ascii()
        write (*, '(A)', advance='no') CSI//'s'
    end subroutine save_cursor_ascii

    subroutine restore_cursor_ascii()
        write (*, '(A)', advance='no') CSI//'u'
    end subroutine restore_cursor_ascii

end submodule NAFPack_ANSI_ASCII