static void toc_header(struct buf *ob, const struct buf *text, int level, void *opaque) { struct html_renderopt *options = opaque; if (level <= options->toc_data.nesting_level) { /* set the level offset if this is the first header * we're parsing for the document */ if (options->toc_data.current_level == 0) options->toc_data.level_offset = level - 1; level -= options->toc_data.level_offset; if (level > options->toc_data.current_level) { while (level > options->toc_data.current_level) { BUFPUTSL(ob, "<ul>\n<li>\n"); options->toc_data.current_level++; } } else if (level < options->toc_data.current_level) { BUFPUTSL(ob, "</li>\n"); while (level < options->toc_data.current_level) { BUFPUTSL(ob, "</ul>\n</li>\n"); options->toc_data.current_level--; } BUFPUTSL(ob,"<li>\n"); } else { BUFPUTSL(ob,"</li>\n<li>\n"); } bufprintf(ob, "<a href=\"#%s\">", header_anchor(text)); if (text) escape_html(ob, text->data, text->size); BUFPUTSL(ob, "</a>\n"); } }
static void rndr_header(struct buf *ob, const struct buf *text, int level, void *opaque) { struct html_renderopt *options = opaque; if (ob->size) bufputc(ob, '\n'); if ((options->flags & HTML_TOC) && (level <= options->toc_data.nesting_level)) bufprintf(ob, "<h%d id=\"%s\">", level, header_anchor(text)); else bufprintf(ob, "<h%d>", level); if (text) bufput(ob, text->data, text->size); bufprintf(ob, "</h%d>\n", level); }