| | |
| | | }, |
| | | plugins: { |
| | | transformers: [ |
| | | new LinkProcessing(), |
| | | new FrontMatter(), |
| | | new GitHubFlavoredMarkdown(), |
| | | new Katex(), |
| | |
| | | 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() |
| | |
| | | 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) { |
| | |
| | | const slugParts: string = rawSlugSegments |
| | | .map((segment) => slugSegment(segment)) |
| | | .join(path.posix.sep) |
| | | // .replace(/index$/, '') |
| | | .replace(/\/$/, '') |
| | | return path.normalize(slugParts) + sluggedAnchor |
| | | } |
| | |
| | | |
| | | markdownPlugins(): PluggableList { |
| | | return [[remarkWikiLink, { |
| | | pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw' |
| | | pathFormat: this.opts.markdownLinkResolution === "absolute" ? 'obsidian-absolute' : 'raw', |
| | | }]] |
| | | } |
| | | |
| | |
| | | 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 { |
| | |
| | | } |
| | | } |
| | | |
| | | // rewrite all links |
| | | visit(tree, 'element', (node, _index, _parent) => { |
| | | // rewrite all links |
| | | if ( |
| | | node.tagName === 'a' && |
| | | node.properties && |
| | |
| | | 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 && |
| | |
| | | ) { |
| | | 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 |
| | | } |
| | | } |
| | | }) |
| | |
| | | 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() |
| | | |
| | | |
| | |
| | | // 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 |