link processing

This commit is contained in:
Jacky Zhao 2023-05-31 17:41:44 -04:00
parent 2d3b816c44
commit e5f95504e1
5 changed files with 13 additions and 15 deletions

View File

@ -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()

View File

@ -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) {

View File

@ -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
}

View File

@ -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
}
}
})

View File

@ -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