UNPKG

@antora/assembler

Version:

A JavaScript library that merges AsciiDoc content from multiple pages in an Antora site into assembly files and delegates to an exporter to convert those files to another format, such as PDF.

94 lines (85 loc) 3.75 kB
'use strict' function configure (context, ...args) { internalConfigure.apply(context, args) } function internalConfigure (converter, config = {}, providers = {}) { this.once('componentsRegistered', ({ contentCatalog, assemblerProfiles }) => { if (assemblerProfiles) return this.updateVariables({ assemblerProfiles: getAssemblerProfiles(contentCatalog) }) }) this.once('beforeProcess', ({ siteAsciiDocConfig }) => { siteAsciiDocConfig.keepSource = true }) this.once('navigationBuilt', async ({ playbook, contentCatalog }) => { const { assembleContent = require('./assemble-content'), ...assembleContentConfig } = providers assembleContentConfig.configSource ??= config.configFile await assembleContent.call(this, playbook, contentCatalog, converter, assembleContentConfig) }) } function getAssemblerProfiles (contentCatalog, assemblerProfiles = new Map()) { contentCatalog.getComponents().forEach((component) => { component.versions.forEach((componentVersion) => { const source = componentVersion.nav?.origin const assemblerConfig = getAssemblerConfigFromDescriptor(source?.descriptor) if (!assemblerConfig) return const componentVersionRef = `${componentVersion.version}@${componentVersion.name}` const filesByPath = componentVersion.files.reduce((accum, it) => accum.set(it.path, it), new Map()) const componentVersionProfiles = assemblerConfig.reduce((accum, entry) => { const data = {} const profile = entry.profile ?? undefined if (accum.has(profile)) return accum const nav = entry.nav Object.entries(entry).forEach(([key, val]) => { if (key === 'profile' || key === 'nav') return const camelKey = key.toLowerCase().replace(/[_-]([a-z0-9])/g, (_, l, idx) => (idx ? l.toUpperCase() : l)) data[camelKey] = val }) if (nav) { data.navFiles = (nav.length ? [...new Set(nav)] : nav).reduce((navFiles, path_) => { const navFile = filesByPath.get(path_) if (navFile) { navFiles.push(initNavFile(navFile, component.name, componentVersion.version, navFiles.length)) } else { ;(data.messages ??= []).push([ 'warn', { source }, `Could not resolve nav file for ${profile || '<default>'} profile in ${componentVersionRef}: ${path_}`, ]) } return navFiles }, []) } else if (!Object.keys(data).length) { return accum } return accum.set(profile, data) }, new Map()) assemblerProfiles.set(componentVersionRef, componentVersionProfiles) }) }) return assemblerProfiles } function getAssemblerConfigFromDescriptor (descriptor = {}) { const assemblerConfig = descriptor.ext?.assembler if (!assemblerConfig) return if (!Array.isArray(assemblerConfig)) return [assemblerConfig] if (assemblerConfig.length) return assemblerConfig } function initNavFile (file, component, version, index) { const src = Object.assign({}, file.src, { component, version, module: 'ROOT', family: 'nav' }) const filePathSegments = file.path.split('/') let relativeStartIdx = 0 if (filePathSegments[0] === 'modules') { relativeStartIdx += 1 if (filePathSegments.length > 2) { relativeStartIdx += 1 src.module = filePathSegments[1] if (filePathSegments.length > 3 && filePathSegments[2] === 'partials') { relativeStartIdx += 1 src.family = 'partial' } } } src.relative = filePathSegments.slice(relativeStartIdx).join('/') return Object.assign(new file.constructor(file), { nav: { index }, src }) } module.exports = configure