From: Fletcher T. Penney Date: Sun, 5 Feb 2017 01:38:10 +0000 (-0500) Subject: ADDED: Add basic table support X-Git-Tag: 0.1.2a^2~14 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=41b8f111631633bd878e1a71202c751dee0b1e92;p=multimarkdown ADDED: Add basic table support --- diff --git a/src/html.c b/src/html.c index e7ccbfb..932fe88 100644 --- a/src/html.c +++ b/src/html.c @@ -476,6 +476,58 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t print("

"); scratch->padded = 0; break; + case BLOCK_TABLE: + pad(out, 2, scratch); + print("\n"); + scratch->padded = 2; + read_table_column_alignments(source, t, scratch); + + print("\n"); + for (int i = 0; i < scratch->table_column_count; ++i) + { + switch (scratch->table_alignment[i]) { + case 'l': + case 'L': + print("\n"); + break; + case 'r': + case 'R': + print("\n"); + break; + case 'c': + case 'C': + print("\n"); + break; + default: + print("\n"); + break; + } + } + print("\n"); + scratch->padded = 1; + + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + pad(out, 1, scratch); + print("
"); + scratch->padded = 0; + break; + case BLOCK_TABLE_HEADER: + pad(out, 2, scratch); + print("\n"); + scratch->in_table_header = 1; + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + scratch->in_table_header = 0; + print("\n"); + scratch->padded = 1; + break; + case BLOCK_TABLE_SECTION: + pad(out, 2, scratch); + print("\n"); + scratch->padded = 2; + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + print(""); + scratch->padded = 0; + break; case BLOCK_TERM: pad(out, 2, scratch); print("
"); @@ -1023,6 +1075,45 @@ void mmd_export_token_html(DString * out, const char * source, token * t, size_t print("^"); } break; + case TABLE_CELL: + if (scratch->in_table_header) { + print("\ttable_alignment[scratch->table_cell_count]) { + case 'l': + print(" style=\"text-align:left;\""); + break; + case 'r': + print(" style=\"text-align:right;\""); + break; + case 'c': + print(" style=\"text-align:center;\""); + break; + } + if (t->next->type == TABLE_DIVIDER) { + if (t->next->len > 1) { + printf(" colspan=\"%d\"", t->next->len); + } + } + print(">"); + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + if (scratch->in_table_header) { + print("\n"); + } else { + print("\n"); + } + scratch->table_cell_count += t->next->len; + break; + case TABLE_DIVIDER: + break; + case TABLE_ROW: + print("\n"); + scratch->table_cell_count = 0; + mmd_export_token_tree_html(out, source, t->child, offset, scratch); + print("\n"); + break; case TEXT_LINEBREAK: if (t->next) { print("
\n"); diff --git a/src/lexer.c b/src/lexer.c index f67cd24..c34dd71 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 on Sat Jan 28 22:49:30 2017 */ +/* Generated by re2c 0.14.3 on Sat Feb 4 13:15:42 2017 */ /** MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more. @@ -130,12 +130,12 @@ yy2: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '+': goto yy248; - case '-': goto yy247; - case '=': goto yy244; - case '>': goto yy246; - case '{': goto yy242; - case '~': goto yy245; + case '+': goto yy251; + case '-': goto yy250; + case '=': goto yy247; + case '>': goto yy249; + case '{': goto yy245; + case '~': goto yy248; default: goto yy3; } yy3: @@ -144,7 +144,7 @@ yy4: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '+': goto yy239; + case '+': goto yy242; default: goto yy5; } yy5: @@ -152,7 +152,7 @@ yy5: yy6: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '-': goto yy233; + case '-': goto yy236; default: goto yy7; } yy7: @@ -161,7 +161,7 @@ yy8: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '<': goto yy230; + case '<': goto yy233; default: goto yy9; } yy9: @@ -170,8 +170,8 @@ yy10: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '>': goto yy226; - case '~': goto yy225; + case '>': goto yy229; + case '~': goto yy228; default: goto yy11; } yy11: @@ -180,15 +180,15 @@ yy12: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '=': goto yy222; + case '=': goto yy225; default: goto yy3; } yy13: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '#': goto yy218; - case '%': goto yy216; - case '^': goto yy220; + case '#': goto yy221; + case '%': goto yy219; + case '^': goto yy223; default: goto yy14; } yy14: @@ -199,7 +199,7 @@ yy15: yy17: yych = *++YYCURSOR; switch (yych) { - case '[': goto yy214; + case '[': goto yy217; default: goto yy3; } yy18: @@ -214,7 +214,7 @@ yy22: yy24: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy212; + case '}': goto yy215; default: goto yy3; } yy25: @@ -223,7 +223,7 @@ yy25: yy27: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '\'': goto yy210; + case '\'': goto yy213; default: goto yy28; } yy28: @@ -233,11 +233,11 @@ yy29: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '\t': goto yy200; - case '\n': goto yy197; - case '\r': goto yy199; - case ' ': goto yy202; - case '.': goto yy203; + case '\t': goto yy203; + case '\n': goto yy200; + case '\r': goto yy202; + case ' ': goto yy205; + case '.': goto yy206; default: goto yy3; } yy30: @@ -248,7 +248,7 @@ yy32: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case 'A': - case 'a': goto yy192; + case 'a': goto yy195; default: goto yy33; } yy33: @@ -256,44 +256,44 @@ yy33: yy34: yych = *++YYCURSOR; switch (yych) { - case '!': goto yy180; - case '"': goto yy170; - case '#': goto yy150; - case '$': goto yy148; - case '%': goto yy146; - case '&': goto yy134; - case '\'': goto yy168; - case '(': goto yy162; - case ')': goto yy160; - case '*': goto yy126; - case '+': goto yy144; - case ',': goto yy176; - case '-': goto yy142; - case '.': goto yy182; - case '/': goto yy130; - case ':': goto yy172; - case ';': goto yy174; - case '<': goto yy138; - case '=': goto yy140; - case '>': goto yy136; - case '?': goto yy178; - case '@': goto yy132; - case '[': goto yy154; - case '\\': goto yy120; - case ']': goto yy152; - case '^': goto yy128; - case '_': goto yy124; - case '`': goto yy166; - case '{': goto yy158; - case '|': goto yy122; - case '}': goto yy156; - case '~': goto yy164; + case '!': goto yy183; + case '"': goto yy173; + case '#': goto yy153; + case '$': goto yy151; + case '%': goto yy149; + case '&': goto yy137; + case '\'': goto yy171; + case '(': goto yy165; + case ')': goto yy163; + case '*': goto yy129; + case '+': goto yy147; + case ',': goto yy179; + case '-': goto yy145; + case '.': goto yy185; + case '/': goto yy133; + case ':': goto yy175; + case ';': goto yy177; + case '<': goto yy141; + case '=': goto yy143; + case '>': goto yy139; + case '?': goto yy181; + case '@': goto yy135; + case '[': goto yy157; + case '\\': goto yy123; + case ']': goto yy155; + case '^': goto yy131; + case '_': goto yy127; + case '`': goto yy169; + case '{': goto yy161; + case '|': goto yy125; + case '}': goto yy159; + case '~': goto yy167; default: goto yy3; } yy35: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '$': goto yy118; + case '$': goto yy121; default: goto yy36; } yy36: @@ -307,6 +307,8 @@ yy39: yy41: yych = *++YYCURSOR; switch (yych) { + case '\n': goto yy44; + case '\r': goto yy112; case ' ': goto yy110; default: goto yy3; } @@ -404,8 +406,9 @@ yy61: case 2: goto yy9; case 3: goto yy11; case 4: goto yy33; - case 5: goto yy198; - default: goto yy243; + case 5: goto yy118; + case 6: goto yy201; + default: goto yy246; } yy62: YYCTXMARKER = YYCURSOR + 1; @@ -645,9 +648,9 @@ yy109: yy110: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '\n': goto yy113; - case '\r': goto yy115; - case ' ': goto yy112; + case '\n': goto yy114; + case '\r': goto yy116; + case ' ': goto yy113; default: goto yy111; } yy111: @@ -655,366 +658,391 @@ yy111: yy112: yych = *++YYCURSOR; switch (yych) { - case ' ': goto yy116; - default: goto yy111; + case '\n': goto yy44; + default: goto yy45; } yy113: - ++YYCURSOR; + yych = *++YYCURSOR; + switch (yych) { + case '\n': goto yy114; + case '\r': goto yy116; + case ' ': goto yy117; + default: goto yy111; + } yy114: - { return TEXT_LINEBREAK; } + ++YYCURSOR; yy115: + { return TEXT_LINEBREAK; } +yy116: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy113; - default: goto yy114; + case '\n': goto yy114; + default: goto yy115; + } +yy117: + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case '\n': goto yy114; + case '\r': goto yy116; + case ' ': goto yy119; + default: goto yy118; } -yy116: - ++YYCURSOR; - { return INDENT_SPACE; } yy118: + { return INDENT_SPACE; } +yy119: + ++YYCURSOR; + yych = *YYCURSOR; + switch (yych) { + case '\n': goto yy114; + case '\r': goto yy116; + case ' ': goto yy119; + default: goto yy61; + } +yy121: ++YYCURSOR; { return MATH_DOLLAR_DOUBLE; } -yy120: +yy123: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '(': goto yy184; - case ')': goto yy186; - case '[': goto yy188; - case ']': goto yy190; - default: goto yy121; + case '(': goto yy187; + case ')': goto yy189; + case '[': goto yy191; + case ']': goto yy193; + default: goto yy124; } -yy121: +yy124: { return ESCAPED_CHARACTER; } -yy122: +yy125: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy124: +yy127: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy126: +yy129: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy128: +yy131: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy130: +yy133: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy132: +yy135: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy134: +yy137: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy136: +yy139: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy138: +yy141: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy140: +yy143: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy142: +yy145: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy144: +yy147: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy146: +yy149: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy148: +yy151: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy150: +yy153: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy152: +yy155: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy154: +yy157: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy156: +yy159: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy158: +yy161: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy160: +yy163: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy162: +yy165: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy164: +yy167: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy166: +yy169: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy168: +yy171: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy170: +yy173: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy172: +yy175: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy174: +yy177: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy176: +yy179: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy178: +yy181: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy180: +yy183: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy182: +yy185: ++YYCURSOR; { return ESCAPED_CHARACTER; } -yy184: +yy187: ++YYCURSOR; { return MATH_PAREN_OPEN; } -yy186: +yy189: ++YYCURSOR; { return MATH_PAREN_CLOSE; } -yy188: +yy191: ++YYCURSOR; { return MATH_BRACKET_OPEN; } -yy190: +yy193: ++YYCURSOR; { return MATH_BRACKET_CLOSE; } -yy192: +yy195: yych = *++YYCURSOR; switch (yych) { case 'M': - case 'm': goto yy193; + case 'm': goto yy196; default: goto yy61; } -yy193: +yy196: yych = *++YYCURSOR; switch (yych) { case 'P': - case 'p': goto yy194; + case 'p': goto yy197; default: goto yy61; } -yy194: +yy197: yych = *++YYCURSOR; switch (yych) { - case ';': goto yy195; + case ';': goto yy198; default: goto yy61; } -yy195: +yy198: ++YYCURSOR; { return AMPERSAND_LONG; } -yy197: +yy200: ++YYCURSOR; -yy198: +yy201: YYCURSOR = YYCTXMARKER; { return TEXT_PERIOD; } -yy199: +yy202: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy197; - default: goto yy198; + case '\n': goto yy200; + default: goto yy201; } -yy200: +yy203: ++YYCURSOR; yych = *YYCURSOR; -yy201: +yy204: switch (yych) { case '\t': - case ' ': goto yy200; - default: goto yy198; + case ' ': goto yy203; + default: goto yy201; } -yy202: - yyaccept = 5; +yy205: + yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy206; - default: goto yy201; + case '.': goto yy209; + default: goto yy204; } -yy203: +yy206: yych = *++YYCURSOR; switch (yych) { - case '.': goto yy204; + case '.': goto yy207; default: goto yy61; } -yy204: +yy207: ++YYCURSOR; { return ELLIPSIS; } -yy206: +yy209: yych = *++YYCURSOR; switch (yych) { - case ' ': goto yy207; + case ' ': goto yy210; default: goto yy61; } -yy207: +yy210: yych = *++YYCURSOR; switch (yych) { - case '.': goto yy208; + case '.': goto yy211; default: goto yy61; } -yy208: +yy211: ++YYCURSOR; { return ELLIPSIS; } -yy210: +yy213: ++YYCURSOR; { return QUOTE_RIGHT_ALT; } -yy212: +yy215: ++YYCURSOR; { return BRACE_DOUBLE_RIGHT; } -yy214: +yy217: ++YYCURSOR; { return BRACKET_IMAGE_LEFT; } -yy216: +yy219: ++YYCURSOR; { return BRACKET_VARIABLE_LEFT; } -yy218: +yy221: ++YYCURSOR; { return BRACKET_CITATION_LEFT; } -yy220: +yy223: ++YYCURSOR; { return BRACKET_FOOTNOTE_LEFT; } -yy222: +yy225: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy223; + case '}': goto yy226; default: goto yy61; } -yy223: +yy226: ++YYCURSOR; { return CRITIC_HI_CLOSE; } -yy225: +yy228: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy228; + case '}': goto yy231; default: goto yy61; } -yy226: +yy229: ++YYCURSOR; { return CRITIC_SUB_DIV; } -yy228: +yy231: ++YYCURSOR; { return CRITIC_SUB_CLOSE; } -yy230: +yy233: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy231; + case '}': goto yy234; default: goto yy61; } -yy231: +yy234: ++YYCURSOR; { return CRITIC_COM_CLOSE; } -yy233: +yy236: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '-': goto yy237; - case '}': goto yy235; - default: goto yy234; + case '-': goto yy240; + case '}': goto yy238; + default: goto yy237; } -yy234: +yy237: { return DASH_N; } -yy235: +yy238: ++YYCURSOR; { return CRITIC_DEL_CLOSE; } -yy237: +yy240: ++YYCURSOR; { return DASH_M; } -yy239: +yy242: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy240; + case '}': goto yy243; default: goto yy61; } -yy240: +yy243: ++YYCURSOR; { return CRITIC_ADD_CLOSE; } -yy242: - yyaccept = 6; +yy245: + yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'T': goto yy259; - default: goto yy243; + case 'T': goto yy262; + default: goto yy246; } -yy243: +yy246: { return BRACE_DOUBLE_LEFT; } -yy244: +yy247: yych = *++YYCURSOR; switch (yych) { - case '=': goto yy257; + case '=': goto yy260; default: goto yy61; } -yy245: +yy248: yych = *++YYCURSOR; switch (yych) { - case '~': goto yy255; + case '~': goto yy258; default: goto yy61; } -yy246: +yy249: yych = *++YYCURSOR; switch (yych) { - case '>': goto yy253; + case '>': goto yy256; default: goto yy61; } -yy247: +yy250: yych = *++YYCURSOR; switch (yych) { - case '-': goto yy251; + case '-': goto yy254; default: goto yy61; } -yy248: +yy251: yych = *++YYCURSOR; switch (yych) { - case '+': goto yy249; + case '+': goto yy252; default: goto yy61; } -yy249: +yy252: ++YYCURSOR; { return CRITIC_ADD_OPEN; } -yy251: +yy254: ++YYCURSOR; { return CRITIC_DEL_OPEN; } -yy253: +yy256: ++YYCURSOR; { return CRITIC_COM_OPEN; } -yy255: +yy258: ++YYCURSOR; { return CRITIC_SUB_OPEN; } -yy257: +yy260: ++YYCURSOR; { return CRITIC_HI_OPEN; } -yy259: +yy262: yych = *++YYCURSOR; switch (yych) { - case 'O': goto yy260; + case 'O': goto yy263; default: goto yy61; } -yy260: +yy263: yych = *++YYCURSOR; switch (yych) { - case 'C': goto yy261; + case 'C': goto yy264; default: goto yy61; } -yy261: +yy264: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy262; + case '}': goto yy265; default: goto yy61; } -yy262: +yy265: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy263; + case '}': goto yy266; default: goto yy61; } -yy263: +yy266: ++YYCURSOR; { return TOC; } } diff --git a/src/lexer.re b/src/lexer.re index 16da856..6f41c5e 100644 --- a/src/lexer.re +++ b/src/lexer.re @@ -88,7 +88,7 @@ int scan(Scanner * s, const char * stop) { INDENT_SPACE = ' '{4}; NON_INDENT_SPACE = ' '{2,3}; - TEXT_LINEBREAK = " " NL; + TEXT_LINEBREAK = ' '{2,} NL; // The order of these seems to matter @@ -211,7 +211,7 @@ int scan(Scanner * s, const char * stop) { '.' / (SP|NL) { return TEXT_PERIOD; } TEXT_LINEBREAK { return TEXT_LINEBREAK; } - NL { return TEXT_NL; } + ' '? NL { return TEXT_NL; } NON_INDENT_SPACE { return NON_INDENT_SPACE; } diff --git a/src/libMultiMarkdown.h b/src/libMultiMarkdown.h index 571f76c..43f2c2a 100644 --- a/src/libMultiMarkdown.h +++ b/src/libMultiMarkdown.h @@ -137,9 +137,10 @@ enum token_types { BLOCK_META, BLOCK_PARA, BLOCK_TABLE, + BLOCK_TABLE_HEADER, + BLOCK_TABLE_SECTION, BLOCK_TERM, BLOCK_TOC, - ROW_TABLE, CRITIC_ADD_OPEN, CRITIC_ADD_CLOSE, @@ -255,6 +256,10 @@ enum token_types { MARKER_LIST_BULLET, MARKER_LIST_ENUMERATOR, + TABLE_ROW, + TABLE_CELL, + TABLE_DIVIDER, + TOC, TEXT_EMPTY, diff --git a/src/mmd.c b/src/mmd.c index 5d0b628..b499db2 100644 --- a/src/mmd.c +++ b/src/mmd.c @@ -544,6 +544,14 @@ void mmd_assign_line_type(mmd_engine * e, token * line) { line->type = LINE_PLAIN; } break; + case PIPE: + // If PIPE is first, save checking later and assign LINE_TABLE now + if (!(e->extensions & EXT_COMPATIBILITY)) { + scan_len = scan_table_separator(&source[line->start]); + line->type = (scan_len) ? LINE_TABLE_SEPARATOR : LINE_TABLE; + + break; + } case TEXT_PLAIN: if (e->allow_meta && !(e->extensions & EXT_COMPATIBILITY)) { scan_len = scan_url(&source[line->start]); @@ -558,12 +566,15 @@ void mmd_assign_line_type(mmd_engine * e, token * line) { break; } - if (line->type == LINE_PLAIN) { + if ((line->type == LINE_PLAIN) && + !(e->extensions & EXT_COMPATIBILITY)) { + // Check if this is a potential table line token * walker = line->child; while (walker != NULL) { if (walker->type == PIPE) { - line->type = LINE_TABLE; + scan_len = scan_table_separator(&source[line->start]); + line->type = (scan_len) ? LINE_TABLE_SEPARATOR : LINE_TABLE; return; } @@ -769,7 +780,9 @@ void mmd_parse_token_chain(mmd_engine * e, token * chain) { token * walker = chain->child; // Walk the existing tree token * remainder; // Hold unparsed tail of chain -// ParseTrace(stderr, "parser >>"); +#ifndef NDEBUG + ParseTrace(stderr, "parser >>"); +#endif // Remove existing token tree e->root = NULL; @@ -784,7 +797,9 @@ void mmd_parse_token_chain(mmd_engine * e, token * chain) { if (remainder) remainder->prev = NULL; -// fprintf(stderr, "\nNew line\n"); +#ifndef NDEBUG + fprintf(stderr, "\nNew line\n"); +#endif Parse(pParser, walker->type, walker, e); @@ -792,6 +807,9 @@ void mmd_parse_token_chain(mmd_engine * e, token * chain) { } // Signal finish to parser +#ifndef NDEBUG + fprintf(stderr, "\nFinish parse\n"); +#endif Parse(pParser, 0, NULL, e); // Disconnect of (now empty) root @@ -1307,7 +1325,9 @@ void is_list_loose(token * list) { /// Is this actually an HTML block? void is_para_html(mmd_engine * e, token * block) { - if (block->child->type != LINE_PLAIN) + if ((block == NULL) || + (block->child == NULL) || + (block->child->type != LINE_PLAIN)) return; token * t = block->child->child; @@ -1431,6 +1451,78 @@ void strip_line_tokens_from_deflist(mmd_engine * e, token * deflist) { } +void strip_line_tokens_from_table(mmd_engine * e, token * table) { + token * walker = table->child; + + while (walker) { + switch (walker->type) { + case BLOCK_TABLE_SECTION: + strip_line_tokens_from_block(e, walker); + break; + case BLOCK_TABLE_HEADER: + strip_line_tokens_from_block(e, walker); + break; + case LINE_EMPTY: + walker->type = TEXT_EMPTY; + break; + } + + walker = walker->next; + } +} + + +void parse_table_row_into_cells(token * row) { + token * first = NULL; + token * last = NULL; + + token * walker = row->child; + + if (walker->type == PIPE) { + walker->type = TABLE_DIVIDER; + first = walker->next; + } else { + first = walker; + last = first; + } + + + walker = walker->next; + + while (walker) { + switch (walker->type) { + case PIPE: + if (row->child == first) { + row->child = token_prune_graft(first, last, TABLE_CELL); + } else { + token_prune_graft(first, last, TABLE_CELL); + } + first = NULL; + last = NULL; + walker->type = TABLE_DIVIDER; + break; + case TEXT_NL: + case TEXT_LINEBREAK: + break; + default: + if (!first) + first = walker; + last = walker; + } + + walker = walker->next; + } + + if (first) { + if (row->child == first) { + row->child = token_prune_graft(first, last, TABLE_CELL); + } else { + token_prune_graft(first, last, TABLE_CELL); + } + } +} + + void strip_line_tokens_from_block(mmd_engine * e, token * block) { if ((block == NULL) || (block->child == NULL)) return; @@ -1455,6 +1547,9 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { case BLOCK_DEFLIST: // Handle definition lists return strip_line_tokens_from_deflist(e, block); + case BLOCK_TABLE: + // Handle tables + return strip_line_tokens_from_table(e, block); } token * children = NULL; @@ -1486,6 +1581,7 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { case LINE_LIST_ENUMERATED: case LINE_META: case LINE_PLAIN: + handle_line: // Remove leading non-indent space from line if (l->child && l->child->type == NON_INDENT_SPACE) token_remove_first_child(l); @@ -1515,10 +1611,17 @@ void strip_line_tokens_from_block(mmd_engine * e, token * block) { // Advance to next line l = l->next; break; + case LINE_TABLE_SEPARATOR: case LINE_TABLE: - l->type = ROW_TABLE; - break; + if ((block->type == BLOCK_TABLE_SECTION) || + (block->type == BLOCK_TABLE_HEADER)) { + l->type = (l->type == LINE_TABLE) ? TABLE_ROW : LINE_TABLE_SEPARATOR; + parse_table_row_into_cells(l); + } else { + goto handle_line; + } default: + handle_block: //fprintf(stderr, "Unspecified line type %d inside block type %d\n", l->type, block->type); // This is a block, need to remove it from chain and // Add to parent diff --git a/src/parser.c b/src/parser.c index da0aaae..9f0bfa1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -92,7 +92,7 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 65 +#define YYNOCODE 69 #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 47 -#define YYNRULE 103 -#define YY_MAX_SHIFT 46 -#define YY_MIN_SHIFTREDUCE 107 -#define YY_MAX_SHIFTREDUCE 209 -#define YY_MIN_REDUCE 210 -#define YY_MAX_REDUCE 312 -#define YY_ERROR_ACTION 313 -#define YY_ACCEPT_ACTION 314 -#define YY_NO_ACTION 315 +#define YYNSTATE 54 +#define YYNRULE 111 +#define YY_MAX_SHIFT 53 +#define YY_MIN_SHIFTREDUCE 117 +#define YY_MAX_SHIFTREDUCE 227 +#define YY_MIN_REDUCE 228 +#define YY_MAX_REDUCE 338 +#define YY_ERROR_ACTION 339 +#define YY_ACCEPT_ACTION 340 +#define YY_NO_ACTION 341 /************* End control #defines *******************************************/ /* Define the yytestcase() macro to be a no-op if is not already defined @@ -188,79 +188,85 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (191) +#define YY_ACTTAB_COUNT (211) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 210, 183, 23, 181, 182, 14, 112, 113, 114, 115, - /* 10 */ 116, 117, 123, 15, 5, 4, 192, 3, 2, 17, - /* 20 */ 13, 12, 130, 183, 11, 23, 181, 182, 14, 112, - /* 30 */ 113, 114, 115, 116, 117, 123, 15, 5, 4, 192, - /* 40 */ 3, 2, 17, 13, 12, 130, 183, 11, 314, 1, - /* 50 */ 109, 29, 10, 45, 41, 39, 121, 44, 124, 125, - /* 60 */ 126, 127, 128, 129, 38, 134, 134, 177, 10, 33, - /* 70 */ 33, 41, 42, 39, 30, 30, 31, 31, 34, 34, - /* 80 */ 28, 38, 108, 29, 10, 45, 41, 39, 121, 44, - /* 90 */ 124, 125, 126, 127, 128, 129, 38, 32, 177, 165, - /* 100 */ 10, 181, 182, 41, 198, 39, 160, 187, 199, 6, - /* 110 */ 6, 23, 201, 38, 32, 167, 18, 32, 18, 186, - /* 120 */ 183, 180, 201, 137, 32, 133, 7, 7, 32, 8, - /* 130 */ 8, 163, 135, 20, 202, 20, 24, 133, 24, 206, - /* 140 */ 9, 9, 32, 19, 202, 19, 32, 26, 22, 26, - /* 150 */ 4, 32, 143, 181, 182, 133, 16, 201, 5, 133, - /* 160 */ 32, 21, 205, 21, 133, 25, 138, 25, 35, 35, - /* 170 */ 27, 209, 27, 135, 36, 36, 161, 171, 168, 202, - /* 180 */ 46, 148, 151, 43, 43, 37, 37, 40, 40, 174, - /* 190 */ 135, + /* 0 */ 228, 26, 41, 41, 199, 200, 17, 122, 123, 124, + /* 10 */ 125, 126, 127, 133, 18, 5, 4, 210, 3, 2, + /* 20 */ 19, 16, 15, 140, 201, 14, 26, 144, 144, 199, + /* 30 */ 200, 17, 122, 123, 124, 125, 126, 127, 133, 18, + /* 40 */ 5, 4, 210, 3, 2, 19, 16, 15, 140, 201, + /* 50 */ 14, 340, 1, 119, 32, 13, 52, 46, 44, 131, + /* 60 */ 132, 134, 135, 136, 137, 138, 139, 43, 36, 36, + /* 70 */ 195, 13, 33, 33, 46, 201, 44, 25, 24, 210, + /* 80 */ 11, 34, 34, 47, 37, 37, 31, 43, 118, 32, + /* 90 */ 13, 52, 46, 44, 131, 132, 134, 135, 136, 137, + /* 100 */ 138, 139, 43, 12, 216, 35, 13, 217, 35, 46, + /* 110 */ 183, 44, 35, 24, 26, 11, 180, 6, 6, 182, + /* 120 */ 7, 7, 43, 35, 20, 143, 20, 22, 35, 22, + /* 130 */ 210, 21, 35, 21, 147, 8, 8, 145, 143, 35, + /* 140 */ 9, 9, 27, 35, 27, 143, 175, 29, 224, 29, + /* 150 */ 50, 23, 143, 23, 163, 195, 143, 195, 28, 219, + /* 160 */ 28, 219, 30, 195, 30, 199, 200, 199, 200, 166, + /* 170 */ 223, 166, 219, 38, 38, 205, 190, 178, 190, 176, + /* 180 */ 220, 35, 220, 10, 201, 198, 204, 145, 39, 39, + /* 190 */ 51, 49, 4, 220, 48, 48, 5, 153, 42, 42, + /* 200 */ 45, 45, 158, 227, 53, 186, 166, 40, 148, 145, + /* 210 */ 189, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 0, 23, 2, 3, 4, 5, 6, 7, 8, 9, + /* 0 */ 0, 1, 45, 46, 4, 5, 6, 7, 8, 9, /* 10 */ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - /* 20 */ 20, 21, 22, 23, 24, 2, 3, 4, 5, 6, - /* 30 */ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - /* 40 */ 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, - /* 50 */ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - /* 60 */ 39, 40, 41, 42, 43, 46, 47, 1, 47, 58, - /* 70 */ 59, 50, 25, 52, 56, 57, 56, 57, 54, 55, - /* 80 */ 47, 60, 29, 30, 31, 32, 33, 34, 35, 36, - /* 90 */ 37, 38, 39, 40, 41, 42, 43, 32, 1, 57, - /* 100 */ 47, 3, 4, 50, 1, 52, 55, 1, 5, 44, - /* 110 */ 45, 2, 1, 60, 32, 59, 51, 32, 53, 13, - /* 120 */ 23, 23, 1, 49, 32, 45, 44, 45, 32, 44, - /* 130 */ 45, 20, 23, 51, 23, 53, 51, 45, 53, 1, - /* 140 */ 44, 45, 32, 51, 23, 53, 32, 51, 30, 53, - /* 150 */ 15, 32, 52, 3, 4, 45, 32, 1, 14, 45, - /* 160 */ 32, 51, 24, 53, 45, 51, 50, 53, 48, 49, - /* 170 */ 51, 1, 53, 23, 44, 45, 20, 62, 60, 23, - /* 180 */ 63, 53, 16, 61, 62, 44, 45, 44, 45, 1, - /* 190 */ 23, + /* 20 */ 20, 21, 22, 23, 24, 25, 1, 47, 48, 4, + /* 30 */ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + /* 40 */ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + /* 50 */ 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, + /* 60 */ 37, 38, 39, 40, 41, 42, 43, 44, 62, 63, + /* 70 */ 3, 48, 60, 61, 51, 24, 53, 31, 55, 17, + /* 80 */ 57, 60, 61, 26, 58, 59, 48, 64, 30, 31, + /* 90 */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + /* 100 */ 42, 43, 44, 57, 3, 33, 48, 6, 33, 51, + /* 110 */ 64, 53, 33, 55, 1, 57, 61, 45, 46, 63, + /* 120 */ 45, 46, 64, 33, 52, 46, 54, 52, 33, 54, + /* 130 */ 17, 52, 33, 54, 50, 45, 46, 24, 46, 33, + /* 140 */ 45, 46, 52, 33, 54, 46, 59, 52, 3, 54, + /* 150 */ 57, 52, 46, 54, 2, 3, 46, 3, 52, 3, + /* 160 */ 54, 3, 52, 3, 54, 4, 5, 4, 5, 17, + /* 170 */ 25, 17, 3, 49, 50, 3, 24, 21, 24, 21, + /* 180 */ 24, 33, 24, 33, 24, 24, 14, 24, 45, 46, + /* 190 */ 56, 57, 16, 24, 65, 66, 15, 53, 45, 46, + /* 200 */ 45, 46, 54, 3, 67, 66, 17, 24, 51, 24, + /* 210 */ 3, }; -#define YY_SHIFT_USE_DFLT (191) -#define YY_SHIFT_COUNT (46) -#define YY_SHIFT_MIN (-22) -#define YY_SHIFT_MAX (188) -static const short yy_shift_ofst[] = { - /* 0 */ 23, 0, 97, 97, 97, 97, 97, 97, 97, 97, - /* 10 */ 98, 138, 121, 121, 103, 106, 109, 66, -22, -22, - /* 20 */ -22, -22, 47, 66, -22, -22, -22, -22, 66, 47, - /* 30 */ 111, 156, 150, 138, 103, 106, 66, 66, -22, 135, - /* 40 */ 66, 144, 170, 47, 166, 167, 188, +#define YY_SHIFT_USE_DFLT (211) +#define YY_SHIFT_COUNT (53) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (207) +static const unsigned char yy_shift_ofst[] = { + /* 0 */ 25, 0, 160, 160, 160, 160, 160, 160, 160, 160, + /* 10 */ 113, 152, 154, 161, 145, 169, 169, 101, 172, 67, + /* 20 */ 51, 51, 51, 51, 62, 57, 67, 51, 51, 51, + /* 30 */ 51, 67, 57, 156, 158, 163, 145, 101, 172, 67, + /* 40 */ 62, 67, 67, 51, 176, 67, 181, 200, 57, 189, + /* 50 */ 189, 183, 185, 207, }; -#define YY_REDUCE_USE_DFLT (-1) -#define YY_REDUCE_COUNT (43) -#define YY_REDUCE_MIN (0) -#define YY_REDUCE_MAX (143) +#define YY_REDUCE_USE_DFLT (-44) +#define YY_REDUCE_COUNT (48) +#define YY_REDUCE_MIN (-43) +#define YY_REDUCE_MAX (157) static const short yy_reduce_ofst[] = { - /* 0 */ 21, 53, 65, 82, 85, 96, 92, 110, 114, 119, - /* 10 */ 19, 11, 18, 20, 24, 120, 118, 130, 128, 128, - /* 20 */ 128, 128, 122, 141, 128, 128, 128, 128, 143, 122, - /* 30 */ 42, 42, 33, 56, 51, 74, 80, 80, 124, 100, - /* 40 */ 80, 116, 117, 115, + /* 0 */ 23, 58, 72, 75, 90, 95, 79, 99, 106, 110, + /* 10 */ 46, -43, -43, -20, 6, 12, 21, 26, 124, 143, + /* 20 */ 148, 148, 148, 148, 134, 129, 153, 148, 148, 148, + /* 30 */ 148, 155, 129, 55, 55, 38, 56, 87, 84, 92, + /* 40 */ 93, 92, 92, 150, 144, 92, 157, 137, 139, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 313, 313, 297, 296, 250, 245, 259, 256, 248, 243, - /* 10 */ 214, 306, 313, 313, 299, 287, 272, 298, 260, 258, - /* 20 */ 257, 255, 313, 278, 249, 247, 244, 242, 253, 213, - /* 30 */ 267, 265, 294, 269, 262, 239, 261, 235, 234, 223, - /* 40 */ 252, 222, 276, 273, 225, 221, 275, + /* 0 */ 339, 339, 323, 322, 268, 263, 282, 279, 266, 261, + /* 10 */ 295, 303, 303, 232, 332, 339, 339, 325, 313, 324, + /* 20 */ 283, 281, 280, 278, 339, 339, 304, 267, 265, 262, + /* 30 */ 260, 271, 231, 290, 288, 320, 292, 285, 257, 284, + /* 40 */ 272, 302, 253, 252, 241, 270, 240, 299, 296, 276, + /* 50 */ 275, 273, 239, 298, }; /********** End of lemon-generated parsing tables *****************************/ @@ -281,27 +287,28 @@ static const YYACTIONTYPE yy_default[] = { #ifdef YYFALLBACK static const YYCODETYPE yyFallback[] = { 0, /* $ => nothing */ + 3, /* LINE_PLAIN => LINE_CONTINUATION */ + 1, /* LINE_TABLE_SEPARATOR => LINE_PLAIN */ 0, /* LINE_CONTINUATION => nothing */ - 1, /* LINE_PLAIN => LINE_CONTINUATION */ - 1, /* LINE_INDENTED_TAB => LINE_CONTINUATION */ - 1, /* LINE_INDENTED_SPACE => LINE_CONTINUATION */ + 3, /* LINE_INDENTED_TAB => LINE_CONTINUATION */ + 3, /* LINE_INDENTED_SPACE => LINE_CONTINUATION */ 0, /* LINE_HTML => nothing */ - 5, /* LINE_ATX_1 => LINE_HTML */ - 5, /* LINE_ATX_2 => LINE_HTML */ - 5, /* LINE_ATX_3 => LINE_HTML */ - 5, /* LINE_ATX_4 => LINE_HTML */ - 5, /* LINE_ATX_5 => LINE_HTML */ - 5, /* LINE_ATX_6 => LINE_HTML */ - 5, /* LINE_HR => LINE_HTML */ - 5, /* LINE_BLOCKQUOTE => LINE_HTML */ - 5, /* LINE_LIST_BULLETED => LINE_HTML */ - 5, /* LINE_LIST_ENUMERATED => LINE_HTML */ - 5, /* LINE_TABLE => LINE_HTML */ - 5, /* LINE_DEF_CITATION => LINE_HTML */ - 5, /* LINE_DEF_FOOTNOTE => LINE_HTML */ - 5, /* LINE_DEF_LINK => LINE_HTML */ - 5, /* LINE_FENCE_BACKTICK => LINE_HTML */ - 5, /* LINE_FENCE_BACKTICK_START => LINE_HTML */ + 6, /* LINE_ATX_1 => LINE_HTML */ + 6, /* LINE_ATX_2 => LINE_HTML */ + 6, /* LINE_ATX_3 => LINE_HTML */ + 6, /* LINE_ATX_4 => LINE_HTML */ + 6, /* LINE_ATX_5 => LINE_HTML */ + 6, /* LINE_ATX_6 => LINE_HTML */ + 6, /* LINE_HR => LINE_HTML */ + 6, /* LINE_BLOCKQUOTE => LINE_HTML */ + 6, /* LINE_LIST_BULLETED => LINE_HTML */ + 6, /* LINE_LIST_ENUMERATED => LINE_HTML */ + 6, /* LINE_TABLE => LINE_HTML */ + 6, /* LINE_DEF_CITATION => LINE_HTML */ + 6, /* LINE_DEF_FOOTNOTE => LINE_HTML */ + 6, /* LINE_DEF_LINK => LINE_HTML */ + 6, /* LINE_FENCE_BACKTICK => LINE_HTML */ + 6, /* LINE_FENCE_BACKTICK_START => LINE_HTML */ }; #endif /* YYFALLBACK */ @@ -387,20 +394,21 @@ void ParseTrace(FILE *TraceFILE, char *zTracePrompt){ /* For tracing shifts, the names of all terminals and nonterminals ** are required. The following table supplies these names */ static const char *const yyTokenName[] = { - "$", "LINE_CONTINUATION", "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_TOC", "LINE_EMPTY", - "LINE_META", "LINE_DEFINITION", "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", "definition_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", + "$", "LINE_PLAIN", "LINE_TABLE_SEPARATOR", "LINE_CONTINUATION", + "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_TOC", + "LINE_EMPTY", "LINE_META", "LINE_DEFINITION", "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", + "definition_block", "para_lines", "para_line", "code_line", + "indented_line", "quote_lines", "quote_line", "item_bulleted", + "cont_blocks", "item_enumerated", "cont_block", "table_header", + "table_body", "table_section", "html_block_lines", "html_block_line", "fenced_lines", "fenced_line", "meta_lines", "meta_line", "definition", "defs", "def", "def_lines", }; @@ -454,65 +462,73 @@ static const char *const yyRuleName[] = { /* 41 */ "cont_blocks ::= cont_blocks cont_block", /* 42 */ "cont_block ::= empty indented_line para_lines", /* 43 */ "cont_block ::= empty indented_line", - /* 44 */ "table ::= table LINE_TABLE", - /* 45 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks", - /* 46 */ "def_citation ::= LINE_DEF_CITATION para_lines", - /* 47 */ "def_citation ::= LINE_DEF_CITATION cont_blocks", - /* 48 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks", - /* 49 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines", - /* 50 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks", - /* 51 */ "def_link ::= LINE_DEF_LINK para_lines", - /* 52 */ "html_block ::= LINE_HTML html_block_lines", - /* 53 */ "html_block_lines ::= html_block_lines html_block_line", - /* 54 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK", - /* 55 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines", - /* 56 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK", - /* 57 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines", - /* 58 */ "fenced_lines ::= fenced_lines fenced_line", - /* 59 */ "meta_block ::= LINE_META meta_lines", - /* 60 */ "meta_lines ::= meta_lines meta_line", - /* 61 */ "definition_block ::= definition_block empty definition", - /* 62 */ "definition_block ::= definition_block empty", - /* 63 */ "definition ::= para defs", - /* 64 */ "defs ::= defs def", - /* 65 */ "def ::= LINE_DEFINITION def_lines", - /* 66 */ "def ::= LINE_DEFINITION", - /* 67 */ "def_lines ::= def_lines LINE_CONTINUATION", - /* 68 */ "para ::= LINE_PLAIN", - /* 69 */ "para_lines ::= para_line", - /* 70 */ "para_line ::= LINE_CONTINUATION", - /* 71 */ "indented_code ::= indented_line", - /* 72 */ "code_line ::= indented_line", - /* 73 */ "code_line ::= LINE_EMPTY", - /* 74 */ "indented_line ::= LINE_INDENTED_TAB", - /* 75 */ "indented_line ::= LINE_INDENTED_SPACE", - /* 76 */ "empty ::= LINE_EMPTY", - /* 77 */ "blockquote ::= LINE_BLOCKQUOTE", - /* 78 */ "quote_lines ::= quote_line", - /* 79 */ "quote_line ::= LINE_BLOCKQUOTE", - /* 80 */ "quote_line ::= LINE_CONTINUATION", - /* 81 */ "list_bulleted ::= item_bulleted", - /* 82 */ "list_enumerated ::= item_enumerated", - /* 83 */ "cont_blocks ::= cont_block", - /* 84 */ "cont_block ::= empty", - /* 85 */ "table ::= LINE_TABLE", - /* 86 */ "def_citation ::= LINE_DEF_CITATION", - /* 87 */ "def_footnote ::= LINE_DEF_FOOTNOTE", - /* 88 */ "def_link ::= LINE_DEF_LINK", - /* 89 */ "html_block ::= LINE_HTML", - /* 90 */ "html_block_lines ::= html_block_line", - /* 91 */ "html_block_line ::= LINE_CONTINUATION", - /* 92 */ "html_block_line ::= LINE_HTML", - /* 93 */ "fenced_lines ::= fenced_line", - /* 94 */ "fenced_line ::= LINE_CONTINUATION", - /* 95 */ "fenced_line ::= LINE_EMPTY", - /* 96 */ "meta_block ::= LINE_META", - /* 97 */ "meta_lines ::= meta_line", - /* 98 */ "meta_line ::= LINE_META", - /* 99 */ "meta_line ::= LINE_CONTINUATION", - /* 100 */ "definition_block ::= definition", - /* 101 */ "defs ::= def", - /* 102 */ "def_lines ::= LINE_CONTINUATION", + /* 44 */ "table ::= table_header table_body LINE_EMPTY", + /* 45 */ "table ::= table_header table_body", + /* 46 */ "table_header ::= table_section LINE_TABLE_SEPARATOR", + /* 47 */ "table_body ::= table_body LINE_EMPTY table_section", + /* 48 */ "table_body ::= table_section", + /* 49 */ "table_section ::= table_section LINE_TABLE", + /* 50 */ "def_citation ::= LINE_DEF_CITATION para_lines cont_blocks", + /* 51 */ "def_citation ::= LINE_DEF_CITATION para_lines", + /* 52 */ "def_citation ::= LINE_DEF_CITATION cont_blocks", + /* 53 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks", + /* 54 */ "def_footnote ::= LINE_DEF_FOOTNOTE para_lines", + /* 55 */ "def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks", + /* 56 */ "def_link ::= LINE_DEF_LINK para_lines", + /* 57 */ "html_block ::= LINE_HTML html_block_lines", + /* 58 */ "html_block_lines ::= html_block_lines html_block_line", + /* 59 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK", + /* 60 */ "fenced_block ::= LINE_FENCE_BACKTICK fenced_lines", + /* 61 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK", + /* 62 */ "fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines", + /* 63 */ "fenced_lines ::= fenced_lines fenced_line", + /* 64 */ "meta_block ::= LINE_META meta_lines", + /* 65 */ "meta_lines ::= meta_lines meta_line", + /* 66 */ "definition_block ::= definition_block empty definition", + /* 67 */ "definition_block ::= definition_block empty", + /* 68 */ "definition ::= para defs", + /* 69 */ "defs ::= defs def", + /* 70 */ "def ::= LINE_DEFINITION def_lines", + /* 71 */ "def ::= LINE_DEFINITION", + /* 72 */ "def_lines ::= def_lines LINE_CONTINUATION", + /* 73 */ "para ::= table_section LINE_EMPTY", + /* 74 */ "para ::= table_section para_lines", + /* 75 */ "para ::= table_section", + /* 76 */ "para ::= LINE_PLAIN", + /* 77 */ "para_lines ::= para_line", + /* 78 */ "para_line ::= LINE_CONTINUATION", + /* 79 */ "indented_code ::= indented_line", + /* 80 */ "code_line ::= indented_line", + /* 81 */ "code_line ::= LINE_EMPTY", + /* 82 */ "indented_line ::= LINE_INDENTED_TAB", + /* 83 */ "indented_line ::= LINE_INDENTED_SPACE", + /* 84 */ "empty ::= LINE_EMPTY", + /* 85 */ "blockquote ::= LINE_BLOCKQUOTE", + /* 86 */ "quote_lines ::= quote_line", + /* 87 */ "quote_line ::= LINE_BLOCKQUOTE", + /* 88 */ "quote_line ::= LINE_CONTINUATION", + /* 89 */ "list_bulleted ::= item_bulleted", + /* 90 */ "list_enumerated ::= item_enumerated", + /* 91 */ "cont_blocks ::= cont_block", + /* 92 */ "cont_block ::= empty", + /* 93 */ "table_section ::= LINE_TABLE", + /* 94 */ "def_citation ::= LINE_DEF_CITATION", + /* 95 */ "def_footnote ::= LINE_DEF_FOOTNOTE", + /* 96 */ "def_link ::= LINE_DEF_LINK", + /* 97 */ "html_block ::= LINE_HTML", + /* 98 */ "html_block_lines ::= html_block_line", + /* 99 */ "html_block_line ::= LINE_CONTINUATION", + /* 100 */ "html_block_line ::= LINE_HTML", + /* 101 */ "fenced_lines ::= fenced_line", + /* 102 */ "fenced_line ::= LINE_CONTINUATION", + /* 103 */ "fenced_line ::= LINE_EMPTY", + /* 104 */ "meta_block ::= LINE_META", + /* 105 */ "meta_lines ::= meta_line", + /* 106 */ "meta_line ::= LINE_META", + /* 107 */ "meta_line ::= LINE_CONTINUATION", + /* 108 */ "definition_block ::= definition", + /* 109 */ "defs ::= def", + /* 110 */ "def_lines ::= LINE_CONTINUATION", }; #endif /* NDEBUG */ @@ -861,109 +877,117 @@ 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[] = { - { 27, 1 }, - { 28, 2 }, { 28, 1 }, + { 29, 2 }, { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 29, 1 }, - { 30, 2 }, - { 44, 2 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, + { 30, 1 }, { 31, 2 }, + { 45, 2 }, { 32, 2 }, - { 35, 2 }, - { 48, 2 }, { 33, 2 }, - { 50, 3 }, - { 50, 2 }, - { 50, 2 }, - { 50, 1 }, + { 36, 2 }, + { 49, 2 }, { 34, 2 }, - { 52, 3 }, - { 52, 2 }, - { 52, 2 }, - { 52, 1 }, + { 51, 3 }, { 51, 2 }, + { 51, 2 }, + { 51, 1 }, + { 35, 2 }, { 53, 3 }, { 53, 2 }, - { 36, 2 }, + { 53, 2 }, + { 53, 1 }, + { 52, 2 }, + { 54, 3 }, + { 54, 2 }, { 37, 3 }, { 37, 2 }, - { 37, 2 }, + { 55, 2 }, + { 56, 3 }, + { 56, 1 }, + { 57, 2 }, { 38, 3 }, { 38, 2 }, { 38, 2 }, + { 39, 3 }, + { 39, 2 }, { 39, 2 }, { 40, 2 }, - { 54, 2 }, - { 41, 3 }, - { 41, 2 }, - { 41, 3 }, { 41, 2 }, - { 56, 2 }, - { 42, 2 }, { 58, 2 }, - { 43, 3 }, - { 43, 2 }, + { 42, 3 }, + { 42, 2 }, + { 42, 3 }, + { 42, 2 }, { 60, 2 }, - { 61, 2 }, + { 43, 2 }, { 62, 2 }, - { 62, 1 }, - { 63, 2 }, - { 30, 1 }, - { 44, 1 }, - { 45, 1 }, + { 44, 3 }, + { 44, 2 }, + { 64, 2 }, + { 65, 2 }, + { 66, 2 }, + { 66, 1 }, + { 67, 2 }, + { 31, 2 }, + { 31, 2 }, { 31, 1 }, + { 31, 1 }, + { 45, 1 }, { 46, 1 }, - { 46, 1 }, + { 32, 1 }, { 47, 1 }, { 47, 1 }, - { 32, 1 }, - { 35, 1 }, { 48, 1 }, - { 49, 1 }, - { 49, 1 }, + { 48, 1 }, { 33, 1 }, - { 34, 1 }, - { 51, 1 }, - { 53, 1 }, { 36, 1 }, - { 37, 1 }, + { 49, 1 }, + { 50, 1 }, + { 50, 1 }, + { 34, 1 }, + { 35, 1 }, + { 52, 1 }, + { 54, 1 }, + { 57, 1 }, { 38, 1 }, { 39, 1 }, { 40, 1 }, - { 54, 1 }, - { 55, 1 }, - { 55, 1 }, - { 56, 1 }, - { 57, 1 }, - { 57, 1 }, - { 42, 1 }, + { 41, 1 }, { 58, 1 }, { 59, 1 }, { 59, 1 }, - { 43, 1 }, + { 60, 1 }, + { 61, 1 }, { 61, 1 }, + { 43, 1 }, + { 62, 1 }, { 63, 1 }, + { 63, 1 }, + { 44, 1 }, + { 65, 1 }, + { 67, 1 }, }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -1149,22 +1173,25 @@ static void yy_reduce( case 31: /* list_bulleted ::= list_bulleted item_bulleted */ yytestcase(yyruleno==31); case 36: /* list_enumerated ::= list_enumerated item_enumerated */ yytestcase(yyruleno==36); case 41: /* cont_blocks ::= cont_blocks cont_block */ yytestcase(yyruleno==41); - case 44: /* table ::= table LINE_TABLE */ yytestcase(yyruleno==44); - case 46: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==46); - case 47: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==47); - case 49: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==49); - case 50: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==50); - case 51: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==51); - case 52: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==52); - case 53: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==53); - case 55: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==55); - case 57: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==57); - case 58: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==58); - case 59: /* meta_block ::= LINE_META meta_lines */ yytestcase(yyruleno==59); - case 60: /* meta_lines ::= meta_lines meta_line */ yytestcase(yyruleno==60); - case 62: /* definition_block ::= definition_block empty */ yytestcase(yyruleno==62); - case 64: /* defs ::= defs def */ yytestcase(yyruleno==64); - case 67: /* def_lines ::= def_lines LINE_CONTINUATION */ yytestcase(yyruleno==67); + case 45: /* table ::= table_header table_body */ yytestcase(yyruleno==45); + case 49: /* table_section ::= table_section LINE_TABLE */ yytestcase(yyruleno==49); + case 51: /* def_citation ::= LINE_DEF_CITATION para_lines */ yytestcase(yyruleno==51); + case 52: /* def_citation ::= LINE_DEF_CITATION cont_blocks */ yytestcase(yyruleno==52); + case 54: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines */ yytestcase(yyruleno==54); + case 55: /* def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks */ yytestcase(yyruleno==55); + case 56: /* def_link ::= LINE_DEF_LINK para_lines */ yytestcase(yyruleno==56); + case 57: /* html_block ::= LINE_HTML html_block_lines */ yytestcase(yyruleno==57); + case 58: /* html_block_lines ::= html_block_lines html_block_line */ yytestcase(yyruleno==58); + case 60: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines */ yytestcase(yyruleno==60); + case 62: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines */ yytestcase(yyruleno==62); + case 63: /* fenced_lines ::= fenced_lines fenced_line */ yytestcase(yyruleno==63); + case 64: /* meta_block ::= LINE_META meta_lines */ yytestcase(yyruleno==64); + case 65: /* meta_lines ::= meta_lines meta_line */ yytestcase(yyruleno==65); + case 67: /* definition_block ::= definition_block empty */ yytestcase(yyruleno==67); + case 69: /* defs ::= defs def */ yytestcase(yyruleno==69); + case 72: /* def_lines ::= def_lines LINE_CONTINUATION */ yytestcase(yyruleno==72); + case 73: /* para ::= table_section LINE_EMPTY */ yytestcase(yyruleno==73); + case 74: /* para ::= table_section para_lines */ yytestcase(yyruleno==74); { yylhsminor.yy0 = yymsp[-1].minor.yy0; token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; @@ -1199,65 +1226,82 @@ static void yy_reduce( { 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 45: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */ - case 48: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==48); - case 61: /* definition_block ::= definition_block empty definition */ yytestcase(yyruleno==61); + case 44: /* table ::= table_header table_body LINE_EMPTY */ + case 50: /* def_citation ::= LINE_DEF_CITATION para_lines cont_blocks */ yytestcase(yyruleno==50); + case 53: /* def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks */ yytestcase(yyruleno==53); + case 66: /* definition_block ::= definition_block empty definition */ yytestcase(yyruleno==66); { 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 54: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */ - case 56: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==56); + case 46: /* table_header ::= table_section LINE_TABLE_SEPARATOR */ +{ yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_TABLE_HEADER); token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); } + yymsp[-1].minor.yy0 = yylhsminor.yy0; + break; + case 47: /* table_body ::= table_body LINE_EMPTY table_section */ +{ yylhsminor.yy0 = yymsp[-2].minor.yy0; token_chain_append(yymsp[-2].minor.yy0, yymsp[-1].minor.yy0); token_chain_append(yymsp[-2].minor.yy0, token_new_parent(yymsp[0].minor.yy0, BLOCK_TABLE_SECTION)); } + yymsp[-2].minor.yy0 = yylhsminor.yy0; + break; + case 48: /* table_body ::= table_section */ +{ yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_TABLE_SECTION); } + yymsp[0].minor.yy0 = yylhsminor.yy0; + break; + case 59: /* fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK */ + case 61: /* fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK */ yytestcase(yyruleno==61); { 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; - case 63: /* definition ::= para defs */ + case 68: /* definition ::= para defs */ { yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_DEFINITION_GROUP); token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); yymsp[-1].minor.yy0->type = BLOCK_TERM; } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 65: /* def ::= LINE_DEFINITION def_lines */ + case 70: /* def ::= LINE_DEFINITION def_lines */ { yylhsminor.yy0 = token_new_parent(yymsp[-1].minor.yy0, BLOCK_DEFINITION); token_chain_append(yymsp[-1].minor.yy0, yymsp[0].minor.yy0); } yymsp[-1].minor.yy0 = yylhsminor.yy0; break; - case 66: /* def ::= LINE_DEFINITION */ + case 71: /* def ::= LINE_DEFINITION */ { yylhsminor.yy0 = token_new_parent(yymsp[0].minor.yy0, BLOCK_DEFINITION); } + yymsp[0].minor.yy0 = yylhsminor.yy0; + break; + case 75: /* para ::= table_section */ +{ yylhsminor.yy0 = yymsp[0].minor.yy0; } yymsp[0].minor.yy0 = yylhsminor.yy0; break; default: - /* (68) para ::= LINE_PLAIN */ yytestcase(yyruleno==68); - /* (69) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=69); - /* (70) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==70); - /* (71) indented_code ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=71); - /* (72) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=72); - /* (73) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==73); - /* (74) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==74); - /* (75) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==75); - /* (76) empty ::= LINE_EMPTY */ yytestcase(yyruleno==76); - /* (77) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==77); - /* (78) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=78); - /* (79) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==79); - /* (80) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==80); - /* (81) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=81); - /* (82) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=82); - /* (83) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=83); - /* (84) cont_block ::= empty */ yytestcase(yyruleno==84); - /* (85) table ::= LINE_TABLE */ yytestcase(yyruleno==85); - /* (86) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==86); - /* (87) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==87); - /* (88) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==88); - /* (89) html_block ::= LINE_HTML */ yytestcase(yyruleno==89); - /* (90) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=90); - /* (91) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==91); - /* (92) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==92); - /* (93) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=93); - /* (94) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==94); - /* (95) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==95); - /* (96) meta_block ::= LINE_META */ yytestcase(yyruleno==96); - /* (97) meta_lines ::= meta_line (OPTIMIZED OUT) */ assert(yyruleno!=97); - /* (98) meta_line ::= LINE_META */ yytestcase(yyruleno==98); - /* (99) meta_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==99); - /* (100) definition_block ::= definition (OPTIMIZED OUT) */ assert(yyruleno!=100); - /* (101) defs ::= def (OPTIMIZED OUT) */ assert(yyruleno!=101); - /* (102) def_lines ::= LINE_CONTINUATION */ yytestcase(yyruleno==102); + /* (76) para ::= LINE_PLAIN */ yytestcase(yyruleno==76); + /* (77) para_lines ::= para_line (OPTIMIZED OUT) */ assert(yyruleno!=77); + /* (78) para_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==78); + /* (79) indented_code ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=79); + /* (80) code_line ::= indented_line (OPTIMIZED OUT) */ assert(yyruleno!=80); + /* (81) code_line ::= LINE_EMPTY */ yytestcase(yyruleno==81); + /* (82) indented_line ::= LINE_INDENTED_TAB */ yytestcase(yyruleno==82); + /* (83) indented_line ::= LINE_INDENTED_SPACE */ yytestcase(yyruleno==83); + /* (84) empty ::= LINE_EMPTY */ yytestcase(yyruleno==84); + /* (85) blockquote ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==85); + /* (86) quote_lines ::= quote_line (OPTIMIZED OUT) */ assert(yyruleno!=86); + /* (87) quote_line ::= LINE_BLOCKQUOTE */ yytestcase(yyruleno==87); + /* (88) quote_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==88); + /* (89) list_bulleted ::= item_bulleted (OPTIMIZED OUT) */ assert(yyruleno!=89); + /* (90) list_enumerated ::= item_enumerated (OPTIMIZED OUT) */ assert(yyruleno!=90); + /* (91) cont_blocks ::= cont_block (OPTIMIZED OUT) */ assert(yyruleno!=91); + /* (92) cont_block ::= empty */ yytestcase(yyruleno==92); + /* (93) table_section ::= LINE_TABLE */ yytestcase(yyruleno==93); + /* (94) def_citation ::= LINE_DEF_CITATION */ yytestcase(yyruleno==94); + /* (95) def_footnote ::= LINE_DEF_FOOTNOTE */ yytestcase(yyruleno==95); + /* (96) def_link ::= LINE_DEF_LINK */ yytestcase(yyruleno==96); + /* (97) html_block ::= LINE_HTML */ yytestcase(yyruleno==97); + /* (98) html_block_lines ::= html_block_line (OPTIMIZED OUT) */ assert(yyruleno!=98); + /* (99) html_block_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==99); + /* (100) html_block_line ::= LINE_HTML */ yytestcase(yyruleno==100); + /* (101) fenced_lines ::= fenced_line (OPTIMIZED OUT) */ assert(yyruleno!=101); + /* (102) fenced_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==102); + /* (103) fenced_line ::= LINE_EMPTY */ yytestcase(yyruleno==103); + /* (104) meta_block ::= LINE_META */ yytestcase(yyruleno==104); + /* (105) meta_lines ::= meta_line (OPTIMIZED OUT) */ assert(yyruleno!=105); + /* (106) meta_line ::= LINE_META */ yytestcase(yyruleno==106); + /* (107) meta_line ::= LINE_CONTINUATION */ yytestcase(yyruleno==107); + /* (108) definition_block ::= definition (OPTIMIZED OUT) */ assert(yyruleno!=108); + /* (109) defs ::= def (OPTIMIZED OUT) */ assert(yyruleno!=109); + /* (110) def_lines ::= LINE_CONTINUATION */ yytestcase(yyruleno==110); break; /********** End reduce actions ************************************************/ }; diff --git a/src/parser.h b/src/parser.h index 8fbed60..02c261a 100644 --- a/src/parser.h +++ b/src/parser.h @@ -1,25 +1,26 @@ -#define LINE_CONTINUATION 1 -#define LINE_PLAIN 2 -#define LINE_INDENTED_TAB 3 -#define LINE_INDENTED_SPACE 4 -#define LINE_HTML 5 -#define LINE_ATX_1 6 -#define LINE_ATX_2 7 -#define LINE_ATX_3 8 -#define LINE_ATX_4 9 -#define LINE_ATX_5 10 -#define LINE_ATX_6 11 -#define LINE_HR 12 -#define LINE_BLOCKQUOTE 13 -#define LINE_LIST_BULLETED 14 -#define LINE_LIST_ENUMERATED 15 -#define LINE_TABLE 16 -#define LINE_DEF_CITATION 17 -#define LINE_DEF_FOOTNOTE 18 -#define LINE_DEF_LINK 19 -#define LINE_FENCE_BACKTICK 20 -#define LINE_FENCE_BACKTICK_START 21 -#define LINE_TOC 22 -#define LINE_EMPTY 23 -#define LINE_META 24 -#define LINE_DEFINITION 25 +#define LINE_PLAIN 1 +#define LINE_TABLE_SEPARATOR 2 +#define LINE_CONTINUATION 3 +#define LINE_INDENTED_TAB 4 +#define LINE_INDENTED_SPACE 5 +#define LINE_HTML 6 +#define LINE_ATX_1 7 +#define LINE_ATX_2 8 +#define LINE_ATX_3 9 +#define LINE_ATX_4 10 +#define LINE_ATX_5 11 +#define LINE_ATX_6 12 +#define LINE_HR 13 +#define LINE_BLOCKQUOTE 14 +#define LINE_LIST_BULLETED 15 +#define LINE_LIST_ENUMERATED 16 +#define LINE_TABLE 17 +#define LINE_DEF_CITATION 18 +#define LINE_DEF_FOOTNOTE 19 +#define LINE_DEF_LINK 20 +#define LINE_FENCE_BACKTICK 21 +#define LINE_FENCE_BACKTICK_START 22 +#define LINE_TOC 23 +#define LINE_EMPTY 24 +#define LINE_META 25 +#define LINE_DEFINITION 26 diff --git a/src/parser.out b/src/parser.out index 5fcdbc3..748d517 100644 --- a/src/parser.out +++ b/src/parser.out @@ -46,8 +46,11 @@ State 0: item_enumerated ::= * LINE_LIST_ENUMERATED para_lines item_enumerated ::= * LINE_LIST_ENUMERATED cont_blocks item_enumerated ::= * LINE_LIST_ENUMERATED - table ::= * table LINE_TABLE - table ::= * LINE_TABLE + table ::= * table_header table_body LINE_EMPTY + table ::= * table_header table_body + table_header ::= * table_section LINE_TABLE_SEPARATOR + table_section ::= * table_section LINE_TABLE + table_section ::= * LINE_TABLE def_citation ::= * LINE_DEF_CITATION para_lines cont_blocks def_citation ::= * LINE_DEF_CITATION para_lines def_citation ::= * LINE_DEF_CITATION cont_blocks @@ -70,11 +73,14 @@ State 0: definition_block ::= * definition_block empty definition_block ::= * definition definition ::= * para defs - - LINE_PLAIN shift 23 - LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB - LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE - LINE_HTML shift 14 + para ::= * table_section LINE_EMPTY + para ::= * table_section para_lines + para ::= * table_section + + LINE_PLAIN shift 26 + LINE_INDENTED_TAB shift-reduce 82 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_SPACE shift-reduce 83 indented_line ::= LINE_INDENTED_SPACE + LINE_HTML shift 17 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 @@ -82,39 +88,41 @@ 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 15 + LINE_BLOCKQUOTE shift 18 LINE_LIST_BULLETED shift 5 LINE_LIST_ENUMERATED shift 4 - LINE_TABLE shift-reduce 85 table ::= LINE_TABLE + LINE_TABLE shift-reduce 93 table_section ::= LINE_TABLE LINE_DEF_CITATION shift 3 LINE_DEF_FOOTNOTE shift 2 - LINE_DEF_LINK shift 17 - LINE_FENCE_BACKTICK shift 13 - LINE_FENCE_BACKTICK_START shift 12 + LINE_DEF_LINK shift 19 + LINE_FENCE_BACKTICK shift 16 + LINE_FENCE_BACKTICK_START shift 15 LINE_TOC shift-reduce 23 block ::= LINE_TOC - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_META shift 11 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_META shift 14 doc accept blocks shift 1 block shift-reduce 2 blocks ::= block - para shift 29 - indented_code shift 10 - empty shift 45 - list_bulleted shift 41 - list_enumerated shift 39 + para shift 32 + indented_code shift 13 + empty shift 52 + list_bulleted shift 46 + list_enumerated shift 44 blockquote shift-reduce 14 block ::= blockquote - table shift 44 + table shift-reduce 15 block ::= table 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 meta_block shift-reduce 22 block ::= meta_block - definition_block shift 38 - indented_line shift 10 /* because indented_line==indented_code */ - item_bulleted shift 41 /* because item_bulleted==list_bulleted */ - item_enumerated shift 39 /* because item_enumerated==list_enumerated */ - definition shift 38 /* because definition==definition_block */ + definition_block shift 43 + indented_line shift 13 /* because indented_line==indented_code */ + item_bulleted shift 46 /* because item_bulleted==list_bulleted */ + item_enumerated shift 44 /* because item_enumerated==list_enumerated */ + table_header shift 24 + table_section shift 11 + definition shift 43 /* because definition==definition_block */ State 1: (0) doc ::= blocks * @@ -163,8 +171,11 @@ State 1: item_enumerated ::= * LINE_LIST_ENUMERATED para_lines item_enumerated ::= * LINE_LIST_ENUMERATED cont_blocks item_enumerated ::= * LINE_LIST_ENUMERATED - table ::= * table LINE_TABLE - table ::= * LINE_TABLE + table ::= * table_header table_body LINE_EMPTY + table ::= * table_header table_body + table_header ::= * table_section LINE_TABLE_SEPARATOR + table_section ::= * table_section LINE_TABLE + table_section ::= * LINE_TABLE def_citation ::= * LINE_DEF_CITATION para_lines cont_blocks def_citation ::= * LINE_DEF_CITATION para_lines def_citation ::= * LINE_DEF_CITATION cont_blocks @@ -187,12 +198,15 @@ State 1: definition_block ::= * definition_block empty definition_block ::= * definition definition ::= * para defs + para ::= * table_section LINE_EMPTY + para ::= * table_section para_lines + para ::= * table_section $ reduce 0 doc ::= blocks - LINE_PLAIN shift 23 - LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB - LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE - LINE_HTML shift 14 + LINE_PLAIN shift 26 + LINE_INDENTED_TAB shift-reduce 82 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_SPACE shift-reduce 83 indented_line ::= LINE_INDENTED_SPACE + LINE_HTML shift 17 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 @@ -200,37 +214,39 @@ 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 15 + LINE_BLOCKQUOTE shift 18 LINE_LIST_BULLETED shift 5 LINE_LIST_ENUMERATED shift 4 - LINE_TABLE shift-reduce 85 table ::= LINE_TABLE + LINE_TABLE shift-reduce 93 table_section ::= LINE_TABLE LINE_DEF_CITATION shift 3 LINE_DEF_FOOTNOTE shift 2 - LINE_DEF_LINK shift 17 - LINE_FENCE_BACKTICK shift 13 - LINE_FENCE_BACKTICK_START shift 12 + LINE_DEF_LINK shift 19 + LINE_FENCE_BACKTICK shift 16 + LINE_FENCE_BACKTICK_START shift 15 LINE_TOC shift-reduce 23 block ::= LINE_TOC - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_META shift 11 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_META shift 14 block shift-reduce 1 blocks ::= blocks block - para shift 29 - indented_code shift 10 - empty shift 45 - list_bulleted shift 41 - list_enumerated shift 39 + para shift 32 + indented_code shift 13 + empty shift 52 + list_bulleted shift 46 + list_enumerated shift 44 blockquote shift-reduce 14 block ::= blockquote - table shift 44 + table shift-reduce 15 block ::= table 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 meta_block shift-reduce 22 block ::= meta_block - definition_block shift 38 - indented_line shift 10 /* because indented_line==indented_code */ - item_bulleted shift 41 /* because item_bulleted==list_bulleted */ - item_enumerated shift 39 /* because item_enumerated==list_enumerated */ - definition shift 38 /* because definition==definition_block */ + definition_block shift 43 + indented_line shift 13 /* because indented_line==indented_code */ + item_bulleted shift 46 /* because item_bulleted==list_bulleted */ + item_enumerated shift 44 /* because item_enumerated==list_enumerated */ + table_header shift 24 + table_section shift 11 + definition shift 43 /* because definition==definition_block */ State 2: para_lines ::= * para_lines para_line @@ -246,17 +262,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 - (87) def_footnote ::= LINE_DEF_FOOTNOTE * + (95) def_footnote ::= LINE_DEF_FOOTNOTE * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 87 ** Parsing conflict ** - empty shift 32 + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 95 ** Parsing conflict ** + empty shift 35 para_lines shift 6 para_line shift 6 /* because para_line==para_lines */ - cont_blocks shift 18 - cont_block shift 18 /* because cont_block==cont_blocks */ - {default} reduce 87 def_footnote ::= LINE_DEF_FOOTNOTE + cont_blocks shift 20 + cont_block shift 20 /* because cont_block==cont_blocks */ + {default} reduce 95 def_footnote ::= LINE_DEF_FOOTNOTE State 3: para_lines ::= * para_lines para_line @@ -272,17 +288,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 - (86) def_citation ::= LINE_DEF_CITATION * + (94) def_citation ::= LINE_DEF_CITATION * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 86 ** Parsing conflict ** - empty shift 32 + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 94 ** Parsing conflict ** + empty shift 35 para_lines shift 7 para_line shift 7 /* because para_line==para_lines */ - cont_blocks shift 20 - cont_block shift 20 /* because cont_block==cont_blocks */ - {default} reduce 86 def_citation ::= LINE_DEF_CITATION + cont_blocks shift 22 + cont_block shift 22 /* because cont_block==cont_blocks */ + {default} reduce 94 def_citation ::= LINE_DEF_CITATION State 4: para_lines ::= * para_lines para_line @@ -300,14 +316,14 @@ State 4: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 40 ** Parsing conflict ** - empty shift 32 + empty shift 35 para_lines shift 8 para_line shift 8 /* because para_line==para_lines */ - cont_blocks shift 24 - cont_block shift 24 /* because cont_block==cont_blocks */ + cont_blocks shift 27 + cont_block shift 27 /* because cont_block==cont_blocks */ {default} reduce 40 item_enumerated ::= LINE_LIST_ENUMERATED State 5: @@ -326,14 +342,14 @@ State 5: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 35 ** Parsing conflict ** - empty shift 32 + empty shift 35 para_lines shift 9 para_line shift 9 /* because para_line==para_lines */ - cont_blocks shift 26 - cont_block shift 26 /* because cont_block==cont_blocks */ + cont_blocks shift 29 + cont_block shift 29 /* because cont_block==cont_blocks */ {default} reduce 35 item_bulleted ::= LINE_LIST_BULLETED State 6: @@ -347,16 +363,16 @@ State 6: cont_block ::= * empty indented_line cont_block ::= * empty def_footnote ::= LINE_DEF_FOOTNOTE para_lines * cont_blocks - (49) def_footnote ::= LINE_DEF_FOOTNOTE para_lines * + (54) def_footnote ::= LINE_DEF_FOOTNOTE para_lines * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 49 ** Parsing conflict ** - empty shift 32 + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 54 ** Parsing conflict ** + empty shift 35 para_line shift-reduce 26 para_lines ::= para_lines para_line - cont_blocks shift 19 - cont_block shift 19 /* because cont_block==cont_blocks */ - {default} reduce 49 def_footnote ::= LINE_DEF_FOOTNOTE para_lines + cont_blocks shift 21 + cont_block shift 21 /* because cont_block==cont_blocks */ + {default} reduce 54 def_footnote ::= LINE_DEF_FOOTNOTE para_lines State 7: para_lines ::= para_lines * para_line @@ -369,16 +385,16 @@ State 7: cont_block ::= * empty indented_line cont_block ::= * empty def_citation ::= LINE_DEF_CITATION para_lines * cont_blocks - (46) def_citation ::= LINE_DEF_CITATION para_lines * + (51) def_citation ::= LINE_DEF_CITATION para_lines * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 46 ** Parsing conflict ** - empty shift 32 + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 51 ** Parsing conflict ** + empty shift 35 para_line shift-reduce 26 para_lines ::= para_lines para_line - cont_blocks shift 21 - cont_block shift 21 /* because cont_block==cont_blocks */ - {default} reduce 46 def_citation ::= LINE_DEF_CITATION para_lines + cont_blocks shift 23 + cont_block shift 23 /* because cont_block==cont_blocks */ + {default} reduce 51 def_citation ::= LINE_DEF_CITATION para_lines State 8: para_lines ::= para_lines * para_line @@ -393,13 +409,13 @@ State 8: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 38 ** Parsing conflict ** - empty shift 32 + empty shift 35 para_line shift-reduce 26 para_lines ::= para_lines para_line - cont_blocks shift 25 - cont_block shift 25 /* because cont_block==cont_blocks */ + cont_blocks shift 28 + cont_block shift 28 /* because cont_block==cont_blocks */ {default} reduce 38 item_enumerated ::= LINE_LIST_ENUMERATED para_lines State 9: @@ -415,16 +431,76 @@ State 9: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 33 ** Parsing conflict ** - empty shift 32 + empty shift 35 para_line shift-reduce 26 para_lines ::= para_lines para_line - cont_blocks shift 27 - cont_block shift 27 /* because cont_block==cont_blocks */ + cont_blocks shift 30 + cont_block shift 30 /* because cont_block==cont_blocks */ {default} reduce 33 item_bulleted ::= LINE_LIST_BULLETED para_lines State 10: + para ::= * LINE_PLAIN para_lines + para ::= * LINE_PLAIN + empty ::= empty * LINE_EMPTY + table_section ::= * table_section LINE_TABLE + table_section ::= * LINE_TABLE + definition_block ::= definition_block empty * definition + (67) definition_block ::= definition_block empty * + definition ::= * para defs + para ::= * table_section LINE_EMPTY + para ::= * table_section para_lines + para ::= * table_section + + LINE_PLAIN shift 26 + LINE_PLAIN reduce 67 ** Parsing conflict ** + LINE_TABLE shift-reduce 93 table_section ::= LINE_TABLE + LINE_TABLE reduce 67 ** Parsing conflict ** + LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY + LINE_EMPTY reduce 67 ** Parsing conflict ** + para shift 25 + table_section shift 12 + definition shift-reduce 66 definition_block ::= definition_block empty definition + {default} reduce 67 definition_block ::= definition_block empty + +State 11: + para_lines ::= * para_lines para_line + para_lines ::= * para_line + para_line ::= * LINE_CONTINUATION + table_header ::= table_section * LINE_TABLE_SEPARATOR + table_section ::= table_section * LINE_TABLE + para ::= table_section * LINE_EMPTY + para ::= table_section * para_lines + (75) para ::= table_section * + + LINE_TABLE_SEPARATOR shift-reduce 46 table_header ::= table_section LINE_TABLE_SEPARATOR + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_TABLE shift-reduce 49 table_section ::= table_section LINE_TABLE + LINE_TABLE reduce 75 ** Parsing conflict ** + LINE_EMPTY shift-reduce 73 para ::= table_section LINE_EMPTY + LINE_EMPTY reduce 75 ** Parsing conflict ** + para_lines shift 41 + para_line shift 41 /* because para_line==para_lines */ + {default} reduce 75 para ::= table_section + +State 12: + para_lines ::= * para_lines para_line + para_lines ::= * para_line + para_line ::= * LINE_CONTINUATION + table_section ::= table_section * LINE_TABLE + para ::= table_section * LINE_EMPTY + para ::= table_section * para_lines + (75) para ::= table_section * + + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + LINE_TABLE shift-reduce 49 table_section ::= table_section LINE_TABLE + LINE_EMPTY shift-reduce 73 para ::= table_section LINE_EMPTY + para_lines shift 41 + para_line shift 41 /* because para_line==para_lines */ + {default} reduce 75 para ::= table_section + +State 13: (4) block ::= indented_code * indented_code ::= indented_code * code_line code_line ::= * indented_line @@ -432,32 +508,32 @@ State 10: indented_line ::= * LINE_INDENTED_TAB indented_line ::= * LINE_INDENTED_SPACE - LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_TAB shift-reduce 82 indented_line ::= LINE_INDENTED_TAB LINE_INDENTED_TAB reduce 4 ** Parsing conflict ** - LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE + LINE_INDENTED_SPACE shift-reduce 83 indented_line ::= LINE_INDENTED_SPACE LINE_INDENTED_SPACE reduce 4 ** Parsing conflict ** - LINE_EMPTY shift-reduce 73 code_line ::= LINE_EMPTY + LINE_EMPTY shift-reduce 81 code_line ::= LINE_EMPTY LINE_EMPTY reduce 4 ** Parsing conflict ** code_line shift-reduce 27 indented_code ::= indented_code code_line indented_line shift-reduce 27 indented_code ::= indented_code code_line /* because indented_line==code_line */ {default} reduce 4 block ::= indented_code -State 11: +State 14: meta_block ::= LINE_META * meta_lines - (96) meta_block ::= LINE_META * + (104) 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 99 meta_line ::= LINE_CONTINUATION - LINE_META shift-reduce 98 meta_line ::= LINE_META - LINE_META reduce 96 ** Parsing conflict ** - meta_lines shift 33 - meta_line shift 33 /* because meta_line==meta_lines */ - {default} reduce 96 meta_block ::= LINE_META + LINE_CONTINUATION shift-reduce 107 meta_line ::= LINE_CONTINUATION + LINE_META shift-reduce 106 meta_line ::= LINE_META + LINE_META reduce 104 ** Parsing conflict ** + meta_lines shift 36 + meta_line shift 36 /* because meta_line==meta_lines */ + {default} reduce 104 meta_block ::= LINE_META -State 12: +State 15: 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 @@ -465,12 +541,12 @@ State 12: fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY - fenced_lines shift 30 - fenced_line shift 30 /* because fenced_line==fenced_lines */ + LINE_CONTINUATION shift-reduce 102 fenced_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 103 fenced_line ::= LINE_EMPTY + fenced_lines shift 33 + fenced_line shift 33 /* because fenced_line==fenced_lines */ -State 13: +State 16: fenced_block ::= LINE_FENCE_BACKTICK * fenced_lines LINE_FENCE_BACKTICK fenced_block ::= LINE_FENCE_BACKTICK * fenced_lines fenced_lines ::= * fenced_lines fenced_line @@ -478,153 +554,149 @@ State 13: fenced_line ::= * LINE_CONTINUATION fenced_line ::= * LINE_EMPTY - LINE_CONTINUATION shift-reduce 94 fenced_line ::= LINE_CONTINUATION - LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY - fenced_lines shift 31 - fenced_line shift 31 /* because fenced_line==fenced_lines */ + LINE_CONTINUATION shift-reduce 102 fenced_line ::= LINE_CONTINUATION + LINE_EMPTY shift-reduce 103 fenced_line ::= LINE_EMPTY + fenced_lines shift 34 + fenced_line shift 34 /* because fenced_line==fenced_lines */ -State 14: +State 17: html_block ::= LINE_HTML * html_block_lines - (89) html_block ::= LINE_HTML * + (97) 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 91 html_block_line ::= LINE_CONTINUATION - LINE_HTML shift-reduce 92 html_block_line ::= LINE_HTML - LINE_HTML reduce 89 ** Parsing conflict ** - html_block_lines shift 34 - html_block_line shift 34 /* because html_block_line==html_block_lines */ - {default} reduce 89 html_block ::= LINE_HTML + LINE_CONTINUATION shift-reduce 99 html_block_line ::= LINE_CONTINUATION + LINE_HTML shift-reduce 100 html_block_line ::= LINE_HTML + LINE_HTML reduce 97 ** Parsing conflict ** + html_block_lines shift 37 + html_block_line shift 37 /* because html_block_line==html_block_lines */ + {default} reduce 97 html_block ::= LINE_HTML -State 15: +State 18: blockquote ::= LINE_BLOCKQUOTE * quote_lines - (77) blockquote ::= LINE_BLOCKQUOTE * + (85) 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 80 quote_line ::= LINE_CONTINUATION - LINE_BLOCKQUOTE shift-reduce 79 quote_line ::= LINE_BLOCKQUOTE - LINE_BLOCKQUOTE reduce 77 ** Parsing conflict ** - quote_lines shift 35 - quote_line shift 35 /* because quote_line==quote_lines */ - {default} reduce 77 blockquote ::= LINE_BLOCKQUOTE - -State 16: - para ::= * LINE_PLAIN para_lines - para ::= * LINE_PLAIN - empty ::= empty * LINE_EMPTY - definition_block ::= definition_block empty * definition - (62) definition_block ::= definition_block empty * - definition ::= * para defs - - LINE_PLAIN shift 23 - LINE_PLAIN reduce 62 ** Parsing conflict ** - LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY - LINE_EMPTY reduce 62 ** Parsing conflict ** - para shift 22 - definition shift-reduce 61 definition_block ::= definition_block empty definition - {default} reduce 62 definition_block ::= definition_block empty + LINE_CONTINUATION shift-reduce 88 quote_line ::= LINE_CONTINUATION + LINE_BLOCKQUOTE shift-reduce 87 quote_line ::= LINE_BLOCKQUOTE + LINE_BLOCKQUOTE reduce 85 ** Parsing conflict ** + quote_lines shift 38 + quote_line shift 38 /* because quote_line==quote_lines */ + {default} reduce 85 blockquote ::= LINE_BLOCKQUOTE -State 17: +State 19: para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION def_link ::= LINE_DEF_LINK * para_lines - (88) def_link ::= LINE_DEF_LINK * + (96) def_link ::= LINE_DEF_LINK * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - para_lines shift 36 - para_line shift 36 /* because para_line==para_lines */ - {default} reduce 88 def_link ::= LINE_DEF_LINK + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + para_lines shift 39 + para_line shift 39 /* because para_line==para_lines */ + {default} reduce 96 def_link ::= LINE_DEF_LINK -State 18: +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 - (50) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks * + (55) def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks * - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 50 ** Parsing conflict ** - empty shift 32 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 55 ** Parsing conflict ** + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block - {default} reduce 50 def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks + {default} reduce 55 def_footnote ::= LINE_DEF_FOOTNOTE cont_blocks -State 19: +State 21: 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 - (48) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks * + (53) def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks * - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 48 ** Parsing conflict ** - empty shift 32 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 53 ** Parsing conflict ** + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block - {default} reduce 48 def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks + {default} reduce 53 def_footnote ::= LINE_DEF_FOOTNOTE para_lines cont_blocks -State 20: +State 22: 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_citation ::= LINE_DEF_CITATION cont_blocks * + (52) def_citation ::= LINE_DEF_CITATION cont_blocks * - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 47 ** Parsing conflict ** - empty shift 32 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 52 ** Parsing conflict ** + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block - {default} reduce 47 def_citation ::= LINE_DEF_CITATION cont_blocks + {default} reduce 52 def_citation ::= LINE_DEF_CITATION cont_blocks -State 21: +State 23: 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_citation ::= LINE_DEF_CITATION para_lines cont_blocks * + (50) def_citation ::= LINE_DEF_CITATION para_lines cont_blocks * - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY - LINE_EMPTY reduce 45 ** Parsing conflict ** - empty shift 32 + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY + LINE_EMPTY reduce 50 ** Parsing conflict ** + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block - {default} reduce 45 def_citation ::= LINE_DEF_CITATION para_lines cont_blocks + {default} reduce 50 def_citation ::= LINE_DEF_CITATION para_lines cont_blocks -State 22: +State 24: + table ::= table_header * table_body LINE_EMPTY + table ::= table_header * table_body + table_body ::= * table_body LINE_EMPTY table_section + table_body ::= * table_section + table_section ::= * table_section LINE_TABLE + table_section ::= * LINE_TABLE + + LINE_TABLE shift-reduce 93 table_section ::= LINE_TABLE + table_body shift 51 + table_section shift 49 + +State 25: definition ::= para * defs defs ::= * defs def defs ::= * def def ::= * LINE_DEFINITION def_lines def ::= * LINE_DEFINITION - LINE_DEFINITION shift 42 - defs shift 43 - def shift 43 /* because def==defs */ + LINE_DEFINITION shift 47 + defs shift 48 + def shift 48 /* because def==defs */ -State 23: +State 26: para ::= LINE_PLAIN * para_lines - (68) para ::= LINE_PLAIN * + (76) para ::= LINE_PLAIN * para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - para_lines shift 37 - para_line shift 37 /* because para_line==para_lines */ - {default} reduce 68 para ::= LINE_PLAIN + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + para_lines shift 42 + para_line shift 42 /* because para_line==para_lines */ + {default} reduce 76 para ::= LINE_PLAIN -State 24: +State 27: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY (39) item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks * @@ -633,13 +705,13 @@ State 24: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 39 ** Parsing conflict ** - empty shift 32 + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block {default} reduce 39 item_enumerated ::= LINE_LIST_ENUMERATED cont_blocks -State 25: +State 28: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY (37) item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks * @@ -648,13 +720,13 @@ State 25: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 37 ** Parsing conflict ** - empty shift 32 + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block {default} reduce 37 item_enumerated ::= LINE_LIST_ENUMERATED para_lines cont_blocks -State 26: +State 29: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY (34) item_bulleted ::= LINE_LIST_BULLETED cont_blocks * @@ -663,13 +735,13 @@ State 26: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 34 ** Parsing conflict ** - empty shift 32 + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block {default} reduce 34 item_bulleted ::= LINE_LIST_BULLETED cont_blocks -State 27: +State 30: empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY (32) item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks * @@ -678,25 +750,25 @@ State 27: cont_block ::= * empty indented_line cont_block ::= * empty - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 32 ** Parsing conflict ** - empty shift 32 + empty shift 35 cont_block shift-reduce 41 cont_blocks ::= cont_blocks cont_block {default} reduce 32 item_bulleted ::= LINE_LIST_BULLETED para_lines cont_blocks -State 28: +State 31: para_lines ::= * para_lines para_line para_lines ::= * para_line para_line ::= * LINE_CONTINUATION cont_block ::= empty indented_line * para_lines (43) cont_block ::= empty indented_line * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION - para_lines shift 40 - para_line shift 40 /* because para_line==para_lines */ + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + para_lines shift 45 + para_line shift 45 /* because para_line==para_lines */ {default} reduce 43 cont_block ::= empty indented_line -State 29: +State 32: (3) block ::= para * definition ::= para * defs defs ::= * defs def @@ -704,125 +776,145 @@ State 29: def ::= * LINE_DEFINITION def_lines def ::= * LINE_DEFINITION - LINE_DEFINITION shift 42 - defs shift 43 - def shift 43 /* because def==defs */ + LINE_DEFINITION shift 47 + defs shift 48 + def shift 48 /* because def==defs */ {default} reduce 3 block ::= para -State 30: +State 33: fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * LINE_FENCE_BACKTICK - (57) fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines * + (62) 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 94 fenced_line ::= LINE_CONTINUATION - LINE_FENCE_BACKTICK shift-reduce 56 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK - LINE_FENCE_BACKTICK reduce 57 ** Parsing conflict ** - LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY - LINE_EMPTY reduce 57 ** Parsing conflict ** - fenced_line shift-reduce 58 fenced_lines ::= fenced_lines fenced_line - {default} reduce 57 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines + LINE_CONTINUATION shift-reduce 102 fenced_line ::= LINE_CONTINUATION + LINE_FENCE_BACKTICK shift-reduce 61 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines LINE_FENCE_BACKTICK + LINE_FENCE_BACKTICK reduce 62 ** Parsing conflict ** + LINE_EMPTY shift-reduce 103 fenced_line ::= LINE_EMPTY + LINE_EMPTY reduce 62 ** Parsing conflict ** + fenced_line shift-reduce 63 fenced_lines ::= fenced_lines fenced_line + {default} reduce 62 fenced_block ::= LINE_FENCE_BACKTICK_START fenced_lines -State 31: +State 34: fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * LINE_FENCE_BACKTICK - (55) fenced_block ::= LINE_FENCE_BACKTICK fenced_lines * + (60) 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 94 fenced_line ::= LINE_CONTINUATION - LINE_FENCE_BACKTICK shift-reduce 54 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK - LINE_FENCE_BACKTICK reduce 55 ** Parsing conflict ** - LINE_EMPTY shift-reduce 95 fenced_line ::= LINE_EMPTY - LINE_EMPTY reduce 55 ** Parsing conflict ** - fenced_line shift-reduce 58 fenced_lines ::= fenced_lines fenced_line - {default} reduce 55 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines + LINE_CONTINUATION shift-reduce 102 fenced_line ::= LINE_CONTINUATION + LINE_FENCE_BACKTICK shift-reduce 59 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines LINE_FENCE_BACKTICK + LINE_FENCE_BACKTICK reduce 60 ** Parsing conflict ** + LINE_EMPTY shift-reduce 103 fenced_line ::= LINE_EMPTY + LINE_EMPTY reduce 60 ** Parsing conflict ** + fenced_line shift-reduce 63 fenced_lines ::= fenced_lines fenced_line + {default} reduce 60 fenced_block ::= LINE_FENCE_BACKTICK fenced_lines -State 32: +State 35: 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 - (84) cont_block ::= empty * + (92) cont_block ::= empty * - LINE_INDENTED_TAB shift-reduce 74 indented_line ::= LINE_INDENTED_TAB - LINE_INDENTED_TAB reduce 84 ** Parsing conflict ** - LINE_INDENTED_SPACE shift-reduce 75 indented_line ::= LINE_INDENTED_SPACE - LINE_INDENTED_SPACE reduce 84 ** Parsing conflict ** + LINE_INDENTED_TAB shift-reduce 82 indented_line ::= LINE_INDENTED_TAB + LINE_INDENTED_TAB reduce 92 ** Parsing conflict ** + LINE_INDENTED_SPACE shift-reduce 83 indented_line ::= LINE_INDENTED_SPACE + LINE_INDENTED_SPACE reduce 92 ** Parsing conflict ** LINE_EMPTY shift-reduce 28 empty ::= empty LINE_EMPTY - LINE_EMPTY reduce 84 ** Parsing conflict ** - indented_line shift 28 - {default} reduce 84 cont_block ::= empty + LINE_EMPTY reduce 92 ** Parsing conflict ** + indented_line shift 31 + {default} reduce 92 cont_block ::= empty -State 33: - (59) meta_block ::= LINE_META meta_lines * +State 36: + (64) meta_block ::= LINE_META meta_lines * meta_lines ::= meta_lines * meta_line meta_line ::= * LINE_META meta_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 99 meta_line ::= LINE_CONTINUATION - LINE_META shift-reduce 98 meta_line ::= LINE_META - LINE_META reduce 59 ** Parsing conflict ** - meta_line shift-reduce 60 meta_lines ::= meta_lines meta_line - {default} reduce 59 meta_block ::= LINE_META meta_lines + LINE_CONTINUATION shift-reduce 107 meta_line ::= LINE_CONTINUATION + LINE_META shift-reduce 106 meta_line ::= LINE_META + LINE_META reduce 64 ** Parsing conflict ** + meta_line shift-reduce 65 meta_lines ::= meta_lines meta_line + {default} reduce 64 meta_block ::= LINE_META meta_lines -State 34: - (52) html_block ::= LINE_HTML html_block_lines * +State 37: + (57) 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 91 html_block_line ::= LINE_CONTINUATION - LINE_HTML shift-reduce 92 html_block_line ::= LINE_HTML - LINE_HTML reduce 52 ** Parsing conflict ** - html_block_line shift-reduce 53 html_block_lines ::= html_block_lines html_block_line - {default} reduce 52 html_block ::= LINE_HTML html_block_lines + LINE_CONTINUATION shift-reduce 99 html_block_line ::= LINE_CONTINUATION + LINE_HTML shift-reduce 100 html_block_line ::= LINE_HTML + LINE_HTML reduce 57 ** Parsing conflict ** + html_block_line shift-reduce 58 html_block_lines ::= html_block_lines html_block_line + {default} reduce 57 html_block ::= LINE_HTML html_block_lines -State 35: +State 38: (29) blockquote ::= LINE_BLOCKQUOTE quote_lines * quote_lines ::= quote_lines * quote_line quote_line ::= * LINE_BLOCKQUOTE quote_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 80 quote_line ::= LINE_CONTINUATION - LINE_BLOCKQUOTE shift-reduce 79 quote_line ::= LINE_BLOCKQUOTE + LINE_CONTINUATION shift-reduce 88 quote_line ::= LINE_CONTINUATION + LINE_BLOCKQUOTE shift-reduce 87 quote_line ::= LINE_BLOCKQUOTE LINE_BLOCKQUOTE reduce 29 ** Parsing conflict ** quote_line shift-reduce 30 quote_lines ::= quote_lines quote_line {default} reduce 29 blockquote ::= LINE_BLOCKQUOTE quote_lines -State 36: +State 39: para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION - (51) def_link ::= LINE_DEF_LINK para_lines * + (56) def_link ::= LINE_DEF_LINK para_lines * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION para_line shift-reduce 26 para_lines ::= para_lines para_line - {default} reduce 51 def_link ::= LINE_DEF_LINK para_lines + {default} reduce 56 def_link ::= LINE_DEF_LINK para_lines -State 37: +State 40: + (44) table ::= table_header table_body LINE_EMPTY * + table_body ::= table_body LINE_EMPTY * table_section + table_section ::= * table_section LINE_TABLE + table_section ::= * LINE_TABLE + + LINE_TABLE shift-reduce 93 table_section ::= LINE_TABLE + LINE_TABLE reduce 44 ** Parsing conflict ** + table_section shift 50 + {default} reduce 44 table ::= table_header table_body LINE_EMPTY + +State 41: + para_lines ::= para_lines * para_line + para_line ::= * LINE_CONTINUATION + (74) para ::= table_section para_lines * + + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION + para_line shift-reduce 26 para_lines ::= para_lines para_line + {default} reduce 74 para ::= table_section para_lines + +State 42: (25) para ::= LINE_PLAIN para_lines * para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION para_line shift-reduce 26 para_lines ::= para_lines para_line {default} reduce 25 para ::= LINE_PLAIN para_lines -State 38: +State 43: (24) block ::= definition_block * empty ::= * empty LINE_EMPTY empty ::= * LINE_EMPTY definition_block ::= definition_block * empty definition definition_block ::= definition_block * empty - LINE_EMPTY shift-reduce 76 empty ::= LINE_EMPTY + LINE_EMPTY shift-reduce 84 empty ::= LINE_EMPTY LINE_EMPTY reduce 24 ** Parsing conflict ** - empty shift 16 + empty shift 10 {default} reduce 24 block ::= definition_block -State 39: +State 44: (13) block ::= list_enumerated * list_enumerated ::= list_enumerated * item_enumerated item_enumerated ::= * LINE_LIST_ENUMERATED para_lines cont_blocks @@ -835,16 +927,16 @@ State 39: item_enumerated shift-reduce 36 list_enumerated ::= list_enumerated item_enumerated {default} reduce 13 block ::= list_enumerated -State 40: +State 45: para_lines ::= para_lines * para_line para_line ::= * LINE_CONTINUATION (42) cont_block ::= empty indented_line para_lines * - LINE_CONTINUATION shift-reduce 70 para_line ::= LINE_CONTINUATION + LINE_CONTINUATION shift-reduce 78 para_line ::= LINE_CONTINUATION para_line shift-reduce 26 para_lines ::= para_lines para_line {default} reduce 42 cont_block ::= empty indented_line para_lines -State 41: +State 46: (12) block ::= list_bulleted * list_bulleted ::= list_bulleted * item_bulleted item_bulleted ::= * LINE_LIST_BULLETED para_lines cont_blocks @@ -857,35 +949,52 @@ State 41: item_bulleted shift-reduce 31 list_bulleted ::= list_bulleted item_bulleted {default} reduce 12 block ::= list_bulleted -State 42: +State 47: def ::= LINE_DEFINITION * def_lines - (66) def ::= LINE_DEFINITION * + (71) def ::= LINE_DEFINITION * def_lines ::= * def_lines LINE_CONTINUATION def_lines ::= * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 102 def_lines ::= LINE_CONTINUATION - def_lines shift 46 - {default} reduce 66 def ::= LINE_DEFINITION + LINE_CONTINUATION shift-reduce 110 def_lines ::= LINE_CONTINUATION + def_lines shift 53 + {default} reduce 71 def ::= LINE_DEFINITION -State 43: - (63) definition ::= para defs * +State 48: + (68) definition ::= para defs * defs ::= defs * def def ::= * LINE_DEFINITION def_lines def ::= * LINE_DEFINITION - LINE_DEFINITION shift 42 - def shift-reduce 64 defs ::= defs def - {default} reduce 63 definition ::= para defs + LINE_DEFINITION shift 47 + def shift-reduce 69 defs ::= defs def + {default} reduce 68 definition ::= para defs -State 44: - (15) block ::= table * - table ::= table * LINE_TABLE +State 49: + (48) table_body ::= table_section * + table_section ::= table_section * LINE_TABLE - LINE_TABLE shift-reduce 44 table ::= table LINE_TABLE - LINE_TABLE reduce 15 ** Parsing conflict ** - {default} reduce 15 block ::= table + LINE_TABLE shift-reduce 49 table_section ::= table_section LINE_TABLE + LINE_TABLE reduce 48 ** Parsing conflict ** + {default} reduce 48 table_body ::= table_section -State 45: +State 50: + (47) table_body ::= table_body LINE_EMPTY table_section * + table_section ::= table_section * LINE_TABLE + + LINE_TABLE shift-reduce 49 table_section ::= table_section LINE_TABLE + LINE_TABLE reduce 47 ** Parsing conflict ** + {default} reduce 47 table_body ::= table_body LINE_EMPTY table_section + +State 51: + table ::= table_header table_body * LINE_EMPTY + (45) table ::= table_header table_body * + table_body ::= table_body * LINE_EMPTY table_section + + LINE_EMPTY shift 40 + LINE_EMPTY reduce 45 ** Parsing conflict ** + {default} reduce 45 table ::= table_header table_body + +State 52: (11) block ::= empty * empty ::= empty * LINE_EMPTY @@ -893,76 +1002,80 @@ State 45: LINE_EMPTY reduce 11 ** Parsing conflict ** {default} reduce 11 block ::= empty -State 46: - (65) def ::= LINE_DEFINITION def_lines * +State 53: + (70) def ::= LINE_DEFINITION def_lines * def_lines ::= def_lines * LINE_CONTINUATION - LINE_CONTINUATION shift-reduce 67 def_lines ::= def_lines LINE_CONTINUATION - {default} reduce 65 def ::= LINE_DEFINITION def_lines + LINE_CONTINUATION shift-reduce 72 def_lines ::= def_lines LINE_CONTINUATION + {default} reduce 70 def ::= LINE_DEFINITION def_lines ---------------------------------------------------- Symbols: 0: $: - 1: LINE_CONTINUATION - 2: LINE_PLAIN - 3: LINE_INDENTED_TAB - 4: LINE_INDENTED_SPACE - 5: LINE_HTML - 6: LINE_ATX_1 - 7: LINE_ATX_2 - 8: LINE_ATX_3 - 9: LINE_ATX_4 - 10: LINE_ATX_5 - 11: LINE_ATX_6 - 12: LINE_HR - 13: LINE_BLOCKQUOTE - 14: LINE_LIST_BULLETED - 15: LINE_LIST_ENUMERATED - 16: LINE_TABLE - 17: LINE_DEF_CITATION - 18: LINE_DEF_FOOTNOTE - 19: LINE_DEF_LINK - 20: LINE_FENCE_BACKTICK - 21: LINE_FENCE_BACKTICK_START - 22: LINE_TOC - 23: LINE_EMPTY - 24: LINE_META - 25: LINE_DEFINITION - 26: error: - 27: 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_TOC LINE_EMPTY LINE_META - 28: 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_TOC LINE_EMPTY LINE_META - 29: 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_TOC LINE_EMPTY LINE_META - 30: para: LINE_PLAIN - 31: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE - 32: empty: LINE_EMPTY - 33: list_bulleted: LINE_LIST_BULLETED - 34: list_enumerated: LINE_LIST_ENUMERATED - 35: blockquote: LINE_BLOCKQUOTE - 36: table: LINE_TABLE - 37: def_citation: LINE_DEF_CITATION - 38: def_footnote: LINE_DEF_FOOTNOTE - 39: def_link: LINE_DEF_LINK - 40: html_block: LINE_HTML - 41: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START - 42: meta_block: LINE_META - 43: definition_block: LINE_PLAIN - 44: para_lines: LINE_CONTINUATION - 45: para_line: LINE_CONTINUATION - 46: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY - 47: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE - 48: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE - 49: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE - 50: item_bulleted: LINE_LIST_BULLETED - 51: cont_blocks: LINE_EMPTY - 52: item_enumerated: LINE_LIST_ENUMERATED - 53: cont_block: LINE_EMPTY - 54: html_block_lines: LINE_CONTINUATION LINE_HTML - 55: html_block_line: LINE_CONTINUATION LINE_HTML - 56: fenced_lines: LINE_CONTINUATION LINE_EMPTY - 57: fenced_line: LINE_CONTINUATION LINE_EMPTY - 58: meta_lines: LINE_CONTINUATION LINE_META - 59: meta_line: LINE_CONTINUATION LINE_META - 60: definition: LINE_PLAIN - 61: defs: LINE_DEFINITION - 62: def: LINE_DEFINITION - 63: def_lines: LINE_CONTINUATION + 1: LINE_PLAIN + 2: LINE_TABLE_SEPARATOR + 3: LINE_CONTINUATION + 4: LINE_INDENTED_TAB + 5: LINE_INDENTED_SPACE + 6: LINE_HTML + 7: LINE_ATX_1 + 8: LINE_ATX_2 + 9: LINE_ATX_3 + 10: LINE_ATX_4 + 11: LINE_ATX_5 + 12: LINE_ATX_6 + 13: LINE_HR + 14: LINE_BLOCKQUOTE + 15: LINE_LIST_BULLETED + 16: LINE_LIST_ENUMERATED + 17: LINE_TABLE + 18: LINE_DEF_CITATION + 19: LINE_DEF_FOOTNOTE + 20: LINE_DEF_LINK + 21: LINE_FENCE_BACKTICK + 22: LINE_FENCE_BACKTICK_START + 23: LINE_TOC + 24: LINE_EMPTY + 25: LINE_META + 26: LINE_DEFINITION + 27: error: + 28: 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_TOC LINE_EMPTY LINE_META + 29: 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_TOC LINE_EMPTY LINE_META + 30: 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_TOC LINE_EMPTY LINE_META + 31: para: LINE_PLAIN LINE_TABLE + 32: indented_code: LINE_INDENTED_TAB LINE_INDENTED_SPACE + 33: empty: LINE_EMPTY + 34: list_bulleted: LINE_LIST_BULLETED + 35: list_enumerated: LINE_LIST_ENUMERATED + 36: blockquote: LINE_BLOCKQUOTE + 37: table: LINE_TABLE + 38: def_citation: LINE_DEF_CITATION + 39: def_footnote: LINE_DEF_FOOTNOTE + 40: def_link: LINE_DEF_LINK + 41: html_block: LINE_HTML + 42: fenced_block: LINE_FENCE_BACKTICK LINE_FENCE_BACKTICK_START + 43: meta_block: LINE_META + 44: definition_block: LINE_PLAIN LINE_TABLE + 45: para_lines: LINE_CONTINUATION + 46: para_line: LINE_CONTINUATION + 47: code_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE LINE_EMPTY + 48: indented_line: LINE_INDENTED_TAB LINE_INDENTED_SPACE + 49: quote_lines: LINE_CONTINUATION LINE_BLOCKQUOTE + 50: quote_line: LINE_CONTINUATION LINE_BLOCKQUOTE + 51: item_bulleted: LINE_LIST_BULLETED + 52: cont_blocks: LINE_EMPTY + 53: item_enumerated: LINE_LIST_ENUMERATED + 54: cont_block: LINE_EMPTY + 55: table_header: LINE_TABLE + 56: table_body: LINE_TABLE + 57: table_section: LINE_TABLE + 58: html_block_lines: LINE_CONTINUATION LINE_HTML + 59: html_block_line: LINE_CONTINUATION LINE_HTML + 60: fenced_lines: LINE_CONTINUATION LINE_EMPTY + 61: fenced_line: LINE_CONTINUATION LINE_EMPTY + 62: meta_lines: LINE_CONTINUATION LINE_META + 63: meta_line: LINE_CONTINUATION LINE_META + 64: definition: LINE_PLAIN LINE_TABLE + 65: defs: LINE_DEFINITION + 66: def: LINE_DEFINITION + 67: def_lines: LINE_CONTINUATION diff --git a/src/parser.y b/src/parser.y index d53ab98..752fb84 100644 --- a/src/parser.y +++ b/src/parser.y @@ -62,6 +62,8 @@ %extra_argument { mmd_engine * engine } +%fallback LINE_PLAIN LINE_TABLE_SEPARATOR. + %fallback LINE_CONTINUATION LINE_PLAIN LINE_INDENTED_TAB LINE_INDENTED_SPACE. %fallback 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. @@ -163,8 +165,16 @@ cont_block(A) ::= empty(B) indented_line(C) para_lines(D).{ A = B; token_chain_ cont_block(A) ::= empty(B) indented_line(C). { A = B; token_chain_append(B, C); C->type = LINE_CONTINUATION; } cont_block ::= empty. -table(A) ::= table(B) LINE_TABLE(C). { A = B; token_chain_append(B, C); } -table ::= LINE_TABLE. +table(A) ::= table_header(B) table_body(C) LINE_EMPTY(D). { A = B; token_chain_append(B, C); token_chain_append(B, D); } +table(A) ::= table_header(B) table_body(C). { A = B; token_chain_append(B, C); } + +table_header(A) ::= table_section(B) LINE_TABLE_SEPARATOR(C). { A = token_new_parent(B, BLOCK_TABLE_HEADER); token_chain_append(B, C); } + +table_body(A) ::= table_body(B) LINE_EMPTY(C) table_section(D). { A = B; token_chain_append(B, C); token_chain_append(B, token_new_parent(D, BLOCK_TABLE_SECTION)); } +table_body(A) ::= table_section(B). { A = token_new_parent(B, BLOCK_TABLE_SECTION); } + +table_section(A) ::= table_section(B) LINE_TABLE(C). { A = B; token_chain_append(B, C); } +table_section ::= LINE_TABLE. def_citation(A) ::= LINE_DEF_CITATION(B) para_lines(C) cont_blocks(D). { A = B; token_chain_append(B, C); token_chain_append(B, D); } def_citation(A) ::= LINE_DEF_CITATION(B) para_lines(C). { A = B; token_chain_append(B, C); } @@ -227,6 +237,13 @@ def_lines(A) ::= def_lines(B) LINE_CONTINUATION(C). { A = B; token_chain_appen def_lines ::= LINE_CONTINUATION. +// Fallbacks for improper structures +para(A) ::= table_section(B) LINE_EMPTY(C). { A = B; token_chain_append(B, C); } +para(A) ::= table_section(B) para_lines(C). { A = B; token_chain_append(B, C); } +para(A) ::= table_section(B). { A = B; } + + + // // Additional Configuration // diff --git a/src/scanners.c b/src/scanners.c index e8e2d78..8dae2a1 100644 --- a/src/scanners.c +++ b/src/scanners.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 on Sat Feb 4 08:26:54 2017 */ +/* Generated by re2c 0.14.3 on Sat Feb 4 17:39:29 2017 */ /** MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more. @@ -9041,6 +9041,354 @@ yy655: } +size_t scan_table_separator(const char * c) { + const char * marker = NULL; + const char * start = c; + + +{ + char yych; + yych = *c; + switch (yych) { + case '\t': + case ' ': + case '+': + case '-': + case ':': + case '=': goto yy660; + case '\n': goto yy658; + case '|': goto yy659; + default: goto yy661; + } +yy658: + { return 0; } +yy659: + yych = *(marker = ++c); + switch (yych) { + case '\t': + case '\n': + case '\r': + case ' ': + case '+': + case '-': + case ':': + case '=': + case '|': goto yy671; + default: goto yy658; + } +yy660: + yych = *(marker = ++c); + switch (yych) { + case '\t': + case ' ': + case '+': + case '-': + case ':': + case '=': goto yy665; + case '|': goto yy662; + default: goto yy658; + } +yy661: + yych = *++c; + goto yy658; +yy662: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': + case '+': + case '-': + case ':': + case '=': + case '|': goto yy662; + case '\n': goto yy667; + case '\r': goto yy669; + default: goto yy664; + } +yy664: + c = marker; + goto yy658; +yy665: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': + case '+': + case '-': + case ':': + case '=': goto yy665; + case '|': goto yy662; + default: goto yy664; + } +yy667: + ++c; +yy668: + { return (size_t)( c - start ); } +yy669: + yych = *++c; + switch (yych) { + case '\n': goto yy667; + default: goto yy668; + } +yy670: + ++c; + yych = *c; +yy671: + switch (yych) { + case '\t': + case ' ': + case '+': + case '-': + case ':': + case '=': + case '|': goto yy670; + case '\n': goto yy667; + case '\r': goto yy669; + default: goto yy664; + } +} + +} + + +size_t scan_alignment_string(const char * c) { + const char * marker = NULL; + + +{ + char yych; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy675; + case '\n': goto yy674; + case '-': + case '=': goto yy677; + case ':': goto yy676; + default: goto yy678; + } +yy674: + { return 0; } +yy675: + yych = *(marker = ++c); + switch (yych) { + case '\t': + case ' ': goto yy717; + case '-': + case '=': goto yy681; + case ':': goto yy716; + default: goto yy674; + } +yy676: + yych = *(marker = ++c); + switch (yych) { + case '-': + case '=': goto yy693; + default: goto yy674; + } +yy677: + yych = *(marker = ++c); + switch (yych) { + case '-': + case '=': goto yy681; + case ':': goto yy679; + default: goto yy674; + } +yy678: + yych = *++c; + goto yy674; +yy679: + yych = *++c; + switch (yych) { + case '+': goto yy688; + default: goto yy684; + } +yy680: + c = marker; + goto yy674; +yy681: + ++c; + yych = *c; + switch (yych) { + case '-': + case '=': goto yy681; + case ':': goto yy679; + default: goto yy680; + } +yy683: + ++c; + yych = *c; +yy684: + switch (yych) { + case '\t': + case ' ': goto yy683; + case '\n': + case '|': goto yy685; + case '\r': goto yy687; + default: goto yy680; + } +yy685: + ++c; +yy686: + { return ALIGN_RIGHT; } +yy687: + yych = *++c; + switch (yych) { + case '\n': goto yy685; + default: goto yy686; + } +yy688: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy688; + case '\n': + case '|': goto yy690; + case '\r': goto yy692; + default: goto yy680; + } +yy690: + ++c; +yy691: + { return ALIGN_WRAP | ALIGN_RIGHT; } +yy692: + yych = *++c; + switch (yych) { + case '\n': goto yy690; + default: goto yy691; + } +yy693: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy695; + case '\n': + case '|': goto yy697; + case '\r': goto yy699; + case '+': goto yy701; + case '-': + case '=': goto yy693; + case ':': goto yy700; + default: goto yy680; + } +yy695: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy695; + case '\n': + case '|': goto yy697; + case '\r': goto yy699; + default: goto yy680; + } +yy697: + ++c; +yy698: + { return ALIGN_LEFT; } +yy699: + yych = *++c; + switch (yych) { + case '\n': goto yy697; + default: goto yy698; + } +yy700: + yych = *++c; + switch (yych) { + case '+': goto yy706; + default: goto yy709; + } +yy701: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy701; + case '\n': + case '|': goto yy703; + case '\r': goto yy705; + default: goto yy680; + } +yy703: + ++c; +yy704: + { return ALIGN_WRAP | ALIGN_LEFT; } +yy705: + yych = *++c; + switch (yych) { + case '\n': goto yy703; + default: goto yy704; + } +yy706: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy706; + case '\n': + case '|': goto yy713; + case '\r': goto yy715; + default: goto yy680; + } +yy708: + ++c; + yych = *c; +yy709: + switch (yych) { + case '\t': + case ' ': goto yy708; + case '\n': + case '|': goto yy710; + case '\r': goto yy712; + default: goto yy680; + } +yy710: + ++c; +yy711: + { return ALIGN_CENTER; } +yy712: + yych = *++c; + switch (yych) { + case '\n': goto yy710; + default: goto yy711; + } +yy713: + ++c; +yy714: + { return ALIGN_WRAP | ALIGN_CENTER; } +yy715: + yych = *++c; + switch (yych) { + case '\n': goto yy713; + default: goto yy714; + } +yy716: + yych = *++c; + switch (yych) { + case '-': + case '=': goto yy693; + default: goto yy680; + } +yy717: + ++c; + yych = *c; + switch (yych) { + case '\t': + case ' ': goto yy717; + case '-': + case '=': goto yy681; + case ':': goto yy716; + default: goto yy680; + } +} + +} + + #ifdef TEST void Test_scan_url(CuTest* tc) { int url_len; diff --git a/src/scanners.h b/src/scanners.h index 6233483..6abd6bb 100644 --- a/src/scanners.h +++ b/src/scanners.h @@ -61,6 +61,15 @@ #include "CuTest.h" #endif +enum alignments { + ALIGN_LEFT = 1 << 0, + ALIGN_RIGHT = 1 << 1, + ALIGN_CENTER = 1 << 2, + ALIGN_WRAP = 1 << 3 +}; + + +size_t scan_alignment_string(const char * c); size_t scan_attr(const char * c); size_t scan_attributes(const char * c); size_t scan_definition(const char * c); @@ -78,6 +87,7 @@ size_t scan_ref_foot(const char * c); size_t scan_ref_link(const char * c); size_t scan_ref_link_no_attributes(const char * c); size_t scan_spnl(const char * c); +size_t scan_table_separator(const char * c); size_t scan_url(const char * c); size_t scan_value(const char * c); diff --git a/src/scanners.re b/src/scanners.re index 5956de0..e6e8040 100644 --- a/src/scanners.re +++ b/src/scanners.re @@ -138,6 +138,17 @@ meta_line = meta_key sp ':' meta_value nl; // meta_line can't match url above definition = non_indent ':' sp [^\n\r\x00]; + + table_separator = (('|' [:\-= \t|+]*) | ([:\-= \t+]+ '|' [:\-= \t|+]*)) nl; + + align = [\-=]+; + align_left = sp ':' align sp ('|' | nl); + align_right = sp align ':' sp ('|' | nl); + align_center = sp ':' align ':' sp ('|' | nl); + align_wrap_left = sp ':' align '+' sp ('|' | nl); + align_wrap_right = sp align ':' '+' sp ('|' | nl); + align_wrap_center = sp ':' align ':' '+' sp ('|' | nl); + */ @@ -348,6 +359,34 @@ size_t scan_definition(const char * c) { } +size_t scan_table_separator(const char * c) { + const char * marker = NULL; + const char * start = c; + +/*!re2c + table_separator { return (size_t)( c - start ); } + .? { return 0; } +*/ +} + + +size_t scan_alignment_string(const char * c) { + const char * marker = NULL; + +/*!re2c + align_left { return ALIGN_LEFT; } + align_right { return ALIGN_RIGHT; } + align_center { return ALIGN_CENTER; } + + align_wrap_left { return ALIGN_WRAP | ALIGN_LEFT; } + align_wrap_right { return ALIGN_WRAP | ALIGN_RIGHT; } + align_wrap_center { return ALIGN_WRAP | ALIGN_CENTER; } + + .? { return 0; } +*/ +} + + #ifdef TEST void Test_scan_url(CuTest* tc) { int url_len; diff --git a/src/token.c b/src/token.c index 17cd427..e998375 100644 --- a/src/token.c +++ b/src/token.c @@ -134,6 +134,10 @@ token * token_new(unsigned short type, size_t start, size_t len) { /// Create a parent for a chain of tokens token * token_new_parent(token * child, unsigned short type) { + if (child == NULL) { + return token_new(type, 0, 0); + } + token * t = token_new(type, child->start, 0); t->child = child; child->prev = NULL; diff --git a/src/writer.c b/src/writer.c index 3adaa6c..8fc6853 100644 --- a/src/writer.c +++ b/src/writer.c @@ -1353,3 +1353,61 @@ void citation_from_bracket(const char * source, scratch_pad * scratch, token * t } } + +void read_table_column_alignments(const char * source, token * table, scratch_pad * scratch) { + token * walker = table->child->child; + + // Find the separator line + while (walker->next) + walker = walker->next; + + walker->type = TEXT_EMPTY; + + // Iterate through cells to create alignment string + short counter = 0; + short align = 0; + + walker = walker->child; + + while (walker) { + switch (walker->type) { + case TABLE_CELL: + align = scan_alignment_string(&source[walker->start]); + + switch (align) { + case ALIGN_LEFT: + scratch->table_alignment[counter] = 'l'; + break; + case ALIGN_RIGHT: + scratch->table_alignment[counter] = 'r'; + break; + case ALIGN_CENTER: + scratch->table_alignment[counter] = 'c'; + break; + case ALIGN_LEFT | ALIGN_WRAP: + scratch->table_alignment[counter] = 'L'; + break; + case ALIGN_RIGHT | ALIGN_WRAP: + scratch->table_alignment[counter] = 'R'; + break; + case ALIGN_CENTER | ALIGN_WRAP: + scratch->table_alignment[counter] = 'C'; + break; + case ALIGN_WRAP: + scratch->table_alignment[counter] = 'C'; + break; + default: + scratch->table_alignment[counter] = 'n'; + } + + counter++; + break; + } + + walker = walker->next; + } + + scratch->table_alignment[counter] = '\0'; + scratch->table_column_count = counter; +} + diff --git a/src/writer.h b/src/writer.h index d94c676..106f626 100644 --- a/src/writer.h +++ b/src/writer.h @@ -69,6 +69,7 @@ #define kMaxExportRecursiveDepth 1000 //!< Maximum recursion depth when exporting token tree -- to prevent stack overflow with "pathologic" input +#define kMaxTableColumns 48 //!< Maximum number of table columns for specifying alignment typedef struct { struct link * link_hash; @@ -97,6 +98,11 @@ typedef struct { short recurse_depth; + short in_table_header; + short table_column_count; + short table_cell_count; + char table_alignment[kMaxTableColumns]; + char _PADDING[4]; //!< pad struct for alignment } scratch_pad; @@ -189,5 +195,7 @@ void meta_set_value(meta * m, const char * value); void meta_free(meta * m); char * extract_metadata(scratch_pad * scratch, const char * target); +void read_table_column_alignments(const char * source, token * table, scratch_pad * scratch); + #endif diff --git a/tests/MMD6Tests/Edge Cases.html b/tests/MMD6Tests/Edge Cases.html index fe61d34..57d368b 100644 --- a/tests/MMD6Tests/Edge Cases.html +++ b/tests/MMD6Tests/Edge Cases.html @@ -86,4 +86,4 @@ bar

This is another test of italics and bold.

-

*a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a

+

*a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a

diff --git a/tests/MMD6Tests/Edge Cases.htmlc b/tests/MMD6Tests/Edge Cases.htmlc index 6e1a2c5..e1869f9 100644 --- a/tests/MMD6Tests/Edge Cases.htmlc +++ b/tests/MMD6Tests/Edge Cases.htmlc @@ -86,4 +86,4 @@ bar

This is another test of italics and bold.

-

*a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a

+

*a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a *a

diff --git a/tests/MMD6Tests/Tables.html b/tests/MMD6Tests/Tables.html new file mode 100644 index 0000000..4e4c245 --- /dev/null +++ b/tests/MMD6Tests/Tables.html @@ -0,0 +1,44 @@ + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Prototype table
Grouping
First Header Second Header Third Header
Content Long Cell
Content Cell Cell
New section More Data
And more With an escaped ‘|’
diff --git a/tests/MMD6Tests/Tables.htmlc b/tests/MMD6Tests/Tables.htmlc new file mode 100644 index 0000000..06c07d9 --- /dev/null +++ b/tests/MMD6Tests/Tables.htmlc @@ -0,0 +1,9 @@ +

| | Grouping || +First Header | Second Header | Third Header | +------------ | :-----------: | -----------: | +Content | Long Cell || +| Content | Cell | Cell |

+ +

New section | More | Data +And more || With an escaped '|' |
+[Prototype table]

diff --git a/tests/MMD6Tests/Tables.text b/tests/MMD6Tests/Tables.text new file mode 100644 index 0000000..d5b1151 --- /dev/null +++ b/tests/MMD6Tests/Tables.text @@ -0,0 +1,10 @@ +[Prototype table] +| | Grouping || +First Header | Second Header | Third Header | + ------------ | :-----------: | -----------: | +Content | *Long Cell* || +| Content | **Cell** | Cell | + +New section | More | Data +And more || With an escaped '\|' | +[Prototype table]