Striven
yesterday c538c151c7462ad0395ff2c15c5e11e89e362aa8
quartz/processors/parse.ts
@@ -7,12 +7,13 @@
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 { styleText } from "util"
export type QuartzMdProcessor = Processor<MDRoot, MDRoot, MDRoot>
export type QuartzHtmlProcessor = Processor<undefined, MDRoot, HTMLRoot>
@@ -171,25 +172,46 @@
      workerType: "thread",
    })
    const errorHandler = (err: any) => {
      console.error(`${err}`.replace(/^error:\s*/i, ""))
      console.error(err)
      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]))
    }
    for (const [mdChunk, _] of mdResults) {
      childPromises.push(pool.exec("processHtml", [ctx.buildId, argv, mdChunk, ctx.allSlugs]))
    const mdResults: Array<MarkdownContent[]> = await Promise.all(
      textToMarkdownPromises.map(async (promise) => {
        const result = await promise
        processedFiles += result.length
        log.updateText(`text->markdown ${styleText("gray", `${processedFiles}/${fps.length}`)}`)
        return result
      }),
    ).catch(errorHandler)
    const markdownToHtmlPromises: WorkerPromise<ProcessedContent[]>[] = []
    processedFiles = 0
    for (const mdChunk of mdResults) {
      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 ${styleText("gray", `${processedFiles}/${fps.length}`)}`)
        return result
      }),
    ).catch(errorHandler)
    res = results.flat()
    await pool.terminate()