parse_htmlblock • parsing of inline HTML block */
| 2108 | |
| 2109 | /* parse_htmlblock • parsing of inline HTML block */ |
| 2110 | static size_t |
| 2111 | parse_htmlblock(hoedown_buffer *ob, hoedown_document *doc, uint8_t *data, size_t size, int do_render) |
| 2112 | { |
| 2113 | hoedown_buffer work = { NULL, 0, 0, 0, NULL, NULL, NULL }; |
| 2114 | size_t i, j = 0, tag_len, tag_end; |
| 2115 | const char *curtag = NULL; |
| 2116 | |
| 2117 | work.data = data; |
| 2118 | |
| 2119 | /* identification of the opening tag */ |
| 2120 | if (size < 2 || data[0] != '<') |
| 2121 | return 0; |
| 2122 | |
| 2123 | i = 1; |
| 2124 | while (i < size && data[i] != '>' && data[i] != ' ') |
| 2125 | i++; |
| 2126 | |
| 2127 | if (i < size) |
| 2128 | curtag = hoedown_find_block_tag((char *)data + 1, (int)i - 1); |
| 2129 | |
| 2130 | /* handling of special cases */ |
| 2131 | if (!curtag) { |
| 2132 | |
| 2133 | /* HTML comment, laxist form */ |
| 2134 | if (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') { |
| 2135 | i = 5; |
| 2136 | |
| 2137 | while (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>')) |
| 2138 | i++; |
| 2139 | |
| 2140 | i++; |
| 2141 | |
| 2142 | if (i < size) |
| 2143 | j = is_empty(data + i, size - i); |
| 2144 | |
| 2145 | if (j) { |
| 2146 | work.size = i + j; |
| 2147 | if (do_render && doc->md.blockhtml) |
| 2148 | doc->md.blockhtml(ob, &work, &doc->data); |
| 2149 | return work.size; |
| 2150 | } |
| 2151 | } |
| 2152 | |
| 2153 | /* HR, which is the only self-closing block tag considered */ |
| 2154 | if (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) { |
| 2155 | i = 3; |
| 2156 | while (i < size && data[i] != '>') |
| 2157 | i++; |
| 2158 | |
| 2159 | if (i + 1 < size) { |
| 2160 | i++; |
| 2161 | j = is_empty(data + i, size - i); |
| 2162 | if (j) { |
| 2163 | work.size = i + j; |
| 2164 | if (do_render && doc->md.blockhtml) |
| 2165 | doc->md.blockhtml(ob, &work, &doc->data); |
| 2166 | return work.size; |
| 2167 | } |
no test coverage detected