-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmarkdown.js
More file actions
64 lines (64 loc) · 8.25 KB
/
markdown.js
File metadata and controls
64 lines (64 loc) · 8.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
export class Todo {
// e.g: ' - [x] hello'
// prefix: ' - [ '
// check: 'x'
// suffix: '] '
// body: hello
constructor(lineIndex, prefix, checked, suffix, body) {
this.lineIndex = lineIndex;
this.prefix = prefix;
this.checked = checked;
this.suffix = suffix;
this.body = body;
}
toMarkdown() {
return `${this.prefix}${this.checked ? 'x' : ' '}${this.suffix}${this.body}`;
}
}
export class MarkdownDocument {
constructor(file, content) {
this.file = file;
this.lines = content.split("\n");
}
getTodos() {
const todos = [];
this.lines.forEach((line, lineIndex) => {
const todo = this.parseTodo(lineIndex, line);
if (todo) {
todos.push(todo);
}
});
return todos;
}
getTodo(lineIndex) {
return this.parseTodo(lineIndex, this.lines[lineIndex]);
}
parseTodo(lineIndex, line) {
const match = MarkdownDocument.todoRegexp.exec(line);
if (match) {
return new Todo(lineIndex, match.groups.prefix, match.groups.check === 'x', match.groups.suffix, match.groups.body);
}
return null;
}
modifyTodo(lineIndex, edit) {
const line = this.lines[lineIndex];
const todo = this.parseTodo(lineIndex, line);
if (todo === null) {
throw `Not a TODO line`;
}
if (edit.body !== undefined) {
todo.body = edit.body;
}
if (edit.checked !== undefined) {
todo.checked = edit.checked;
}
const newLine = todo.toMarkdown();
this.lines[lineIndex] = newLine;
console.info("Modify TODO: file=%s, index=%d, oldLine=%s, newLine=%s", this.file, lineIndex, line, newLine);
}
toMarkdown() {
return this.lines.join('\n');
}
}
MarkdownDocument.todoRegexp = /^(?<prefix>\s*\- \[)(?<check>.)(?<suffix>\]\s+)(?<body>.*)$/;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sSUFBSTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLGVBQWU7SUFDZixjQUFjO0lBRWQsWUFDVyxTQUFpQixFQUNoQixNQUFjLEVBQ2YsT0FBZ0IsRUFDZixNQUFjLEVBQ2YsSUFBWTtRQUpaLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNmLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFJLENBQUM7SUFFckIsVUFBVTtRQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pGLENBQUM7Q0FFSjtBQU9ELE1BQU0sT0FBTyxnQkFBZ0I7SUFLekIsWUFBbUIsSUFBWSxFQUFFLE9BQWU7UUFBN0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFFBQVE7UUFDWCxNQUFNLEtBQUssR0FBZ0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFO1lBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQUksSUFBSSxFQUFFO2dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDcEI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxPQUFPLENBQUMsU0FBaUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLElBQVk7UUFDN0MsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLEtBQUssRUFBRTtZQUNQLE9BQU8sSUFBSSxJQUFJLENBQ1gsU0FBUyxFQUNULEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQzFCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFVBQVUsQ0FBQyxTQUFpQixFQUFFLElBQWM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLGlCQUFpQixDQUFDO1NBQzNCO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDekI7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUMvQjtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNoQyxPQUFPLENBQUMsSUFBSSxDQUNSLHdEQUF3RCxFQUN4RCxJQUFJLENBQUMsSUFBSSxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBRU0sVUFBVTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQzs7QUE1RHVCLDJCQUFVLEdBQUcsNkRBQTZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVG9kbyB7XHJcbiAgICAvLyBlLmc6ICcgIC0gW3hdIGhlbGxvJ1xyXG4gICAgLy8gcHJlZml4OiAnICAtIFsgJ1xyXG4gICAgLy8gY2hlY2s6ICd4J1xyXG4gICAgLy8gc3VmZml4OiAnXSAnXHJcbiAgICAvLyBib2R5OiBoZWxsb1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBsaW5lSW5kZXg6IG51bWJlcixcclxuICAgICAgICBwcml2YXRlIHByZWZpeDogc3RyaW5nLFxyXG4gICAgICAgIHB1YmxpYyBjaGVja2VkOiBib29sZWFuLFxyXG4gICAgICAgIHByaXZhdGUgc3VmZml4OiBzdHJpbmcsXHJcbiAgICAgICAgcHVibGljIGJvZHk6IHN0cmluZykgeyB9XHJcblxyXG4gICAgcHVibGljIHRvTWFya2Rvd24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHt0aGlzLmNoZWNrZWQgPyAneCcgOiAnICd9JHt0aGlzLnN1ZmZpeH0ke3RoaXMuYm9keX1gO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVG9kb0VkaXQgPSB7XHJcbiAgICBjaGVja2VkPzogYm9vbGVhbixcclxuICAgIGJvZHk/OiBzdHJpbmcsXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNYXJrZG93bkRvY3VtZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSB0b2RvUmVnZXhwID0gL14oPzxwcmVmaXg+XFxzKlxcLSBcXFspKD88Y2hlY2s+LikoPzxzdWZmaXg+XFxdXFxzKykoPzxib2R5Pi4qKSQvO1xyXG4gICAgcHJpdmF0ZSBsaW5lczogQXJyYXk8c3RyaW5nPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmlsZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VG9kb3MoKTogQXJyYXk8VG9kbz4ge1xyXG4gICAgICAgIGNvbnN0IHRvZG9zOiBBcnJheTxUb2RvPiA9IFtdO1xyXG4gICAgICAgIHRoaXMubGluZXMuZm9yRWFjaCgobGluZSwgbGluZUluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvZG8gPSB0aGlzLnBhcnNlVG9kbyhsaW5lSW5kZXgsIGxpbmUpO1xyXG4gICAgICAgICAgICBpZiAodG9kbykge1xyXG4gICAgICAgICAgICAgICAgdG9kb3MucHVzaCh0b2RvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b2RvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VG9kbyhsaW5lSW5kZXg6IG51bWJlcik6IFRvZG8gfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRvZG8obGluZUluZGV4LCB0aGlzLmxpbmVzW2xpbmVJbmRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VUb2RvKGxpbmVJbmRleDogbnVtYmVyLCBsaW5lOiBzdHJpbmcpOiBUb2RvIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBNYXJrZG93bkRvY3VtZW50LnRvZG9SZWdleHAuZXhlYyhsaW5lKTtcclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2RvKFxyXG4gICAgICAgICAgICAgICAgbGluZUluZGV4LFxyXG4gICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXBzLnByZWZpeCxcclxuICAgICAgICAgICAgICAgIG1hdGNoLmdyb3Vwcy5jaGVjayA9PT0gJ3gnLFxyXG4gICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXBzLnN1ZmZpeCxcclxuICAgICAgICAgICAgICAgIG1hdGNoLmdyb3Vwcy5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1vZGlmeVRvZG8obGluZUluZGV4OiBudW1iZXIsIGVkaXQ6IFRvZG9FZGl0KSB7XHJcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMubGluZXNbbGluZUluZGV4XTtcclxuICAgICAgICBjb25zdCB0b2RvID0gdGhpcy5wYXJzZVRvZG8obGluZUluZGV4LCBsaW5lKTtcclxuICAgICAgICBpZiAodG9kbyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBgTm90IGEgVE9ETyBsaW5lYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVkaXQuYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvZG8uYm9keSA9IGVkaXQuYm9keTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVkaXQuY2hlY2tlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvZG8uY2hlY2tlZCA9IGVkaXQuY2hlY2tlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV3TGluZSA9IHRvZG8udG9NYXJrZG93bigpO1xyXG4gICAgICAgIHRoaXMubGluZXNbbGluZUluZGV4XSA9IG5ld0xpbmU7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFxyXG4gICAgICAgICAgICBcIk1vZGlmeSBUT0RPOiBmaWxlPSVzLCBpbmRleD0lZCwgb2xkTGluZT0lcywgbmV3TGluZT0lc1wiLFxyXG4gICAgICAgICAgICB0aGlzLmZpbGUsXHJcbiAgICAgICAgICAgIGxpbmVJbmRleCxcclxuICAgICAgICAgICAgbGluZSxcclxuICAgICAgICAgICAgbmV3TGluZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvTWFya2Rvd24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saW5lcy5qb2luKCdcXG4nKTtcclxuICAgIH1cclxufVxyXG4iXX0=