91 lines
2.6 KiB
JavaScript
91 lines
2.6 KiB
JavaScript
/**
|
||
* @typedef {import('unified').Processor} Processor
|
||
* @typedef {import('vfile').VFile} VFile
|
||
* @typedef {import('vfile').VFileCompatible} VFileCompatible
|
||
* @typedef {import('../compile.js').CompileOptions} CompileOptions
|
||
*/
|
||
|
||
import {createProcessor} from '../core.js'
|
||
import {md, mdx} from './extnames.js'
|
||
import {resolveFileAndOptions} from './resolve-file-and-options.js'
|
||
|
||
/**
|
||
* Create smart processors to handle different formats.
|
||
*
|
||
* @param {CompileOptions | null | undefined} [compileOptions]
|
||
* configuration.
|
||
* @return {{extnames: Array<string>, process: process, processSync: processSync}}
|
||
* Smart processor.
|
||
*/
|
||
export function createFormatAwareProcessors(compileOptions) {
|
||
const compileOptions_ = compileOptions || {}
|
||
const mdExtensions = compileOptions_.mdExtensions || md
|
||
const mdxExtensions = compileOptions_.mdxExtensions || mdx
|
||
/** @type {Processor} */
|
||
let cachedMarkdown
|
||
/** @type {Processor} */
|
||
let cachedMdx
|
||
|
||
return {
|
||
extnames:
|
||
compileOptions_.format === 'md'
|
||
? mdExtensions
|
||
: compileOptions_.format === 'mdx'
|
||
? mdxExtensions
|
||
: mdExtensions.concat(mdxExtensions),
|
||
process,
|
||
processSync
|
||
}
|
||
|
||
/**
|
||
* Smart processor.
|
||
*
|
||
* @param {VFileCompatible} vfileCompatible
|
||
* MDX or markdown document.
|
||
* @return {Promise<VFile>}
|
||
* File.
|
||
*/
|
||
function process(vfileCompatible) {
|
||
const {file, processor} = split(vfileCompatible)
|
||
return processor.process(file)
|
||
}
|
||
|
||
/**
|
||
* Sync smart processor.
|
||
*
|
||
* @param {VFileCompatible} vfileCompatible
|
||
* MDX or markdown document.
|
||
* @return {VFile}
|
||
* File.
|
||
*/
|
||
// C8 does not cover `.cjs` files (this is only used for the require hook,
|
||
// which has to be CJS).
|
||
/* c8 ignore next 4 */
|
||
function processSync(vfileCompatible) {
|
||
const {file, processor} = split(vfileCompatible)
|
||
return processor.processSync(file)
|
||
}
|
||
|
||
/**
|
||
* Make a full vfile from what’s given, and figure out which processor
|
||
* should be used for it.
|
||
* This caches processors (one for markdown and one for MDX) so that they do
|
||
* not have to be reconstructed for each file.
|
||
*
|
||
* @param {VFileCompatible} vfileCompatible
|
||
* MDX or markdown document.
|
||
* @return {{file: VFile, processor: Processor}}
|
||
* File and corresponding processor.
|
||
*/
|
||
function split(vfileCompatible) {
|
||
const {file, options} = resolveFileAndOptions(
|
||
vfileCompatible,
|
||
compileOptions_
|
||
)
|
||
const processor =
|
||
options.format === 'md'
|
||
? cachedMarkdown || (cachedMarkdown = createProcessor(options))
|
||
: cachedMdx || (cachedMdx = createProcessor(options))
|
||
return {file, processor}
|
||
}
|
||
}
|