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;