diff --git a/quartz.config.ts b/quartz.config.ts index e8246a236..fabf47309 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -11,6 +11,7 @@ export default buildQuartz({ }, plugins: { transformers: [ + new LinkProcessing(), new FrontMatter(), new GitHubFlavoredMarkdown(), new Katex(), @@ -18,7 +19,6 @@ export default buildQuartz({ 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() diff --git a/quartz/index.ts b/quartz/index.ts index 49eec2a7a..a65597a4d 100644 --- a/quartz/index.ts +++ b/quartz/index.ts @@ -59,7 +59,7 @@ export function buildQuartz(cfg: QuartzConfig) { 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) { diff --git a/quartz/path.ts b/quartz/path.ts index 8967d79e3..4127fc008 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -12,7 +12,6 @@ export function slugify(s: string): string { const slugParts: string = rawSlugSegments .map((segment) => slugSegment(segment)) .join(path.posix.sep) - // .replace(/index$/, '') .replace(/\/$/, '') return path.normalize(slugParts) + sluggedAnchor } diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 07a76b24a..04b26c61e 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -29,16 +29,16 @@ export class LinkProcessing extends QuartzTransformerPlugin { markdownPlugins(): PluggableList { return [[remarkWikiLink, { - pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw' + pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw', }]] } htmlPlugins(): PluggableList { return [() => { return (tree, file) => { - const curSlug = file.data.slug! + 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 @@ export class LinkProcessing extends QuartzTransformerPlugin { } } - // rewrite all links visit(tree, 'element', (node, _index, _parent) => { + // rewrite all links if ( node.tagName === 'a' && node.properties && @@ -60,14 +60,13 @@ export class LinkProcessing extends QuartzTransformerPlugin { 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) => { + // transform all images if ( node.tagName === 'img' && node.properties && @@ -75,7 +74,7 @@ export class LinkProcessing extends QuartzTransformerPlugin { ) { 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 } } }) diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index e6e734ed5..ec465ba29 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -8,7 +8,7 @@ import { ProcessedContent } from "../plugins/vfile" 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 @@ export async function emitContent(output: string, cfg: QuartzConfig, content: Pr // 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