diff --git a/src/converters/to-asciidoc.ts b/src/converters/to-asciidoc.ts
index ca03ae6..78e082f 100644
--- a/src/converters/to-asciidoc.ts
+++ b/src/converters/to-asciidoc.ts
@@ -233,7 +233,7 @@ function normalizeDtag(text: string): string {
/**
* Processes wikilinks: [[target]] or [[target|display text]]
- * Converts to wikilink:dtag[display] format
+ * Converts to WIKILINK: placeholder format to protect from AsciiDoc processing
*/
function processWikilinks(content: string, linkBaseURL: string): string {
// Process bookstr macro wikilinks: [[book::...]]
@@ -243,12 +243,15 @@ function processWikilinks(content: string, linkBaseURL: string): string {
});
// Process standard wikilinks: [[Target Page]] or [[target page|see this]]
+ // Use placeholder format to prevent AsciiDoc from processing the brackets
content = content.replace(/\[\[([^|\]]+)(?:\|([^\]]+))?\]\]/g, (_match, target, displayText) => {
const cleanTarget = target.trim();
const cleanDisplay = displayText ? displayText.trim() : cleanTarget;
const dTag = normalizeDtag(cleanTarget);
- return `wikilink:${dTag}[${cleanDisplay}]`;
+ // Use placeholder format: WIKILINK:dtag|display
+ // This prevents AsciiDoc from interpreting the brackets
+ return `WIKILINK:${dTag}|${cleanDisplay}`;
});
return content;
diff --git a/src/processors/asciidoc.ts b/src/processors/asciidoc.ts
index 47a81ee..dfca98f 100644
--- a/src/processors/asciidoc.ts
+++ b/src/processors/asciidoc.ts
@@ -92,6 +92,7 @@ export async function processAsciidoc(
// Post-process HTML: convert macros to HTML, add styling, etc.
const processed = postProcessHtml(sanitized, {
enableMusicalNotation,
+ linkBaseURL: options.linkBaseURL,
});
// Process links: add target="_blank" to external links
@@ -103,6 +104,7 @@ export async function processAsciidoc(
const tocSanitized = sanitizeHTML(toc);
const tocProcessed = postProcessHtml(tocSanitized, {
enableMusicalNotation: false, // Don't process music in TOC
+ linkBaseURL: options.linkBaseURL,
});
// Process links in TOC as well
diff --git a/src/processors/html-postprocess.ts b/src/processors/html-postprocess.ts
index 79e1cbd..8b1f934 100644
--- a/src/processors/html-postprocess.ts
+++ b/src/processors/html-postprocess.ts
@@ -2,6 +2,7 @@ import { processMusicalNotation } from './music';
export interface PostProcessOptions {
enableMusicalNotation?: boolean;
+ linkBaseURL?: string;
}
/**
@@ -31,11 +32,23 @@ export function postProcessHtml(html: string, options: PostProcessOptions = {}):
return `${escapedDisplay}`;
});
- // Convert wikilink:dtag[display] format to HTML
- processed = processed.replace(/wikilink:([^[]+)\[([^\]]+)\]/g, (_match, dTag, displayText) => {
- const escapedDtag = dTag.replace(/"/g, '"');
- const escapedDisplay = displayText.replace(/"/g, '"');
- return `${displayText}`;
+ // Convert WIKILINK:dtag|display placeholder format to HTML
+ // Match WIKILINK:dtag|display, ensuring we don't match across HTML tags
+ processed = processed.replace(/WIKILINK:([^|<>]+)\|([^<>\s]+)/g, (_match, dTag, displayText) => {
+ const escapedDtag = dTag.trim().replace(/"/g, '"');
+ const escapedDisplay = displayText.trim()
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+
+ // Generate the proper URL using linkBaseURL if available
+ const url = options.linkBaseURL
+ ? `${options.linkBaseURL}/events?d=${escapedDtag}`
+ : `#${escapedDtag}`;
+
+ return `${escapedDisplay}`;
});
// Convert nostr: links to HTML