"
+ " | "
+ ""
+ ""
+ );
+ if (rc < 0) { warn("dpi_send_header"); close(fd); return 0; }
+ rc = lseek(note_fd, 0, SEEK_SET);
+ if (rc < 0) {
+ rc = dprintf(fd, "\nError: %s", strerror(errno));
+ if (rc < 0) warnx("dprintf");
+ close(fd);
+ }
+ char *text = read_full(note_fd);
+ if (text == NULL) {
+ rc = dprintf(fd, "\nError: %s", strerror(errno));
+ if (rc < 0) warnx("dprintf");
+ close(fd);
+ }
+
+ struct sd_callbacks callbacks;
+ struct html_renderopt options;
+ struct sd_markdown *markdown;
+ struct buf *ob = bufnew(128);
+ sdhtml_renderer(&callbacks, &options, HTML_ESCAPE);
+ callbacks.link = md_rndr_link;
+ callbacks.autolink = md_rndr_autolink;
+ static const unsigned int extensions =
+ MKDEXT_NO_INTRA_EMPHASIS |
+ MKDEXT_TABLES |
+ MKDEXT_FENCED_CODE |
+ MKDEXT_AUTOLINK |
+ MKDEXT_STRIKETHROUGH |
+ MKDEXT_SPACE_HEADERS |
+ MKDEXT_LAX_SPACING;
+ markdown = sd_markdown_new(extensions, 16, &callbacks, &options);
+ sd_markdown_render(ob, (unsigned char *)text, strlen(text), markdown);
+ free(text);
+ sd_markdown_free(markdown);
+ rc = write_all(fd, ob->data, ob->size);
+ if (rc < 0) warn("write_all");
+ bufrelease(ob);
+ rc = dprintf(fd, " |
");
+ if (rc < 0) warn("dprintf");
+
+ rc = dprintf(fd, " | ");
+ if (rc < 0) warn("dprintf");
+ struct zet_search zs;
+ bool first = true;
+ rc = zet_search_start(&zs, id);
+ if (rc < 0) warn("zet_search_start");
+ do {
+ const char *result_id;
+ rc = zet_search_next(&zs, &result_id);
+ if (rc < 0) warn("zet_search_next");
+ if (result_id == NULL) break;
+ if (first) {
+ first = false;
+ rc = dprintf(fd, "Backlinks:");
+ if (rc < 0) warn("dprintf");
+ }
+ char title_buf[128];
+ char *result_title = zet_get_title(result_id, title_buf, sizeof(title_buf));
+ if (result_title == NULL) {
+ warn("zet_get_title");
+ result_title = title_buf;
+ strncpy(result_title, result_id, sizeof(result_title)-1);
+ result_title[sizeof(result_title)-1] = '\0';
+ return 0;
+ }
+ rc = dprintf(fd, "- ", result_id);
+ rc |= write_html(fd, result_title, strlen(result_title));
+ rc |= write_buf(fd, "
");
+ } while (1);
+ if (!first) (void)dprintf(fd, " ");
+ rc = dprintf(fd, " |
");
+ if (rc < 0) warn("dprintf");
+ (void)zet_search_close(&zs);
+
+ rc = dprintf(fd, "