#ifndef MARKDOWN_TRANSLATOR_H #define MARKDOWN_TRANSLATOR_H #include #include #include #include class MarkdownTranslator { public: MarkdownTranslator(); ~MarkdownTranslator(); // Main translation function - takes markdown content and returns HTML std::string translate(const std::string& markdownContent); std::string processLine(const std::string& line); void addExternalMenuItem(const std::string& name, const std::string& link){ ExternalMenuItem menuItem{name, link}; externalMenuLinks.push_back(menuItem); } enum Theme { CARBON }; struct ExternalMenuItem{ std::string name; std::string link; }; std::vector externalMenuLinks; private: // Regex for various tags const std::string headerRegexStr{"^(#{1,6})\\s+(.*)$"}; const std::string boldRegexStr{"\\*\\*([^\\*]+)\\*\\*|__([^_]+)__"}; const std::string italicRegexStr{"\\*([^\\*]+)\\*|_([^_]+)_"}; const std::string linkRegexStr{"\\[([^\\]]+)\\]\\(([^\\)]+)\\)"}; const std::string imageRegexStr{"!\\[(.*?)\\]\\(([^\\s\"]+)(\\s+\"(.*?)\")?\\)"}; // Helper functions for different markdown elements void processMetadata(const std::vector& lines); std::string processHeaders(const std::string& line); std::string processBold(const std::string& text); std::string processItalic(const std::string& text); std::string processLinks(const std::string& text); std::string processParagraph(const std::string& text); std::string processSingleFigure(const std::string& text); std::string processFigureBlock(const std::vector& lines); std::string processCodeBlock(const std::string& language, const std::vector& lines); // Navigation and table of contents void prescanHeaders(std::stringstream& markdownStream); void generateSideBar(std::stringstream& output); std::string createAnchorId(const std::string& text); // Utility functions std::string getCurrentDateTime() { std::time_t now = std::time(nullptr); std::tm* localTime = std::localtime(&now); char buffer[80]; std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime); return std::string(buffer); } // HTML builders std::string buildHTMLHeader(const std::string& title){ return R"( )" + title + R"( )"; } std::string buildHTMLFooter(){ return R"( )"; } void setTheme(const Theme& theme){ switch(theme){ case Theme::CARBON: cssPath = "styles/carbon.css"; break; default: cssPath = "styles/carbon.css"; } } // Member variables std::string title; std::string cssPath{"styles/carbon.css"}; std::vector headers; // h1-6 enum ParseState { REGULAR, IN_FIGURE, IN_CODEBLOCK, IN_BLOCKQUOTE }; }; #endif // MARKDOWN_TRANSLATOR_H