Skip to content

Commit 296e1e0

Browse files
committed
feat: Obsidian comments could be ignored or convert to HTML comments.
1 parent 08073c2 commit 296e1e0

File tree

8 files changed

+29489
-29319
lines changed

8 files changed

+29489
-29319
lines changed

main.js

Lines changed: 29361 additions & 29310 deletions
Large diffs are not rendered by default.

src/i18n/en.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
"settings_MathJaxOutputTypeTeXDesc": "Convert MathJax to TeX directly. WordPress needs install MathJax related plugin, such as simple-mathjax.",
7171
"settings_mathJaxOutputTypeSVG": "SVG",
7272
"settings_MathJaxOutputTypeSVGDesc": "Convert MathJax to SVG. Browser render SVG, no plugin needed for WordPress.",
73+
"settings_commentConvertMode": "Comment convert",
74+
"settings_commentConvertModeDesc": "Select how to convert Obsidian notes comments.",
75+
"settings_commentConvertModeIgnore": "Ignore",
76+
"settings_commentConvertModeIgnoreDesc": "Just ignore all comments and convert comments to empty.",
77+
"settings_commentConvertModeHTML": "HTML",
78+
"settings_commentConvertModeHTMLDesc": "Convert Obsidian notes comments to HTML comments.",
7379
"settings_enableHtml": "Enable HTML",
7480
"settings_enableHtmlDesc": "Enable HTML tags in notes. This might cause XSS attack to your WordPress.",
7581
"settings_replaceMediaLinks": "Replace media links",

src/i18n/zh-cn.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
"settings_MathJaxOutputTypeTeXDesc": "将 MathJax 公式输出为 TeX 格式。WordPress 需要安装 MathJax 相关插件,例如 simple-mathjax",
7171
"settings_mathJaxOutputTypeSVG": "SVG",
7272
"settings_MathJaxOutputTypeSVGDesc": "将 MathJax 公式输出为 SVG 格式。浏览器可以直接显示 SVG 矢量图,WordPress 无需任何处理",
73+
"settings_commentConvertMode": "注释转换",
74+
"settings_commentConvertModeDesc": "选择如何处理笔记中的注释",
75+
"settings_commentConvertModeIgnore": "忽略",
76+
"settings_commentConvertModeIgnoreDesc": "忽略所有注释,将其转换为空白字符串",
77+
"settings_commentConvertModeHTML": "HTML",
78+
"settings_commentConvertModeHTMLDesc": "将笔记中的注释转换为 HTML 注释",
7379
"settings_enableHtml": "启用 HTML",
7480
"settings_enableHtmlDesc": "启用笔记中的 HTML 标签。这可能导致针对 WordPress 的 XSS 攻击",
7581
"settings_replaceMediaLinks": "替换媒体链接",

src/markdown-it-comment-plugin.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import MarkdownIt from 'markdown-it';
2+
import { CommentConvertMode } from './plugin-settings';
3+
4+
const tokenType = 'ob_comment';
5+
6+
interface MarkdownItCommentPluginOptions {
7+
convertMode: CommentConvertMode;
8+
}
9+
10+
const pluginOptions: MarkdownItCommentPluginOptions = {
11+
convertMode: CommentConvertMode.Ignore,
12+
}
13+
14+
export const MarkdownItCommentPluginInstance = {
15+
plugin: plugin,
16+
updateConvertMode: (mode: CommentConvertMode) => {
17+
pluginOptions.convertMode = mode;
18+
},
19+
}
20+
21+
function plugin(md: MarkdownIt): void {
22+
md.inline.ruler.before('emphasis', tokenType, (state, silent) => {
23+
const start = state.pos;
24+
const max = state.posMax;
25+
const src = state.src;
26+
27+
// check if start with %%
28+
if (src.charCodeAt(start) !== 0x25 /* % */ || start + 4 >= max) {
29+
return false;
30+
}
31+
if (src.charCodeAt(start + 1) !== 0x25 /* % */) {
32+
return false;
33+
}
34+
35+
// find ended %%
36+
let end = start + 2;
37+
while (end < max && (src.charCodeAt(end) !== 0x25 /* % */ || src.charCodeAt(end + 1) !== 0x25 /* % */)) {
38+
end++;
39+
}
40+
41+
if (end >= max) {
42+
return false;
43+
}
44+
45+
end += 2; // skip ended %%
46+
47+
if (!silent) {
48+
const token = state.push(tokenType, 'comment', 0);
49+
token.content = src.slice(start + 2, end - 2).trim();
50+
state.pos = end;
51+
return true;
52+
}
53+
54+
state.pos = end;
55+
return true;
56+
});
57+
58+
md.renderer.rules[tokenType] = (tokens, idx) => {
59+
if (pluginOptions.convertMode === CommentConvertMode.HTML) {
60+
return `<!-- ${tokens[idx].content} -->`;
61+
} else {
62+
return '';
63+
}
64+
};
65+
}

src/plugin-settings.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ export const enum MathJaxOutputType {
2323
SVG = 'svg'
2424
}
2525

26+
export const enum CommentConvertMode {
27+
Ignore = 'ignore',
28+
HTML = 'html'
29+
}
30+
2631
export interface WordpressPluginSettings {
2732

2833
version?: SettingsVersion;
@@ -61,6 +66,8 @@ export interface WordpressPluginSettings {
6166

6267
mathJaxOutputType: MathJaxOutputType;
6368

69+
commentConvertMode: CommentConvertMode;
70+
6471
enableHtml: boolean;
6572

6673
/**
@@ -78,6 +85,7 @@ export const DEFAULT_SETTINGS: WordpressPluginSettings = {
7885
rememberLastSelectedCategories: true,
7986
showWordPressEditConfirm: false,
8087
mathJaxOutputType: MathJaxOutputType.SVG,
88+
commentConvertMode: CommentConvertMode.Ignore,
8189
enableHtml: false,
8290
replaceMediaLinks: true,
8391
}
@@ -99,7 +107,8 @@ export async function upgradeSettings(
99107
defaultPostType: 'post',
100108
rememberLastSelectedCategories: existingSettings.rememberLastSelectedCategories,
101109
showWordPressEditConfirm: existingSettings.showWordPressEditConfirm,
102-
mathJaxOutputType: existingSettings.mathJaxOutputType
110+
mathJaxOutputType: existingSettings.mathJaxOutputType,
111+
commentConvertMode: existingSettings.commentConvertMode,
103112
});
104113
if (existingSettings.endpoint) {
105114
const endpoint = existingSettings.endpoint;

src/settings.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import WordpressPlugin from './main';
33
import { CommentStatus, PostStatus } from './wp-api';
44
import { TranslateKey } from './i18n';
55
import { WpProfileManageModal } from './wp-profile-manage-modal';
6-
import { MathJaxOutputType } from './plugin-settings';
6+
import { CommentConvertMode, MathJaxOutputType } from './plugin-settings';
77
import { WpProfile } from './wp-profile';
88
import { setupMarkdownParser } from './utils';
99
import { AppState } from './app-state';
@@ -33,13 +33,25 @@ export class WordpressSettingTab extends PluginSettingTab {
3333
}
3434
}
3535

36+
const getCommentConvertModeDesc = (type: CommentConvertMode): string => {
37+
switch (type) {
38+
case CommentConvertMode.Ignore:
39+
return t('settings_commentConvertModeIgnoreDesc');
40+
case CommentConvertMode.HTML:
41+
return t('settings_commentConvertModeHTMLDesc');
42+
default:
43+
return '';
44+
}
45+
}
46+
3647
const { containerEl } = this;
3748

3849
containerEl.empty();
3950

4051
containerEl.createEl('h1', { text: t('settings_title') });
4152

4253
let mathJaxOutputTypeDesc = getMathJaxOutputTypeDesc(this.plugin.settings.mathJaxOutputType);
54+
let commentConvertModeDesc = getCommentConvertModeDesc(this.plugin.settings.commentConvertMode);
4355

4456
new Setting(containerEl)
4557
.setName(t('settings_profiles'))
@@ -147,6 +159,28 @@ export class WordpressSettingTab extends PluginSettingTab {
147159
cls: 'setting-item-description'
148160
});
149161

162+
new Setting(containerEl)
163+
.setName(t('settings_commentConvertMode'))
164+
.setDesc(t('settings_commentConvertModeDesc'))
165+
.addDropdown((dropdown) => {
166+
dropdown
167+
.addOption(CommentConvertMode.Ignore, t('settings_commentConvertModeIgnore'))
168+
.addOption(CommentConvertMode.HTML, t('settings_commentConvertModeHTML'))
169+
.setValue(this.plugin.settings.commentConvertMode)
170+
.onChange(async (value) => {
171+
this.plugin.settings.commentConvertMode = value as CommentConvertMode;
172+
commentConvertModeDesc = getCommentConvertModeDesc(this.plugin.settings.commentConvertMode);
173+
await this.plugin.saveSettings();
174+
this.display();
175+
176+
setupMarkdownParser(this.plugin.settings);
177+
});
178+
});
179+
containerEl.createEl('p', {
180+
text: commentConvertModeDesc,
181+
cls: 'setting-item-description'
182+
});
183+
150184
new Setting(containerEl)
151185
.setName(t('settings_enableHtml'))
152186
.setDesc(t('settings_enableHtmlDesc'))
@@ -157,7 +191,7 @@ export class WordpressSettingTab extends PluginSettingTab {
157191
this.plugin.settings.enableHtml = value;
158192
await this.plugin.saveSettings();
159193

160-
AppState.getInstance().markdownParser.set({
194+
AppState.markdownParser.set({
161195
html: this.plugin.settings.enableHtml
162196
});
163197
}),

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { SafeAny } from './utils';
22
import { isArray, isString } from 'lodash-es';
33

44
export interface MarkdownItPlugin {
5-
updateOptions: <OptionType> (option: OptionType) => void;
5+
updateOptions: (opts: SafeAny) => void;
66
}
77

88
export type MatterData = { [p: string]: SafeAny };

src/utils.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { App, Notice, Setting, TFile } from 'obsidian';
22
import { WpProfile } from './wp-profile';
3-
import { AppState } from './app-state';
43
import { WordpressPluginSettings } from './plugin-settings';
5-
import MarkdownItMathJax3Plugin from './markdown-it-mathjax3-plugin';
4+
import { MarkdownItMathJax3PluginInstance } from './markdown-it-mathjax3-plugin';
65
import { WordPressClientResult, WordPressClientReturnCode, WordPressPostParams } from './wp-client';
76
import { getWordPressClient } from './wp-clients';
87
import WordpressPlugin from './main';
98
import { isString } from 'lodash-es';
109
import { ERROR_NOTICE_TIMEOUT } from './consts';
1110
import { format } from 'date-fns';
1211
import { MatterData } from './types';
12+
import { MarkdownItCommentPluginInstance } from './markdown-it-comment-plugin';
1313

1414
export type SafeAny = any; // eslint-disable-line @typescript-eslint/no-explicit-any
1515

@@ -30,9 +30,8 @@ export function isPromiseFulfilledResult<T>(obj: SafeAny): obj is PromiseFulfill
3030
}
3131

3232
export function setupMarkdownParser(settings: WordpressPluginSettings): void {
33-
AppState.markdownParser.use(MarkdownItMathJax3Plugin, {
34-
outputType: settings.mathJaxOutputType
35-
});
33+
MarkdownItMathJax3PluginInstance.updateOutputType(settings.mathJaxOutputType);
34+
MarkdownItCommentPluginInstance.updateConvertMode(settings.commentConvertMode);
3635
}
3736

3837

0 commit comments

Comments
 (0)