diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 3bdd1cb587205bddb5e487e44b67153fda5a715a..a29fa52495265d30093c6d45692def2bfb8da8fd 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -13,6 +13,7 @@ For a detailed view of what's changed, refer to the {url-repo}/commits[commit hi === Fixed * integrate Asciidoctor log messages properly when jsonl formatter is not enabled (#133) +* escape module name in xref if it ends with pass or stem (#131) == 1.0.0-beta.10 (2025-10-17) diff --git a/packages/assembler/lib/produce-assembly-file.js b/packages/assembler/lib/produce-assembly-file.js index 650afec3f5ead18498bb34a616198ee6dce94313..5f1b6f4d131924f30622e94930b59a0bb2e5c449 100644 --- a/packages/assembler/lib/produce-assembly-file.js +++ b/packages/assembler/lib/produce-assembly-file.js @@ -406,7 +406,6 @@ function mergeAsciiDoc ( return m } if (fragment === resource.asciidoc.id) fragment = '' - const refid = generateId(resource.src, componentVersion, idCoordinateSeparator, idScopeSeparator, fragment).id if ( text && (assemblyModel.dropExplicitXrefText === 'always' || @@ -414,6 +413,14 @@ function mergeAsciiDoc ( ) { text = '' } + const refid = generateId( + resource.src, + componentVersion, + idCoordinateSeparator, + idScopeSeparator, + text.length > 0, + fragment + ).id return `xref:${refid}[${text}]` }) } @@ -566,7 +573,7 @@ function mergeAsciiDoc ( const resource = files.find((it) => it.pub.url === url) if (resource) { if (resource.src.family === 'page' && pagesInOutline.has(resource.pub.url)) { - const refid = generateId(resource.src, componentVersion, idCoordinateSeparator, idScopeSeparator).id + const refid = generateId(resource.src, componentVersion, idCoordinateSeparator, idScopeSeparator, true).id sectionTitle = `xref:${refid}[${navtitleAsciiDoc.replace(/\]/g, '\\]')}]` } else if (siteRoot) { sectionTitle = `${resolveLinkTarget(resource, siteRoot, pubRoot, linkRefStyle)}[${navtitleAsciiDoc.replace(/\]/g, '\\]')}]` @@ -807,11 +814,13 @@ function createResourceKey ({ component, version, module: mod, family, relative return `${version}@${component}:${mod === 'ROOT' ? '' : mod}:${family === 'page' ? '' : family + '$'}${relative}` } -function generateId ({ component, module: mod, relative }, componentVersion, coordinateSep, scopeSep, fragment) { +function generateId (componentSrc, componentVersion, coordinateSep, scopeSep, escapePass, fragment) { + let { component, module: mod, relative } = componentSrc let id = relative.replace(/\.adoc$/, '').replace(/[/.]/g, '-') if (component !== componentVersion.name) { id = [component, mod === 'ROOT' ? '' : mod, id].join(coordinateSep) } else if (mod !== 'ROOT') { + if (escapePass && coordinateSep === ':' && /(?:pass|stem)$/.test(mod)) mod = mod.replace(/(?:pass|stem)$/, '\\$&') id = mod + coordinateSep + id } else if (ReservedIdNames.includes(id)) { id += scopeSep diff --git a/packages/assembler/test/scenarios/rewrite-page-links/data.yml b/packages/assembler/test/scenarios/rewrite-page-links/data.yml index 555a65278d140c8202c8b5588d8f31f70856c1d8..696eba5f1157171f9a2595fa4d977e9d735a77b6 100644 --- a/packages/assembler/test/scenarios/rewrite-page-links/data.yml +++ b/packages/assembler/test/scenarios/rewrite-page-links/data.yml @@ -6,6 +6,7 @@ navigation: - content: xref:header.adoc[] - content: xref:the-page.adoc[] - content: xref:other-module:the-page.adoc[] + - content: xref:stem:index.adoc[] files: - relative: header.adoc contents: |- @@ -26,6 +27,7 @@ files: This page follows the xref:header.adoc[Header], which provides some xref:header.adoc#background[background]. Also see xref:other-module:the-page.adoc#top[]. + Or you can learn all about xref:stem:index.adoc[STEM]. Go back to the site to see xref:other-component::index.adoc[] and xref:imported-component::index.adoc[Imported Page]. @@ -39,6 +41,12 @@ files: = The Other Page content +- relative: index.adoc + module: stem + contents: |- + = STEM + + Learn all about it. - component: other-component relative: index.adoc contents: |- diff --git a/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc b/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc index 786991fa70b7c7c01d37dfddb0a0f17463157417..cad0ebb6e534b15b5fa645a7d7dbc6bea7a801bd 100644 --- a/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc +++ b/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc @@ -42,6 +42,7 @@ You are on xref:the-page[this page]. This page follows the xref:header:::[Header], which provides some xref:header:::background[background]. Also see xref:other-module:the-page[]. +Or you can learn all about xref:\stem:index[STEM]. Go back to the site to see https://preview-docs.example.org/other-component/index.html[Another Page] and https://docs.example.org/imported-component/index.html[Imported Page]. @@ -61,3 +62,16 @@ You have reached the end of xref:the-page[xrefstyle=full]. == The Other Page content + +:docname: index +:page-module: stem +:page-relative-src-path: index.adoc +:page-origin-url: https://github.com/acme/the-component +:page-origin-start-path: +:page-origin-refname: v1.0 +:page-origin-reftype: branch +:page-origin-refhash: a00000000000000000000000000000000000000z +[#stem:index] +== STEM + +Learn all about it.