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 # 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/) Import Movies, Books, Music, Teleplay, Note, Game even Broadcast Data from Douban in [Obsidian](https://obsidian.md/)
在[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插件中心重新加载当前插件 进入Obsidian插件中心重新加载当前插件
7. Enjoy your develop 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.CH_NAME]: i18nHelper.getMessage('121206'),
[PersonNameMode.EN_NAME]: i18nHelper.getMessage('121207'), [PersonNameMode.EN_NAME]: i18nHelper.getMessage('121207'),
[PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'), [PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'),

@ -1,31 +1,29 @@
import {PersonNameMode} from "../constant/Constsant"; import {PersonNameMode} from "../constant/Constsant";
export interface DoubanPluginSettings { export interface DoubanPluginSettings {
movieTemplate:string, movieTemplate: string,
bookTemplate:string, bookTemplate: string,
musicTemplate:string, musicTemplate: string,
noteTemplate:string, noteTemplate: string,
gameTemplate:string, gameTemplate: string,
dateFormat:string, dateFormat: string,
timeFormat:string, timeFormat: string,
searchUrl:string, searchUrl: string,
arraySpilt:string, arraySpilt: string,
searchHeaders?:string, searchHeaders?: string,
personNameMode:PersonNameMode, personNameMode: PersonNameMode,
} }
export const doubanHeaders = { 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": "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", "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", "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 = { export const DEFAULT_SETTINGS: DoubanPluginSettings = {
movieTemplate: movieTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
@ -43,8 +41,8 @@ desc: {{desc}}
![image]({{image}}) ![image]({{image}})
`, `,
bookTemplate: bookTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
subTitle: {{subTitle}} subTitle: {{subTitle}}
@ -69,8 +67,8 @@ desc: {{desc}}
{{menu}} {{menu}}
`, `,
musicTemplate: musicTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
@ -90,8 +88,8 @@ desc: {{desc}}
![image|150]({{image}}) ![image|150]({{image}})
`, `,
noteTemplate: noteTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
@ -106,7 +104,7 @@ desc: {{desc}}
{{content}} {{content}}
`, `,
gameTemplate: gameTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
aliases: {{aliases}} aliases: {{aliases}}
@ -126,12 +124,12 @@ desc: {{desc}}
`, `,
// totalWord: {{totalWord}} // totalWord: {{totalWord}}
searchUrl: 'https://www.douban.com/search?q=', searchUrl: 'https://www.douban.com/search?q=',
searchHeaders: JSON.stringify(doubanHeaders), searchHeaders: JSON.stringify(doubanHeaders),
dateFormat: "yyyy-MM-DD", dateFormat: "yyyy-MM-DD",
timeFormat: "HH:mm:ss", timeFormat: "HH:mm:ss",
arraySpilt: ", ", arraySpilt: ", ",
personNameMode: PersonNameMode.CH_NAME personNameMode: PersonNameMode.CH_NAME
} }

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

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

@ -1,15 +1,16 @@
import { CheerioAPI } from "cheerio"; import {CheerioAPI} from "cheerio";
import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler"; import {DoubanBroadcastAbstractHandler} from "./DoubanBroadcastAbstractHandler";
import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject"; import DoubanBroadcastMovieSubject from "../model/DoubanBroadcastMoveSubject";
//TODO will support in future version //TODO will support in future version
export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler<DoubanBroadcastMovieSubject>{ export class DoubanBroadcastMovieHandler extends DoubanBroadcastAbstractHandler<DoubanBroadcastMovieSubject> {
support(t: string): boolean { support(t: string): boolean {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
transform(data: Element, source:CheerioAPI): DoubanBroadcastMovieSubject {
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 {CheerioAPI} from "cheerio";
import { DoubanBroadcastAbstractHandler } from "./DoubanBroadcastAbstractHandler"; import {DoubanBroadcastAbstractHandler} from "./DoubanBroadcastAbstractHandler";
import { DoubanBroadcastMovieHandler } from "./DoubanBroadcastMovieHandler"; import {DoubanBroadcastMovieHandler} from "./DoubanBroadcastMovieHandler";
import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject"; import DoubanBroadcastSubject from "../model/DoubanBroadcastSubject";
import DoubanPageBroadcastSubject from "../model/DoubanPageBroadcastSubject"; import DoubanPageBroadcastSubject from "../model/DoubanPageBroadcastSubject";
//TODO will support in future version //TODO will support in future version
export class DoubanPageBroadcastTransformer { export class DoubanPageBroadcastTransformer {
private handlers:DoubanBroadcastAbstractHandler<DoubanBroadcastSubject>[]; private handlers: DoubanBroadcastAbstractHandler<DoubanBroadcastSubject>[];
constructor() { constructor() {
this.handlers = [ this.handlers = [
new DoubanBroadcastMovieHandler(), new DoubanBroadcastMovieHandler(),
] ]
} }
public transform(data: CheerioAPI):DoubanPageBroadcastSubject { public transform(data: CheerioAPI): DoubanPageBroadcastSubject {
let doubanBroadcastSubjects:DoubanBroadcastSubject[] = data('.new-status .status-wrapper') let doubanBroadcastSubjects: DoubanBroadcastSubject[] = data('.new-status .status-wrapper')
.get() .get()
.map(i => this.transformElement(i, data)); .map(i => this.transformElement(i, data));
return new DoubanPageBroadcastSubject (); return new DoubanPageBroadcastSubject();
} }
public transformElement(element:any, source:CheerioAPI):DoubanBroadcastSubject { public transformElement(element: any, source: CheerioAPI): DoubanBroadcastSubject {
let targetType:string = element.innerHTML; let targetType: string = element.innerHTML;
return this.handlers.filter(h => h.support(targetType))[0].transform(element, source); 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 DoubanAbstractLoadHandler from 'src/douban/data/handler/DoubanAbstractLoadHandler';
import DoubanNoteSubject from '../model/DoubanPageBroadcastSubject'; import DoubanNoteSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject'; import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from 'src/douban/data/model/DoubanSubject'; import DoubanSubject from 'src/douban/data/model/DoubanSubject';
//TODO will support in future version //TODO will support in future version
export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPageBroadcastSubject> { export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPageBroadcastSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string { getTemplate(settings: DoubanPluginSettings): string {
return settings.bookTemplate; return settings.bookTemplate;
} }
parseText(beforeContent:string, extract: DoubanNoteSubject, settings:DoubanPluginSettings): string { parseText(beforeContent: string, extract: DoubanNoteSubject, settings: DoubanPluginSettings): string {
return settings.bookTemplate ? null : ""; return settings.bookTemplate ? null : "";
// settings.noteTemplate // settings.noteTemplate
// .replaceAll("{{id}}", extract.id) // .replaceAll("{{id}}", extract.id)
// .replaceAll("{{type}}", extract.type ? extract.type : "") // .replaceAll("{{type}}", extract.type ? extract.type : "")
// .replaceAll("{{title}}", extract.title ? extract.title : "") // .replaceAll("{{title}}", extract.title ? extract.title : "")
// .replaceAll("{{desc}}", extract.desc ? extract.desc : "") // .replaceAll("{{desc}}", extract.desc ? extract.desc : "")
@ -26,54 +30,47 @@ export default class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHan
// .replaceAll("{{content}}", extract.content ? extract.content : "") // .replaceAll("{{content}}", extract.content ? extract.content : "")
// .replaceAll("{{url}}", extract.url ? extract.url : "") // .replaceAll("{{url}}", extract.url ? extract.url : "")
// .replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "") // .replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "")
// .replaceAll("{{author}}", extract.author ? extract.author : "") // .replaceAll("{{author}}", extract.author ? extract.author : "")
} }
support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("广播") || extract.type.contains("Broadcast"));
}
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);
// const result:DoubanNoteSubject = {
constructor(doubanPlugin:DoubanPlugin) { // image: image,
super(doubanPlugin); // timePublished: timePublished ? new Date(timePublished) : null,
} // content: content ? html2markdown(content.toString()): "",
// id: id ? id[0] : "",
parseSubjectFromHtml(html: CheerioAPI): DoubanPageBroadcastSubject { // type: "Article",
// return html('.new-status .status-wrapper') // title: title,
// .get() // desc: desc,
// .map(i -> { // url: url,
// let div = html(i); // author: authorA ? authorA.text() : null,
// div.find('') // authorUrl: authorA ? authorA.attr("href") : null,
// }); // };
// return result;
let title = html(html("head > meta[property= 'og:title']").get(0)).attr("content"); return null;
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;
}
} }

@ -1,4 +1,4 @@
import DoubanBroadcastSubject from "./DoubanBroadcastSubject"; 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; title: string;
desc: string; desc: string;
url: string; url: string;
author:string; author: string;
authorUrl:string; authorUrl: string;
timePublished:Date; timePublished: Date;
image:string; image: string;
content:string; content: string;
} }

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

@ -3,9 +3,9 @@ import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject'; import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject';
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import {Editor, moment, request, requestUrl, RequestUrlParam, sanitizeHTMLToDom} from "obsidian"; import {Editor, moment, request, RequestUrlParam} from "obsidian";
import { i18nHelper } from 'src/lang/helper'; import {i18nHelper} from 'src/lang/helper';
import { log } from "src/utils/Logutil"; import {log} from "src/utils/Logutil";
import {CheerioAPI, load} from "cheerio"; import {CheerioAPI, load} from "cheerio";
import YamlUtil from "../../../utils/YamlUtil"; import YamlUtil from "../../../utils/YamlUtil";
import {BasicConst, PersonNameMode, TemplateTextMode} from "../../../constant/Constsant"; import {BasicConst, PersonNameMode, TemplateTextMode} from "../../../constant/Constsant";
@ -13,20 +13,20 @@ import {BasicConst, PersonNameMode, TemplateTextMode} from "../../../constant/Co
export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> { export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
public doubanPlugin:DoubanPlugin; public doubanPlugin: DoubanPlugin;
constructor(doubanPlugin:DoubanPlugin) { constructor(doubanPlugin: DoubanPlugin) {
this.doubanPlugin = doubanPlugin; this.doubanPlugin = doubanPlugin;
} }
parse(extract: T, settings:DoubanPluginSettings): string { parse(extract: T, settings: DoubanPluginSettings): string {
let template:string = this.getTemplate(settings); let template: string = this.getTemplate(settings);
let frontMatterStart:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0); let frontMatterStart: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0);
let frontMatterEnd:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1); let frontMatterEnd: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1);
let frontMatter:string = ''; let frontMatter: string = '';
let frontMatterBefore:string = ''; let frontMatterBefore: string = '';
let frontMatterAfter:string = ''; let frontMatterAfter: string = '';
if(frontMatterStart > -1 && frontMatterEnd > -1) { if (frontMatterStart > -1 && frontMatterEnd > -1) {
frontMatterBefore = template.substring(0, frontMatterStart); frontMatterBefore = template.substring(0, frontMatterStart);
frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3); frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3);
frontMatterAfter = template.substring(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); frontMatter = this.parsePartText(frontMatter, extract, settings, TemplateTextMode.YAML);
} }
return frontMatterBefore + frontMatter + frontMatterAfter; return frontMatterBefore + frontMatter + frontMatterAfter;
}else { } else {
return this.parsePartText(template, extract, settings); 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 text
* @param textMode * @param textMode
*/ */
handleSpecialText(text: string, textMode: TemplateTextMode):string { handleSpecialText(text: string, textMode: TemplateTextMode): string {
let result = text; let result = text;
switch (textMode) { switch (textMode) {
case TemplateTextMode.YAML: case TemplateTextMode.YAML:
result = YamlUtil.handleText(text); result = YamlUtil.handleText(text);
@ -83,7 +66,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
* @param settings * @param settings
* @param textMode * @param textMode
*/ */
handleContentArray(array: any[], settings: DoubanPluginSettings, textMode: TemplateTextMode):string { handleContentArray(array: any[], settings: DoubanPluginSettings, textMode: TemplateTextMode): string {
let result = ''; let result = '';
switch (textMode) { switch (textMode) {
case TemplateTextMode.YAML: case TemplateTextMode.YAML:
@ -101,95 +84,110 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
* @param textMode * @param textMode
* @param settings * @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 = ''; let result = '';
if (value instanceof Array) { if (value instanceof Array) {
result = this.handleContentArray(value, settings, textMode); result = this.handleContentArray(value, settings, textMode);
}else if (value instanceof Number) { } else if (value instanceof Number) {
result = value ? value.toString() : ''; result = value ? value.toString() : '';
}else { } else {
result = this.handleSpecialText(value, textMode); result = this.handleSpecialText(value, textMode);
} }
return result; 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; abstract support(extract: DoubanSubject): boolean;
handle(url:string, editor:Editor):void { handle(url: string, editor: Editor): void {
let requestUrlParam:RequestUrlParam = { let requestUrlParam: RequestUrlParam = {
url: url, url: url,
method: "GET", method: "GET",
headers: JSON.parse(this.doubanPlugin.settings.searchHeaders), headers: JSON.parse(this.doubanPlugin.settings.searchHeaders),
throw: true throw: true
}; };
request(requestUrlParam) request(requestUrlParam)
.then(load) .then(load)
.then(this.parseSubjectFromHtml) .then(this.parseSubjectFromHtml)
.then(content => this.toEditor(editor, content)) .then(content => this.toEditor(editor, content))
// .then(content => content ? editor.replaceSelection(content) : content) // .then(content => content ? editor.replaceSelection(content) : content)
.catch(e => log.error(i18nHelper.getMessage('130101'))) .catch(e => log.error(i18nHelper.getMessage('130101')))
; ;
} }
abstract parseSubjectFromHtml(data:CheerioAPI):T | undefined; abstract parseSubjectFromHtml(data: CheerioAPI): T | undefined;
toEditor(editor:Editor, extract: T):T { toEditor(editor: Editor, extract: T): T {
this.doubanPlugin.putToEditor(editor, extract); this.doubanPlugin.putToEditor(editor, extract);
return extract; return extract;
} }
getPersonName(name:string, settings:DoubanPluginSettings):string { getPersonName(name: string, settings: DoubanPluginSettings): string {
if(!name || !settings || !settings.personNameMode) { if (!name || !settings || !settings.personNameMode) {
return ""; return "";
} }
let resultName:string = ""; let resultName: string = "";
let regValue:RegExpExecArray; let regValue: RegExpExecArray;
switch(settings.personNameMode) { switch (settings.personNameMode) {
case PersonNameMode.CH_NAME: case PersonNameMode.CH_NAME:
regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name); regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
resultName = regValue?regValue[0]:name; resultName = regValue ? regValue[0] : name;
break; break;
case PersonNameMode.EN_NAME: case PersonNameMode.EN_NAME:
regValue = /[a-zA-Z.\s\-]{2,50}/g.exec(name); regValue = /[a-zA-Z.\s\-]{2,50}/g.exec(name);
resultName = regValue?regValue[0]:name; resultName = regValue ? regValue[0] : name;
break; break;
default: default:
resultName = name; resultName = name;
} }
return resultName; return resultName;
} }
html_encode(str:string):string html_encode(str: string): string {
{ let s = "";
let s = ""; if (str.length == 0) return "";
if (str.length == 0) return ""; s = str.replace(/&/g, "&amp;");
s = str.replace(/&/g, "&amp;"); s = s.replace(/</g, "&lt;");
s = s.replace(/</g, "&lt;"); s = s.replace(/>/g, "&gt;");
s = s.replace(/>/g, "&gt;"); s = s.replace(/ /g, "&nbsp;");
s = s.replace(/ /g, "&nbsp;"); s = s.replace(/\'/g, "&#39;");
s = s.replace(/\'/g, "&#39;"); s = s.replace(/\"/g, "&quot;");
s = s.replace(/\"/g, "&quot;"); s = s.replace(/\n/g, "<br/>");
s = s.replace(/\n/g, "<br/>"); return s;
return s; }
}
html_decode(str:string):string html_decode(str: string): string {
{ let s = "";
let s = ""; if (str.length == 0) return "";
if (str.length == 0) return ""; s = str.replace(/&amp;/g, "&");
s = str.replace(/&amp;/g, "&"); s = s.replace(/&lt;/g, "<");
s = s.replace(/&lt;/g, "<"); s = s.replace(/&gt;/g, ">");
s = s.replace(/&gt;/g, ">"); s = s.replace(/&nbsp;/g, " ");
s = s.replace(/&nbsp;/g, " "); s = s.replace(/&#39;/g, "\'");
s = s.replace(/&#39;/g, "\'"); s = s.replace(/&quot;/g, "\"");
s = s.replace(/&quot;/g, "\""); s = s.replace(/<br\/>/g, "\n");
s = s.replace(/<br\/>/g, "\n"); return s;
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 DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject"; import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
@ -10,83 +8,80 @@ import {TemplateTextMode} from "../../../constant/Constsant";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> { export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
getTemplate(settings: DoubanPluginSettings): string { constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string {
return settings.bookTemplate; 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 return beforeContent
.replaceAll(DoubanBookParameter.author, .replaceAll(DoubanBookParameter.author,
super.handleSpecialContent( super.handleSpecialContent(
extract.author.map(this.handleSpecialAuthorName), textMode, settings)) extract.author.map(this.handleSpecialAuthorName), textMode, settings))
.replaceAll(DoubanBookParameter.translator, super.handleSpecialContent(extract.translator, textMode, settings)) .replaceAll(DoubanBookParameter.translator, super.handleSpecialContent(extract.translator, textMode, settings))
.replaceAll(DoubanBookParameter.isbn, extract.isbn) .replaceAll(DoubanBookParameter.isbn, extract.isbn)
.replaceAll(DoubanBookParameter.originalTitle, super.handleSpecialContent(extract.originalTitle, textMode)) .replaceAll(DoubanBookParameter.originalTitle, super.handleSpecialContent(extract.originalTitle, textMode))
.replaceAll(DoubanBookParameter.subTitle,super.handleSpecialContent(extract.subTitle, textMode)) .replaceAll(DoubanBookParameter.subTitle, super.handleSpecialContent(extract.subTitle, textMode))
.replaceAll(DoubanBookParameter.totalPage, super.handleSpecialContent(extract.totalPage, textMode)) .replaceAll(DoubanBookParameter.totalPage, super.handleSpecialContent(extract.totalPage, textMode))
.replaceAll(DoubanBookParameter.menu, extract.menu.join('\n')) .replaceAll(DoubanBookParameter.menu, extract.menu.join('\n'))
.replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode)) .replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode))
.replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode)) .replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode))
.replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode)); .replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode));
} }
support(extract: DoubanSubject): boolean { support(extract: DoubanSubject): boolean {
return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book")); 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, '') return authorName.replace(/\[/g, '')
.replace(']', '/'); .replace(']', '/');
} }
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");
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");
let item = html(html("head > script[type='application/ld+json']").get(0)).text(); let item = html(html("head > script[type='application/ld+json']").get(0)).text();
item = super.html_decode(item); item = super.html_decode(item);
let obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let title = obj.name; let title = obj.name;
let url = obj.url; 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 isbn = obj.isbn;
let score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text(); 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 detailDom = html(html("#info").get(0));
let publish = detailDom.find("span.pl"); let publish = detailDom.find("span.pl");
let valueMap = new Map<string, any>(); let valueMap = new Map<string, any>();
publish.map((index, info) => { publish.map((index, info) => {
let key = html(info).text().trim(); let key = html(info).text().trim();
let value; let value;
if(key.indexOf('译者') >= 0){ if (key.indexOf('译者') >= 0) {
value = []; value = [];
html(info.parent).find("a").map((index, a) => { html(info.parent).find("a").map((index, a) => {
value.push(html(a).text().trim()); value.push(html(a).text().trim());
}); });
} else if(key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0){ } else if (key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0) {
value = html(info.next.next).text().trim(); value = html(info.next.next).text().trim();
}else{ } else {
value = html(info.next).text().trim(); value = html(info.next).text().trim();
} }
valueMap.set(BookKeyValueMap.get(key), value); valueMap.set(BookKeyValueMap.get(key), value);
}) })
let idPattern = /(\d){5,10}/g; let idPattern = /(\d){5,10}/g;
let idE = idPattern.exec(url); let idE = idPattern.exec(url);
let id = idE ? idE[0]: ''; let id = idE ? idE[0] : '';
let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short'); 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; menu.length > 0 ? menu.pop() : menu;
const result:DoubanBookSubject = { const result: DoubanBookSubject = {
author: author, author: author,
translator: valueMap.has('translator') ? valueMap.get('translator') : [], translator: valueMap.has('translator') ? valueMap.get('translator') : [],
image: image, image: image,
@ -108,24 +103,24 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
genre: [], genre: [],
binding: valueMap.has('binding') ? valueMap.get('binding') : "", binding: valueMap.has('binding') ? valueMap.get('binding') : "",
}; };
return result; return result;
} }
} }
const BookKeyValueMap:Map<string, string> = new Map( const BookKeyValueMap: Map<string, string> = new Map(
[['作者', 'author'], [['作者', 'author'],
['出版社:', 'publisher'], ['出版社:', 'publisher'],
['原作名:', 'originalTitle'], ['原作名:', 'originalTitle'],
['出版年:', 'datePublished'], ['出版年:', 'datePublished'],
['页数:', 'totalPage'], ['页数:', 'totalPage'],
['定价:', 'price'], ['定价:', 'price'],
['装帧:', 'binding'], ['装帧:', 'binding'],
['丛书:', 'series'], ['丛书:', 'series'],
['ISBN:', 'isbn'], ['ISBN:', 'isbn'],
['译者', 'translator'], ['译者', 'translator'],
['副标题:', 'subTitle'], ['副标题:', 'subTitle'],
] ]
); );

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

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

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

@ -1,49 +1,46 @@
import { CheerioAPI } from 'cheerio'; import {CheerioAPI} from 'cheerio';
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanNoteSubject from '../model/DoubanNoteSubject'; import DoubanNoteSubject from '../model/DoubanNoteSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import html2markdown from '@notable/html2markdown'; import html2markdown from '@notable/html2markdown';
export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> { export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> {
constructor(doubanPlugin: DoubanPlugin) {
super(doubanPlugin);
}
getTemplate(settings: DoubanPluginSettings): string { getTemplate(settings: DoubanPluginSettings): string {
return settings.noteTemplate; return settings.noteTemplate;
} }
parseText(beforeContent:string, extract: DoubanNoteSubject, settings:DoubanPluginSettings): string { parseText(beforeContent: string, extract: DoubanNoteSubject, settings: DoubanPluginSettings): string {
return beforeContent return beforeContent
.replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "") .replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "")
.replaceAll("{{content}}", extract.content ? extract.content : "") .replaceAll("{{content}}", extract.content ? extract.content : "")
.replaceAll("{{author}}", extract.author ? extract.author : "") .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"));
}
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);
const result: DoubanNoteSubject = {
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 = {
image: image, image: image,
datePublished: timePublished ? new Date(timePublished) : undefined, datePublished: timePublished ? new Date(timePublished) : undefined,
content: content ? html2markdown(content.toString()) : "", content: content ? html2markdown(content.toString()) : "",
@ -58,8 +55,8 @@ export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<Dou
publisher: '', publisher: '',
genre: [] genre: []
}; };
return result; return result;
} }
} }

@ -1,9 +1,9 @@
import { CheerioAPI } from "cheerio"; import {CheerioAPI} from "cheerio";
import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import { DoubanPluginSettings } from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import { i18nHelper } from "src/lang/helper"; import {i18nHelper} from "src/lang/helper";
import { log } from "src/utils/Logutil"; import {log} from "src/utils/Logutil";
/** /**
* *
@ -12,19 +12,19 @@ export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler<Do
getTemplate(settings: DoubanPluginSettings): string { getTemplate(settings: DoubanPluginSettings): string {
return ""; 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 DoubanBookLoadHandler from "./DoubanBookLoadHandler";
import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler"; import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler";
@ -6,65 +6,64 @@ import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler";
import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler"; import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler";
import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import { DoubanPluginSettings } from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
import { DoubanTeleplayLoadHandler } from "./DoubanTeleplayLoadHandler"; import {DoubanTeleplayLoadHandler} from "./DoubanTeleplayLoadHandler";
import DoubanGameLoadHandler from "./DoubanGameLoadHandler"; import DoubanGameLoadHandler from "./DoubanGameLoadHandler";
export class DoubanSearchChooseItemHandler { export class DoubanSearchChooseItemHandler {
private _app:App; private _app: App;
private _doubanPlugin:DoubanPlugin; private _doubanPlugin: DoubanPlugin;
private _doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[]; private _doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[];
private _doubanSubjectHandlerDefault:DoubanSubjectLoadHandler<DoubanSubject>; private _doubanSubjectHandlerDefault: DoubanSubjectLoadHandler<DoubanSubject>;
constructor(app: App, doubanPlugin: DoubanPlugin) {
constructor(app:App, doubanPlugin:DoubanPlugin) { this._app = app;
this._app = app; this._doubanPlugin = doubanPlugin;
this._doubanPlugin = doubanPlugin; this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin);
this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin); this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin),
this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin), new DoubanTeleplayLoadHandler(doubanPlugin),
new DoubanTeleplayLoadHandler(doubanPlugin), new DoubanMusicLoadHandler(doubanPlugin),
new DoubanMusicLoadHandler(doubanPlugin), new DoubanNoteLoadHandler(doubanPlugin),
new DoubanNoteLoadHandler(doubanPlugin),
new DoubanGameLoadHandler(doubanPlugin), new DoubanGameLoadHandler(doubanPlugin),
this._doubanSubjectHandlerDefault]; this._doubanSubjectHandlerDefault];
} }
public handle(searchExtract:DoubanSubject, editor: Editor):void{ public handle(searchExtract: DoubanSubject, editor: Editor): void {
if(!searchExtract) { if (!searchExtract) {
return; return;
} }
let doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers let doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(searchExtract)); .filter(h => h.support(searchExtract));
if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) { if (doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
doubanSubjectHandlers[0].handle(searchExtract.url, editor); doubanSubjectHandlers[0].handle(searchExtract.url, editor);
}else { } else {
this._doubanSubjectHandlerDefault.handle(searchExtract.url, editor); this._doubanSubjectHandlerDefault.handle(searchExtract.url, editor);
} }
} }
public parseText(extract:DoubanSubject, settings:DoubanPluginSettings):string { public parseText(extract: DoubanSubject, settings: DoubanPluginSettings): string {
if(!settings) { if (!settings) {
return ""; return "";
} }
let doubanSubjectHandlers:DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers let doubanSubjectHandlers: DoubanSubjectLoadHandler<DoubanSubject>[] = this._doubanSubjectHandlers
.filter(h => h.support(extract)); .filter(h => h.support(extract));
if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) { if (doubanSubjectHandlers && doubanSubjectHandlers.length > 0) {
let result = doubanSubjectHandlers.map(h => h.parse(extract, settings)); let result = doubanSubjectHandlers.map(h => h.parse(extract, settings));
if(result && result.length > 0) { if (result && result.length > 0) {
return result[0]; return result[0];
}else { } else {
return ""; return "";
} }
}else { } else {
return this._doubanSubjectHandlerDefault.parse(extract, settings); 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 DoubanSubject from "../model/DoubanSubject";
import { Editor } from "obsidian"; import {Editor} from "obsidian";
export default interface DoubanSubjectLoadHandler<T extends DoubanSubject> { export default interface DoubanSubjectLoadHandler<T extends DoubanSubject> {
parse(extract: T, settings:DoubanPluginSettings): string; parse(extract: T, settings: DoubanPluginSettings): string;
support(extract:DoubanSubject):boolean; support(extract: DoubanSubject): boolean;
handle(url:string, editor: Editor):void; handle(url: string, editor: Editor): void;
} }

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

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

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

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

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

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

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

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

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

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

@ -1,7 +1,7 @@
import { App, Editor, Modal, TextComponent } from "obsidian"; import {App, Editor, Modal, TextComponent} from "obsidian";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import { i18nHelper } from "src/lang/helper"; import {i18nHelper} from "src/lang/helper";
export class DoubanSearchModal extends Modal { export class DoubanSearchModal extends Modal {
searchTerm: string; searchTerm: string;
@ -9,56 +9,55 @@ export class DoubanSearchModal extends Modal {
editor: Editor; editor: Editor;
constructor(app: App, plugin: DoubanPlugin, editor: Editor) { constructor(app: App, plugin: DoubanPlugin, editor: Editor) {
super(app); super(app);
this.plugin = plugin; this.plugin = plugin;
this.editor = editor; this.editor = editor;
} }
onOpen() { onOpen() {
let { contentEl } = this; let {contentEl} = this;
contentEl.createEl("h3", { text: i18nHelper.getMessage('110003') }); contentEl.createEl("h3", {text: i18nHelper.getMessage('110003')});
const inputs = contentEl.createDiv("inputs"); const inputs = contentEl.createDiv("inputs");
const searchInput = new TextComponent(inputs).onChange((searchTerm) => { const searchInput = new TextComponent(inputs).onChange((searchTerm) => {
this.searchTerm = searchTerm; this.searchTerm = searchTerm;
}); });
searchInput.inputEl.addClass("obsidian_douban_search_input"); searchInput.inputEl.addClass("obsidian_douban_search_input");
searchInput.inputEl.focus(); searchInput.inputEl.focus();
searchInput.inputEl.addEventListener("keydown", (event) => { searchInput.inputEl.addEventListener("keydown", (event) => {
if (event.key === "Enter") { if (event.key === "Enter") {
this.close(); 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"); searchButton.addEventListener("click", this.close.bind(this));
const searchButton = controls.createEl("button", { const cancelButton = controls.createEl("button", {text: i18nHelper.getMessage('110005')});
text: i18nHelper.getMessage('110004'), cancelButton.addEventListener("click", this.close.bind(this));
cls: "mod-cta", cancelButton.addClass("obsidian_douban_search_button");
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");
} }
async onClose() { async onClose() {
let { contentEl } = this; let {contentEl} = this;
contentEl.empty(); contentEl.empty();
if (this.searchTerm) { if (this.searchTerm) {
await this.plugin.search(this.searchTerm, this.editor); 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 DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import SearchParserHandler from './SearchParser'; import SearchParserHandler from './SearchParser';
import { log } from 'src/utils/Logutil'; import {log} from 'src/utils/Logutil';
import {request, RequestUrlParam} from "obsidian"; import {request, RequestUrlParam} from "obsidian";
import {i18nHelper} from "../../../lang/helper"; import {i18nHelper} from "../../../lang/helper";
import { load } from 'cheerio'; import {load} from 'cheerio';
export default class Searcher { export default class Searcher {
static search(searchItem:string, doubanSettings:DoubanPluginSettings):Promise<DoubanSearchResultSubject[]> { static search(searchItem: string, doubanSettings: DoubanPluginSettings): Promise<DoubanSearchResultSubject[]> {
let requestUrlParam:RequestUrlParam = { let requestUrlParam: RequestUrlParam = {
url: doubanSettings.searchUrl + searchItem, url: doubanSettings.searchUrl + searchItem,
method: "GET", method: "GET",
headers: JSON.parse(doubanSettings.searchHeaders), headers: JSON.parse(doubanSettings.searchHeaders),
throw: true throw: true
}; };
return request(requestUrlParam) return request(requestUrlParam)
.then(load) .then(load)
.then(SearchParserHandler.parseSearch) .then(SearchParserHandler.parseSearch)
.catch(e => log.error(i18nHelper.getMessage('130101'))) .catch(e => log.error(i18nHelper.getMessage('130101')))
; ;
}; };
} }

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

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

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

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

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

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