diff options
Diffstat (limited to 'main/src/ui/util')
-rw-r--r-- | main/src/ui/util/helper.vala | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/main/src/ui/util/helper.vala b/main/src/ui/util/helper.vala index 807d94e3..6b095376 100644 --- a/main/src/ui/util/helper.vala +++ b/main/src/ui/util/helper.vala @@ -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[]{"`", "_", "*", "~"}; |