Fossil SCM

In the markdown formatter, add support for fenced code blocks containing blank lines that are indented.

drh 2024-01-27 21:29 trunk
Commit 5a51d1b4df6a534f4edfec71bd1b4355f2b0ea8cd5b70e7bd9ab033caf379474
1 file changed +27 -2
+27 -2
--- src/markdown.c
+++ src/markdown.c
@@ -1617,23 +1617,48 @@
16171617
struct Blob *ob,
16181618
struct render *rndr,
16191619
char *data,
16201620
size_t size
16211621
){
1622
- size_t beg, end = 0, pre, work_size = 0;
1622
+ size_t beg, end = 0, pre, work_size = 0, nb, endFence = 0;
16231623
char *work_data = 0;
16241624
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
+ }
16251649
16261650
beg = 0;
16271651
while( beg<size ){
16281652
for(end=beg+1; end<size && data[end-1]!='\n'; end++);
16291653
pre = prefix_quote(data+beg, end-beg);
16301654
if( pre ){
16311655
beg += pre; /* skipping prefix */
16321656
}else if( is_empty(data+beg, end-beg)
16331657
&& (end>=size
1634
- || (prefix_quote(data+end, size-end)==0
1658
+ || (end>endFence
1659
+ && prefix_quote(data+end, size-end)==0
16351660
&& !is_empty(data+end, size-end)))
16361661
){
16371662
/* empty line followed by non-quote line */
16381663
break;
16391664
}
16401665
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button