From 9aa5b58359d04308100fa5688987316dd6a66375 Mon Sep 17 00:00:00 2001 From: Hisham Mahgoub Date: Mon, 1 Jun 2026 15:35:25 +0300 Subject: [PATCH 1/2] Fix link and image rules failing to match due to invalid POSIX regex escapes --- MarkdownTranslator.alusus | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MarkdownTranslator.alusus b/MarkdownTranslator.alusus index b0cc709..ded5ad9 100644 --- a/MarkdownTranslator.alusus +++ b/MarkdownTranslator.alusus @@ -255,7 +255,7 @@ class MarkdownTranslator [RegexType: type] { } }), // link - Rule("\\[([^\n\\x5D]*)\\]\\(([^()\n]+)\\)", closure(args: Array[String]) { + Rule("\\[([^]\n]*)\\]\\(([^()\n]+)\\)", closure(args: Array[String]) { if args(1) == "" args(1) = args(2); if this.elementStack.getLength() == 0 this.jumpToLevel(String("p"), 1, false); def target: CharsPtr = ""; @@ -269,7 +269,7 @@ class MarkdownTranslator [RegexType: type] { } }), // image - Rule("!\\[([^\n\\x5D]*)\\]\\(([^()\n]+)\\)", closure(args: Array[String]) { + Rule("!\\[([^]\n]*)\\]\\(([^()\n]+)\\)", closure(args: Array[String]) { if this.onHtmlTag.isNull() { this.output += String.format("", args(2).buf, args(1).buf); } else { @@ -328,7 +328,7 @@ class MarkdownTranslator [RegexType: type] { } }), // all chars - Rule("[^\n*\\\\`!\\x5B]+", closure(args: Array[String]) { + Rule("[^\n*\\\\`![]+", closure(args: Array[String]) { if this.elementStack.getLength() == 0 this.jumpToLevel(String("p"), 1, false); this.output += args(0); }), From 06744cc29528b999b82cfdc60fd16b4e0178ee6c Mon Sep 17 00:00:00 2001 From: Hisham Mahgoub Date: Tue, 9 Jun 2026 19:29:11 +0300 Subject: [PATCH 2/2] Fixed link rule to support URLs with parentheses and double-bracket text. --- MarkdownTranslator.alusus | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/MarkdownTranslator.alusus b/MarkdownTranslator.alusus index ded5ad9..2813b6c 100644 --- a/MarkdownTranslator.alusus +++ b/MarkdownTranslator.alusus @@ -254,8 +254,22 @@ class MarkdownTranslator [RegexType: type] { else this.output += str; } }), + // link with double brackets [[text]](url) + Rule("\\[\\[([^]\n]*)\\]\\]\\(([^ \t\n]+)\\)", closure(args: Array[String]) { + def linkText: String = String("[") + args(1) + String("]"); + if this.elementStack.getLength() == 0 this.jumpToLevel(String("p"), 1, false); + def target: CharsPtr = ""; + if this.linksInNewTab target = "target=\"_blank\"" + if this.onHtmlTag.isNull() { + this.output += String.format("%s", args(2).buf, target, linkText.buf); + } else { + def str: String = this.onHtmlTag("a", args(2), linkText); + if str != "" this.output += str + else this.output += String.format("%s", args(2).buf, target, linkText.buf); + } + }), // link - Rule("\\[([^]\n]*)\\]\\(([^()\n]+)\\)", closure(args: Array[String]) { + Rule("\\[([^]\n]*)\\]\\(([^ \t\n]+)\\)", closure(args: Array[String]) { if args(1) == "" args(1) = args(2); if this.elementStack.getLength() == 0 this.jumpToLevel(String("p"), 1, false); def target: CharsPtr = "";