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