Provided by: libsoldout1-dev_1.3-6_amd64 bug

NAME

       markdown - markdown documents parsing

SYNOPSIS

       #PACKAGE#
           #include <markdown.h>

           void markdown ( struct buf *ob,
                           struct buf *ib,
                           const struct mkd_renderer *rndr);

DESCRIPTION

       is  the  only  exported function in libsoldout and starts the parsing process of a markdown document. You
       can have more information about the markdown language from John Gruber's website:

       http://daringfireball.net/projects/markdown/

       Libsoldout only performs the parsing of markdown input, the construction of  the  output  is  left  to  a
       *renderer*,  which is a set of callback functions called when markdown elements are encountered. Pointers
       to these functions are gathered into a `struct mkd_renderer` along with  some  renderer-related  data.  I
       think the struct declaration is pretty obvious:

       struct mkd_renderer {
           /* document level callbacks */
           void (*prolog)(struct buf *ob, void *opaque);
           void (*epilog)(struct buf *ob, void *opaque);

           /* block level callbacks - NULL skips the block */
           void (*blockcode)(struct buf *ob, struct buf *text, void *opaque);
           void (*blockquote)(struct buf *ob, struct buf *text, void *opaque);
           void (*blockhtml)(struct buf *ob, struct buf *text, void *opaque);
           void (*header)(struct buf *ob, struct buf *text,
                               int level, void *opaque);
           void (*hrule)(struct buf *ob, void *opaque);
           void (*list)(struct buf *ob, struct buf *text, int flags,
                        void *opaque);
           void (*listitem)(struct buf *ob, struct buf *text,
                               int flags, void *opaque);
           void (*paragraph)(struct buf *ob, struct buf *text, void *opaque);
           void (*table)(struct buf *ob, struct buf *head_row,
                               struct buf *rows,void *opaque);
           void (*table_cell)(struct buf *ob, struct buf *text, int flags,
                                   void *opaque);
           void (*table_row)(struct buf *ob, struct buf *cells, int flags,
                                   void *opaque);

           /* span level callbacks - NULL or return 0
              prints the span verbatim */
           int (*autolink)(struct buf *ob, struct buf *link,
                           enum mkd_autolink type, void *opaque);
           int (*codespan)(struct buf *ob, struct buf *text, void *opaque);
           int (*double_emphasis)(struct buf *ob, struct buf *text,
                               char c, void *opaque);
           int (*emphasis)(struct buf *ob, struct buf *text,
                           char c, void*opaque);
           int (*image)(struct buf *ob, struct buf *link, struct buf *title,
                               struct buf *alt, void *opaque);
           int (*linebreak)(struct buf *ob, void *opaque);
           int (*link)(struct buf *ob, struct buf *link, struct buf *title,
                           struct buf *content, void *opaque);
           int (*raw_html_tag)(struct buf *ob, struct buf *tag, void *opaque);
           int (*triple_emphasis)(struct buf *ob, struct buf *text,
                               char c, void *opaque);

           /* low level callbacks - NULL copies input directly
              into the output */
           void (*entity)(struct buf *ob, struct buf *entity, void *opaque);
           void (*normal_text)(struct buf *ob, struct buf *text,
                               void *opaque);

           /* renderer data */
           int max_work_stack; /* prevent arbitrary deep recursion */
           const char *emph_chars; /* chars that trigger emphasis rendering */
           void *opaque; /* opaque data send to every rendering callback */ };

       The  first argument of a renderer function is always the output buffer, where the function is supposed to
       write its output. It's not necessarily related to the output buffer given to `markdown()` because in some
       cases render into a temporary buffer is needed.

       The last argument of a renderer function is always an opaque pointer, which  is  equal  to  the  `opaque`
       member  of  `struct  mkd_renderer`.  The  name  "opaque" might not be well-chosen, but it means a pointer
       *opaque for the parser, **not** for the renderer*. It means that  my  parser  passes  around  blindy  the
       pointer  which  contains  data you know about, in case you need to store an internal state or whatever. I
       have not found anything to put in this pointer in my example renderers, so it  is  set  to  NULL  in  the
       structure and never look at in the callbacks.

       `emph_chars`  is  a zero-terminated string which contains the set of characters that trigger emphasis. In
       regular markdown, emphasis is only triggered by '\_' and '\*', but in some extensions it might be  useful
       to  add  other  characters to this list. For example in my extension to handle `<ins>` and `<del>` spans,
       delimited respectively by "++" and "--", I have added '+' and '-' to  `emph_chars`.  The  character  that
       triggered  the emphasis is then passed to `emphasis`, `double_emphasis` and `triple_emphasis` through the
       parameter `c`.

       Function pointers in `struct mkd_renderer` can be NULL, but  it  has  a  different  meaning  whether  the
       callback  is  block-level  or  span-level.  A null block-level callback will make the corresponding block
       disappear from the output, as if the callback was an empty function.  A  null  span-level  callback  will
       cause the corresponding element to be treated as normal characters, copied verbatim to the output.

       So for example, to disable link and images (e.g. because you consider them as dangerous), just put a null
       pointer  in  `rndr.link`  and  `rndr.image`  and the bracketed stuff will be present as-is in the output.
       While a null pointer in `header` will remove all header-looking blocks. If you want an otherwise standard
       markdown-to-XHTML conversion, you can take the example `mkd_xhtml` struct, copy it into your own  `struct
       mkd_renderer` and then assign NULL to `link` and `image` members.

       Moreover,  span-level callbacks return an integer, which tells whether the renderer accepts to render the
       item (non-zero return value) or whether it should be copied verbatim (zero return value). This allows you
       to only accept some specific inputs. For example,  my  extension  for  `<ins>`  and  `<del>`  spans  asks
       *exactly* two '-' or '+' as delimiters, when `emphasis` and `triple_emphasis` are called with '-' or '+',
       they return 0.

       Special care should be taken when writing `autolink`, `link` and `image` callbacks, because the arguments
       `link`,  `title`  and  `alt`  are  unsanitized  data  taken directly from the input file. It is up to the
       renderer to escape whatever needs escaping to prevent bad things from  happening.  To  help  you  writing
       renderers,  the function `lus_attr_escape()` escapes all problematic characters in (X)HTML: `'<'`, `'>'`,
       `'&'` and `'"'`.

       The `normal_text` callback should also perform whatever escape is needed to have the output looking  like
       the input data.

PHP-MARKDOWN-LIKE TABLES

       Tables  are  one  of  the few extensions that are quite difficult and/or hacky to implement using vanilla
       Markdown parser and a renderer. Thus a support has been  introduced  into  the  parser,  using  dedicated
       callbacks:

         - `table_cell`, which is called with the span-level contents of the cell;
         - `table_row`, which is called with data returned by `table_cell`;
         - `table`, which called with data returned by `table_row`.

       The input format to describe tables is taken from PHP-Markdown, and looks like this:

           header 1    | header 2      | header 3      | header 4
           ------------|:-------------:|--------------:|:--------------
           first line  |   centered    | right-aligned | left-aligned
           second line |   centered    |:   centered  :| left-aligned
           third line  |: left-aglined | right-aligned | right-aligned :
           column-separator | don't need | to be | aligned in the source
           | extra speratators | are allowed | at both ends | of the line |
           | correct number of cell per row is not enforced |
           | pipe characters can be embedded in cell text by escaping it:  |

       Each  row  of  the  input  text  is  a  single row in the output, except the header rule, which is purely
       syntactic.

       Each cell in a row is delimited by a pipe (`|`) character. Optionally,  a  pipe  character  can  also  be
       present  at the beginning and/or at the end of the line. Column separator don't have to be aligned in the
       input, but it makes the input more readable.

       There is no check of "squareness" of the table: `table_cell` is called once for each cell provided in the
       input, which can be a number of times different from one row to the other. If the output *has* to respect
       a given number of cell per row, it's up to the renderer to enforce it, using  state  transmitted  through
       the `opaque` pointer.

       The  header  rule is a line containing only horizontal blanks (space and tab), dashes (`-`), colons (`:`)
       and separator. Moreover, it *must* be the second line of the  table.  In  case  such  a  header  rule  is
       detected, the first line of the table is considered as a header, and passed as the `head_row` argument to
       `table`  callback.  Moreover  `table_row`  and  `table_cell`  are  called  for  that  specific  row  with
       `MKD_CELL_HEAD` flag.

       Alignment is defined on a per-cell basis, and specified by a colon (`:`) at the  very  beginning  of  the
       input  span  (i.e. directly after the `|` separator, or as the first character on the line) and/or at the
       very end of it (i.e.  directly before the separator, or as the last character on the line). A  cell  with
       such  a  leading  colon  only  is left-aligned (`MKD_CELL_ALIGN_LEFT`), one with a trailing colon only is
       right-aligned (`MKD_CELL_ALIGN_RIGHT`), and one with both is centered (`MKD_CELL_ALIGN_CENTER`).

       A column-wise default alignment can be specified with the same syntax on the header rule.

RENDERER EXAMPLES

       While libsoldout is designed to perform only the parsing of markdown files, and to let  you  provide  the
       renderer callbacks, a few renderers have been included, both to illustrate how to write a set of renderer
       functions and to allow anybody who do not need special extensions to use libsoldout without hassle.

       All the examples provided here comme with two flavors, `_html` producing HTML code (self-closing tags are
       rendered like this: `<hr>`), and `_xhtml` producing XHTML code (self-closing tags like `<hr />`).

STANDARD MARKDOWN RENDERER

       `mkd_html` and `mkd_xhtml` implement standard Markdown to (X)HTML translation without any extension.

DISCOUNT-ISH

       `discount_html`  and  `discount_xhtml` implement on top of the standard markdown *some* of the extensions
       found in Discount.

       Actually, all Discount extensions that are not provided here cannot be easily implemented  in  libsoldout
       without  touching  to  the parsing code, hence they do not belong strictly to the renderer realm. However
       some (maybe all, not sure about tables) extensions can be implemented fairly easily  with  libsoldout  by
       using  both  a dedicated renderer and some preprocessing to make the extension look like something closer
       to the original markdown syntax.

       Here is a list of all extensions included in these renderers:

        - image size specitication, by appending " =(width)x(height)" to
          the link,
        - pseudo-protocols in links:
           * abbr:_description_ for `<abbr title="`_description_`">...</abbr>`
           * class:_name_ for `<span class="`_name_`">...</span>`
           * id:_name_ for `<a id="`_name_`>...</a>`
           * raw:_text_ for verbatim unprocessed _text_ inclusion
        - class blocks: blockquotes beginning with %_class_% will be
           rendered as a `div` of the given class(es).

NATASHA'S OWN EXTENSIONS

       `nat_html` and `nat_xhtml` implement on top of Discount extensions some things that  I  need  to  convert
       losslessly my existing HTML into extended markdown.

       Here is a list of these extensions :

        - id attribute for headers, using the syntax _id_#_Header text_
        - class attribute for paragraphs, by putting class name(s) between
          parenthesis at the very beginning of the paragraph
        - `<ins>` and `<del>` spans, using respectively `++` and `--` as
          delimiters (with emphasis-like restrictions, i.e. an opening
          delimiter cannot be followed by a whitespace, and a closing
          delimiter cannot be preceded by a whitespace).
        - plain `<span>` without attribute, using emphasis-like delimiter `|`

       Follows an example use of all of them:

           ###atx_id#ID was chosen to look nice in atx-style headers ###

           setext_id#Though it will also work in setext-style headers
           ----------------------------------------------------------

           Here is a paragraph with --deleted-- and ++inserted++ text.

           I use CSS rules to render poetry and other verses, using a plain
           `<span>` for each verse, and enclosing each group of verses in
           a `<p class="verse">`. Here is how it would look like:

           (verse)|And on the pedestal these words appear:|
           |"My name is Ozymandias, king of kings:|
           |Look on my works, ye Mighty, and despair!"|

COPYRIGHT

         Copyright © 2009 Natasha Porte' <natbsd@instinctive.eu>

SEE ALSO

          John Gruber's website http://daringfireball.net/projects/markdown/
          Natacha Porté website http://fossil.instinctive.eu/

                                                      2009                                           MARKDOWN(3)