Jacky Zhao
2023-07-24 8fd75ffbfda30edd5a134a1fbf9b81ac3cebb2ff
support attachments folder
4 files modified
32 ■■■■ changed files
content/features/upcoming features.md 2 ●●●●● patch | view | raw | blame | history
quartz.config.ts 2 ●●● patch | view | raw | blame | history
quartz/plugins/emitters/assets.ts 27 ●●●● patch | view | raw | blame | history
quartz/processors/emit.ts 1 ●●●● patch | view | raw | blame | history
content/features/upcoming features.md
@@ -5,6 +5,8 @@
## high priority
- attachments path
- inspect bundle size generated by esbuild (it shouldnt be that high)
- component resources should be emitted by an emitter
- https://help.obsidian.md/Editing+and+formatting/Tags#Nested+tags nested tags??
- watch mode for config/source code
- https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax#Task+lists task list styling
quartz.config.ts
@@ -114,7 +114,7 @@
        enableSiteMap: true,
        enableRSS: true,
      }),
      Plugin.Assets(),
      Plugin.Assets({ attachmentsFolder: "attachments" }),
      Plugin.Static(),
    ],
  },
quartz/plugins/emitters/assets.ts
@@ -4,7 +4,18 @@
import path from "path"
import fs from "fs"
export const Assets: QuartzEmitterPlugin = () => ({
interface Options {
  attachmentsFolder: string | null
}
const defaultOptions: Options = {
  attachmentsFolder: null,
}
export const Assets: QuartzEmitterPlugin<Options> = (userOpts?: Options) => {
  const { attachmentsFolder } = { ...defaultOptions, ...userOpts }
  return {
  name: "Assets",
  getQuartzComponents() {
    return []
@@ -21,7 +32,16 @@
      const fp = rawFp as FilePath
      const ext = path.extname(fp)
      const src = path.join(argv.directory, fp) as FilePath
      const name = (slugifyFilePath(fp as FilePath) + ext) as FilePath
        let name = (slugifyFilePath(fp as FilePath) + ext) as FilePath
        if (attachmentsFolder) {
          const segments = name.split("/")
          if (segments.at(-2) === attachmentsFolder) {
            segments.splice(-2, 1)
            name = segments.join("/") as FilePath
          }
        }
      const dest = path.join(assetsPath, name) as FilePath
      const dir = path.dirname(dest) as FilePath
      await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists
@@ -31,4 +51,5 @@
    return fps
  },
})
  }
}
quartz/processors/emit.ts
@@ -86,7 +86,6 @@
export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) {
  const { argv, cfg } = ctx
  const contentFolder = argv.directory
  const perf = new PerfTimer()
  const log = new QuartzLogger(ctx.argv.verbose)