| | |
| | | import calloutScript from "../../components/scripts/callout.inline.ts" |
| | | |
| | | export interface Options { |
| | | comments: boolean |
| | | highlight: boolean |
| | | wikilinks: boolean |
| | | callouts: boolean |
| | |
| | | } |
| | | |
| | | const defaultOptions: Options = { |
| | | comments: true, |
| | | highlight: true, |
| | | wikilinks: true, |
| | | callouts: true, |
| | | mermaid: false, |
| | | mermaid: true, |
| | | } |
| | | |
| | | const icons = { |
| | |
| | | // ([^\[\]\|\#]+) -> 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+)\]([+-]?)/) |
| | | |
| | |
| | | // 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)}` : "" |
| | |
| | | if (opts.wikilinks) { |
| | | plugins.push(() => { |
| | | return (tree: Root, _file) => { |
| | | findAndReplace(tree, backlinkRegex, (value: string, ...capture: string[]) => { |
| | | findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => { |
| | | const [fp, rawHeader, rawAlias] = capture |
| | | const anchor = rawHeader?.trim() ?? "" |
| | | const alias = rawAlias?.slice(1).trim() |
| | |
| | | } |
| | | }) |
| | | } |
| | | |
| | | 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(() => { |