LibreWeb-Browser/src/md-parser.cc

85 lines
2.1 KiB
C++
Raw Normal View History

2020-11-16 10:31:58 -08:00
#include "md-parser.h"
2020-11-12 14:27:47 -08:00
#include <string>
2020-12-10 10:01:11 -08:00
#include <stdexcept>
#include <cmark-gfm-core-extensions.h>
2020-11-14 17:39:05 -08:00
#include <node.h>
#include <syntax_extension.h>
2020-12-10 10:01:11 -08:00
#include <filesystem>
2020-11-12 19:31:05 -08:00
2021-02-25 14:08:18 -08:00
static const int OPTIONS = CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE;
2020-12-14 10:40:08 -08:00
/// Meyers Singleton
2021-02-12 12:46:41 -08:00
Parser::Parser() = default;
2020-12-14 10:40:08 -08:00
/// Destructor
2021-02-12 12:46:41 -08:00
Parser::~Parser() = default;
2020-11-12 15:35:14 -08:00
2020-11-15 16:10:54 -08:00
/**
2020-12-14 10:40:08 -08:00
* \brief Get singleton instance
* \return Helper reference (singleton)
2020-11-15 16:10:54 -08:00
*/
2021-02-12 12:46:41 -08:00
Parser &Parser::getInstance()
{
static Parser instance;
return instance;
2020-11-15 16:10:54 -08:00
}
2020-12-04 17:51:40 -08:00
/**
* Parse markdown file from string content.
* Note: Do not forgot to execute: cmark_node_free(document); when you are done with the doc.
2020-12-04 17:51:40 -08:00
* @return AST structure (of type cmark_node)
*/
2021-02-12 12:46:41 -08:00
cmark_node *Parser::parseContent(const std::string &content)
{
const char *data = content.c_str();
cmark_gfm_core_extensions_ensure_registered();
// Modified version of cmark_parse_document() in blocks.c
cmark_parser *parser = cmark_parser_new(OPTIONS);
cmark_node *document;
// Add extensions
addMarkdownExtension(parser, "strikethrough");
2021-02-26 14:13:24 -08:00
addMarkdownExtension(parser, "highlight");
addMarkdownExtension(parser, "superscript");
addMarkdownExtension(parser, "subscript");
2021-02-26 14:16:25 -08:00
//addMarkdownExtension(parser, "table");
cmark_parser_feed(parser, data, strlen(data));
document = cmark_parser_finish(parser);
cmark_parser_free(parser);
return document;
}
2020-12-04 17:51:40 -08:00
/**
* Built-in cmark parser to HTML
*/
2020-11-29 18:54:21 -08:00
std::string const Parser::renderHTML(cmark_node *node)
2020-11-15 16:10:54 -08:00
{
2020-12-14 10:40:08 -08:00
char *tmp = cmark_render_html(node, OPTIONS, NULL);
2020-12-11 21:02:17 -08:00
std::string output = std::string(tmp);
free(tmp);
return output;
}
2021-03-05 09:13:06 -08:00
/**
* Built-in cmark parser to markdown (again)
*/
std::string const Parser::renderMarkdown(cmark_node *node)
{
char *tmp = cmark_render_commonmark(node, OPTIONS, 600);
std::string output = std::string(tmp);
free(tmp);
return output;
}
/**
* This is a function that will make enabling extensions easier
*/
2021-02-12 12:46:41 -08:00
void Parser::addMarkdownExtension(cmark_parser *parser, const char *extName)
{
cmark_syntax_extension *ext = cmark_find_syntax_extension(extName);
if (ext)
cmark_parser_attach_syntax_extension(parser, ext);
}