From: Fletcher T. Penney Date: Thu, 29 Nov 2018 15:07:24 +0000 (-0500) Subject: ADDED: Add {{TOC:1}} and {{TOC:1-2}} options X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f35217c58d2a9b47fbf59e1d2d5c4327e5967c84;p=multimarkdown ADDED: Add {{TOC:1}} and {{TOC:1-2}} options --- diff --git a/Sources/libMultiMarkdown/html.c b/Sources/libMultiMarkdown/html.c index 9ad8121..8f9359c 100644 --- a/Sources/libMultiMarkdown/html.c +++ b/Sources/libMultiMarkdown/html.c @@ -456,7 +456,7 @@ void mmd_export_image_html(DString * out, const char * source, token * text, lin } -void mmd_export_toc_entry_html(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level) { +void mmd_export_toc_entry_html(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level, short min, short max) { token * entry, * next; short entry_level, next_level; char * temp_char; @@ -469,32 +469,36 @@ void mmd_export_toc_entry_html(DString * out, const char * source, scratch_pad * entry = stack_peek_index(scratch->header_stack, *counter); entry_level = raw_level_for_header(entry); - if (entry_level >= level) { - // This entry is a direct descendant of the parent - scratch->label_counter = (int) * counter; - temp_char = label_from_header(source, entry, scratch); - printf("
  • ", temp_char); - mmd_export_token_tree_html(out, source, entry->child, scratch); - print_const(""); - - if (*counter < scratch->header_stack->size - 1) { - next = stack_peek_index(scratch->header_stack, *counter + 1); - next_level = next->type - BLOCK_H1 + 1; - - if (next_level > entry_level) { - // This entry has children - (*counter)++; - mmd_export_toc_entry_html(out, source, scratch, counter, entry_level + 1); + if (entry_level < min || entry_level > max) { + // Ignore this one + } else { + if (entry_level >= level) { + // This entry is a direct descendant of the parent + scratch->label_counter = (int) * counter; + temp_char = label_from_header(source, entry, scratch); + printf("
  • ", temp_char); + mmd_export_token_tree_html(out, source, entry->child, scratch); + print_const(""); + + if (*counter < scratch->header_stack->size - 1) { + next = stack_peek_index(scratch->header_stack, *counter + 1); + next_level = next->type - BLOCK_H1 + 1; + + if (next_level > entry_level) { + // This entry has children + (*counter)++; + mmd_export_toc_entry_html(out, source, scratch, counter, entry_level + 1, min, max); + } } - } - print_const("
  • \n"); - free(temp_char); - } else if (entry_level < level ) { - // If entry < level, exit this level - // Decrement counter first, so that we can test it again later - (*counter)--; - break; + print_const("\n"); + free(temp_char); + } else if (entry_level < level ) { + // If entry < level, exit this level + // Decrement counter first, so that we can test it again later + (*counter)--; + break; + } } // Increment counter @@ -505,10 +509,10 @@ void mmd_export_toc_entry_html(DString * out, const char * source, scratch_pad * } -void mmd_export_toc_html(DString * out, const char * source, scratch_pad * scratch) { +void mmd_export_toc_html(DString * out, const char * source, scratch_pad * scratch, short min, short max) { size_t counter = 0; - mmd_export_toc_entry_html(out, source, scratch, &counter, 0); + mmd_export_toc_entry_html(out, source, scratch, &counter, 0, min, max); scratch->label_counter = 0; } @@ -998,7 +1002,21 @@ void mmd_export_token_html(DString * out, const char * source, token * t, scratc pad(out, 2, scratch); print_const("
    \n"); - mmd_export_toc_html(out, source, scratch); + // Define range + if (t->child->child->type == TOC) { + temp_short = 1; + temp_short2 = 6; + } else { + temp_short = source[t->start + 6] - '0'; + + if (t->child->child->type == TOC_RANGE) { + temp_short2 = source[t->start + 8] - '0'; + } else { + temp_short2 = temp_short; + } + } + + mmd_export_toc_html(out, source, scratch, temp_short, temp_short2); print_const("
    "); scratch->padded = 0; break; @@ -2012,6 +2030,8 @@ parse_citation: case TEXT_PERIOD: case TEXT_PLAIN: case TOC: + case TOC_SINGLE: + case TOC_RANGE: print_token(t); break; diff --git a/Sources/libMultiMarkdown/include/libMultiMarkdown.h b/Sources/libMultiMarkdown/include/libMultiMarkdown.h index 4a1cc61..79d3856 100644 --- a/Sources/libMultiMarkdown/include/libMultiMarkdown.h +++ b/Sources/libMultiMarkdown/include/libMultiMarkdown.h @@ -517,6 +517,8 @@ enum token_types { TABLE_DIVIDER, TOC, + TOC_SINGLE, + TOC_RANGE, TEXT_BACKSLASH, RAW_FILTER_LEFT, diff --git a/Sources/libMultiMarkdown/latex.c b/Sources/libMultiMarkdown/latex.c index bd0e0e3..7dc213e 100644 --- a/Sources/libMultiMarkdown/latex.c +++ b/Sources/libMultiMarkdown/latex.c @@ -890,6 +890,22 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat case BLOCK_TOC: pad(out, 2, scratch); + + // Define range + if (t->child->child->type == TOC) { + } else { + temp_short = source[t->start + 6] - '0'; + + if (t->child->child->type == TOC_RANGE) { + temp_short2 = source[t->start + 8] - '0'; + } else { + temp_short2 = temp_short; + } + + // Adjust depth for LaTeX numbering -- -1 for part, 0 for chapter + printf("\\setcounter{tocdepth}{%d}\n", temp_short2 - 2); + } + print_const("\\tableofcontents"); scratch->padded = 0; break; @@ -1958,6 +1974,17 @@ parse_citation: print_const("\\{\\{TOC\\}\\}"); break; + case TOC_SINGLE: + temp_short = source[t->start + 6] - '0'; + printf("\\{\\{TOC:%d\\}\\}", temp_short); + break; + + case TOC_RANGE: + temp_short = source[t->start + 6] - '0'; + temp_short2 = source[t->start + 8] - '0'; + printf("\\{\\{TOC:%d-%d\\}\\}", temp_short, temp_short2); + break; + case UL: print_const("\\_"); break; diff --git a/Sources/libMultiMarkdown/lexer.c b/Sources/libMultiMarkdown/lexer.c index b04810c..6761905 100644 --- a/Sources/libMultiMarkdown/lexer.c +++ b/Sources/libMultiMarkdown/lexer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.15.3 on Thu Sep 6 07:45:31 2018 */ +/* Generated by re2c 0.15.3 on Thu Nov 29 09:12:30 2018 */ /** MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more. @@ -138,7 +138,7 @@ yy6: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case ' ': goto yy328; + case ' ': goto yy338; default: goto yy7; } yy7: @@ -147,8 +147,8 @@ yy8: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '\n': goto yy327; - case ' ': goto yy328; + case '\n': goto yy337; + case ' ': goto yy338; default: goto yy7; } yy9: @@ -157,8 +157,8 @@ yy9: YYCTXMARKER = YYCURSOR; switch (yych) { case '\t': goto yy71; - case '\n': goto yy325; - case '\r': goto yy326; + case '\n': goto yy335; + case '\r': goto yy336; case ' ': goto yy68; case 0xC2: goto yy70; default: goto yy3; @@ -166,7 +166,7 @@ yy9: yy10: yych = *++YYCURSOR; switch (yych) { - case '[': goto yy323; + case '[': goto yy333; default: goto yy3; } yy11: @@ -182,8 +182,8 @@ yy13: case '\n': case '\r': case ' ': - case 0xC2: goto yy278; - case '#': goto yy276; + case 0xC2: goto yy288; + case '#': goto yy286; default: goto yy14; } yy14: @@ -191,7 +191,7 @@ yy14: yy15: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '$': goto yy274; + case '$': goto yy284; default: goto yy16; } yy16: @@ -203,7 +203,7 @@ yy19: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '#': goto yy258; + case '#': goto yy268; case '0': case '1': case '2': @@ -263,9 +263,9 @@ yy19: case 'w': case 'x': case 'y': - case 'z': goto yy255; + case 'z': goto yy265; case 'A': - case 'a': goto yy257; + case 'a': goto yy267; default: goto yy20; } yy20: @@ -273,7 +273,7 @@ yy20: yy21: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '\'': goto yy253; + case '\'': goto yy263; default: goto yy22; } yy22: @@ -291,7 +291,7 @@ yy29: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '+': goto yy250; + case '+': goto yy260; default: goto yy30; } yy30: @@ -299,7 +299,7 @@ yy30: yy31: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '-': goto yy242; + case '-': goto yy252; default: goto yy32; } yy32: @@ -308,8 +308,8 @@ yy33: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case ' ': goto yy234; - case '.': goto yy235; + case ' ': goto yy244; + case '.': goto yy245; default: goto yy3; } yy34: @@ -319,7 +319,7 @@ yy36: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy225; + case '.': goto yy235; case '0': case '1': case '2': @@ -329,7 +329,7 @@ yy36: case '6': case '7': case '8': - case '9': goto yy226; + case '9': goto yy236; default: goto yy3; } yy37: @@ -339,8 +339,8 @@ yy39: yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '!': goto yy218; - case '<': goto yy219; + case '!': goto yy228; + case '<': goto yy229; default: goto yy40; } yy40: @@ -349,7 +349,7 @@ yy41: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '=': goto yy215; + case '=': goto yy225; default: goto yy42; } yy42: @@ -360,11 +360,11 @@ yy43: yy45: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '#': goto yy211; - case '%': goto yy205; - case '>': goto yy213; - case '?': goto yy207; - case '^': goto yy209; + case '#': goto yy221; + case '%': goto yy215; + case '>': goto yy223; + case '?': goto yy217; + case '^': goto yy219; default: goto yy46; } yy46: @@ -372,41 +372,41 @@ yy46: yy47: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '\n': goto yy128; - case '\r': goto yy130; - case ' ': goto yy133; - case '!': goto yy193; - case '"': goto yy183; - case '#': goto yy163; - case '$': goto yy161; - case '%': goto yy159; - case '&': goto yy147; - case '\'': goto yy181; - case '(': goto yy175; - case ')': goto yy173; - case '*': goto yy139; - case '+': goto yy157; - case ',': goto yy189; - case '-': goto yy155; - case '.': goto yy195; - case '/': goto yy143; - case ':': goto yy185; - case ';': goto yy187; - case '<': goto yy151; - case '=': goto yy153; - case '>': goto yy149; - case '?': goto yy191; - case '@': goto yy145; - case '[': goto yy167; - case '\\': goto yy131; - case ']': goto yy165; - case '^': goto yy141; - case '_': goto yy137; - case '`': goto yy179; - case '{': goto yy171; - case '|': goto yy135; - case '}': goto yy169; - case '~': goto yy177; + case '\n': goto yy138; + case '\r': goto yy140; + case ' ': goto yy143; + case '!': goto yy203; + case '"': goto yy193; + case '#': goto yy173; + case '$': goto yy171; + case '%': goto yy169; + case '&': goto yy157; + case '\'': goto yy191; + case '(': goto yy185; + case ')': goto yy183; + case '*': goto yy149; + case '+': goto yy167; + case ',': goto yy199; + case '-': goto yy165; + case '.': goto yy205; + case '/': goto yy153; + case ':': goto yy195; + case ';': goto yy197; + case '<': goto yy161; + case '=': goto yy163; + case '>': goto yy159; + case '?': goto yy201; + case '@': goto yy155; + case '[': goto yy177; + case '\\': goto yy141; + case ']': goto yy175; + case '^': goto yy151; + case '_': goto yy147; + case '`': goto yy189; + case '{': goto yy181; + case '|': goto yy145; + case '}': goto yy179; + case '~': goto yy187; default: goto yy48; } yy48: @@ -423,7 +423,7 @@ yy53: yy55: ++YYCURSOR; yych = *YYCURSOR; - goto yy127; + goto yy137; yy56: { return BACKTICK; } yy57: @@ -496,13 +496,13 @@ yy67: case 10: goto yy76; case 11: goto yy88; case 12: goto yy105; - case 13: goto yy229; - case 14: goto yy279; - case 15: goto yy286; - case 16: goto yy295; - case 17: goto yy302; - case 18: goto yy311; - default: goto yy318; + case 13: goto yy239; + case 14: goto yy289; + case 15: goto yy296; + case 16: goto yy305; + case 17: goto yy312; + case 18: goto yy321; + default: goto yy328; } yy68: yyaccept = 9; @@ -1123,7 +1123,7 @@ yy101: yy102: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '=': goto yy124; + case '=': goto yy134; default: goto yy103; } yy103: @@ -1188,64 +1188,111 @@ yy119: yy120: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy121; + case ':': goto yy121; + case '}': goto yy122; default: goto yy67; } yy121: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy122; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy125; default: goto yy67; } yy122: + yych = *++YYCURSOR; + switch (yych) { + case '}': goto yy123; + default: goto yy67; + } +yy123: ++YYCURSOR; { return TOC; } -yy124: - ++YYCURSOR; - { return CRITIC_HI_OPEN; } +yy125: + yych = *++YYCURSOR; + switch (yych) { + case '-': goto yy126; + case '}': goto yy127; + default: goto yy67; + } yy126: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy130; + default: goto yy67; + } yy127: + yych = *++YYCURSOR; switch (yych) { - case '`': goto yy126; - default: goto yy56; + case '}': goto yy128; + default: goto yy67; } yy128: ++YYCURSOR; -yy129: - { return TEXT_LINEBREAK; } + { return TOC_SINGLE; } yy130: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy128; - default: goto yy129; + case '}': goto yy131; + default: goto yy67; } yy131: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { - case '(': goto yy197; - case ')': goto yy199; - case '[': goto yy201; - case ']': goto yy203; - default: goto yy132; + yych = *++YYCURSOR; + switch (yych) { + case '}': goto yy132; + default: goto yy67; } yy132: - { return ESCAPED_CHARACTER; } -yy133: ++YYCURSOR; - { return ESCAPED_CHARACTER; } -yy135: + { return TOC_RANGE; } +yy134: ++YYCURSOR; - { return ESCAPED_CHARACTER; } + { return CRITIC_HI_OPEN; } +yy136: + ++YYCURSOR; + yych = *YYCURSOR; yy137: + switch (yych) { + case '`': goto yy136; + default: goto yy56; + } +yy138: ++YYCURSOR; - { return ESCAPED_CHARACTER; } yy139: - ++YYCURSOR; - { return ESCAPED_CHARACTER; } + { return TEXT_LINEBREAK; } +yy140: + yych = *++YYCURSOR; + switch (yych) { + case '\n': goto yy138; + default: goto yy139; + } yy141: ++YYCURSOR; + switch ((yych = *YYCURSOR)) { + case '(': goto yy207; + case ')': goto yy209; + case '[': goto yy211; + case ']': goto yy213; + default: goto yy142; + } +yy142: { return ESCAPED_CHARACTER; } yy143: ++YYCURSOR; @@ -1330,80 +1377,95 @@ yy195: { return ESCAPED_CHARACTER; } yy197: ++YYCURSOR; - { return MATH_PAREN_OPEN; } + { return ESCAPED_CHARACTER; } yy199: ++YYCURSOR; - { return MATH_PAREN_CLOSE; } + { return ESCAPED_CHARACTER; } yy201: ++YYCURSOR; - { return MATH_BRACKET_OPEN; } + { return ESCAPED_CHARACTER; } yy203: ++YYCURSOR; - { return MATH_BRACKET_CLOSE; } + { return ESCAPED_CHARACTER; } yy205: ++YYCURSOR; - { return BRACKET_VARIABLE_LEFT; } + { return ESCAPED_CHARACTER; } yy207: ++YYCURSOR; - { return BRACKET_GLOSSARY_LEFT; } + { return MATH_PAREN_OPEN; } yy209: ++YYCURSOR; - { return BRACKET_FOOTNOTE_LEFT; } + { return MATH_PAREN_CLOSE; } yy211: ++YYCURSOR; - { return BRACKET_CITATION_LEFT; } + { return MATH_BRACKET_OPEN; } yy213: ++YYCURSOR; - { return BRACKET_ABBREVIATION_LEFT; } + { return MATH_BRACKET_CLOSE; } yy215: + ++YYCURSOR; + { return BRACKET_VARIABLE_LEFT; } +yy217: + ++YYCURSOR; + { return BRACKET_GLOSSARY_LEFT; } +yy219: + ++YYCURSOR; + { return BRACKET_FOOTNOTE_LEFT; } +yy221: + ++YYCURSOR; + { return BRACKET_CITATION_LEFT; } +yy223: + ++YYCURSOR; + { return BRACKET_ABBREVIATION_LEFT; } +yy225: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy216; + case '}': goto yy226; default: goto yy67; } -yy216: +yy226: ++YYCURSOR; { return CRITIC_HI_CLOSE; } -yy218: +yy228: yych = *++YYCURSOR; switch (yych) { - case '-': goto yy222; + case '-': goto yy232; default: goto yy67; } -yy219: +yy229: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy220; + case '}': goto yy230; default: goto yy67; } -yy220: +yy230: ++YYCURSOR; { return CRITIC_COM_CLOSE; } -yy222: +yy232: yych = *++YYCURSOR; switch (yych) { - case '-': goto yy223; + case '-': goto yy233; default: goto yy67; } -yy223: +yy233: ++YYCURSOR; { return HTML_COMMENT_START; } -yy225: +yy235: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { case '\t': - case ' ': goto yy231; - case '\n': goto yy228; - case '\r': goto yy230; - case 0xC2: goto yy233; + case ' ': goto yy241; + case '\n': goto yy238; + case '\r': goto yy240; + case 0xC2: goto yy243; default: goto yy67; } -yy226: +yy236: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case '.': goto yy225; + case '.': goto yy235; case '0': case '1': case '2': @@ -1413,102 +1475,102 @@ yy226: case '6': case '7': case '8': - case '9': goto yy226; + case '9': goto yy236; default: goto yy67; } -yy228: +yy238: ++YYCURSOR; -yy229: +yy239: YYCURSOR = YYCTXMARKER; { return TEXT_NUMBER_POSS_LIST; } -yy230: +yy240: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy228; - default: goto yy229; + case '\n': goto yy238; + default: goto yy239; } -yy231: +yy241: yyaccept = 13; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; switch (yych) { case '\t': - case ' ': goto yy231; - case 0xC2: goto yy233; - default: goto yy229; + case ' ': goto yy241; + case 0xC2: goto yy243; + default: goto yy239; } -yy233: +yy243: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy231; + case 0xA0: goto yy241; default: goto yy67; } -yy234: +yy244: yych = *++YYCURSOR; switch (yych) { - case '.': goto yy238; + case '.': goto yy248; default: goto yy67; } -yy235: +yy245: yych = *++YYCURSOR; switch (yych) { - case '.': goto yy236; + case '.': goto yy246; default: goto yy67; } -yy236: +yy246: ++YYCURSOR; { return ELLIPSIS; } -yy238: +yy248: yych = *++YYCURSOR; switch (yych) { - case ' ': goto yy239; + case ' ': goto yy249; default: goto yy67; } -yy239: +yy249: yych = *++YYCURSOR; switch (yych) { - case '.': goto yy240; + case '.': goto yy250; default: goto yy67; } -yy240: +yy250: ++YYCURSOR; { return ELLIPSIS; } -yy242: +yy252: ++YYCURSOR; switch ((yych = *YYCURSOR)) { - case '-': goto yy248; - case '>': goto yy246; - case '}': goto yy244; - default: goto yy243; + case '-': goto yy258; + case '>': goto yy256; + case '}': goto yy254; + default: goto yy253; } -yy243: +yy253: { return DASH_N; } -yy244: +yy254: ++YYCURSOR; { return CRITIC_DEL_CLOSE; } -yy246: +yy256: ++YYCURSOR; { return HTML_COMMENT_STOP; } -yy248: +yy258: ++YYCURSOR; { return DASH_M; } -yy250: +yy260: yych = *++YYCURSOR; switch (yych) { - case '}': goto yy251; + case '}': goto yy261; default: goto yy67; } -yy251: +yy261: ++YYCURSOR; { return CRITIC_ADD_CLOSE; } -yy253: +yy263: ++YYCURSOR; { return QUOTE_RIGHT_ALT; } -yy255: +yy265: ++YYCURSOR; yych = *YYCURSOR; -yy256: +yy266: switch (yych) { case '0': case '1': @@ -1571,18 +1633,18 @@ yy256: case 'w': case 'x': case 'y': - case 'z': goto yy255; - case ';': goto yy269; + case 'z': goto yy265; + case ';': goto yy279; default: goto yy67; } -yy257: +yy267: yych = *++YYCURSOR; switch (yych) { case 'M': - case 'm': goto yy268; - default: goto yy256; + case 'm': goto yy278; + default: goto yy266; } -yy258: +yy268: yych = *++YYCURSOR; switch (yych) { case '0': @@ -1594,18 +1656,18 @@ yy258: case '6': case '7': case '8': - case '9': goto yy260; + case '9': goto yy270; case 'X': - case 'x': goto yy259; + case 'x': goto yy269; default: goto yy67; } -yy259: +yy269: yych = *++YYCURSOR; switch (yych) { case ';': goto yy67; - default: goto yy265; + default: goto yy275; } -yy260: +yy270: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { @@ -1618,17 +1680,17 @@ yy260: case '6': case '7': case '8': - case '9': goto yy260; - case ';': goto yy262; + case '9': goto yy270; + case ';': goto yy272; default: goto yy67; } -yy262: +yy272: ++YYCURSOR; { return HTML_ENTITY; } -yy264: +yy274: ++YYCURSOR; yych = *YYCURSOR; -yy265: +yy275: switch (yych) { case '0': case '1': @@ -1677,36 +1739,36 @@ yy265: case 'c': case 'd': case 'e': - case 'f': goto yy264; - case ';': goto yy266; + case 'f': goto yy274; + case ';': goto yy276; default: goto yy67; } -yy266: +yy276: ++YYCURSOR; { return HTML_ENTITY; } -yy268: +yy278: yych = *++YYCURSOR; switch (yych) { case 'P': - case 'p': goto yy271; - default: goto yy256; + case 'p': goto yy281; + default: goto yy266; } -yy269: +yy279: ++YYCURSOR; { return HTML_ENTITY; } -yy271: +yy281: yych = *++YYCURSOR; switch (yych) { - case ';': goto yy272; - default: goto yy256; + case ';': goto yy282; + default: goto yy266; } -yy272: +yy282: ++YYCURSOR; { return AMPERSAND_LONG; } -yy274: +yy284: ++YYCURSOR; { return MATH_DOLLAR_DOUBLE; } -yy276: +yy286: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -1715,79 +1777,79 @@ yy276: case '\n': case '\r': case ' ': - case 0xC2: goto yy285; - case '#': goto yy291; + case 0xC2: goto yy295; + case '#': goto yy301; default: goto yy67; } -yy277: +yy287: yyaccept = 14; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy278: +yy288: switch (yych) { case 0x00: - case '\n': goto yy281; + case '\n': goto yy291; case '\t': - case ' ': goto yy277; - case '\r': goto yy283; - case 0xC2: goto yy280; - default: goto yy279; + case ' ': goto yy287; + case '\r': goto yy293; + case 0xC2: goto yy290; + default: goto yy289; } -yy279: +yy289: { return HASH1; } -yy280: +yy290: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy277; + case 0xA0: goto yy287; default: goto yy67; } -yy281: +yy291: ++YYCURSOR; -yy282: +yy292: YYCURSOR = YYCTXMARKER; { return HASH1; } -yy283: +yy293: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy281; - default: goto yy282; + case '\n': goto yy291; + default: goto yy292; } -yy284: +yy294: yyaccept = 15; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy285: +yy295: switch (yych) { case 0x00: - case '\n': goto yy288; + case '\n': goto yy298; case '\t': - case ' ': goto yy284; - case '\r': goto yy290; - case 0xC2: goto yy287; - default: goto yy286; + case ' ': goto yy294; + case '\r': goto yy300; + case 0xC2: goto yy297; + default: goto yy296; } -yy286: +yy296: { return HASH2; } -yy287: +yy297: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy284; + case 0xA0: goto yy294; default: goto yy67; } -yy288: +yy298: ++YYCURSOR; -yy289: +yy299: YYCURSOR = YYCTXMARKER; { return HASH2; } -yy290: +yy300: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy288; - default: goto yy289; + case '\n': goto yy298; + default: goto yy299; } -yy291: +yy301: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -1796,11 +1858,11 @@ yy291: case '\n': case '\r': case ' ': - case 0xC2: goto yy294; - case '#': goto yy292; + case 0xC2: goto yy304; + case '#': goto yy302; default: goto yy67; } -yy292: +yy302: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -1809,79 +1871,79 @@ yy292: case '\n': case '\r': case ' ': - case 0xC2: goto yy301; - case '#': goto yy307; + case 0xC2: goto yy311; + case '#': goto yy317; default: goto yy67; } -yy293: +yy303: yyaccept = 16; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy294: +yy304: switch (yych) { case 0x00: - case '\n': goto yy297; + case '\n': goto yy307; case '\t': - case ' ': goto yy293; - case '\r': goto yy299; - case 0xC2: goto yy296; - default: goto yy295; + case ' ': goto yy303; + case '\r': goto yy309; + case 0xC2: goto yy306; + default: goto yy305; } -yy295: +yy305: { return HASH3; } -yy296: +yy306: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy293; + case 0xA0: goto yy303; default: goto yy67; } -yy297: +yy307: ++YYCURSOR; -yy298: +yy308: YYCURSOR = YYCTXMARKER; { return HASH3; } -yy299: +yy309: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy297; - default: goto yy298; + case '\n': goto yy307; + default: goto yy308; } -yy300: +yy310: yyaccept = 17; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy301: +yy311: switch (yych) { case 0x00: - case '\n': goto yy304; + case '\n': goto yy314; case '\t': - case ' ': goto yy300; - case '\r': goto yy306; - case 0xC2: goto yy303; - default: goto yy302; + case ' ': goto yy310; + case '\r': goto yy316; + case 0xC2: goto yy313; + default: goto yy312; } -yy302: +yy312: { return HASH4; } -yy303: +yy313: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy300; + case 0xA0: goto yy310; default: goto yy67; } -yy304: +yy314: ++YYCURSOR; -yy305: +yy315: YYCURSOR = YYCTXMARKER; { return HASH4; } -yy306: +yy316: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy304; - default: goto yy305; + case '\n': goto yy314; + default: goto yy315; } -yy307: +yy317: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -1890,11 +1952,11 @@ yy307: case '\n': case '\r': case ' ': - case 0xC2: goto yy310; - case '#': goto yy308; + case 0xC2: goto yy320; + case '#': goto yy318; default: goto yy67; } -yy308: +yy318: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -1903,97 +1965,97 @@ yy308: case '\n': case '\r': case ' ': - case 0xC2: goto yy317; + case 0xC2: goto yy327; default: goto yy67; } -yy309: +yy319: yyaccept = 18; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy310: +yy320: switch (yych) { case 0x00: - case '\n': goto yy313; + case '\n': goto yy323; case '\t': - case ' ': goto yy309; - case '\r': goto yy315; - case 0xC2: goto yy312; - default: goto yy311; + case ' ': goto yy319; + case '\r': goto yy325; + case 0xC2: goto yy322; + default: goto yy321; } -yy311: +yy321: { return HASH5; } -yy312: +yy322: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy309; + case 0xA0: goto yy319; default: goto yy67; } -yy313: +yy323: ++YYCURSOR; -yy314: +yy324: YYCURSOR = YYCTXMARKER; { return HASH5; } -yy315: +yy325: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy313; - default: goto yy314; + case '\n': goto yy323; + default: goto yy324; } -yy316: +yy326: yyaccept = 19; YYMARKER = ++YYCURSOR; yych = *YYCURSOR; -yy317: +yy327: switch (yych) { case 0x00: - case '\n': goto yy320; + case '\n': goto yy330; case '\t': - case ' ': goto yy316; - case '\r': goto yy322; - case 0xC2: goto yy319; - default: goto yy318; + case ' ': goto yy326; + case '\r': goto yy332; + case 0xC2: goto yy329; + default: goto yy328; } -yy318: +yy328: { return HASH6; } -yy319: +yy329: ++YYCURSOR; yych = *YYCURSOR; switch (yych) { - case 0xA0: goto yy316; + case 0xA0: goto yy326; default: goto yy67; } -yy320: +yy330: ++YYCURSOR; -yy321: +yy331: YYCURSOR = YYCTXMARKER; { return HASH6; } -yy322: +yy332: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy320; - default: goto yy321; + case '\n': goto yy330; + default: goto yy331; } -yy323: +yy333: ++YYCURSOR; { return BRACKET_IMAGE_LEFT; } -yy325: +yy335: yych = *++YYCURSOR; goto yy7; -yy326: +yy336: yych = *++YYCURSOR; switch (yych) { - case '\n': goto yy325; + case '\n': goto yy335; default: goto yy7; } -yy327: +yy337: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case ' ': goto yy328; + case ' ': goto yy338; default: goto yy7; } -yy328: +yy338: yych = *++YYCURSOR; YYCTXMARKER = YYCURSOR; switch (yych) { @@ -2120,7 +2182,7 @@ yy328: case '|': case '}': case '~': - case 0x7F: goto yy329; + case 0x7F: goto yy339; case 0xC2: case 0xC3: case 0xC4: @@ -2150,8 +2212,8 @@ yy328: case 0xDC: case 0xDD: case 0xDE: - case 0xDF: goto yy331; - case 0xE0: goto yy332; + case 0xDF: goto yy341; + case 0xE0: goto yy342; case 0xE1: case 0xE2: case 0xE3: @@ -2166,19 +2228,19 @@ yy328: case 0xEC: case 0xED: case 0xEE: - case 0xEF: goto yy333; - case 0xF0: goto yy334; + case 0xEF: goto yy343; + case 0xF0: goto yy344; case 0xF1: case 0xF2: - case 0xF3: goto yy335; - case 0xF4: goto yy336; + case 0xF3: goto yy345; + case 0xF4: goto yy346; default: goto yy67; } -yy329: +yy339: ++YYCURSOR; YYCURSOR = YYCTXMARKER; { return TEXT_NL_SP; } -yy331: +yy341: yych = *++YYCURSOR; switch (yych) { case 0x80: @@ -2244,10 +2306,10 @@ yy331: case 0xBC: case 0xBD: case 0xBE: - case 0xBF: goto yy329; + case 0xBF: goto yy339; default: goto yy67; } -yy332: +yy342: yych = *++YYCURSOR; switch (yych) { case 0xA0: @@ -2281,10 +2343,10 @@ yy332: case 0xBC: case 0xBD: case 0xBE: - case 0xBF: goto yy331; + case 0xBF: goto yy341; default: goto yy67; } -yy333: +yy343: yych = *++YYCURSOR; switch (yych) { case 0x80: @@ -2350,10 +2412,10 @@ yy333: case 0xBC: case 0xBD: case 0xBE: - case 0xBF: goto yy331; + case 0xBF: goto yy341; default: goto yy67; } -yy334: +yy344: yych = *++YYCURSOR; switch (yych) { case 0x90: @@ -2403,10 +2465,10 @@ yy334: case 0xBC: case 0xBD: case 0xBE: - case 0xBF: goto yy333; + case 0xBF: goto yy343; default: goto yy67; } -yy335: +yy345: yych = *++YYCURSOR; switch (yych) { case 0x80: @@ -2472,10 +2534,10 @@ yy335: case 0xBC: case 0xBD: case 0xBE: - case 0xBF: goto yy333; + case 0xBF: goto yy343; default: goto yy67; } -yy336: +yy346: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case 0x80: @@ -2493,7 +2555,7 @@ yy336: case 0x8C: case 0x8D: case 0x8E: - case 0x8F: goto yy333; + case 0x8F: goto yy343; default: goto yy67; } } diff --git a/Sources/libMultiMarkdown/lexer.re b/Sources/libMultiMarkdown/lexer.re index 29c1970..aec6cd2 100644 --- a/Sources/libMultiMarkdown/lexer.re +++ b/Sources/libMultiMarkdown/lexer.re @@ -102,6 +102,9 @@ int scan(Scanner * s, const char * stop) { "{{TOC}}" { return TOC; } + "{{TOC:" [0-9] "}}" { return TOC_SINGLE; } + "{{TOC:" [0-9] "-" [0-9] "}}" { return TOC_RANGE; } + "{++" { return CRITIC_ADD_OPEN; } "++}" { return CRITIC_ADD_CLOSE; } diff --git a/Sources/libMultiMarkdown/mmd.c b/Sources/libMultiMarkdown/mmd.c index 585ffa6..874bbc0 100644 --- a/Sources/libMultiMarkdown/mmd.c +++ b/Sources/libMultiMarkdown/mmd.c @@ -766,6 +766,8 @@ void mmd_assign_line_type(mmd_engine * e, token * line) { line->type = LINE_EMPTY; break; + case TOC_SINGLE: + case TOC_RANGE: case TOC: line->type = (e->extensions & EXT_COMPATIBILITY) ? LINE_PLAIN : LINE_TOC; break; diff --git a/Sources/libMultiMarkdown/opendocument-content.c b/Sources/libMultiMarkdown/opendocument-content.c index 91965d5..4110849 100644 --- a/Sources/libMultiMarkdown/opendocument-content.c +++ b/Sources/libMultiMarkdown/opendocument-content.c @@ -631,7 +631,7 @@ void mmd_export_image_opendocument(DString * out, const char * source, token * t } -void mmd_export_toc_entry_opendocument(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level) { +void mmd_export_toc_entry_opendocument(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level, short min, short max) { token * entry, * next; short entry_level, next_level; char * temp_char; @@ -642,31 +642,35 @@ void mmd_export_toc_entry_opendocument(DString * out, const char * source, scrat entry = stack_peek_index(scratch->header_stack, *counter); entry_level = raw_level_for_header(entry); - if (entry_level >= level) { - // This entry is a direct descendant of the parent - scratch->label_counter = (int) * counter; - temp_char = label_from_header(source, entry, scratch); - printf("", temp_char); - mmd_export_token_tree_opendocument(out, source, entry->child, scratch); - print_const(" 1\n"); - - if (*counter < scratch->header_stack->size - 1) { - next = stack_peek_index(scratch->header_stack, *counter + 1); - next_level = next->type - BLOCK_H1 + 1; - - if (next_level > entry_level) { - // This entry has children - (*counter)++; - mmd_export_toc_entry_opendocument(out, source, scratch, counter, entry_level + 1); + if (entry_level < min || entry_level > max) { + // Ignore this one + } else { + if (entry_level >= level) { + // This entry is a direct descendant of the parent + scratch->label_counter = (int) * counter; + temp_char = label_from_header(source, entry, scratch); + printf("", temp_char); + mmd_export_token_tree_opendocument(out, source, entry->child, scratch); + print_const(" 1\n"); + + if (*counter < scratch->header_stack->size - 1) { + next = stack_peek_index(scratch->header_stack, *counter + 1); + next_level = next->type - BLOCK_H1 + 1; + + if (next_level > entry_level) { + // This entry has children + (*counter)++; + mmd_export_toc_entry_opendocument(out, source, scratch, counter, entry_level + 1, min, max); + } } - } - free(temp_char); - } else if (entry_level < level ) { - // If entry < level, exit this level - // Decrement counter first, so that we can test it again later - (*counter)--; - break; + free(temp_char); + } else if (entry_level < level ) { + // If entry < level, exit this level + // Decrement counter first, so that we can test it again later + (*counter)--; + break; + } } // Increment counter @@ -675,7 +679,7 @@ void mmd_export_toc_entry_opendocument(DString * out, const char * source, scrat } -void mmd_export_toc_opendocument(DString * out, const char * source, scratch_pad * scratch) { +void mmd_export_toc_opendocument(DString * out, const char * source, scratch_pad * scratch, short min, short max) { size_t counter = 0; // TODO: Could use LC to internationalize this @@ -687,7 +691,7 @@ void mmd_export_toc_opendocument(DString * out, const char * source, scratch_pad print_const("Table of Contents\n"); print_const("\n"); - mmd_export_toc_entry_opendocument(out, source, scratch, &counter, 0); + mmd_export_toc_entry_opendocument(out, source, scratch, &counter, 0, min, max); print_const("\n\n\n"); @@ -1120,7 +1124,21 @@ void mmd_export_token_opendocument(DString * out, const char * source, token * t case BLOCK_TOC: pad(out, 2, scratch); - mmd_export_toc_opendocument(out, source, scratch); + // Define range + if (t->child->child->type == TOC) { + temp_short = 1; + temp_short2 = 6; + } else { + temp_short = source[t->start + 6] - '0'; + + if (t->child->child->type == TOC_RANGE) { + temp_short2 = source[t->start + 8] - '0'; + } else { + temp_short2 = temp_short; + } + } + + mmd_export_toc_opendocument(out, source, scratch, temp_short, temp_short2); scratch->padded = 1; break; @@ -2138,6 +2156,8 @@ parse_citation: case TEXT_PERIOD: case TEXT_PLAIN: case TOC: + case TOC_SINGLE: + case TOC_RANGE: case UL: print_token(t); break; diff --git a/tests/MMD6Tests/Table of Contents.fodt b/tests/MMD6Tests/Table of Contents.fodt index 5036a3c..7d4b25d 100644 --- a/tests/MMD6Tests/Table of Contents.fodt +++ b/tests/MMD6Tests/Table of Contents.fodt @@ -302,6 +302,51 @@ office:mimetype="application/vnd.oasis.opendocument.text"> + + +Table of Contents + + + +Table of Contents + +Second Level 1 +Second Level b 1 +Second Level c 1 +Second level d 1 +Second level 1 + + + + + + +Table of Contents + + + +Table of Contents + +Second Level 1 +Second Level b 1 +Third Level 1 +Second Level c 1 +Third Level b 1 +Second level d 1 +Third level d 1 +Second level 1 + + + + +foo {{TOC}} + +foo {{TOC:2}} + +foo {{TOC:2-3}} + +{{TOC}}{{TOC:2}}{{TOC:2-3}} + Second Level First Level diff --git a/tests/MMD6Tests/Table of Contents.html b/tests/MMD6Tests/Table of Contents.html index 4c5cdad..d4458c5 100644 --- a/tests/MMD6Tests/Table of Contents.html +++ b/tests/MMD6Tests/Table of Contents.html @@ -42,6 +42,59 @@ +
    + + +
    + +
    + + +
    + +

    foo {{TOC}}

    + +

    foo {{TOC:2}}

    + +

    foo {{TOC:2-3}}

    + +
    {{TOC}}
    +
    +{{TOC:2}}
    +
    +{{TOC:2-3}}
    +
    +

    Second Level

    First Level

    diff --git a/tests/MMD6Tests/Table of Contents.htmlc b/tests/MMD6Tests/Table of Contents.htmlc index da08a61..3b27a85 100644 --- a/tests/MMD6Tests/Table of Contents.htmlc +++ b/tests/MMD6Tests/Table of Contents.htmlc @@ -3,6 +3,23 @@ latexconfig: article

    {{TOC}}

    +

    {{TOC:2}}

    + +

    {{TOC:2-3}}

    + +

    foo {{TOC}}

    + +

    foo {{TOC:2}}

    + +

    foo {{TOC:2-3}}

    + +
    {{TOC}}
    +
    +{{TOC:2}}
    +
    +{{TOC:2-3}}
    +
    +

    Second Level

    First Level

    diff --git a/tests/MMD6Tests/Table of Contents.opml b/tests/MMD6Tests/Table of Contents.opml index 984916e..372a88c 100644 --- a/tests/MMD6Tests/Table of Contents.opml +++ b/tests/MMD6Tests/Table of Contents.opml @@ -2,7 +2,7 @@ Table of Contents - + diff --git a/tests/MMD6Tests/Table of Contents.tex b/tests/MMD6Tests/Table of Contents.tex index 05f3fc6..8e06432 100644 --- a/tests/MMD6Tests/Table of Contents.tex +++ b/tests/MMD6Tests/Table of Contents.tex @@ -4,6 +4,26 @@ \tableofcontents +\setcounter{tocdepth}{0} +\tableofcontents + +\setcounter{tocdepth}{1} +\tableofcontents + +foo \{\{TOC\}\} + +foo \{\{TOC:2\}\} + +foo \{\{TOC:2-3\}\} + +\begin{verbatim} +{{TOC}} + +{{TOC:2}} + +{{TOC:2-3}} +\end{verbatim} + \chapter{Second Level} \label{secondlevel} diff --git a/tests/MMD6Tests/Table of Contents.text b/tests/MMD6Tests/Table of Contents.text index 794698c..bc7e0fd 100644 --- a/tests/MMD6Tests/Table of Contents.text +++ b/tests/MMD6Tests/Table of Contents.text @@ -3,6 +3,26 @@ latexconfig: article {{TOC}} +{{TOC:2}} + +{{TOC:2-3}} + + +foo {{TOC}} + +foo {{TOC:2}} + +foo {{TOC:2-3}} + + + {{TOC}} + + {{TOC:2}} + + {{TOC:2-3}} + + + ## Second Level ## # First Level #