Fix quadratic performance issue in list numbering.
This commit is contained in:
Родитель
f7e31f8d7a
Коммит
763587e877
|
@ -231,19 +231,15 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|||
LIT("<!-- end list -->");
|
||||
BLANKLINE();
|
||||
}
|
||||
renderer->list_number = cmark_node_get_list_start(node);
|
||||
break;
|
||||
|
||||
case CMARK_NODE_ITEM:
|
||||
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
|
||||
marker_width = 4;
|
||||
} else {
|
||||
list_number = cmark_node_get_list_start(node->parent);
|
||||
list_number = renderer->list_number++;
|
||||
list_delim = cmark_node_get_list_delim(node->parent);
|
||||
tmp = node;
|
||||
while (tmp->prev) {
|
||||
tmp = tmp->prev;
|
||||
list_number += 1;
|
||||
}
|
||||
// we ensure a width of at least 4 so
|
||||
// we get nice transition from single digits
|
||||
// to double
|
||||
|
|
|
@ -114,6 +114,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|||
break;
|
||||
|
||||
case CMARK_NODE_LIST:
|
||||
renderer->list_number = cmark_node_get_list_start(node);
|
||||
break;
|
||||
|
||||
case CMARK_NODE_ITEM:
|
||||
|
@ -123,12 +124,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|||
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
|
||||
LIT("\\[bu] 2");
|
||||
} else {
|
||||
list_number = cmark_node_get_list_start(node->parent);
|
||||
tmp = node;
|
||||
while (tmp->prev) {
|
||||
tmp = tmp->prev;
|
||||
list_number += 1;
|
||||
}
|
||||
list_number = renderer->list_number++;
|
||||
char list_number_s[LIST_NUMBER_SIZE];
|
||||
snprintf(list_number_s, LIST_NUMBER_SIZE, "\"%d.\" 4", list_number);
|
||||
LIT(list_number_s);
|
||||
|
|
|
@ -76,19 +76,15 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
|
|||
node->next->type == CMARK_NODE_LIST)) {
|
||||
CR();
|
||||
}
|
||||
renderer->list_number = cmark_node_get_list_start(node);
|
||||
break;
|
||||
|
||||
case CMARK_NODE_ITEM:
|
||||
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
|
||||
marker_width = 4;
|
||||
} else {
|
||||
list_number = cmark_node_get_list_start(node->parent);
|
||||
list_number = renderer->list_number++;
|
||||
list_delim = cmark_node_get_list_delim(node->parent);
|
||||
tmp = node;
|
||||
while (tmp->prev) {
|
||||
tmp = tmp->prev;
|
||||
list_number += 1;
|
||||
}
|
||||
// we ensure a width of at least 4 so
|
||||
// we get nice transition from single digits
|
||||
// to double
|
||||
|
|
|
@ -177,8 +177,8 @@ char *cmark_render(cmark_mem *mem, cmark_node *root, int options, int width,
|
|||
|
||||
cmark_renderer renderer = {mem, &buf, &pref, 0, width,
|
||||
0, 0, true, true, false,
|
||||
false, outc, S_cr, S_blankline, S_out,
|
||||
0};
|
||||
false, 0, outc, S_cr, S_blankline,
|
||||
S_out, 0};
|
||||
|
||||
while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
|
||||
cur = cmark_iter_get_node(iter);
|
||||
|
|
|
@ -23,6 +23,7 @@ struct cmark_renderer {
|
|||
bool begin_content;
|
||||
bool no_linebreaks;
|
||||
bool in_tight_list_item;
|
||||
int list_number;
|
||||
void (*outc)(struct cmark_renderer *, cmark_node *, cmark_escaping, int32_t, unsigned char);
|
||||
void (*cr)(struct cmark_renderer *);
|
||||
void (*blankline)(struct cmark_renderer *);
|
||||
|
|
Загрузка…
Ссылка в новой задаче