mirror of
https://github.com/TakeV-Lambda/dino.git
synced 2024-09-28 13:42:59 +00:00
Improve code block regex
This commit is contained in:
parent
447b5ad54a
commit
65039b4c23
|
@ -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[]{"`", "_", "*", "~"};
|
||||
|
|
Loading…
Reference in a new issue