1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-10 01:51:03 +09:00

LibMarkdown: Re-add support for Serenity's style code blocks extension

I decided to not use the text parser for this one and rely on a regex to
parse the style tags. This way it supports only and opening delimiter
run and also is much simpler.
This commit is contained in:
Peter Elliott 2021-09-11 01:37:28 -06:00 committed by Andreas Kling
parent 565b561522
commit 6ae1a80583
Notes: sideshowbarker 2024-07-18 04:10:32 +09:00
2 changed files with 32 additions and 3 deletions

View file

@ -7,6 +7,7 @@
#include <AK/StringBuilder.h>
#include <LibJS/MarkupGenerator.h>
#include <LibMarkdown/CodeBlock.h>
#include <LibRegex/Regex.h>
namespace Markdown {
@ -16,10 +17,15 @@ String CodeBlock::render_to_html() const
builder.append("<pre>");
if (m_style.length() >= 2)
builder.append("<strong>");
else if (m_style.length() >= 2)
builder.append("<em>");
if (m_language.is_empty())
builder.append("<code>");
else
builder.appendff("<code class=\"{}\">", escape_html_entities(m_language));
builder.appendff("<code class=\"language-{}\">", escape_html_entities(m_language));
if (m_language == "js")
builder.append(JS::MarkupGenerator::html_from_source(m_code));
@ -28,6 +34,11 @@ String CodeBlock::render_to_html() const
builder.append("\n</code>");
if (m_style.length() >= 2)
builder.append("</strong>");
else if (m_style.length() >= 2)
builder.append("</em>");
builder.append("</pre>\n");
return builder.build();
@ -43,6 +54,8 @@ String CodeBlock::render_for_terminal(size_t) const
return builder.build();
}
static Regex<ECMA262> style_spec_re("\\s*([\\*_]*)\\s*([^\\*_\\s]*).*");
OwnPtr<CodeBlock> CodeBlock::parse(Vector<StringView>::ConstIterator& lines)
{
if (lines.is_end())
@ -54,7 +67,21 @@ OwnPtr<CodeBlock> CodeBlock::parse(Vector<StringView>::ConstIterator& lines)
if (!line.starts_with(tick_tick_tick))
return {};
// Our Markdown extension: we allow
// specifying a style and a language
// for a code block, like so:
//
// ```**sh**
// $ echo hello friends!
// ````
//
// The code block will be made bold,
// and if possible syntax-highlighted
// as appropriate for a shell script.
StringView style_spec = line.substring_view(3, line.length() - 3);
auto matches = style_spec_re.match(style_spec);
auto style = matches.capture_group_matches[0][0].view.string_view();
auto language = matches.capture_group_matches[0][1].view.string_view();
++lines;
@ -74,7 +101,7 @@ OwnPtr<CodeBlock> CodeBlock::parse(Vector<StringView>::ConstIterator& lines)
first = false;
}
return make<CodeBlock>(style_spec, builder.build());
return make<CodeBlock>(language, style, builder.build());
}
}