obsidian-mcp-server 3.5.3 → 3.5.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.
Files changed (86) hide show
  1. package/AGENTS.md +47 -6
  2. package/CLAUDE.md +47 -6
  3. package/Dockerfile +3 -2
  4. package/README.md +144 -100
  5. package/changelog/3.5.x/3.5.3.md +4 -3
  6. package/changelog/3.5.x/3.5.4.md +42 -0
  7. package/changelog/3.5.x/3.5.5.md +20 -0
  8. package/changelog/template.md +7 -7
  9. package/dist/config/server-config.d.ts +1 -1
  10. package/dist/config/server-config.d.ts.map +1 -1
  11. package/dist/config/server-config.js +9 -2
  12. package/dist/config/server-config.js.map +1 -1
  13. package/dist/index.js +9 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -1
  16. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +19 -1
  17. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/_shared/schemas.js +1 -1
  19. package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/index.d.ts +157 -65
  21. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +13 -2
  23. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -1
  24. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +14 -3
  25. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -1
  26. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +9 -0
  27. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -1
  28. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +9 -0
  29. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -1
  30. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +1 -0
  31. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +1 -0
  33. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -1
  34. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +9 -0
  35. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -1
  36. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +19 -26
  37. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -1
  38. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +3 -0
  39. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -1
  40. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +3 -0
  41. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -1
  42. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +13 -0
  43. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -1
  44. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +19 -1
  45. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -1
  46. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +17 -2
  47. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -1
  48. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +22 -3
  49. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -1
  50. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +4 -0
  51. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -1
  52. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +4 -0
  53. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -1
  54. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +13 -2
  55. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -1
  56. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +14 -3
  57. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -1
  58. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +10 -2
  59. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -1
  60. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +10 -2
  61. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -1
  62. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +12 -5
  63. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -1
  64. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +29 -24
  65. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -1
  66. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +12 -2
  67. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -1
  68. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +20 -10
  69. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -1
  70. package/dist/services/obsidian/frontmatter-ops.d.ts +44 -11
  71. package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -1
  72. package/dist/services/obsidian/frontmatter-ops.js +370 -69
  73. package/dist/services/obsidian/frontmatter-ops.js.map +1 -1
  74. package/dist/services/obsidian/obsidian-service.d.ts +26 -5
  75. package/dist/services/obsidian/obsidian-service.d.ts.map +1 -1
  76. package/dist/services/obsidian/obsidian-service.js +469 -85
  77. package/dist/services/obsidian/obsidian-service.js.map +1 -1
  78. package/dist/services/obsidian/section-extractor.d.ts +33 -3
  79. package/dist/services/obsidian/section-extractor.d.ts.map +1 -1
  80. package/dist/services/obsidian/section-extractor.js +115 -75
  81. package/dist/services/obsidian/section-extractor.js.map +1 -1
  82. package/dist/services/obsidian/types.d.ts +11 -4
  83. package/dist/services/obsidian/types.d.ts.map +1 -1
  84. package/manifest.json +1 -1
  85. package/package.json +9 -9
  86. package/server.json +3 -3
@@ -4,7 +4,7 @@
4
4
  * tools when the upstream Local REST API has no single-call equivalent.
5
5
  * @module services/obsidian/frontmatter-ops
6
6
  */
7
- import { isMap, parseDocument } from 'yaml';
7
+ import { isMap, isScalar, isSeq, parseDocument, Scalar } from 'yaml';
8
8
  /**
9
9
  * The one frontmatter boundary: an opening `---` alone on the first line, YAML,
10
10
  * then a `---` that starts its own line. The YAML span and the newline that
@@ -52,9 +52,13 @@ export function splice(content) {
52
52
  }
53
53
  /**
54
54
  * Describe why `yamlText` is not usable as a frontmatter block, or `undefined`
55
- * when it is. Catches YAML that no longer parses and YAML that parses to
55
+ * when it is. Catches YAML that no longer parses, YAML that parses to
56
56
  * something other than a mapping — the two states in which Obsidian reads no
57
- * properties at all.
57
+ * properties at all — and YAML that parses but cannot be emitted again.
58
+ *
59
+ * That last one is its own class: an unresolved alias (`bad: *missing`) is
60
+ * accepted by `parseDocument` with an empty `doc.errors` and refused only by
61
+ * the emitter, so the round trip is what surfaces it.
58
62
  *
59
63
  * It cannot catch an edit that stays well-formed while meaning something else:
60
64
  * a renamed key, a scalar that re-parses as a different type. Those are valid
@@ -68,7 +72,29 @@ export function frontmatterParseError(yamlText) {
68
72
  if (doc.contents !== null && !isMap(doc.contents)) {
69
73
  return 'Frontmatter must be a YAML mapping of properties.';
70
74
  }
71
- return;
75
+ return serializeError(doc);
76
+ }
77
+ /** The emitter's own complaint about `doc`, or `undefined` when it round-trips. */
78
+ function serializeError(doc) {
79
+ try {
80
+ doc.toString({ lineWidth: 0 });
81
+ return;
82
+ }
83
+ catch (err) {
84
+ return err instanceof Error ? err.message : String(err);
85
+ }
86
+ }
87
+ /**
88
+ * The line ending a rewritten block is emitted with. `doc.toString()` always
89
+ * emits LF and the fences used to be hard-coded to it, which left a CRLF note
90
+ * with an LF block above a CRLF body. An existing block keeps its own ending;
91
+ * a block being created on a note that had none follows the body's first line
92
+ * (issue #125).
93
+ */
94
+ function blockEol(spliced) {
95
+ if (spliced.hasFrontmatter)
96
+ return spliced.open.endsWith('\r\n') ? '\r\n' : '\n';
97
+ return /\r\n|\n/.exec(spliced.body)?.[0] === '\r\n' ? '\r\n' : '\n';
72
98
  }
73
99
  /**
74
100
  * Re-emit the parsed frontmatter document between `---` fences, preserving the
@@ -76,41 +102,71 @@ export function frontmatterParseError(yamlText) {
76
102
  * these helpers parse with `yaml`'s CST-backed `parseDocument` and edit nodes in
77
103
  * place rather than round-tripping the block through a plain object (which drops
78
104
  * comments and rewrites untouched scalars, e.g. `date: 2026-06-29` → an ISO
79
- * timestamp). When no keys remain, the whole block is dropped and the body's
80
- * leading whitespace trimmed.
105
+ * timestamp). When no keys remain, the whole block is dropped along with the
106
+ * whitespace-only lines that separated it from the body.
81
107
  *
82
108
  * The body is re-attached verbatim. `FM_RE` consumes the newline that closes
83
- * the fence line and nothing more, so the template's trailing `\n` replaces
84
- * exactly what was eaten — the blank separator line before the body (or its
85
- * absence, or several of them) survives the rewrite byte for byte.
109
+ * the fence line and nothing more, so the trailing separator replaces exactly
110
+ * what was eaten — the blank line before the body (or its absence, or several
111
+ * of them) survives the rewrite byte for byte.
112
+ *
113
+ * Emitting can still fail after a mutation that parsed cleanly: deleting the
114
+ * key that owned an anchor leaves every alias to it dangling, and the emitter
115
+ * is the only thing that notices. That is a refusal, not a throw — the caller
116
+ * decides what to tell the user, and no write goes out either way.
86
117
  */
87
- function serializeFrontmatter(doc, body) {
118
+ function serializeFrontmatter(doc, spliced) {
88
119
  const node = doc.contents;
89
120
  if (!node || (isMap(node) && node.items.length === 0)) {
90
- return body.replace(/^\s+/, '');
121
+ /**
122
+ * The block is gone, and only the whitespace-only lines that separated it
123
+ * from the body go with it. A blanket `^\s+` also ate the first content
124
+ * line's own indentation, which is what an indented code block is made of
125
+ * (issue #125).
126
+ */
127
+ return { ok: true, content: spliced.body.replace(/^(?:[ \t]*\r?\n)+/, '') };
128
+ }
129
+ let yamlText;
130
+ try {
131
+ yamlText = doc.toString({ lineWidth: 0 }).trimEnd();
91
132
  }
92
- const yamlText = doc.toString({ lineWidth: 0 }).trimEnd();
93
- return `---\n${yamlText}\n---\n${body}`;
133
+ catch (err) {
134
+ return { ok: false, problem: err instanceof Error ? err.message : String(err) };
135
+ }
136
+ const eol = blockEol(spliced);
137
+ return {
138
+ ok: true,
139
+ content: `---${eol}${yamlText.split('\n').join(eol)}${eol}---${eol}${spliced.body}`,
140
+ };
94
141
  }
95
142
  /**
96
- * Returns the full file content with `key` removed from the frontmatter.
97
- * If the file has no frontmatter or the key isn't present, returns content
98
- * unchanged.
143
+ * The full file content with `key` removed from the frontmatter. A file with
144
+ * no frontmatter, or one where the key isn't present, comes back unchanged.
145
+ *
146
+ * Refuses — rather than writing — when the existing block does not parse as a
147
+ * mapping or the mutation leaves YAML that cannot be emitted. Both were silent
148
+ * data loss before: a block the parser recovered into a single malformed key
149
+ * was "emptied" by deleting that key, taking every sibling property and the
150
+ * block itself with it (issue #123).
99
151
  */
100
152
  export function deleteFrontmatterKey(content, key) {
101
- const { hasFrontmatter, yamlText, body } = splice(content);
102
- if (!hasFrontmatter)
103
- return content;
104
- const doc = parseDocument(yamlText);
153
+ const spliced = splice(content);
154
+ if (!spliced.hasFrontmatter)
155
+ return { ok: true, content };
156
+ const problem = frontmatterParseError(spliced.yamlText);
157
+ if (problem)
158
+ return { ok: false, problem };
159
+ const doc = parseDocument(spliced.yamlText);
105
160
  if (!doc.has(key))
106
- return content;
161
+ return { ok: true, content };
107
162
  doc.delete(key);
108
- return serializeFrontmatter(doc, body);
163
+ return serializeFrontmatter(doc, spliced);
109
164
  }
110
165
  /**
111
166
  * Add or remove tags across frontmatter (`tags:` array) and inline `#tag`
112
- * syntax. Inline detection skips code spans, link spans, and a hash escaped as
113
- * `\#` — see `splitProtectedSegments` and `TAG_LEFT_BOUNDARY`.
167
+ * syntax. Inline detection skips code spans, link spans, HTML comments, math,
168
+ * and a `#` preceded by anything but whitespace, line start, or markup such
169
+ * as `**` or `<br>` — see `splitProtectedSegments` and `TAG_LEFT_BOUNDARY`.
114
170
  */
115
171
  export function reconcileTags(content, tags, operation, location) {
116
172
  const norm = (t) => t.replace(/^#+/, '').trim();
@@ -119,7 +175,16 @@ export function reconcileTags(content, tags, operation, location) {
119
175
  const skipped = new Set();
120
176
  let updated = content;
121
177
  if (location === 'frontmatter' || location === 'both') {
122
- updated = mutateFrontmatterTags(updated, wanted, operation, applied, skipped);
178
+ const edit = mutateFrontmatterTags(updated, wanted, operation, applied, skipped);
179
+ /**
180
+ * A refusal ends the whole call, `both` included. The frontmatter half runs
181
+ * first precisely so that returning here leaves the note byte-identical —
182
+ * proceeding to the inline half would tag the body on the strength of a
183
+ * frontmatter edit that never happened (issue #124).
184
+ */
185
+ if (!edit.ok)
186
+ return edit;
187
+ updated = edit.content;
123
188
  }
124
189
  if (location === 'inline' || location === 'both') {
125
190
  updated = mutateInlineTags(updated, wanted, operation, applied, skipped);
@@ -129,46 +194,105 @@ export function reconcileTags(content, tags, operation, location) {
129
194
  // it from skipped.
130
195
  for (const t of applied)
131
196
  skipped.delete(t);
132
- return { content: updated, applied: [...applied], skipped: [...skipped] };
197
+ return { ok: true, content: updated, applied: [...applied], skipped: [...skipped] };
133
198
  }
134
199
  function mutateFrontmatterTags(content, tags, operation, applied, skipped) {
135
- const { hasFrontmatter, yamlText, body } = splice(content);
136
- const doc = parseDocument(hasFrontmatter ? yamlText : '');
137
- const fm = (doc.toJS() ?? {});
138
- const existing = normalizeTagList(fm.tags);
139
- const set = new Set(existing);
140
- let changed = false;
200
+ const spliced = splice(content);
201
+ if (spliced.hasFrontmatter) {
202
+ const problem = frontmatterParseError(spliced.yamlText);
203
+ if (problem)
204
+ return { ok: false, problem };
205
+ }
206
+ const doc = parseDocument(spliced.hasFrontmatter ? spliced.yamlText : '');
207
+ const node = isMap(doc.contents) ? doc.get('tags', true) : undefined;
208
+ const changed = isSeq(node)
209
+ ? mutateTagSeq(doc, node, tags, operation, applied, skipped)
210
+ : rewriteTagList(doc, node, tags, operation, applied, skipped);
211
+ if (!changed)
212
+ return { ok: true, content };
213
+ return serializeFrontmatter(doc, spliced);
214
+ }
215
+ /**
216
+ * The tags whose state actually differs from `present`, with every tag
217
+ * recorded as applied or skipped along the way. `present` is updated as the
218
+ * walk goes, so a tag named twice in one call changes once and is skipped
219
+ * thereafter — both shapes below share this bookkeeping and differ only in
220
+ * what they then do to the document.
221
+ */
222
+ function planTagChanges(tags, operation, present, applied, skipped) {
223
+ const adding = operation === 'add';
224
+ const changes = [];
141
225
  for (const tag of tags) {
226
+ if (present.has(tag) === adding) {
227
+ skipped.add(tag);
228
+ continue;
229
+ }
230
+ if (adding)
231
+ present.add(tag);
232
+ else
233
+ present.delete(tag);
234
+ changes.push(tag);
235
+ applied.add(tag);
236
+ }
237
+ return changes;
238
+ }
239
+ /**
240
+ * Edit an existing `tags:` sequence node in place.
241
+ *
242
+ * In place rather than `doc.set('tags', [...normalized])`: replacing the node
243
+ * discards everything the caller never named. `tags:` is free-form YAML and a
244
+ * vault may hold entries this server has no reading of — a number, a nested
245
+ * map — which the normalized string set silently dropped on the next write,
246
+ * along with the comments and quoting of every item that was not being touched
247
+ * (issue #123).
248
+ */
249
+ function mutateTagSeq(doc, seq, tags, operation, applied, skipped) {
250
+ const present = new Set(seq.items.map(itemTag).filter((t) => t !== undefined));
251
+ const changes = planTagChanges(tags, operation, present, applied, skipped);
252
+ if (changes.length === 0)
253
+ return false;
254
+ for (const tag of changes) {
142
255
  if (operation === 'add') {
143
- if (set.has(tag))
144
- skipped.add(tag);
145
- else {
146
- set.add(tag);
147
- applied.add(tag);
148
- changed = true;
149
- }
256
+ seq.items.push(new Scalar(tag));
257
+ continue;
150
258
  }
151
- else {
152
- if (set.has(tag)) {
153
- set.delete(tag);
154
- applied.add(tag);
155
- changed = true;
156
- }
157
- else {
158
- skipped.add(tag);
159
- }
259
+ for (let i = seq.items.length - 1; i >= 0; i--) {
260
+ if (itemTag(seq.items[i]) === tag)
261
+ seq.items.splice(i, 1);
160
262
  }
161
263
  }
162
- if (!changed)
163
- return content;
264
+ /**
265
+ * The key goes only once nothing at all is left. A sequence still holding
266
+ * entries that are not string tags keeps them, and keeps the key they live
267
+ * under.
268
+ */
269
+ if (seq.items.length === 0)
270
+ doc.delete('tags');
271
+ return true;
272
+ }
273
+ /** The normalized tag an item carries, or `undefined` when it is not a string scalar. */
274
+ function itemTag(item) {
275
+ if (!isScalar(item) || typeof item.value !== 'string')
276
+ return;
277
+ const tag = item.value.replace(/^#+/, '').trim();
278
+ return tag.length > 0 ? tag : undefined;
279
+ }
280
+ /**
281
+ * The two shapes with no sequence node to edit: a string-valued `tags:`
282
+ * (`tags: alpha beta`) and a note carrying no `tags` key at all. Both are
283
+ * written out as a fresh block sequence, which is the shape Obsidian's own
284
+ * properties editor produces.
285
+ */
286
+ function rewriteTagList(doc, node, tags, operation, applied, skipped) {
287
+ const set = new Set(normalizeTagList(isScalar(node) ? node.value : undefined));
288
+ if (planTagChanges(tags, operation, set, applied, skipped).length === 0)
289
+ return false;
164
290
  const ordered = [...set];
165
- if (ordered.length === 0) {
291
+ if (ordered.length === 0)
166
292
  doc.delete('tags');
167
- }
168
- else {
293
+ else
169
294
  doc.set('tags', ordered);
170
- }
171
- return serializeFrontmatter(doc, body);
295
+ return true;
172
296
  }
173
297
  function normalizeTagList(value) {
174
298
  if (Array.isArray(value)) {
@@ -206,11 +330,147 @@ const MARKDOWN_LINK = /\[[^[\]\n]*\]\([^()\n]*\)/;
206
330
  */
207
331
  const REFERENCE_LINK = /\[[^[\]\n]+\]\[[^[\]\n]*\]/;
208
332
  /**
209
- * A tag's left boundary: the start of a segment, or a character that is neither
210
- * part of a tag nor the `\` that escapes one. Obsidian documents `\#` as an
211
- * escaped hashtag — a literal `#` carrying no formatting.
333
+ * Obsidian's metadata cache reads no tag inside an HTML comment or math. The
334
+ * rules below are pinned against its readback (Obsidian 1.13.7) rather than a
335
+ * spec, and a few differ from CommonMark: an inline span ends at an empty or
336
+ * spaces-only line but runs through a tab-only one. Issue #138.
337
+ *
338
+ * An **HTML block** opens with `<!--` at the start of a line — after up to
339
+ * three spaces of indentation, or after list-item and blockquote markers — and
340
+ * runs through the end of the line holding the first `-->`, or to the end of
341
+ * the note when none follows. The whole closing line is hidden, so the tag in
342
+ * `<!-- a --> #rd` is not one. A line opening with `<!-->` or `<!--->` closes
343
+ * on itself.
344
+ *
345
+ * The prefix gives every whitespace character exactly one owner — a list
346
+ * marker takes the one it requires, the next marker's indent takes the rest,
347
+ * and the tail after the last marker takes what follows it — so the lookbehind
348
+ * cannot backtrack exponentially over a long run of markers. The `(?=<!--)`
349
+ * gate runs it only where a comment opens.
350
+ */
351
+ const HTML_BLOCK = /(?=<!--)(?<=(?:^|\n)(?:[ \t]*(?:>|(?:[-+*]|\d{1,9}[.)])[ \t]))*(?:(?<=>)[ \t]?[ ]{0,3}|(?<=(?:[-+*]|\d[.)])[ \t])[ \t]*|[ ]{0,3}))<!--(?:-?>[^\n]*|[\s\S]*?-->[^\n]*|[\s\S]*)/;
352
+ /**
353
+ * An **inline comment** anywhere else: `<!--`, then text that does not open
354
+ * with `>` or `->` and holds no `--`, then `-->`, within one paragraph.
355
+ * `<!-- x -- y -->` is not a comment, and neither is an unclosed `<!--`.
356
+ */
357
+ const HTML_COMMENT = /<!--(?!-?>)(?:(?!--|\n *\r?\n)[\s\S])*-->/;
358
+ /**
359
+ * A **display math block**: a line that opens with `$$` and holds no second
360
+ * `$$`. It runs, across empty lines, to the next line that is `$$` alone, or to
361
+ * the end of the note — `$$\na\nb$$` does not close it.
212
362
  */
213
- const TAG_LEFT_BOUNDARY = '(^|[^\\w/\\\\])';
363
+ const DISPLAY_MATH = /(?<=(?:^|\n)[ \t]*)\$\$(?![^\n]*\$\$)[\s\S]*?(?:\n[ \t]*\$\$[ \t]*(?=\r?\n|$)|$)/;
364
+ /** Unescaped `$$ … $$` within one paragraph, with no spacing rule. */
365
+ const INLINE_DOUBLE_MATH = /(?<=(?:^|[^\\])(?:\\\\)*)\$\$(?:(?!\n *\r?\n)[\s\S])*?\$\$/;
366
+ /**
367
+ * Unescaped `$ … $` within one paragraph. The opener is not followed by a space
368
+ * or tab; the closer is not preceded by one and not followed by a digit, and a
369
+ * `$` that fails those is passed over rather than ending the span. That is what
370
+ * keeps `cost $5 and #rc for $10` out of math while `m $a #ra b$ n` is in it.
371
+ *
372
+ * Only the opener is a regex; `inlineMathCloser` finds the closer. A lazy
373
+ * regex body would rescan to the end of the paragraph from every opener that
374
+ * never closes — quadratic in a table of prices (issue #143).
375
+ */
376
+ const INLINE_MATH_OPEN = /(?<inlineMath>(?<=(?:^|[^\\])(?:\\\\)*)\$(?![ \t$]))/;
377
+ /** The start of an empty or spaces-only line, which inline math cannot cross. */
378
+ const PARAGRAPH_BREAK = /\n *\r?\n/y;
379
+ /**
380
+ * The closer of the inline math span each opener in `content` starts, or
381
+ * `undefined` when it has none. Whether a `$` can close a span does not depend
382
+ * on where the span opened, so the closers and paragraph breaks are listed
383
+ * once and each opener takes the first closer after it, provided no break
384
+ * comes first. Openers must be looked up in ascending order.
385
+ */
386
+ function inlineMathCloser(content) {
387
+ const closers = [];
388
+ const breaks = [];
389
+ for (let i = 0; i < content.length; i++) {
390
+ if (content[i] === '$' && closesInlineMath(content, i))
391
+ closers.push(i);
392
+ if (content[i] === '\n') {
393
+ PARAGRAPH_BREAK.lastIndex = i;
394
+ if (PARAGRAPH_BREAK.test(content))
395
+ breaks.push(i);
396
+ }
397
+ }
398
+ let c = 0;
399
+ let b = 0;
400
+ return (open) => {
401
+ while ((closers[c] ?? Infinity) <= open)
402
+ c++;
403
+ while ((breaks[b] ?? Infinity) <= open)
404
+ b++;
405
+ const close = closers[c];
406
+ if (close === undefined || (breaks[b] ?? Infinity) < close)
407
+ return;
408
+ return close;
409
+ };
410
+ }
411
+ /** Whether the `$` at `i` can close inline math: unescaped, after no space or tab, before no digit. */
412
+ function closesInlineMath(content, i) {
413
+ const before = content[i - 1];
414
+ if (before === ' ' || before === '\t' || /[0-9]/.test(content[i + 1] ?? ''))
415
+ return false;
416
+ let backslashes = 0;
417
+ while (content[i - 1 - backslashes] === '\\')
418
+ backslashes++;
419
+ return backslashes % 2 === 0;
420
+ }
421
+ /**
422
+ * Markup Obsidian parses as a node of its own, so a `#` right after it opens a
423
+ * tag the way one does after whitespace, while the same character as plain
424
+ * text blocks the tag. Protecting each span makes the `#` after it a segment
425
+ * start. Pinned against Obsidian 1.13.7 readback; issue #138.
426
+ *
427
+ * A **backslash escape** of ASCII punctuation: `\]#t` and `\\#t` are tags,
428
+ * `\#t` is an escaped hash and not one.
429
+ */
430
+ const ESCAPE = /\\[!-/:-@[-`{-~]/;
431
+ /** An **inline HTML tag**: `<br>#t`, `x <b>#t</b>`, `<a href="u">#t</a>`. */
432
+ const HTML_TAG = /<\/?[A-Za-z][A-Za-z0-9-]*(?:\s[^<>\n]*)?\/?>/;
433
+ /**
434
+ * An **emphasis, highlight, or strikethrough delimiter run** directly before
435
+ * `#` that has a partner elsewhere on its line: `**#t**`, `*#t*`, `**x**#t`,
436
+ * `foo*#t*bar`, `==#t==`, `~~#t~~`. An unpartnered run is literal text to
437
+ * Obsidian (`a *#t`, `a ==#t`), and so is a single `~`. The partner test is
438
+ * the same delimiter anywhere else on the line. `_` runs are left out: `_` is a
439
+ * tag character, so `_#t_` would read as the tag `t_`, where Obsidian reads `t`.
440
+ */
441
+ const EMPHASIS_RUN = /(?<!\*)(?=\*+#)(?:(?<=\*[^\n]*?)|(?=\*+#[^\n]*?\*))\*+|(?<!=)(?===#)(?:(?<===[^\n]*?)|(?===#[^\n]*?==))==|(?<!~)(?=~~#)(?:(?<=~~[^\n]*?)|(?=~~#[^\n]*?~~))~~/;
442
+ /**
443
+ * A **blockquote marker** directly before `#`: `>#t`, `> >#t`. A table cell
444
+ * pipe is the same kind of node (`|#t|` in a table row is a tag), but telling
445
+ * a table row from a pipe in prose takes the lines above it, which this
446
+ * one-pass scan does not look at, so `|#t` stays unread either way.
447
+ */
448
+ const QUOTE_MARKER = />(?=#)(?<=(?:^|\n)[ \t]*(?:>[ \t]*)*>)/;
449
+ /**
450
+ * The characters that end an inline tag, as the body of a character class:
451
+ * whitespace, ASCII punctuation other than `_`, `-`, and `/`, and the General
452
+ * (U+2000–U+206F) and Supplemental (U+2E00–U+2E7F) Punctuation blocks. Every
453
+ * other code point — letters and digits in any script, emoji, variation
454
+ * selectors, combining marks, symbols such as `€` or `©` — continues a tag.
455
+ * Read off Obsidian's own metadata cache (1.13.7): `#café`, `#日本語`, and
456
+ * `#✅done` are tags, `#tag—dash` ends at the em dash, and a zero-width joiner
457
+ * ends a tag mid-emoji. Every regex using it carries the `u` flag, so the class
458
+ * matches whole code points rather than surrogate halves.
459
+ */
460
+ const TAG_STOP = String.raw `\s!-,.:-@\[-\^\x60{-~\u2000-\u206F\u2E00-\u2E7F`;
461
+ /** One code point that continues an inline tag. */
462
+ const TAG_CHAR = `[^${TAG_STOP}]`;
463
+ /**
464
+ * A tag's left boundary: the start of a segment, or whitespace (`\s`, which
465
+ * takes in NBSP and U+3000). A punctuation mark that is plain text before `#`
466
+ * blocks a tag in Obsidian — `(#a`, `.#b`, `x—#c`, an unpartnered `a *#d` —
467
+ * and so does the `\` of an escaped `\#`. A segment starts at the note body or
468
+ * right after a protected span, and Obsidian reads a tag glued to either:
469
+ * `[[x]]#t`, `` `c`#t ``, `**#t**`, and `<br>#t` are tags.
470
+ */
471
+ const TAG_LEFT_BOUNDARY = String.raw `(^|\s)`;
472
+ /** Obsidian rejects a tag made only of ASCII digits (`#1984`); `#1990s` and `#١٢٣` are tags. */
473
+ const ALL_DIGITS = /^[0-9]+$/;
214
474
  /**
215
475
  * Inline `#tag` syntax lives in the body. The frontmatter block is spliced off
216
476
  * first and re-attached verbatim, so a `#` inside a YAML scalar is neither read
@@ -257,6 +517,11 @@ function mutateInlineTags(content, tags, operation, applied, skipped) {
257
517
  }
258
518
  else {
259
519
  for (const tag of tags) {
520
+ /** `#1984` is text to Obsidian and to `list`, so a removal leaves it too. */
521
+ if (ALL_DIGITS.test(tag)) {
522
+ skipped.add(tag);
523
+ continue;
524
+ }
260
525
  const re = makeInlineTagRegex(tag);
261
526
  let found = false;
262
527
  for (const s of segments) {
@@ -306,21 +571,52 @@ function removeAt(full, leading, trailing, offset, whole) {
306
571
  }
307
572
  /**
308
573
  * Split the body into stretches a tag may live in and stretches it may not:
309
- * code, where a `#` is code, and link syntax, where a `#` is a heading anchor
310
- * or link text. Both the read and the write path run over the result, so
574
+ * code, where a `#` is code; link syntax, where a `#` is a heading anchor or
575
+ * link text; HTML comments and math, where Obsidian reads no tag; and the
576
+ * markup after which a `#` opens a tag (`ESCAPE` through `QUOTE_MARKER`). The
577
+ * construct that opens first wins, so `$b <!-- c$` is math and `<!-- $b -->`
578
+ * is a comment. Both the read and the write path run over the result, so
311
579
  * `list` and `remove` agree on what counts as a tag.
312
580
  */
313
581
  function splitProtectedSegments(content) {
314
582
  const segments = [];
315
583
  let cursor = 0;
316
- const re = new RegExp([FENCED_CODE_BLOCK, INLINE_CODE, WIKILINK, MARKDOWN_LINK, REFERENCE_LINK]
584
+ const re = new RegExp([
585
+ FENCED_CODE_BLOCK,
586
+ INLINE_CODE,
587
+ WIKILINK,
588
+ MARKDOWN_LINK,
589
+ REFERENCE_LINK,
590
+ HTML_BLOCK,
591
+ HTML_COMMENT,
592
+ DISPLAY_MATH,
593
+ INLINE_DOUBLE_MATH,
594
+ INLINE_MATH_OPEN,
595
+ ESCAPE,
596
+ HTML_TAG,
597
+ EMPHASIS_RUN,
598
+ QUOTE_MARKER,
599
+ ]
317
600
  .map((r) => r.source)
318
601
  .join('|'), 'g');
602
+ const mathCloser = inlineMathCloser(content);
319
603
  for (;;) {
320
604
  const m = re.exec(content);
321
605
  if (!m)
322
606
  break;
323
- const matched = m[0] ?? '';
607
+ let matched = m[0] ?? '';
608
+ if (m.groups?.inlineMath !== undefined) {
609
+ /**
610
+ * The `$$` constructs are tried before this one and nothing after it
611
+ * opens with `$`, so an opener with no closer leaves this position to
612
+ * plain text and the scan resumes one character on.
613
+ */
614
+ const close = mathCloser(m.index);
615
+ if (close === undefined)
616
+ continue;
617
+ matched = content.slice(m.index, close + 1);
618
+ re.lastIndex = close + 1;
619
+ }
324
620
  if (m.index > cursor) {
325
621
  segments.push({ protected: false, text: content.slice(cursor, m.index) });
326
622
  }
@@ -332,24 +628,29 @@ function splitProtectedSegments(content) {
332
628
  }
333
629
  return segments;
334
630
  }
335
- /** Captures the character before the tag and the single horizontal space after it, if any. */
631
+ /**
632
+ * Captures the character before the tag and the single horizontal space after
633
+ * it, if any. The lookahead refuses a longer tag that merely starts with `tag`
634
+ * — removing `caf` must not strip the front off `#café`.
635
+ */
336
636
  function makeInlineTagRegex(tag) {
337
637
  const escaped = tag.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&');
338
- return new RegExp(`${TAG_LEFT_BOUNDARY}#${escaped}(?![\\w/-])([ \\t]?)`, 'g');
638
+ return new RegExp(`${TAG_LEFT_BOUNDARY}#${escaped}(?!${TAG_CHAR})([ \\t]?)`, 'gu');
339
639
  }
340
640
  /**
341
641
  * Read-only helpers for `obsidian_manage_tags list`. Inline tags are read from
342
642
  * the body only, and through the same protected-segment split and left boundary
343
643
  * a removal uses, so what `list` reports is exactly what `remove` can reach — a
344
- * `#` inside a YAML scalar, a code span, a link span, or escaped as `\#` is
345
- * none of them.
644
+ * `#` inside a YAML scalar, a code span, a link span, an HTML comment, or math,
645
+ * or one glued to the character before it (`\#`, `(#x`), is none of them. A tag
646
+ * runs for as long as `TAG_CHAR` matches, and an all-digit run is not a tag.
346
647
  */
347
648
  export function listTagsFromContent(content, frontmatter) {
348
649
  const fmTags = normalizeTagList(frontmatter.tags);
349
650
  const inline = [];
350
651
  const seen = new Set();
351
652
  /** Each segment is scanned to exhaustion, which resets `lastIndex` between them. */
352
- const re = new RegExp(`${TAG_LEFT_BOUNDARY}#([a-zA-Z][\\w/-]*)`, 'g');
653
+ const re = new RegExp(`${TAG_LEFT_BOUNDARY}#(${TAG_CHAR}+)`, 'gu');
353
654
  for (const seg of splitProtectedSegments(splice(content).body)) {
354
655
  if (seg.protected)
355
656
  continue;
@@ -358,7 +659,7 @@ export function listTagsFromContent(content, frontmatter) {
358
659
  if (!m)
359
660
  break;
360
661
  const t = m[2];
361
- if (t && !seen.has(t)) {
662
+ if (t && !ALL_DIGITS.test(t) && !seen.has(t)) {
362
663
  seen.add(t);
363
664
  inline.push(t);
364
665
  }
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter-ops.js","sourceRoot":"","sources":["../../../src/services/obsidian/frontmatter-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontmatter-ops.js","sourceRoot":"","sources":["../../../src/services/obsidian/frontmatter-ops.ts"],"names":[],"mappings":"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"}