parse_blockquote • handles parsing of a blockquote fragment */
| 1587 | |
| 1588 | /* parse_blockquote • handles parsing of a blockquote fragment */ |
| 1589 | static size_t |
| 1590 | parse_blockquote(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size) |
| 1591 | { |
| 1592 | size_t beg, end = 0, pre, work_size = 0; |
| 1593 | uint8_t *work_data = 0; |
| 1594 | hoedown_buffer *out = 0; |
| 1595 | |
| 1596 | out = newbuf(doc, BUFFER_BLOCK); |
| 1597 | beg = 0; |
| 1598 | while (beg < size) { |
| 1599 | for (end = beg + 1; end < size && data[end - 1] != '\n'; end++); |
| 1600 | |
| 1601 | pre = prefix_quote(data + beg, end - beg); |
| 1602 | |
| 1603 | if (pre) |
| 1604 | beg += pre; /* skipping prefix */ |
| 1605 | |
| 1606 | /* empty line followed by non-quote line */ |
| 1607 | else if (is_empty(data + beg, end - beg) && |
| 1608 | (end >= size || (prefix_quote(data + end, size - end) == 0 && |
| 1609 | !is_empty(data + end, size - end)))) |
| 1610 | break; |
| 1611 | |
| 1612 | if (beg < end) { /* copy into the in-place working buffer */ |
| 1613 | /* hoedown_buffer_put(work, data + beg, end - beg); */ |
| 1614 | if (!work_data) |
| 1615 | work_data = data + beg; |
| 1616 | else if (data + beg != work_data + work_size) |
| 1617 | memmove(work_data + work_size, data + beg, end - beg); |
| 1618 | work_size += end - beg; |
| 1619 | } |
| 1620 | beg = end; |
| 1621 | } |
| 1622 | |
| 1623 | parse_block(out, doc, work_data, work_size); |
| 1624 | if (doc->md.blockquote) |
| 1625 | doc->md.blockquote(ob, out, &doc->data); |
| 1626 | popbuf(doc, BUFFER_BLOCK); |
| 1627 | return end; |
| 1628 | } |
| 1629 | |
| 1630 | static size_t |
| 1631 | parse_htmlblock(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int do_render); |
no test coverage detected