Improve code block regex

This commit is contained in:
fiaxh 2020-02-21 19:03:24 +01:00
parent 447b5ad54a
commit 65039b4c23
1 changed files with 18 additions and 15 deletions

View File

@ -7,6 +7,7 @@ using Xmpp;
namespace Dino.Ui.Util {
private static Regex URL_REGEX;
private static Regex CODE_BLOCK_REGEX;
private static Map<unichar, unichar> MATCHING_CHARS;
private const unichar[] NON_TRAILING_CHARS = {'\'', '"', ',', '.', ';', '!', '?', '»', '”', '', '`', '~', '‽', ':', '>', '*', '_'};
private const string[] ALLOWED_SCHEMAS = {"http", "https", "ftp", "ftps", "irc", "ircs", "xmpp", "mailto", "sms", "smsto", "mms", "tel", "geo", "openpgp4fpr", "im", "news", "nntp", "sip", "ssh", "bitcoin", "sftp", "magnet", "vnc"};
@ -259,6 +260,13 @@ public static Regex get_url_regex() {
return URL_REGEX;
}
public static Regex get_code_block_regex() {
if (CODE_BLOCK_REGEX == null) {
CODE_BLOCK_REGEX = /(?:^|\n)(```([^\n]*)\n(?:[^\n]|\n[^`]|\n`[^`]|\n``[^`]|\n```[^\n])+\n```)(?:\n|$)/s;
}
return CODE_BLOCK_REGEX;
}
public static Map<unichar, unichar> get_matching_chars() {
if (MATCHING_CHARS == null) {
MATCHING_CHARS = new HashMap<unichar, unichar>();
@ -344,21 +352,16 @@ public static string parse_add_markup(string s_, string? highlight_word, bool pa
if (parse_text_markup) {
// Try to match preformatted code blocks first
try {
Regex regex = new Regex("(?:^|\n)(```(?:(?!\n\n|```)(?:.|\n))+(?:$|```|\n\n))");
MatchInfo match_info;
regex.match(s.down().strip(), 0, out match_info);
if (match_info.matches()) {
int start, end;
match_info.fetch_pos(1, out start, out end);
return parse_add_markup(s[0:start], highlight_word, parse_links, parse_text_markup, already_escaped) +
"<tt>" +
s[start:end] +
"</tt>" +
parse_add_markup(s[end:s.length], highlight_word, parse_links, parse_text_markup, already_escaped);
}
} catch (RegexError e) {
assert_not_reached();
MatchInfo code_block_match_info;
get_code_block_regex().match(s.down().strip(), 0, out code_block_match_info);
if (code_block_match_info.matches()) {
int start, end;
code_block_match_info.fetch_pos(1, out start, out end);
return parse_add_markup(s[0:start], highlight_word, parse_links, parse_text_markup, already_escaped) +
"<tt>" +
s[start:end] +
"</tt>" +
parse_add_markup(s[end:s.length], highlight_word, parse_links, parse_text_markup, already_escaped);
}
string[] markup_string = new string[]{"`", "_", "*", "~"};