#include "MarkdownContentParser.h" void MarkdownContentParser::run(const Path& path) { FileMetadata metadata; const auto lines = File(path).readLines(); bool metadata_finished = false; for (const auto& line : lines) { if (!metadata_finished) { const auto metadata = checkForMetadataItem(line); if (!metadata) { metadata_finished = true; mContentBody.push_back(line); } else { mMetadata[metadata->first] = metadata->second; } } else { mContentBody.push_back(line); } } } MarkdownContentParser::FileContentBody MarkdownContentParser::getContentBody() const { return mContentBody; } MarkdownContentParser::FileMetadata MarkdownContentParser::getFileMetadata() const { return mMetadata; } std::optional MarkdownContentParser::checkForMetadataItem(const std::string& line) const { unsigned char_count = 0; std::string prefix; std::string suffix; bool building_prefix = true; for (const auto c : line) { if (c == ':' && char_count > 0 && building_prefix) { building_prefix = false; } else if (building_prefix) { prefix += c; } else { suffix += c; } char_count++; } if (!prefix.empty() && !building_prefix) { return FileMetadataItem{ prefix, suffix }; } else { return std::nullopt; } }