]> granicus.if.org Git - multimarkdown/commitdiff
ADDED: Initial framework for metadata parsing
authorFletcher T. Penney <fletcher@fletcherpenney.net>
Wed, 25 Jan 2017 00:03:13 +0000 (19:03 -0500)
committerFletcher T. Penney <fletcher@fletcherpenney.net>
Wed, 25 Jan 2017 00:03:13 +0000 (19:03 -0500)
src/html.c
src/libMultiMarkdown.h
src/mmd.c
src/mmd.h
src/parser.c
src/parser.h
src/parser.out
src/parser.y
src/scanners.c
src/scanners.h
src/scanners.re

index b9904dfc70a4c1e024a5757a8547fb33474864d0..30c42832a0571491be5fdc8261fe3055d157ac8c 100644 (file)
@@ -422,6 +422,11 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t
                        print("</li>");
                        scratch->padded = 0;
                        break;
+               case BLOCK_META:
+                       print("<meta>\n");
+                       //token_tree_describe(t, source);
+                       print("</meta>\n");
+                       break;
                case BLOCK_PARA:
                case BLOCK_DEF_CITATION:
                case BLOCK_DEF_FOOTNOTE:
index 9da0f829f7ca93fd9f22d434a9c9e01242c0b112..b8ac5611d92aab3864d078342d49f29774a351bf 100644 (file)
@@ -131,6 +131,7 @@ enum token_types {
        BLOCK_LIST_ENUMERATED_LOOSE,
        BLOCK_LIST_ITEM,
        BLOCK_LIST_ITEM_TIGHT,
+       BLOCK_META,
        BLOCK_PARA,
        BLOCK_TABLE,
        ROW_TABLE,
index d1137436831bafaad8a35237a0a48bb927e5fb6d..32e27d615198c7769d6b149aa0e8287b743a9691 100644 (file)
--- a/src/mmd.c
+++ b/src/mmd.c
@@ -91,6 +91,8 @@ mmd_engine * mmd_engine_create(DString * d, unsigned long extensions) {
 
                e->extensions = extensions;
 
+               e->allow_meta = (extensions & EXT_COMPATIBILITY) ? false : true;
+
                e->language = LC_EN;
                e->quotes_lang = ENGLISH;
 
@@ -276,15 +278,17 @@ void mmd_assign_line_type(mmd_engine * e, token * line) {
        
        switch (line->child->type) {
                case INDENT_TAB:
-                       if (line_is_empty(line->child))
+                       if (line_is_empty(line->child)) {
                                line->type = LINE_EMPTY;
-                       else
+                               e->allow_meta = false;
+                       } else
                                line->type = LINE_INDENTED_TAB;
                        break;
                case INDENT_SPACE:
-                       if (line_is_empty(line->child))
+                       if (line_is_empty(line->child)) {
                                line->type = LINE_EMPTY;
-                       else
+                               e->allow_meta = false;
+                       } else
                                line->type = LINE_INDENTED_SPACE;
                        break;
                case ANGLE_LEFT:
@@ -490,6 +494,7 @@ void mmd_assign_line_type(mmd_engine * e, token * line) {
                        break;
                case TEXT_LINEBREAK:
                case TEXT_NL:
+                       e->allow_meta = false;
                        line->type = LINE_EMPTY;
                        break;
                case BRACKET_LEFT:
@@ -518,6 +523,14 @@ void mmd_assign_line_type(mmd_engine * e, token * line) {
                        }
                        break;
                case TEXT_PLAIN:
+                       if (e->allow_meta && !(e->extensions & EXT_COMPATIBILITY)) {
+                               scan_len = scan_url(&source[line->start]);
+                               if (scan_len == 0) {
+                                       scan_len = scan_meta_line(&source[line->start]);
+                                       line->type = (scan_len) ? LINE_META : LINE_PLAIN;
+                                       break;
+                               }
+                       }
                default:
                        line->type = LINE_PLAIN;
                        break;
@@ -847,6 +860,7 @@ void mmd_assign_ambidextrous_tokens_in_block(mmd_engine * e, token * block, cons
                        case BLOCK_LIST_ENUMERATED_LOOSE:
                        case BLOCK_LIST_ITEM:
                        case BLOCK_LIST_ITEM_TIGHT:
+                       case BLOCK_META:
                        case BLOCK_PARA:
                        case BLOCK_TABLE:
                                // Assign child tokens of blocks
@@ -1312,6 +1326,7 @@ void strip_line_tokens_from_block(token * block) {
                        case LINE_EMPTY:
                        case LINE_LIST_BULLETED:
                        case LINE_LIST_ENUMERATED:
+                       case LINE_META:
                        case LINE_PLAIN:
                                // Remove leading non-indent space from line
                                if (l->child && l->child->type == NON_INDENT_SPACE)
index 61733d79cff43b2ea7ee17ae56e1f98c54aba085..1612a948ffc0a5eaf1aef4c8ea6c987578475756 100644 (file)
--- a/src/mmd.h
+++ b/src/mmd.h
@@ -67,6 +67,8 @@ struct mmd_engine {
        token *                                 root;
        unsigned long                   extensions;
 
+       bool                                    allow_meta;
+
        token_pair_engine *             pairings1;
        token_pair_engine *             pairings2;
        token_pair_engine *             pairings3;
index e3c3095871e6a08349e5251d1b9ed9bcf3e19dd9..8f77bbfbcf1ef5e6cc49401cf52a5bd4ab724221 100644 (file)
@@ -92,7 +92,7 @@
 #endif
 /************* Begin control #defines *****************************************/
 #define YYCODETYPE unsigned char
-#define YYNOCODE 54
+#define YYNOCODE 58
 #define YYACTIONTYPE unsigned short int
 #define ParseTOKENTYPE  token * 
 typedef union {
@@ -107,16 +107,16 @@ typedef union {
 #define ParseARG_FETCH  mmd_engine * engine  = yypParser->engine 
 #define ParseARG_STORE yypParser->engine  = engine 
 #define YYFALLBACK 1
-#define YYNSTATE             38
-#define YYNRULE              85
-#define YY_MAX_SHIFT         37
-#define YY_MIN_SHIFTREDUCE   88
-#define YY_MAX_SHIFTREDUCE   172
-#define YY_MIN_REDUCE        173
-#define YY_MAX_REDUCE        257
-#define YY_ERROR_ACTION      258
-#define YY_ACCEPT_ACTION     259
-#define YY_NO_ACTION         260
+#define YYNSTATE             40
+#define YYNRULE              92
+#define YY_MAX_SHIFT         39
+#define YY_MIN_SHIFTREDUCE   95
+#define YY_MAX_SHIFTREDUCE   186
+#define YY_MIN_REDUCE        187
+#define YY_MAX_REDUCE        278
+#define YY_ERROR_ACTION      279
+#define YY_ACCEPT_ACTION     280
+#define YY_NO_ACTION         281
 /************* End control #defines *******************************************/
 
 /* Define the yytestcase() macro to be a no-op if is not already defined
@@ -188,70 +188,72 @@ typedef union {
 **  yy_default[]       Default action for each state.
 **
 *********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (163)
+#define YY_ACTTAB_COUNT (171)
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */   173,  153,   20,  147,  148,   13,   93,   94,   95,   96,
- /*    10 */    97,   98,  104,   14,    5,    4,  162,    3,    2,   15,
- /*    20 */    12,   11,  153,   20,  147,  148,   13,   93,   94,   95,
- /*    30 */    96,   97,   98,  104,   14,    5,    4,  162,    3,    2,
- /*    40 */    15,   12,   11,  153,  259,    1,   90,   91,   10,   37,
- /*    50 */    35,   33,  102,   36,  105,  106,  107,  108,  109,  112,
- /*    60 */   112,  171,   26,   26,   28,   35,  146,   33,   89,   91,
- /*    70 */    10,   37,   35,   33,  102,   36,  105,  106,  107,  108,
- /*    80 */   109,   28,  172,  126,   28,  151,  152,   35,  143,   33,
- /*    90 */    25,    6,    6,  157,    7,    7,  138,   28,   16,  111,
- /*   100 */    16,   18,   28,   18,  150,  156,   28,    8,    8,   28,
- /*   110 */   171,  171,    9,    9,   21,  146,   21,  111,  115,   23,
- /*   120 */   111,   23,   28,   17,  116,   17,   19,   28,   19,  141,
- /*   130 */   139,  172,  172,  111,  151,  152,  153,    4,  111,   22,
- /*   140 */     5,   22,   30,   30,   24,  129,   24,   27,   27,  113,
- /*   150 */   168,   29,   29,  113,  169,   31,   31,   32,   32,   34,
- /*   160 */    34,  175,  121,
+ /*     0 */   187,  163,   21,  157,  158,   14,  100,  101,  102,  103,
+ /*    10 */   104,  105,  111,   15,    5,    4,  172,    3,    2,   16,
+ /*    20 */    13,   12,  163,   11,   21,  157,  158,   14,  100,  101,
+ /*    30 */   102,  103,  104,  105,  111,   15,    5,    4,  172,    3,
+ /*    40 */     2,   16,   13,   12,  163,   11,  280,    1,   97,   98,
+ /*    50 */    10,   39,   37,   35,  109,   38,  112,  113,  114,  115,
+ /*    60 */   116,  117,  120,  120,  156,  186,   30,   30,   37,  181,
+ /*    70 */    35,   96,   98,   10,   39,   37,   35,  109,   38,  112,
+ /*    80 */   113,  114,  115,  116,  117,   29,  156,  185,   29,  151,
+ /*    90 */   182,   37,   26,   35,   27,   27,    6,    6,  153,    7,
+ /*   100 */     7,   29,  146,   17,   29,   17,   19,  163,   19,   28,
+ /*   110 */    28,   29,    8,    8,   29,    9,    9,  161,  162,   22,
+ /*   120 */   119,   22,   24,  119,   24,  123,  119,   29,   29,   18,
+ /*   130 */   181,   18,   20,  181,   20,   29,  160,  161,  162,  119,
+ /*   140 */   119,    4,   31,   31,  129,   23,   25,   23,   25,  149,
+ /*   150 */   167,  182,  147,  178,  182,  134,  121,  179,   32,   32,
+ /*   160 */    33,   33,  166,   34,   34,   36,   36,    5,  124,  121,
+ /*   170 */   137,
 };
 static const YYCODETYPE yy_lookahead[] = {
  /*     0 */     0,   22,    2,    3,    4,    5,    6,    7,    8,    9,
  /*    10 */    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
- /*    20 */    20,   21,   22,    2,    3,    4,    5,    6,    7,    8,
- /*    30 */     9,   10,   11,   12,   13,   14,   15,   16,   17,   18,
- /*    40 */    19,   20,   21,   22,   24,   25,   26,   27,   28,   29,
- /*    50 */    30,   31,   32,   33,   34,   35,   36,   37,   38,   41,
- /*    60 */    42,    1,   51,   52,   29,   45,    1,   47,   26,   27,
- /*    70 */    28,   29,   30,   31,   32,   33,   34,   35,   36,   37,
- /*    80 */    38,   29,   22,   48,   29,    3,    4,   45,   52,   47,
- /*    90 */    42,   39,   40,    1,   39,   40,   50,   29,   46,   40,
- /*   100 */    48,   46,   29,   48,   22,   13,   29,   39,   40,   29,
- /*   110 */     1,    1,   39,   40,   46,    1,   48,   40,   44,   46,
- /*   120 */    40,   48,   29,   46,   45,   48,   46,   29,   48,   20,
- /*   130 */    20,   22,   22,   40,    3,    4,   22,   15,   40,   46,
- /*   140 */    14,   48,   43,   44,   46,   16,   48,   51,   52,   22,
- /*   150 */     1,   49,   50,   22,    5,   39,   40,   39,   40,   39,
- /*   160 */    40,   53,   47,
+ /*    20 */    20,   21,   22,   23,    2,    3,    4,    5,    6,    7,
+ /*    30 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
+ /*    40 */    18,   19,   20,   21,   22,   23,   25,   26,   27,   28,
+ /*    50 */    29,   30,   31,   32,   33,   34,   35,   36,   37,   38,
+ /*    60 */    39,   40,   43,   44,    1,    1,   55,   56,   47,    1,
+ /*    70 */    49,   27,   28,   29,   30,   31,   32,   33,   34,   35,
+ /*    80 */    36,   37,   38,   39,   40,   30,    1,   23,   30,   54,
+ /*    90 */    22,   47,   44,   49,   53,   54,   41,   42,   56,   41,
+ /*   100 */    42,   30,   52,   48,   30,   50,   48,   22,   50,   53,
+ /*   110 */    54,   30,   41,   42,   30,   41,   42,    3,    4,   48,
+ /*   120 */    42,   50,   48,   42,   50,   46,   42,   30,   30,   48,
+ /*   130 */     1,   50,   48,    1,   50,   30,   22,    3,    4,   42,
+ /*   140 */    42,   15,   51,   52,   49,   48,   48,   50,   50,   20,
+ /*   150 */     1,   22,   20,    1,   22,   50,   22,    5,   45,   46,
+ /*   160 */    41,   42,   13,   41,   42,   41,   42,   14,   47,   22,
+ /*   170 */    16,
 };
-#define YY_SHIFT_USE_DFLT (163)
-#define YY_SHIFT_COUNT    (37)
+#define YY_SHIFT_USE_DFLT (171)
+#define YY_SHIFT_COUNT    (39)
 #define YY_SHIFT_MIN      (-21)
-#define YY_SHIFT_MAX      (149)
+#define YY_SHIFT_MAX      (154)
 static const short yy_shift_ofst[] = {
- /*     0 */    21,    0,  114,  114,  114,  114,  114,  114,  114,  114,
- /*    10 */    82,   60,   60,  149,   92,   65,  -21,  -21,  -21,  -21,
- /*    20 */    65,  -21,  -21,  -21,  -21,   65,  109,  110,  131,  149,
- /*    30 */    92,   65,   65,  122,   65,  126,  129,  127,
+ /*     0 */    22,    0,   85,   85,   85,   85,   85,   85,   85,   85,
+ /*    10 */   114,   64,   68,   68,  152,  149,   63,  -21,  -21,  -21,
+ /*    20 */   -21,   63,  -21,  -21,  -21,  -21,   63,  129,  132,  134,
+ /*    30 */    64,  152,  149,   63,   63,  126,   63,  153,  154,  147,
 };
 #define YY_REDUCE_USE_DFLT (-1)
-#define YY_REDUCE_COUNT (35)
+#define YY_REDUCE_COUNT (37)
 #define YY_REDUCE_MIN   (0)
-#define YY_REDUCE_MAX   (120)
+#define YY_REDUCE_MAX   (124)
 static const signed char yy_reduce_ofst[] = {
- /*     0 */    20,   42,   52,   55,   68,   73,   77,   80,   93,   98,
- /*    10 */    18,   11,   96,  102,   99,  116,   35,   35,   35,   35,
- /*    20 */   118,   35,   35,   35,   35,  120,   36,   36,   48,   46,
- /*    30 */    74,   59,   59,  115,   59,   79,
+ /*     0 */    21,   44,   55,   58,   71,   74,   81,   84,   97,   98,
+ /*    10 */    19,   11,   41,   56,   91,  113,  119,  105,  105,  105,
+ /*    20 */   105,  122,  105,  105,  105,  105,  124,   35,   35,   48,
+ /*    30 */    42,   50,   79,   78,   78,   95,   78,  121,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */   258,  258,  249,  248,  210,  205,  219,  216,  208,  203,
- /*    10 */   177,  258,  258,  251,  239,  250,  220,  218,  217,  215,
- /*    20 */   229,  209,  207,  204,  202,  213,  227,  225,  246,  222,
- /*    30 */   199,  221,  195,  186,  212,  185,  188,  184,
+ /*     0 */   279,  279,  266,  265,  225,  220,  234,  231,  223,  218,
+ /*    10 */   191,  275,  279,  279,  268,  256,  267,  235,  233,  232,
+ /*    20 */   230,  246,  224,  222,  219,  217,  228,  242,  240,  263,
+ /*    30 */   244,  237,  214,  236,  210,  200,  227,  199,  202,  198,
 };
 /********** End of lemon-generated parsing tables *****************************/
 
@@ -383,15 +385,16 @@ static const char *const yyTokenName[] = {
   "LINE_ATX_3",    "LINE_ATX_4",    "LINE_ATX_5",    "LINE_ATX_6",  
   "LINE_HR",       "LINE_BLOCKQUOTE",  "LINE_LIST_BULLETED",  "LINE_LIST_ENUMERATED",
   "LINE_TABLE",    "LINE_DEF_CITATION",  "LINE_DEF_FOOTNOTE",  "LINE_DEF_LINK",
-  "LINE_FENCE_BACKTICK",  "LINE_FENCE_BACKTICK_START",  "LINE_EMPTY",    "error",       
-  "doc",           "blocks",        "block",         "para",        
-  "indented_code",  "empty",         "list_bulleted",  "list_enumerated",
-  "blockquote",    "table",         "def_citation",  "def_footnote",
-  "def_link",      "html_block",    "fenced_block",  "para_lines",  
-  "para_line",     "code_line",     "indented_line",  "quote_lines", 
-  "quote_line",    "item_bulleted",  "cont_blocks",   "item_enumerated",
-  "cont_block",    "html_block_lines",  "html_block_line",  "fenced_lines",
-  "fenced_line", 
+  "LINE_FENCE_BACKTICK",  "LINE_FENCE_BACKTICK_START",  "LINE_EMPTY",    "LINE_META",   
+  "error",         "doc",           "blocks",        "block",       
+  "para",          "indented_code",  "empty",         "list_bulleted",
+  "list_enumerated",  "blockquote",    "table",         "def_citation",
+  "def_footnote",  "def_link",      "html_block",    "fenced_block",
+  "meta_block",    "para_lines",    "para_line",     "code_line",   
+  "indented_line",  "quote_lines",   "quote_line",    "item_bulleted",
+  "cont_blocks",   "item_enumerated",  "cont_block",    "html_block_lines",
+  "html_block_line",  "fenced_lines",  "fenced_line",   "meta_lines",  
+  "meta_line",   
 };
 #endif /* NDEBUG */
 
@@ -421,69 +424,76 @@ static const char *const yyRuleName[] = {
  /*  19 */ "block ::= def_link",
  /*  20 */ "block ::= html_block",
  /*  21 */ "block ::= fenced_block",
- /*  22 */ "para ::= LINE_PLAIN para_lines",
- /*  23 */ "para_lines ::= para_lines para_line",
- /*  24 */ "indented_code ::= indented_code code_line",
- /*  25 */ "empty ::= empty LINE_EMPTY",
- /*  26 */ "blockquote ::= LINE_BLOCKQUOTE quote_lines",
- /*  27 */ "quote_lines ::= quote_lines quote_line",
- /*  28 */ "list_bulleted ::= list_bulleted item_bulleted",
- /*  29 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks",
- /*  30 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines",
- /*  31 */ "item_bulleted ::= LINE_LIST_BULLETED cont_blocks",
- /*  32 */ "item_bulleted ::= LINE_LIST_BULLETED",
- /*  33 */ "list_enumerated ::= list_enumerated item_enumerated",
- /*  34 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks",
- /*  35 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines",
- /*  36 */ "item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks",
- /*  37 */ "item_enumerated ::= LINE_LIST_ENUMERATED",
- /*  38 */ "cont_blocks ::= cont_blocks cont_block",
- /*  39 */ "cont_block ::= empty indented_line para_lines",
- /*  40 */ "cont_block ::= empty indented_line",
- /*  41 */ "table ::= table LINE_TABLE",
- /*  42 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks",
- /*  43 */ "def_citation ::= LINE_DEF_CITATION para_lines",
- /*  44 */ "def_citation ::= LINE_DEF_CITATION cont_blocks",
- /*  45 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks",
- /*  46 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines",
- /*  47 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks",
- /*  48 */ "def_link ::= LINE_DEF_LINK para_lines",
- /*  49 */ "html_block ::= LINE_HTML html_block_lines",
- /*  50 */ "html_block_lines ::= html_block_lines html_block_line",
- /*  51 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK",
- /*  52 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines",
- /*  53 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK",
- /*  54 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines",
- /*  55 */ "fenced_lines ::= fenced_lines fenced_line",
- /*  56 */ "para ::= LINE_PLAIN",
- /*  57 */ "para_lines ::= para_line",
- /*  58 */ "para_line ::= LINE_CONTINUATION",
- /*  59 */ "indented_code ::= LINE_INDENTED_TAB",
- /*  60 */ "indented_code ::= LINE_INDENTED_SPACE",
- /*  61 */ "code_line ::= indented_line",
- /*  62 */ "code_line ::= LINE_EMPTY",
- /*  63 */ "indented_line ::= LINE_INDENTED_TAB",
- /*  64 */ "indented_line ::= LINE_INDENTED_SPACE",
- /*  65 */ "empty ::= LINE_EMPTY",
- /*  66 */ "blockquote ::= LINE_BLOCKQUOTE",
- /*  67 */ "quote_lines ::= quote_line",
- /*  68 */ "quote_line ::= LINE_BLOCKQUOTE",
- /*  69 */ "quote_line ::= LINE_CONTINUATION",
- /*  70 */ "list_bulleted ::= item_bulleted",
- /*  71 */ "list_enumerated ::= item_enumerated",
- /*  72 */ "cont_blocks ::= cont_block",
- /*  73 */ "cont_block ::= empty",
- /*  74 */ "table ::= LINE_TABLE",
- /*  75 */ "def_citation ::= LINE_DEF_CITATION",
- /*  76 */ "def_footnote ::= LINE_DEF_FOOTNOTE",
- /*  77 */ "def_link ::= LINE_DEF_LINK",
- /*  78 */ "html_block ::= LINE_HTML",
- /*  79 */ "html_block_lines ::= html_block_line",
- /*  80 */ "html_block_line ::= LINE_CONTINUATION",
- /*  81 */ "html_block_line ::= LINE_HTML",
- /*  82 */ "fenced_lines ::= fenced_line",
- /*  83 */ "fenced_line ::= LINE_CONTINUATION",
- /*  84 */ "fenced_line ::= LINE_EMPTY",
+ /*  22 */ "block ::= meta_block",
+ /*  23 */ "para ::= LINE_PLAIN para_lines",
+ /*  24 */ "para_lines ::= para_lines para_line",
+ /*  25 */ "indented_code ::= indented_code code_line",
+ /*  26 */ "empty ::= empty LINE_EMPTY",
+ /*  27 */ "blockquote ::= LINE_BLOCKQUOTE quote_lines",
+ /*  28 */ "quote_lines ::= quote_lines quote_line",
+ /*  29 */ "list_bulleted ::= list_bulleted item_bulleted",
+ /*  30 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks",
+ /*  31 */ "item_bulleted ::= LINE_LIST_BULLETED para_lines",
+ /*  32 */ "item_bulleted ::= LINE_LIST_BULLETED cont_blocks",
+ /*  33 */ "item_bulleted ::= LINE_LIST_BULLETED",
+ /*  34 */ "list_enumerated ::= list_enumerated item_enumerated",
+ /*  35 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks",
+ /*  36 */ "item_enumerated ::= LINE_LIST_ENUMERATED para_lines",
+ /*  37 */ "item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks",
+ /*  38 */ "item_enumerated ::= LINE_LIST_ENUMERATED",
+ /*  39 */ "cont_blocks ::= cont_blocks cont_block",
+ /*  40 */ "cont_block ::= empty indented_line para_lines",
+ /*  41 */ "cont_block ::= empty indented_line",
+ /*  42 */ "table ::= table LINE_TABLE",
+ /*  43 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks",
+ /*  44 */ "def_citation ::= LINE_DEF_CITATION para_lines",
+ /*  45 */ "def_citation ::= LINE_DEF_CITATION cont_blocks",
+ /*  46 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks",
+ /*  47 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines",
+ /*  48 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks",
+ /*  49 */ "def_link ::= LINE_DEF_LINK para_lines",
+ /*  50 */ "html_block ::= LINE_HTML html_block_lines",
+ /*  51 */ "html_block_lines ::= html_block_lines html_block_line",
+ /*  52 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK",
+ /*  53 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines",
+ /*  54 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK",
+ /*  55 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines",
+ /*  56 */ "fenced_lines ::= fenced_lines fenced_line",
+ /*  57 */ "meta_block ::= LINE_META meta_lines",
+ /*  58 */ "meta_lines ::= meta_lines meta_line",
+ /*  59 */ "para ::= LINE_PLAIN",
+ /*  60 */ "para_lines ::= para_line",
+ /*  61 */ "para_line ::= LINE_CONTINUATION",
+ /*  62 */ "indented_code ::= LINE_INDENTED_TAB",
+ /*  63 */ "indented_code ::= LINE_INDENTED_SPACE",
+ /*  64 */ "code_line ::= indented_line",
+ /*  65 */ "code_line ::= LINE_EMPTY",
+ /*  66 */ "indented_line ::= LINE_INDENTED_TAB",
+ /*  67 */ "indented_line ::= LINE_INDENTED_SPACE",
+ /*  68 */ "empty ::= LINE_EMPTY",
+ /*  69 */ "blockquote ::= LINE_BLOCKQUOTE",
+ /*  70 */ "quote_lines ::= quote_line",
+ /*  71 */ "quote_line ::= LINE_BLOCKQUOTE",
+ /*  72 */ "quote_line ::= LINE_CONTINUATION",
+ /*  73 */ "list_bulleted ::= item_bulleted",
+ /*  74 */ "list_enumerated ::= item_enumerated",
+ /*  75 */ "cont_blocks ::= cont_block",
+ /*  76 */ "cont_block ::= empty",
+ /*  77 */ "table ::= LINE_TABLE",
+ /*  78 */ "def_citation ::= LINE_DEF_CITATION",
+ /*  79 */ "def_footnote ::= LINE_DEF_FOOTNOTE",
+ /*  80 */ "def_link ::= LINE_DEF_LINK",
+ /*  81 */ "html_block ::= LINE_HTML",
+ /*  82 */ "html_block_lines ::= html_block_line",
+ /*  83 */ "html_block_line ::= LINE_CONTINUATION",
+ /*  84 */ "html_block_line ::= LINE_HTML",
+ /*  85 */ "fenced_lines ::= fenced_line",
+ /*  86 */ "fenced_line ::= LINE_CONTINUATION",
+ /*  87 */ "fenced_line ::= LINE_EMPTY",
+ /*  88 */ "meta_block ::= LINE_META",
+ /*  89 */ "meta_lines ::= meta_line",
+ /*  90 */ "meta_line ::= LINE_META",
+ /*  91 */ "meta_line ::= LINE_CONTINUATION",
 };
 #endif /* NDEBUG */
 
@@ -832,91 +842,98 @@ static const struct {
   YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
   unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
 } yyRuleInfo[] = {
-  { 24, 1 },
-  { 25, 2 },
   { 25, 1 },
+  { 26, 2 },
   { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 26, 1 },
-  { 27, 2 },
-  { 39, 2 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
+  { 27, 1 },
   { 28, 2 },
+  { 41, 2 },
   { 29, 2 },
-  { 32, 2 },
-  { 43, 2 },
   { 30, 2 },
-  { 45, 3 },
-  { 45, 2 },
+  { 33, 2 },
   { 45, 2 },
-  { 45, 1 },
   { 31, 2 },
   { 47, 3 },
   { 47, 2 },
   { 47, 2 },
   { 47, 1 },
-  { 46, 2 },
-  { 48, 3 },
+  { 32, 2 },
+  { 49, 3 },
+  { 49, 2 },
+  { 49, 2 },
+  { 49, 1 },
   { 48, 2 },
-  { 33, 2 },
-  { 34, 3 },
-  { 34, 2 },
+  { 50, 3 },
+  { 50, 2 },
   { 34, 2 },
   { 35, 3 },
   { 35, 2 },
   { 35, 2 },
+  { 36, 3 },
+  { 36, 2 },
   { 36, 2 },
   { 37, 2 },
-  { 49, 2 },
-  { 38, 3 },
-  { 38, 2 },
-  { 38, 3 },
   { 38, 2 },
   { 51, 2 },
-  { 27, 1 },
-  { 39, 1 },
-  { 40, 1 },
-  { 28, 1 },
+  { 39, 3 },
+  { 39, 2 },
+  { 39, 3 },
+  { 39, 2 },
+  { 53, 2 },
+  { 40, 2 },
+  { 55, 2 },
   { 28, 1 },
   { 41, 1 },
-  { 41, 1 },
-  { 42, 1 },
   { 42, 1 },
   { 29, 1 },
-  { 32, 1 },
+  { 29, 1 },
+  { 43, 1 },
   { 43, 1 },
   { 44, 1 },
   { 44, 1 },
   { 30, 1 },
-  { 31, 1 },
+  { 33, 1 },
+  { 45, 1 },
   { 46, 1 },
+  { 46, 1 },
+  { 31, 1 },
+  { 32, 1 },
   { 48, 1 },
-  { 33, 1 },
+  { 50, 1 },
   { 34, 1 },
   { 35, 1 },
   { 36, 1 },
   { 37, 1 },
-  { 49, 1 },
-  { 50, 1 },
-  { 50, 1 },
+  { 38, 1 },
   { 51, 1 },
   { 52, 1 },
   { 52, 1 },
+  { 53, 1 },
+  { 54, 1 },
+  { 54, 1 },
+  { 40, 1 },
+  { 55, 1 },
+  { 56, 1 },
+  { 56, 1 },
 };
 
 static void yy_accept(yyParser*);  /* Forward Declaration */
@@ -1081,100 +1098,110 @@ static void yy_reduce(
 { yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_CODE_FENCED); yymsp[0].minor.yy0->child->type = CODE_FENCE; }
   yymsp[0].minor.yy0 = yylhsminor.yy0;
         break;
-      case 22: /* para ::= LINE_PLAIN para_lines */
-      case 23: /* para_lines ::= para_lines para_line */ yytestcase(yyruleno==23);
-      case 24: /* indented_code ::= indented_code code_line */ yytestcase(yyruleno==24);
-      case 25: /* empty ::= empty LINE_EMPTY */ yytestcase(yyruleno==25);
-      case 26: /* blockquote ::= LINE_BLOCKQUOTE quote_lines */ yytestcase(yyruleno==26);
-      case 27: /* quote_lines ::= quote_lines quote_line */ yytestcase(yyruleno==27);
-      case 28: /* list_bulleted ::= list_bulleted item_bulleted */ yytestcase(yyruleno==28);
-      case 33: /* list_enumerated ::= list_enumerated item_enumerated */ yytestcase(yyruleno==33);
-      case 38: /* cont_blocks ::= cont_blocks cont_block */ yytestcase(yyruleno==38);
-      case 41: /* table ::= table LINE_TABLE */ yytestcase(yyruleno==41);
-      case 43: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==43);
-      case 44: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==44);
-      case 46: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==46);
-      case 47: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==47);
-      case 48: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==48);
-      case 49: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==49);
-      case 50: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==50);
-      case 52: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==52);
-      case 54: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==54);
-      case 55: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==55);
+      case 22: /* block ::= meta_block */
+{ yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_META); }
+  yymsp[0].minor.yy0 = yylhsminor.yy0;
+        break;
+      case 23: /* para ::= LINE_PLAIN para_lines */
+      case 24: /* para_lines ::= para_lines para_line */ yytestcase(yyruleno==24);
+      case 25: /* indented_code ::= indented_code code_line */ yytestcase(yyruleno==25);
+      case 26: /* empty ::= empty LINE_EMPTY */ yytestcase(yyruleno==26);
+      case 27: /* blockquote ::= LINE_BLOCKQUOTE quote_lines */ yytestcase(yyruleno==27);
+      case 28: /* quote_lines ::= quote_lines quote_line */ yytestcase(yyruleno==28);
+      case 29: /* list_bulleted ::= list_bulleted item_bulleted */ yytestcase(yyruleno==29);
+      case 34: /* list_enumerated ::= list_enumerated item_enumerated */ yytestcase(yyruleno==34);
+      case 39: /* cont_blocks ::= cont_blocks cont_block */ yytestcase(yyruleno==39);
+      case 42: /* table ::= table LINE_TABLE */ yytestcase(yyruleno==42);
+      case 44: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==44);
+      case 45: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==45);
+      case 47: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==47);
+      case 48: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==48);
+      case 49: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==49);
+      case 50: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==50);
+      case 51: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==51);
+      case 53: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==53);
+      case 55: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==55);
+      case 56: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==56);
+      case 57: /* meta_block ::= LINE_META meta_lines */ yytestcase(yyruleno==57);
+      case 58: /* meta_lines ::= meta_lines meta_line */ yytestcase(yyruleno==58);
 { yylhsminor.yy0 = yymsp[-1].minor.yy0; token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); }
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
-      case 29: /* item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks */
-      case 34: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks */ yytestcase(yyruleno==34);
+      case 30: /* item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks */
+      case 35: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks */ yytestcase(yyruleno==35);
 { token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-2].minor.yy0, BLOCK_LIST_ITEM); recursive_parse_list_item(engine, yylhsminor.yy0); }
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
-      case 30: /* item_bulleted ::= LINE_LIST_BULLETED para_lines */
-      case 35: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines */ yytestcase(yyruleno==35);
+      case 31: /* item_bulleted ::= LINE_LIST_BULLETED para_lines */
+      case 36: /* item_enumerated ::= LINE_LIST_ENUMERATED para_lines */ yytestcase(yyruleno==36);
 { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM_TIGHT); recursive_parse_list_item(engine, yylhsminor.yy0); }
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
-      case 31: /* item_bulleted ::= LINE_LIST_BULLETED cont_blocks */
+      case 32: /* item_bulleted ::= LINE_LIST_BULLETED cont_blocks */
 { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM); if (yymsp[0].minor.yy0) {recursive_parse_list_item(engine, yylhsminor.yy0);} }
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
-      case 32: /* item_bulleted ::= LINE_LIST_BULLETED */
-      case 37: /* item_enumerated ::= LINE_LIST_ENUMERATED */ yytestcase(yyruleno==37);
+      case 33: /* item_bulleted ::= LINE_LIST_BULLETED */
+      case 38: /* item_enumerated ::= LINE_LIST_ENUMERATED */ yytestcase(yyruleno==38);
 { yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_LIST_ITEM_TIGHT); }
   yymsp[0].minor.yy0 = yylhsminor.yy0;
         break;
-      case 36: /* item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks */
+      case 37: /* item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks */
 { token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_LIST_ITEM); recursive_parse_list_item(engine, yylhsminor.yy0); }
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
-      case 39: /* cont_block ::= empty indented_line para_lines */
+      case 40: /* cont_block ::= empty indented_line para_lines */
 { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yymsp[-1].minor.yy0->type = LINE_CONTINUATION; }
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
-      case 40: /* cont_block ::= empty indented_line */
+      case 41: /* cont_block ::= empty indented_line */
 { yylhsminor.yy0 = yymsp[-1].minor.yy0; token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yymsp[0].minor.yy0->type = LINE_CONTINUATION; }
   yymsp[-1].minor.yy0 = yylhsminor.yy0;
         break;
-      case 42: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */
-      case 45: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==45);
+      case 43: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */
+      case 46: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==46);
 { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); }
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
-      case 51: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */
-      case 53: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==53);
+      case 52: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */
+      case 54: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==54);
 { yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, yymsp[0].minor.yy0); yymsp[0].minor.yy0->child->type = CODE_FENCE; }
   yymsp[-2].minor.yy0 = yylhsminor.yy0;
         break;
       default:
-      /* (56) para ::= LINE_PLAIN */ yytestcase(yyruleno==56);
-      /* (57) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=57);
-      /* (58) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==58);
-      /* (59) indented_code ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==59);
-      /* (60) indented_code ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==60);
-      /* (61) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=61);
-      /* (62) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==62);
-      /* (63) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==63);
-      /* (64) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==64);
-      /* (65) empty ::= LINE_EMPTY */ yytestcase(yyruleno==65);
-      /* (66) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==66);
-      /* (67) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=67);
-      /* (68) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==68);
-      /* (69) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==69);
-      /* (70) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=70);
-      /* (71) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=71);
-      /* (72) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=72);
-      /* (73) cont_block ::= empty */ yytestcase(yyruleno==73);
-      /* (74) table ::= LINE_TABLE */ yytestcase(yyruleno==74);
-      /* (75) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==75);
-      /* (76) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==76);
-      /* (77) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==77);
-      /* (78) html_block ::= LINE_HTML */ yytestcase(yyruleno==78);
-      /* (79) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=79);
-      /* (80) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==80);
-      /* (81) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==81);
-      /* (82) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=82);
-      /* (83) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==83);
-      /* (84) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==84);
+      /* (59) para ::= LINE_PLAIN */ yytestcase(yyruleno==59);
+      /* (60) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=60);
+      /* (61) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==61);
+      /* (62) indented_code ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==62);
+      /* (63) indented_code ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==63);
+      /* (64) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=64);
+      /* (65) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==65);
+      /* (66) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==66);
+      /* (67) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==67);
+      /* (68) empty ::= LINE_EMPTY */ yytestcase(yyruleno==68);
+      /* (69) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==69);
+      /* (70) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=70);
+      /* (71) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==71);
+      /* (72) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==72);
+      /* (73) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=73);
+      /* (74) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=74);
+      /* (75) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=75);
+      /* (76) cont_block ::= empty */ yytestcase(yyruleno==76);
+      /* (77) table ::= LINE_TABLE */ yytestcase(yyruleno==77);
+      /* (78) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==78);
+      /* (79) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==79);
+      /* (80) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==80);
+      /* (81) html_block ::= LINE_HTML */ yytestcase(yyruleno==81);
+      /* (82) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=82);
+      /* (83) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==83);
+      /* (84) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==84);
+      /* (85) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=85);
+      /* (86) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==86);
+      /* (87) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==87);
+      /* (88) meta_block ::= LINE_META */ yytestcase(yyruleno==88);
+      /* (89) meta_lines ::= meta_line (OPTIMIZED OUT) */ assert(yyruleno!=89);
+      /* (90) meta_line ::= LINE_META */ yytestcase(yyruleno==90);
+      /* (91) meta_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==91);
         break;
 /********** End reduce actions ************************************************/
   };
index ea8b4c7b022e6950cab23c2ae2315aa5b2d10ae5..292b4a952d998f142ac5fa6c7e915fcd3cd3622b 100644 (file)
@@ -20,3 +20,4 @@
 #define LINE_FENCE_BACKTICK             20
 #define LINE_FENCE_BACKTICK_START       21
 #define LINE_EMPTY                      22
+#define LINE_META                       23
index cf2d8ab02f807da3e2cff885c3086796e2e130bf..e5ffaaeacead4d23513146be8090b6465d2e4939 100644 (file)
@@ -21,6 +21,7 @@ State 0:
           block ::= * def_link
           block ::= * html_block
           block ::= * fenced_block
+          block ::= * meta_block
           para ::= * LINE_PLAIN para_lines
           para ::= * LINE_PLAIN
           indented_code ::= * indented_code code_line
@@ -60,11 +61,13 @@ State 0:
           fenced_block ::= * LINE_FENCE_BACKTICK fenced_lines
           fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK
           fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines
+          meta_block ::= * LINE_META meta_lines
+          meta_block ::= * LINE_META
 
-                    LINE_PLAIN shift        20     
-             LINE_INDENTED_TAB shift-reduce 59     indented_code ::= LINE_INDENTED_TAB
-           LINE_INDENTED_SPACE shift-reduce 60     indented_code ::= LINE_INDENTED_SPACE
-                     LINE_HTML shift        13     
+                    LINE_PLAIN shift        21     
+             LINE_INDENTED_TAB shift-reduce 62     indented_code ::= LINE_INDENTED_TAB
+           LINE_INDENTED_SPACE shift-reduce 63     indented_code ::= LINE_INDENTED_SPACE
+                     LINE_HTML shift        14     
                     LINE_ATX_1 shift-reduce 5      block ::= LINE_ATX_1
                     LINE_ATX_2 shift-reduce 6      block ::= LINE_ATX_2
                     LINE_ATX_3 shift-reduce 7      block ::= LINE_ATX_3
@@ -72,33 +75,35 @@ State 0:
                     LINE_ATX_5 shift-reduce 9      block ::= LINE_ATX_5
                     LINE_ATX_6 shift-reduce 10     block ::= LINE_ATX_6
                        LINE_HR shift-reduce 16     block ::= LINE_HR
-               LINE_BLOCKQUOTE shift        14     
+               LINE_BLOCKQUOTE shift        15     
             LINE_LIST_BULLETED shift        5      
           LINE_LIST_ENUMERATED shift        4      
-                    LINE_TABLE shift-reduce 74     table ::= LINE_TABLE
+                    LINE_TABLE shift-reduce 77     table ::= LINE_TABLE
              LINE_DEF_CITATION shift        3      
              LINE_DEF_FOOTNOTE shift        2      
-                 LINE_DEF_LINK shift        15     
-           LINE_FENCE_BACKTICK shift        12     
-     LINE_FENCE_BACKTICK_START shift        11     
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
+                 LINE_DEF_LINK shift        16     
+           LINE_FENCE_BACKTICK shift        13     
+     LINE_FENCE_BACKTICK_START shift        12     
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                     LINE_META shift        11     
                            doc accept
                         blocks shift        1      
                          block shift-reduce 2      blocks ::= block
                           para shift-reduce 3      block ::= para
                  indented_code shift        10     
-                         empty shift        37     
-                 list_bulleted shift        35     
-               list_enumerated shift        33     
+                         empty shift        39     
+                 list_bulleted shift        37     
+               list_enumerated shift        35     
                     blockquote shift-reduce 14     block ::= blockquote
-                         table shift        36     
+                         table shift        38     
                   def_citation shift-reduce 17     block ::= def_citation
                   def_footnote shift-reduce 18     block ::= def_footnote
                       def_link shift-reduce 19     block ::= def_link
                     html_block shift-reduce 20     block ::= html_block
                   fenced_block shift-reduce 21     block ::= fenced_block
-                 item_bulleted shift        35       /* because item_bulleted==list_bulleted */
-               item_enumerated shift        33       /* because item_enumerated==list_enumerated */
+                    meta_block shift-reduce 22     block ::= meta_block
+                 item_bulleted shift        37       /* because item_bulleted==list_bulleted */
+               item_enumerated shift        35       /* because item_enumerated==list_enumerated */
 
 State 1:
       (0) doc ::= blocks *
@@ -122,6 +127,7 @@ State 1:
           block ::= * def_link
           block ::= * html_block
           block ::= * fenced_block
+          block ::= * meta_block
           para ::= * LINE_PLAIN para_lines
           para ::= * LINE_PLAIN
           indented_code ::= * indented_code code_line
@@ -161,12 +167,14 @@ State 1:
           fenced_block ::= * LINE_FENCE_BACKTICK fenced_lines
           fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK
           fenced_block ::= * LINE_FENCE_BACKTICK_START fenced_lines
+          meta_block ::= * LINE_META meta_lines
+          meta_block ::= * LINE_META
 
                              $ reduce       0      doc ::= blocks
-                    LINE_PLAIN shift        20     
-             LINE_INDENTED_TAB shift-reduce 59     indented_code ::= LINE_INDENTED_TAB
-           LINE_INDENTED_SPACE shift-reduce 60     indented_code ::= LINE_INDENTED_SPACE
-                     LINE_HTML shift        13     
+                    LINE_PLAIN shift        21     
+             LINE_INDENTED_TAB shift-reduce 62     indented_code ::= LINE_INDENTED_TAB
+           LINE_INDENTED_SPACE shift-reduce 63     indented_code ::= LINE_INDENTED_SPACE
+                     LINE_HTML shift        14     
                     LINE_ATX_1 shift-reduce 5      block ::= LINE_ATX_1
                     LINE_ATX_2 shift-reduce 6      block ::= LINE_ATX_2
                     LINE_ATX_3 shift-reduce 7      block ::= LINE_ATX_3
@@ -174,31 +182,33 @@ State 1:
                     LINE_ATX_5 shift-reduce 9      block ::= LINE_ATX_5
                     LINE_ATX_6 shift-reduce 10     block ::= LINE_ATX_6
                        LINE_HR shift-reduce 16     block ::= LINE_HR
-               LINE_BLOCKQUOTE shift        14     
+               LINE_BLOCKQUOTE shift        15     
             LINE_LIST_BULLETED shift        5      
           LINE_LIST_ENUMERATED shift        4      
-                    LINE_TABLE shift-reduce 74     table ::= LINE_TABLE
+                    LINE_TABLE shift-reduce 77     table ::= LINE_TABLE
              LINE_DEF_CITATION shift        3      
              LINE_DEF_FOOTNOTE shift        2      
-                 LINE_DEF_LINK shift        15     
-           LINE_FENCE_BACKTICK shift        12     
-     LINE_FENCE_BACKTICK_START shift        11     
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
+                 LINE_DEF_LINK shift        16     
+           LINE_FENCE_BACKTICK shift        13     
+     LINE_FENCE_BACKTICK_START shift        12     
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                     LINE_META shift        11     
                          block shift-reduce 1      blocks ::= blocks block
                           para shift-reduce 3      block ::= para
                  indented_code shift        10     
-                         empty shift        37     
-                 list_bulleted shift        35     
-               list_enumerated shift        33     
+                         empty shift        39     
+                 list_bulleted shift        37     
+               list_enumerated shift        35     
                     blockquote shift-reduce 14     block ::= blockquote
-                         table shift        36     
+                         table shift        38     
                   def_citation shift-reduce 17     block ::= def_citation
                   def_footnote shift-reduce 18     block ::= def_footnote
                       def_link shift-reduce 19     block ::= def_link
                     html_block shift-reduce 20     block ::= html_block
                   fenced_block shift-reduce 21     block ::= fenced_block
-                 item_bulleted shift        35       /* because item_bulleted==list_bulleted */
-               item_enumerated shift        33       /* because item_enumerated==list_enumerated */
+                    meta_block shift-reduce 22     block ::= meta_block
+                 item_bulleted shift        37       /* because item_bulleted==list_bulleted */
+               item_enumerated shift        35       /* because item_enumerated==list_enumerated */
 
 State 2:
           para_lines ::= * para_lines para_line
@@ -214,17 +224,17 @@ State 2:
           def_footnote ::= LINE_DEF_FOOTNOTE * para_lines cont_blocks
           def_footnote ::= LINE_DEF_FOOTNOTE * para_lines
           def_footnote ::= LINE_DEF_FOOTNOTE * cont_blocks
-     (76) def_footnote ::= LINE_DEF_FOOTNOTE *
+     (79) def_footnote ::= LINE_DEF_FOOTNOTE *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       76      ** Parsing conflict **
-                         empty shift        28     
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       79      ** Parsing conflict **
+                         empty shift        29     
                     para_lines shift        6      
                      para_line shift        6        /* because para_line==para_lines */
-                   cont_blocks shift        16     
-                    cont_block shift        16       /* because cont_block==cont_blocks */
-                     {default} reduce       76     def_footnote ::= LINE_DEF_FOOTNOTE
+                   cont_blocks shift        17     
+                    cont_block shift        17       /* because cont_block==cont_blocks */
+                     {default} reduce       79     def_footnote ::= LINE_DEF_FOOTNOTE
 
 State 3:
           para_lines ::= * para_lines para_line
@@ -240,17 +250,17 @@ State 3:
           def_citation ::= LINE_DEF_CITATION * para_lines cont_blocks
           def_citation ::= LINE_DEF_CITATION * para_lines
           def_citation ::= LINE_DEF_CITATION * cont_blocks
-     (75) def_citation ::= LINE_DEF_CITATION *
+     (78) def_citation ::= LINE_DEF_CITATION *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       75      ** Parsing conflict **
-                         empty shift        28     
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       78      ** Parsing conflict **
+                         empty shift        29     
                     para_lines shift        7      
                      para_line shift        7        /* because para_line==para_lines */
-                   cont_blocks shift        18     
-                    cont_block shift        18       /* because cont_block==cont_blocks */
-                     {default} reduce       75     def_citation ::= LINE_DEF_CITATION
+                   cont_blocks shift        19     
+                    cont_block shift        19       /* because cont_block==cont_blocks */
+                     {default} reduce       78     def_citation ::= LINE_DEF_CITATION
 
 State 4:
           para_lines ::= * para_lines para_line
@@ -261,22 +271,22 @@ State 4:
           item_enumerated ::= LINE_LIST_ENUMERATED * para_lines cont_blocks
           item_enumerated ::= LINE_LIST_ENUMERATED * para_lines
           item_enumerated ::= LINE_LIST_ENUMERATED * cont_blocks
-     (37) item_enumerated ::= LINE_LIST_ENUMERATED *
+     (38) item_enumerated ::= LINE_LIST_ENUMERATED *
           cont_blocks ::= * cont_blocks cont_block
           cont_blocks ::= * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       37      ** Parsing conflict **
-                         empty shift        28     
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       38      ** Parsing conflict **
+                         empty shift        29     
                     para_lines shift        8      
                      para_line shift        8        /* because para_line==para_lines */
-                   cont_blocks shift        21     
-                    cont_block shift        21       /* because cont_block==cont_blocks */
-                     {default} reduce       37     item_enumerated ::= LINE_LIST_ENUMERATED
+                   cont_blocks shift        22     
+                    cont_block shift        22       /* because cont_block==cont_blocks */
+                     {default} reduce       38     item_enumerated ::= LINE_LIST_ENUMERATED
 
 State 5:
           para_lines ::= * para_lines para_line
@@ -287,22 +297,22 @@ State 5:
           item_bulleted ::= LINE_LIST_BULLETED * para_lines cont_blocks
           item_bulleted ::= LINE_LIST_BULLETED * para_lines
           item_bulleted ::= LINE_LIST_BULLETED * cont_blocks
-     (32) item_bulleted ::= LINE_LIST_BULLETED *
+     (33) item_bulleted ::= LINE_LIST_BULLETED *
           cont_blocks ::= * cont_blocks cont_block
           cont_blocks ::= * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       32      ** Parsing conflict **
-                         empty shift        28     
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       33      ** Parsing conflict **
+                         empty shift        29     
                     para_lines shift        9      
                      para_line shift        9        /* because para_line==para_lines */
-                   cont_blocks shift        23     
-                    cont_block shift        23       /* because cont_block==cont_blocks */
-                     {default} reduce       32     item_bulleted ::= LINE_LIST_BULLETED
+                   cont_blocks shift        24     
+                    cont_block shift        24       /* because cont_block==cont_blocks */
+                     {default} reduce       33     item_bulleted ::= LINE_LIST_BULLETED
 
 State 6:
           para_lines ::= para_lines * para_line
@@ -315,16 +325,16 @@ State 6:
           cont_block ::= * empty indented_line
           cont_block ::= * empty
           def_footnote ::= LINE_DEF_FOOTNOTE para_lines * cont_blocks
-     (46) def_footnote ::= LINE_DEF_FOOTNOTE para_lines *
+     (47) def_footnote ::= LINE_DEF_FOOTNOTE para_lines *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       46      ** Parsing conflict **
-                         empty shift        28     
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                   cont_blocks shift        17     
-                    cont_block shift        17       /* because cont_block==cont_blocks */
-                     {default} reduce       46     def_footnote ::= LINE_DEF_FOOTNOTE para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       47      ** Parsing conflict **
+                         empty shift        29     
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                   cont_blocks shift        18     
+                    cont_block shift        18       /* because cont_block==cont_blocks */
+                     {default} reduce       47     def_footnote ::= LINE_DEF_FOOTNOTE para_lines
 
 State 7:
           para_lines ::= para_lines * para_line
@@ -337,16 +347,16 @@ State 7:
           cont_block ::= * empty indented_line
           cont_block ::= * empty
           def_citation ::= LINE_DEF_CITATION para_lines * cont_blocks
-     (43) def_citation ::= LINE_DEF_CITATION para_lines *
+     (44) def_citation ::= LINE_DEF_CITATION para_lines *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       43      ** Parsing conflict **
-                         empty shift        28     
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                   cont_blocks shift        19     
-                    cont_block shift        19       /* because cont_block==cont_blocks */
-                     {default} reduce       43     def_citation ::= LINE_DEF_CITATION para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       44      ** Parsing conflict **
+                         empty shift        29     
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                   cont_blocks shift        20     
+                    cont_block shift        20       /* because cont_block==cont_blocks */
+                     {default} reduce       44     def_citation ::= LINE_DEF_CITATION para_lines
 
 State 8:
           para_lines ::= para_lines * para_line
@@ -354,21 +364,21 @@ State 8:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           item_enumerated ::= LINE_LIST_ENUMERATED para_lines * cont_blocks
-     (35) item_enumerated ::= LINE_LIST_ENUMERATED para_lines *
+     (36) item_enumerated ::= LINE_LIST_ENUMERATED para_lines *
           cont_blocks ::= * cont_blocks cont_block
           cont_blocks ::= * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       35      ** Parsing conflict **
-                         empty shift        28     
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                   cont_blocks shift        22     
-                    cont_block shift        22       /* because cont_block==cont_blocks */
-                     {default} reduce       35     item_enumerated ::= LINE_LIST_ENUMERATED para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       36      ** Parsing conflict **
+                         empty shift        29     
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                   cont_blocks shift        23     
+                    cont_block shift        23       /* because cont_block==cont_blocks */
+                     {default} reduce       36     item_enumerated ::= LINE_LIST_ENUMERATED para_lines
 
 State 9:
           para_lines ::= para_lines * para_line
@@ -376,21 +386,21 @@ State 9:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           item_bulleted ::= LINE_LIST_BULLETED para_lines * cont_blocks
-     (30) item_bulleted ::= LINE_LIST_BULLETED para_lines *
+     (31) item_bulleted ::= LINE_LIST_BULLETED para_lines *
           cont_blocks ::= * cont_blocks cont_block
           cont_blocks ::= * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       30      ** Parsing conflict **
-                         empty shift        28     
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                   cont_blocks shift        24     
-                    cont_block shift        24       /* because cont_block==cont_blocks */
-                     {default} reduce       30     item_bulleted ::= LINE_LIST_BULLETED para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       31      ** Parsing conflict **
+                         empty shift        29     
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                   cont_blocks shift        25     
+                    cont_block shift        25       /* because cont_block==cont_blocks */
+                     {default} reduce       31     item_bulleted ::= LINE_LIST_BULLETED para_lines
 
 State 10:
       (4) block ::= indented_code *
@@ -400,17 +410,32 @@ State 10:
           indented_line ::= * LINE_INDENTED_TAB
           indented_line ::= * LINE_INDENTED_SPACE
 
-             LINE_INDENTED_TAB shift-reduce 63     indented_line ::= LINE_INDENTED_TAB
+             LINE_INDENTED_TAB shift-reduce 66     indented_line ::= LINE_INDENTED_TAB
              LINE_INDENTED_TAB reduce       4       ** Parsing conflict **
-           LINE_INDENTED_SPACE shift-reduce 64     indented_line ::= LINE_INDENTED_SPACE
+           LINE_INDENTED_SPACE shift-reduce 67     indented_line ::= LINE_INDENTED_SPACE
            LINE_INDENTED_SPACE reduce       4       ** Parsing conflict **
-                    LINE_EMPTY shift-reduce 62     code_line ::= LINE_EMPTY
+                    LINE_EMPTY shift-reduce 65     code_line ::= LINE_EMPTY
                     LINE_EMPTY reduce       4       ** Parsing conflict **
-                     code_line shift-reduce 24     indented_code ::= indented_code code_line
-                 indented_line shift-reduce 24     indented_code ::= indented_code code_line  /* because indented_line==code_line */
+                     code_line shift-reduce 25     indented_code ::= indented_code code_line
+                 indented_line shift-reduce 25     indented_code ::= indented_code code_line  /* because indented_line==code_line */
                      {default} reduce       4      block ::= indented_code
 
 State 11:
+          meta_block ::= LINE_META * meta_lines
+     (88) meta_block ::= LINE_META *
+          meta_lines ::= * meta_lines meta_line
+          meta_lines ::= * meta_line
+          meta_line ::= * LINE_META
+          meta_line ::= * LINE_CONTINUATION
+
+             LINE_CONTINUATION shift-reduce 91     meta_line ::= LINE_CONTINUATION
+                     LINE_META shift-reduce 90     meta_line ::= LINE_META
+                     LINE_META reduce       88      ** Parsing conflict **
+                    meta_lines shift        30     
+                     meta_line shift        30       /* because meta_line==meta_lines */
+                     {default} reduce       88     meta_block ::= LINE_META
+
+State 12:
           fenced_block ::= LINE_FENCE_BACKTICK_START * fenced_lines LINE_FENCE_BACKTICK
           fenced_block ::= LINE_FENCE_BACKTICK_START * fenced_lines
           fenced_lines ::= * fenced_lines fenced_line
@@ -418,12 +443,12 @@ State 11:
           fenced_line ::= * LINE_CONTINUATION
           fenced_line ::= * LINE_EMPTY
 
-             LINE_CONTINUATION shift-reduce 83     fenced_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 84     fenced_line ::= LINE_EMPTY
-                  fenced_lines shift        26     
-                   fenced_line shift        26       /* because fenced_line==fenced_lines */
+             LINE_CONTINUATION shift-reduce 86     fenced_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 87     fenced_line ::= LINE_EMPTY
+                  fenced_lines shift        27     
+                   fenced_line shift        27       /* because fenced_line==fenced_lines */
 
-State 12:
+State 13:
           fenced_block ::= LINE_FENCE_BACKTICK * fenced_lines LINE_FENCE_BACKTICK
           fenced_block ::= LINE_FENCE_BACKTICK * fenced_lines
           fenced_lines ::= * fenced_lines fenced_line
@@ -431,287 +456,299 @@ State 12:
           fenced_line ::= * LINE_CONTINUATION
           fenced_line ::= * LINE_EMPTY
 
-             LINE_CONTINUATION shift-reduce 83     fenced_line ::= LINE_CONTINUATION
-                    LINE_EMPTY shift-reduce 84     fenced_line ::= LINE_EMPTY
-                  fenced_lines shift        27     
-                   fenced_line shift        27       /* because fenced_line==fenced_lines */
+             LINE_CONTINUATION shift-reduce 86     fenced_line ::= LINE_CONTINUATION
+                    LINE_EMPTY shift-reduce 87     fenced_line ::= LINE_EMPTY
+                  fenced_lines shift        28     
+                   fenced_line shift        28       /* because fenced_line==fenced_lines */
 
-State 13:
+State 14:
           html_block ::= LINE_HTML * html_block_lines
-     (78) html_block ::= LINE_HTML *
+     (81) html_block ::= LINE_HTML *
           html_block_lines ::= * html_block_lines html_block_line
           html_block_lines ::= * html_block_line
           html_block_line ::= * LINE_CONTINUATION
           html_block_line ::= * LINE_HTML
 
-             LINE_CONTINUATION shift-reduce 80     html_block_line ::= LINE_CONTINUATION
-                     LINE_HTML shift-reduce 81     html_block_line ::= LINE_HTML
-                     LINE_HTML reduce       78      ** Parsing conflict **
-              html_block_lines shift        29     
-               html_block_line shift        29       /* because html_block_line==html_block_lines */
-                     {default} reduce       78     html_block ::= LINE_HTML
+             LINE_CONTINUATION shift-reduce 83     html_block_line ::= LINE_CONTINUATION
+                     LINE_HTML shift-reduce 84     html_block_line ::= LINE_HTML
+                     LINE_HTML reduce       81      ** Parsing conflict **
+              html_block_lines shift        31     
+               html_block_line shift        31       /* because html_block_line==html_block_lines */
+                     {default} reduce       81     html_block ::= LINE_HTML
 
-State 14:
+State 15:
           blockquote ::= LINE_BLOCKQUOTE * quote_lines
-     (66) blockquote ::= LINE_BLOCKQUOTE *
+     (69) blockquote ::= LINE_BLOCKQUOTE *
           quote_lines ::= * quote_lines quote_line
           quote_lines ::= * quote_line
           quote_line ::= * LINE_BLOCKQUOTE
           quote_line ::= * LINE_CONTINUATION
 
-             LINE_CONTINUATION shift-reduce 69     quote_line ::= LINE_CONTINUATION
-               LINE_BLOCKQUOTE shift-reduce 68     quote_line ::= LINE_BLOCKQUOTE
-               LINE_BLOCKQUOTE reduce       66      ** Parsing conflict **
-                   quote_lines shift        30     
-                    quote_line shift        30       /* because quote_line==quote_lines */
-                     {default} reduce       66     blockquote ::= LINE_BLOCKQUOTE
+             LINE_CONTINUATION shift-reduce 72     quote_line ::= LINE_CONTINUATION
+               LINE_BLOCKQUOTE shift-reduce 71     quote_line ::= LINE_BLOCKQUOTE
+               LINE_BLOCKQUOTE reduce       69      ** Parsing conflict **
+                   quote_lines shift        32     
+                    quote_line shift        32       /* because quote_line==quote_lines */
+                     {default} reduce       69     blockquote ::= LINE_BLOCKQUOTE
 
-State 15:
+State 16:
           para_lines ::= * para_lines para_line
           para_lines ::= * para_line
           para_line ::= * LINE_CONTINUATION
           def_link ::= LINE_DEF_LINK * para_lines
-     (77) def_link ::= LINE_DEF_LINK *
+     (80) def_link ::= LINE_DEF_LINK *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    para_lines shift        31     
-                     para_line shift        31       /* because para_line==para_lines */
-                     {default} reduce       77     def_link ::= LINE_DEF_LINK
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    para_lines shift        33     
+                     para_line shift        33       /* because para_line==para_lines */
+                     {default} reduce       80     def_link ::= LINE_DEF_LINK
 
-State 16:
+State 17:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
-     (47) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks *
+     (48) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks *
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       47      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       47     def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       48      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       48     def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks
 
-State 17:
+State 18:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
-     (45) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks *
+     (46) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks *
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       45      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       45     def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       46      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       46     def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks
 
-State 18:
+State 19:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
-     (44) def_citation ::= LINE_DEF_CITATION cont_blocks *
+     (45) def_citation ::= LINE_DEF_CITATION cont_blocks *
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       44      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       44     def_citation ::= LINE_DEF_CITATION cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       45      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       45     def_citation ::= LINE_DEF_CITATION cont_blocks
 
-State 19:
+State 20:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
-     (42) def_citation ::= LINE_DEF_CITATION para_lines cont_blocks *
+     (43) def_citation ::= LINE_DEF_CITATION para_lines cont_blocks *
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       42      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       42     def_citation ::= LINE_DEF_CITATION para_lines cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       43      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       43     def_citation ::= LINE_DEF_CITATION para_lines cont_blocks
 
-State 20:
+State 21:
           para ::= LINE_PLAIN * para_lines
-     (56) para ::= LINE_PLAIN *
+     (59) para ::= LINE_PLAIN *
           para_lines ::= * para_lines para_line
           para_lines ::= * para_line
           para_line ::= * LINE_CONTINUATION
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    para_lines shift        32     
-                     para_line shift        32       /* because para_line==para_lines */
-                     {default} reduce       56     para ::= LINE_PLAIN
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    para_lines shift        34     
+                     para_line shift        34       /* because para_line==para_lines */
+                     {default} reduce       59     para ::= LINE_PLAIN
 
-State 21:
+State 22:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
-     (36) item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks *
+     (37) item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks *
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       36      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       36     item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       37      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       37     item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks
 
-State 22:
+State 23:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
-     (34) item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks *
+     (35) item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks *
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       34      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       34     item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       35      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       35     item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks
 
-State 23:
+State 24:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
-     (31) item_bulleted ::= LINE_LIST_BULLETED cont_blocks *
+     (32) item_bulleted ::= LINE_LIST_BULLETED cont_blocks *
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       31      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       31     item_bulleted ::= LINE_LIST_BULLETED cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       32      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       32     item_bulleted ::= LINE_LIST_BULLETED cont_blocks
 
-State 24:
+State 25:
           empty ::= * empty LINE_EMPTY
           empty ::= * LINE_EMPTY
-     (29) item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks *
+     (30) item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks *
           cont_blocks ::= cont_blocks * cont_block
           cont_block ::= * empty indented_line para_lines
           cont_block ::= * empty indented_line
           cont_block ::= * empty
 
-                    LINE_EMPTY shift-reduce 65     empty ::= LINE_EMPTY
-                    LINE_EMPTY reduce       29      ** Parsing conflict **
-                         empty shift        28     
-                    cont_block shift-reduce 38     cont_blocks ::= cont_blocks cont_block
-                     {default} reduce       29     item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks
+                    LINE_EMPTY shift-reduce 68     empty ::= LINE_EMPTY
+                    LINE_EMPTY reduce       30      ** Parsing conflict **
+                         empty shift        29     
+                    cont_block shift-reduce 39     cont_blocks ::= cont_blocks cont_block
+                     {default} reduce       30     item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks
 
-State 25:
+State 26:
           para_lines ::= * para_lines para_line
           para_lines ::= * para_line
           para_line ::= * LINE_CONTINUATION
           cont_block ::= empty indented_line * para_lines
-     (40) cont_block ::= empty indented_line *
+     (41) cont_block ::= empty indented_line *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                    para_lines shift        34     
-                     para_line shift        34       /* because para_line==para_lines */
-                     {default} reduce       40     cont_block ::= empty indented_line
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                    para_lines shift        36     
+                     para_line shift        36       /* because para_line==para_lines */
+                     {default} reduce       41     cont_block ::= empty indented_line
 
-State 26:
+State 27:
           fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * LINE_FENCE_BACKTICK
-     (54) fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines *
+     (55) fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines *
           fenced_lines ::= fenced_lines * fenced_line
           fenced_line ::= * LINE_CONTINUATION
           fenced_line ::= * LINE_EMPTY
 
-             LINE_CONTINUATION shift-reduce 83     fenced_line ::= LINE_CONTINUATION
-           LINE_FENCE_BACKTICK shift-reduce 53     fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK
-           LINE_FENCE_BACKTICK reduce       54      ** Parsing conflict **
-                    LINE_EMPTY shift-reduce 84     fenced_line ::= LINE_EMPTY
-                    LINE_EMPTY reduce       54      ** Parsing conflict **
-                   fenced_line shift-reduce 55     fenced_lines ::= fenced_lines fenced_line
-                     {default} reduce       54     fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines
+             LINE_CONTINUATION shift-reduce 86     fenced_line ::= LINE_CONTINUATION
+           LINE_FENCE_BACKTICK shift-reduce 54     fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK
+           LINE_FENCE_BACKTICK reduce       55      ** Parsing conflict **
+                    LINE_EMPTY shift-reduce 87     fenced_line ::= LINE_EMPTY
+                    LINE_EMPTY reduce       55      ** Parsing conflict **
+                   fenced_line shift-reduce 56     fenced_lines ::= fenced_lines fenced_line
+                     {default} reduce       55     fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines
 
-State 27:
+State 28:
           fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * LINE_FENCE_BACKTICK
-     (52) fenced_block ::= LINE_FENCE_BACKTICK fenced_lines *
+     (53) fenced_block ::= LINE_FENCE_BACKTICK fenced_lines *
           fenced_lines ::= fenced_lines * fenced_line
           fenced_line ::= * LINE_CONTINUATION
           fenced_line ::= * LINE_EMPTY
 
-             LINE_CONTINUATION shift-reduce 83     fenced_line ::= LINE_CONTINUATION
-           LINE_FENCE_BACKTICK shift-reduce 51     fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK
-           LINE_FENCE_BACKTICK reduce       52      ** Parsing conflict **
-                    LINE_EMPTY shift-reduce 84     fenced_line ::= LINE_EMPTY
-                    LINE_EMPTY reduce       52      ** Parsing conflict **
-                   fenced_line shift-reduce 55     fenced_lines ::= fenced_lines fenced_line
-                     {default} reduce       52     fenced_block ::= LINE_FENCE_BACKTICK fenced_lines
+             LINE_CONTINUATION shift-reduce 86     fenced_line ::= LINE_CONTINUATION
+           LINE_FENCE_BACKTICK shift-reduce 52     fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK
+           LINE_FENCE_BACKTICK reduce       53      ** Parsing conflict **
+                    LINE_EMPTY shift-reduce 87     fenced_line ::= LINE_EMPTY
+                    LINE_EMPTY reduce       53      ** Parsing conflict **
+                   fenced_line shift-reduce 56     fenced_lines ::= fenced_lines fenced_line
+                     {default} reduce       53     fenced_block ::= LINE_FENCE_BACKTICK fenced_lines
 
-State 28:
+State 29:
           indented_line ::= * LINE_INDENTED_TAB
           indented_line ::= * LINE_INDENTED_SPACE
           empty ::= empty * LINE_EMPTY
           cont_block ::= empty * indented_line para_lines
           cont_block ::= empty * indented_line
-     (73) cont_block ::= empty *
+     (76) cont_block ::= empty *
 
-             LINE_INDENTED_TAB shift-reduce 63     indented_line ::= LINE_INDENTED_TAB
-             LINE_INDENTED_TAB reduce       73      ** Parsing conflict **
-           LINE_INDENTED_SPACE shift-reduce 64     indented_line ::= LINE_INDENTED_SPACE
-           LINE_INDENTED_SPACE reduce       73      ** Parsing conflict **
-                    LINE_EMPTY shift-reduce 25     empty ::= empty LINE_EMPTY
-                    LINE_EMPTY reduce       73      ** Parsing conflict **
-                 indented_line shift        25     
-                     {default} reduce       73     cont_block ::= empty
+             LINE_INDENTED_TAB shift-reduce 66     indented_line ::= LINE_INDENTED_TAB
+             LINE_INDENTED_TAB reduce       76      ** Parsing conflict **
+           LINE_INDENTED_SPACE shift-reduce 67     indented_line ::= LINE_INDENTED_SPACE
+           LINE_INDENTED_SPACE reduce       76      ** Parsing conflict **
+                    LINE_EMPTY shift-reduce 26     empty ::= empty LINE_EMPTY
+                    LINE_EMPTY reduce       76      ** Parsing conflict **
+                 indented_line shift        26     
+                     {default} reduce       76     cont_block ::= empty
 
-State 29:
-     (49) html_block ::= LINE_HTML html_block_lines *
+State 30:
+     (57) meta_block ::= LINE_META meta_lines *
+          meta_lines ::= meta_lines * meta_line
+          meta_line ::= * LINE_META
+          meta_line ::= * LINE_CONTINUATION
+
+             LINE_CONTINUATION shift-reduce 91     meta_line ::= LINE_CONTINUATION
+                     LINE_META shift-reduce 90     meta_line ::= LINE_META
+                     LINE_META reduce       57      ** Parsing conflict **
+                     meta_line shift-reduce 58     meta_lines ::= meta_lines meta_line
+                     {default} reduce       57     meta_block ::= LINE_META meta_lines
+
+State 31:
+     (50) html_block ::= LINE_HTML html_block_lines *
           html_block_lines ::= html_block_lines * html_block_line
           html_block_line ::= * LINE_CONTINUATION
           html_block_line ::= * LINE_HTML
 
-             LINE_CONTINUATION shift-reduce 80     html_block_line ::= LINE_CONTINUATION
-                     LINE_HTML shift-reduce 81     html_block_line ::= LINE_HTML
-                     LINE_HTML reduce       49      ** Parsing conflict **
-               html_block_line shift-reduce 50     html_block_lines ::= html_block_lines html_block_line
-                     {default} reduce       49     html_block ::= LINE_HTML html_block_lines
+             LINE_CONTINUATION shift-reduce 83     html_block_line ::= LINE_CONTINUATION
+                     LINE_HTML shift-reduce 84     html_block_line ::= LINE_HTML
+                     LINE_HTML reduce       50      ** Parsing conflict **
+               html_block_line shift-reduce 51     html_block_lines ::= html_block_lines html_block_line
+                     {default} reduce       50     html_block ::= LINE_HTML html_block_lines
 
-State 30:
-     (26) blockquote ::= LINE_BLOCKQUOTE quote_lines *
+State 32:
+     (27) blockquote ::= LINE_BLOCKQUOTE quote_lines *
           quote_lines ::= quote_lines * quote_line
           quote_line ::= * LINE_BLOCKQUOTE
           quote_line ::= * LINE_CONTINUATION
 
-             LINE_CONTINUATION shift-reduce 69     quote_line ::= LINE_CONTINUATION
-               LINE_BLOCKQUOTE shift-reduce 68     quote_line ::= LINE_BLOCKQUOTE
-               LINE_BLOCKQUOTE reduce       26      ** Parsing conflict **
-                    quote_line shift-reduce 27     quote_lines ::= quote_lines quote_line
-                     {default} reduce       26     blockquote ::= LINE_BLOCKQUOTE quote_lines
+             LINE_CONTINUATION shift-reduce 72     quote_line ::= LINE_CONTINUATION
+               LINE_BLOCKQUOTE shift-reduce 71     quote_line ::= LINE_BLOCKQUOTE
+               LINE_BLOCKQUOTE reduce       27      ** Parsing conflict **
+                    quote_line shift-reduce 28     quote_lines ::= quote_lines quote_line
+                     {default} reduce       27     blockquote ::= LINE_BLOCKQUOTE quote_lines
 
-State 31:
+State 33:
           para_lines ::= para_lines * para_line
           para_line ::= * LINE_CONTINUATION
-     (48) def_link ::= LINE_DEF_LINK para_lines *
+     (49) def_link ::= LINE_DEF_LINK para_lines *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                     {default} reduce       48     def_link ::= LINE_DEF_LINK para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                     {default} reduce       49     def_link ::= LINE_DEF_LINK para_lines
 
-State 32:
-     (22) para ::= LINE_PLAIN para_lines *
+State 34:
+     (23) para ::= LINE_PLAIN para_lines *
           para_lines ::= para_lines * para_line
           para_line ::= * LINE_CONTINUATION
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                     {default} reduce       22     para ::= LINE_PLAIN para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                     {default} reduce       23     para ::= LINE_PLAIN para_lines
 
-State 33:
+State 35:
      (13) block ::= list_enumerated *
           list_enumerated ::= list_enumerated * item_enumerated
           item_enumerated ::= * LINE_LIST_ENUMERATED para_lines cont_blocks
@@ -721,19 +758,19 @@ State 33:
 
           LINE_LIST_ENUMERATED shift        4      
           LINE_LIST_ENUMERATED reduce       13      ** Parsing conflict **
-               item_enumerated shift-reduce 33     list_enumerated ::= list_enumerated item_enumerated
+               item_enumerated shift-reduce 34     list_enumerated ::= list_enumerated item_enumerated
                      {default} reduce       13     block ::= list_enumerated
 
-State 34:
+State 36:
           para_lines ::= para_lines * para_line
           para_line ::= * LINE_CONTINUATION
-     (39) cont_block ::= empty indented_line para_lines *
+     (40) cont_block ::= empty indented_line para_lines *
 
-             LINE_CONTINUATION shift-reduce 58     para_line ::= LINE_CONTINUATION
-                     para_line shift-reduce 23     para_lines ::= para_lines para_line
-                     {default} reduce       39     cont_block ::= empty indented_line para_lines
+             LINE_CONTINUATION shift-reduce 61     para_line ::= LINE_CONTINUATION
+                     para_line shift-reduce 24     para_lines ::= para_lines para_line
+                     {default} reduce       40     cont_block ::= empty indented_line para_lines
 
-State 35:
+State 37:
      (12) block ::= list_bulleted *
           list_bulleted ::= list_bulleted * item_bulleted
           item_bulleted ::= * LINE_LIST_BULLETED para_lines cont_blocks
@@ -743,22 +780,22 @@ State 35:
 
             LINE_LIST_BULLETED shift        5      
             LINE_LIST_BULLETED reduce       12      ** Parsing conflict **
-                 item_bulleted shift-reduce 28     list_bulleted ::= list_bulleted item_bulleted
+                 item_bulleted shift-reduce 29     list_bulleted ::= list_bulleted item_bulleted
                      {default} reduce       12     block ::= list_bulleted
 
-State 36:
+State 38:
      (15) block ::= table *
           table ::= table * LINE_TABLE
 
-                    LINE_TABLE shift-reduce 41     table ::= table LINE_TABLE
+                    LINE_TABLE shift-reduce 42     table ::= table LINE_TABLE
                     LINE_TABLE reduce       15      ** Parsing conflict **
                      {default} reduce       15     block ::= table
 
-State 37:
+State 39:
      (11) block ::= empty *
           empty ::= empty * LINE_EMPTY
 
-                    LINE_EMPTY shift-reduce 25     empty ::= empty LINE_EMPTY
+                    LINE_EMPTY shift-reduce 26     empty ::= empty LINE_EMPTY
                     LINE_EMPTY reduce       11      ** Parsing conflict **
                      {default} reduce       11     block ::= empty
 
@@ -787,33 +824,37 @@ Symbols:
    20: LINE_FENCE_BACKTICK
    21: LINE_FENCE_BACKTICK_START
    22: LINE_EMPTY
-   23: error:
-   24: doc: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY
-   25: blocks: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY
-   26: block: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY
-   27: para: LINE_PLAIN
-   28: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE
-   29: empty: LINE_EMPTY
-   30: list_bulleted: LINE_LIST_BULLETED
-   31: list_enumerated: LINE_LIST_ENUMERATED
-   32: blockquote: LINE_BLOCKQUOTE
-   33: table: LINE_TABLE
-   34: def_citation: LINE_DEF_CITATION
-   35: def_footnote: LINE_DEF_FOOTNOTE
-   36: def_link: LINE_DEF_LINK
-   37: html_block: LINE_HTML
-   38: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START
-   39: para_lines: LINE_CONTINUATION
-   40: para_line: LINE_CONTINUATION
-   41: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY
-   42: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE
-   43: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE
-   44: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE
-   45: item_bulleted: LINE_LIST_BULLETED
-   46: cont_blocks: LINE_EMPTY
-   47: item_enumerated: LINE_LIST_ENUMERATED
-   48: cont_block: LINE_EMPTY
-   49: html_block_lines: LINE_CONTINUATION LINE_HTML
-   50: html_block_line: LINE_CONTINUATION LINE_HTML
-   51: fenced_lines: LINE_CONTINUATION LINE_EMPTY
-   52: fenced_line: LINE_CONTINUATION LINE_EMPTY
+   23: LINE_META
+   24: error:
+   25: doc: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY LINE_META
+   26: blocks: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY LINE_META
+   27: block: LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_HTML LINE_ATX_1 LINE_ATX_2 LINE_ATX_3 LINE_ATX_4 LINE_ATX_5 LINE_ATX_6 LINE_HR LINE_BLOCKQUOTE LINE_LIST_BULLETED LINE_LIST_ENUMERATED LINE_TABLE LINE_DEF_CITATION LINE_DEF_FOOTNOTE LINE_DEF_LINK LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START LINE_EMPTY LINE_META
+   28: para: LINE_PLAIN
+   29: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE
+   30: empty: LINE_EMPTY
+   31: list_bulleted: LINE_LIST_BULLETED
+   32: list_enumerated: LINE_LIST_ENUMERATED
+   33: blockquote: LINE_BLOCKQUOTE
+   34: table: LINE_TABLE
+   35: def_citation: LINE_DEF_CITATION
+   36: def_footnote: LINE_DEF_FOOTNOTE
+   37: def_link: LINE_DEF_LINK
+   38: html_block: LINE_HTML
+   39: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START
+   40: meta_block: LINE_META
+   41: para_lines: LINE_CONTINUATION
+   42: para_line: LINE_CONTINUATION
+   43: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY
+   44: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE
+   45: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE
+   46: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE
+   47: item_bulleted: LINE_LIST_BULLETED
+   48: cont_blocks: LINE_EMPTY
+   49: item_enumerated: LINE_LIST_ENUMERATED
+   50: cont_block: LINE_EMPTY
+   51: html_block_lines: LINE_CONTINUATION LINE_HTML
+   52: html_block_line: LINE_CONTINUATION LINE_HTML
+   53: fenced_lines: LINE_CONTINUATION LINE_EMPTY
+   54: fenced_line: LINE_CONTINUATION LINE_EMPTY
+   55: meta_lines: LINE_CONTINUATION LINE_META
+   56: meta_line: LINE_CONTINUATION LINE_META
index ce001bbf09f0c949ec0c95bc32d8feaca76fffbf..3793d6f34022afca96e2fa45a53caf6b25e23abe 100644 (file)
@@ -107,7 +107,7 @@ block(A)                    ::= def_footnote(B).                                            { A = token_new_parent(B, BLOCK_DEF_FOOTNOT
 block(A)                       ::= def_link(B).                                                        { A = token_new_parent(B, BLOCK_DEF_LINK); stack_push(engine->definition_stack, A); }
 block(A)                       ::= html_block(B).                                                      { A = token_new_parent(B, BLOCK_HTML); }
 block(A)                       ::= fenced_block(B).                                            { A = token_new_parent(B, BLOCK_CODE_FENCED); B->child->type = CODE_FENCE; }
-
+block(A)                       ::= meta_block(B).                                                      { A = token_new_parent(B, BLOCK_META); }
 
 para(A)                                ::= LINE_PLAIN(B) para_lines(C).                        { A = B; token_chain_append(B, C); }
 para                           ::= LINE_PLAIN.
@@ -200,6 +200,18 @@ fenced_lines               ::= fenced_line.
 fenced_line                    ::= LINE_CONTINUATION.
 fenced_line                    ::= LINE_EMPTY.
 
+
+meta_block(A)          ::= LINE_META(B) meta_lines(C).                         { A = B; token_chain_append(B, C); }
+meta_block                     ::= LINE_META.
+
+meta_lines(A)          ::= meta_lines(B) meta_line(C).                         { A = B; token_chain_append(B, C); }
+meta_lines                     ::= meta_line.
+
+meta_line                      ::= LINE_META.
+meta_line                      ::= LINE_CONTINUATION.
+
+
+
 //
 // Additional Configuration
 //
index 3caba93894e0a174704e91ccc12363a74a70f291..565362c857ec63e27bca45c44ef4aa84445f1ea2 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.14.3 on Wed Jan 18 22:23:16 2017 */
+/* Generated by re2c 0.14.3 on Tue Jan 24 17:14:02 2017 */
 /**
 
        MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more.
@@ -8492,6 +8492,301 @@ yy617:
 }
 
 
+size_t scan_meta_line(const char * c) {
+       const char * marker = NULL;
+       const char * start = c;
+
+
+{
+       char yych;
+       yych = *c;
+       switch (yych) {
+       case '\n':      goto yy620;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy621;
+       default:        goto yy622;
+       }
+yy620:
+       { return 0; }
+yy621:
+       yych = *(marker = ++c);
+       switch (yych) {
+       case '\t':      goto yy626;
+       case ' ':
+       case '!':
+       case '"':
+       case '#':
+       case '$':
+       case '%':
+       case '&':
+       case '\'':
+       case '(':
+       case ')':
+       case '*':
+       case '+':
+       case ',':
+       case '-':
+       case '.':
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy623;
+       case ':':       goto yy628;
+       default:        goto yy620;
+       }
+yy622:
+       yych = *++c;
+       goto yy620;
+yy623:
+       ++c;
+       yych = *c;
+       switch (yych) {
+       case '\t':      goto yy626;
+       case ' ':
+       case '!':
+       case '"':
+       case '#':
+       case '$':
+       case '%':
+       case '&':
+       case '\'':
+       case '(':
+       case ')':
+       case '*':
+       case '+':
+       case ',':
+       case '-':
+       case '.':
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '_':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy623;
+       case ':':       goto yy628;
+       default:        goto yy625;
+       }
+yy625:
+       c = marker;
+       goto yy620;
+yy626:
+       ++c;
+       yych = *c;
+       switch (yych) {
+       case '\t':
+       case ' ':       goto yy626;
+       case ':':       goto yy628;
+       default:        goto yy625;
+       }
+yy628:
+       yych = *++c;
+       switch (yych) {
+       case '\n':
+       case '\r':      goto yy625;
+       default:        goto yy630;
+       }
+yy629:
+       ++c;
+       yych = *c;
+yy630:
+       switch (yych) {
+       case 0x00:      goto yy625;
+       case '\n':      goto yy631;
+       case '\r':      goto yy633;
+       default:        goto yy629;
+       }
+yy631:
+       ++c;
+yy632:
+       { return (size_t)( c - start ); }
+yy633:
+       ++c;
+       switch ((yych = *c)) {
+       case '\n':      goto yy631;
+       default:        goto yy632;
+       }
+}
+       
+}
+
+
+
 #ifdef TEST
 void Test_scan_url(CuTest* tc) {
        int url_len;
index 3be8a58047b891dcdadbbaa3ef3604504b503e52..67df9d93a5795e45624a16c64f2dfca7f7bc943a 100644 (file)
@@ -70,6 +70,7 @@ size_t scan_html(const char * c);
 size_t scan_html_block(const char * c);
 size_t scan_html_line(const char * c);
 size_t scan_key(const char * c);
+size_t scan_meta_line(const char * c);
 size_t scan_ref_citation(const char * c);
 size_t scan_ref_foot(const char * c);
 size_t scan_ref_link(const char * c);
index b0e7b2333da1ed0277bf05ce810894361d9e78c6..d22bd5cf9c478dc1cdbf5983986a346ad3929d12 100644 (file)
        fence_start     = non_indent [`~]{3,} [^`'\n\r\x00] nl;
 
        fence_end       = non_indent [`~]{3,} sp nl;
+
+       meta_key        = [A-Za-z0-9] [A-Za-z0-9_ -\.]*;
+
+       meta_value      = [^\n\r\x00]+;
+
+       meta_line       = meta_key sp ':' meta_value nl;        // meta_line can't match url above
 */
 
 
@@ -307,6 +313,18 @@ size_t scan_fence_end(const char * c) {
 }
 
 
+size_t scan_meta_line(const char * c) {
+       const char * marker = NULL;
+       const char * start = c;
+
+/*!re2c
+       meta_line       { return (size_t)( c - start ); }
+       .?                      { return 0; }
+*/     
+}
+
+
+
 #ifdef TEST
 void Test_scan_url(CuTest* tc) {
        int url_len;