Fossil SCM
Fixes to the rendering of <verbatim> and <nowiki>
Commit
e75f9a2ab45aa3b47bb0ac6043bd42118d77f9ea
Parent
8ffd32c2b7ff83e…
1 file changed
+8
-9
+8
-9
| --- src/wikiformat.c | ||
| +++ src/wikiformat.c | ||
| @@ -512,11 +512,11 @@ | ||
| 512 | 512 | |
| 513 | 513 | /* |
| 514 | 514 | ** z points to the start of a token. Return the number of |
| 515 | 515 | ** characters in that token. Write the token type into *pTokenType. |
| 516 | 516 | */ |
| 517 | -static int nextToken(const char *z, int state, int *pTokenType){ | |
| 517 | +static int nextToken(const char *z, Renderer *p, int *pTokenType){ | |
| 518 | 518 | int n; |
| 519 | 519 | if( z[0]=='<' ){ |
| 520 | 520 | n = markupLength(z); |
| 521 | 521 | if( n>0 ){ |
| 522 | 522 | *pTokenType = TOKEN_MARKUP; |
| @@ -524,15 +524,15 @@ | ||
| 524 | 524 | }else{ |
| 525 | 525 | *pTokenType = TOKEN_CHARACTER; |
| 526 | 526 | return 1; |
| 527 | 527 | } |
| 528 | 528 | } |
| 529 | - if( z[0]=='&' && !isElement(z) ){ | |
| 529 | + if( z[0]=='&' && (p->inVerbatim || !isElement(z)) ){ | |
| 530 | 530 | *pTokenType = TOKEN_CHARACTER; |
| 531 | 531 | return 1; |
| 532 | 532 | } |
| 533 | - if( (state & ALLOW_WIKI)!=0 ){ | |
| 533 | + if( (p->state & ALLOW_WIKI)!=0 ){ | |
| 534 | 534 | if( z[0]=='\n' ){ |
| 535 | 535 | n = paragraphBreakLength(z); |
| 536 | 536 | if( n>0 ){ |
| 537 | 537 | *pTokenType = TOKEN_PARAGRAPH; |
| 538 | 538 | return n; |
| @@ -539,12 +539,11 @@ | ||
| 539 | 539 | }else if( isspace(z[1]) ){ |
| 540 | 540 | *pTokenType = TOKEN_NEWLINE; |
| 541 | 541 | return 1; |
| 542 | 542 | } |
| 543 | 543 | } |
| 544 | - if( (state & AT_NEWLINE)!=0 /* && (state & (AT_PARAGRAPH|IN_LIST))!=0 */ | |
| 545 | - && isspace(z[0]) ){ | |
| 544 | + if( (p->state & AT_NEWLINE)!=0 && isspace(z[0]) ){ | |
| 546 | 545 | n = bulletLength(z); |
| 547 | 546 | if( n>0 ){ |
| 548 | 547 | *pTokenType = TOKEN_BULLET; |
| 549 | 548 | return n; |
| 550 | 549 | } |
| @@ -552,11 +551,11 @@ | ||
| 552 | 551 | if( n>0 ){ |
| 553 | 552 | *pTokenType = TOKEN_ENUM; |
| 554 | 553 | return n; |
| 555 | 554 | } |
| 556 | 555 | } |
| 557 | - if( (state & AT_PARAGRAPH)!=0 && isspace(z[0]) ){ | |
| 556 | + if( (p->state & AT_PARAGRAPH)!=0 && isspace(z[0]) ){ | |
| 558 | 557 | n = indentLength(z); |
| 559 | 558 | if( n>0 ){ |
| 560 | 559 | *pTokenType = TOKEN_INDENT; |
| 561 | 560 | return n; |
| 562 | 561 | } |
| @@ -565,11 +564,11 @@ | ||
| 565 | 564 | *pTokenType = TOKEN_LINK; |
| 566 | 565 | return n; |
| 567 | 566 | } |
| 568 | 567 | } |
| 569 | 568 | *pTokenType = TOKEN_TEXT; |
| 570 | - return 1 + textLength(z+1, state & ALLOW_WIKI); | |
| 569 | + return 1 + textLength(z+1, p->state & ALLOW_WIKI); | |
| 571 | 570 | } |
| 572 | 571 | |
| 573 | 572 | /* |
| 574 | 573 | ** A single markup is parsed into an instance of the following |
| 575 | 574 | ** structure. |
| @@ -824,11 +823,11 @@ | ||
| 824 | 823 | int tokenType; |
| 825 | 824 | ParsedMarkup markup; |
| 826 | 825 | int n; |
| 827 | 826 | |
| 828 | 827 | while( z[0] ){ |
| 829 | - n = nextToken(z, p->state, &tokenType); | |
| 828 | + n = nextToken(z, p, &tokenType); | |
| 830 | 829 | p->state &= ~(AT_NEWLINE|AT_PARAGRAPH); |
| 831 | 830 | switch( tokenType ){ |
| 832 | 831 | case TOKEN_PARAGRAPH: { |
| 833 | 832 | if( p->wikiList ){ |
| 834 | 833 | popStackToTag(p, p->wikiList); |
| @@ -950,11 +949,11 @@ | ||
| 950 | 949 | /* Do nothing */ |
| 951 | 950 | }else if( markup.iCode==MARKUP_NOWIKI ){ |
| 952 | 951 | if( markup.endTag ){ |
| 953 | 952 | p->state |= ALLOW_WIKI; |
| 954 | 953 | }else{ |
| 955 | - p->state &= ALLOW_WIKI; | |
| 954 | + p->state &= ~ALLOW_WIKI; | |
| 956 | 955 | } |
| 957 | 956 | }else if( markup.endTag ){ |
| 958 | 957 | popStackToTag(p, markup.iCode); |
| 959 | 958 | }else if( markup.iCode==MARKUP_VERBATIM ){ |
| 960 | 959 | if( markup.nAttr==1 ){ |
| 961 | 960 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -512,11 +512,11 @@ | |
| 512 | |
| 513 | /* |
| 514 | ** z points to the start of a token. Return the number of |
| 515 | ** characters in that token. Write the token type into *pTokenType. |
| 516 | */ |
| 517 | static int nextToken(const char *z, int state, int *pTokenType){ |
| 518 | int n; |
| 519 | if( z[0]=='<' ){ |
| 520 | n = markupLength(z); |
| 521 | if( n>0 ){ |
| 522 | *pTokenType = TOKEN_MARKUP; |
| @@ -524,15 +524,15 @@ | |
| 524 | }else{ |
| 525 | *pTokenType = TOKEN_CHARACTER; |
| 526 | return 1; |
| 527 | } |
| 528 | } |
| 529 | if( z[0]=='&' && !isElement(z) ){ |
| 530 | *pTokenType = TOKEN_CHARACTER; |
| 531 | return 1; |
| 532 | } |
| 533 | if( (state & ALLOW_WIKI)!=0 ){ |
| 534 | if( z[0]=='\n' ){ |
| 535 | n = paragraphBreakLength(z); |
| 536 | if( n>0 ){ |
| 537 | *pTokenType = TOKEN_PARAGRAPH; |
| 538 | return n; |
| @@ -539,12 +539,11 @@ | |
| 539 | }else if( isspace(z[1]) ){ |
| 540 | *pTokenType = TOKEN_NEWLINE; |
| 541 | return 1; |
| 542 | } |
| 543 | } |
| 544 | if( (state & AT_NEWLINE)!=0 /* && (state & (AT_PARAGRAPH|IN_LIST))!=0 */ |
| 545 | && isspace(z[0]) ){ |
| 546 | n = bulletLength(z); |
| 547 | if( n>0 ){ |
| 548 | *pTokenType = TOKEN_BULLET; |
| 549 | return n; |
| 550 | } |
| @@ -552,11 +551,11 @@ | |
| 552 | if( n>0 ){ |
| 553 | *pTokenType = TOKEN_ENUM; |
| 554 | return n; |
| 555 | } |
| 556 | } |
| 557 | if( (state & AT_PARAGRAPH)!=0 && isspace(z[0]) ){ |
| 558 | n = indentLength(z); |
| 559 | if( n>0 ){ |
| 560 | *pTokenType = TOKEN_INDENT; |
| 561 | return n; |
| 562 | } |
| @@ -565,11 +564,11 @@ | |
| 565 | *pTokenType = TOKEN_LINK; |
| 566 | return n; |
| 567 | } |
| 568 | } |
| 569 | *pTokenType = TOKEN_TEXT; |
| 570 | return 1 + textLength(z+1, state & ALLOW_WIKI); |
| 571 | } |
| 572 | |
| 573 | /* |
| 574 | ** A single markup is parsed into an instance of the following |
| 575 | ** structure. |
| @@ -824,11 +823,11 @@ | |
| 824 | int tokenType; |
| 825 | ParsedMarkup markup; |
| 826 | int n; |
| 827 | |
| 828 | while( z[0] ){ |
| 829 | n = nextToken(z, p->state, &tokenType); |
| 830 | p->state &= ~(AT_NEWLINE|AT_PARAGRAPH); |
| 831 | switch( tokenType ){ |
| 832 | case TOKEN_PARAGRAPH: { |
| 833 | if( p->wikiList ){ |
| 834 | popStackToTag(p, p->wikiList); |
| @@ -950,11 +949,11 @@ | |
| 950 | /* Do nothing */ |
| 951 | }else if( markup.iCode==MARKUP_NOWIKI ){ |
| 952 | if( markup.endTag ){ |
| 953 | p->state |= ALLOW_WIKI; |
| 954 | }else{ |
| 955 | p->state &= ALLOW_WIKI; |
| 956 | } |
| 957 | }else if( markup.endTag ){ |
| 958 | popStackToTag(p, markup.iCode); |
| 959 | }else if( markup.iCode==MARKUP_VERBATIM ){ |
| 960 | if( markup.nAttr==1 ){ |
| 961 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -512,11 +512,11 @@ | |
| 512 | |
| 513 | /* |
| 514 | ** z points to the start of a token. Return the number of |
| 515 | ** characters in that token. Write the token type into *pTokenType. |
| 516 | */ |
| 517 | static int nextToken(const char *z, Renderer *p, int *pTokenType){ |
| 518 | int n; |
| 519 | if( z[0]=='<' ){ |
| 520 | n = markupLength(z); |
| 521 | if( n>0 ){ |
| 522 | *pTokenType = TOKEN_MARKUP; |
| @@ -524,15 +524,15 @@ | |
| 524 | }else{ |
| 525 | *pTokenType = TOKEN_CHARACTER; |
| 526 | return 1; |
| 527 | } |
| 528 | } |
| 529 | if( z[0]=='&' && (p->inVerbatim || !isElement(z)) ){ |
| 530 | *pTokenType = TOKEN_CHARACTER; |
| 531 | return 1; |
| 532 | } |
| 533 | if( (p->state & ALLOW_WIKI)!=0 ){ |
| 534 | if( z[0]=='\n' ){ |
| 535 | n = paragraphBreakLength(z); |
| 536 | if( n>0 ){ |
| 537 | *pTokenType = TOKEN_PARAGRAPH; |
| 538 | return n; |
| @@ -539,12 +539,11 @@ | |
| 539 | }else if( isspace(z[1]) ){ |
| 540 | *pTokenType = TOKEN_NEWLINE; |
| 541 | return 1; |
| 542 | } |
| 543 | } |
| 544 | if( (p->state & AT_NEWLINE)!=0 && isspace(z[0]) ){ |
| 545 | n = bulletLength(z); |
| 546 | if( n>0 ){ |
| 547 | *pTokenType = TOKEN_BULLET; |
| 548 | return n; |
| 549 | } |
| @@ -552,11 +551,11 @@ | |
| 551 | if( n>0 ){ |
| 552 | *pTokenType = TOKEN_ENUM; |
| 553 | return n; |
| 554 | } |
| 555 | } |
| 556 | if( (p->state & AT_PARAGRAPH)!=0 && isspace(z[0]) ){ |
| 557 | n = indentLength(z); |
| 558 | if( n>0 ){ |
| 559 | *pTokenType = TOKEN_INDENT; |
| 560 | return n; |
| 561 | } |
| @@ -565,11 +564,11 @@ | |
| 564 | *pTokenType = TOKEN_LINK; |
| 565 | return n; |
| 566 | } |
| 567 | } |
| 568 | *pTokenType = TOKEN_TEXT; |
| 569 | return 1 + textLength(z+1, p->state & ALLOW_WIKI); |
| 570 | } |
| 571 | |
| 572 | /* |
| 573 | ** A single markup is parsed into an instance of the following |
| 574 | ** structure. |
| @@ -824,11 +823,11 @@ | |
| 823 | int tokenType; |
| 824 | ParsedMarkup markup; |
| 825 | int n; |
| 826 | |
| 827 | while( z[0] ){ |
| 828 | n = nextToken(z, p, &tokenType); |
| 829 | p->state &= ~(AT_NEWLINE|AT_PARAGRAPH); |
| 830 | switch( tokenType ){ |
| 831 | case TOKEN_PARAGRAPH: { |
| 832 | if( p->wikiList ){ |
| 833 | popStackToTag(p, p->wikiList); |
| @@ -950,11 +949,11 @@ | |
| 949 | /* Do nothing */ |
| 950 | }else if( markup.iCode==MARKUP_NOWIKI ){ |
| 951 | if( markup.endTag ){ |
| 952 | p->state |= ALLOW_WIKI; |
| 953 | }else{ |
| 954 | p->state &= ~ALLOW_WIKI; |
| 955 | } |
| 956 | }else if( markup.endTag ){ |
| 957 | popStackToTag(p, markup.iCode); |
| 958 | }else if( markup.iCode==MARKUP_VERBATIM ){ |
| 959 | if( markup.nAttr==1 ){ |
| 960 |