ext/redcarpet/markdown.c in redcarpet-1.13.0 vs ext/redcarpet/markdown.c in redcarpet-1.13.1

- old
+ new

@@ -1098,10 +1098,30 @@ } return i + 1; } +/* is_atxheader • returns whether the line is a hash-prefixed header */ +static int +is_atxheader(struct render *rndr, char *data, size_t size) +{ + if (data[0] != '#') + return 0; + + if (rndr->ext_flags & MKDEXT_SPACE_HEADERS) { + size_t level = 0; + + while (level < size && level < 6 && data[level] == '#') + level++; + + if (level < size && data[level] != ' ' && data[level] != '\t') + return 0; + } + + return 1; +} + /* is_headerline • returns whether the line is a setext-style hdr underline */ static int is_headerline(char *data, size_t size) { size_t i = 0; @@ -1246,11 +1266,11 @@ end = i; break; } } - if (data[i] == '#' || is_hrule(data + i, size - i)) { + if (is_atxheader(rndr, data + i, size - i) || is_hrule(data + i, size - i)) { end = i; break; } i = end; @@ -1530,21 +1550,17 @@ rndr->make.list(ob, work, flags, rndr->make.opaque); rndr_popbuf(rndr, BUFFER_BLOCK); return i; } - /* parse_atxheader • parsing of atx-style headers */ static size_t parse_atxheader(struct buf *ob, struct render *rndr, char *data, size_t size) { size_t level = 0; size_t i, end, skip; - if (!size || data[0] != '#') - return 0; - while (level < size && level < 6 && data[level] == '#') level++; for (i = level; i < size && (data[i] == ' ' || data[i] == '\t'); i++); @@ -1885,10 +1901,10 @@ while (beg < size) { txt_data = data + beg; end = size - beg; - if (data[beg] == '#') + if (is_atxheader(rndr, txt_data, end)) beg += parse_atxheader(ob, rndr, txt_data, end); else if (data[beg] == '<' && rndr->make.blockhtml && (i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0) beg += i;