Skip to content

Commit ffe055d

Browse files
committed
Add parsing methods
Add block parsing Update version numbers
1 parent 7300b5d commit ffe055d

File tree

6 files changed

+167
-53
lines changed

6 files changed

+167
-53
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
11
# Obsidian LogSeq plugin
22

3-
A simple plugin to make Obsidian's preview of LogSeq markdown a bit more pleasant.
3+
A simple plugin to make Obsidian's preview of LogSeq markdown a bit more pleasant.
4+
5+
## Setup
6+
7+
Install the plugin from source or from the community list.
8+
9+
This plugin doesn't support configuration at the moment.
10+
11+
## Features
12+
13+
- Preview of `org-mode` tasks (`TODO`, `DONE`, `COMPLETED`, etc.) with proper styling
14+
- Remove LogSeq timestamps from preview
15+
- Render `org-mode` blocks (eg `#+BEGIN_NOTE`/`#+END_NOTE`) as `<blockquote>`

main.js

Lines changed: 67 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

main.ts

Lines changed: 83 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,51 @@ import {
55
Plugin,
66
} from "obsidian";
77

8+
enum TaskType {
9+
TODO,
10+
DONE,
11+
DOING,
12+
LATER,
13+
CANCELED,
14+
UNKNOWN,
15+
}
16+
17+
const VERSION = "0.0.2";
18+
19+
function parseTaskType(content: string): TaskType | null {
20+
if (content.startsWith("DONE ")) {
21+
return TaskType.DONE;
22+
} else if (content.startsWith("TODO ")) {
23+
return TaskType.TODO;
24+
} else if (content.startsWith("DOING ")) {
25+
return TaskType.DOING;
26+
} else if (content.startsWith("LATER ")) {
27+
return TaskType.LATER;
28+
} else if (content.startsWith("CANCELED ")) {
29+
return TaskType.CANCELED;
30+
} else {
31+
return TaskType.UNKNOWN;
32+
}
33+
}
34+
35+
function removeTimestamps(content: string): string {
36+
return content
37+
.replace(/doing:: (?:\d{13})/gms, "")
38+
.replace(/done:: (?:\d{13})/gms, "")
39+
.replace(/todo:: (?:\d{13})/gms, "")
40+
.replace(/doing:: (?:\d{13})/gms, "")
41+
.replace(/later:: (?:\d{13})/gms, "")
42+
.replace(/canceled:: (?:\d{13})/gms, "")
43+
.replace(/collapsed:: (?:true|false)/gms, "")
44+
.replace("<br>", "");
45+
}
46+
47+
const blockTest = new RegExp(/\#\+BEGIN_(WARNING|IMPORTANT|QUOTE|CAUTION)/gms);
48+
49+
function isBlock(content: string): boolean {
50+
return blockTest.test(content);
51+
}
52+
853
export default class LogSeqPlugin extends Plugin {
954
static postprocessor: MarkdownPostProcessor = (
1055
el: HTMLElement,
@@ -13,43 +58,57 @@ export default class LogSeqPlugin extends Plugin {
1358
const entries = el.querySelectorAll("li[data-line]");
1459

1560
entries.forEach((entry) => {
16-
const contents = entry.textContent;
17-
if (contents.startsWith("DONE")) {
18-
const replacedHTML = entry.innerHTML
19-
.replace("DONE", "")
20-
.replace(/doing:: (?:\d{13})/, "")
21-
.replace(/done:: (?:\d{13})/, "")
22-
.replace(/todo:: (?:\d{13})/, "")
23-
.replace("<br>", "");
24-
entry.innerHTML = `<span class="logseq-done-task"><input type="checkbox" checked> ${replacedHTML}</span>`;
25-
} else if (contents.startsWith("TODO")) {
26-
const replacedHTML = entry.innerHTML
27-
.replace("TODO", "")
28-
.replace(/todo:: (?:\d{13})/, "");
61+
const taskType = parseTaskType(entry.textContent);
2962

30-
entry.innerHTML = `<input type="checkbox"> <span class="logseq-status-task">TODO</span> ${replacedHTML}`;
31-
} else if (contents.startsWith("DOING")) {
32-
const replacedHTML = entry.innerHTML
33-
.replace("DOING", "")
34-
.replace(/doing:: (?:\d{13})/, "")
35-
.replace(/todo:: (?:\d{13})/, "");
63+
// Check if the entry is a org-mode block
64+
if (isBlock(entry.innerHTML)) {
65+
let replacedBlock = entry.innerHTML.replace(
66+
/\#\+BEGIN_(WARNING|IMPORTANT|QUOTE|CAUTION)/,
67+
"<blockquote> &#9759;"
68+
);
69+
replacedBlock = replacedBlock.replace(
70+
/\#\+END_(WARNING|IMPORTANT|QUOTE|CAUTION)/,
71+
"</blockquote>"
72+
);
73+
entry.innerHTML = replacedBlock;
74+
}
3675

76+
if (taskType == TaskType.DONE) {
77+
const replacedHTML = removeTimestamps(
78+
entry.innerHTML.replace("DONE", "")
79+
);
80+
entry.innerHTML = `<span class="logseq-done-task"><input type="checkbox" checked> ${replacedHTML}</span>`;
81+
} else if (taskType == TaskType.TODO) {
82+
const replacedHTML = removeTimestamps(
83+
entry.innerHTML.replace("TODO", "")
84+
);
85+
entry.innerHTML = `<input type="checkbox"> <span class="logseq-status-task">TODO</span> ${replacedHTML}`;
86+
} else if (taskType == TaskType.DOING) {
87+
const replacedHTML = removeTimestamps(
88+
entry.innerHTML.replace("DOING", "")
89+
);
3790
entry.innerHTML = `<input type="checkbox"> <span class="logseq-status-task">DOING</span> ${replacedHTML}`;
38-
} else if (contents.startsWith("LATER")) {
39-
const replacedHTML = entry.innerHTML.replace("LATER", "");
40-
91+
} else if (taskType == TaskType.LATER) {
92+
const replacedHTML = removeTimestamps(
93+
entry.innerHTML.replace("LATER", "")
94+
);
4195
entry.innerHTML = `<input type="checkbox"> <span class="logseq-status-task">LATER</span> ${replacedHTML}`;
96+
} else if (taskType == TaskType.CANCELED) {
97+
const replacedHTML = removeTimestamps(
98+
entry.innerHTML.replace("CANCELED", "")
99+
);
100+
entry.innerHTML = `<span class="logseq-done-task">${replacedHTML}</span>`;
42101
}
43102
});
44103
};
45104

46105
onload() {
47-
console.log("loading LogSeq plugin");
106+
console.log(`Loading LogSeq plugin ${VERSION}`);
48107
MarkdownPreviewRenderer.registerPostProcessor(LogSeqPlugin.postprocessor);
49108
}
50109

51110
onunload() {
52-
console.log("unloading LogSeq plugin");
111+
console.log(`unloading LogSeq plugin ${VERSION}`);
53112
MarkdownPreviewRenderer.unregisterPostProcessor(LogSeqPlugin.postprocessor);
54113
}
55114
}

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"id": "logseq-format",
33
"name": "LogSeq markdown formatting",
4-
"version": "0.0.1",
4+
"version": "0.0.2",
55
"minAppVersion": "0.9.15",
66
"description": "Render LogSeq-specific markdown",
77
"author": "Rui Vieira",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "obsidian-plugin-logseq",
3-
"version": "0.0.1",
3+
"version": "0.0.2",
44
"description": "Render LogSeq-specific markdown.",
55
"main": "main.js",
66
"scripts": {

versions.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
{
2-
"1.0.0": "0.9.15",
3-
"1.0.1": "0.9.15",
4-
"1.0.2": "0.9.15",
5-
"1.0.3": "0.9.15"
2+
"0.0.1": "0.9.15",
3+
"0.0.2": "0.9.15"
64
}

0 commit comments

Comments
 (0)