Fossil SCM
In the markdown formatter, add support for fenced code blocks containing blank lines that are indented.
Commit
5a51d1b4df6a534f4edfec71bd1b4355f2b0ea8cd5b70e7bd9ab033caf379474
Parent
949b321b26cdbcb…
1 file changed
+27
-2
+27
-2
| --- src/markdown.c | ||
| +++ src/markdown.c | ||
| @@ -1617,23 +1617,48 @@ | ||
| 1617 | 1617 | struct Blob *ob, |
| 1618 | 1618 | struct render *rndr, |
| 1619 | 1619 | char *data, |
| 1620 | 1620 | size_t size |
| 1621 | 1621 | ){ |
| 1622 | - size_t beg, end = 0, pre, work_size = 0; | |
| 1622 | + size_t beg, end = 0, pre, work_size = 0, nb, endFence = 0; | |
| 1623 | 1623 | char *work_data = 0; |
| 1624 | 1624 | struct Blob *out = new_work_buffer(rndr); |
| 1625 | + | |
| 1626 | + /* Check to see if this is a quote of a fenced code block, because | |
| 1627 | + ** if it is, then blank lines do not terminated the quoted text. Ex: | |
| 1628 | + ** | |
| 1629 | + ** > ~~~~ | |
| 1630 | + ** First line | |
| 1631 | + ** | |
| 1632 | + ** Line after blank | |
| 1633 | + ** ~~~~ | |
| 1634 | + ** | |
| 1635 | + ** If this is a quoted fenced block, then set endFence to be the | |
| 1636 | + ** offset of the end of the fenced block. | |
| 1637 | + */ | |
| 1638 | + pre = prefix_quote(data,size); | |
| 1639 | + pre += is_empty(data+pre,size-pre); | |
| 1640 | + nb = prefix_fencedcode(data+pre,size-pre); | |
| 1641 | + if( nb ){ | |
| 1642 | + size_t i = 0; | |
| 1643 | + char delim = data[pre]; | |
| 1644 | + for(end=pre+nb; end<size && i<nb; end++){ | |
| 1645 | + if( data[end]==delim ) i++; else i = 0; | |
| 1646 | + } | |
| 1647 | + if( i>=nb ) endFence = end; | |
| 1648 | + } | |
| 1625 | 1649 | |
| 1626 | 1650 | beg = 0; |
| 1627 | 1651 | while( beg<size ){ |
| 1628 | 1652 | for(end=beg+1; end<size && data[end-1]!='\n'; end++); |
| 1629 | 1653 | pre = prefix_quote(data+beg, end-beg); |
| 1630 | 1654 | if( pre ){ |
| 1631 | 1655 | beg += pre; /* skipping prefix */ |
| 1632 | 1656 | }else if( is_empty(data+beg, end-beg) |
| 1633 | 1657 | && (end>=size |
| 1634 | - || (prefix_quote(data+end, size-end)==0 | |
| 1658 | + || (end>endFence | |
| 1659 | + && prefix_quote(data+end, size-end)==0 | |
| 1635 | 1660 | && !is_empty(data+end, size-end))) |
| 1636 | 1661 | ){ |
| 1637 | 1662 | /* empty line followed by non-quote line */ |
| 1638 | 1663 | break; |
| 1639 | 1664 | } |
| 1640 | 1665 |
| --- src/markdown.c | |
| +++ src/markdown.c | |
| @@ -1617,23 +1617,48 @@ | |
| 1617 | struct Blob *ob, |
| 1618 | struct render *rndr, |
| 1619 | char *data, |
| 1620 | size_t size |
| 1621 | ){ |
| 1622 | size_t beg, end = 0, pre, work_size = 0; |
| 1623 | char *work_data = 0; |
| 1624 | struct Blob *out = new_work_buffer(rndr); |
| 1625 | |
| 1626 | beg = 0; |
| 1627 | while( beg<size ){ |
| 1628 | for(end=beg+1; end<size && data[end-1]!='\n'; end++); |
| 1629 | pre = prefix_quote(data+beg, end-beg); |
| 1630 | if( pre ){ |
| 1631 | beg += pre; /* skipping prefix */ |
| 1632 | }else if( is_empty(data+beg, end-beg) |
| 1633 | && (end>=size |
| 1634 | || (prefix_quote(data+end, size-end)==0 |
| 1635 | && !is_empty(data+end, size-end))) |
| 1636 | ){ |
| 1637 | /* empty line followed by non-quote line */ |
| 1638 | break; |
| 1639 | } |
| 1640 |
| --- src/markdown.c | |
| +++ src/markdown.c | |
| @@ -1617,23 +1617,48 @@ | |
| 1617 | struct Blob *ob, |
| 1618 | struct render *rndr, |
| 1619 | char *data, |
| 1620 | size_t size |
| 1621 | ){ |
| 1622 | size_t beg, end = 0, pre, work_size = 0, nb, endFence = 0; |
| 1623 | char *work_data = 0; |
| 1624 | struct Blob *out = new_work_buffer(rndr); |
| 1625 | |
| 1626 | /* Check to see if this is a quote of a fenced code block, because |
| 1627 | ** if it is, then blank lines do not terminated the quoted text. Ex: |
| 1628 | ** |
| 1629 | ** > ~~~~ |
| 1630 | ** First line |
| 1631 | ** |
| 1632 | ** Line after blank |
| 1633 | ** ~~~~ |
| 1634 | ** |
| 1635 | ** If this is a quoted fenced block, then set endFence to be the |
| 1636 | ** offset of the end of the fenced block. |
| 1637 | */ |
| 1638 | pre = prefix_quote(data,size); |
| 1639 | pre += is_empty(data+pre,size-pre); |
| 1640 | nb = prefix_fencedcode(data+pre,size-pre); |
| 1641 | if( nb ){ |
| 1642 | size_t i = 0; |
| 1643 | char delim = data[pre]; |
| 1644 | for(end=pre+nb; end<size && i<nb; end++){ |
| 1645 | if( data[end]==delim ) i++; else i = 0; |
| 1646 | } |
| 1647 | if( i>=nb ) endFence = end; |
| 1648 | } |
| 1649 | |
| 1650 | beg = 0; |
| 1651 | while( beg<size ){ |
| 1652 | for(end=beg+1; end<size && data[end-1]!='\n'; end++); |
| 1653 | pre = prefix_quote(data+beg, end-beg); |
| 1654 | if( pre ){ |
| 1655 | beg += pre; /* skipping prefix */ |
| 1656 | }else if( is_empty(data+beg, end-beg) |
| 1657 | && (end>=size |
| 1658 | || (end>endFence |
| 1659 | && prefix_quote(data+end, size-end)==0 |
| 1660 | && !is_empty(data+end, size-end))) |
| 1661 | ){ |
| 1662 | /* empty line followed by non-quote line */ |
| 1663 | break; |
| 1664 | } |
| 1665 |