/* closed by a symbol not preceded by whitespace and not followed by symbol */ static size_t parse_emph1(struct buf *ob, struct render *rndr, char *data, size_t size, char c) { size_t i = 0, len; struct buf *work = 0; int r; if (!rndr->make.emphasis) return 0; /* skipping one symbol if coming from emph3 */ if (size > 1 && data[0] == c && data[1] == c) i = 1; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i >= size) return 0; if (i + 1 < size && data[i + 1] == c) { i += 1; continue; } if (data[i] == c && data[i - 1] != ' ' && data[i - 1] != '\t' && data[i - 1] != '\n') { work = new_work_buffer(rndr); parse_inline(work, rndr, data, i); r = rndr->make.emphasis(ob, work, c, rndr->make.opaque); release_work_buffer(rndr, work); return r ? i + 1 : 0; } } return 0; }
/* parse_emph2 • parsing single emphase */ static size_t parse_emph2(struct buf *ob, struct render *rndr, char *data, size_t size, char c) { int (*render_method)(struct buf *ob, struct buf *text, void *opaque); size_t i = 0, len; struct buf *work = 0; int r; render_method = (c == '~') ? rndr->make.strikethrough : rndr->make.double_emphasis; if (!render_method) return 0; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !isspace(data[i - 1])) { work = rndr_newbuf(rndr); parse_inline(work, rndr, data, i); r = render_method(ob, work, rndr->make.opaque); rndr_popbuf(rndr); return r ? i + 2 : 0; } i++; } return 0; }
/* closed by a symbol not preceded by whitespace and not followed by symbol */ static size_t parse_emph1(struct buf *ob, struct render *rndr, char *data, size_t size, char c) { size_t i = 0, len; struct buf *work = 0; int r; if (!rndr->make.emphasis) return 0; /* skipping one symbol if coming from emph3 */ if (size > 1 && data[0] == c && data[1] == c) i = 1; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i >= size) return 0; if (i + 1 < size && data[i + 1] == c) { i += 1; continue; } if (data[i] == c && !isspace(data[i - 1])) { if ((rndr->ext_flags & MKDEXT_LAX_EMPHASIS) == 0) { if (!(i + 1 == size || isspace(data[i + 1]) || ispunct(data[i + 1]))) continue; } work = rndr_newbuf(rndr); parse_inline(work, rndr, data, i); r = rndr->make.emphasis(ob, work, rndr->make.opaque); rndr_popbuf(rndr); return r ? i + 1 : 0; } } return 0; }
/* finds the first closing tag, and delegates to the other emph */ static size_t parse_emph3(struct buf *ob, struct render *rndr, char *data, size_t size, char c) { size_t i = 0, len; int r; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; /* skip whitespace preceded symbols */ if (data[i] != c || isspace(data[i - 1])) continue; if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->make.triple_emphasis) { /* triple symbol found */ struct buf *work = rndr_newbuf(rndr); parse_inline(work, rndr, data, i); r = rndr->make.triple_emphasis(ob, work, rndr->make.opaque); rndr_popbuf(rndr); return r ? i + 3 : 0; } else if (i + 1 < size && data[i + 1] == c) { /* double symbol found, handing over to emph1 */ len = parse_emph1(ob, rndr, data - 2, size + 2, c); if (!len) return 0; else return len - 2; } else { /* single symbol found, handing over to emph2 */ len = parse_emph2(ob, rndr, data - 1, size + 1, c); if (!len) return 0; else return len - 1; } } return 0; }
/* parse_emph2 • parsing single emphase */ static size_t parse_emph2(struct buf *ob, struct render *rndr, char *data, size_t size, char c) { size_t i = 0, len; struct buf *work = 0; int r; if (!rndr->make.double_emphasis) return 0; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i + 1 < size && data[i] == c && data[i + 1] == c && i && data[i - 1] != ' ' && data[i - 1] != '\t' && data[i - 1] != '\n') { work = new_work_buffer(rndr); parse_inline(work, rndr, data, i); r = rndr->make.double_emphasis(ob, work, c, rndr->make.opaque); release_work_buffer(rndr, work); return r ? i + 2 : 0; } i += 1; } return 0; }