Fix quadratic performance issue in list numbering.

This commit is contained in:
Kevin Backhouse 2023-03-28 11:07:06 +01:00
Родитель f7e31f8d7a
Коммит 763587e877
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 9DD01852EE40366E
5 изменённых файлов: 9 добавлений и 20 удалений

Просмотреть файл

@ -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 *);