UNPKG

@antora/assembler

Version:

An extension library for Antora that assembles content from multiple pages into a single AsciiDoc file to converted and publish.

47 lines (42 loc) 2.48 kB
'use strict' const loadConfig = require('./load-config') const produceAggregateDocuments = require('./produce-aggregate-documents') const PromiseQueue = require('./util/promise-queue') const runCommand = require('@antora/run-command-helper') async function assembleContent (playbook, contentCatalog, convertDocument, { siteCatalog, configSource }) { // Q: could we get ContentCatalog#getComponentVersionStartPage() in Antora core? if (typeof contentCatalog.getComponentVersionStartPage !== 'function') { contentCatalog.getComponentVersionStartPage = function (component, version) { return this.resolvePage('index.adoc', { component, version }) } } const assemblerConfig = await loadConfig(playbook, configSource) if (!assemblerConfig) return [] // TODO consider removing and doing this another way const generatorFunctions = this ? this.getFunctions() : {} const { loadAsciiDoc = require('@antora/asciidoc-loader') } = generatorFunctions const aggregateDocuments = produceAggregateDocuments(loadAsciiDoc, contentCatalog, assemblerConfig) if (!convertDocument) return aggregateDocuments const { publishSite: publishFiles = require('@antora/site-publisher') } = generatorFunctions const buildConfig = assemblerConfig.build await prepareWorkspace(publishFiles, aggregateDocuments, contentCatalog, buildConfig) // TODO: pass more information to convertDocument so it doesn't have to compute internal stuff // Q: don't we need to pass in the combined/resolved AsciiDoc attributes per file or component version? return new PromiseQueue({ concurrency: buildConfig.processLimit }) .add(aggregateDocuments.map((doc) => () => convertDocument.call(this, doc, buildConfig, runCommand))) .toPromise() .then((files) => { if (buildConfig.publish && siteCatalog) siteCatalog.addFiles(files) return files }) } // TODO: if no workspace dir is defined, we shouldn't continue function prepareWorkspace (publishFiles, aggregateDocuments, contentCatalog, buildConfig) { const { dir, clean, keepAggregateSource } = buildConfig const files = contentCatalog.findBy({ family: 'image' }).filter(({ out }) => out?.assembled) if (keepAggregateSource) { files.push(...aggregateDocuments.map((file) => Object.assign(file, { out: { path: file.path } }))) } // TODO: site publisher should accept a single catalog return publishFiles({ output: { clean, dir } }, [{ getFiles: () => files }]) } module.exports = assembleContent