Jacky Zhao
2023-05-31 3636c052eb054d93a8a3ddfb9fdd873d5fe83a5d
link processing
5 files modified
24 ■■■■ changed files
quartz.config.ts 2 ●●● patch | view | raw | blame | history
quartz/index.ts 2 ●●● patch | view | raw | blame | history
quartz/path.ts 1 ●●●● patch | view | raw | blame | history
quartz/plugins/transformers/links.ts 11 ●●●● patch | view | raw | blame | history
quartz/processors/emit.ts 8 ●●●● patch | view | raw | blame | history
quartz.config.ts
@@ -11,6 +11,7 @@
  },
  plugins: {
    transformers: [
      new LinkProcessing(),
      new FrontMatter(),
      new GitHubFlavoredMarkdown(),
      new Katex(),
@@ -18,7 +19,6 @@
      new CreatedModifiedDate({
        priority: ['frontmatter', 'filesystem'] // you can add 'git' here for last modified from Git but this makes the build slower
      }),
      new LinkProcessing()
    ],
    filters: [
      new RemoveDrafts()
quartz/index.ts
@@ -59,7 +59,7 @@
    const filePaths = fps.map(fp => `${argv.directory}${path.sep}${fp}`)
    const parsedFiles = await parseMarkdown(processor, argv.directory, filePaths, argv.verbose)
    const filteredContent = filterContent(cfg.plugins.filters, parsedFiles, argv.verbose)
    await emitContent(output, cfg, filteredContent, argv.verbose)
    await emitContent(argv.directory, output, cfg, filteredContent, argv.verbose)
    console.log(chalk.green(`Done in ${perf.timeSince()}`))
    if (argv.serve) {
quartz/path.ts
@@ -12,7 +12,6 @@
  const slugParts: string = rawSlugSegments
    .map((segment) => slugSegment(segment))
    .join(path.posix.sep)
    // .replace(/index$/, '')
    .replace(/\/$/, '')
  return path.normalize(slugParts) + sluggedAnchor
}
quartz/plugins/transformers/links.ts
@@ -29,7 +29,7 @@
  markdownPlugins(): PluggableList {
    return [[remarkWikiLink, {
      pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw'
      pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw',
    }]]
  }
@@ -38,7 +38,7 @@
      return (tree, file) => {
        const curSlug = file.data.slug! 
        const transformLink = (target: string) => {
          const targetSlug = slugify(decodeURI(target))
          const targetSlug = slugify(decodeURI(target).trim())
          if (this.opts.markdownLinkResolution === 'relative' && !path.isAbsolute(targetSlug)) {
            return './' + relative(curSlug, targetSlug)
          } else {
@@ -46,8 +46,8 @@
          }
        }
        // rewrite all links
        visit(tree, 'element', (node, _index, _parent) => {
          // rewrite all links
          if (
            node.tagName === 'a' &&
            node.properties &&
@@ -60,14 +60,13 @@
              node.properties.href = transformLink(node.properties.href)
            }
            // rewrite link internals if prettylinks is on
            if (this.opts.prettyLinks && node.children.length === 1 && node.children[0].type === 'text') {
              node.children[0].value = path.basename(node.children[0].value)
            }
          }
        })
        // transform all images
        visit(tree, 'element', (node, _index, _parent) => {
          if (
            node.tagName === 'img' &&
            node.properties &&
@@ -75,7 +74,7 @@
          ) {
            if (!isAbsoluteUrl(node.properties.src)) {
              const ext = path.extname(node.properties.src)
              node.properties.src = transformLink("/assets/" + node.properties.src) + ext
              node.properties.src = transformLink(path.join("assets", node.properties.src)) + ext
            }
          }
        })
quartz/processors/emit.ts
@@ -8,7 +8,7 @@
import { QUARTZ, slugify } from "../path"
import { globbyStream } from "globby"
export async function emitContent(output: string, cfg: QuartzConfig, content: ProcessedContent[], verbose: boolean) {
export async function emitContent(contentFolder: string, output: string, cfg: QuartzConfig, content: ProcessedContent[], verbose: boolean) {
  const perf = new PerfTimer()
@@ -39,11 +39,11 @@
  // glob all non MD/MDX/HTML files in content folder and copy it over
  const assetsPath = path.join("public", "assets")
  for await (const fp of globbyStream("**", {
    ignore: ["**/*.{md,mdx,html}"],
    cwd: "./content",
    ignore: ["**/*.md"],
    cwd: contentFolder,
  })) {
    const ext = path.extname(fp as string)
    const src = path.join("content", fp as string)
    const src = path.join(contentFolder, fp as string)
    const dest = path.join(assetsPath, slugify(fp as string) + ext)
    const dir = path.dirname(dest)
    await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists