mdrefine 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/CONTRIBUTING.md +21 -1
- package/README.md +1 -1
- package/dist/core/engine.js +12 -3
- package/dist/core/engine.js.map +1 -1
- package/dist/rules/blocks.js +39 -4
- package/dist/rules/blocks.js.map +1 -1
- package/dist/rules/dialects.js +11 -0
- package/dist/rules/dialects.js.map +1 -1
- package/dist/rules/links.js +9 -2
- package/dist/rules/links.js.map +1 -1
- package/dist/rules/style.js +78 -1
- package/dist/rules/style.js.map +1 -1
- package/dist/syntax/misread-lists.d.ts +31 -1
- package/dist/syntax/misread-lists.js +246 -5
- package/dist/syntax/misread-lists.js.map +1 -1
- package/dist/syntax/obsidian.js +10 -2
- package/dist/syntax/obsidian.js.map +1 -1
- package/docs/design.md +7 -4
- package/docs/obsidian.md +32 -0
- package/docs/quick-start.md +1 -1
- package/docs/rules.md +28 -14
- package/package.json +3 -1
package/dist/rules/links.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/rules/links.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { walk } from \"../syntax/walk.js\";\nimport type { Definition, FootnoteDefinition, Nodes } from \"mdast\";\nimport type { Document, Finding, Rule } from \"../core/types.js\";\nimport { range } from \"../syntax/parse.js\";\nimport { changesForgeHeading } from \"../workspace/heading-attributes.js\";\nimport { splitDestination } from \"../workspace/index.js\";\nimport { giteaPyLine, optionsSchema } from \"./style.js\";\n\n/**\n * What Gitea's `_.py` emphasis exception can see of a link destination: whether\n * it contains `_`, and whether its first `_` starts `_.py`. A delimiter earlier\n * on the line looks for the next `_` there.\n */\nfunction giteaUnderscores(destination: string): string {\n return `${destination.includes(\"_\")} ${/^[^_]*_\\.py/.test(destination)}`;\n}\nfunction destination(node: Nodes): string | undefined {\n if (node.type === \"wikiLink\") return node.target;\n if (node.type === \"link\" || node.type === \"image\" || node.type === \"definition\") return node.url;\n return undefined;\n}\n/** Locate an inline destination within a parsed link, retaining labels and optional titles. */\nfunction destinationRange(raw: string): [number, number] | undefined {\n let bracket = 0;\n let opening = -1;\n for (let i = raw.startsWith(\"!\") ? 1 : 0; i < raw.length; i++) {\n if (raw[i] === \"\\\\\") {\n i++;\n continue;\n }\n if (raw[i] === \"[\") bracket++;\n if (raw[i] === \"]\" && --bracket === 0 && raw[i + 1] === \"(\") {\n opening = i + 2;\n break;\n }\n }\n if (opening < 0) return undefined;\n while (/\\s/.test(raw[opening] ?? \"\")) opening++;\n if (raw[opening] === \"<\") {\n for (let i = opening + 1; i < raw.length; i++) {\n if (raw[i] === \"\\\\\") {\n i++;\n continue;\n }\n if (raw[i] === \">\") return [opening, i + 1];\n }\n return undefined;\n }\n let depth = 0;\n for (let i = opening; i < raw.length; i++) {\n const char = raw[i]!;\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"(\") depth++;\n if ((char === \")\" && depth-- === 0) || /\\s/.test(char)) return [opening, i];\n }\n return undefined;\n}\n\n/**\n * A Markdown link's destination as a wikilink's target, or undefined when a\n * wikilink cannot hold it. Obsidian takes a wikilink's text as the note's\n * name, so percent escapes are decoded: `My%20Note.md` is the note `My\n * Note.md`, which is right whether or not Obsidian decodes escapes in\n * wikilinks. A destination that does not decode, or whose decoded name holds\n * a character that a wikilink cannot contain, or that would change its meaning\n * there, stays a Markdown link.\n */\nfunction wikiTarget(url: string): string | undefined {\n const hash = url.indexOf(\"#\");\n const [name, fragment] = hash < 0 ? [url, undefined] : [url.slice(0, hash), url.slice(hash + 1)];\n let decodedName: string;\n let decodedFragment: string | undefined;\n try {\n decodedName = decodeURIComponent(name);\n decodedFragment = fragment === undefined ? undefined : decodeURIComponent(fragment);\n } catch {\n return undefined;\n }\n if (/[[\\]|#^\\r\\n]/.test(decodedName) || decodedName.trim() !== decodedName) return undefined;\n if (decodedFragment !== undefined) {\n if (/[[\\]|\\r\\n]/.test(decodedFragment)) return undefined;\n // An escaped `#` or `^` would become a separator or a block reference.\n const marks = (text: string) => text.replace(/[^#^]/g, \"\");\n if (marks(decodedFragment) !== marks(fragment!)) return undefined;\n }\n return decodedFragment === undefined ? decodedName : `${decodedName}#${decodedFragment}`;\n}\n/**\n * A label as CommonMark matches it: case folded, with its blank space\n * collapsed and trimmed. This is how the parser computes the `identifier` of\n * definitions and references, so the two compare equal.\n */\nfunction normalizeLabel(label: string): string {\n return label\n .replace(/[\\t\\n\\r ]+/g, \" \")\n .replace(/^ | $/g, \"\")\n .toLowerCase()\n .toUpperCase()\n .toLowerCase();\n}\n/**\n * A label's text as the parser reads it, from its source: without the block\n * quote markers and indentation that continue its lines inside a container.\n */\nfunction labelText(source: string): string {\n return source.replace(/(\\r\\n|\\r|\\n)[ \\t>]*/g, \"$1\");\n}\n/**\n * The end, after its `]`, of the link label that starts with the `[` at `at`\n * and ends before `limit`: the first unescaped `]`, with no unescaped `[`\n * before it, at most 999 characters, and something besides blank space.\n */\nfunction labelEnd(source: string, at: number, limit: number): number | undefined {\n let blank = true;\n for (let i = at + 1; i < limit && i - at <= 1000; i++) {\n const char = source[i]!;\n if (char === \"\\\\\" && /[[\\]\\\\]/.test(source[i + 1] ?? \"\")) {\n blank = false;\n i++;\n } else if (char === \"[\") return undefined;\n else if (char === \"]\") return blank ? undefined : i + 1;\n else if (!/[ \\t\\r\\n]/.test(char)) blank = false;\n }\n return undefined;\n}\n/** A GFM footnote label after `^`: no blank space, and brackets only escaped. */\nconst footnoteLabel = /^\\^((?:\\\\[[\\]\\\\]|\\\\(?![[\\]\\\\])|[^\\s[\\]\\\\]){1,999})$/;\n/** Inline nodes whose text is read for brackets; any other node is syntax or a link of its own. */\nconst transparent = new Set([\"emphasis\", \"strong\", \"delete\"]);\n/**\n * What before a reference's text makes it no reference to report: an ASCII\n * letter, digit, `_`, or `)`, as in the indexes `matrix[i][j]` and `f(x)[0][1]`\n * in prose, or a `]`, which continues a run like `[a][b][c]` that is reported\n * once, at its start.\n */\nconst notAfter = /[\\w\\])]/;\n/** Characters that a backslash escapes. */\nconst asciiPunctuation = /[!-/:-@[-`{-~]/;\ninterface Reference {\n start: number;\n end: number;\n label: string;\n footnote: boolean;\n}\n/**\n * The full (`[text][label]`) and collapsed (`[label][]`) references, and with\n * `footnotes` the footnote references (`[^label]`), whose label has no\n * definition. The parser leaves these as plain text, so they are found in the\n * text of each paragraph, heading, and table cell, as CommonMark pairs its\n * brackets. Brackets in code, math, HTML, links, images, and other syntax, and\n * escaped ones, are not read.\n */\nfunction undefinedReferences(\n document: Document,\n definitions: Set<string>,\n footnotes: Set<string> | undefined,\n): Reference[] {\n const { source } = document;\n if (!source.includes(\"[\")) return [];\n const references: Reference[] = [];\n const forge = document.dialect === \"forgejo\" || document.dialect === \"gitea\";\n // 1 where a character is text that the parser reads brackets in.\n const readable = new Uint8Array(source.length);\n const collect = (node: Nodes) => {\n if (!(\"children\" in node)) return;\n for (const child of node.children)\n if (child.type === \"text\") {\n const [from, to] = range(child);\n for (let i = from; i < to; i++) {\n if (source[i] === \"\\\\\" && i + 1 < to && asciiPunctuation.test(source[i + 1]!)) i++;\n else readable[i] = 1;\n }\n } else if (transparent.has(child.type)) collect(child);\n };\n walk(document.tree, (node) => {\n if (node.type !== \"paragraph\" && node.type !== \"heading\" && node.type !== \"tableCell\") return;\n const [start, end] = range(node);\n // Searched in the block's own text, so that blocks without brackets cost no more than that.\n const text = source.slice(start, end);\n if (!text.includes(\"[\")) return;\n collect(node);\n // Forgejo and Gitea render `\\(...\\)` and `\\[...\\]` as math, which GFM reads as text.\n if (forge)\n for (const [open, close] of [\n [\"\\\\(\", \"\\\\)\"],\n [\"\\\\[\", \"\\\\]\"],\n ] as const)\n for (let from = 0; ;) {\n const opening = text.indexOf(open, from);\n const closing = opening < 0 ? -1 : text.indexOf(close, opening + 2);\n if (closing < 0) break;\n readable.fill(0, start + opening, start + closing + 2);\n from = closing + 2;\n }\n const openers: number[] = [];\n // The opening bracket of the last full reference's label, which is not read again.\n let label = -1;\n for (let i = start; i < end; i++) {\n if (!readable[i]) continue;\n if (source[i] === \"[\") {\n openers.push(i);\n continue;\n }\n if (source[i] !== \"]\") continue;\n const opener = openers.pop();\n if (opener === undefined || opener === label) continue;\n let reference: Reference | undefined;\n if (source[i + 1] === \"[\" && readable[i + 1]) {\n if (source[i + 2] === \"]\" && readable[i + 2]) {\n // Collapsed: the text is the label.\n if (labelEnd(source, opener, i + 1) === i + 1)\n reference = {\n start: opener,\n end: i + 3,\n label: source.slice(opener + 1, i),\n footnote: false,\n };\n } else {\n const after = labelEnd(source, i + 1, end);\n if (after !== undefined && readable[after - 1]) {\n reference = {\n start: opener,\n end: after,\n label: source.slice(i + 2, after - 1),\n footnote: false,\n };\n label = i + 1;\n }\n }\n if (reference) {\n if (\n !definitions.has(normalizeLabel(labelText(reference.label))) &&\n !(opener > 0 && readable[opener - 1] && notAfter.test(source[opener - 1]!))\n )\n references.push(reference);\n continue;\n }\n }\n // A footnote label has at most 999 characters after its `^`.\n if (!footnotes || source[opener + 1] !== \"^\" || i - opener > 1001) continue;\n const footnote = footnoteLabel.exec(source.slice(opener + 1, i));\n if (footnote && !footnotes.has(normalizeLabel(footnote[1]!)))\n references.push({ start: opener, end: i + 1, label: footnote[1]!, footnote: true });\n }\n });\n return references;\n}\n\n/** Names the first few of the paths that could not be read, and counts the rest. */\nfunction named(paths: string[]): string {\n return paths.length > 3\n ? `${paths.slice(0, 3).join(\", \")}, and ${paths.length - 3} more`\n : paths.join(\", \");\n}\n\n/** The nodes inside table cells, where a `|` that is not escaped ends the cell. */\nfunction inTableCells(tree: Nodes): Set<Nodes> {\n const nodes = new Set<Nodes>();\n walk(tree, \"tableCell\", (cell) => walk(cell, (child) => nodes.add(child)));\n return nodes;\n}\n\nexport const linkRules: Record<string, Rule> = {\n \"links/valid\": {\n description: \"Check local link destinations and dialect-specific heading/block references.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document, workspace }) {\n const findings: Finding[] = [];\n // The parser only produces reference nodes for labels that have a\n // definition; undefined references stay plain text.\n walk(document.tree, (node) => {\n const url = destination(node);\n if (url === undefined || !workspace) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (result.status === \"missing\" && result.outside !== undefined && result.vault)\n // The file is there, so \"missing\" would mislead: Obsidian cannot reach it.\n findings.push({\n start: range(node)[0],\n message: `Local target is outside the vault: ${url} (${result.outside} is not in ${result.vault}, where Obsidian looks).`,\n });\n else if (result.status === \"missing\" || result.status === \"ambiguous\")\n findings.push({\n start: range(node)[0],\n message: `${result.status === \"missing\" ? \"Missing\" : \"Ambiguous\"} local target: ${url}.`,\n });\n else if (result.status === \"directory\" && document.dialect === \"obsidian\")\n findings.push({ start: range(node)[0], message: `Local target is a directory: ${url}.` });\n else if (result.status === \"unreadable\") {\n // Neither found nor known to be missing: say what stood in the way.\n const limits = result.unreadable ?? [];\n // The rest of a vault that the workspace root is only a folder of.\n const outsideRoot = (name: string) => name === \"..\" || name.startsWith(\"../\");\n const directories = limits.filter((name) => !outsideRoot(name));\n const reasons = [\n ...(directories.length ? [`cannot read ${named(directories)}`] : []),\n ...(limits.some(outsideRoot) ? [\"the workspace root is only a part of the vault\"] : []),\n ];\n findings.push({\n start: range(node)[0],\n message:\n result.leavesRoot !== undefined\n ? `Local target could not be checked: ${url} (${result.leavesRoot} leads outside the workspace root, which the tool does not read).`\n : result.target === undefined\n ? `Local target could not be checked: ${url} (no readable match; ${reasons.join(\"; \")}).`\n : `Fragment could not be checked: ${url} (cannot read ${result.target}).`,\n });\n } else if (result.status === \"resolved\" && !result.fragmentExists)\n findings.push({ start: range(node)[0], message: `Missing fragment in ${url}.` });\n });\n return findings;\n },\n },\n \"links/path\": {\n description: \"Rewrite verified local destinations using the configured path and bracket style.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({\n style: { enum: [\"relative\", \"root\", \"shortest\", \"preserve\"] },\n brackets: { enum: [\"angle\", \"bare\", \"preserve\"] },\n extension: { enum: [\"include\", \"omit\", \"preserve\"] },\n leadingDot: { type: \"boolean\" },\n }),\n check({ document, options, workspace }) {\n const findings: Finding[] = [];\n let inCell: Set<Nodes> | undefined;\n walk(document.tree, (node) => {\n const url = destination(node);\n if (url === undefined || !workspace) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (result.status !== \"resolved\" || !result.target || !result.fragmentExists) return;\n // Found by name among the readable files only: a directory that could not\n // be read may hold another match, and a rewrite would choose between them.\n if (result.unreadable) return;\n const parts = splitDestination(url);\n let target = parts.path;\n const style = options.style ?? \"preserve\";\n // Vault roots and extensionless Markdown are renderer-specific; don't change other dialects.\n if (\n document.dialect !== \"obsidian\" &&\n (style === \"root\" || style === \"shortest\" || options.extension === \"omit\")\n )\n return;\n if (parts.path) {\n // Obsidian counts a path from the note's vault, which need not be the root.\n const rooted = result.rooted ?? result.target;\n if (style === \"root\") target = rooted;\n else if (style === \"relative\")\n target = path.posix.relative(path.posix.dirname(document.path), result.target);\n else if (style === \"shortest\") {\n const basename = path.posix.basename(result.target);\n const resolved = workspace.resolve(document.path, basename, document.dialect, true);\n target =\n resolved.status === \"resolved\" &&\n resolved.target === result.target &&\n !resolved.unreadable\n ? basename\n : rooted;\n }\n if (document.dialect === \"obsidian\" && result.target.endsWith(\".md\")) {\n if (\n options.extension === \"omit\" ||\n ((options.extension ?? \"preserve\") === \"preserve\" && !parts.path.endsWith(\".md\"))\n )\n target = target.replace(/\\.md$/, \"\");\n else if (options.extension === \"include\" && !target.endsWith(\".md\")) target += \".md\";\n }\n if (style === \"relative\" && options.leadingDot === true && !target.startsWith(\".\"))\n target = `./${target}`;\n }\n // Encode reserved path characters before reattaching a separately parsed fragment.\n const hash = url.indexOf(\"#\");\n const encodedPath =\n target === parts.path\n ? hash < 0\n ? url\n : url.slice(0, hash)\n : target.replaceAll(\"%\", \"%25\").replaceAll(\"#\", \"%23\");\n let replacement =\n encodedPath +\n (hash < 0\n ? \"\"\n : target === parts.path\n ? url.slice(hash)\n : `#${parts.fragment.replaceAll(\"%\", \"%25\")}`);\n // A relative basename can collide with a vault-root path. Make the\n // relative spelling explicit before proposing an identity-changing edit.\n let verified = workspace.resolve(\n document.path,\n replacement,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (\n style === \"relative\" &&\n parts.path &&\n !replacement.startsWith(\".\") &&\n (verified.status !== \"resolved\" ||\n verified.target !== result.target ||\n verified.unreadable)\n ) {\n replacement = `./${replacement}`;\n verified = workspace.resolve(\n document.path,\n replacement,\n document.dialect,\n node.type === \"wikiLink\",\n );\n }\n if (\n verified.status !== \"resolved\" ||\n verified.target !== result.target ||\n verified.fragment !== result.fragment ||\n verified.unreadable\n )\n return;\n const [start, end] = range(node);\n if (node.type === \"wikiLink\") {\n if (/[[\\]|\\r\\n]/.test(replacement)) return;\n if (!node.embed && node.label === undefined && replacement !== node.target) return;\n // Only the destination changes. The divider stays as written, `|` or\n // `\\|`, which a table cell needs, and so do the label and an embed's size.\n const raw = document.source.slice(start, end);\n const open = node.embed ? 3 : 2;\n const divider = raw.indexOf(\"|\", open);\n const targetEnd =\n divider < 0 ? raw.length - 2 : raw[divider - 1] === \"\\\\\" ? divider - 1 : divider;\n if (raw.slice(open, targetEnd) !== node.target) return;\n replacement = raw.slice(0, open) + replacement + raw.slice(targetEnd);\n if (replacement !== raw)\n findings.push({\n start,\n end,\n message: \"Normalize wikilink destination.\",\n edit: { start, end, text: replacement },\n });\n return;\n }\n if (node.type === \"definition\") return; // Definitions are validated; retain their exact layout in this release.\n const raw = document.source.slice(start, end);\n const span = destinationRange(raw);\n if (!span) return; // Autolinks have no parenthesized destination.\n const original = raw.slice(...span);\n const angle =\n options.brackets === \"angle\" ||\n ((options.brackets ?? \"preserve\") === \"preserve\" && original.startsWith(\"<\"));\n if (angle)\n replacement = `<${replacement.replaceAll(\"<\", \"%3C\").replaceAll(\">\", \"%3E\").replaceAll(\"\\\\\", \"%5C\")}>`;\n else\n replacement = replacement\n .replaceAll(\" \", \"%20\")\n .replaceAll(\"(\", \"%28\")\n .replaceAll(\")\", \"%29\")\n .replaceAll(\"<\", \"%3C\")\n .replaceAll(\">\", \"%3E\");\n // A file or folder name can hold a `|`, which would end a table cell.\n if (replacement.includes(\"|\") && (inCell ??= inTableCells(document.tree)).has(node))\n replacement = replacement.replaceAll(\"|\", \"\\\\|\");\n if (\n document.dialect === \"gitea\" &&\n (giteaPyLine(document, start, end) || replacement.includes(\"_.py\")) &&\n giteaUnderscores(original) !== giteaUnderscores(replacement)\n )\n return;\n // On Forgejo, and Gitea before 1.26, the destination is part of the\n // heading's anchor, and text they read as attributes is no link there.\n if (changesForgeHeading(document, start, end)) return;\n if (original !== replacement)\n findings.push({\n start: start + span[0],\n end: start + span[1],\n message: \"Normalize link destination.\",\n edit: { start: start + span[0], end: start + span[1], text: replacement },\n });\n });\n return findings;\n },\n },\n \"links/notation\": {\n description: \"Convert plain-label Obsidian links between Markdown and wikilink notation.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({ style: { enum: [\"markdown\", \"wiki\"] } }),\n check({ document, options, workspace }) {\n if (document.dialect !== \"obsidian\" || !workspace) return [];\n const findings: Finding[] = [];\n let inCell: Set<Nodes> | undefined;\n walk(document.tree, (node) => {\n const [start, end] = range(node);\n const pipe = () => ((inCell ??= inTableCells(document.tree)).has(node) ? \"\\\\|\" : \"|\");\n let replacement: string | undefined;\n if (\n options.style === \"markdown\" &&\n node.type === \"wikiLink\" &&\n !node.embed &&\n node.label !== undefined\n ) {\n if (/[[\\]<>\\\\\\r\\n]/.test(node.target ?? \"\") || /[*_`[\\]\\\\]/.test(node.label)) return;\n const label = node.label.includes(\"|\") ? node.label.replaceAll(\"|\", pipe()) : node.label;\n replacement = `[${label}](<${node.target}>)`;\n } else if (\n options.style === \"wiki\" &&\n node.type === \"link\" &&\n !node.title &&\n node.children.length === 1 &&\n node.children[0]?.type === \"text\"\n ) {\n const label = node.children[0].value;\n const target = wikiTarget(node.url);\n if (target === undefined || /[[\\]|\\r\\n]/.test(label)) return;\n replacement = `[[${target}${pipe()}${label}]]`;\n }\n const url = destination(node);\n if (!replacement || url === undefined) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n // A target that is uncertain, because a directory could not be read, is left as written.\n if (result.status !== \"resolved\" || result.unreadable) return;\n findings.push({\n start,\n end,\n message: `Use ${String(options.style)} link notation.`,\n edit: { start, end, text: replacement },\n });\n });\n return findings;\n },\n },\n \"links/undefined-reference\": {\n description:\n \"Report full, collapsed, and footnote references whose label has no definition, which show as plain text.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n const definitions = new Set<string>();\n const footnotes = new Set<string>();\n walk(document.tree, (node) => {\n if (node.type === \"definition\") definitions.add(node.identifier);\n if (node.type === \"footnoteDefinition\") footnotes.add(node.identifier);\n });\n // CommonMark has no footnotes: there `[^label]` is an ordinary shortcut reference.\n return undefinedReferences(\n document,\n definitions,\n document.dialect === \"commonmark\" ? undefined : footnotes,\n ).map(({ start, end, label, footnote }) => {\n const name = (footnote ? `^${label}` : labelText(label)).replace(/\\s+/g, \" \").trim();\n return {\n start,\n end,\n message: `${footnote ? \"Footnote\" : \"Reference\"} [${name}] has no definition and shows as plain text.`,\n };\n });\n },\n },\n \"links/unused-definition\": {\n description: \"Report link and footnote definitions that no reference uses.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n // Link and footnote labels are kept apart, as `link:` and `footnote:` keys.\n const used = new Set<string>();\n const definitions: (Definition | FootnoteDefinition)[] = [];\n walk(document.tree, (node) => {\n // A shortcut reference `[label]` that has a definition is a reference node too.\n if (node.type === \"linkReference\" || node.type === \"imageReference\")\n used.add(`link:${node.identifier}`);\n else if (node.type === \"footnoteReference\") used.add(`footnote:${node.identifier}`);\n else if (node.type === \"definition\" || node.type === \"footnoteDefinition\")\n definitions.push(node);\n });\n const findings: Finding[] = [];\n const seen = new Set<string>();\n for (const node of definitions) {\n const footnote = node.type === \"footnoteDefinition\";\n const key = `${footnote ? \"footnote\" : \"link\"}:${node.identifier}`;\n const label = (node.label ?? node.identifier).replace(/\\s+/g, \" \").trim();\n const name = `[${footnote ? \"^\" : \"\"}${label}]`;\n const [start] = range(node);\n // CommonMark uses the first definition of a label; a later one is never used.\n if (seen.has(key))\n findings.push({\n start,\n message: `${footnote ? \"Footnote\" : \"Definition\"} ${name} repeats an earlier one, which references use instead.`,\n });\n else if (!used.has(key))\n findings.push({\n start,\n message: footnote\n ? `Footnote ${name} is not referenced${document.dialect === \"github\" ? \", and GitHub does not show it\" : \"\"}.`\n : `Definition ${name} is not used by any reference.`,\n });\n seen.add(key);\n }\n return findings;\n },\n },\n \"links/empty\": {\n description: \"Report links and images whose destination is empty or only #.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n const findings: Finding[] = [];\n // A reference has its definition's destination, which is reported once, at the definition.\n walk(document.tree, (node) => {\n if (node.type !== \"link\" && node.type !== \"image\" && node.type !== \"definition\") return;\n if (node.url !== \"\" && node.url !== \"#\") return;\n const what =\n node.type === \"image\"\n ? \"Image source\"\n : node.type === \"definition\"\n ? `Destination of definition [${(node.label ?? node.identifier).replace(/\\s+/g, \" \").trim()}]`\n : \"Link destination\";\n findings.push({\n start: range(node)[0],\n message:\n node.url === \"\"\n ? `${what} is empty.`\n : `${what} is only #${node.type === \"link\" ? \", which only leads to the top of the page\" : \"\"}.`,\n });\n });\n return findings;\n },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/rules/links.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { walk } from \"../syntax/walk.js\";\nimport type { Definition, FootnoteDefinition, Nodes } from \"mdast\";\nimport type { Document, Finding, Rule } from \"../core/types.js\";\nimport { range } from \"../syntax/parse.js\";\nimport { changesForgeHeading } from \"../workspace/heading-attributes.js\";\nimport { splitDestination } from \"../workspace/index.js\";\nimport { giteaPyLine, optionsSchema } from \"./style.js\";\n\n/**\n * What Gitea's `_.py` emphasis exception can see of a link destination: whether\n * it contains `_`, and whether its first `_` starts `_.py`. A delimiter earlier\n * on the line looks for the next `_` there.\n */\nfunction giteaUnderscores(destination: string): string {\n return `${destination.includes(\"_\")} ${/^[^_]*_\\.py/.test(destination)}`;\n}\nfunction destination(node: Nodes): string | undefined {\n if (node.type === \"wikiLink\") return node.target;\n if (node.type === \"link\" || node.type === \"image\" || node.type === \"definition\") return node.url;\n return undefined;\n}\n/** Locate an inline destination within a parsed link, retaining labels and optional titles. */\nfunction destinationRange(raw: string): [number, number] | undefined {\n let bracket = 0;\n let opening = -1;\n for (let i = raw.startsWith(\"!\") ? 1 : 0; i < raw.length; i++) {\n if (raw[i] === \"\\\\\") {\n i++;\n continue;\n }\n if (raw[i] === \"[\") bracket++;\n if (raw[i] === \"]\" && --bracket === 0 && raw[i + 1] === \"(\") {\n opening = i + 2;\n break;\n }\n }\n if (opening < 0) return undefined;\n while (/\\s/.test(raw[opening] ?? \"\")) opening++;\n if (raw[opening] === \"<\") {\n for (let i = opening + 1; i < raw.length; i++) {\n if (raw[i] === \"\\\\\") {\n i++;\n continue;\n }\n if (raw[i] === \">\") return [opening, i + 1];\n }\n return undefined;\n }\n let depth = 0;\n for (let i = opening; i < raw.length; i++) {\n const char = raw[i]!;\n if (char === \"\\\\\") {\n i++;\n continue;\n }\n if (char === \"(\") depth++;\n if ((char === \")\" && depth-- === 0) || /\\s/.test(char)) return [opening, i];\n }\n return undefined;\n}\n\n/**\n * A Markdown link's destination as a wikilink's target, or undefined when a\n * wikilink cannot hold it. Obsidian takes a wikilink's text as the note's\n * name, so percent escapes are decoded: `My%20Note.md` is the note `My\n * Note.md`, which is right whether or not Obsidian decodes escapes in\n * wikilinks. A destination that does not decode, or whose decoded name holds\n * a character that a wikilink cannot contain, or that would change its meaning\n * there, stays a Markdown link.\n */\nfunction wikiTarget(url: string): string | undefined {\n const hash = url.indexOf(\"#\");\n const [name, fragment] = hash < 0 ? [url, undefined] : [url.slice(0, hash), url.slice(hash + 1)];\n let decodedName: string;\n let decodedFragment: string | undefined;\n try {\n decodedName = decodeURIComponent(name);\n decodedFragment = fragment === undefined ? undefined : decodeURIComponent(fragment);\n } catch {\n return undefined;\n }\n if (/[[\\]|#^\\r\\n]/.test(decodedName) || decodedName.trim() !== decodedName) return undefined;\n if (decodedFragment !== undefined) {\n if (/[[\\]|\\r\\n]/.test(decodedFragment)) return undefined;\n // An escaped `#` or `^` would become a separator or a block reference.\n const marks = (text: string) => text.replace(/[^#^]/g, \"\");\n if (marks(decodedFragment) !== marks(fragment!)) return undefined;\n }\n return decodedFragment === undefined ? decodedName : `${decodedName}#${decodedFragment}`;\n}\n/**\n * A label as CommonMark matches it: case folded, with its blank space\n * collapsed and trimmed. This is how the parser computes the `identifier` of\n * definitions and references, so the two compare equal.\n */\nfunction normalizeLabel(label: string): string {\n return label\n .replace(/[\\t\\n\\r ]+/g, \" \")\n .replace(/^ | $/g, \"\")\n .toLowerCase()\n .toUpperCase()\n .toLowerCase();\n}\n/**\n * A label's text as the parser reads it, from its source: without the block\n * quote markers and indentation that continue its lines inside a container.\n */\nfunction labelText(source: string): string {\n return source.replace(/(\\r\\n|\\r|\\n)[ \\t>]*/g, \"$1\");\n}\n/**\n * The end, after its `]`, of the link label that starts with the `[` at `at`\n * and ends before `limit`: the first unescaped `]`, with no unescaped `[`\n * before it, at most 999 characters, and something besides blank space.\n */\nfunction labelEnd(source: string, at: number, limit: number): number | undefined {\n let blank = true;\n for (let i = at + 1; i < limit && i - at <= 1000; i++) {\n const char = source[i]!;\n if (char === \"\\\\\" && /[[\\]\\\\]/.test(source[i + 1] ?? \"\")) {\n blank = false;\n i++;\n } else if (char === \"[\") return undefined;\n else if (char === \"]\") return blank ? undefined : i + 1;\n else if (!/[ \\t\\r\\n]/.test(char)) blank = false;\n }\n return undefined;\n}\n/** A GFM footnote label after `^`: no blank space, and brackets only escaped. */\nconst footnoteLabel = /^\\^((?:\\\\[[\\]\\\\]|\\\\(?![[\\]\\\\])|[^\\s[\\]\\\\]){1,999})$/;\n/** Inline nodes whose text is read for brackets; any other node is syntax or a link of its own. */\nconst transparent = new Set([\"emphasis\", \"strong\", \"delete\"]);\n/**\n * What before a reference's text makes it no reference to report: an ASCII\n * letter, digit, `_`, or `)`, as in the indexes `matrix[i][j]` and `f(x)[0][1]`\n * in prose, or a `]`, which continues a run like `[a][b][c]` that is reported\n * once, at its start.\n */\nconst notAfter = /[\\w\\])]/;\n/** Characters that a backslash escapes. */\nconst asciiPunctuation = /[!-/:-@[-`{-~]/;\ninterface Reference {\n start: number;\n end: number;\n label: string;\n footnote: boolean;\n}\n/**\n * The full (`[text][label]`) and collapsed (`[label][]`) references, and with\n * `footnotes` the footnote references (`[^label]`), whose label has no\n * definition. The parser leaves these as plain text, so they are found in the\n * text of each paragraph, heading, and table cell, as CommonMark pairs its\n * brackets. Brackets in code, math, HTML, links, images, and other syntax, and\n * escaped ones, are not read.\n */\nfunction undefinedReferences(\n document: Document,\n definitions: Set<string>,\n footnotes: Set<string> | undefined,\n): Reference[] {\n const { source } = document;\n if (!source.includes(\"[\")) return [];\n const references: Reference[] = [];\n const forge = document.dialect === \"forgejo\" || document.dialect === \"gitea\";\n // 1 where a character is text that the parser reads brackets in.\n const readable = new Uint8Array(source.length);\n const collect = (node: Nodes) => {\n if (!(\"children\" in node)) return;\n for (const child of node.children)\n if (child.type === \"text\") {\n const [from, to] = range(child);\n for (let i = from; i < to; i++) {\n if (source[i] === \"\\\\\" && i + 1 < to && asciiPunctuation.test(source[i + 1]!)) i++;\n else readable[i] = 1;\n }\n } else if (transparent.has(child.type)) collect(child);\n };\n walk(document.tree, (node) => {\n if (node.type !== \"paragraph\" && node.type !== \"heading\" && node.type !== \"tableCell\") return;\n const [start, end] = range(node);\n // Searched in the block's own text, so that blocks without brackets cost no more than that.\n const text = source.slice(start, end);\n if (!text.includes(\"[\")) return;\n collect(node);\n // Forgejo and Gitea render `\\(...\\)` and `\\[...\\]` as math, which GFM reads as text.\n if (forge)\n for (const [open, close] of [\n [\"\\\\(\", \"\\\\)\"],\n [\"\\\\[\", \"\\\\]\"],\n ] as const)\n for (let from = 0; ;) {\n const opening = text.indexOf(open, from);\n const closing = opening < 0 ? -1 : text.indexOf(close, opening + 2);\n if (closing < 0) break;\n readable.fill(0, start + opening, start + closing + 2);\n from = closing + 2;\n }\n const openers: number[] = [];\n // The opening bracket of the last full reference's label, which is not read again.\n let label = -1;\n for (let i = start; i < end; i++) {\n if (!readable[i]) continue;\n if (source[i] === \"[\") {\n openers.push(i);\n continue;\n }\n if (source[i] !== \"]\") continue;\n const opener = openers.pop();\n if (opener === undefined || opener === label) continue;\n let reference: Reference | undefined;\n if (source[i + 1] === \"[\" && readable[i + 1]) {\n if (source[i + 2] === \"]\" && readable[i + 2]) {\n // Collapsed: the text is the label.\n if (labelEnd(source, opener, i + 1) === i + 1)\n reference = {\n start: opener,\n end: i + 3,\n label: source.slice(opener + 1, i),\n footnote: false,\n };\n } else {\n const after = labelEnd(source, i + 1, end);\n if (after !== undefined && readable[after - 1]) {\n reference = {\n start: opener,\n end: after,\n label: source.slice(i + 2, after - 1),\n footnote: false,\n };\n label = i + 1;\n }\n }\n if (reference) {\n if (\n !definitions.has(normalizeLabel(labelText(reference.label))) &&\n !(opener > 0 && readable[opener - 1] && notAfter.test(source[opener - 1]!))\n )\n references.push(reference);\n continue;\n }\n }\n // A footnote label has at most 999 characters after its `^`.\n if (!footnotes || source[opener + 1] !== \"^\" || i - opener > 1001) continue;\n const footnote = footnoteLabel.exec(source.slice(opener + 1, i));\n if (footnote && !footnotes.has(normalizeLabel(footnote[1]!)))\n references.push({ start: opener, end: i + 1, label: footnote[1]!, footnote: true });\n }\n });\n return references;\n}\n\n/**\n * Whether a relative path already starts at the linking document's directory or above it.\n * A path such as `.gitignore` starts with a dot and is neither.\n */\nfunction explicitlyRelative(path: string): boolean {\n return /^\\.\\.?(?:\\/|$)/.test(path);\n}\n\n/** Names the first few of the paths that could not be read, and counts the rest. */\nfunction named(paths: string[]): string {\n return paths.length > 3\n ? `${paths.slice(0, 3).join(\", \")}, and ${paths.length - 3} more`\n : paths.join(\", \");\n}\n\n/** The nodes inside table cells, where a `|` that is not escaped ends the cell. */\nfunction inTableCells(tree: Nodes): Set<Nodes> {\n const nodes = new Set<Nodes>();\n walk(tree, \"tableCell\", (cell) => walk(cell, (child) => nodes.add(child)));\n return nodes;\n}\n\nexport const linkRules: Record<string, Rule> = {\n \"links/valid\": {\n description: \"Check local link destinations and dialect-specific heading/block references.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document, workspace }) {\n const findings: Finding[] = [];\n // The parser only produces reference nodes for labels that have a\n // definition; undefined references stay plain text.\n walk(document.tree, (node) => {\n const url = destination(node);\n if (url === undefined || !workspace) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (result.status === \"missing\" && result.outside !== undefined && result.vault)\n // The file is there, so \"missing\" would mislead: Obsidian cannot reach it.\n findings.push({\n start: range(node)[0],\n message: `Local target is outside the vault: ${url} (${result.outside} is not in ${result.vault}, where Obsidian looks).`,\n });\n else if (result.status === \"missing\" || result.status === \"ambiguous\")\n findings.push({\n start: range(node)[0],\n message: `${result.status === \"missing\" ? \"Missing\" : \"Ambiguous\"} local target: ${url}.`,\n });\n else if (result.status === \"directory\" && document.dialect === \"obsidian\")\n findings.push({ start: range(node)[0], message: `Local target is a directory: ${url}.` });\n else if (result.status === \"unreadable\") {\n // Neither found nor known to be missing: say what stood in the way.\n const limits = result.unreadable ?? [];\n // The rest of a vault that the workspace root is only a folder of.\n const outsideRoot = (name: string) => name === \"..\" || name.startsWith(\"../\");\n const directories = limits.filter((name) => !outsideRoot(name));\n const reasons = [\n ...(directories.length ? [`cannot read ${named(directories)}`] : []),\n ...(limits.some(outsideRoot) ? [\"the workspace root is only a part of the vault\"] : []),\n ];\n findings.push({\n start: range(node)[0],\n message:\n result.leavesRoot !== undefined\n ? `Local target could not be checked: ${url} (${result.leavesRoot} leads outside the workspace root, which the tool does not read).`\n : result.target === undefined\n ? `Local target could not be checked: ${url} (no readable match; ${reasons.join(\"; \")}).`\n : `Fragment could not be checked: ${url} (cannot read ${result.target}).`,\n });\n } else if (result.status === \"resolved\" && !result.fragmentExists)\n findings.push({ start: range(node)[0], message: `Missing fragment in ${url}.` });\n });\n return findings;\n },\n },\n \"links/path\": {\n description: \"Rewrite verified local destinations using the configured path and bracket style.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({\n style: { enum: [\"relative\", \"root\", \"shortest\", \"preserve\"] },\n brackets: { enum: [\"angle\", \"bare\", \"preserve\"] },\n extension: { enum: [\"include\", \"omit\", \"preserve\"] },\n leadingDot: { type: \"boolean\" },\n }),\n check({ document, options, workspace }) {\n const findings: Finding[] = [];\n let inCell: Set<Nodes> | undefined;\n walk(document.tree, (node) => {\n const url = destination(node);\n if (url === undefined || !workspace) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (result.status !== \"resolved\" || !result.target || !result.fragmentExists) return;\n // Found by name among the readable files only: a directory that could not\n // be read may hold another match, and a rewrite would choose between them.\n if (result.unreadable) return;\n const parts = splitDestination(url);\n let target = parts.path;\n const style = options.style ?? \"preserve\";\n // Vault roots and extensionless Markdown are renderer-specific; don't change other dialects.\n if (\n document.dialect !== \"obsidian\" &&\n (style === \"root\" || style === \"shortest\" || options.extension === \"omit\")\n )\n return;\n if (parts.path) {\n // Obsidian counts a path from the note's vault, which need not be the root.\n const rooted = result.rooted ?? result.target;\n if (style === \"root\") target = rooted;\n else if (style === \"relative\")\n target = path.posix.relative(path.posix.dirname(document.path), result.target);\n else if (style === \"shortest\") {\n const basename = path.posix.basename(result.target);\n const resolved = workspace.resolve(document.path, basename, document.dialect, true);\n target =\n resolved.status === \"resolved\" &&\n resolved.target === result.target &&\n !resolved.unreadable\n ? basename\n : rooted;\n }\n if (document.dialect === \"obsidian\" && result.target.endsWith(\".md\")) {\n if (\n options.extension === \"omit\" ||\n ((options.extension ?? \"preserve\") === \"preserve\" && !parts.path.endsWith(\".md\"))\n )\n target = target.replace(/\\.md$/, \"\");\n else if (options.extension === \"include\" && !target.endsWith(\".md\")) target += \".md\";\n }\n if (style === \"relative\" && options.leadingDot === true && !explicitlyRelative(target))\n target = `./${target}`;\n }\n // Encode reserved path characters before reattaching a separately parsed fragment.\n const hash = url.indexOf(\"#\");\n const encodedPath =\n target === parts.path\n ? hash < 0\n ? url\n : url.slice(0, hash)\n : target.replaceAll(\"%\", \"%25\").replaceAll(\"#\", \"%23\");\n let replacement =\n encodedPath +\n (hash < 0\n ? \"\"\n : target === parts.path\n ? url.slice(hash)\n : `#${parts.fragment.replaceAll(\"%\", \"%25\")}`);\n // A relative basename can collide with a vault-root path. Make the\n // relative spelling explicit before proposing an identity-changing edit.\n let verified = workspace.resolve(\n document.path,\n replacement,\n document.dialect,\n node.type === \"wikiLink\",\n );\n if (\n style === \"relative\" &&\n parts.path &&\n !explicitlyRelative(replacement) &&\n (verified.status !== \"resolved\" ||\n verified.target !== result.target ||\n verified.unreadable)\n ) {\n replacement = `./${replacement}`;\n verified = workspace.resolve(\n document.path,\n replacement,\n document.dialect,\n node.type === \"wikiLink\",\n );\n }\n if (\n verified.status !== \"resolved\" ||\n verified.target !== result.target ||\n verified.fragment !== result.fragment ||\n verified.unreadable\n )\n return;\n const [start, end] = range(node);\n if (node.type === \"wikiLink\") {\n if (/[[\\]|\\r\\n]/.test(replacement)) return;\n if (!node.embed && node.label === undefined && replacement !== node.target) return;\n // Only the destination changes. The divider stays as written, `|` or\n // `\\|`, which a table cell needs, and so do the label and an embed's size.\n const raw = document.source.slice(start, end);\n const open = node.embed ? 3 : 2;\n const divider = raw.indexOf(\"|\", open);\n const targetEnd =\n divider < 0 ? raw.length - 2 : raw[divider - 1] === \"\\\\\" ? divider - 1 : divider;\n if (raw.slice(open, targetEnd) !== node.target) return;\n replacement = raw.slice(0, open) + replacement + raw.slice(targetEnd);\n if (replacement !== raw)\n findings.push({\n start,\n end,\n message: \"Normalize wikilink destination.\",\n edit: { start, end, text: replacement },\n });\n return;\n }\n if (node.type === \"definition\") return; // Definitions are validated; retain their exact layout in this release.\n const raw = document.source.slice(start, end);\n const span = destinationRange(raw);\n if (!span) return; // Autolinks have no parenthesized destination.\n const original = raw.slice(...span);\n const angle =\n options.brackets === \"angle\" ||\n ((options.brackets ?? \"preserve\") === \"preserve\" && original.startsWith(\"<\"));\n if (angle)\n replacement = `<${replacement.replaceAll(\"<\", \"%3C\").replaceAll(\">\", \"%3E\").replaceAll(\"\\\\\", \"%5C\")}>`;\n else\n replacement = replacement\n .replaceAll(\" \", \"%20\")\n .replaceAll(\"(\", \"%28\")\n .replaceAll(\")\", \"%29\")\n .replaceAll(\"<\", \"%3C\")\n .replaceAll(\">\", \"%3E\");\n // A file or folder name can hold a `|`, which would end a table cell.\n if (replacement.includes(\"|\") && (inCell ??= inTableCells(document.tree)).has(node))\n replacement = replacement.replaceAll(\"|\", \"\\\\|\");\n if (\n document.dialect === \"gitea\" &&\n (giteaPyLine(document, start, end) || replacement.includes(\"_.py\")) &&\n giteaUnderscores(original) !== giteaUnderscores(replacement)\n )\n return;\n // On Forgejo, and Gitea before 1.26, the destination is part of the\n // heading's anchor, and text they read as attributes is no link there.\n if (changesForgeHeading(document, start, end)) return;\n if (original !== replacement)\n findings.push({\n start: start + span[0],\n end: start + span[1],\n message: \"Normalize link destination.\",\n edit: { start: start + span[0], end: start + span[1], text: replacement },\n });\n });\n return findings;\n },\n },\n \"links/notation\": {\n description: \"Convert plain-label Obsidian links between Markdown and wikilink notation.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({ style: { enum: [\"markdown\", \"wiki\"] } }),\n check({ document, options, workspace }) {\n if (document.dialect !== \"obsidian\" || !workspace) return [];\n const findings: Finding[] = [];\n let inCell: Set<Nodes> | undefined;\n walk(document.tree, (node) => {\n const [start, end] = range(node);\n const pipe = () => ((inCell ??= inTableCells(document.tree)).has(node) ? \"\\\\|\" : \"|\");\n let replacement: string | undefined;\n if (\n options.style === \"markdown\" &&\n node.type === \"wikiLink\" &&\n !node.embed &&\n node.label !== undefined\n ) {\n if (/[[\\]<>\\\\\\r\\n]/.test(node.target ?? \"\") || /[*_`[\\]\\\\]/.test(node.label)) return;\n const label = node.label.includes(\"|\") ? node.label.replaceAll(\"|\", pipe()) : node.label;\n replacement = `[${label}](<${node.target}>)`;\n } else if (\n options.style === \"wiki\" &&\n node.type === \"link\" &&\n !node.title &&\n node.children.length === 1 &&\n node.children[0]?.type === \"text\"\n ) {\n const label = node.children[0].value;\n const target = wikiTarget(node.url);\n if (target === undefined || /[[\\]|\\r\\n]/.test(label)) return;\n replacement = `[[${target}${pipe()}${label}]]`;\n }\n const url = destination(node);\n if (!replacement || url === undefined) return;\n const result = workspace.resolve(\n document.path,\n url,\n document.dialect,\n node.type === \"wikiLink\",\n );\n // A target that is uncertain, because a directory could not be read, is left as written.\n if (result.status !== \"resolved\" || result.unreadable) return;\n findings.push({\n start,\n end,\n message: `Use ${String(options.style)} link notation.`,\n edit: { start, end, text: replacement },\n });\n });\n return findings;\n },\n },\n \"links/undefined-reference\": {\n description:\n \"Report full, collapsed, and footnote references whose label has no definition, which show as plain text.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n const definitions = new Set<string>();\n const footnotes = new Set<string>();\n walk(document.tree, (node) => {\n if (node.type === \"definition\") definitions.add(node.identifier);\n if (node.type === \"footnoteDefinition\") footnotes.add(node.identifier);\n });\n // CommonMark has no footnotes: there `[^label]` is an ordinary shortcut reference.\n return undefinedReferences(\n document,\n definitions,\n document.dialect === \"commonmark\" ? undefined : footnotes,\n ).map(({ start, end, label, footnote }) => {\n const name = (footnote ? `^${label}` : labelText(label)).replace(/\\s+/g, \" \").trim();\n return {\n start,\n end,\n message: `${footnote ? \"Footnote\" : \"Reference\"} [${name}] has no definition and shows as plain text.`,\n };\n });\n },\n },\n \"links/unused-definition\": {\n description: \"Report link and footnote definitions that no reference uses.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n // Link and footnote labels are kept apart, as `link:` and `footnote:` keys.\n const used = new Set<string>();\n const definitions: (Definition | FootnoteDefinition)[] = [];\n walk(document.tree, (node) => {\n // A shortcut reference `[label]` that has a definition is a reference node too.\n if (node.type === \"linkReference\" || node.type === \"imageReference\")\n used.add(`link:${node.identifier}`);\n else if (node.type === \"footnoteReference\") used.add(`footnote:${node.identifier}`);\n else if (node.type === \"definition\" || node.type === \"footnoteDefinition\")\n definitions.push(node);\n });\n const findings: Finding[] = [];\n const seen = new Set<string>();\n for (const node of definitions) {\n const footnote = node.type === \"footnoteDefinition\";\n const key = `${footnote ? \"footnote\" : \"link\"}:${node.identifier}`;\n const label = (node.label ?? node.identifier).replace(/\\s+/g, \" \").trim();\n const name = `[${footnote ? \"^\" : \"\"}${label}]`;\n const [start] = range(node);\n // CommonMark uses the first definition of a label; a later one is never used.\n if (seen.has(key))\n findings.push({\n start,\n message: `${footnote ? \"Footnote\" : \"Definition\"} ${name} repeats an earlier one, which references use instead.`,\n });\n else if (!used.has(key))\n findings.push({\n start,\n message: footnote\n ? `Footnote ${name} is not referenced${document.dialect === \"github\" ? \", and GitHub does not show it\" : \"\"}.`\n : `Definition ${name} is not used by any reference.`,\n });\n seen.add(key);\n }\n return findings;\n },\n },\n \"links/empty\": {\n description: \"Report links and images whose destination is empty or only #.\",\n kind: \"problem\",\n schema: optionsSchema({}),\n check({ document }) {\n const findings: Finding[] = [];\n // A reference has its definition's destination, which is reported once, at the definition.\n walk(document.tree, (node) => {\n if (node.type !== \"link\" && node.type !== \"image\" && node.type !== \"definition\") return;\n if (node.url !== \"\" && node.url !== \"#\") return;\n const what =\n node.type === \"image\"\n ? \"Image source\"\n : node.type === \"definition\"\n ? `Destination of definition [${(node.label ?? node.identifier).replace(/\\s+/g, \" \").trim()}]`\n : \"Link destination\";\n findings.push({\n start: range(node)[0],\n message:\n node.url === \"\"\n ? `${what} is empty.`\n : `${what} is only #${node.type === \"link\" ? \", which only leads to the top of the page\" : \"\"}.`,\n });\n });\n return findings;\n },\n },\n};\n"]}
|
package/dist/rules/style.js
CHANGED
|
@@ -323,6 +323,32 @@ function holdsStrikethroughRun(node, scope, source, dialect) {
|
|
|
323
323
|
});
|
|
324
324
|
return found;
|
|
325
325
|
}
|
|
326
|
+
/**
|
|
327
|
+
* The paragraphs, headings, and table cells whose text holds a `*` or `_` that
|
|
328
|
+
* is not a marker of emphasis, as in `snake_case` or `5 * 3`, unescaped and
|
|
329
|
+
* outside code, math, and links' destinations. Obsidian's Reading view pairs
|
|
330
|
+
* such a character with a later one, where CommonMark and Live Preview leave it
|
|
331
|
+
* as text: `snake_case and _em_` shows `case and _em` as emphasis (issue #361).
|
|
332
|
+
*/
|
|
333
|
+
function blocksWithLooseMarkers(document) {
|
|
334
|
+
const { source } = document;
|
|
335
|
+
const blocks = [];
|
|
336
|
+
walk(document.tree, (node) => {
|
|
337
|
+
if (!inlineBlocks.has(node.type) || !located(node))
|
|
338
|
+
return;
|
|
339
|
+
let found = false;
|
|
340
|
+
walk(node, "text", (text) => {
|
|
341
|
+
if (found || !located(text))
|
|
342
|
+
return;
|
|
343
|
+
const [start, end] = range(text);
|
|
344
|
+
for (let at = start; at < end && !found; at++)
|
|
345
|
+
found = (source[at] === "*" || source[at] === "_") && !escaped(source, at);
|
|
346
|
+
});
|
|
347
|
+
if (found)
|
|
348
|
+
blocks.push(range(node));
|
|
349
|
+
});
|
|
350
|
+
return blocks;
|
|
351
|
+
}
|
|
326
352
|
function markerRule(type, fallback) {
|
|
327
353
|
return {
|
|
328
354
|
description: `Choose ${type} delimiters without reprinting their contents.`,
|
|
@@ -337,6 +363,7 @@ function markerRule(type, fallback) {
|
|
|
337
363
|
const marker = String(options.marker ?? fallback).repeat(size);
|
|
338
364
|
const labels = markerLabels(document.tree);
|
|
339
365
|
const titles = calloutTitles(document);
|
|
366
|
+
const loose = document.dialect === "obsidian" ? blocksWithLooseMarkers(document) : [];
|
|
340
367
|
/** The ranges of the emphasis to change, by the scope that holds them. */
|
|
341
368
|
const candidates = new Map();
|
|
342
369
|
eachInline(document.tree, type, (node, scope) => {
|
|
@@ -344,6 +371,10 @@ function markerRule(type, fallback) {
|
|
|
344
371
|
const original = source.slice(start, end);
|
|
345
372
|
if (original.startsWith(marker))
|
|
346
373
|
return;
|
|
374
|
+
// Obsidian's Reading view could pair a new marker with a `*` or `_`
|
|
375
|
+
// that is text, or an old one that it paired with one, otherwise.
|
|
376
|
+
if (loose.some(([a, b]) => start >= a && end <= b))
|
|
377
|
+
return;
|
|
347
378
|
// Underscores cannot delimit intraword emphasis. Preserve these valid forms.
|
|
348
379
|
if (marker.startsWith("_") &&
|
|
349
380
|
(/\p{L}|\p{N}/u.test(document.source[start - 1] ?? "") ||
|
|
@@ -631,6 +662,48 @@ function templateTags(text, base) {
|
|
|
631
662
|
}
|
|
632
663
|
return ranges;
|
|
633
664
|
}
|
|
665
|
+
/**
|
|
666
|
+
* Obsidian's inline footnotes, `^[…]`, in the paragraph from `start` to `end`.
|
|
667
|
+
* The parser reads them as text, and Live Preview shows one whose text spans
|
|
668
|
+
* lines as Markdown source (issue #363), so one on a line is kept whole, and a
|
|
669
|
+
* paragraph that holds one across lines keeps its lines. Brackets inside, as
|
|
670
|
+
* of a wikilink, are counted to find the footnote's end.
|
|
671
|
+
*/
|
|
672
|
+
function inlineFootnotes(source, start, end, code) {
|
|
673
|
+
const ranges = [];
|
|
674
|
+
/** The end of the code span that holds `at`, or `at` itself. */
|
|
675
|
+
const pastCode = (at) => code.find(([a, b]) => at >= a && at < b)?.[1] ?? at;
|
|
676
|
+
for (let opener = source.indexOf("^[", start); opener >= 0 && opener < end;) {
|
|
677
|
+
// `^[` in a code span is code.
|
|
678
|
+
if (pastCode(opener) !== opener) {
|
|
679
|
+
opener = source.indexOf("^[", pastCode(opener));
|
|
680
|
+
continue;
|
|
681
|
+
}
|
|
682
|
+
// The scan starts at the `[` of `^[`, which opens the first level.
|
|
683
|
+
let depth = 0;
|
|
684
|
+
let at = opener + 1;
|
|
685
|
+
for (; at < end; at++) {
|
|
686
|
+
if (pastCode(at) !== at)
|
|
687
|
+
at = pastCode(at) - 1;
|
|
688
|
+
else if (source[at] === "\\")
|
|
689
|
+
at++;
|
|
690
|
+
else if (source[at] === "[")
|
|
691
|
+
depth++;
|
|
692
|
+
else if (source[at] === "]" && --depth === 0)
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
// An opener that nothing closes is text; a later one can still be a footnote.
|
|
696
|
+
if (at >= end) {
|
|
697
|
+
opener = source.indexOf("^[", opener + 2);
|
|
698
|
+
continue;
|
|
699
|
+
}
|
|
700
|
+
if (lineBreak.test(source.slice(opener, at)))
|
|
701
|
+
return { ranges, reason: "Obsidian inline footnote spanning lines" };
|
|
702
|
+
ranges.push([opener, at + 1]);
|
|
703
|
+
opener = source.indexOf("^[", at + 1);
|
|
704
|
+
}
|
|
705
|
+
return { ranges };
|
|
706
|
+
}
|
|
634
707
|
/** Whether a line of a paragraph, after its container markers, starts with `siteSyntax`. */
|
|
635
708
|
function startsSiteSyntax(text) {
|
|
636
709
|
return text
|
|
@@ -1032,7 +1105,11 @@ const wrap = {
|
|
|
1032
1105
|
// that diagnostics still count one-line math and shortlinks as atoms.
|
|
1033
1106
|
const protections = forge
|
|
1034
1107
|
? forgeProtections(source, start, end, forge)
|
|
1035
|
-
:
|
|
1108
|
+
: document.dialect === "obsidian"
|
|
1109
|
+
? inlineFootnotes(source, start, end, inline.atoms
|
|
1110
|
+
.filter((atom) => atom.joining === "code")
|
|
1111
|
+
.map(({ from, to }) => [from, to]))
|
|
1112
|
+
: { ranges: [] };
|
|
1036
1113
|
for (const [from, to] of protections.ranges)
|
|
1037
1114
|
protection.add(from, to);
|
|
1038
1115
|
for (const [from, to] of templateTags(source.slice(start, end), start))
|