support attachments folder
| | |
| | | ## 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 |
| | |
| | | enableSiteMap: true, |
| | | enableRSS: true, |
| | | }), |
| | | Plugin.Assets(), |
| | | Plugin.Assets({ attachmentsFolder: "attachments" }), |
| | | Plugin.Static(), |
| | | ], |
| | | }, |
| | |
| | | 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 [] |
| | |
| | | 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 |
| | |
| | | |
| | | return fps |
| | | }, |
| | | }) |
| | | } |
| | | } |
| | |
| | | |
| | | 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) |
| | | |