codemirror-obsidian-md 0.0.0-stage → 0.0.0

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.
Files changed (103) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +148 -2
  3. package/dist/editor/cursor.d.ts +8 -0
  4. package/dist/editor/cursor.d.ts.map +1 -0
  5. package/dist/editor/cursor.js +13 -0
  6. package/dist/editor/cursor.js.map +1 -0
  7. package/dist/editor/index.d.ts +12 -0
  8. package/dist/editor/index.d.ts.map +1 -0
  9. package/dist/editor/index.js +11 -0
  10. package/dist/editor/index.js.map +1 -0
  11. package/dist/editor/lock.d.ts +46 -0
  12. package/dist/editor/lock.d.ts.map +1 -0
  13. package/dist/editor/lock.js +98 -0
  14. package/dist/editor/lock.js.map +1 -0
  15. package/dist/editor/mount.d.ts +24 -0
  16. package/dist/editor/mount.d.ts.map +1 -0
  17. package/dist/editor/mount.js +34 -0
  18. package/dist/editor/mount.js.map +1 -0
  19. package/dist/editor/parse.d.ts +17 -0
  20. package/dist/editor/parse.d.ts.map +1 -0
  21. package/dist/editor/parse.js +65 -0
  22. package/dist/editor/parse.js.map +1 -0
  23. package/dist/editor/picker.d.ts +40 -0
  24. package/dist/editor/picker.d.ts.map +1 -0
  25. package/dist/editor/picker.js +132 -0
  26. package/dist/editor/picker.js.map +1 -0
  27. package/dist/editor/providers/callout-embed.d.ts +23 -0
  28. package/dist/editor/providers/callout-embed.d.ts.map +1 -0
  29. package/dist/editor/providers/callout-embed.js +229 -0
  30. package/dist/editor/providers/callout-embed.js.map +1 -0
  31. package/dist/editor/providers/inline.d.ts +20 -0
  32. package/dist/editor/providers/inline.d.ts.map +1 -0
  33. package/dist/editor/providers/inline.js +122 -0
  34. package/dist/editor/providers/inline.js.map +1 -0
  35. package/dist/editor/providers/markdown.d.ts +8 -0
  36. package/dist/editor/providers/markdown.d.ts.map +1 -0
  37. package/dist/editor/providers/markdown.js +151 -0
  38. package/dist/editor/providers/markdown.js.map +1 -0
  39. package/dist/editor/save-flow.d.ts +89 -0
  40. package/dist/editor/save-flow.d.ts.map +1 -0
  41. package/dist/editor/save-flow.js +223 -0
  42. package/dist/editor/save-flow.js.map +1 -0
  43. package/dist/editor/state.d.ts +39 -0
  44. package/dist/editor/state.d.ts.map +1 -0
  45. package/dist/editor/state.js +144 -0
  46. package/dist/editor/state.js.map +1 -0
  47. package/dist/editor/types.d.ts +41 -0
  48. package/dist/editor/types.d.ts.map +1 -0
  49. package/dist/editor/types.js +2 -0
  50. package/dist/editor/types.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +3 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/new-note/index.d.ts +3 -0
  56. package/dist/new-note/index.d.ts.map +1 -0
  57. package/dist/new-note/index.js +3 -0
  58. package/dist/new-note/index.js.map +1 -0
  59. package/dist/new-note/screen.d.ts +21 -0
  60. package/dist/new-note/screen.d.ts.map +1 -0
  61. package/dist/new-note/screen.js +100 -0
  62. package/dist/new-note/screen.js.map +1 -0
  63. package/dist/new-note/validate.d.ts +23 -0
  64. package/dist/new-note/validate.d.ts.map +1 -0
  65. package/dist/new-note/validate.js +65 -0
  66. package/dist/new-note/validate.js.map +1 -0
  67. package/dist/storage/client.d.ts +16 -0
  68. package/dist/storage/client.d.ts.map +1 -0
  69. package/dist/storage/client.js +57 -0
  70. package/dist/storage/client.js.map +1 -0
  71. package/dist/storage/contract.d.ts +14 -0
  72. package/dist/storage/contract.d.ts.map +1 -0
  73. package/dist/storage/contract.js +82 -0
  74. package/dist/storage/contract.js.map +1 -0
  75. package/dist/storage/errors.d.ts +22 -0
  76. package/dist/storage/errors.d.ts.map +1 -0
  77. package/dist/storage/errors.js +29 -0
  78. package/dist/storage/errors.js.map +1 -0
  79. package/dist/storage/filesystem.d.ts +12 -0
  80. package/dist/storage/filesystem.d.ts.map +1 -0
  81. package/dist/storage/filesystem.js +74 -0
  82. package/dist/storage/filesystem.js.map +1 -0
  83. package/dist/storage/github-fake.d.ts +60 -0
  84. package/dist/storage/github-fake.d.ts.map +1 -0
  85. package/dist/storage/github-fake.js +210 -0
  86. package/dist/storage/github-fake.js.map +1 -0
  87. package/dist/storage/github.d.ts +60 -0
  88. package/dist/storage/github.d.ts.map +1 -0
  89. package/dist/storage/github.js +210 -0
  90. package/dist/storage/github.js.map +1 -0
  91. package/dist/storage/http.d.ts +13 -0
  92. package/dist/storage/http.d.ts.map +1 -0
  93. package/dist/storage/http.js +81 -0
  94. package/dist/storage/http.js.map +1 -0
  95. package/dist/storage/index.d.ts +3 -0
  96. package/dist/storage/index.d.ts.map +1 -0
  97. package/dist/storage/index.js +2 -0
  98. package/dist/storage/index.js.map +1 -0
  99. package/dist/storage/types.d.ts +41 -0
  100. package/dist/storage/types.d.ts.map +1 -0
  101. package/dist/storage/types.js +2 -0
  102. package/dist/storage/types.js.map +1 -0
  103. package/package.json +108 -3
@@ -0,0 +1,132 @@
1
+ import { autocompletion, } from "@codemirror/autocomplete";
2
+ const stripExt = (s) => s.replace(/\.mdx?$/i, "");
3
+ const normalize = (s) => stripExt(s).replace(/^\/+/, "").toLowerCase();
4
+ const baseName = (path) => stripExt(path.split("/").pop() ?? path);
5
+ const titleOf = (c) => c.title ?? baseName(c.path);
6
+ function isSubsequence(needle, hay) {
7
+ let i = 0;
8
+ for (const ch of hay)
9
+ if (ch === needle[i])
10
+ i++;
11
+ return i === needle.length;
12
+ }
13
+ /** Lower is better; undefined means no match. */
14
+ function score(name, query, base) {
15
+ const n = name.toLowerCase();
16
+ if (n === query)
17
+ return base;
18
+ if (n.startsWith(query))
19
+ return base + 1;
20
+ if (n.split(/[\s\-_/.]+/).some((w) => w.startsWith(query)))
21
+ return base + 2;
22
+ if (n.includes(query))
23
+ return base + 3;
24
+ return undefined;
25
+ }
26
+ function match(candidate, query) {
27
+ if (!query)
28
+ return { candidate, rank: 0 };
29
+ let best;
30
+ const offer = (rank, alias) => {
31
+ if (rank === undefined || (best && best.rank <= rank))
32
+ return;
33
+ best =
34
+ alias === undefined ? { candidate, rank } : { candidate, rank, alias };
35
+ };
36
+ offer(score(titleOf(candidate), query, 0));
37
+ for (const alias of candidate.aliases ?? []) {
38
+ offer(score(alias, query, 10), alias);
39
+ }
40
+ offer(score(stripExt(candidate.path), query, 20));
41
+ if (!best && isSubsequence(query, titleOf(candidate).toLowerCase())) {
42
+ offer(30);
43
+ }
44
+ return best;
45
+ }
46
+ const byPath = (a, b) => a.candidate.path < b.candidate.path
47
+ ? -1
48
+ : a.candidate.path > b.candidate.path
49
+ ? 1
50
+ : 0;
51
+ function rankMatches(candidates, rawQuery) {
52
+ const query = rawQuery.trim().toLowerCase();
53
+ const matches = [];
54
+ for (const c of candidates) {
55
+ const m = match(c, query);
56
+ if (m)
57
+ matches.push(m);
58
+ }
59
+ return matches.sort((a, b) => a.rank - b.rank ||
60
+ (query ? titleOf(a.candidate).length - titleOf(b.candidate).length : 0) ||
61
+ byPath(a, b));
62
+ }
63
+ /**
64
+ * Ranks Notes by the typed text: exact title, title prefix, word start,
65
+ * substring, Alias, path, then subsequence. Ties: shorter title, then path.
66
+ * An empty query returns every candidate by path.
67
+ */
68
+ export function rankCandidates(candidates, query) {
69
+ return rankMatches(candidates, query).map((m) => m.candidate);
70
+ }
71
+ /**
72
+ * The Wiki Link target that reaches `candidate`: the bare name when it
73
+ * resolves to the Note, otherwise the path (both without `.md`).
74
+ */
75
+ export function wikiLinkTarget(candidate, all, resolver) {
76
+ const bare = baseName(candidate.path);
77
+ const full = stripExt(candidate.path).replace(/^\/+/, "");
78
+ if (resolver) {
79
+ const r = resolver.resolve(bare);
80
+ const ok = r.exists &&
81
+ r.kind === "note" &&
82
+ normalize(r.path) === normalize(candidate.path);
83
+ return ok ? bare : full;
84
+ }
85
+ const clash = all.some((o) => o !== candidate && baseName(o.path).toLowerCase() === bare.toLowerCase());
86
+ return clash ? full : bare;
87
+ }
88
+ function apply(link) {
89
+ return (view, _c, from, to) => {
90
+ const closed = view.state.sliceDoc(to, to + 2) === "]]";
91
+ view.dispatch({
92
+ changes: { from, to: closed ? to + 2 : to, insert: `${link}]]` },
93
+ selection: { anchor: from + link.length + 2 },
94
+ userEvent: "input.complete",
95
+ });
96
+ };
97
+ }
98
+ /**
99
+ * The `[[` picker: typing `[[` opens a list of the host's Notes ranked by the
100
+ * text typed after it; choosing one inserts a closed Wiki Link.
101
+ */
102
+ export function pickerExtension(options) {
103
+ const { resolver, maxResults = 100 } = options;
104
+ const source = (context) => {
105
+ const before = context.matchBefore(/\[\[[^\]\n|#^]*/);
106
+ if (!before)
107
+ return null;
108
+ const from = before.from + 2;
109
+ const all = typeof options.candidates === "function"
110
+ ? options.candidates()
111
+ : options.candidates;
112
+ const query = context.state.sliceDoc(from, context.pos);
113
+ const completions = rankMatches(all, query)
114
+ .slice(0, maxResults)
115
+ .map(({ candidate, alias }) => {
116
+ const target = wikiLinkTarget(candidate, all, resolver);
117
+ const folder = candidate.path.includes("/")
118
+ ? candidate.path.slice(0, candidate.path.lastIndexOf("/"))
119
+ : undefined;
120
+ const detail = alias !== undefined ? `alias ${alias}` : folder;
121
+ return {
122
+ label: titleOf(candidate),
123
+ type: "text",
124
+ apply: apply(alias === undefined ? target : `${target}|${alias}`),
125
+ ...(detail !== undefined ? { detail } : {}),
126
+ };
127
+ });
128
+ return { from, options: completions, filter: false };
129
+ };
130
+ return autocompletion({ override: [source], activateOnTypingDelay: 0 });
131
+ }
132
+ //# sourceMappingURL=picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.js","sourceRoot":"","sources":["../../src/editor/picker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Extension } from "@codemirror/state";
2
+ import { type CalloutTypeDefinition } from "remark-obsidian-md/syntax";
3
+ export interface CalloutEmbedOptions {
4
+ /** Custom Callout types, layered over the canonical ones (as in the Wiki). */
5
+ types?: Record<string, CalloutTypeDefinition>;
6
+ /**
7
+ * Turns an Asset Embed's target into an image URL. Return `undefined` when
8
+ * the Asset does not exist (it then shows as an unresolved chip). Default:
9
+ * the target itself.
10
+ */
11
+ resolveAsset?: (target: string) => string | undefined;
12
+ }
13
+ /**
14
+ * Live Preview for Callouts and Embeds (a Callout renders with its type's
15
+ * color and icon, an Asset Embed as its image, a Note Embed as a chip; each
16
+ * shows its raw syntax while the cursor is inside). Pass it in `extensions`.
17
+ *
18
+ * The widgets reuse the plugin Stylesheet class names, which are scoped under
19
+ * `.markdown-rendered` (ADR 0008): this adds that class to the editor, and the
20
+ * consumer imports `remark-obsidian-md/styles.css` (and a dark variant).
21
+ */
22
+ export declare function calloutEmbed(options?: CalloutEmbedOptions): Extension;
23
+ //# sourceMappingURL=callout-embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout-embed.d.ts","sourceRoot":"","sources":["../../../src/editor/providers/callout-embed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAS,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,2BAA2B,CAAC;AAKnC,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC9C;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACvD;AA8OD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAOzE"}
@@ -0,0 +1,229 @@
1
+ import { Decoration, EditorView, WidgetType } from "@codemirror/view";
2
+ import { resolveCalloutType, } from "remark-obsidian-md/syntax";
3
+ import { constructProviders } from "../state.js";
4
+ const IMAGE_EXTENSIONS = new Set([
5
+ "png",
6
+ "jpg",
7
+ "jpeg",
8
+ "gif",
9
+ "svg",
10
+ "webp",
11
+ "avif",
12
+ "bmp",
13
+ "ico",
14
+ ]);
15
+ // -- Callouts ---------------------------------------------------------------
16
+ /** First line of a Callout: `> [!type]+ Title`. */
17
+ const CALLOUT_LINE = /^[ \t]*>[ \t]?\[!([^\]\n]+)\]([+-]?)[ \t]*(.*)$/;
18
+ const QUOTE_PREFIX = /^[ \t]*>[ \t]?/;
19
+ function resolveType(raw, custom) {
20
+ const { type, definition, defaultTitle } = resolveCalloutType(raw, custom);
21
+ return {
22
+ type,
23
+ icon: definition.icon ?? "pencil",
24
+ color: definition.color,
25
+ title: defaultTitle,
26
+ };
27
+ }
28
+ class CalloutTitleWidget extends WidgetType {
29
+ icon;
30
+ title;
31
+ constructor(icon, title) {
32
+ super();
33
+ this.icon = icon;
34
+ this.title = title;
35
+ }
36
+ eq(other) {
37
+ return other.icon === this.icon && other.title === this.title;
38
+ }
39
+ toDOM() {
40
+ const wrap = document.createElement("div");
41
+ wrap.className = "callout-title";
42
+ const icon = document.createElement("span");
43
+ icon.className = "callout-title-icon";
44
+ icon.setAttribute("data-icon", this.icon);
45
+ const inner = document.createElement("div");
46
+ inner.className = "callout-title-inner";
47
+ inner.textContent = this.title;
48
+ wrap.append(icon, inner);
49
+ return wrap;
50
+ }
51
+ }
52
+ function createCalloutProvider(options) {
53
+ const custom = options.types ?? {};
54
+ return {
55
+ name: "callout",
56
+ types: ["blockquote"],
57
+ decorate(construct, { state, revealed }) {
58
+ const doc = state.doc;
59
+ const first = doc.lineAt(construct.from);
60
+ const match = CALLOUT_LINE.exec(first.text);
61
+ if (!match)
62
+ return null;
63
+ const { type, icon, color, title } = resolveType(match[1] ?? "", custom);
64
+ const typed = (match[3] ?? "").trim();
65
+ const attributes = { "data-callout": type };
66
+ if (color)
67
+ attributes.style = `--callout-color: ${color}`;
68
+ const out = [];
69
+ const last = doc.lineAt(construct.to);
70
+ for (let n = first.number; n <= last.number; n++) {
71
+ const line = doc.line(n);
72
+ const isFirst = n === first.number;
73
+ const classes = [
74
+ "callout",
75
+ "cm-callout",
76
+ isFirst ? "cm-callout-first" : "callout-content",
77
+ n === last.number ? "cm-callout-last" : "",
78
+ ]
79
+ .filter(Boolean)
80
+ .join(" ");
81
+ out.push(Decoration.line({ class: classes, attributes }).range(line.from));
82
+ if (revealed)
83
+ continue;
84
+ if (isFirst) {
85
+ out.push(Decoration.replace({
86
+ widget: new CalloutTitleWidget(icon, typed || title),
87
+ }).range(line.from, line.to));
88
+ }
89
+ else {
90
+ const prefix = QUOTE_PREFIX.exec(line.text)?.[0];
91
+ if (prefix) {
92
+ out.push(Decoration.replace({}).range(line.from, line.from + prefix.length));
93
+ }
94
+ }
95
+ }
96
+ return out;
97
+ },
98
+ };
99
+ }
100
+ // -- Embeds -----------------------------------------------------------------
101
+ class ImageWidget extends WidgetType {
102
+ src;
103
+ alt;
104
+ width;
105
+ height;
106
+ constructor(src, alt, width, height) {
107
+ super();
108
+ this.src = src;
109
+ this.alt = alt;
110
+ this.width = width;
111
+ this.height = height;
112
+ }
113
+ eq(o) {
114
+ return (o.src === this.src &&
115
+ o.alt === this.alt &&
116
+ o.width === this.width &&
117
+ o.height === this.height);
118
+ }
119
+ toDOM() {
120
+ const img = document.createElement("img");
121
+ img.className = "internal-embed";
122
+ img.setAttribute("src", this.src);
123
+ img.setAttribute("alt", this.alt);
124
+ if (this.width)
125
+ img.setAttribute("width", this.width);
126
+ if (this.height)
127
+ img.setAttribute("height", this.height);
128
+ return img;
129
+ }
130
+ }
131
+ class ChipWidget extends WidgetType {
132
+ label;
133
+ unresolved;
134
+ constructor(label, unresolved) {
135
+ super();
136
+ this.label = label;
137
+ this.unresolved = unresolved;
138
+ }
139
+ eq(o) {
140
+ return o.label === this.label && o.unresolved === this.unresolved;
141
+ }
142
+ toDOM() {
143
+ const chip = document.createElement("span");
144
+ chip.className = `internal-embed cm-embed-chip${this.unresolved ? " is-unresolved" : ""}`;
145
+ chip.textContent = this.label;
146
+ return chip;
147
+ }
148
+ }
149
+ function createEmbedProvider(options) {
150
+ const resolveAsset = options.resolveAsset ?? ((target) => target);
151
+ return {
152
+ name: "embed",
153
+ types: ["embed"],
154
+ decorate(construct, { revealed }) {
155
+ if (revealed)
156
+ return null;
157
+ const value = construct.node.value;
158
+ if (typeof value !== "string")
159
+ return null;
160
+ const bar = value.indexOf("|");
161
+ const target = (bar === -1 ? value : value.slice(0, bar)).trim();
162
+ const alias = bar === -1 ? undefined : value.slice(bar + 1).trim();
163
+ if (!target)
164
+ return null;
165
+ const path = target.split("#")[0] ?? target;
166
+ const ext = path.includes(".")
167
+ ? path.slice(path.lastIndexOf(".") + 1).toLowerCase()
168
+ : "";
169
+ let widget;
170
+ if (IMAGE_EXTENSIONS.has(ext)) {
171
+ const src = resolveAsset(path);
172
+ const size = alias?.match(/^(\d+)(?:x(\d+))?$/i);
173
+ widget = src
174
+ ? new ImageWidget(src, size ? "" : (alias ?? ""), size?.[1], size?.[2])
175
+ : new ChipWidget(alias || target, true);
176
+ }
177
+ else {
178
+ widget = new ChipWidget(alias || target, false);
179
+ }
180
+ return Decoration.replace({ widget }).range(construct.from, construct.to);
181
+ },
182
+ };
183
+ }
184
+ // -- Packaging --------------------------------------------------------------
185
+ const theme = EditorView.baseTheme({
186
+ ".cm-callout": {
187
+ paddingLeft: "12px",
188
+ paddingRight: "12px",
189
+ borderLeft: "1px solid color-mix(in srgb, var(--callout-color) 30%, transparent)",
190
+ borderRight: "1px solid color-mix(in srgb, var(--callout-color) 30%, transparent)",
191
+ backgroundColor: "color-mix(in srgb, var(--callout-color) 10%, transparent)",
192
+ },
193
+ ".cm-callout-first": {
194
+ borderTop: "1px solid color-mix(in srgb, var(--callout-color) 30%, transparent)",
195
+ borderTopLeftRadius: "6px",
196
+ borderTopRightRadius: "6px",
197
+ paddingTop: "8px",
198
+ },
199
+ ".cm-callout-last": {
200
+ borderBottom: "1px solid color-mix(in srgb, var(--callout-color) 30%, transparent)",
201
+ borderBottomLeftRadius: "6px",
202
+ borderBottomRightRadius: "6px",
203
+ paddingBottom: "8px",
204
+ },
205
+ ".cm-embed-chip": {
206
+ padding: "0 6px",
207
+ borderRadius: "4px",
208
+ backgroundColor: "color-mix(in srgb, currentColor 10%, transparent)",
209
+ },
210
+ ".cm-content img.internal-embed": { maxWidth: "100%" },
211
+ });
212
+ /**
213
+ * Live Preview for Callouts and Embeds (a Callout renders with its type's
214
+ * color and icon, an Asset Embed as its image, a Note Embed as a chip; each
215
+ * shows its raw syntax while the cursor is inside). Pass it in `extensions`.
216
+ *
217
+ * The widgets reuse the plugin Stylesheet class names, which are scoped under
218
+ * `.markdown-rendered` (ADR 0008): this adds that class to the editor, and the
219
+ * consumer imports `remark-obsidian-md/styles.css` (and a dark variant).
220
+ */
221
+ export function calloutEmbed(options = {}) {
222
+ return [
223
+ constructProviders.of(createCalloutProvider(options)),
224
+ constructProviders.of(createEmbedProvider(options)),
225
+ EditorView.editorAttributes.of({ class: "markdown-rendered" }),
226
+ theme,
227
+ ];
228
+ }
229
+ //# sourceMappingURL=callout-embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout-embed.js","sourceRoot":"","sources":["../../../src/editor/providers/callout-embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ConstructProvider, NoteParser } from "../types.js";
2
+ /** Wiki Link (`[[Note|Alias]]`): the label as a link, markers hidden. */
3
+ export declare const wikiLinkProvider: ConstructProvider;
4
+ /** Highlight (`==text==`) with its Highlight Color, as the Wiki's `<mark>`. */
5
+ export declare const highlightProvider: ConstructProvider;
6
+ /** Comment (`%%…%%`): omitted from rendered output, so hidden. */
7
+ export declare const commentProvider: ConstructProvider;
8
+ /** Inline Footnote (`^[text]`): superscript content, markers hidden. */
9
+ export declare const footnoteProvider: ConstructProvider;
10
+ /** Block ID (`^id`): omitted from rendered output, so hidden. */
11
+ export declare const blockIdProvider: ConstructProvider;
12
+ /** All Live Preview providers for Obsidian inline syntax. */
13
+ export declare const inlineProviders: readonly ConstructProvider[];
14
+ /**
15
+ * Wraps a parser to also yield `blockId` constructs: the parse does not
16
+ * produce them as nodes. A Block ID is a trailing `^id` of a paragraph or
17
+ * heading, so code and other plain-source regions are never scanned.
18
+ */
19
+ export declare function blockIdParser(base?: NoteParser): NoteParser;
20
+ //# sourceMappingURL=inline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../../src/editor/providers/inline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,iBAAiB,EACjB,UAAU,EAEX,MAAM,aAAa,CAAC;AAKrB,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,iBAmB9B,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,iBAyB/B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,iBAa9B,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAE,SAAS,iBAAiB,EAMvD,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,GAAE,UAA+B,GACpC,UAAU,CAmBZ"}
@@ -0,0 +1,122 @@
1
+ import { Decoration } from "@codemirror/view";
2
+ import { HIGHLIGHT_COLORS } from "remark-obsidian-md/syntax";
3
+ import { createNoteParser } from "../parse.js";
4
+ /** Hides source text; the document is untouched. */
5
+ const hide = Decoration.replace({});
6
+ /** Wiki Link (`[[Note|Alias]]`): the label as a link, markers hidden. */
7
+ export const wikiLinkProvider = {
8
+ name: "wiki-link",
9
+ types: ["wikiLink"],
10
+ decorate(c, { revealed }) {
11
+ if (revealed)
12
+ return null;
13
+ const value = c.node.value ?? "";
14
+ const pipe = value.indexOf("|");
15
+ const labelFrom = c.from + (pipe === -1 ? 2 : 2 + pipe + 1);
16
+ const labelTo = c.to - 2;
17
+ if (labelTo <= labelFrom)
18
+ return null;
19
+ return [
20
+ hide.range(c.from, labelFrom),
21
+ Decoration.mark({
22
+ tagName: "a",
23
+ attributes: { class: "internal-link" },
24
+ }).range(labelFrom, labelTo),
25
+ hide.range(labelTo, c.to),
26
+ ];
27
+ },
28
+ };
29
+ /** Highlight (`==text==`) with its Highlight Color, as the Wiki's `<mark>`. */
30
+ export const highlightProvider = {
31
+ name: "highlight",
32
+ types: ["obsidianHighlight"],
33
+ decorate(c, { revealed, state }) {
34
+ if (revealed)
35
+ return null;
36
+ const contentFrom = c.from + 2;
37
+ const contentTo = c.to - 2;
38
+ if (contentTo <= contentFrom)
39
+ return null;
40
+ const first = state.sliceDoc(contentFrom, contentTo).codePointAt(0);
41
+ const emoji = first === undefined ? "" : String.fromCodePoint(first);
42
+ const color = HIGHLIGHT_COLORS[emoji];
43
+ const from = contentFrom + (color ? emoji.length : 0);
44
+ return [
45
+ hide.range(c.from, from),
46
+ ...(contentTo > from
47
+ ? [
48
+ Decoration.mark({
49
+ tagName: "mark",
50
+ ...(color ? { attributes: { "data-highlight": color } } : {}),
51
+ }).range(from, contentTo),
52
+ ]
53
+ : []),
54
+ hide.range(contentTo, c.to),
55
+ ];
56
+ },
57
+ };
58
+ /** Comment (`%%…%%`): omitted from rendered output, so hidden. */
59
+ export const commentProvider = {
60
+ name: "comment",
61
+ types: ["obsidianComment"],
62
+ decorate: (c, { revealed }) => revealed || c.to <= c.from ? null : hide.range(c.from, c.to),
63
+ };
64
+ /** Inline Footnote (`^[text]`): superscript content, markers hidden. */
65
+ export const footnoteProvider = {
66
+ name: "footnote",
67
+ types: ["obsidianFootnote"],
68
+ decorate(c, { revealed }) {
69
+ if (revealed || c.to - c.from < 3)
70
+ return null;
71
+ return [
72
+ hide.range(c.from, c.from + 2),
73
+ ...(c.to - 1 > c.from + 2
74
+ ? [Decoration.mark({ tagName: "sup" }).range(c.from + 2, c.to - 1)]
75
+ : []),
76
+ hide.range(c.to - 1, c.to),
77
+ ];
78
+ },
79
+ };
80
+ /** Block ID (`^id`): omitted from rendered output, so hidden. */
81
+ export const blockIdProvider = {
82
+ name: "block-id",
83
+ types: ["blockId"],
84
+ decorate: (c, { revealed }) => revealed || c.to <= c.from ? null : hide.range(c.from, c.to),
85
+ };
86
+ /** All Live Preview providers for Obsidian inline syntax. */
87
+ export const inlineProviders = [
88
+ wikiLinkProvider,
89
+ highlightProvider,
90
+ commentProvider,
91
+ footnoteProvider,
92
+ blockIdProvider,
93
+ ];
94
+ const BLOCK_ID = /\s\^([A-Za-z0-9-]+)[ \t]*$/;
95
+ /**
96
+ * Wraps a parser to also yield `blockId` constructs: the parse does not
97
+ * produce them as nodes. A Block ID is a trailing `^id` of a paragraph or
98
+ * heading, so code and other plain-source regions are never scanned.
99
+ */
100
+ export function blockIdParser(base = createNoteParser()) {
101
+ return (text) => {
102
+ const constructs = base(text);
103
+ const ids = [];
104
+ for (const c of constructs) {
105
+ if (c.type !== "paragraph" && c.type !== "heading")
106
+ continue;
107
+ const match = BLOCK_ID.exec(text.slice(c.from, c.to));
108
+ if (!match?.[1])
109
+ continue;
110
+ const from = c.from + match.index + 1;
111
+ const to = from + match[1].length + 1;
112
+ ids.push({
113
+ type: "blockId",
114
+ from,
115
+ to,
116
+ node: { type: "text", value: text.slice(from, to) },
117
+ });
118
+ }
119
+ return [...constructs, ...ids];
120
+ };
121
+ }
122
+ //# sourceMappingURL=inline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../../src/editor/providers/inline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ConstructProvider } from "../types.js";
2
+ /**
3
+ * Live Preview for standard Markdown: headings, emphasis, inline code, lists,
4
+ * task lists and quotes. Each renders in place while the cursor is outside it
5
+ * and reveals its raw syntax while the cursor touches it.
6
+ */
7
+ export declare const markdownProvider: ConstructProvider;
8
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/editor/providers/markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA0DrD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAqG9B,CAAC"}