Provided by: liblowdown-dev_0.10.0-1_amd64 bug

NAME

     lowdown — simple markdown translator library

LIBRARY

     library “liblowdown”

SYNOPSIS

     #include <sys/queue.h>
     #include <stdio.h>
     #include <lowdown.h>

     struct lowdown_metadata
     struct lowdown_node
     struct lowdown_opts

DESCRIPTION

     This library parses lowdown(5) into various output formats.

     The library consists first of a high-level interface consisting of lowdown_buf(3),
     lowdown_buf_diff(3), lowdown_file(3), and lowdown_file_diff(3).

     The high-level functions interface with low-level functions that perform parsing and
     formatting.  These consist of lowdown_doc_new(3), lowdown_doc_parse(3), and
     lowdown_doc_free(3) for parsing lowdown(5) documents into an abstract syntax tree.

     The front-end functions for freeing, allocation, and rendering are as follows.

        HTML5:
         lowdown_html_free(3)
         lowdown_html_new(3)
         lowdown_html_rndr(3)

        gemini:
         lowdown_gemini_free(3)
         lowdown_gemini_new(3)
         lowdown_gemini_rndr(3)

        LaTeX:
         lowdown_latex_free(3)
         lowdown_latex_new(3)
         lowdown_latex_rndr(3)

        OpenDocument:
         lowdown_odt_free(3)
         lowdown_odt_new(3)
         lowdown_odt_rndr(3)

        roff:
         lowdown_nroff_free(3)
         lowdown_nroff_new(3)
         lowdown_nroff_rndr(3)

        UTF-8 ANSI terminal:
         lowdown_term_free(3)
         lowdown_term_new(3)
         lowdown_term_rndr(3)

        debugging:
         lowdown_tree_rndr(3)

     To compile and link, use pkg-config(1):

     % cc `pkg-config --cflags lowdown` -c -o sample.o sample.c
     % cc -o sample sample.o `pkg-config --libs lowdown`

   Pledge Promises
     The lowdown library is built to operate in security-sensitive environments, such as those
     using pledge(2) on OpenBSD.  The only promise required is stdio for lowdown_file_diff(3) and
     lowdown_file(3): both require access to the stream for reading input.

   Types
     All lowdown functions use one or more of the following structures.

     The struct lowdown_opts structure manage features.  It has the following fields:

           unsigned int feat
                   Features used during the parse.  This bit-field may have the following bits
                   OR'd:

                   LOWDOWN_ATTRS
                           Parse PHP extra link and image attributes.
                   LOWDOWN_AUTOLINK
                           Parse http, https, ftp, mailto, and relative links or link fragments.
                   LOWDOWN_COMMONMARK
                           Tighten input parsing to the CommonMark specification.  This also uses
                           the first ordered list value instead of starting all lists at one.
                           This feature is experimental and incomplete.
                   LOWDOWN_DEFLIST
                           Parse PHP extra definition lists.  This is currently constrained to
                           single-key lists.
                   LOWDOWN_FENCED
                           Parse GFM fenced (language-specific) code blocks.
                   LOWDOWN_FOOTNOTES
                           Parse MMD style footnotes.  This only supports the referenced footnote
                           style, not the "inline" style.
                   LOWDOWN_HILITE
                           Parse highlit sequences.  This are disabled by default because it may
                           be erroneously interpreted as section headers.
                   LOWDOWN_IMG_EXT
                           Deprecated.  Use LOWDOWN_ATTRS instead.
                   LOWDOWN_MATH
                           Parse mathematics equations.
                   LOWDOWN_METADATA
                           Parse in-document MMD metadata.  For the first paragraph to count as
                           meta-data, the first line must have a colon in it.
                   LOWDOWN_NOCODEIND
                           Do not parse indented content as code blocks.
                   LOWDOWN_NOINTEM
                           Do not parse emphasis within words.
                   LOWDOWN_STRIKE
                           Parse strikethrough sequences.
                   LOWDOWN_SUPER
                           Parse super-scripts.  This accepts foo^bar, which puts the parts
                           following the caret until whitespace in superscripts; or foo^(bar),
                           which puts only the parts in parenthesis.
                   LOWDOWN_TABLES
                           Parse GFM tables.
                   LOWDOWN_TASKLIST
                           Parse GFM task list items.

                   The default value is zero (none).

           unsigned int oflags
                   Features used by the output generators.  This bit-field may have the following
                   enabled.  Note that bits are by definition specific to an output type.

                   For LOWDOWN_HTML:

                   LOWDOWN_HTML_ESCAPE
                           If LOWDOWN_HTML_SKIP_HTML has not been set, escapes in-document HTML
                           so that it is rendered as opaque text.
                   LOWDOWN_HTML_HARD_WRAP
                           Retain line-breaks within paragraphs.
                   LOWDOWN_HTML_HEAD_IDS
                           Have an identifier written with each header element consisting of an
                           HTML-escaped version of the header contents.
                   LOWDOWN_HTML_OWASP
                           When escaping text, be extra paranoid in following the OWASP
                           suggestions for which characters to escape.
                   LOWDOWN_HTML_NUM_ENT
                           Convert, when possible, HTML entities to their numeric form.  If not
                           set, the entities are used as given in the input.
                   LOWDOWN_HTML_SKIP_HTML
                           Do not render in-document HTML at all.

                   For LOWDOWN_GEMINI, there are several flags for controlling link placement.
                   By default, links (images, autolinks, and links) are queued when specified in-
                   line then emitted in a block sequence after the nearest block element.

                   LOWDOWN_GEMINI_LINK_END
                           Emit the queue of links at the end of the document instead of after
                           the nearest block element.
                   LOWDOWN_GEMINI_LINK_IN
                           Render all links within the flow of text.  This will cause breakage
                           when nested links, such as images within links, links in blockquotes,
                           etc.  It should not be used unless in carefully crafted documents.
                   LOWDOWN_GEMINI_LINK_NOREF
                           Do not format link labels.  Takes precedence over
                           LOWDOWN_GEMINI_LINK_ROMAN.
                   LOWDOWN_GEMINI_LINK_ROMAN
                           When formatting link labels, use lower-case Roman numerals instead of
                           the default lowercase hexavigesimal (i.e., “a”, “b”, ..., “aa”, “ab”,
                           ...).
                   LOWDOWN_GEMINI_METADATA
                           Print metadata as the canonicalised key followed by a colon then the
                           value, each on one line (newlines replaced by spaces).  The metadata
                           block is terminated by a double newline.  If there is no metadata,
                           this does nothing.

                   There may only be one of LOWDOWN_GEMINI_LINK_END or LOWDOWN_GEMINI_LINK_IN.
                   If both are specified, the latter is unset.

                   For LOWDOWN_FODT:

                   LOWDOWN_ODT_SKIP_HTML
                           Do not render in-document HTML at all.  Text within HTML elements
                           remains.

                   For LOWDOWN_LATEX:

                   LOWDOWN_LATEX_NUMBERED
                           Use the default numbering scheme for sections, subsections, etc.  If
                           not specified, these are inhibited.
                   LOWDOWN_LATEX_SKIP_HTML
                           Do not render in-document HTML at all.  Text within HTML elements
                           remains.

                   And for LOWDOWN_MAN and LOWDOWN_NROFF:

                   LOWDOWN_NROFF_GROFF
                           Use GNU extensions (i.e., for groff(1)) when rendering output.  The
                           groff arguments must include -mpdfmark for formatting links with
                           LOWDOWN_MAN or -mspdf instead of -ms for LOWDOWN_NROFF.  Applies to
                           the LOWDOWN_MAN and LOWDOWN_NROFF output types.
                   LOWDOWN_NROFF_NUMBERED
                           Use numbered sections if LOWDOWON_NROFF_GROFF is not specified.  Only
                           applies to the LOWDOWN_NROFF output type.
                   LOWDOWN_NROFF_SKIP_HTML
                           Do not render in-document HTML at all.  Text within HTML elements
                           remains.
                   LOWDOWN_NROFF_SHORTLINK
                           Render link URLs in short form.  Applies to images, autolinks, and
                           regular links.  Only in LOWDOWN_MAN or when LOWDOWN_NROFF_GROFF is not
                           specified.
                   LOWDOWN_NROFF_NOLINK
                           Don't show links at all if they have embedded text.  Applies to images
                           and regular links.  Only in LOWDOWN_MAN or when LOWDOWN_NROFF_GROFF is
                           not specified.

                   For LOWDOWN_TERM:

                   LOWDOWN_TERM_NOANSI
                           Don't apply ANSI style codes at all.  This implies
                           LOWDOWN_TERM_NOCOLOUR.
                   LOWDOWN_TERM_NOCOLOUR
                           Don't apply ANSI colour codes.  This will still show underline, bold,
                           etc.  This should not be used in difference mode, as the output will
                           make no sense.
                   LOWDOWN_TERM_NOLINK
                           Don't show links at all.  Applies to images and regular links:
                           autolinks are still shown.  This may be combined with
                           LOWDOWN_TERM_SHORTLINK to also shorten autolinks.
                   LOWDOWN_TERM_SHORTLINK
                           Render link URLs in short form.  Applies to images, autolinks, and
                           regular links.  This may be combined with LOWDOWN_TERM_NOLINK to only
                           show shortened autolinks.

                   For any mode, you may specify:

                   LOWDOWN_SMARTY
                           Don't use smart typography formatting.
                   LOWDOWN_STANDALONE
                           Emit a full document instead of a document fragment.  This envelope is
                           largely populated from metadata if LOWDOWN_METADATA was provided as an
                           option or as given in meta or metaovr.

           size_t maxdepth
                   The maximum parse depth before the parser exits.  Most documents will have a
                   parse depth in the single digits.

           size_t cols
                   For LOWDOWN_TERM, the "soft limit" for width of terminal output not including
                   margins.  If zero, 80 shall be used.

           size_t hmargin
                   For LOWDOWN_TERM, the left margin (space characters).

           size_t vmargin
                   For LOWDOWN_TERM, the top/bottom margin (newlines).

           enum lowdown_type type
                   May be set to LOWDOWN_HTML for HTML5 output, LOWDOWN_LATEX for LaTeX,
                   LOWDOWN_MAN for -man macros, LOWDOWN_FODT for “flat” OpenDocument,
                   LOWDOWN_TERM for ANSI-compatible UTF-8 terminal output, LOWDOWN_GEMINI for the
                   Gemini format, or LOWDOWN_NROFF for -ms macros.  The LOWDOWN_TREE type causes
                   a debug tree to be written.

                   Both LOWDOWN_MAN and LOWDOWN_NROFF will use troff tables, which usually
                   require the tbl(1) preprocessor.

           char **meta
                   An array of metadata key-value pairs or NULL.  Each pair must appear as if
                   provided on one line (or multiple lines) of the input, including the
                   terminating newline character.  If not consisting of a valid pair (e.g., no
                   newline, no colon), then it is ignored.  When processed, these values are
                   overridden by those in the document (if LOWDOWN_METADATA is specified) or by
                   those in metaovr.

           size_t metasz
                   Number of pairs in metaovr.

           char **metaovr
                   See meta.  The difference is that metaovr is applied after meta and in-
                   document metadata, so it overrides prior values.

           size_t metaovrsz
                   Number of pairs in metaovr.

     Another common structure is struct lowdown_metadata, which is used to hold parsed (and
     output-formatted) metadata keys and values if LOWDOWN_METADATA was provided as an input bit.
     This structure consists of the following fields:

           char *key
                   The metadata key in its lowercase, canonical form.

           char *value
                   The metadata value as rendered in the current output format.  This may be an
                   empty string.

     The abstract syntax tree is encoded in struct lowdown_node, which consists of the following.

           enum lowdown_rndrt type
                   The node type.  (Described below.)

           size_t id
                   An identifier unique within the document.  This can be used as a table index
                   since the number is assigned from a monotonically increasing point during the
                   parse.

           struct lowdown_node *parent
                   The parent of the node, or NULL at the root.

           enum lowdown_chng chng
                   Change tracking: whether this node was inserted (LOWDOWN_CHNG_INSERT), deleted
                   (LOWDOWN_CHNG_DELETE), or neither (LOWDOWN_CHNG_NONE).

           struct lowdown_nodeq children
                   A possibly-empty list of child nodes.

           <anon union>
                   An anonymous union of type-specific structures.  See below for a description
                   of each one.

     The nodes may be one of the following types, with default rendering in HTML5 to illustrate
     functionality.

           LOWDOWN_BLOCKCODE
                   A block-level (and possibly language-specific) snippet of code.  Described by
                   the <pre><code> elements.

           LOWDOWN_BLOCKHTML
                   A block-level snippet of HTML.  This is simply opaque HTML content.  (Only if
                   configured during parse.)

           LOWDOWN_BLOCKQUOTE
                   A block-level quotation.  Described by the <blockquote> element.

           LOWDOWN_CODESPAN
                   A snippet of code.  Described by the <code> element.

           LOWDOWN_DOC_FOOTER
                   Closes out the document opened in LOWDOWN_DOC_HEADER.

           LOWDOWN_DOC_HEADER
                   A header with data gathered from document metadata (if configured).  Described
                   by the <head> element.  (Only if configured during parse.)

           LOWDOWN_DOUBLE_EMPHASIS
                   Bold (or otherwise notable) content.  Described by the <strong> element.

           LOWDOWN_EMPHASIS
                   Italic (or otherwise notable) content.  Described by the <em> element.

           LOWDOWN_ENTITY
                   An HTML entity, which may either be named or numeric.

           LOWDOWN_FOOTNOTE_DEF
                   A footnote within a LOWDOWN_FOOTNOTES_BLOCK node.  Described by the <li
                   id="fnXX"> element.  (Only if configured during parse.)

           LOWDOWN_FOOTNOTE_REF
                   A reference to a LOWDOWN_FOOTNOTE_DEF.  Described by the <sup><a> elements.
                   (Only if configured during parse.)

           LOWDOWN_FOOTNOTES_BLOCK
                   A block of footnotes.  Described by the <div class="footnotes"><hr /><ol>
                   elements.  (Only if configured during parse.)

           LOWDOWN_HEADER
                   A block-level header.  Described (in the HTML case) by one of <h1> through
                   <h6>.

           LOWDOWN_HIGHLIGHT
                   Marked test.  Described by the <mark> element.  (Only if configured during
                   parse.)

           LOWDOWN_HRULE
                   A horizontal line.  Described by <hr>.

           LOWDOWN_IMAGE
                   An image.  Described by the <img> element.

           LOWDOWN_LINEBREAK
                   A hard line-break within a block context.  Described by the <br> element.

           LOWDOWN_LINK
                   A link to external media.  Described by the <a> element.

           LOWDOWN_LINK_AUTO
                   Like LOWDOWN_LINK, except inferred from text content.  Described by the <a>
                   element.  (Only if configured during parse.)

           LOWDOWN_LIST
                   A block-level list enclosure.  Described by <ul> or <ol>.

           LOWDOWN_LISTITEM
                   A block-level list item, always appearing within a LOWDOWN_LIST.  Described by
                   <li>.

           LOWDOWN_MATH_BLOCK
                   A block (or inline) of mathematical text in LaTeX format.  Described within
                   \[xx\] or \(xx\).  This is usually (in HTML) externally handled by a
                   JavaScript renderer.  (Only if configured during parse.)

           LOWDOWN_META
                   Meta-data keys and values.  (Only if configured during parse.)  These are
                   described by elements in the <head> element.

           LOWDOWN_NORMAL_TEXT
                   Normal text content.

           LOWDOWN_PARAGRAPH
                   A block-level paragraph.  Described by the <p> element.

           LOWDOWN_RAW_HTML
                   An inline of raw HTML.  (Only if configured during parse.)

           LOWDOWN_ROOT
                   The root of the document.  This is always the topmost node, and the only node
                   where the parent field is NULL.

           LOWDOWN_STRIKETHROUGH
                   Content struck through.  Described by the <del> element.  (Only if configured
                   during parse.)

           LOWDOWN_SUPERSCRIPT
                   A superscript.  Described by the <sup> element.  (Only if configured during
                   parse.)

           LOWDOWN_TABLE_BLOCK
                   A table block.  Described by <table>.  (Only if configured during parse.)

           LOWDOWN_TABLE_BODY
                   A table body section.  Described by <tbody>.  Parent is always
                   LOWDOWN_TABLE_BLOCK.  (Only if configured during parse.)

           LOWDOWN_TABLE_CELL
                   A table cell.  Described by <td> or <th> if in the header.  Parent is always
                   LOWDOWN_TABLE_ROW.  (Only if configured during parse.)

           LOWDOWN_TABLE_HEADER
                   A table header section.  Described by <thead>.  Parent is always
                   LOWDOWN_TABLE_BLOCK.  (Only if configured during parse.)

           LOWDOWN_TABLE_ROW
                   A table row.  Described by <tr>.  Parent is always LOWDOWN_TABLE_HEADER or
                   LOWDOWN_TABLE_BODY.  (Only if configured during parse.)

           LOWDOWN_TRIPLE_EMPHASIS
                   Combination of LOWDOWN_EMPHASIS and LOWDOWN_DOUBLE_EMPHASIS.

     The following anonymous union structures correspond to certain nodes.  Note that all buffers
     may be zero-length.

           rndr_autolink
                   For LOWDOWN_LINK_AUTO, the link address as link and the link type type, which
                   may be one of HALINK_EMAIL for e-mail links and HALINK_NORMAL otherwise.  Any
                   buffer may be empty-sized.

           rndr_blockcode
                   For LOWDOWN_BLOCKCODE, the opaque text of the block and the optional lang of
                   the code language.

           rndr_blockhtml
                   For LOWDOWN_BLOCKHTML, the opaque HTML text.

           rndr_codespan
                   The opaque text of the contents.

           rndr_definition
                   For LOWDOWN_DEFINITION, containing flags that may be HLIST_FL_BLOCK if the
                   definition list should be interpreted as containing block elements.

           rndr_entity
                   For LOWDOWN_ENTITY, the entity text.

           rndr_footnote_def
                   For LOWDOWN_FOOTNOTE_DEF, the footnote number num (starting at one).  This
                   matches a single LOWDOWN_FOOTNOTE_DEF similarly numbered.  The key is its
                   original in-document reference key.

           rndr_footnote_ref
                   For a LOWDOWN_FOOTNOTE_REF reference to a LOWDOWN_FOOTNOTE_DEF, the footnote
                   number num (starting at one).  The def is the content parsed as children to
                   the matching LOWDOWN_FOOTNOTE_DEF.  The key is its original in-document
                   reference key.

           rndr_header
                   For LOWDOWN_HEADER, the level of the header starting at zero This value is
                   relative to the metadata base header level, defaulting to one (the top-level
                   header).

           rndr_image
                   For LOWDOWN_IMAGE, the image address link, the image title title, dimensions
                   NxN (width by height) in dims, and alternate text alt.  CSS in-line style for
                   width and height may be given in attr_width and/or attr_height, and a space-
                   separated list of classes may be in attr_cls and a single identifier may be in
                   attr_id.

           rndr_link
                   Like rndr_autolink, but without a type and further defining an optional link
                   title title, optional space-separated class list attr_cls, and optional single
                   identifier attr_id.

           rndr_list
                   For LOWDOWN_LIST, consists of a bitfield flags that may be set to
                   HLIST_FL_ORDERED for an ordered list and HLIST_FL_UNORDERED for an unordered
                   one.  If HLIST_FL_BLOCK is set, the list should be output as if items were
                   separate blocks.  The start value for HLIST_FL_ORDERED is the starting list
                   item position, which is one by default and never zero.

           rndr_listitem
                   For LOWDOWN_LISTITEM, consists of a bitfield flags that may be set to
                   HLIST_FL_ORDERED for an ordered list, HLIST_FL_UNORDERED for an unordered
                   list, HLIST_FL_DEF for definition list data, HLIST_FL_CHECKED or
                   HLIST_FL_UNCHECKED for an unordered “task” list element, and/or HLIST_FL_BLOCK
                   for list item output as if containing block elements.  The HLIST_FL_BLOCK
                   should not be used: use the parent list (or definition list) flags for this.
                   The num is the index in a HLIST_FL_ORDERED list.  It is monotonically
                   increasing with each item in the list, starting at the start variable given in
                   struct rndr_list.

           rndr_math
                   For LOWDOWN_MATH, the mode of display displaymode: if 1, in-line math; if 2,
                   multi-line.

           rndr_meta
                   Each LOWDOWN_META key-value pair is represented.  The keys are lower-case
                   without spaces or non-ASCII characters.  If provided, enclosed nodes may
                   consist only of LOWDOWN_NORMAL_TEXT and LOWDOWN_ENTITY.

           rndr_normal_text
                   The basic text content for LOWDOWN_NORMAL_TEXT.

           rndr_paragraph
                   For LOWDOWN_PARAGRAPH, species how many lines the paragraph has in the input
                   file and beoln, set to non-zero if the paragraph ends with an empty line
                   instead of a breaking block element.

           rndr_raw_html
                   For LOWDOWN_RAW_HTML, the opaque HTML text.

           rndr_table
                   For LOWDOWN_TABLE_BLOCK, the number of columns in each row or header row.  The
                   number of columns in rndr_table, rndr_table_header, and rndr_table_cell are
                   the same.

           rndr_table_cell
                   For LOWDOWN_TABLE_CELL, the current col column number out of columns.  See
                   rndr_table_header for a description of the bits in flags.  The number of
                   columns in rndr_table, rndr_table_header, and rndr_table_cell are the same.

           rndr_table_header
                   For LOWDOWN_TABLE_HEADER, the number of columns in each row and the per-column
                   flags, which may be bits of HTBL_FL_ALIGN_LEFT, HTBL_FL_ALIGN_RIGHT, or
                   HTBL_FL_ALIGN_CENTER when masked with HTBL_FL_ALIGNMASK; or HTBL_FL_HEADER.
                   The number of columns in rndr_table, rndr_table_header, and rndr_table_cell
                   are the same.

SEE ALSO

     lowdown(1), lowdown_buf(3), lowdown_buf_diff(3), lowdown_diff(3), lowdown_doc_free(3),
     lowdown_doc_new(3), lowdown_doc_parse(3), lowdown_file(3), lowdown_file_diff(3),
     lowdown_gemini_free(3), lowdown_gemini_new(3), lowdown_gemini_rndr(3), lowdown_html_free(3),
     lowdown_html_new(3), lowdown_html_rndr(3), lowdown_latex_free(3), lowdown_latex_new(3),
     lowdown_latex_rndr(3), lowdown_metaq_free(3), lowdown_nroff_free(3), lowdown_nroff_new(3),
     lowdown_nroff_rndr(3), lowdown_odt_free(3), lowdown_odt_new(3), lowdown_odt_rndr(3),
     lowdown_term_free(3), lowdown_term_new(3), lowdown_term_rndr(3), lowdown_tree_rndr(3),
     lowdown(5)

AUTHORS

     lowdown was forked from hoedown: https://github.com/hoedown/hoedown by Kristaps Dzonsons,
     kristaps@bsd.lv.  It has been considerably modified since.