aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/util
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2020-02-21 19:03:24 +0100
committerfiaxh <git@lightrise.org>2020-02-21 19:07:07 +0100
commit65039b4c23a0aa9a06805daeeb1c2c66d3e8e20d (patch)
tree0a068584633ea17d46c686a6657001a346762849 /main/src/ui/util
parent447b5ad54af5f58e401bd95a06020e1b8a4a1ffc (diff)
downloaddino-65039b4c23a0aa9a06805daeeb1c2c66d3e8e20d.tar.gz
dino-65039b4c23a0aa9a06805daeeb1c2c66d3e8e20d.zip
Improve code block regex
Diffstat (limited to 'main/src/ui/util')
-rw-r--r--main/src/ui/util/helper.vala33
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[]{"`", "_", "*", "~"};