/* * Copyright (c) 2020, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Gemini { String Document::render_to_html() const { StringBuilder html_builder; html_builder.append("\n\n"); html_builder.append("\n"); html_builder.append(m_url.path()); html_builder.append("\n\n"); html_builder.append("\n"); for (auto& line : m_lines) { html_builder.append(line.render_to_html()); } html_builder.append(""); html_builder.append(""); return html_builder.build(); } NonnullRefPtr Document::parse(const StringView& lines, const URL& url) { auto document = adopt_ref(*new Document(url)); document->read_lines(lines); return document; } void Document::read_lines(const StringView& source) { auto close_list_if_needed = [&] { if (m_inside_unordered_list) { m_inside_unordered_list = false; m_lines.append(make(Control::UnorderedListEnd)); } }; for (auto& line : source.lines()) { if (line.starts_with("```")) { close_list_if_needed(); m_inside_preformatted_block = !m_inside_preformatted_block; if (m_inside_preformatted_block) { m_lines.append(make(Control::PreformattedStart)); } else { m_lines.append(make(Control::PreformattedEnd)); } continue; } if (m_inside_preformatted_block) { m_lines.append(make(move(line))); continue; } if (line.starts_with("*")) { if (!m_inside_unordered_list) m_lines.append(make(Control::UnorderedListStart)); m_lines.append(make(move(line))); m_inside_unordered_list = true; continue; } close_list_if_needed(); if (line.starts_with("=>")) { m_lines.append(make(move(line), *this)); continue; } if (line.starts_with("#")) { size_t level = 0; while (line.length() > level && line[level] == '#') ++level; m_lines.append(make(move(line), level)); continue; } m_lines.append(make(move(line))); } } }