2020-11-16 10:31:58 -08:00
|
|
|
#include "md-parser.h"
|
2020-11-12 14:27:47 -08:00
|
|
|
|
2020-11-13 20:22:56 -08:00
|
|
|
#include <string>
|
2020-12-10 10:01:11 -08:00
|
|
|
#include <stdexcept>
|
2020-11-13 10:45:34 -08:00
|
|
|
#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-11-13 10:45:34 -08:00
|
|
|
|
2020-12-04 17:51:40 -08:00
|
|
|
/**
|
2021-02-25 13:31:16 -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)
|
2020-12-04 16:29:39 -08:00
|
|
|
{
|
2021-02-25 13:31:16 -08:00
|
|
|
const char *data = content.c_str();
|
|
|
|
|
|
|
|
cmark_gfm_core_extensions_ensure_registered();
|
2020-12-04 16:29:39 -08:00
|
|
|
|
2021-02-25 13:31:16 -08:00
|
|
|
// Modified version of cmark_parse_document() in blocks.c
|
|
|
|
cmark_parser *parser = cmark_parser_new(OPTIONS);
|
|
|
|
cmark_node *document;
|
2020-12-04 16:29:39 -08:00
|
|
|
// Add extensions
|
2021-02-25 13:31:16 -08:00
|
|
|
addMarkdownExtension(parser, "strikethrough");
|
2021-02-26 14:13:24 -08:00
|
|
|
addMarkdownExtension(parser, "highlight");
|
2021-03-04 16:18:42 -08:00
|
|
|
addMarkdownExtension(parser, "superscript");
|
|
|
|
addMarkdownExtension(parser, "subscript");
|
2021-02-26 14:16:25 -08:00
|
|
|
//addMarkdownExtension(parser, "table");
|
2020-12-04 16:29:39 -08:00
|
|
|
|
2021-02-25 13:31:16 -08:00
|
|
|
cmark_parser_feed(parser, data, strlen(data));
|
|
|
|
document = cmark_parser_finish(parser);
|
|
|
|
cmark_parser_free(parser);
|
|
|
|
return document;
|
2020-12-04 16:29:39 -08:00
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-11-15 20:46:05 -08:00
|
|
|
/**
|
|
|
|
* 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);
|
2020-11-15 20:46:05 -08:00
|
|
|
}
|