| | |
| | | import { MarkdownContent, ProcessedContent } from "../plugins/vfile" |
| | | import { PerfTimer } from "../util/perf" |
| | | import { read } from "to-vfile" |
| | | import { FilePath, FullSlug, QUARTZ, slugifyFilePath } from "../util/path" |
| | | import { FilePath, QUARTZ, slugifyFilePath } from "../util/path" |
| | | import path from "path" |
| | | import workerpool, { Promise as WorkerPromise } from "workerpool" |
| | | import { QuartzLogger } from "../util/log" |
| | | import { trace } from "../util/trace" |
| | | import { BuildCtx } from "../util/ctx" |
| | | import { BuildCtx, WorkerSerializableBuildCtx } from "../util/ctx" |
| | | import chalk from "chalk" |
| | | |
| | | export type QuartzMdProcessor = Processor<MDRoot, MDRoot, MDRoot> |
| | | export type QuartzHtmlProcessor = Processor<undefined, MDRoot, HTMLRoot> |
| | |
| | | process.exit(1) |
| | | } |
| | | |
| | | const mdPromises: WorkerPromise<[MarkdownContent[], FullSlug[]]>[] = [] |
| | | for (const chunk of chunks(fps, CHUNK_SIZE)) { |
| | | mdPromises.push(pool.exec("parseMarkdown", [ctx.buildId, argv, chunk])) |
| | | const serializableCtx: WorkerSerializableBuildCtx = { |
| | | buildId: ctx.buildId, |
| | | argv: ctx.argv, |
| | | allSlugs: ctx.allSlugs, |
| | | allFiles: ctx.allFiles, |
| | | incremental: ctx.incremental, |
| | | } |
| | | const mdResults: [MarkdownContent[], FullSlug[]][] = |
| | | await WorkerPromise.all(mdPromises).catch(errorHandler) |
| | | |
| | | const childPromises: WorkerPromise<ProcessedContent[]>[] = [] |
| | | for (const [_, extraSlugs] of mdResults) { |
| | | ctx.allSlugs.push(...extraSlugs) |
| | | const textToMarkdownPromises: WorkerPromise<MarkdownContent[]>[] = [] |
| | | let processedFiles = 0 |
| | | for (const chunk of chunks(fps, CHUNK_SIZE)) { |
| | | textToMarkdownPromises.push(pool.exec("parseMarkdown", [serializableCtx, chunk])) |
| | | } |
| | | |
| | | const mdResults: Array<MarkdownContent[]> = await Promise.all( |
| | | textToMarkdownPromises.map(async (promise) => { |
| | | const result = await promise |
| | | processedFiles += result.length |
| | | log.updateText(`text->markdown ${chalk.gray(`${processedFiles}/${fps.length}`)}`) |
| | | return result |
| | | }), |
| | | ).catch(errorHandler) |
| | | |
| | | const markdownToHtmlPromises: WorkerPromise<ProcessedContent[]>[] = [] |
| | | processedFiles = 0 |
| | | for (const [mdChunk, _] of mdResults) { |
| | | childPromises.push(pool.exec("processHtml", [ctx.buildId, argv, mdChunk, ctx.allSlugs])) |
| | | markdownToHtmlPromises.push(pool.exec("processHtml", [serializableCtx, mdChunk])) |
| | | } |
| | | const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch(errorHandler) |
| | | const results: ProcessedContent[][] = await Promise.all( |
| | | markdownToHtmlPromises.map(async (promise) => { |
| | | const result = await promise |
| | | processedFiles += result.length |
| | | log.updateText(`markdown->html ${chalk.gray(`${processedFiles}/${fps.length}`)}`) |
| | | return result |
| | | }), |
| | | ).catch(errorHandler) |
| | | |
| | | res = results.flat() |
| | | await pool.terminate() |