| | @@ -762,11 +762,11 @@ |
| 762 | 762 | ** Parse this element into the p structure. |
| 763 | 763 | ** |
| 764 | 764 | ** The content of z[] might be modified by converting characters |
| 765 | 765 | ** to lowercase and by inserting some "\000" characters. |
| 766 | 766 | */ |
| 767 | | -static void parseMarkup(ParsedMarkup *p, char *z){ |
| 767 | +static int parseMarkup(ParsedMarkup *p, char *z){ |
| 768 | 768 | int i, j, c; |
| 769 | 769 | int iACode; |
| 770 | 770 | char *zValue; |
| 771 | 771 | int seen = 0; |
| 772 | 772 | char zTag[100]; |
| | @@ -794,11 +794,11 @@ |
| 794 | 794 | p->aAttr[0].zValue = &z[i]; |
| 795 | 795 | while( fossil_isalnum(z[i]) ){ i++; } |
| 796 | 796 | p->aAttr[0].cTerm = c = z[i]; |
| 797 | 797 | z[i++] = 0; |
| 798 | 798 | p->nAttr = 1; |
| 799 | | - if( c=='>' ) return; |
| 799 | + if( c=='>' ) return 0; |
| 800 | 800 | } |
| 801 | 801 | while( fossil_isspace(z[i]) ){ i++; } |
| 802 | 802 | while( c!='>' && p->nAttr<8 && fossil_isalpha(z[i]) ){ |
| 803 | 803 | int attrOk; /* True to preserve attribute. False to ignore it */ |
| 804 | 804 | j = 0; |
| | @@ -841,10 +841,11 @@ |
| 841 | 841 | p->nAttr++; |
| 842 | 842 | } |
| 843 | 843 | while( fossil_isspace(z[i]) ){ i++; } |
| 844 | 844 | if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break; |
| 845 | 845 | } |
| 846 | + return seen; |
| 846 | 847 | } |
| 847 | 848 | |
| 848 | 849 | /* |
| 849 | 850 | ** Render markup on the given blob. |
| 850 | 851 | */ |
| | @@ -960,11 +961,11 @@ |
| 960 | 961 | static void popStack(Renderer *p){ |
| 961 | 962 | if( p->nStack ){ |
| 962 | 963 | int iCode; |
| 963 | 964 | p->nStack--; |
| 964 | 965 | iCode = p->aStack[p->nStack].iCode; |
| 965 | | - if( iCode!=MARKUP_DIV && p->pOut ){ |
| 966 | + if( (iCode!=MARKUP_DIV || p->aStack[p->nStack].zId==0) && p->pOut ){ |
| 966 | 967 | blob_appendf(p->pOut, "</%s>", aMarkup[iCode].zName); |
| 967 | 968 | } |
| 968 | 969 | } |
| 969 | 970 | } |
| 970 | 971 | |
| | @@ -1480,11 +1481,11 @@ |
| 1480 | 1481 | break; |
| 1481 | 1482 | } |
| 1482 | 1483 | case TOKEN_MARKUP: { |
| 1483 | 1484 | const char *zId; |
| 1484 | 1485 | int iDiv; |
| 1485 | | - parseMarkup(&markup, z); |
| 1486 | + int mAttr = parseMarkup(&markup, z); |
| 1486 | 1487 | |
| 1487 | 1488 | /* Convert <title> to <h1 align='center'> */ |
| 1488 | 1489 | if( markup.iCode==MARKUP_TITLE && !p->inVerbatim ){ |
| 1489 | 1490 | markup.iCode = MARKUP_H1; |
| 1490 | 1491 | markup.nAttr = 1; |
| | @@ -1567,11 +1568,11 @@ |
| 1567 | 1568 | popStackToTag(p, markup.iCode); |
| 1568 | 1569 | }else |
| 1569 | 1570 | |
| 1570 | 1571 | /* Push <div> markup onto the stack together with the id=ID attribute. |
| 1571 | 1572 | */ |
| 1572 | | - if( markup.iCode==MARKUP_DIV ){ |
| 1573 | + if( markup.iCode==MARKUP_DIV && (mAttr & ATTR_ID)!=0 ){ |
| 1573 | 1574 | pushStackWithId(p, markup.iCode, markupId(&markup), |
| 1574 | 1575 | (p->state & ALLOW_WIKI)!=0); |
| 1575 | 1576 | }else |
| 1576 | 1577 | |
| 1577 | 1578 | /* Enter <verbatim> processing. With verbatim enabled, all other |
| 1578 | 1579 | |