vmarkdownconverter.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "vmarkdownconverter.h"
  2. #include <QRegularExpression>
  3. VMarkdownConverter::VMarkdownConverter()
  4. {
  5. hoedownHtmlFlags = (hoedown_html_flags)0;
  6. nestingLevel = 16;
  7. htmlRenderer = hoedown_html_renderer_new(hoedownHtmlFlags, nestingLevel);
  8. tocRenderer = hoedown_html_toc_renderer_new(nestingLevel);
  9. }
  10. VMarkdownConverter::~VMarkdownConverter()
  11. {
  12. if (htmlRenderer) {
  13. hoedown_html_renderer_free(htmlRenderer);
  14. }
  15. if (tocRenderer) {
  16. hoedown_html_renderer_free(tocRenderer);
  17. }
  18. }
  19. QString VMarkdownConverter::generateHtml(const QString &markdown, hoedown_extensions options)
  20. {
  21. if (markdown.isEmpty()) {
  22. return QString();
  23. }
  24. hoedown_document *document = hoedown_document_new(htmlRenderer, options,
  25. nestingLevel);
  26. QByteArray data = markdown.toUtf8();
  27. hoedown_buffer *outBuf = hoedown_buffer_new(data.size());
  28. hoedown_document_render(document, outBuf, (const uint8_t *)data.constData(), data.size());
  29. hoedown_document_free(document);
  30. QString html = QString::fromUtf8(hoedown_buffer_cstr(outBuf));
  31. hoedown_buffer_free(outBuf);
  32. return html;
  33. }
  34. QString VMarkdownConverter::generateHtml(const QString &markdown, hoedown_extensions options, QString &toc)
  35. {
  36. if (markdown.isEmpty()) {
  37. return QString();
  38. }
  39. QString html = generateHtml(markdown, options);
  40. QRegularExpression tocExp("<p>\\[TOC\\]<\\/p>", QRegularExpression::CaseInsensitiveOption);
  41. toc = generateToc(markdown, options);
  42. html.replace(tocExp, toc);
  43. return html;
  44. }
  45. static void processToc(QString &p_toc)
  46. {
  47. // Hoedown will add '\n'.
  48. p_toc.replace("\n", "");
  49. // Hoedown will translate `_` in title to `<em>`.
  50. p_toc.replace("<em>", "_");
  51. p_toc.replace("</em>", "_");
  52. }
  53. QString VMarkdownConverter::generateToc(const QString &markdown, hoedown_extensions options)
  54. {
  55. if (markdown.isEmpty()) {
  56. return QString();
  57. }
  58. hoedown_document *document = hoedown_document_new(tocRenderer, options, nestingLevel);
  59. QByteArray data = markdown.toUtf8();
  60. hoedown_buffer *outBuf = hoedown_buffer_new(16);
  61. hoedown_document_render(document, outBuf, (const uint8_t *)data.constData(), data.size());
  62. hoedown_document_free(document);
  63. QString toc = QString::fromUtf8(hoedown_buffer_cstr(outBuf));
  64. hoedown_buffer_free(outBuf);
  65. processToc(toc);
  66. return toc;
  67. }