format code style

This commit is contained in:
wanxp 2022-10-31 00:43:55 +08:00
parent 9278a334c1
commit a10dfe32b7
41 changed files with 1262 additions and 1306 deletions

@ -1,7 +1,26 @@
# Obsidian Douban Plugin
[![Version][version-shield]][version-url][![Stargazers][stars-shield]][stars-url][![Issues][issues-shield]][issues-url][![Downloads][downloads-shield]][downloads-url][![Contributors][contributors-shield]][contributors-url]
<p align="center">
<a href="https://github.com/Wanxp/obsidian-douban/releases/latest">
<img src="https://img.shields.io/github/manifest-json/v/Wanxp/obsidian-douban?color=blue">
</a>
<img src="https://img.shields.io/github/release-date/Wanxp/obsidian-douban">
<a href="https://github.com/Wanxp/obsidian-douban/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Wanxp/obsidian-douban">
</a>
<img src="https://img.shields.io/github/downloads/Wanxp/obsidian-douban/total">
<a href="https://github.com/Wanxp/obsidian-douban/issues">
<img src="https://img.shields.io/github/issues/Wanxp/obsidian-douban">
</a>
<br>
<img src="https://img.shields.io/tokei/lines/github/Wanxp/obsidian-douban">
<a href="https://www.codefactor.io/repository/github/Wanxp/obsidian-douban/stats">
<img src="https://img.shields.io/codefactor/grade/github/Wanxp/obsidian-douban">
</a>
<a href="https://mszturc.github.io/obsidian-advanced-slides/lcov-report/">
<img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/MSzturc/a2879612aa47b6364392d94cae882c50/raw/obsidian-advanced-slides_coverage.json">
</a>
</p>
Import Movies, Books, Music, Teleplay, Note, Game even Broadcast Data from Douban in [Obsidian](https://obsidian.md/)
在[Obsidian](https://obsidian.md/)使用并导入豆瓣中的电影/书籍/音乐/电视剧/日记/游戏甚至是广播, 包含评分/发布日期/演员表等信息
@ -66,22 +85,3 @@ If you want some features or have any questions about this plugin, create issues
进入Obsidian插件中心重新加载当前插件
7. Enjoy your develop
享受开发吧
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/Wanxp/obsidian-douban
[contributors-url]: https://github.com/Wanxp/obsidian-douban/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/Wanxp/obsidian-douban
[forks-url]: https://github.com/Wanxp/obsidian-douban/network/members
[stars-shield]: https://img.shields.io/github/stars/Wanxp/obsidian-douban
[stars-url]: https://github.com/Wanxp/obsidian-douban/stargazers
[issues-shield]: https://img.shields.io/github/issues/Wanxp/obsidian-douban
[issues-url]: https://github.com/Wanxp/obsidian-douban/issues
[license-shield]: https://img.shields.io/github/license/Wanxp/obsidian-douban
[license-url]: https://github.com/Wanxp/obsidian-douban/blob/master/LICENSE.txt
[product-screenshot]: images/screenshot.png
[version-shield]: https://img.shields.io/github/package-json/v/Wanxp/obsidian-douban
[version-url]: https://github.com/Wanxp/obsidian-douban/releases/latest
[downloads-shield]: https://img.shields.io/github/downloads/Wanxp/obsidian-douban/total
[downloads-url]: https://github.com/Wanxp/obsidian-douban

@ -28,7 +28,7 @@ export enum PersonNameMode {
/**
*
*/
export const PersonNameModeRecords: {[key in PersonNameMode]: string} = {
export const PersonNameModeRecords: { [key in PersonNameMode]: string } = {
[PersonNameMode.CH_NAME]: i18nHelper.getMessage('121206'),
[PersonNameMode.EN_NAME]: i18nHelper.getMessage('121207'),
[PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'),

@ -1,31 +1,29 @@
import {PersonNameMode} from "../constant/Constsant";
export interface DoubanPluginSettings {
movieTemplate:string,
bookTemplate:string,
musicTemplate:string,
noteTemplate:string,
gameTemplate:string,
dateFormat:string,
timeFormat:string,
searchUrl:string,
arraySpilt:string,
searchHeaders?:string,
personNameMode:PersonNameMode,
movieTemplate: string,
bookTemplate: string,
musicTemplate: string,
noteTemplate: string,
gameTemplate: string,
dateFormat: string,
timeFormat: string,
searchUrl: string,
arraySpilt: string,
searchHeaders?: string,
personNameMode: PersonNameMode,
}
export const doubanHeaders = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36",
};
export const DEFAULT_SETTINGS:DoubanPluginSettings = {
movieTemplate:
`---
export const DEFAULT_SETTINGS: DoubanPluginSettings = {
movieTemplate:
`---
doubanId: {{id}}
title: {{title}}
type: {{type}}
@ -43,8 +41,8 @@ desc: {{desc}}
![image]({{image}})
`,
bookTemplate:
`---
bookTemplate:
`---
doubanId: {{id}}
title: {{title}}
subTitle: {{subTitle}}
@ -69,8 +67,8 @@ desc: {{desc}}
{{menu}}
`,
musicTemplate:
`---
musicTemplate:
`---
doubanId: {{id}}
title: {{title}}
type: {{type}}
@ -90,8 +88,8 @@ desc: {{desc}}
![image|150]({{image}})
`,
noteTemplate:
`---
noteTemplate:
`---
doubanId: {{id}}
title: {{title}}
type: {{type}}
@ -106,7 +104,7 @@ desc: {{desc}}
{{content}}
`,
gameTemplate:
`---
`---
doubanId: {{id}}
title: {{title}}
aliases: {{aliases}}
@ -126,12 +124,12 @@ desc: {{desc}}
`,
// totalWord: {{totalWord}}
searchUrl: 'https://www.douban.com/search?q=',
searchHeaders: JSON.stringify(doubanHeaders),
dateFormat: "yyyy-MM-DD",
searchUrl: 'https://www.douban.com/search?q=',
searchHeaders: JSON.stringify(doubanHeaders),
dateFormat: "yyyy-MM-DD",
timeFormat: "HH:mm:ss",
arraySpilt: ", ",
personNameMode: PersonNameMode.CH_NAME
personNameMode: PersonNameMode.CH_NAME
}

@ -1,212 +1,210 @@
import { App, PluginSettingTab, Setting } from "obsidian";
import { DEFAULT_SETTINGS } from "./Douban";
import {App, PluginSettingTab, Setting} from "obsidian";
import {DEFAULT_SETTINGS} from "./Douban";
import DoubanPlugin from "main";
import { i18nHelper } from "src/lang/helper";
import {i18nHelper} from "src/lang/helper";
import {PersonNameMode, PersonNameModeRecords} from "../constant/Constsant";
export class DoubanSettingTab extends PluginSettingTab {
plugin: DoubanPlugin;
constructor(app: App, plugin: DoubanPlugin) {
super(app, plugin);
this.plugin = plugin;
super(app, plugin);
this.plugin = plugin;
}
display(): void {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: 'Obsidian Douban' });
let {containerEl} = this;
containerEl.empty();
containerEl.createEl("h2", {text: 'Obsidian Douban'});
new Setting(containerEl).setName(i18nHelper.getMessage('120001'))
.then((setting) => {
setting.addText((textField) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120002'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120003'));
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120901'),
href: 'https://www.douban.com',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120004'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120005'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120006'));
frag.createEl('br');
})
);
textField.inputEl.addClass("obsidian_douban_settings_textField");
textField
.setPlaceholder(DEFAULT_SETTINGS.searchUrl)
.setValue(this.plugin.settings.searchUrl)
.onChange(async (value) => {
this.plugin.settings.searchUrl = value;
await this.plugin.saveSettings();
});
.then((setting) => {
setting.addText((textField) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120002'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120003'));
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120901'),
href: 'https://www.douban.com',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120004'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120005'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120006'));
frag.createEl('br');
})
);
textField.inputEl.addClass("obsidian_douban_settings_textField");
textField
.setPlaceholder(DEFAULT_SETTINGS.searchUrl)
.setValue(this.plugin.settings.searchUrl)
.onChange(async (value) => {
this.plugin.settings.searchUrl = value;
await this.plugin.saveSettings();
});
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120101')).then((setting) => {
setting.addTextArea((textarea) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120102'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120103'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120104'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120105'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120106'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120107'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.movieTemplate)
.setValue(this.plugin.settings.movieTemplate)
.onChange(async (value) => {
this.plugin.settings.movieTemplate = value;
await this.plugin.saveSettings();
});
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120102'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120103'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120104'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120105'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120106'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120107'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.movieTemplate)
.setValue(this.plugin.settings.movieTemplate)
.onChange(async (value) => {
this.plugin.settings.movieTemplate = value;
await this.plugin.saveSettings();
});
});
});
});
// new Setting(containerEl)
// .setName(i18nHelper.getMessage('120101') + 111)
// .then((setting) => {
// setting.addTextArea((textarea) => {
// setting.descEl.appendChild(
// createEl('table', 'table', (table) => {
// table.createEl('thead', 'thread', (thead) => {
// thead.createEl('tr', 'tr',(tr) => {
// tr.createEl('th', { text: i18nHelper.getMessage('120108') });
// tr.createEl('th', { text: i18nHelper.getMessage('120109') });
// tr.createEl('th', { text: i18nHelper.getMessage('120110') });
// });
// });
// table.createEl('tbody', 'tbody', (tbody) => {
// personNameModeRecords.forEach((record) => {
// tbody.createEl('tr', (tr) => {
// tr.createEl('td', { text: record.name });
// tr.createEl('td', { text: record.key });
// tr.createEl('td', { text: record.desc });
// });
// });
// });
// }
//
// );
// }));
// new Setting(containerEl)
// .setName(i18nHelper.getMessage('120101') + 111)
// .then((setting) => {
// setting.addTextArea((textarea) => {
// setting.descEl.appendChild(
// createEl('table', 'table', (table) => {
// table.createEl('thead', 'thread', (thead) => {
// thead.createEl('tr', 'tr',(tr) => {
// tr.createEl('th', { text: i18nHelper.getMessage('120108') });
// tr.createEl('th', { text: i18nHelper.getMessage('120109') });
// tr.createEl('th', { text: i18nHelper.getMessage('120110') });
// });
// });
// table.createEl('tbody', 'tbody', (tbody) => {
// personNameModeRecords.forEach((record) => {
// tbody.createEl('tr', (tr) => {
// tr.createEl('td', { text: record.name });
// tr.createEl('td', { text: record.key });
// tr.createEl('td', { text: record.desc });
// });
// });
// });
// }
//
// );
// }));
new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => {
new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => {
setting.addTextArea((textarea) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120205'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120206'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120207'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120208'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.bookTemplate)
.setValue(this.plugin.settings.bookTemplate)
.onChange(async (value) => {
this.plugin.settings.bookTemplate = value;
await this.plugin.saveSettings();
});
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120205'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120206'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120207'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120208'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.bookTemplate)
.setValue(this.plugin.settings.bookTemplate)
.onChange(async (value) => {
this.plugin.settings.bookTemplate = value;
await this.plugin.saveSettings();
});
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120301')).then((setting) => {
new Setting(containerEl).setName(i18nHelper.getMessage('120301')).then((setting) => {
setting.addTextArea((textarea) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120302'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120303'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120304'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120305'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120306'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120307'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.musicTemplate)
.setValue(this.plugin.settings.musicTemplate)
.onChange(async (value) => {
this.plugin.settings.musicTemplate = value;
await this.plugin.saveSettings();
});
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120302'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120303'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120304'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120305'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120306'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120307'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.musicTemplate)
.setValue(this.plugin.settings.musicTemplate)
.onChange(async (value) => {
this.plugin.settings.musicTemplate = value;
await this.plugin.saveSettings();
});
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage("120401")).then((setting) => {
new Setting(containerEl).setName(i18nHelper.getMessage("120401")).then((setting) => {
setting.addTextArea((textarea) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120402'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120403'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120404'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120405'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120406'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120407'));
frag.createEl('br');
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120402'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120403'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120404'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120405'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120406'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120407'));
frag.createEl('br');
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.noteTemplate)
.setValue(this.plugin.settings.noteTemplate)
.onChange(async (value) => {
this.plugin.settings.noteTemplate = value;
await this.plugin.saveSettings();
});
})
);
textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.noteTemplate)
.setValue(this.plugin.settings.noteTemplate)
.onChange(async (value) => {
this.plugin.settings.noteTemplate = value;
await this.plugin.saveSettings();
});
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('121301')).then((setting) => {
setting.addTextArea((textarea) => {
@ -235,118 +233,116 @@ export class DoubanSettingTab extends PluginSettingTab {
});
})
new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => {
new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => {
setting.addDropdown((dropdwon) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('121202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121205'));
frag.createEl('br');
})
);
// dropdwon.inputEl.addClass("settings_area");
// dropdwon.inputEl.setAttr("rows", 10);
dropdwon.addOption(PersonNameMode.CH_NAME, PersonNameModeRecords.CH)
dropdwon.addOption(PersonNameMode.EN_NAME, PersonNameModeRecords.EN)
dropdwon.addOption(PersonNameMode.CH_EN_NAME, PersonNameModeRecords.CH_EN)
dropdwon.setValue(this.plugin.settings.personNameMode)
.onChange(async (value:string) => {
this.plugin.settings.personNameMode = value as PersonNameMode;
await this.plugin.saveSettings();
});
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('121202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121205'));
frag.createEl('br');
})
);
// dropdwon.inputEl.addClass("settings_area");
// dropdwon.inputEl.setAttr("rows", 10);
dropdwon.addOption(PersonNameMode.CH_NAME, PersonNameModeRecords.CH)
dropdwon.addOption(PersonNameMode.EN_NAME, PersonNameModeRecords.EN)
dropdwon.addOption(PersonNameMode.CH_EN_NAME, PersonNameModeRecords.CH_EN)
dropdwon.setValue(this.plugin.settings.personNameMode)
.onChange(async (value: string) => {
this.plugin.settings.personNameMode = value as PersonNameMode;
await this.plugin.saveSettings();
});
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120501')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120503')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' }));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.dateFormat);
mf.setValue(this.plugin.settings.dateFormat)
mf.onChange(async (value) => {
this.plugin.settings.dateFormat = value;
await this.plugin.saveSettings();
});
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120503')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.dateFormat);
mf.setValue(this.plugin.settings.dateFormat)
mf.onChange(async (value) => {
this.plugin.settings.dateFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120502')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120504')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' }));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.timeFormat);
mf.setValue(this.plugin.settings.timeFormat)
mf.onChange(async (value) => {
this.plugin.settings.timeFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl)
.setName(i18nHelper.getMessage('120601'))
.setDesc(i18nHelper.getMessage('120602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt)
.setValue(this.plugin.settings.arraySpilt)
.onChange(async (value) => {
this.plugin.settings.arraySpilt = value;
await this.plugin.saveSettings();
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120502')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120504')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.timeFormat);
mf.setValue(this.plugin.settings.timeFormat)
mf.onChange(async (value) => {
this.plugin.settings.timeFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl)
.setName(i18nHelper.getMessage('120601'))
.setDesc(i18nHelper.getMessage('120602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt)
.setValue(this.plugin.settings.arraySpilt)
.onChange(async (value) => {
this.plugin.settings.arraySpilt = value;
await this.plugin.saveSettings();
});
});
}
}
}

@ -1,13 +1,13 @@
import { Notice } from "obsidian";
export const ensureStatusCode = (expected:any) => {
if (!Array.isArray(expected))
expected = [expected];
return (res:any) => {
const { statusCode } = res;
if(!expected.includes(statusCode)) {
new Notice(`Request Douban failed, Status code must be "${expected}" but actually "${statusCode}"`)
}
return res;
};
};
import {Notice} from "obsidian";
export const ensureStatusCode = (expected: any) => {
if (!Array.isArray(expected))
expected = [expected];
return (res: any) => {
const {statusCode} = res;
if (!expected.includes(statusCode)) {
new Notice(`Request Douban failed, Status code must be "${expected}" but actually "${statusCode}"`)
}
return res;
};
};

@ -1,12 +1,12 @@
import { CheerioAPI } from "cheerio";
import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject";
export abstract class DoubanBroadcastAbstractHandler<T extends DoubanBroadcastSubject> {
abstract support(t:string):boolean;
abstract transform(data:Element, source:CheerioAPI):T;
}
import {CheerioAPI} from "cheerio";
import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject";
export abstract class DoubanBroadcastAbstractHandler<T extends DoubanBroadcastSubject> {
abstract support(t: string): boolean;
abstract transform(data: Element, source: CheerioAPI): T;
}

@ -1,15 +1,16 @@
import { CheerioAPI } from "cheerio";
import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler";
import {CheerioAPI} from "cheerio";
import {DoubanBroadcastAbstractHandler} from "./DoubanBroadcastAbstractHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
//TODO will support in future version
export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler<DoubanBroadcastMovieSubject>{
support(t: string): boolean {
throw new Error("Method not implemented.");
}
transform(data: Element, source:CheerioAPI): DoubanBroadcastMovieSubject {
throw new Error("Method not implemented.");
}
export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler<DoubanBroadcastMovieSubject> {
support(t: string): boolean {
throw new Error("Method not implemented.");
}
transform(data: Element, source: CheerioAPI): DoubanBroadcastMovieSubject {
throw new Error("Method not implemented.");
}
}

@ -1,32 +1,32 @@
import { CheerioAPI } from "cheerio";
import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler";
import { DoubanBroadcastMovieHandler } from "./DoubanBroadcastMovieHandler";
import {CheerioAPI} from "cheerio";
import {DoubanBroadcastAbstractHandler} from "./DoubanBroadcastAbstractHandler";
import {DoubanBroadcastMovieHandler} from "./DoubanBroadcastMovieHandler";
import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject";
import DoubanPageBroadcastSubject from "../model/DoubanPageBroadcastSubject";
//TODO will support in future version
export class DoubanPageBroadcastTransformer {
private handlers:DoubanBroadcastAbstractHandler<DoubanBroadcastSubject>[];
constructor() {
this.handlers = [
new DoubanBroadcastMovieHandler(),
]
}
private handlers: DoubanBroadcastAbstractHandler<DoubanBroadcastSubject>[];
public transform(data: CheerioAPI):DoubanPageBroadcastSubject {
let doubanBroadcastSubjects:DoubanBroadcastSubject[] = data('.new-status .status-wrapper')
.get()
.map(i => this.transformElement(i, data));
return new DoubanPageBroadcastSubject ();
}
public transformElement(element:any, source:CheerioAPI):DoubanBroadcastSubject {
let targetType:string = element.innerHTML;
return this.handlers.filter(h => h.support(targetType))[0].transform(element, source);
}
constructor() {
this.handlers = [
new DoubanBroadcastMovieHandler(),
]
}
public transform(data: CheerioAPI): DoubanPageBroadcastSubject {
let doubanBroadcastSubjects: DoubanBroadcastSubject[] = data('.new-status .status-wrapper')
.get()
.map(i => this.transformElement(i, data));
return new DoubanPageBroadcastSubject();
}
public transformElement(element: any, source: CheerioAPI): DoubanBroadcastSubject {
let targetType: string = element.innerHTML;
return this.handlers.filter(h => h.support(targetType))[0].transform(element, source);
}
}

@ -1,22 +1,26 @@
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from 'src/douban/data/handler/DoubanAbstractLoadHandler';
import DoubanNoteSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from 'src/douban/data/model/DoubanSubject';
//TODO will support in future version
export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPageBroadcastSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.bookTemplate;
}
parseText(beforeContent:string, extract: DoubanNoteSubject, settings:DoubanPluginSettings): string {
parseText(beforeContent: string, extract: DoubanNoteSubject, settings: DoubanPluginSettings): string {
return settings.bookTemplate ? null : "";
// settings.noteTemplate
// .replaceAll("{{id}}", extract.id)
// settings.noteTemplate
// .replaceAll("{{id}}", extract.id)
// .replaceAll("{{type}}", extract.type ? extract.type : "")
// .replaceAll("{{title}}", extract.title ? extract.title : "")
// .replaceAll("{{desc}}", extract.desc ? extract.desc : "")
@ -26,54 +30,47 @@ export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHan
// .replaceAll("{{content}}", extract.content ? extract.content : "")
// .replaceAll("{{url}}", extract.url ? extract.url : "")
// .replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "")
// .replaceAll("{{author}}", extract.author ? extract.author : "")
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("广播") || extract.type.contains("Broadcast"));
}
// .replaceAll("{{author}}", extract.author ? extract.author : "")
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("广播") || extract.type.contains("Broadcast"));
}
parseSubjectFromHtml(html: CheerioAPI): DoubanPageBroadcastSubject {
// return html('.new-status .status-wrapper')
// .get()
// .map(i -> {
// let div = html(i);
// div.find('')
// });
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let type = html(html("head > meta[property= 'og:type']").get(0)).attr("content");
let authorA = html(html("a.note-author").get(0));
let timePublished = html(html(".pub-date").get(0)).text();
let content = html(html(".note").get(1));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseSubjectFromHtml(html: CheerioAPI): DoubanPageBroadcastSubject {
// return html('.new-status .status-wrapper')
// .get()
// .map(i -> {
// let div = html(i);
// div.find('')
// });
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let type = html(html("head > meta[property= 'og:type']").get(0)).attr("content");
let authorA = html(html("a.note-author").get(0));
let timePublished = html(html(".pub-date").get(0)).text();
let content = html(html(".note").get(1));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
// const result:DoubanNoteSubject = {
// image: image,
// timePublished: timePublished ? new Date(timePublished) : null,
// content: content ? html2markdown(content.toString()): "",
// id: id ? id[0] : "",
// type: "Article",
// title: title,
// desc: desc,
// url: url,
// author: authorA ? authorA.text() : null,
// authorUrl: authorA ? authorA.attr("href") : null,
// };
// return result;
return null;
}
// const result:DoubanNoteSubject = {
// image: image,
// timePublished: timePublished ? new Date(timePublished) : null,
// content: content ? html2markdown(content.toString()): "",
// id: id ? id[0] : "",
// type: "Article",
// title: title,
// desc: desc,
// url: url,
// author: authorA ? authorA.text() : null,
// authorUrl: authorA ? authorA.attr("href") : null,
// };
// return result;
return null;
}
}

@ -1,4 +1,4 @@
import DoubanBroadcastSubject from "./DoubanBroadcastSubject";
export default class DoubanBroadcastMovieSubject extends DoubanBroadcastSubject{
export default class DoubanBroadcastMovieSubject extends DoubanBroadcastSubject {
}

@ -4,9 +4,9 @@ export default class DoubanBroadcastSubject {
title: string;
desc: string;
url: string;
author:string;
authorUrl:string;
timePublished:Date;
image:string;
content:string;
author: string;
authorUrl: string;
timePublished: Date;
image: string;
content: string;
}

@ -1,9 +1,7 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import DoubanSubject from 'src/douban/data/model/DoubanSubject';
export default class DoubanPageBroadcastSubject extends DoubanSubject {
pageNumber:number;
broadcast:DoubanPageBroadcastSubject[];
pageSize:number;
pageNumber: number;
broadcast: DoubanPageBroadcastSubject[];
pageSize: number;
}

@ -3,30 +3,30 @@ import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanPlugin from "main";
import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject';
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import {Editor, moment, request, requestUrl, RequestUrlParam, sanitizeHTMLToDom} from "obsidian";
import { i18nHelper } from 'src/lang/helper';
import { log } from "src/utils/Logutil";
import {Editor, moment, request, RequestUrlParam} from "obsidian";
import {i18nHelper} from 'src/lang/helper';
import {log} from "src/utils/Logutil";
import {CheerioAPI, load} from "cheerio";
import YamlUtil from "../../../utils/YamlUtil";
import {BasicConst, PersonNameMode, TemplateTextMode} from "../../../constant/Constsant";
export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
public doubanPlugin:DoubanPlugin;
constructor(doubanPlugin:DoubanPlugin) {
this.doubanPlugin = doubanPlugin;
}
parse(extract: T, settings:DoubanPluginSettings): string {
let template:string = this.getTemplate(settings);
let frontMatterStart:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0);
let frontMatterEnd:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1);
let frontMatter:string = '';
let frontMatterBefore:string = '';
let frontMatterAfter:string = '';
if(frontMatterStart > -1 && frontMatterEnd > -1) {
public doubanPlugin: DoubanPlugin;
constructor(doubanPlugin: DoubanPlugin) {
this.doubanPlugin = doubanPlugin;
}
parse(extract: T, settings: DoubanPluginSettings): string {
let template: string = this.getTemplate(settings);
let frontMatterStart: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0);
let frontMatterEnd: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1);
let frontMatter: string = '';
let frontMatterBefore: string = '';
let frontMatterAfter: string = '';
if (frontMatterStart > -1 && frontMatterEnd > -1) {
frontMatterBefore = template.substring(0, frontMatterStart);
frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3);
frontMatterAfter = template.substring(frontMatterEnd + 3);
@ -40,35 +40,18 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
frontMatter = this.parsePartText(frontMatter, extract, settings, TemplateTextMode.YAML);
}
return frontMatterBefore + frontMatter + frontMatterAfter;
}else {
} else {
return this.parsePartText(template, extract, settings);
}
}
private parsePartText(template: string, extract: T, settings: DoubanPluginSettings, textMode:TemplateTextMode = TemplateTextMode.NORMAL): string {
let resultContent = template
.replaceAll(DoubanParameter.ID, extract.id)
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(extract.title, textMode))
.replaceAll(DoubanParameter.TYPE, extract.type)
.replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score))
.replaceAll(DoubanParameter.IMAGE, extract.image)
.replaceAll(DoubanParameter.URL, extract.url)
.replaceAll(DoubanParameter.DESC, this.handleSpecialContent(extract.desc, textMode))
.replaceAll(DoubanParameter.PUBLISHER, extract.publisher)
.replaceAll(DoubanParameter.DATE_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : '')
.replaceAll(DoubanParameter.TIME_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.timeFormat) : '')
.replaceAll(DoubanParameter.GENRE, this.handleSpecialContent(extract.genre, textMode, settings))
;
return this.parseText(resultContent, extract, settings, textMode);
}
/**
*
* @param text
* @param textMode
*/
handleSpecialText(text: string, textMode: TemplateTextMode):string {
let result = text;
handleSpecialText(text: string, textMode: TemplateTextMode): string {
let result = text;
switch (textMode) {
case TemplateTextMode.YAML:
result = YamlUtil.handleText(text);
@ -83,7 +66,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
* @param settings
* @param textMode
*/
handleContentArray(array: any[], settings: DoubanPluginSettings, textMode: TemplateTextMode):string {
handleContentArray(array: any[], settings: DoubanPluginSettings, textMode: TemplateTextMode): string {
let result = '';
switch (textMode) {
case TemplateTextMode.YAML:
@ -101,95 +84,110 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
* @param textMode
* @param settings
*/
handleSpecialContent(value: any, textMode:TemplateTextMode = TemplateTextMode.NORMAL, settings: DoubanPluginSettings = null): string {
handleSpecialContent(value: any, textMode: TemplateTextMode = TemplateTextMode.NORMAL, settings: DoubanPluginSettings = null): string {
let result = '';
if (value instanceof Array) {
result = this.handleContentArray(value, settings, textMode);
}else if (value instanceof Number) {
} else if (value instanceof Number) {
result = value ? value.toString() : '';
}else {
} else {
result = this.handleSpecialText(value, textMode);
}
return result;
}
abstract getTemplate(settings:DoubanPluginSettings):string;
abstract getTemplate(settings: DoubanPluginSettings): string;
abstract parseText(beforeContent:string, extract: T, settings:DoubanPluginSettings, textMode:TemplateTextMode): string;
abstract parseText(beforeContent: string, extract: T, settings: DoubanPluginSettings, textMode: TemplateTextMode): string;
abstract support(extract: DoubanSubject): boolean;
handle(url:string, editor:Editor):void {
let requestUrlParam:RequestUrlParam = {
abstract support(extract: DoubanSubject): boolean;
handle(url: string, editor: Editor): void {
let requestUrlParam: RequestUrlParam = {
url: url,
method: "GET",
headers: JSON.parse(this.doubanPlugin.settings.searchHeaders),
headers: JSON.parse(this.doubanPlugin.settings.searchHeaders),
throw: true
};
request(requestUrlParam)
.then(load)
.then(this.parseSubjectFromHtml)
.then(content => this.toEditor(editor, content))
// .then(content => content ? editor.replaceSelection(content) : content)
.catch(e => log.error(i18nHelper.getMessage('130101')))
;
.then(load)
.then(this.parseSubjectFromHtml)
.then(content => this.toEditor(editor, content))
// .then(content => content ? editor.replaceSelection(content) : content)
.catch(e => log.error(i18nHelper.getMessage('130101')))
;
}
}
abstract parseSubjectFromHtml(data:CheerioAPI):T | undefined;
toEditor(editor:Editor, extract: T):T {
this.doubanPlugin.putToEditor(editor, extract);
return extract;
}
abstract parseSubjectFromHtml(data: CheerioAPI): T | undefined;
getPersonName(name:string, settings:DoubanPluginSettings):string {
if(!name || !settings || !settings.personNameMode) {
return "";
}
let resultName:string = "";
let regValue:RegExpExecArray;
switch(settings.personNameMode) {
case PersonNameMode.CH_NAME:
regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
resultName = regValue?regValue[0]:name;
break;
case PersonNameMode.EN_NAME:
regValue = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
resultName = regValue?regValue[0]:name;
break;
default:
resultName = name;
}
return resultName;
}
toEditor(editor: Editor, extract: T): T {
this.doubanPlugin.putToEditor(editor, extract);
return extract;
}
html_encode(str:string):string
{
let s = "";
if (str.length == 0) return "";
s = str.replace(/&/g, "&amp;");
s = s.replace(/</g, "&lt;");
s = s.replace(/>/g, "&gt;");
s = s.replace(/ /g, "&nbsp;");
s = s.replace(/\'/g, "&#39;");
s = s.replace(/\"/g, "&quot;");
s = s.replace(/\n/g, "<br/>");
return s;
}
getPersonName(name: string, settings: DoubanPluginSettings): string {
if (!name || !settings || !settings.personNameMode) {
return "";
}
let resultName: string = "";
let regValue: RegExpExecArray;
switch (settings.personNameMode) {
case PersonNameMode.CH_NAME:
regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
resultName = regValue ? regValue[0] : name;
break;
case PersonNameMode.EN_NAME:
regValue = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
resultName = regValue ? regValue[0] : name;
break;
default:
resultName = name;
}
return resultName;
}
html_decode(str:string):string
{
let s = "";
if (str.length == 0) return "";
s = str.replace(/&amp;/g, "&");
s = s.replace(/&lt;/g, "<");
s = s.replace(/&gt;/g, ">");
s = s.replace(/&nbsp;/g, " ");
s = s.replace(/&#39;/g, "\'");
s = s.replace(/&quot;/g, "\"");
s = s.replace(/<br\/>/g, "\n");
return s;
}
html_encode(str: string): string {
let s = "";
if (str.length == 0) return "";
s = str.replace(/&/g, "&amp;");
s = s.replace(/</g, "&lt;");
s = s.replace(/>/g, "&gt;");
s = s.replace(/ /g, "&nbsp;");
s = s.replace(/\'/g, "&#39;");
s = s.replace(/\"/g, "&quot;");
s = s.replace(/\n/g, "<br/>");
return s;
}
html_decode(str: string): string {
let s = "";
if (str.length == 0) return "";
s = str.replace(/&amp;/g, "&");
s = s.replace(/&lt;/g, "<");
s = s.replace(/&gt;/g, ">");
s = s.replace(/&nbsp;/g, " ");
s = s.replace(/&#39;/g, "\'");
s = s.replace(/&quot;/g, "\"");
s = s.replace(/<br\/>/g, "\n");
return s;
}
private parsePartText(template: string, extract: T, settings: DoubanPluginSettings, textMode: TemplateTextMode = TemplateTextMode.NORMAL): string {
let resultContent = template
.replaceAll(DoubanParameter.ID, extract.id)
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(extract.title, textMode))
.replaceAll(DoubanParameter.TYPE, extract.type)
.replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score))
.replaceAll(DoubanParameter.IMAGE, extract.image)
.replaceAll(DoubanParameter.URL, extract.url)
.replaceAll(DoubanParameter.DESC, this.handleSpecialContent(extract.desc, textMode))
.replaceAll(DoubanParameter.PUBLISHER, extract.publisher)
.replaceAll(DoubanParameter.DATE_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : '')
.replaceAll(DoubanParameter.TIME_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.timeFormat) : '')
.replaceAll(DoubanParameter.GENRE, this.handleSpecialContent(extract.genre, textMode, settings))
;
return this.parseText(resultContent, extract, settings, textMode);
}
}

@ -1,6 +1,4 @@
import {Editor, htmlToMarkdown, moment, renderResults} from "obsidian";
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject";
import DoubanPlugin from "main";
@ -10,83 +8,80 @@ import {TemplateTextMode} from "../../../constant/Constsant";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
getTemplate(settings: DoubanPluginSettings): string {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.bookTemplate;
}
}
parseText(beforeContent:string, extract: DoubanBookSubject, settings:DoubanPluginSettings, textMode: TemplateTextMode): string {
parseText(beforeContent: string, extract: DoubanBookSubject, settings: DoubanPluginSettings, textMode: TemplateTextMode): string {
return beforeContent
.replaceAll(DoubanBookParameter.author,
super.handleSpecialContent(
extract.author.map(this.handleSpecialAuthorName), textMode, settings))
.replaceAll(DoubanBookParameter.translator, super.handleSpecialContent(extract.translator, textMode, settings))
.replaceAll(DoubanBookParameter.isbn, extract.isbn)
.replaceAll(DoubanBookParameter.originalTitle, super.handleSpecialContent(extract.originalTitle, textMode))
.replaceAll(DoubanBookParameter.subTitle,super.handleSpecialContent(extract.subTitle, textMode))
.replaceAll(DoubanBookParameter.totalPage, super.handleSpecialContent(extract.totalPage, textMode))
.replaceAll(DoubanBookParameter.menu, extract.menu.join('\n'))
.replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode))
.replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode))
.replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode));
}
.replaceAll(DoubanBookParameter.author,
super.handleSpecialContent(
extract.author.map(this.handleSpecialAuthorName), textMode, settings))
.replaceAll(DoubanBookParameter.translator, super.handleSpecialContent(extract.translator, textMode, settings))
.replaceAll(DoubanBookParameter.isbn, extract.isbn)
.replaceAll(DoubanBookParameter.originalTitle, super.handleSpecialContent(extract.originalTitle, textMode))
.replaceAll(DoubanBookParameter.subTitle, super.handleSpecialContent(extract.subTitle, textMode))
.replaceAll(DoubanBookParameter.totalPage, super.handleSpecialContent(extract.totalPage, textMode))
.replaceAll(DoubanBookParameter.menu, extract.menu.join('\n'))
.replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode))
.replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode))
.replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode));
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book"));
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book"));
}
handleSpecialAuthorName(authorName:string):string {
handleSpecialAuthorName(authorName: string): string {
return authorName.replace(/\[/g, '')
.replace(']', '/');
}
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject {
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject {
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let item = html(html("head > script[type='application/ld+json']").get(0)).text();
item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let title = obj.name;
let url = obj.url;
let author = obj.author.map((a:any) => a.name);
let author = obj.author.map((a: any) => a.name);
let isbn = obj.isbn;
let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text();
let detailDom = html(html("#info").get(0));
let publish = detailDom.find("span.pl");
let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text();
let detailDom = html(html("#info").get(0));
let publish = detailDom.find("span.pl");
let valueMap = new Map<string, any>();
let valueMap = new Map<string, any>();
publish.map((index, info) => {
let key = html(info).text().trim();
let value;
if(key.indexOf('译者') >= 0){
publish.map((index, info) => {
let key = html(info).text().trim();
let value;
if (key.indexOf('译者') >= 0) {
value = [];
html(info.parent).find("a").map((index, a) => {
value.push(html(a).text().trim());
});
} else if(key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0){
value = html(info.next.next).text().trim();
}else{
value = html(info.next).text().trim();
}
valueMap.set(BookKeyValueMap.get(key), value);
})
} else if (key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0) {
value = html(info.next.next).text().trim();
} else {
value = html(info.next).text().trim();
}
valueMap.set(BookKeyValueMap.get(key), value);
})
let idPattern = /(\d){5,10}/g;
let idE = idPattern.exec(url);
let id = idE ? idE[0]: '';
let idPattern = /(\d){5,10}/g;
let idE = idPattern.exec(url);
let id = idE ? idE[0] : '';
let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short');
let menu:string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : [];
let menu: string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : [];
menu.length > 0 ? menu.pop() : menu;
const result:DoubanBookSubject = {
const result: DoubanBookSubject = {
author: author,
translator: valueMap.has('translator') ? valueMap.get('translator') : [],
image: image,
@ -108,24 +103,24 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
genre: [],
binding: valueMap.has('binding') ? valueMap.get('binding') : "",
};
return result;
}
return result;
}
}
const BookKeyValueMap:Map<string, string> = new Map(
[['作者', 'author'],
['出版社:', 'publisher'],
['原作名:', 'originalTitle'],
['出版年:', 'datePublished'],
['页数:', 'totalPage'],
['定价:', 'price'],
['装帧:', 'binding'],
['丛书:', 'series'],
['ISBN:', 'isbn'],
['译者', 'translator'],
['副标题:', 'subTitle'],
]
const BookKeyValueMap: Map<string, string> = new Map(
[['作者', 'author'],
['出版社:', 'publisher'],
['原作名:', 'originalTitle'],
['出版年:', 'datePublished'],
['页数:', 'totalPage'],
['定价:', 'price'],
['装帧:', 'binding'],
['丛书:', 'series'],
['ISBN:', 'isbn'],
['译者', 'translator'],
['副标题:', 'subTitle'],
]
);

@ -1,4 +1,4 @@
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main";
import {DoubanPluginSettings} from "src/douban/Douban";
@ -7,8 +7,8 @@ import DoubanGameSubject from '../model/DoubanGameSubject';
export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> {
getTemplate(settings: DoubanPluginSettings): string {
return settings.gameTemplate;
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
// parse(extract: DoubanGameSubject, settings: DoubanPluginSettings): string {
@ -16,26 +16,22 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
// return super.parse(extract, settings);
// }
parseText(beforeContent:string, extract: DoubanGameSubject, settings:DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{platform}}", extract.platform ? extract.platform.join(settings.arraySpilt) : "")
.replaceAll("{{aliases}}", extract.aliases ? extract.aliases.join(settings.arraySpilt) : "")
.replaceAll("{{developer}}", extract.developer ? extract.developer : "");
getTemplate(settings: DoubanPluginSettings): string {
return settings.gameTemplate;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("游戏") || extract.type.contains("Game") || extract.type.contains("game"));
}
parseText(beforeContent: string, extract: DoubanGameSubject, settings: DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{platform}}", extract.platform ? extract.platform.join(settings.arraySpilt) : "")
.replaceAll("{{aliases}}", extract.aliases ? extract.aliases.join(settings.arraySpilt) : "")
.replaceAll("{{developer}}", extract.developer ? extract.developer : "");
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("游戏") || extract.type.contains("Game") || extract.type.contains("game"));
}
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseSubjectFromHtml(html: CheerioAPI): DoubanGameSubject {
parseSubjectFromHtml(html: CheerioAPI): DoubanGameSubject {
let title = html(html("#content > h1").get(0)).text();
let idContent = html(html("head > meta[name= 'mobile-agent']").get(0)).attr("content");
let idPattern = /(\d){5,10}/g;
@ -49,24 +45,24 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
let url = `https://www.douban.com/game/${id}/`;
let valueMap = new Map<string, any>();
let value:any;
let value: any;
dt.map((index, info) => {
let key = html(info).text().trim();
if(key.indexOf('平台') >= 0 || key.indexOf('类型') >= 0){
if (key.indexOf('平台') >= 0 || key.indexOf('类型') >= 0) {
value = [];
html(info.next.next).find("a").map((index, a) => {
value.push(html(a).text().trim());
});
}else if (key.indexOf('别名') >= 0) {
} else if (key.indexOf('别名') >= 0) {
let cc = html(info.next.next).text().trim();
value = cc.split("/");
}else{
} else {
value = html(info.next.next).text().trim();
}
valueMap.set(GameKeyValueMap.get(key), value);
})
const result:DoubanGameSubject = {
const result: DoubanGameSubject = {
id: id,
type: "Game",
title: title,
@ -82,7 +78,8 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
platform: valueMap.has('platform') ? valueMap.get('platform') : []
};
return result
}
}
//TODO support game's name i18n
// handleI18nName(title: string, settings: DoubanPluginSettings):string {
// if (!title) {
@ -110,7 +107,7 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
}
const GameKeyValueMap:Map<string, string> = new Map(
const GameKeyValueMap: Map<string, string> = new Map(
[['类型:', 'genre'],
['平台:', 'platform'],
['别名:', 'aliases'],

@ -1,74 +1,71 @@
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import SchemaOrg from "src/utils/SchemaOrg";
import DoubanSubject from '../model/DoubanSubject';
import DoubanMovieSubject from '../model/DoubanMovieSubject';
export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.movieTemplate;
}
parseText(beforeContent:string, extract: DoubanMovieSubject, settings:DoubanPluginSettings): string {
parseText(beforeContent: string, extract: DoubanMovieSubject, settings: DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "")
.replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
.replaceAll("{{actor}}", extract.actor ? extract.actor.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
.replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "")
.replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
.replaceAll("{{actor}}", extract.actor ? extract.actor.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
.replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("电影") || extract.type.contains("Movie") || extract.type.contains("movie"));
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("电影") || extract.type.contains("Movie") || extract.type.contains("movie"));
}
parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject {
return data('script')
.get()
.filter(scd => "application/ld+json" == data(scd).attr("type"))
.map(i => {
let item = data(i).text();
item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(obj.url);
let name = obj.name;
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec ? titleExec[0] : name;
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
let originalTitle = originalTitleExec ? originalTitleExec[0] : name;
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject {
return data('script')
.get()
.filter(scd => "application/ld+json" == data(scd).attr("type"))
.map(i => {
let item = data(i).text();
item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(obj.url);
let name = obj.name;
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec?titleExec[0]:name;
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
let originalTitle = originalTitleExec?originalTitleExec[0]:name;
const result:DoubanMovieSubject = {
id: id ? id[0] : '',
title: title,
type: 'Movie',
score: obj.aggregateRating ? obj.aggregateRating.ratingValue : undefined,
originalTitle: originalTitle,
desc: obj.description,
url: "https://movie.douban.com" + obj.url,
director: obj.director,
author: obj.author,
actor: obj.actor,
aggregateRating: obj.aggregateRating,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined,
image: obj.image,
genre: obj.genre,
publisher: ''
}
return result;
})[0];
}
const result: DoubanMovieSubject = {
id: id ? id[0] : '',
title: title,
type: 'Movie',
score: obj.aggregateRating ? obj.aggregateRating.ratingValue : undefined,
originalTitle: originalTitle,
desc: obj.description,
url: "https://movie.douban.com" + obj.url,
director: obj.director,
author: obj.author,
actor: obj.actor,
aggregateRating: obj.aggregateRating,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined,
image: obj.image,
genre: obj.genre,
publisher: ''
}
return result;
})[0];
}
}

@ -1,96 +1,93 @@
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanMusicSubject from '../model/DoubanMusicSubject';
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from '../model/DoubanSubject';
export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.musicTemplate;
}
parseText(beforeContent:string, extract: DoubanMusicSubject, settings:DoubanPluginSettings): string {
parseText(beforeContent: string, extract: DoubanMusicSubject, settings: DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{actor}}", extract.actor ? extract.actor.join(settings.arraySpilt) : "")
.replaceAll("{{barcode}}", extract.barcode ? extract.barcode : "")
.replaceAll("{{medium}}", extract.medium ? extract.medium : "")
.replaceAll("{{albumType}}", extract.albumType ? extract.albumType : "")
.replaceAll("{{numberOfRecords}}", extract.numberOfRecords ? extract.numberOfRecords + "" : "")
;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("音乐") || extract.type.contains("Music") || extract.type.contains("music"));
}
.replaceAll("{{actor}}", extract.actor ? extract.actor.join(settings.arraySpilt) : "")
.replaceAll("{{barcode}}", extract.barcode ? extract.barcode : "")
.replaceAll("{{medium}}", extract.medium ? extract.medium : "")
.replaceAll("{{albumType}}", extract.albumType ? extract.albumType : "")
.replaceAll("{{numberOfRecords}}", extract.numberOfRecords ? extract.numberOfRecords + "" : "")
;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("音乐") || extract.type.contains("Music") || extract.type.contains("music"));
}
parseSubjectFromHtml(html: CheerioAPI): DoubanMusicSubject {
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text();
let detailDom = html(html("#info").get(0));
let publish = detailDom.find("span.pl");
let valueMap = new Map<string, string>();
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
publish.map((index, info) => {
let key = html(info).text().trim();
let value = ''
if (key.indexOf('表演者') >= 0) {
// value = html(info.next.next).text().trim();
let vas: string[] = key.split("\n \n ");
value = vas && vas.length > 1 ? vas[1] : "";
key = vas && vas.length > 0 ? vas[0] : "";
} else {
value = html(info.next).text().trim();
}
valueMap.set(MusicKeyValueMap.get(key), value);
})
parseSubjectFromHtml(html: CheerioAPI): DoubanMusicSubject {
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text();
let detailDom = html(html("#info").get(0));
let publish = detailDom.find("span.pl");
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
let valueMap = new Map<string, string>();
publish.map((index, info) => {
let key = html(info).text().trim();
let value = ''
if(key.indexOf('表演者') >= 0){
// value = html(info.next.next).text().trim();
let vas:string[] = key.split("\n \n ");
value = vas && vas.length > 1? vas[1]:"";
key = vas && vas.length > 0? vas[0]:"";
}else{
value = html(info.next).text().trim();
}
valueMap.set(MusicKeyValueMap.get(key), value);
})
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
const result:DoubanMusicSubject = {
image: image,
datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : undefined,
publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "",
score: Number(score),
numberOfRecords: valueMap.has('numberOfRecords') ? Number(valueMap.get('numberOfRecords')) : null,
id: id ? id[0] : "",
type: "Music",
title: title,
desc: desc,
url: url,
actor: [valueMap.has('actor') ? valueMap.get('actor') : null],
genre: valueMap.has('genre') ? [valueMap.get('genre')] : [""],
albumType: valueMap.has('albumType') ? valueMap.get('albumType') : "",
medium: valueMap.has('medium') ? valueMap.get('medium') : "",
barcode: valueMap.has('barcode') ? valueMap.get('barcode') : ""
};
return result;
}
const result: DoubanMusicSubject = {
image: image,
datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : undefined,
publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "",
score: Number(score),
numberOfRecords: valueMap.has('numberOfRecords') ? Number(valueMap.get('numberOfRecords')) : null,
id: id ? id[0] : "",
type: "Music",
title: title,
desc: desc,
url: url,
actor: [valueMap.has('actor') ? valueMap.get('actor') : null],
genre: valueMap.has('genre') ? [valueMap.get('genre')] : [""],
albumType: valueMap.has('albumType') ? valueMap.get('albumType') : "",
medium: valueMap.has('medium') ? valueMap.get('medium') : "",
barcode: valueMap.has('barcode') ? valueMap.get('barcode') : ""
};
return result;
}
}
const MusicKeyValueMap:Map<string, string> = new Map(
[['表演者:', 'actor'],
['流派:', 'genre'],
['发行时间:', 'datePublished'],
['专辑类型:', 'albumType'],
['介质:', 'medium'],
['出版者:', 'publisher'],
['唱片数:', 'numberOfRecords'],
['条形码:', 'barcode']]
const MusicKeyValueMap: Map<string, string> = new Map(
[['表演者:', 'actor'],
['流派:', 'genre'],
['发行时间:', 'datePublished'],
['专辑类型:', 'albumType'],
['介质:', 'medium'],
['出版者:', 'publisher'],
['唱片数:', 'numberOfRecords'],
['条形码:', 'barcode']]
);

@ -1,49 +1,46 @@
import { CheerioAPI } from 'cheerio';
import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanNoteSubject from '../model/DoubanNoteSubject';
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from '../model/DoubanSubject';
import html2markdown from '@notable/html2markdown';
export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.noteTemplate;
}
parseText(beforeContent:string, extract: DoubanNoteSubject, settings:DoubanPluginSettings): string {
parseText(beforeContent: string, extract: DoubanNoteSubject, settings: DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "")
.replaceAll("{{content}}", extract.content ? extract.content : "")
.replaceAll("{{author}}", extract.author ? extract.author : "")
;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("日记") || extract.type.contains("Note") || extract.type.contains("Article"));
}
.replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "")
.replaceAll("{{content}}", extract.content ? extract.content : "")
.replaceAll("{{author}}", extract.author ? extract.author : "")
;
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("日记") || extract.type.contains("Note") || extract.type.contains("Article"));
}
parseSubjectFromHtml(html: CheerioAPI): DoubanNoteSubject {
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let type = html(html("head > meta[property= 'og:type']").get(0)).attr("content");
let authorA = html(html("a.note-author").get(0));
let timePublished = html(html(".pub-date").get(0)).text();
let content = html(html(".note").get(1));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseSubjectFromHtml(html: CheerioAPI): DoubanNoteSubject {
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content");
let desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content");
let url = html(html("head > meta[property= 'og:url']").get(0)).attr("content");
let image = html(html("head > meta[property= 'og:image']").get(0)).attr("content");
let type = html(html("head > meta[property= 'og:type']").get(0)).attr("content");
let authorA = html(html("a.note-author").get(0));
let timePublished = html(html(".pub-date").get(0)).text();
let content = html(html(".note").get(1));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url);
const result:DoubanNoteSubject = {
const result: DoubanNoteSubject = {
image: image,
datePublished: timePublished ? new Date(timePublished) : undefined,
content: content ? html2markdown(content.toString()) : "",
@ -58,8 +55,8 @@ export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<Dou
publisher: '',
genre: []
};
return result;
}
return result;
}
}

@ -1,9 +1,9 @@
import { CheerioAPI } from "cheerio";
import {CheerioAPI} from "cheerio";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject";
import { i18nHelper } from "src/lang/helper";
import { log } from "src/utils/Logutil";
import {i18nHelper} from "src/lang/helper";
import {log} from "src/utils/Logutil";
/**
*
@ -12,19 +12,19 @@ export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler<Do
getTemplate(settings: DoubanPluginSettings): string {
return "";
}
parseText(beforeContent:string, extract: DoubanSubject, settings:DoubanPluginSettings): string {
log.warn(i18nHelper.getMessage('140101'));
return "";
}
support(extract: DoubanSubject): boolean {
return false;
}
parseSubjectFromHtml(data: CheerioAPI): DoubanSubject {
return undefined;
}
parseText(beforeContent: string, extract: DoubanSubject, settings: DoubanPluginSettings): string {
log.warn(i18nHelper.getMessage('140101'));
return "";
}
support(extract: DoubanSubject): boolean {
return false;
}
parseSubjectFromHtml(data: CheerioAPI): DoubanSubject {
return undefined;
}
}

@ -1,4 +1,4 @@
import { App, Editor } from "obsidian";
import {App, Editor} from "obsidian";
import DoubanBookLoadHandler from "./DoubanBookLoadHandler";
import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler";
@ -6,65 +6,64 @@ import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler";
import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler";
import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler";
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject";
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import { DoubanTeleplayLoadHandler } from "./DoubanTeleplayLoadHandler";
import {DoubanTeleplayLoadHandler} from "./DoubanTeleplayLoadHandler";
import DoubanGameLoadHandler from "./DoubanGameLoadHandler";
export class DoubanSearchChooseItemHandler {
private _app:App;
private _doubanPlugin:DoubanPlugin;
private _doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[];
private _doubanSubjectHandlerDefault:DoubanSubjectLoadHandler<DoubanSubject>;
private _app: App;
private _doubanPlugin: DoubanPlugin;
private _doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[];
private _doubanSubjectHandlerDefault: DoubanSubjectLoadHandler<DoubanSubject>;
constructor(app:App, doubanPlugin:DoubanPlugin) {
this._app = app;
this._doubanPlugin = doubanPlugin;
this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin);
this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin),
new DoubanTeleplayLoadHandler(doubanPlugin),
new DoubanMusicLoadHandler(doubanPlugin),
new DoubanNoteLoadHandler(doubanPlugin),
constructor(app: App, doubanPlugin: DoubanPlugin) {
this._app = app;
this._doubanPlugin = doubanPlugin;
this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin);
this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin),
new DoubanTeleplayLoadHandler(doubanPlugin),
new DoubanMusicLoadHandler(doubanPlugin),
new DoubanNoteLoadHandler(doubanPlugin),
new DoubanGameLoadHandler(doubanPlugin),
this._doubanSubjectHandlerDefault];
}
}
public handle(searchExtract:DoubanSubject, editor: Editor):void{
if(!searchExtract) {
return;
}
let doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(searchExtract));
if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
doubanSubjectHandlers[0].handle(searchExtract.url, editor);
}else {
this._doubanSubjectHandlerDefault.handle(searchExtract.url, editor);
}
}
public handle(searchExtract: DoubanSubject, editor: Editor): void {
if (!searchExtract) {
return;
}
let doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(searchExtract));
if (doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
doubanSubjectHandlers[0].handle(searchExtract.url, editor);
} else {
this._doubanSubjectHandlerDefault.handle(searchExtract.url, editor);
}
}
public parseText(extract:DoubanSubject, settings:DoubanPluginSettings):string {
if(!settings) {
return "";
}
let doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(extract));
if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
let result = doubanSubjectHandlers.map(h => h.parse(extract, settings));
if(result && result.length > 0) {
return result[0];
}else {
return "";
}
}else {
return this._doubanSubjectHandlerDefault.parse(extract, settings);
}
public parseText(extract: DoubanSubject, settings: DoubanPluginSettings): string {
if (!settings) {
return "";
}
let doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(extract));
if (doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
let result = doubanSubjectHandlers.map(h => h.parse(extract, settings));
if (result && result.length > 0) {
return result[0];
} else {
return "";
}
} else {
return this._doubanSubjectHandlerDefault.parse(extract, settings);
}
}
}
}

@ -1,14 +1,14 @@
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject";
import { Editor } from "obsidian";
import {Editor} from "obsidian";
export default interface DoubanSubjectLoadHandler<T extends DoubanSubject> {
parse(extract: T, settings:DoubanPluginSettings): string;
support(extract:DoubanSubject):boolean;
parse(extract: T, settings: DoubanPluginSettings): string;
handle(url:string, editor: Editor):void;
support(extract: DoubanSubject): boolean;
handle(url: string, editor: Editor): void;
}

@ -1,7 +1,7 @@
import { CheerioAPI } from "cheerio";
import {CheerioAPI} from "cheerio";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban";
import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject";
import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject";
import SchemaOrg from "src/utils/SchemaOrg";
@ -9,18 +9,17 @@ import SchemaOrg from "src/utils/SchemaOrg";
/**
* teleplay
*/
export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler<DoubanTeleplaySubject>{
export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler<DoubanTeleplaySubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.movieTemplate;
}
constructor(doubanPlugin:DoubanPlugin) {
super(doubanPlugin);
}
parseText(beforeContent:string, extract: DoubanTeleplaySubject, settings:DoubanPluginSettings): string {
parseText(beforeContent: string, extract: DoubanTeleplaySubject, settings: DoubanPluginSettings): string {
return beforeContent
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "")
.replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
@ -28,47 +27,47 @@ export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler<DoubanT
.replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "")
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("电视剧") || extract.type.contains("Teleplay") || extract.type.contains("teleplay"));
}
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("电视剧") || extract.type.contains("Teleplay") || extract.type.contains("teleplay"));
}
parseSubjectFromHtml(data: CheerioAPI): DoubanTeleplaySubject {
return data('script')
.get()
.filter(scd => "application/ld+json" == data(scd).attr("type"))
.map(i => {
let item = data(i).text();
item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(obj.url);
let name = obj.name;
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec?titleExec[0]:name;
parseSubjectFromHtml(data: CheerioAPI): DoubanTeleplaySubject {
return data('script')
.get()
.filter(scd => "application/ld+json" == data(scd).attr("type"))
.map(i => {
let item = data(i).text();
item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(obj.url);
let name = obj.name;
let titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
let title = titleExec ? titleExec[0] : name;
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
let originalTitle = originalTitleExec?originalTitleExec[0]:name;
let originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
let originalTitle = originalTitleExec ? originalTitleExec[0] : name;
const result:DoubanTeleplaySubject = {
id: id ? id[0] : '',
type: 'Teleplay',
title: title,
originalTitle: originalTitle,
desc: obj.description,
url: "https://movie.douban.com" + obj.url,
director: obj.director,
author: obj.author,
actor: obj.actor,
aggregateRating: obj.aggregateRating,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined,
image: obj.image,
genre: obj.genre,
score: obj.aggregateRating ? obj.aggregateRating.ratingValue : undefined,
publisher: ""
}
return result;
})[0];
}
const result: DoubanTeleplaySubject = {
id: id ? id[0] : '',
type: 'Teleplay',
title: title,
originalTitle: originalTitle,
desc: obj.description,
url: "https://movie.douban.com" + obj.url,
director: obj.director,
author: obj.author,
actor: obj.actor,
aggregateRating: obj.aggregateRating,
datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined,
image: obj.image,
genre: obj.genre,
score: obj.aggregateRating ? obj.aggregateRating.ratingValue : undefined,
publisher: ""
}
return result;
})[0];
}
}

@ -1,19 +1,16 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import DoubanSubject from "./DoubanSubject";
import PropertyExplainSubject from "@App/data/model/PropertyExplainSubject";
export default class DoubanBookSubject extends DoubanSubject {
author:string[];
translator:string[];
isbn:string;
originalTitle:string;
subTitle:string;
totalPage:number
series:string;
menu:string[];
price:number;
binding:string;
export default class DoubanBookSubject extends DoubanSubject {
author: string[];
translator: string[];
isbn: string;
originalTitle: string;
subTitle: string;
totalPage: number
series: string;
menu: string[];
price: number;
binding: string;
}
export const DoubanBookParameter = {

@ -1,9 +1,8 @@
import {AggregateRating, Person} from 'schema-dts';
import DoubanSubject from './DoubanSubject';
export default class DoubanGameSubject extends DoubanSubject {
aliases:string[];
developer:string;
platform:string[];
export default class DoubanGameSubject extends DoubanSubject {
aliases: string[];
developer: string;
platform: string[];
}

@ -1,13 +1,13 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import {AggregateRating, Person} from 'schema-dts';
import DoubanSubject from "./DoubanSubject";
export default class DoubanMovieSubject extends DoubanSubject {
director:Person[];
author:Person[];
actor:Person[];
aggregateRating:AggregateRating;
genre:string[];
originalTitle:string;
export default class DoubanMovieSubject extends DoubanSubject {
director: Person[];
author: Person[];
actor: Person[];
aggregateRating: AggregateRating;
genre: string[];
originalTitle: string;
}

@ -1,11 +1,9 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import DoubanSubject from "./DoubanSubject";
export default class DoubanMusicSubject extends DoubanSubject {
actor:string[];
albumType:string;
medium:string;
numberOfRecords:number;
barcode:string;
export default class DoubanMusicSubject extends DoubanSubject {
actor: string[];
albumType: string;
medium: string;
numberOfRecords: number;
barcode: string;
}

@ -1,9 +1,7 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import DoubanSubject from "./DoubanSubject";
export default class DoubanNoteSubject extends DoubanSubject {
author:string;
authorUrl:string;
content:string;
export default class DoubanNoteSubject extends DoubanSubject {
author: string;
authorUrl: string;
content: string;
}

@ -1,5 +1,5 @@
import DoubanSubject from "./DoubanSubject";
export default class DoubanSearchResultSubject extends DoubanSubject {
cast:string;
cast: string;
}

@ -2,16 +2,16 @@ export default class DoubanSubject {
id: string;
title: string;
type: string;
score:number;
image:string;
score: number;
image: string;
url: string;
desc: string;
publisher:string;
datePublished:Date;
genre:string[];
publisher: string;
datePublished: Date;
genre: string[];
}
const ParameterMap:Map<string, string> = new Map([
const ParameterMap: Map<string, string> = new Map([
['id', ''],
]);

@ -1,14 +1,14 @@
import {AggregateRating, Person, WithContext} from 'schema-dts';
import {AggregateRating, Person} from 'schema-dts';
import DoubanSubject from "./DoubanSubject";
export default class DoubanTeleplaySubject extends DoubanSubject {
director:Person[];
author:Person[];
actor:Person[];
aggregateRating:AggregateRating;
datePublished:Date;
image:string;
genre:string[];
originalTitle:string;
export default class DoubanTeleplaySubject extends DoubanSubject {
director: Person[];
author: Person[];
actor: Person[];
aggregateRating: AggregateRating;
datePublished: Date;
image: string;
genre: string[];
originalTitle: string;
}

@ -1,9 +1,9 @@
export default class PropertyExplainSubject {
name:string;
desc:string;
example:string;
name: string;
desc: string;
example: string;
constructor(name:string, desc:string, example:string) {
constructor(name: string, desc: string, example: string) {
this.name = name;
this.desc = desc;
this.example = example;

@ -1,8 +1,8 @@
import { Editor, FuzzySuggestModal } from "obsidian";
import {Editor, FuzzySuggestModal} from "obsidian";
import DoubanPlugin from "main";
import DoubanPlugin from "main";
import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject";
import { log } from "src/utils/Logutil";
import {log} from "src/utils/Logutil";
import {i18nHelper} from "../../../lang/helper";
export {DoubanFuzzySuggester}
@ -10,45 +10,44 @@ export {DoubanFuzzySuggester}
class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject> {
public editor: Editor;
private plugin: DoubanPlugin;
private doubanSearchResultExtract:DoubanSearchResultSubject[]
public editor: Editor;
private plugin: DoubanPlugin;
private doubanSearchResultExtract: DoubanSearchResultSubject[]
constructor(plugin: DoubanPlugin, editor: Editor) {
super(app);
this.editor = editor;
this.plugin = plugin;
this.setPlaceholder(i18nHelper.getMessage('150101'));
constructor(plugin: DoubanPlugin, editor: Editor) {
super(app);
this.editor = editor;
this.plugin = plugin;
this.setPlaceholder(i18nHelper.getMessage('150101'));
}
}
getItems(): DoubanSearchResultSubject[] {
return this.doubanSearchResultExtract;
}
getItems(): DoubanSearchResultSubject[] {
return this.doubanSearchResultExtract;
}
getItemText(item: DoubanSearchResultSubject): string {
let text: string = item.type + "/" + (item.score ? item.score : '-') + "/" + item.title + "/" + item.cast;
return text;
}
getItemText(item: DoubanSearchResultSubject): string {
let text:string = item.type + "/" + (item.score ? item.score : '-') + "/" + item.title + "/" + item.cast;
return text;
}
onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void {
onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void {
this.plugin.showStatus('140204', item.title);
this.plugin.doubanExtractHandler.handle(item, this.editor);
}
}
public showSearchList(doubanSearchResultExtractList:DoubanSearchResultSubject[]) {
this.doubanSearchResultExtract = doubanSearchResultExtractList;
this.start();
}
public showSearchList(doubanSearchResultExtractList: DoubanSearchResultSubject[]) {
this.doubanSearchResultExtract = doubanSearchResultExtractList;
this.start();
}
public start(): void {
try {
this.open();
} catch (e) {
log.error(e);
}
}
public start(): void {
try {
this.open();
} catch (e) {
log.error(e);
}
}
}

@ -1,64 +1,63 @@
import { App, Editor, Modal, TextComponent } from "obsidian";
import {App, Editor, Modal, TextComponent} from "obsidian";
import DoubanPlugin from "main";
import { i18nHelper } from "src/lang/helper";
import {i18nHelper} from "src/lang/helper";
export class DoubanSearchModal extends Modal {
searchTerm: string;
plugin: DoubanPlugin;
editor: Editor;
constructor(app: App, plugin: DoubanPlugin, editor: Editor) {
super(app);
this.plugin = plugin;
this.editor = editor;
super(app);
this.plugin = plugin;
this.editor = editor;
}
onOpen() {
let { contentEl } = this;
let {contentEl} = this;
contentEl.createEl("h3", { text: i18nHelper.getMessage('110003') });
const inputs = contentEl.createDiv("inputs");
const searchInput = new TextComponent(inputs).onChange((searchTerm) => {
this.searchTerm = searchTerm;
});
searchInput.inputEl.addClass("obsidian_douban_search_input");
contentEl.createEl("h3", {text: i18nHelper.getMessage('110003')});
searchInput.inputEl.focus();
searchInput.inputEl.addEventListener("keydown", (event) => {
if (event.key === "Enter") {
this.close();
}
});
const inputs = contentEl.createDiv("inputs");
const searchInput = new TextComponent(inputs).onChange((searchTerm) => {
this.searchTerm = searchTerm;
});
searchInput.inputEl.addClass("obsidian_douban_search_input");
searchInput.inputEl.focus();
searchInput.inputEl.addEventListener("keydown", (event) => {
if (event.key === "Enter") {
this.close();
}
});
const controls = contentEl.createDiv("controls");
const searchButton = controls.createEl("button", {
text: i18nHelper.getMessage('110004'),
cls: "mod-cta",
attr: {
autofocus: true,
},
});
searchButton.addClass("obsidian_douban_search_button");
const controls = contentEl.createDiv("controls");
const searchButton = controls.createEl("button", {
text: i18nHelper.getMessage('110004'),
cls: "mod-cta",
attr: {
autofocus: true,
},
});
searchButton.addClass("obsidian_douban_search_button");
searchButton.addEventListener("click", this.close.bind(this));
const cancelButton = controls.createEl("button", { text: i18nHelper.getMessage('110005') });
cancelButton.addEventListener("click", this.close.bind(this));
cancelButton.addClass("obsidian_douban_search_button");
searchButton.addEventListener("click", this.close.bind(this));
const cancelButton = controls.createEl("button", {text: i18nHelper.getMessage('110005')});
cancelButton.addEventListener("click", this.close.bind(this));
cancelButton.addClass("obsidian_douban_search_button");
}
async onClose() {
let { contentEl } = this;
contentEl.empty();
if (this.searchTerm) {
await this.plugin.search(this.searchTerm, this.editor);
}
let {contentEl} = this;
contentEl.empty();
if (this.searchTerm) {
await this.plugin.search(this.searchTerm, this.editor);
}
}
}
}

@ -1,25 +1,25 @@
import { DoubanPluginSettings, doubanHeaders } from 'src/douban/Douban';
import {DoubanPluginSettings} from 'src/douban/Douban';
import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import SearchParserHandler from './SearchParser';
import { log } from 'src/utils/Logutil';
import {log} from 'src/utils/Logutil';
import {request, RequestUrlParam} from "obsidian";
import {i18nHelper} from "../../../lang/helper";
import { load } from 'cheerio';
import {load} from 'cheerio';
export default class Searcher {
static search(searchItem:string, doubanSettings:DoubanPluginSettings):Promise<DoubanSearchResultSubject[]> {
let requestUrlParam:RequestUrlParam = {
url: doubanSettings.searchUrl + searchItem,
method: "GET",
headers: JSON.parse(doubanSettings.searchHeaders),
throw: true
};
return request(requestUrlParam)
.then(load)
.then(SearchParserHandler.parseSearch)
.catch(e => log.error(i18nHelper.getMessage('130101')))
;
static search(searchItem: string, doubanSettings: DoubanPluginSettings): Promise<DoubanSearchResultSubject[]> {
let requestUrlParam: RequestUrlParam = {
url: doubanSettings.searchUrl + searchItem,
method: "GET",
headers: JSON.parse(doubanSettings.searchHeaders),
throw: true
};
return request(requestUrlParam)
.then(load)
.then(SearchParserHandler.parseSearch)
.catch(e => log.error(i18nHelper.getMessage('130101')))
;
};
};
}

@ -1,23 +1,23 @@
import { CheerioAPI } from "cheerio";
import {CheerioAPI} from "cheerio";
import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject";
export default class SearchParserHandler {
static parseSearch(dataHtml:CheerioAPI):DoubanSearchResultSubject[] {
return dataHtml('.result')
.get()
.map((i:any) => {
const item = dataHtml(i);
let idPattern = /(\d){5,10}/g;
let urlPattern = /(https%3A%2F%2F)\S+(\d){5,10}/g;
let linkValue = item.find("div.content > div > h3 > a").attr("href");
let ececResult = idPattern.exec(linkValue);
let urlResult = urlPattern.exec(linkValue);
let cast = item.find(".subject-cast").text();
static parseSearch(dataHtml: CheerioAPI): DoubanSearchResultSubject[] {
return dataHtml('.result')
.get()
.map((i: any) => {
const item = dataHtml(i);
let idPattern = /(\d){5,10}/g;
let urlPattern = /(https%3A%2F%2F)\S+(\d){5,10}/g;
let linkValue = item.find("div.content > div > h3 > a").attr("href");
let ececResult = idPattern.exec(linkValue);
let urlResult = urlPattern.exec(linkValue);
let cast = item.find(".subject-cast").text();
let score = item.find(".rating_nums").text();
let title = item.find("div.content > div > h3 > a").text();
let type = item.find("div.content > div > h3 > span").text();
let desc = item.find("div.content > p").text();
const result:DoubanSearchResultSubject = {
const result: DoubanSearchResultSubject = {
id: ececResult ? ececResult[0] : '',
title: title ? title : '-',
score: score ? Number(score) : null,
@ -30,7 +30,7 @@ export default class SearchParserHandler {
datePublished: undefined,
genre: []
};
return result;
})
};
return result;
})
};
}

@ -1,23 +1,23 @@
import en from './locale/en';
import zhCN from './locale/zh-cn';
const localeMap: { [k: string]: Partial<typeof en> } = {
en,
zh: zhCN,
};
const lang = window.localStorage.getItem('language');
const locale = localeMap[lang || 'en'];
export default class I18nHelper {
public getMessage(str: keyof typeof en): string {
if (!locale) {
console.error('Error: obsidian douban locale not found', lang);
}
return (locale && locale[str]) || en[str];
}
}
export const i18nHelper:I18nHelper = new I18nHelper();
import en from './locale/en';
import zhCN from './locale/zh-cn';
const localeMap: { [k: string]: Partial<typeof en> } = {
en,
zh: zhCN,
};
const lang = window.localStorage.getItem('language');
const locale = localeMap[lang || 'en'];
export default class I18nHelper {
public getMessage(str: keyof typeof en): string {
if (!locale) {
console.error('Error: obsidian douban locale not found', lang);
}
return (locale && locale[str]) || en[str];
}
}
export const i18nHelper: I18nHelper = new I18nHelper();

@ -1,53 +1,53 @@
//简体中文
export default {
//main.ts
'110001': 'search douban by current file name',
'110002': 'search douban and import to current file',
'110003': `Enter Search Term:`,
'110004': `Search`,
'110005': `Cancel`,
'110006': `sync douban broadcast ot Obsidian`,
//main.ts
'110001': 'search douban by current file name',
'110002': 'search douban and import to current file',
'110003': `Enter Search Term:`,
'110004': `Search`,
'110005': `Cancel`,
'110006': `sync douban broadcast ot Obsidian`,
//DoubanSettingTab
'1201' : `Obsidian Douban`,
'120001': `Douban Search Url`,
'120002': `Douban search page request address. `,
'120003': `First go to:`,
'120004': `Don't enter anything in the search input box, just click Search,`,
'120005': `The redirected web page address is the search address,`,
'120006': `Just copy the web address to the current input box.`,
//DoubanSettingTab
'1201': `Obsidian Douban`,
'120001': `Douban Search Url`,
'120002': `Douban search page request address. `,
'120003': `First go to:`,
'120004': `Don't enter anything in the search input box, just click Search,`,
'120005': `The redirected web page address is the search address,`,
'120006': `Just copy the web address to the current input box.`,
'120101': `Movie Content Template`,
'120102': `Set markdown Movie template for extract to be inserted.`,
'120103': `Available template variables are :`,
'120104': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120105': `{{url}}, {{desc}}, {{datePublished}}, {{genre}}, `,
'120106': `{{originalTitle}},{{director}}, {{author}},`,
'120107': ` {{actor}}`,
'120101': `Movie Content Template`,
'120102': `Set markdown Movie template for extract to be inserted.`,
'120103': `Available template variables are :`,
'120104': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120105': `{{url}}, {{desc}}, {{datePublished}}, {{genre}}, `,
'120106': `{{originalTitle}},{{director}}, {{author}},`,
'120107': ` {{actor}}`,
'120201': `Book Content Template`,
'120202': `Set markdown Book template for extract to be inserted.`,
'120203': `Available Book template variables are :`,
'120201': `Book Content Template`,
'120202': `Set markdown Book template for extract to be inserted.`,
'120203': `Available Book template variables are :`,
'120204': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120205': `{{url}}, {{desc}}, {{datePublished}}, {{publisher}}`,
'120206': `{{originalTitle}}, {{subTitle}}, {{author}},`,
'120207': `{{translator}}, {{isbn}}, {{price}}, {{totalPage}}`,
'120206': `{{originalTitle}}, {{subTitle}}, {{author}},`,
'120207': `{{translator}}, {{isbn}}, {{price}}, {{totalPage}}`,
'120208': `{{series}}, {{binding}}, {{menu}}`,
'120301': `Music Content Template`,
'120302': `Set markdown Music template for extract to be inserted.`,
'120303': `Available Music template variables are :`,
'120302': `Set markdown Music template for extract to be inserted.`,
'120303': `Available Music template variables are :`,
'120304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120305': `{{url}}, {{desc}}, {{datePublished}}, {{genre}},`,
'120306': `{{actor}}, {{medium}}, {{albumType}},`,
'120307': `{{barcode}}, {{numberOfRecords}}`,
'120306': `{{actor}}, {{medium}}, {{albumType}},`,
'120307': `{{barcode}}, {{numberOfRecords}}`,
'120401': `Article Content Template`,
'120402': `Set markdown Article template for extract to be inserted.`,
'120403': `Available Article template variables are :`,
'120401': `Article Content Template`,
'120402': `Set markdown Article template for extract to be inserted.`,
'120403': `Available Article template variables are :`,
'120404': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120405': `{{url}}, {{desc}}, {{datePublished}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`,
'120407': `{{timePublished}}`,
'121301': `Game Content Template`,
@ -56,36 +56,36 @@ export default {
'121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`,
'121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`,
'120501': `Date Format`,
'120502': `Time Format`,
'120503': `This format will be used when available template variables contain date.`,
'120504': `This format will be used when available template variables contain time.`,
'120506': `For more syntax, refer to`,
'120507': `Your current syntax looks like this`,
'120508': `format reference`,
'120601': `Array Spilt String`,
'120602': `string to join between array type, such as authors, actors.
'120501': `Date Format`,
'120502': `Time Format`,
'120503': `This format will be used when available template variables contain date.`,
'120504': `This format will be used when available template variables contain time.`,
'120506': `For more syntax, refer to`,
'120507': `Your current syntax looks like this`,
'120508': `format reference`,
'120601': `Array Spilt String`,
'120602': `string to join between array type, such as authors, actors.
example: ','
the list of actor's name will be shown as: 'actor1,actor2,actor3'`,
'120701': `Douban Request Headers`,
'120801': `This type of import is not supported temporarily, please go to github to submit issues for help`,
'120901': `Douban`,
'121201': `Person Name Language Mode`,
'121202': `options:`,
'121203': `Chinese Name mode, person name only show Chinese name`,
'121204': `English Name mode, person name only show English name`,
'121205': `Chinese English Name mode, show Chinese and English name both`,
'121206': `Chinese Name`,
'121207': `English Name`,
'121208': `Chinese And English Name`,
'120701': `Douban Request Headers`,
'120801': `This type of import is not supported temporarily, please go to github to submit issues for help`,
'120901': `Douban`,
'121201': `Person Name Language Mode`,
'121202': `options:`,
'121203': `Chinese Name mode, person name only show Chinese name`,
'121204': `English Name mode, person name only show English name`,
'121205': `Chinese English Name mode, show Chinese and English name both`,
'121206': `Chinese Name`,
'121207': `English Name`,
'121208': `Chinese And English Name`,
//error
'130101': `Fetch Data Error, You can go to Github add Issues`,
'130201': `Obsidian Douban Plugin Error: `,
'130301': `Obsidian Douban Plugin Warn: `,
//error
'130101': `Fetch Data Error, You can go to Github add Issues`,
'130201': `Obsidian Douban Plugin Error: `,
'130301': `Obsidian Douban Plugin Warn: `,
'140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`,
'140201': `[Obsidian Douban]: searching '{0}'...`,

@ -1,36 +1,34 @@
//简体中文
import DoubanBookSubject from "@App/data/model/DoubanBookSubject";
import {extract} from "jest-docblock";
export default {
//main.ts
'110001': '用当前文档名搜索豆瓣并写入当前文档',
'110002': '在豆瓣搜索并写入到当前文档',
'110003': `输入搜索内容:`,
'110004': `搜索`,
'110005': `取消`,
'110006': `同步豆瓣广播至Obsidian`,
//main.ts
'110001': '用当前文档名搜索豆瓣并写入当前文档',
'110002': '在豆瓣搜索并写入到当前文档',
'110003': `输入搜索内容:`,
'110004': `搜索`,
'110005': `取消`,
'110006': `同步豆瓣广播至Obsidian`,
//DoubanSettingTab
'1201' : `Obsidian-豆瓣`,
'120001': `豆瓣搜索地址`,
'120002': `豆瓣搜索页面请求地址, 通常是网页搜索的地址. `,
'120003': `先访问:`,
'120004': `然后在搜索输入框不输入任何内容,直接点击搜索,`,
'120005': `所跳转的网页地址即是搜索地址,`,
'120006': `将网页地址复制到当前输入框即可,`,
//DoubanSettingTab
'1201': `Obsidian-豆瓣`,
'120001': `豆瓣搜索地址`,
'120002': `豆瓣搜索页面请求地址, 通常是网页搜索的地址. `,
'120003': `先访问:`,
'120004': `然后在搜索输入框不输入任何内容,直接点击搜索,`,
'120005': `所跳转的网页地址即是搜索地址,`,
'120006': `将网页地址复制到当前输入框即可,`,
'120101': `电影文本模板`,
'120102': `设置选择电影后导入的文本内容模板,`,
'120103': `支持以下参数名称 :`,
'120101': `电影文本模板`,
'120102': `设置选择电影后导入的文本内容模板,`,
'120103': `支持以下参数名称 :`,
'120104': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120105': `{{url}}, {{desc}}, {{datePublished}}, {{genre}}, `,
'120106': `{{originalTitle}},{{director}}, {{author}},`,
'120107': ` {{actor}}`,
'120201': `书籍文本模板`,
'120202': `设置选择书籍后导入的文本内容模板,`,
'120203': `支持以下参数名称 :`,
'120201': `书籍文本模板`,
'120202': `设置选择书籍后导入的文本内容模板,`,
'120203': `支持以下参数名称 :`,
'120204': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120205': `{{url}}, {{desc}}, {{datePublished}}, {{publisher}}`,
'120206': `{{originalTitle}}, {{subTitle}}, {{author}},`,
@ -39,16 +37,16 @@ export default {
'120301': `音乐文本模板`,
'120302': `设置选择音乐后导入的文本内容模板,`,
'120303': `支持以下参数名称 :`,
'120302': `设置选择音乐后导入的文本内容模板,`,
'120303': `支持以下参数名称 :`,
'120304': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120305': `{{url}}, {{desc}}, {{datePublished}}`,
'120306': `{{genre}}, {{actor}}, {{medium}}, {{albumType}},`,
'120307': `{{barcode}}, {{numberOfRecords}}`,
'120401': `日记文本模板`,
'120402': `设置选择日记后导入的文本内容模板,`,
'120403': `支持以下参数名称 :`,
'120401': `日记文本模板`,
'120402': `设置选择日记后导入的文本内容模板,`,
'120403': `支持以下参数名称 :`,
'120404': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120405': `{{url}}, {{desc}}, {{datePublished}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`,
@ -62,38 +60,38 @@ export default {
'121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`,
'120501': `日期格式`,
'120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`,
'120502': `时间格式`,
'120504': `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`,
'120506': `详细介绍请参考`,
'120507': `时间参数时间格式预览`,
'120508': `格式参考`,
'120601': `数组分割字符串`,
'120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如演员列表等.
'120501': `日期格式`,
'120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`,
'120502': `时间格式`,
'120504': `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`,
'120506': `详细介绍请参考`,
'120507': `时间参数时间格式预览`,
'120508': `格式参考`,
'120601': `数组分割字符串`,
'120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如演员列表等.
: ','
: '演员1,演员2,演员3'`,
'120701': `豆瓣HTTP请求头`,
'120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n
'120701': `豆瓣HTTP请求头`,
'120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n
:\n
1. 访http://www.douban.com
2. , `,
'120801': `暂时不支持该类型导入,请至Github提交issuess获取帮助`,
'120901': `豆瓣网`,
'120801': `暂时不支持该类型导入,请至Github提交issuess获取帮助`,
'120901': `豆瓣网`,
'121201': `人名显示模式`,
'121202': `可选项:`,
'121203': `中文名称模式, 人名只显示中文名`,
'121204': `英文名称模式, 人名只显示英文名`,
'121205': `中文和英文名称模式, 人名同时显示中文和英文名`,
'121206': `中文名`,
'121207': `英文名`,
'121208': `中文名和英文名`,
'121201': `人名显示模式`,
'121202': `可选项:`,
'121203': `中文名称模式, 人名只显示中文名`,
'121204': `英文名称模式, 人名只显示英文名`,
'121205': `中文和英文名称模式, 人名同时显示中文和英文名`,
'121206': `中文名`,
'121207': `英文名`,
'121208': `中文名和英文名`,
'130101': `获取数据失败,您如有需要请至Github提交Issues`,
'130102': `Obsidian Douban插件错误提示:`,
'130103': `Obsidian Douban插件异常提示:`,
'140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`,
'130101': `获取数据失败,您如有需要请至Github提交Issues`,
'130102': `Obsidian Douban插件错误提示:`,
'130103': `Obsidian Douban插件异常提示:`,
'140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`,
'140201': `[Obsidian Douban]: 开始搜索'{0}'...`,
'140202': `[Obsidian Douban]: 搜索条数{0}条`,
@ -109,23 +107,26 @@ export default {
'200101': ``,
//book example
'book': {
id: {desc: `豆瓣ID`, example: `25982198`},
title: {desc: `书名`, example: `社会心理学第11版精装彩印`},
type: {desc: `类型`, example: `Book`},
score: {desc: `评分`, example: `9.4`},
image: {desc: `图片URL`, example: `https://img1.doubanio.com/view/subject/l/public/s28261247.jpg`},
url: {desc: `豆瓣URL`, example: `https://book.douban.com/subject/25982198/`},
desc: {desc: `简述`, example: `戴维·迈尔斯的《社会心理学》是美国700 多所大专院校社会心理学教学所采用的教材自出版以来深受广大师生和社会心理学爱好者的喜爱并被翻译成多种语言有着广泛的影响力。本书译自第11 版。全书共分四...`},
publisher: {desc: `出版社`, example: `人民邮电出版社`},
datePublished: {desc: `出版时间`, example: `2014-10-1`},
genre: {desc: `类型`, example: `社会科学`},
author: {desc: `作者`, example: `戴维·迈尔斯`},
translator: {desc: `译者`, example: `侯玉波 / 乐国安 / 张志勇`},
isbn: {desc: `ISBN`, example: `9787115369840`},
originTitle: {desc: `原作名`, example: `Social Psychology (11th)`},
subTitle: {desc: `副标题`, example: `社会心理学`},
binding: {desc: `装帧`, example: `精装`},
totalPages: {desc: `页数`, example: `707`},
}
'book': {
id: {desc: `豆瓣ID`, example: `25982198`},
title: {desc: `书名`, example: `社会心理学第11版精装彩印`},
type: {desc: `类型`, example: `Book`},
score: {desc: `评分`, example: `9.4`},
image: {desc: `图片URL`, example: `https://img1.doubanio.com/view/subject/l/public/s28261247.jpg`},
url: {desc: `豆瓣URL`, example: `https://book.douban.com/subject/25982198/`},
desc: {
desc: `简述`,
example: `戴维·迈尔斯的《社会心理学》是美国700 多所大专院校社会心理学教学所采用的教材自出版以来深受广大师生和社会心理学爱好者的喜爱并被翻译成多种语言有着广泛的影响力。本书译自第11 版。全书共分四...`
},
publisher: {desc: `出版社`, example: `人民邮电出版社`},
datePublished: {desc: `出版时间`, example: `2014-10-1`},
genre: {desc: `类型`, example: `社会科学`},
author: {desc: `作者`, example: `戴维·迈尔斯`},
translator: {desc: `译者`, example: `侯玉波 / 乐国安 / 张志勇`},
isbn: {desc: `ISBN`, example: `9787115369840`},
originTitle: {desc: `原作名`, example: `Social Psychology (11th)`},
subTitle: {desc: `副标题`, example: `社会心理学`},
binding: {desc: `装帧`, example: `精装`},
totalPages: {desc: `页数`, example: `707`},
}
}

@ -1,35 +1,34 @@
import { Notice } from "obsidian";
import SchemaOrg from "./SchemaOrg";
import { i18nHelper } from "src/lang/helper";
import {Notice} from "obsidian";
import {i18nHelper} from "src/lang/helper";
class Logger {
public error(e:any):any {
new Notice(i18nHelper.getMessage('130201') + e);
return e;
}
public error(e: any): any {
new Notice(i18nHelper.getMessage('130201') + e);
return e;
}
public warn(e:any):any {
new Notice(i18nHelper.getMessage('130301') + e);
return e;
}
public warn(e: any): any {
new Notice(i18nHelper.getMessage('130301') + e);
return e;
}
public info(e:any):any {
console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
public info(e: any): any {
console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
public trace(e:any):any {
// return e;
console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
public trace(e: any): any {
// return e;
console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
public traceN(notion:string, e:any):any {
// return e;
console.log(`${notion} ${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
public traceN(notion: string, e: any): any {
// return e;
console.log(`${notion} ${typeof e == 'string' ? e : JSON.stringify(e)}`);
return e;
}
}
export const log:Logger = new Logger();
export const log: Logger = new Logger();

@ -1,25 +1,25 @@
import { Person } from "schema-dts";
export default class SchemaOrg {
public static getPersonName(p:Person):string {
if(isString(p)) {
return p;
}else {
let name: any = getProperty(p, 'name');
return name + "";
}
}
}
function isString(s:any): s is string {
return typeof s === 'string';
}
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name];
}
import {Person} from "schema-dts";
export default class SchemaOrg {
public static getPersonName(p: Person): string {
if (isString(p)) {
return p;
} else {
let name: any = getProperty(p, 'name');
return name + "";
}
}
}
function isString(s: any): s is string {
return typeof s === 'string';
}
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name];
}

@ -1,15 +1,12 @@
import {i18nHelper} from "../lang/helper";
export default class YamlUtil {
public static hasSpecialChar(str:string):boolean {
public static hasSpecialChar(str: string): boolean {
return SPECIAL_CHAR_REG.test(str);
}
public static handleSpecialChar(text: string):string {
public static handleSpecialChar(text: string): string {
// return this.hasSpecialChar(text) ? text.replace(SPECIAL_CHAR_REG, (match, p1) => {
// return SPECIAL_CHAR_REG_REPLACE.get(p1) || p1;
// }) : text;
@ -26,7 +23,7 @@ export default class YamlUtil {
}
const SPECIAL_CHAR_REG = /[{}\[\]&*#?|\-<>=!%@:`,\n]/;
const SPECIAL_CHAR_REG_REPLACE:Map<string, string> = new Map([
const SPECIAL_CHAR_REG_REPLACE: Map<string, string> = new Map([
['{', '\\{'],
]);