From 3ac6b42e16dca5a44ed3fec2c0314f1dbbc2322b Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sun, 16 Jul 2023 06:02:12 +0000
Subject: [PATCH] finish path refactoring, add sourcemap + better trace support

---
 quartz/plugins/transformers/ofm.ts |   40 +++++++++++++++++++++++++++++++---------
 1 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts
index 0e694d3..a7f8f59 100644
--- a/quartz/plugins/transformers/ofm.ts
+++ b/quartz/plugins/transformers/ofm.ts
@@ -2,7 +2,6 @@
 import { QuartzTransformerPlugin } from "../types"
 import { Root, HTML, BlockContent, DefinitionContent, Code } from 'mdast'
 import { findAndReplace } from "mdast-util-find-and-replace"
-import { slugify } from "../../path"
 import { slug as slugAnchor } from 'github-slugger'
 import rehypeRaw from "rehype-raw"
 import { visit } from "unist-util-visit"
@@ -10,8 +9,10 @@
 import { JSResource } from "../../resources"
 // @ts-ignore
 import calloutScript from "../../components/scripts/callout.inline.ts"
+import { FilePath, slugifyFilePath, transformInternalLink } from "../../path"
 
 export interface Options {
+  comments: boolean
   highlight: boolean
   wikilinks: boolean
   callouts: boolean
@@ -19,10 +20,11 @@
 }
 
 const defaultOptions: Options = {
+  comments: true,
   highlight: true,
   wikilinks: true,
   callouts: true,
-  mermaid: false,
+  mermaid: true,
 }
 
 const icons = {
@@ -101,11 +103,14 @@
 // ([^\[\]\|\#]+)   -> one or more non-special characters ([,],|, or #) (name)
 // (#[^\[\]\|\#]+)? -> # then one or more non-special characters (heading link)
 // (|[^\[\]\|\#]+)? -> | then one or more non-special characters (alias)
-const backlinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g")
+const wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g")
 
 // Match highlights 
 const highlightRegex = new RegExp(/==(.+)==/, "g")
 
+// Match comments 
+const commentRegex = new RegExp(/%%(.+)%%/, "g")
+
 // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts
 const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/)
 
@@ -117,7 +122,7 @@
       // pre-transform wikilinks (fix anchors to things that may contain illegal syntax e.g. codeblocks, latex)
       if (opts.wikilinks) {
         src = src.toString()
-        return src.replaceAll(backlinkRegex, (value, ...capture) => {
+        return src.replaceAll(wikilinkRegex, (value, ...capture) => {
           const [fp, rawHeader, rawAlias] = capture
           const anchor = rawHeader?.trim().slice(1)
           const displayAnchor = anchor ? `#${slugAnchor(anchor)}` : ""
@@ -133,15 +138,16 @@
       if (opts.wikilinks) {
         plugins.push(() => {
           return (tree: Root, _file) => {
-            findAndReplace(tree, backlinkRegex, (value: string, ...capture: string[]) => {
-              const [fp, rawHeader, rawAlias] = capture
+            findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => {
+              let [fp, rawHeader, rawAlias] = capture
+              fp = fp.trim()
               const anchor = rawHeader?.trim() ?? ""
               const alias = rawAlias?.slice(1).trim()
 
               // embed cases
               if (value.startsWith("!")) {
-                const ext = path.extname(fp).toLowerCase()
-                const url = slugify(fp.trim()) + ext
+                const ext: string | undefined = path.extname(fp).toLowerCase()
+                const url = slugifyFilePath(fp as FilePath) + ext
                 if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) {
                   const dims = alias ?? ""
                   let [width, height] = dims.split("x", 2)
@@ -171,12 +177,15 @@
                     type: 'html',
                     value: `<iframe src="${url}"></iframe>`
                   }
+                } else {
+                  // TODO: this is the node embed case
                 }
                 // otherwise, fall through to regular link
               }
 
               // internal link
-              const url = slugify(fp.trim() + anchor)
+              // const url = transformInternalLink(fp + anchor)
+              const url = fp + anchor
               return {
                 type: 'link',
                 url,
@@ -204,6 +213,19 @@
           }
         })
       }
+      
+      if (opts.comments) {
+        plugins.push(() => {
+          return (tree: Root, _file) => {
+            findAndReplace(tree, commentRegex, (_value: string, ..._capture: string[]) => {
+              return {
+                type: 'text',
+                value: ''
+              }
+            })
+          }
+        })
+      }
 
       if (opts.callouts) {
         plugins.push(() => {

--
Gitblit v1.10.0