// render markdown to HTML -- assumes UTF-8 encoding Error markdownToHTML(const std::string& markdownInput, const Extensions& extensions, const HTMLOptions& options, std::string* pHTMLOutput) { std::string input = markdownInput; boost::scoped_ptr<MathFilter> pMathFilter; if (extensions.ignoreMath) pMathFilter.reset(new MathFilter(&input, pHTMLOutput)); // setup input buffer SundownBuffer inputBuffer(input); if (!inputBuffer.allocated()) return allocationError(ERROR_LOCATION); // render table of contents if requested if (options.toc) { struct sd_callbacks htmlCallbacks; struct html_renderopt htmlOptions; ::sdhtml_toc_renderer(&htmlCallbacks, &htmlOptions); std::string tocOutput; Error error = renderMarkdown(inputBuffer, extensions, options.smartypants, &htmlCallbacks, &htmlOptions, &tocOutput); if (error) return error; pHTMLOutput->append("<div id=\"toc\">\n"); pHTMLOutput->append("<div id=\"toc_header\">Table of Contents</div>\n"); pHTMLOutput->append(tocOutput); pHTMLOutput->append("</div>\n"); pHTMLOutput->append("\n"); } // setup html renderer struct sd_callbacks htmlCallbacks; struct html_renderopt htmlOptions; int htmlRenderMode = 0; if (options.useXHTML) htmlRenderMode |= HTML_USE_XHTML; if (options.hardWrap) htmlRenderMode |= HTML_HARD_WRAP; if (options.toc) htmlRenderMode |= HTML_TOC; if (options.safelink) htmlRenderMode |= HTML_SAFELINK; if (options.skipHTML) htmlRenderMode |= HTML_SKIP_HTML; if (options.skipStyle) htmlRenderMode |= HTML_SKIP_STYLE; if (options.skipImages) htmlRenderMode |= HTML_SKIP_IMAGES; if (options.skipLinks) htmlRenderMode |= HTML_SKIP_LINKS; if (options.escape) htmlRenderMode |= HTML_ESCAPE; ::sdhtml_renderer(&htmlCallbacks, &htmlOptions, htmlRenderMode); // render page std::string output; Error error = renderMarkdown(inputBuffer, extensions, options.smartypants, &htmlCallbacks, &htmlOptions, &output); if (error) return error; // append output and return success pHTMLOutput->append(output); return Success(); }
// render markdown to HTML -- assumes UTF-8 encoding Error markdownToHTML(const std::string& markdownInput, const Extensions& extensions, const HTMLOptions& options, std::string* pHTMLOutput) { // exclude fenced code blocks std::vector<ExcludePattern> excludePatterns; excludePatterns.push_back(ExcludePattern(boost::regex("^`{3,}[^\\n]*?$"), boost::regex("^`{3,}\\s*$"))); // exclude inline verbatim code excludePatterns.push_back(ExcludePattern(boost::regex("`[^\\n]+?`"))); // exclude indented code blocks excludePatterns.push_back(ExcludePattern( boost::regex("(\\A|\\A\\s*\\n|\\n\\s*\\n)(( {4}|\\t)[^\\n]*\\n)*(( {4}|\\t)[^\\n]*)"))); std::string input = markdownInput; boost::scoped_ptr<MathJaxFilter> pMathFilter; if (extensions.ignoreMath) { pMathFilter.reset(new MathJaxFilter(excludePatterns, &input, pHTMLOutput)); } // setup input buffer SundownBuffer inputBuffer(input); if (!inputBuffer.allocated()) return allocationError(ERROR_LOCATION); // render table of contents if requested if (options.toc) { struct sd_callbacks htmlCallbacks; struct html_renderopt htmlOptions; ::sdhtml_toc_renderer(&htmlCallbacks, &htmlOptions); std::string tocOutput; Error error = renderMarkdown(inputBuffer, extensions, options.smartypants, &htmlCallbacks, &htmlOptions, &tocOutput); if (error) return error; pHTMLOutput->append("<div id=\"toc\">\n"); pHTMLOutput->append("<div id=\"toc_header\">Table of Contents</div>\n"); pHTMLOutput->append(tocOutput); pHTMLOutput->append("</div>\n"); pHTMLOutput->append("\n"); } // setup html renderer struct sd_callbacks htmlCallbacks; struct html_renderopt htmlOptions; int htmlRenderMode = 0; if (options.useXHTML) htmlRenderMode |= HTML_USE_XHTML; if (options.hardWrap) htmlRenderMode |= HTML_HARD_WRAP; if (options.toc) htmlRenderMode |= HTML_TOC; if (options.safelink) htmlRenderMode |= HTML_SAFELINK; if (options.skipHTML) htmlRenderMode |= HTML_SKIP_HTML; if (options.skipStyle) htmlRenderMode |= HTML_SKIP_STYLE; if (options.skipImages) htmlRenderMode |= HTML_SKIP_IMAGES; if (options.skipLinks) htmlRenderMode |= HTML_SKIP_LINKS; if (options.escape) htmlRenderMode |= HTML_ESCAPE; ::sdhtml_renderer(&htmlCallbacks, &htmlOptions, htmlRenderMode); // render page std::string output; Error error = renderMarkdown(inputBuffer, extensions, options.smartypants, &htmlCallbacks, &htmlOptions, &output); if (error) return error; // append output and return success pHTMLOutput->append(output); return Success(); }