@noteplanco/noteplan-mcp 1.1.1
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/README.md +257 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/noteplan/embeddings.d.ts +170 -0
- package/dist/noteplan/embeddings.d.ts.map +1 -0
- package/dist/noteplan/embeddings.js +684 -0
- package/dist/noteplan/embeddings.js.map +1 -0
- package/dist/noteplan/file-reader.d.ts +77 -0
- package/dist/noteplan/file-reader.d.ts.map +1 -0
- package/dist/noteplan/file-reader.js +488 -0
- package/dist/noteplan/file-reader.js.map +1 -0
- package/dist/noteplan/file-writer.d.ts +108 -0
- package/dist/noteplan/file-writer.d.ts.map +1 -0
- package/dist/noteplan/file-writer.js +621 -0
- package/dist/noteplan/file-writer.js.map +1 -0
- package/dist/noteplan/filter-store.d.ts +28 -0
- package/dist/noteplan/filter-store.d.ts.map +1 -0
- package/dist/noteplan/filter-store.js +180 -0
- package/dist/noteplan/filter-store.js.map +1 -0
- package/dist/noteplan/frontmatter-parser.d.ts +45 -0
- package/dist/noteplan/frontmatter-parser.d.ts.map +1 -0
- package/dist/noteplan/frontmatter-parser.js +259 -0
- package/dist/noteplan/frontmatter-parser.js.map +1 -0
- package/dist/noteplan/fuzzy-search.d.ts +7 -0
- package/dist/noteplan/fuzzy-search.d.ts.map +1 -0
- package/dist/noteplan/fuzzy-search.js +66 -0
- package/dist/noteplan/fuzzy-search.js.map +1 -0
- package/dist/noteplan/markdown-parser.d.ts +87 -0
- package/dist/noteplan/markdown-parser.d.ts.map +1 -0
- package/dist/noteplan/markdown-parser.js +519 -0
- package/dist/noteplan/markdown-parser.js.map +1 -0
- package/dist/noteplan/preferences.d.ts +44 -0
- package/dist/noteplan/preferences.d.ts.map +1 -0
- package/dist/noteplan/preferences.js +156 -0
- package/dist/noteplan/preferences.js.map +1 -0
- package/dist/noteplan/ripgrep-search.d.ts +29 -0
- package/dist/noteplan/ripgrep-search.d.ts.map +1 -0
- package/dist/noteplan/ripgrep-search.js +110 -0
- package/dist/noteplan/ripgrep-search.js.map +1 -0
- package/dist/noteplan/sqlite-reader.d.ts +77 -0
- package/dist/noteplan/sqlite-reader.d.ts.map +1 -0
- package/dist/noteplan/sqlite-reader.js +605 -0
- package/dist/noteplan/sqlite-reader.js.map +1 -0
- package/dist/noteplan/sqlite-writer.d.ts +63 -0
- package/dist/noteplan/sqlite-writer.d.ts.map +1 -0
- package/dist/noteplan/sqlite-writer.js +574 -0
- package/dist/noteplan/sqlite-writer.js.map +1 -0
- package/dist/noteplan/types.d.ts +97 -0
- package/dist/noteplan/types.d.ts.map +1 -0
- package/dist/noteplan/types.js +33 -0
- package/dist/noteplan/types.js.map +1 -0
- package/dist/noteplan/unified-store.d.ts +289 -0
- package/dist/noteplan/unified-store.d.ts.map +1 -0
- package/dist/noteplan/unified-store.js +1308 -0
- package/dist/noteplan/unified-store.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2468 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/calendar.d.ts +311 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +504 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/embeddings.d.ts +244 -0
- package/dist/tools/embeddings.d.ts.map +1 -0
- package/dist/tools/embeddings.js +226 -0
- package/dist/tools/embeddings.js.map +1 -0
- package/dist/tools/events.d.ts +176 -0
- package/dist/tools/events.d.ts.map +1 -0
- package/dist/tools/events.js +326 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/filters.d.ts +205 -0
- package/dist/tools/filters.d.ts.map +1 -0
- package/dist/tools/filters.js +347 -0
- package/dist/tools/filters.js.map +1 -0
- package/dist/tools/memory.d.ts +6 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +161 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notes.d.ts +1221 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +1868 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/plugins.d.ts +140 -0
- package/dist/tools/plugins.d.ts.map +1 -0
- package/dist/tools/plugins.js +782 -0
- package/dist/tools/plugins.js.map +1 -0
- package/dist/tools/reminders.d.ts +207 -0
- package/dist/tools/reminders.d.ts.map +1 -0
- package/dist/tools/reminders.js +323 -0
- package/dist/tools/reminders.js.map +1 -0
- package/dist/tools/search.d.ts +58 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +373 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/spaces.d.ts +484 -0
- package/dist/tools/spaces.d.ts.map +1 -0
- package/dist/tools/spaces.js +870 -0
- package/dist/tools/spaces.js.map +1 -0
- package/dist/tools/tasks.d.ts +313 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +690 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/themes.d.ts +91 -0
- package/dist/tools/themes.d.ts.map +1 -0
- package/dist/tools/themes.js +294 -0
- package/dist/tools/themes.js.map +1 -0
- package/dist/tools/ui.d.ts +89 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +137 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/utils/applescript.d.ts +5 -0
- package/dist/utils/applescript.d.ts.map +1 -0
- package/dist/utils/applescript.js +27 -0
- package/dist/utils/applescript.js.map +1 -0
- package/dist/utils/confirmation-tokens.d.ts +19 -0
- package/dist/utils/confirmation-tokens.d.ts.map +1 -0
- package/dist/utils/confirmation-tokens.js +58 -0
- package/dist/utils/confirmation-tokens.js.map +1 -0
- package/dist/utils/date-filters.d.ts +15 -0
- package/dist/utils/date-filters.d.ts.map +1 -0
- package/dist/utils/date-filters.js +129 -0
- package/dist/utils/date-filters.js.map +1 -0
- package/dist/utils/date-utils.d.ts +113 -0
- package/dist/utils/date-utils.d.ts.map +1 -0
- package/dist/utils/date-utils.js +341 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/folder-matcher.d.ts +14 -0
- package/dist/utils/folder-matcher.d.ts.map +1 -0
- package/dist/utils/folder-matcher.js +191 -0
- package/dist/utils/folder-matcher.js.map +1 -0
- package/dist/utils/version.d.ts +10 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +88 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/plugin-api/Calendar.md +448 -0
- package/docs/plugin-api/CalendarItem.md +198 -0
- package/docs/plugin-api/Clipboard.md +101 -0
- package/docs/plugin-api/CommandBar.md +251 -0
- package/docs/plugin-api/DataStore.md +700 -0
- package/docs/plugin-api/Editor.md +982 -0
- package/docs/plugin-api/HTMLView.md +337 -0
- package/docs/plugin-api/NoteObject.md +588 -0
- package/docs/plugin-api/NotePlan.md +398 -0
- package/docs/plugin-api/ParagraphObject.md +242 -0
- package/docs/plugin-api/RangeObject.md +56 -0
- package/docs/plugin-api/getting-started.md +545 -0
- package/docs/plugin-api/plugin-api-condensed.md +526 -0
- package/docs/plugin-api/plugin.json +26 -0
- package/docs/plugin-api/script.js +542 -0
- package/package.json +60 -0
- package/scripts/calendar-helper +0 -0
- package/scripts/reminders-helper +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Task, TaskStatus, ParagraphType, ParagraphMetadata } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a note's content to extract tasks
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseTasks(content: string): Task[];
|
|
6
|
+
/**
|
|
7
|
+
* Parse a single line to extract task information
|
|
8
|
+
* Handles both checkbox style (e.g., * [ ] task) and plain marker style (e.g., * task)
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseTaskLine(line: string, lineIndex: number): Task | null;
|
|
11
|
+
/**
|
|
12
|
+
* Extract hashtags from a single line / content fragment.
|
|
13
|
+
* Attributes are stripped, hierarchies are expanded.
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractTags(content: string): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Extract @mentions from a single line / content fragment.
|
|
18
|
+
* Attributes are stripped, hierarchies are expanded.
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractMentions(content: string): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Extract all unique tags (both # and @) from full note content.
|
|
23
|
+
* Handles code fences, inline code, markdown links, boundary checks,
|
|
24
|
+
* Unicode / emoji support, hierarchy expansion, and special-tag filtering.
|
|
25
|
+
* Used by file-reader and sqlite-reader for global tag listing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractTagsFromContent(content: string): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Extract scheduled date from content (>YYYY-MM-DD pattern)
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractScheduledDate(content: string): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Extract priority from content (! = low, !! = medium, !!! = high)
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractPriority(content: string): number | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Extract title from note content (first line, strips # if heading)
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractTitle(content: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Update a task's status in the note content
|
|
42
|
+
* Handles both checkbox-style and plain marker tasks
|
|
43
|
+
*/
|
|
44
|
+
export declare function updateTaskStatus(content: string, lineIndex: number, newStatus: TaskStatus): string;
|
|
45
|
+
/**
|
|
46
|
+
* Update a task's content in the note
|
|
47
|
+
* Handles both checkbox-style and plain marker tasks
|
|
48
|
+
*/
|
|
49
|
+
export declare function updateTaskContent(content: string, lineIndex: number, newTaskContent: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Add a task to note content
|
|
52
|
+
* Uses user's configured task marker format from NotePlan preferences
|
|
53
|
+
*/
|
|
54
|
+
export declare function addTask(content: string, taskContent: string, position?: 'start' | 'end' | 'after-heading', heading?: string, options?: {
|
|
55
|
+
status?: TaskStatus;
|
|
56
|
+
priority?: number;
|
|
57
|
+
indentLevel?: number;
|
|
58
|
+
}): string;
|
|
59
|
+
/**
|
|
60
|
+
* Extract all headings from content
|
|
61
|
+
*/
|
|
62
|
+
export declare function extractHeadings(content: string): {
|
|
63
|
+
level: number;
|
|
64
|
+
text: string;
|
|
65
|
+
lineIndex: number;
|
|
66
|
+
}[];
|
|
67
|
+
/**
|
|
68
|
+
* Parse a single line and classify it as a paragraph type with metadata.
|
|
69
|
+
* Reuses parseTaskLine() detection patterns and extract* helpers.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseParagraphLine(line: string, lineIndex: number, isFirstLine: boolean): ParagraphMetadata;
|
|
72
|
+
/**
|
|
73
|
+
* Build a properly formatted markdown line from structured input.
|
|
74
|
+
* Uses user preferences for task marker style.
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildParagraphLine(content: string, type: ParagraphType, options?: {
|
|
77
|
+
headingLevel?: number;
|
|
78
|
+
taskStatus?: TaskStatus;
|
|
79
|
+
indentLevel?: number;
|
|
80
|
+
priority?: number;
|
|
81
|
+
hasCheckbox?: boolean;
|
|
82
|
+
}): string;
|
|
83
|
+
/**
|
|
84
|
+
* Filter tasks by status
|
|
85
|
+
*/
|
|
86
|
+
export declare function filterTasksByStatus(tasks: Task[], status?: TaskStatus | TaskStatus[]): Task[];
|
|
87
|
+
//# sourceMappingURL=markdown-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/noteplan/markdown-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAqC,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGnH;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAalD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAqD1E;AA0FD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,CA8BlG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAuBpG;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,OAAO,GAAG,KAAK,GAAG,eAAuB,EACnD,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,MAAM,CA8CR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBrG;AAqBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,iBAAiB,CAwH3G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,MAAM,CAwCR;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,EAAE,CAK7F"}
|
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
// NotePlan Markdown Parser
|
|
2
|
+
import { TASK_STATUS_MAP, STATUS_TO_MARKER } from './types.js';
|
|
3
|
+
import { getTaskPrefix, getTaskMarkerConfigCached } from './preferences.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parse a note's content to extract tasks
|
|
6
|
+
*/
|
|
7
|
+
export function parseTasks(content) {
|
|
8
|
+
const lines = content.split('\n');
|
|
9
|
+
const tasks = [];
|
|
10
|
+
for (let i = 0; i < lines.length; i++) {
|
|
11
|
+
const line = lines[i];
|
|
12
|
+
const task = parseTaskLine(line, i);
|
|
13
|
+
if (task) {
|
|
14
|
+
tasks.push(task);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return tasks;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse a single line to extract task information
|
|
21
|
+
* Handles both checkbox style (e.g., * [ ] task) and plain marker style (e.g., * task)
|
|
22
|
+
*/
|
|
23
|
+
export function parseTaskLine(line, lineIndex) {
|
|
24
|
+
const config = getTaskMarkerConfigCached();
|
|
25
|
+
// First try checkbox-style tasks: * [ ], * [x], * [-], * [>], - [ ], + [ ]
|
|
26
|
+
const checkboxMatch = line.match(/^(\s*)([*+\-])\s*\[(.)\]\s*(.*)$/);
|
|
27
|
+
if (checkboxMatch) {
|
|
28
|
+
const [, indent, marker, statusChar, content] = checkboxMatch;
|
|
29
|
+
const status = TASK_STATUS_MAP[`[${statusChar}]`];
|
|
30
|
+
if (!status)
|
|
31
|
+
return null;
|
|
32
|
+
return {
|
|
33
|
+
lineIndex,
|
|
34
|
+
content: content.trim(),
|
|
35
|
+
rawLine: line,
|
|
36
|
+
status,
|
|
37
|
+
indentLevel: indent.length,
|
|
38
|
+
hasCheckbox: true,
|
|
39
|
+
marker: marker,
|
|
40
|
+
tags: extractTags(content),
|
|
41
|
+
mentions: extractMentions(content),
|
|
42
|
+
scheduledDate: extractScheduledDate(content),
|
|
43
|
+
priority: extractPriority(content),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Then try plain marker style tasks (no checkbox): * task, - task
|
|
47
|
+
// Only match if the marker is configured as a task marker
|
|
48
|
+
const plainMatch = line.match(/^(\s*)([*\-])\s+(.+)$/);
|
|
49
|
+
if (plainMatch) {
|
|
50
|
+
const [, indent, marker, content] = plainMatch;
|
|
51
|
+
// Check if this marker is configured as a task marker
|
|
52
|
+
const isTaskMarker = (marker === '*' && config.isAsteriskTodo) || (marker === '-' && config.isDashTodo);
|
|
53
|
+
if (isTaskMarker) {
|
|
54
|
+
return {
|
|
55
|
+
lineIndex,
|
|
56
|
+
content: content.trim(),
|
|
57
|
+
rawLine: line,
|
|
58
|
+
status: 'open', // Plain marker tasks are always open
|
|
59
|
+
indentLevel: indent.length,
|
|
60
|
+
hasCheckbox: false,
|
|
61
|
+
marker: marker,
|
|
62
|
+
tags: extractTags(content),
|
|
63
|
+
mentions: extractMentions(content),
|
|
64
|
+
scheduledDate: extractScheduledDate(content),
|
|
65
|
+
priority: extractPriority(content),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Tag / mention extraction — aligned with Swift DataStore.parseTags behaviour
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Strip code fences (``` … ```) from full note content so that tags
|
|
76
|
+
* inside fenced code blocks are not extracted.
|
|
77
|
+
*/
|
|
78
|
+
function stripCodeFences(content) {
|
|
79
|
+
return content.replace(/```[\s\S]*?```/g, '');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Strip inline regions that must be ignored during tag extraction:
|
|
83
|
+
* - Inline code (`…`)
|
|
84
|
+
* - Markdown link URLs [text](url) → keeps the link text
|
|
85
|
+
*/
|
|
86
|
+
function stripInlineExclusions(text) {
|
|
87
|
+
let result = text.replace(/`[^`\n]+`/g, '');
|
|
88
|
+
result = result.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1');
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Remove parenthesised attributes from a tag.
|
|
93
|
+
* e.g. #tag(value) → #tag, @repeat(1/1/2025) → @repeat
|
|
94
|
+
*/
|
|
95
|
+
function cleanTagAttributes(tag) {
|
|
96
|
+
const idx = tag.indexOf('(');
|
|
97
|
+
return idx > 0 ? tag.substring(0, idx) : tag;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Expand hierarchical (nested) tags into every intermediate level.
|
|
101
|
+
* Matches Swift DataStore.parseTags which produces:
|
|
102
|
+
* #parent/child/grandchild → [#parent, #parent/child, #parent/child/grandchild]
|
|
103
|
+
*/
|
|
104
|
+
function expandHierarchicalTags(tags) {
|
|
105
|
+
const expanded = new Set();
|
|
106
|
+
for (const tag of tags) {
|
|
107
|
+
const prefix = tag.charAt(0); // # or @
|
|
108
|
+
const parts = tag.substring(1).split('/');
|
|
109
|
+
let current = prefix;
|
|
110
|
+
for (let i = 0; i < parts.length; i++) {
|
|
111
|
+
current += (i > 0 ? '/' : '') + parts[i];
|
|
112
|
+
expanded.add(current);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return Array.from(expanded);
|
|
116
|
+
}
|
|
117
|
+
/** Special @-tags excluded from global tag listings (mirrors Swift NoteCache). */
|
|
118
|
+
const EXCLUDED_AT_TAGS = ['@done', '@repeat', '@final-repeat'];
|
|
119
|
+
function isExcludedTag(tag) {
|
|
120
|
+
const lower = tag.toLowerCase();
|
|
121
|
+
// Note: attributes are already stripped by cleanTagAttributes before this is called,
|
|
122
|
+
// so we only need exact match and hierarchy-child match.
|
|
123
|
+
return EXCLUDED_AT_TAGS.some((ex) => lower === ex || lower.startsWith(ex + '/'));
|
|
124
|
+
}
|
|
125
|
+
// Core regex — mirrors Swift DataStore.tag:
|
|
126
|
+
// Boundary: start-of-line | whitespace | one of ' ( [ { * _
|
|
127
|
+
// Negative lookahead: reject purely-numeric / purely-punctuation tags (#123, #---)
|
|
128
|
+
// Tag body: Unicode letters, digits, symbols (incl. emoji) via [^\p{P}\s`],
|
|
129
|
+
// plus explicitly allowed punctuation: - _ /
|
|
130
|
+
// Optional attribute: (...) at the end
|
|
131
|
+
const TAG_PATTERN = /(^|[\s'(\[{*_])(?![@#][\d\p{P}]+(?:\s|$))([@#](?:[^\p{P}\s`]|[-_/])+(?:\([^)]*\))?)/gmu;
|
|
132
|
+
/**
|
|
133
|
+
* Low-level: extract raw tag strings (# and @) from a text fragment.
|
|
134
|
+
* Handles inline-code and markdown-link exclusion but NOT code fences
|
|
135
|
+
* (the caller must strip those when processing full note content).
|
|
136
|
+
*/
|
|
137
|
+
function extractRawTags(text) {
|
|
138
|
+
const cleaned = stripInlineExclusions(text);
|
|
139
|
+
const tags = [];
|
|
140
|
+
TAG_PATTERN.lastIndex = 0;
|
|
141
|
+
let match;
|
|
142
|
+
while ((match = TAG_PATTERN.exec(cleaned)) !== null) {
|
|
143
|
+
// Trim trailing separators to avoid ghost hierarchy levels from typos like #tag/
|
|
144
|
+
const tag = match[2].replace(/\/+$/, '');
|
|
145
|
+
if (tag.length > 1)
|
|
146
|
+
tags.push(tag); // must have at least one body char after # or @
|
|
147
|
+
}
|
|
148
|
+
return tags;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Extract hashtags from a single line / content fragment.
|
|
152
|
+
* Attributes are stripped, hierarchies are expanded.
|
|
153
|
+
*/
|
|
154
|
+
export function extractTags(content) {
|
|
155
|
+
const raw = extractRawTags(content)
|
|
156
|
+
.filter((t) => t.startsWith('#'))
|
|
157
|
+
.map(cleanTagAttributes);
|
|
158
|
+
return expandHierarchicalTags(raw);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extract @mentions from a single line / content fragment.
|
|
162
|
+
* Attributes are stripped, hierarchies are expanded.
|
|
163
|
+
*/
|
|
164
|
+
export function extractMentions(content) {
|
|
165
|
+
const raw = extractRawTags(content)
|
|
166
|
+
.filter((t) => t.startsWith('@'))
|
|
167
|
+
.map(cleanTagAttributes);
|
|
168
|
+
return expandHierarchicalTags(raw);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract all unique tags (both # and @) from full note content.
|
|
172
|
+
* Handles code fences, inline code, markdown links, boundary checks,
|
|
173
|
+
* Unicode / emoji support, hierarchy expansion, and special-tag filtering.
|
|
174
|
+
* Used by file-reader and sqlite-reader for global tag listing.
|
|
175
|
+
*/
|
|
176
|
+
export function extractTagsFromContent(content) {
|
|
177
|
+
const withoutFences = stripCodeFences(content);
|
|
178
|
+
const raw = extractRawTags(withoutFences).map(cleanTagAttributes);
|
|
179
|
+
const expanded = expandHierarchicalTags(raw);
|
|
180
|
+
return expanded.filter((tag) => !isExcludedTag(tag));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Extract scheduled date from content (>YYYY-MM-DD pattern)
|
|
184
|
+
*/
|
|
185
|
+
export function extractScheduledDate(content) {
|
|
186
|
+
const match = content.match(/>(\d{4}-\d{2}-\d{2})/);
|
|
187
|
+
return match ? match[1] : undefined;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Extract priority from content (! = low, !! = medium, !!! = high)
|
|
191
|
+
*/
|
|
192
|
+
export function extractPriority(content) {
|
|
193
|
+
const match = content.match(/(!{1,3})(?!\w)/);
|
|
194
|
+
if (!match)
|
|
195
|
+
return undefined;
|
|
196
|
+
return match[1].length;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Extract title from note content (first line, strips # if heading)
|
|
200
|
+
*/
|
|
201
|
+
export function extractTitle(content) {
|
|
202
|
+
const firstLine = content.split('\n')[0] || '';
|
|
203
|
+
// Remove heading markers
|
|
204
|
+
return firstLine.replace(/^#{1,6}\s*/, '').trim() || 'Untitled';
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Update a task's status in the note content
|
|
208
|
+
* Handles both checkbox-style and plain marker tasks
|
|
209
|
+
*/
|
|
210
|
+
export function updateTaskStatus(content, lineIndex, newStatus) {
|
|
211
|
+
const lines = content.split('\n');
|
|
212
|
+
if (lineIndex < 0 || lineIndex >= lines.length) {
|
|
213
|
+
throw new Error(`Invalid line index: ${lineIndex}`);
|
|
214
|
+
}
|
|
215
|
+
const line = lines[lineIndex];
|
|
216
|
+
const statusMarkers = {
|
|
217
|
+
open: '[ ]',
|
|
218
|
+
done: '[x]',
|
|
219
|
+
cancelled: '[-]',
|
|
220
|
+
scheduled: '[>]',
|
|
221
|
+
};
|
|
222
|
+
// Check if line has a checkbox
|
|
223
|
+
if (/\[.\]/.test(line)) {
|
|
224
|
+
// Replace the existing status marker
|
|
225
|
+
lines[lineIndex] = line.replace(/\[.\]/, statusMarkers[newStatus]);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Plain marker task (e.g., "* task") - need to add checkbox
|
|
229
|
+
const match = line.match(/^(\s*)([*\-])\s+(.*)$/);
|
|
230
|
+
if (match) {
|
|
231
|
+
const [, indent, marker, taskContent] = match;
|
|
232
|
+
lines[lineIndex] = `${indent}${marker} ${statusMarkers[newStatus]} ${taskContent}`;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
throw new Error(`Line ${lineIndex} is not a task`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return lines.join('\n');
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Update a task's content in the note
|
|
242
|
+
* Handles both checkbox-style and plain marker tasks
|
|
243
|
+
*/
|
|
244
|
+
export function updateTaskContent(content, lineIndex, newTaskContent) {
|
|
245
|
+
const lines = content.split('\n');
|
|
246
|
+
if (lineIndex < 0 || lineIndex >= lines.length) {
|
|
247
|
+
throw new Error(`Invalid line index: ${lineIndex}`);
|
|
248
|
+
}
|
|
249
|
+
const line = lines[lineIndex];
|
|
250
|
+
// First try checkbox-style task: * [ ] task
|
|
251
|
+
const checkboxMatch = line.match(/^(\s*[*+\-]\s*\[.\]\s*)/);
|
|
252
|
+
if (checkboxMatch) {
|
|
253
|
+
lines[lineIndex] = checkboxMatch[1] + newTaskContent;
|
|
254
|
+
return lines.join('\n');
|
|
255
|
+
}
|
|
256
|
+
// Then try plain marker task: * task
|
|
257
|
+
const plainMatch = line.match(/^(\s*[*\-]\s+)/);
|
|
258
|
+
if (plainMatch) {
|
|
259
|
+
lines[lineIndex] = plainMatch[1] + newTaskContent;
|
|
260
|
+
return lines.join('\n');
|
|
261
|
+
}
|
|
262
|
+
throw new Error(`Line ${lineIndex} is not a task`);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Add a task to note content
|
|
266
|
+
* Uses user's configured task marker format from NotePlan preferences
|
|
267
|
+
*/
|
|
268
|
+
export function addTask(content, taskContent, position = 'end', heading, options) {
|
|
269
|
+
let taskLine;
|
|
270
|
+
if (options && (options.status !== undefined || options.priority !== undefined || options.indentLevel !== undefined)) {
|
|
271
|
+
taskLine = buildParagraphLine(taskContent, 'task', {
|
|
272
|
+
taskStatus: options.status ?? 'open',
|
|
273
|
+
priority: options.priority,
|
|
274
|
+
indentLevel: options.indentLevel,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const taskPrefix = getTaskPrefix();
|
|
279
|
+
taskLine = `${taskPrefix}${taskContent}`;
|
|
280
|
+
}
|
|
281
|
+
const lines = content.split('\n');
|
|
282
|
+
if (position === 'start') {
|
|
283
|
+
// Add after frontmatter if present
|
|
284
|
+
let insertIndex = 0;
|
|
285
|
+
if (lines[0]?.trim() === '---') {
|
|
286
|
+
for (let i = 1; i < lines.length; i++) {
|
|
287
|
+
if (lines[i]?.trim() === '---') {
|
|
288
|
+
insertIndex = i + 1;
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
lines.splice(insertIndex, 0, taskLine);
|
|
294
|
+
}
|
|
295
|
+
else if (position === 'after-heading' && heading) {
|
|
296
|
+
// Find the heading and insert after it (matches ATX headings and bold section markers)
|
|
297
|
+
const headingIndex = lines.findIndex((line) => {
|
|
298
|
+
if (line.match(new RegExp(`^#{1,6}\\s*${escapeRegex(heading)}\\s*$`, 'i')))
|
|
299
|
+
return true;
|
|
300
|
+
const boldMatch = line.match(/^\s*\*\*(.+?)\*\*:?\s*$/);
|
|
301
|
+
if (boldMatch && boldMatch[1].trim().toLowerCase() === heading.toLowerCase())
|
|
302
|
+
return true;
|
|
303
|
+
return false;
|
|
304
|
+
});
|
|
305
|
+
if (headingIndex !== -1) {
|
|
306
|
+
lines.splice(headingIndex + 1, 0, taskLine);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// Heading not found, add at end
|
|
310
|
+
lines.push(taskLine);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
// Add at end
|
|
315
|
+
lines.push(taskLine);
|
|
316
|
+
}
|
|
317
|
+
return lines.join('\n');
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Extract all headings from content
|
|
321
|
+
*/
|
|
322
|
+
export function extractHeadings(content) {
|
|
323
|
+
const lines = content.split('\n');
|
|
324
|
+
const headings = [];
|
|
325
|
+
for (let i = 0; i < lines.length; i++) {
|
|
326
|
+
const match = lines[i].match(/^(#{1,6})\s+(.+)$/);
|
|
327
|
+
if (match) {
|
|
328
|
+
headings.push({
|
|
329
|
+
level: match[1].length,
|
|
330
|
+
text: match[2].trim(),
|
|
331
|
+
lineIndex: i,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return headings;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Count indent level from leading whitespace.
|
|
339
|
+
* Tabs count as 1 each; every 2 leading spaces convert to 1 tab-equivalent.
|
|
340
|
+
*/
|
|
341
|
+
function countIndentLevel(line) {
|
|
342
|
+
let tabs = 0;
|
|
343
|
+
let spaces = 0;
|
|
344
|
+
for (const ch of line) {
|
|
345
|
+
if (ch === '\t') {
|
|
346
|
+
tabs += 1;
|
|
347
|
+
}
|
|
348
|
+
else if (ch === ' ') {
|
|
349
|
+
spaces += 1;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return tabs + Math.floor(spaces / 2);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Parse a single line and classify it as a paragraph type with metadata.
|
|
359
|
+
* Reuses parseTaskLine() detection patterns and extract* helpers.
|
|
360
|
+
*/
|
|
361
|
+
export function parseParagraphLine(line, lineIndex, isFirstLine) {
|
|
362
|
+
const config = getTaskMarkerConfigCached();
|
|
363
|
+
const trimmed = line.trim();
|
|
364
|
+
// 1. Empty
|
|
365
|
+
if (trimmed === '') {
|
|
366
|
+
return { type: 'empty', indentLevel: 0, tags: [], mentions: [] };
|
|
367
|
+
}
|
|
368
|
+
// 2. Separator (---, ***, ___)
|
|
369
|
+
if (/^(?:---+|\*\*\*+|___+)$/.test(trimmed)) {
|
|
370
|
+
return { type: 'separator', indentLevel: 0, tags: [], mentions: [] };
|
|
371
|
+
}
|
|
372
|
+
// Helper to extract optional content metadata and conditionally spread
|
|
373
|
+
function contentMeta(text) {
|
|
374
|
+
const scheduledDate = extractScheduledDate(text);
|
|
375
|
+
const priority = extractPriority(text);
|
|
376
|
+
return {
|
|
377
|
+
tags: extractTags(text),
|
|
378
|
+
mentions: extractMentions(text),
|
|
379
|
+
...(scheduledDate !== undefined && { scheduledDate }),
|
|
380
|
+
...(priority !== undefined && { priority }),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
// Helper to build a marker-line result (task, checklist, or bullet)
|
|
384
|
+
function markerResult(type, text, indent, typedMarker, hasCheckbox, taskStatus) {
|
|
385
|
+
return {
|
|
386
|
+
type,
|
|
387
|
+
indentLevel: countIndentLevel(indent),
|
|
388
|
+
marker: typedMarker,
|
|
389
|
+
hasCheckbox,
|
|
390
|
+
...(taskStatus && { taskStatus }),
|
|
391
|
+
...contentMeta(text),
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
// 3. Heading (# through ######)
|
|
395
|
+
const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)$/);
|
|
396
|
+
if (headingMatch) {
|
|
397
|
+
const level = headingMatch[1].length;
|
|
398
|
+
const content = headingMatch[2];
|
|
399
|
+
const type = isFirstLine ? 'title' : 'heading';
|
|
400
|
+
return {
|
|
401
|
+
type,
|
|
402
|
+
headingLevel: level,
|
|
403
|
+
indentLevel: 0,
|
|
404
|
+
...contentMeta(content),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
// 4. First line without # → title
|
|
408
|
+
if (isFirstLine) {
|
|
409
|
+
return {
|
|
410
|
+
type: 'title',
|
|
411
|
+
headingLevel: 1,
|
|
412
|
+
indentLevel: 0,
|
|
413
|
+
tags: extractTags(trimmed),
|
|
414
|
+
mentions: extractMentions(trimmed),
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
// 5. Quote (> ...)
|
|
418
|
+
if (/^>\s?/.test(trimmed)) {
|
|
419
|
+
const quoteContent = trimmed.replace(/^>\s?/, '');
|
|
420
|
+
const scheduledDate = extractScheduledDate(quoteContent);
|
|
421
|
+
return {
|
|
422
|
+
type: 'quote',
|
|
423
|
+
indentLevel: 0,
|
|
424
|
+
tags: extractTags(quoteContent),
|
|
425
|
+
mentions: extractMentions(quoteContent),
|
|
426
|
+
...(scheduledDate !== undefined && { scheduledDate }),
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
// 6. Checkbox line (* [x], - [ ], + [-])
|
|
430
|
+
const checkboxMatch = line.match(/^(\s*)([*+\-])\s*\[(.)\]\s*(.*)$/);
|
|
431
|
+
if (checkboxMatch) {
|
|
432
|
+
const [, indent, marker, statusChar, content] = checkboxMatch;
|
|
433
|
+
const status = TASK_STATUS_MAP[`[${statusChar}]`];
|
|
434
|
+
const typedMarker = marker;
|
|
435
|
+
const type = typedMarker === '+' ? 'checklist' : 'task';
|
|
436
|
+
return markerResult(type, content, indent, typedMarker, true, status);
|
|
437
|
+
}
|
|
438
|
+
// 7. Plain marker line (* item, - item, + item)
|
|
439
|
+
const plainMatch = line.match(/^(\s*)([*+\-])\s+(.+)$/);
|
|
440
|
+
if (plainMatch) {
|
|
441
|
+
const [, indent, marker, content] = plainMatch;
|
|
442
|
+
const typedMarker = marker;
|
|
443
|
+
if (typedMarker === '+') {
|
|
444
|
+
return markerResult('checklist', content, indent, typedMarker, false);
|
|
445
|
+
}
|
|
446
|
+
const isTaskMarkerChar = (typedMarker === '*' && config.isAsteriskTodo) || (typedMarker === '-' && config.isDashTodo);
|
|
447
|
+
if (isTaskMarkerChar) {
|
|
448
|
+
return markerResult('task', content, indent, typedMarker, false, 'open');
|
|
449
|
+
}
|
|
450
|
+
// It's a bullet
|
|
451
|
+
return markerResult('bullet', content, indent, typedMarker, false);
|
|
452
|
+
}
|
|
453
|
+
// 8. Everything else → text
|
|
454
|
+
return {
|
|
455
|
+
type: 'text',
|
|
456
|
+
indentLevel: countIndentLevel(line),
|
|
457
|
+
...contentMeta(trimmed),
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Build a properly formatted markdown line from structured input.
|
|
462
|
+
* Uses user preferences for task marker style.
|
|
463
|
+
*/
|
|
464
|
+
export function buildParagraphLine(content, type, options) {
|
|
465
|
+
const config = getTaskMarkerConfigCached();
|
|
466
|
+
const indent = '\t'.repeat(options?.indentLevel ?? 0);
|
|
467
|
+
const prioritySuffix = options?.priority ? ' ' + '!'.repeat(options.priority) : '';
|
|
468
|
+
switch (type) {
|
|
469
|
+
case 'title':
|
|
470
|
+
case 'heading': {
|
|
471
|
+
const level = options?.headingLevel ?? (type === 'title' ? 1 : 2);
|
|
472
|
+
return `${'#'.repeat(level)} ${content}`;
|
|
473
|
+
}
|
|
474
|
+
case 'task': {
|
|
475
|
+
const marker = config.defaultTodoCharacter;
|
|
476
|
+
const status = options?.taskStatus ?? 'open';
|
|
477
|
+
const wantCheckbox = options?.hasCheckbox ?? config.useCheckbox;
|
|
478
|
+
if (wantCheckbox || status !== 'open') {
|
|
479
|
+
return `${indent}${marker} ${STATUS_TO_MARKER[status]} ${content}${prioritySuffix}`;
|
|
480
|
+
}
|
|
481
|
+
return `${indent}${marker} ${content}${prioritySuffix}`;
|
|
482
|
+
}
|
|
483
|
+
case 'checklist': {
|
|
484
|
+
const status = options?.taskStatus ?? 'open';
|
|
485
|
+
const wantCheckbox = options?.hasCheckbox ?? true;
|
|
486
|
+
if (wantCheckbox || status !== 'open') {
|
|
487
|
+
return `${indent}+ ${STATUS_TO_MARKER[status]} ${content}${prioritySuffix}`;
|
|
488
|
+
}
|
|
489
|
+
return `${indent}+ ${content}${prioritySuffix}`;
|
|
490
|
+
}
|
|
491
|
+
case 'bullet':
|
|
492
|
+
return `${indent}- ${content}`;
|
|
493
|
+
case 'quote':
|
|
494
|
+
return `> ${content}`;
|
|
495
|
+
case 'separator':
|
|
496
|
+
return '---';
|
|
497
|
+
case 'empty':
|
|
498
|
+
return '';
|
|
499
|
+
case 'text':
|
|
500
|
+
default:
|
|
501
|
+
return content;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Escape special regex characters
|
|
506
|
+
*/
|
|
507
|
+
function escapeRegex(str) {
|
|
508
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Filter tasks by status
|
|
512
|
+
*/
|
|
513
|
+
export function filterTasksByStatus(tasks, status) {
|
|
514
|
+
if (!status)
|
|
515
|
+
return tasks;
|
|
516
|
+
const statuses = Array.isArray(status) ? status : [status];
|
|
517
|
+
return tasks.filter((task) => statuses.includes(task.status));
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=markdown-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/noteplan/markdown-parser.ts"],"names":[],"mappings":"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"}
|