NAME

App::Greple::md - Greple module for Markdown syntax highlighting

SYNOPSIS

greple -Mmd file.md

greple -Mmd --mode=dark -- file.md

greple -Mmd --base-color=Crimson -- file.md

greple -Mmd --cm h1=RD -- file.md

greple -Mmd --no-table -- file.md

greple -Mmd --foldlist -- file.md

greple -Mmd -- --fold file.md

DESCRIPTION

App::Greple::md is a greple module for viewing Markdown files in the terminal with syntax highlighting.

It colorizes headings, bold, italic, strikethrough, inline code, fenced code blocks, HTML comments, blockquotes, horizontal rules, links, and images. Tables are formatted with aligned columns and optional Unicode box-drawing borders. Long lines in list items can be folded with proper indentation. Links become clickable via OSC 8 terminal hyperlinks in supported terminals.

Nested elements are handled with cumulative coloring: for example, a link inside a heading retains both its link color and the heading background color.

For a complete Markdown viewing experience with line folding, multi-column output, and themes, see App::mdee, which uses this module as its highlighting engine.

COMMAND OPTIONS

The following options are defined as greple command options (specified after --).

--fold

Enable text folding for list items and definition lists. Long lines are wrapped with proper indentation using ansifold(1) via Greple::tee. Code blocks, HTML comments, and tables are excluded from folding. The fold width is controlled by the foldwidth config parameter (default: 80).

greple -Mmd -- --fold file.md
greple -Mmd::config(foldwidth=60) -- --fold file.md

Supported list markers: *, -, 1., 1), #., #).

The module option --foldlist is a convenient alternative that enables folding via config.

MODULE OPTIONS

Module options are specified before -- to separate them from greple's own options:

greple -Mmd --mode=dark --cm h1=RD -- file.md

-m MODE, --mode=MODE

Set color mode. Available modes are light (default) and dark.

greple -Mmd -m dark -- file.md

-B COLOR, --base-color=COLOR

Override the base color used for headings, bold, links, and other elements. Accepts a named color (e.g., Crimson, DarkCyan) or a Term::ANSIColor::Concise color spec.

greple -Mmd -B Crimson -- file.md

--[no-]colorize

Enable or disable syntax highlighting. Enabled by default. When disabled, no color is applied to Markdown elements.

greple -Mmd --no-colorize -- file.md

--[no-]foldlist

Enable or disable text folding. Disabled by default. When enabled, long lines in list items and definition lists are wrapped with proper indentation. The fold width is controlled by the foldwidth config parameter (default: 80).

greple -Mmd --foldlist -- file.md
greple -Mmd::config(foldlist=1,foldwidth=60) file.md

See also the --fold command option.

--[no-]table

Enable or disable table formatting. When enabled (default), Markdown tables (3 or more consecutive pipe-delimited rows) are formatted with aligned columns using App::ansicolumn.

greple -Mmd --no-table -- file.md

--[no-]rule

Enable or disable Unicode box-drawing characters for table borders. When enabled (default), ASCII pipe characters (|) are replaced with vertical lines (), and separator row dashes become horizontal rules () with corner pieces (, , ).

greple -Mmd --no-rule -- file.md

--colormap LABEL=SPEC, --cm LABEL=SPEC

Override the color for a specific element. LABEL is one of the color labels listed in "COLOR LABELS". SPEC follows Term::ANSIColor::Concise format and supports sub{...} function specs via Getopt::EX::Colormap.

greple -Mmd --cm h1=RD -- file.md
greple -Mmd --cm bold='${base}D' -- file.md

--heading-markup[=STEPS], --hm[=STEPS]

Control inline markup processing inside headings. By default, headings are rendered with uniform heading color without processing bold, italic, strikethrough, or inline code inside them. Links are always processed as OSC 8 hyperlinks regardless of this option.

Without an argument, all inline formatting becomes visible within headings using cumulative coloring. With an argument, only the specified steps are processed inside headings. Steps are separated by colons.

Available steps: inline_code, horizontal_rules, bold, italic, strike.

greple -Mmd --hm -- file.md                  # all markup
greple -Mmd --hm=bold -- file.md              # bold only
greple -Mmd --hm=bold:italic -- file.md       # bold and italic

--hashed LEVEL=VALUE

Append closing hashes to headings. For example, ### Title becomes ### Title ###. Set per heading level:

greple -Mmd --hashed h3=1 --hashed h4=1 -- file.md

--show LABEL[=VALUE]

Control which elements are highlighted. This is useful for focusing on specific elements or disabling unwanted highlighting.

greple -Mmd --show bold=0 -- file.md          # disable bold
greple -Mmd --show all= --show h1 -- file.md  # only h1

--show LABEL=0 or --show LABEL= disables the label. --show LABEL or --show LABEL=1 enables it. all is a special key that sets all labels at once.

Controllable labels: bold, italic, strike, code_inline, header (h1-h6), horizontal_rule, blockquote.

The following elements are always processed and cannot be disabled: comment, code_block (code_mark, code_info), link, image, image_link. Use --cm LABEL= to remove their color without disabling processing.

CONFIGURATION

Module parameters can also be set using the config() function in the -M declaration:

greple -Mmd::config(mode=dark,base_color=Crimson) file.md

Nested hash parameters use dot notation:

greple -Mmd::config(hashed.h3=1,hashed.h4=1) file.md

Available parameters:

mode            light or dark (default: light)
base_color      base color override
colorize        syntax highlighting (default: 1)
foldlist        text folding (default: 0)
foldwidth       fold width in columns (default: 80)
table           table formatting (default: 1)
rule            box-drawing characters (default: 1)
osc8            OSC 8 hyperlinks (default: 1)
heading_markup  inline markup in headings (default: 0)
                0=off, 1/all=all, or colon-separated steps
tick_open       inline code open marker (default: `)
tick_close      inline code close marker (default: ´)
nofork          nofork+raw mode for code ref calls (default: 1)
hashed.h1-h6    closing hashes per level (default: 0)

Links are converted to clickable OSC 8 terminal hyperlinks in supported terminals (iTerm2, Kitty, WezTerm, Ghostty, etc.). Disable with:

greple -Mmd::config(osc8=0) file.md

COLOR LABELS

The following labels identify colorizable elements. Use them with --colormap (--cm) to customize colors or --show to control visibility. Default values are shown as light / dark. Colors follow Term::ANSIColor::Concise format.

Headings

LABEL   LIGHT                    DARK
h1      L25D/${base};E           L00D/${base};E
h2      L25D/${base}+y20;E       L00D/${base}-y15;E
h3      L25DN/${base}+y30        L00DN/${base}-y25
h4      ${base}UD                ${base}UD
h5      ${base}U                 ${base}U
h6      ${base}                  ${base}

Inline Formatting

LABEL           LIGHT   DARK
bold            D
italic          I
strike          X
emphasis_mark   L18     L10
bold_mark       -       -
italic_mark     -       -
strike_mark     -       -

Emphasis markers (**, *, __, _, ~~) are colored with emphasis_mark, separately from the content text. bold_mark, italic_mark, strike_mark are undefined by default and fall back to emphasis_mark. Define them via --cm to override per type:

greple -Mmd --cm emphasis_mark=R -- file.md    # all markers red
greple -Mmd --cm bold_mark=G -- file.md        # bold markers green

Code

LABEL        LIGHT              DARK
code_mark    L20                L10
code_tick    L15/L23            L15/L05
code_info    ${base_name}=y70   L10
code_block   /L23;E             /L05;E
code_inline  L00/L23            L25/L05

Inline code backticks are displayed as `content´ using code_tick color. Multi-backtick delimiters are collapsed to a single pair with optional surrounding spaces stripped (per CommonMark). The open/close markers can be customized via tick_open/tick_close config parameters.

Block Elements

LABEL            LIGHT / DARK
blockquote       ${base}D
horizontal_rule  L15
comment          ${base}+r60
LABEL        LIGHT / DARK
link         I
image        I
image_link   I
link_mark    -       -

link_mark colors the brackets ([, ]) around link and image text. Undefined by default, falls back to emphasis_mark. The ! prefix for images uses the image or image_link color. Hide brackets with --cm 'link_mark=sub{""}' (used by the nomark theme).

SEE ALSO

App::mdee

Markdown viewer command with line folding, table formatting, multi-column layout, and themes. Uses this module for syntax highlighting.

App::Greple

General-purpose extensible grep tool that hosts this module.

Term::ANSIColor::Concise

Concise ANSI color specification format used for color labels.

App::ansicolumn

ANSI-aware column formatting used for table alignment.

App::ansifold

ANSI-aware text folding used for line wrapping in list items.

AUTHOR

Kazumasa Utashiro

LICENSE

Copyright 2025-2026 Kazumasa Utashiro.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.