diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index c8b6caed032b021e63b1e8e29e66391336776fa0..3a09699cee6ac33504c6e5ee24d9a2967cd2bd95 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -16,6 +16,11 @@ For a detailed view of what's changed, refer to the {url-repo}/commits[commit hi * cache default command on build config object in built-in converters (#113) * convert function is expected to cache default command on build config object if not already set (#113) +=== Fixed + +* prefer site URL over primary site URL when producing absolute URLs (#117) +* don't prepend site URL for imported resource (#117) + == 1.0.0-beta.6 (2025-09-17) === Added diff --git a/packages/assembler/lib/produce-assembly-file.js b/packages/assembler/lib/produce-assembly-file.js index c73c2df3276c7d5f502169df72b072efce7d1296..f8ad776de71ec65c29a9bef25db50cc6af001cfc 100644 --- a/packages/assembler/lib/produce-assembly-file.js +++ b/packages/assembler/lib/produce-assembly-file.js @@ -120,9 +120,9 @@ function mergeAsciiDoc ( const atBookRoot = atDocumentRoot && !level && assemblyModel.doctype === 'book' && (supportsParts = true) const hasItems = items.length > 0 const siteUrl = ((val) => { - if (!val || val === '/') return '' + if (!val) return return val.charAt(val.length - 1) === '/' ? val.slice(0, val.length - 1) : val - })(asciidocConfig.attributes['primary-site-url'] || asciidocConfig.attributes['site-url']) + })(asciidocConfig.attributes['site-url'] || asciidocConfig.attributes['primary-site-url']) const idSeparator = assemblyModel.xmlIds ? '-' : ':' const idScopeSeparator = idSeparator.repeat(3) const idCoordinateSeparator = idSeparator === '-' ? '----' : idSeparator @@ -403,9 +403,12 @@ function mergeAsciiDoc ( if (~hashIdx && !relativePart.endsWith('.adoc')) relativePart += '.adoc' } if (!isPage || ~relativePart.indexOf('@') || /:.*:/.test(relativePart)) { - if (siteUrl && (targetResource = contentCatalog.resolveResource(relativePart, page.src, 'page'))?.pub) { + if ( + siteUrl != null && + (targetResource = contentCatalog.resolveResource(relativePart, page.src, 'page'))?.pub + ) { text ||= targetResource.asciidoc?.xreftext || target - return `${siteUrl}${targetResource.pub.url.replace(/_/g, '{underscore}')}${fragment && '#' + fragment}[${text}]` + return `${targetResource.site?.url ? '' : siteUrl}${targetResource.pub.url.replace(/_/g, '{underscore}')}${fragment && '#' + fragment}[${text}]` } // TODO: handle unresolved resource better return m @@ -422,12 +425,12 @@ function mergeAsciiDoc ( const pageResourceRef = targetModule === 'ROOT' ? relativePart : `${targetModule}:${relativePart}` if (!(targetResource = pagesInOutline.get(pageResourceRef))) { if ( - siteUrl && + siteUrl != null && (targetResource = contentCatalog.resolvePage(pageResourceRef, page.src)) && targetResource.out ) { text ||= targetResource.asciidoc?.xreftext || target - return `${siteUrl}${targetResource.pub.url}${fragment && '#' + fragment}[${text}]` + return `${targetResource.site?.url ? '' : siteUrl}${targetResource.pub.url}${fragment && '#' + fragment}[${text}]` } // TODO: handle unresolved page better return m @@ -443,7 +446,7 @@ function mergeAsciiDoc ( if (~line.indexOf('link:{attachmentsdir}/')) { line = line.replace(/(? { const attachment = - siteUrl && + siteUrl != null && contentCatalog.getById({ component: componentVersion.name, version: componentVersion.version, @@ -452,7 +455,9 @@ function mergeAsciiDoc ( relative, }) // TODO: handle unresolved attachment page - return attachment?.out ? `${siteUrl}${attachment.pub.url.replace(/_/g, '{underscore}')}[${text}]` : m + return attachment?.out + ? `${attachment.site?.url ? '' : siteUrl}${attachment.pub.url.replace(/_/g, '{underscore}')}[${text}]` + : m }) } if (~line.indexOf('image:') && !line.startsWith('image::')) { @@ -580,9 +585,10 @@ function mergeAsciiDoc ( let sectionTitle = navtitleAsciiDoc if (urlType === 'external') { sectionTitle = `${url}[${navtitleAsciiDoc.replace(/\]/g, '\\]')}]` - } else if (urlType === 'internal' && !unresolved && siteUrl) { + } else if (urlType === 'internal' && !unresolved && siteUrl != null) { const resource = files.find((it) => it.pub.url === url) - if (resource) sectionTitle = `${siteUrl}${resource.pub.url}[${navtitleAsciiDoc.replace(/\]/g, '\\]')}]` + if (resource) + sectionTitle = `${resource.site?.url ? '' : siteUrl}${resource.pub.url}[${navtitleAsciiDoc.replace(/\]/g, '\\]')}]` } let hlevel = level + 1 if (hlevel > 6) { diff --git a/packages/assembler/test/scenarios/rewrite-page-links/data.yml b/packages/assembler/test/scenarios/rewrite-page-links/data.yml index 776ffabc08cfba714a8a0df39f7e10cef3d2d0e3..89afd9980b583a9f0d8afd5d73d2819e280d3ab0 100644 --- a/packages/assembler/test/scenarios/rewrite-page-links/data.yml +++ b/packages/assembler/test/scenarios/rewrite-page-links/data.yml @@ -22,7 +22,7 @@ files: Also see xref:other-module:the-page.adoc[]. - Go back to the site to see xref:other-component::index.adoc[]. + Go back to the site to see xref:other-component::index.adoc[] and xref:imported-component::index.adoc[Imported Page]. You won't be able to see xref:_unpublished.adoc[] since it is not published. - relative: the-page.adoc @@ -37,6 +37,10 @@ files: = Another Page content +- component: imported-component + relative: index.adoc + site: + url: https://docs.example.org - relative: _unpublished.adoc contents: |- = Unpublished Page @@ -45,4 +49,5 @@ files: assembler: asciidoc: attributes: + site-url: https://preview-docs.example.org primary-site-url: https://docs.example.org 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 51842d00b8ec904960fb54963fd8eefd60ee2e0b..f434cd2441ecd1607e0bd7770785571959594160 100644 --- a/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc +++ b/packages/assembler/test/scenarios/rewrite-page-links/expects/index.adoc @@ -38,7 +38,7 @@ This page follows the <>. Also see <>. -Go back to the site to see https://docs.example.org/other-component/index.html[Another Page]. +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]. You won't be able to see xref:_unpublished.adoc[] since it is not published. diff --git a/packages/test-harness/lib/load-scenario.js b/packages/test-harness/lib/load-scenario.js index 1307698626fd393cdf4571026aa4dcf98f3e1365..1308e46aefb197338586abaec7ece70c9365bf40 100644 --- a/packages/test-harness/lib/load-scenario.js +++ b/packages/test-harness/lib/load-scenario.js @@ -198,6 +198,11 @@ async function loadScenario (name, dirname) { : src.version && (latestVersionSegment == null ? src.version : latestVersionSegment) const file = createFile({ contents, src }, { versionSegment: resolvedVersionSegment, htmlUrlExtensionStyle }) if (asciidoc) file.asciidoc = asciidoc + if (src.site) { + delete file.out + file.pub = { url: (file.site = src.site).url + file.pub.url } + delete src.site + } return file }) const contentCatalog = new ContentCatalog(components, files, latestVersionSegment, htmlUrlExtensionStyle)