Optimize code, fix bugs and add status bar

This commit is contained in:
wanxp 2022-10-30 21:59:28 +08:00
parent 3525b1b402
commit 06be454d0e
23 changed files with 449 additions and 138 deletions

@ -49,5 +49,5 @@ esbuild.build({
sourcemap: prod ? false : 'inline', sourcemap: prod ? false : 'inline',
treeShaking: true, treeShaking: true,
outfile: 'main.js', outfile: 'main.js',
minify: true // minify: true
}).catch(() => process.exit(1)); }).catch(() => process.exit(1));

39
main.ts

@ -9,29 +9,48 @@ import DoubanSubject from "src/douban/data/model/DoubanSubject";
import Searcher from "src/douban/data/search/Search"; import Searcher from "src/douban/data/search/Search";
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 {BasicConst} from "./src/constant/Constsant";
export default class DoubanPlugin extends Plugin { export default class DoubanPlugin extends Plugin {
public settings: DoubanPluginSettings; public settings: DoubanPluginSettings;
public doubanEtractHandler: DoubanSearchChooseItemHandler; public doubanExtractHandler: DoubanSearchChooseItemHandler;
public doubanStatusBar: HTMLElement;
async putToEditor(editor:Editor, extract:DoubanSubject) { async putToEditor(editor:Editor, extract:DoubanSubject) {
if(!editor || !extract) { try {
if (!editor || !extract) {
log.warn(i18nHelper.getMessage('140101')); log.warn(i18nHelper.getMessage('140101'));
return; return;
} }
let content:string = this.doubanEtractHandler.parseText(extract, this.settings) this.showStatus('140204', extract.title);
if(content) { let content: string = this.doubanExtractHandler.parseText(extract, this.settings)
if (content) {
editor.replaceSelection(content); editor.replaceSelection(content);
} }
this.showStatus('140205', extract.title);
}catch (e) {
this.showStatus('140206', e.message);
}finally {
setTimeout(() => this.doubanStatusBar.empty(), BasicConst.CLEAN_STATUS_BAR_DELAY)
}
} }
async search(searchTerm:string, editor: Editor) { async search(searchTerm:string, editor: Editor) {
try {
this.showStatus('140201', searchTerm);
const resultList = await Searcher.search(searchTerm, this.settings); const resultList = await Searcher.search(searchTerm, this.settings);
this.showStatus('140202', resultList.length.toString());
new DoubanFuzzySuggester(this, editor).showSearchList(resultList); new DoubanFuzzySuggester(this, editor).showSearchList(resultList);
}catch (e) {
this.showStatus('140206', e.message);
}finally {
setTimeout(() => this.doubanStatusBar.empty(), BasicConst.CLEAN_STATUS_BAR_DELAY)
}
} }
async getDoubanTextForActiveFile(editor: Editor) { async getDoubanTextForActiveFile(editor: Editor) {
this.doubanStatusBar = this.addStatusBarItem();
const activeFile = await this.app.workspace.getActiveFile(); const activeFile = await this.app.workspace.getActiveFile();
if (activeFile) { if (activeFile) {
const searchTerm = activeFile.basename; const searchTerm = activeFile.basename;
@ -41,7 +60,7 @@ export default class DoubanPlugin extends Plugin {
} }
} }
async geDoubanTextForSearchTerm(editor: Editor) { async getDoubanTextForSearchTerm(editor: Editor) {
new DoubanSearchModal(this.app, this, editor).open(); new DoubanSearchModal(this.app, this, editor).open();
} }
@ -60,7 +79,7 @@ export default class DoubanPlugin extends Plugin {
id: "search-douban-and-input-current-file", id: "search-douban-and-input-current-file",
name: i18nHelper.getMessage("110002"), name: i18nHelper.getMessage("110002"),
editorCallback: (editor: Editor) => editorCallback: (editor: Editor) =>
this.geDoubanTextForSearchTerm(editor), this.getDoubanTextForSearchTerm(editor),
}); });
//TODO will support in future //TODO will support in future
// this.addCommand({ // this.addCommand({
@ -75,11 +94,17 @@ export default class DoubanPlugin extends Plugin {
async loadSettings() { async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
this.doubanEtractHandler = new DoubanSearchChooseItemHandler(this.app, this); this.doubanExtractHandler = new DoubanSearchChooseItemHandler(this.app, this);
} }
async saveSettings() { async saveSettings() {
await this.saveData(this.settings); await this.saveData(this.settings);
} }
showStatus(origin:string, message:string) {
this.doubanStatusBar.empty();
// @ts-ignore
this.doubanStatusBar.setText(i18nHelper.getMessage(origin).replace('{0}', message));
}
} }

36
src/constant/Constsant.ts Normal file

@ -0,0 +1,36 @@
import {i18nHelper} from "../lang/helper";
/**
*
*/
export const BasicConst = {
YAML_FRONT_MATTER_SYMBOL: '---',
CLEAN_STATUS_BAR_DELAY: 5000,
}
/**
*
*/
export enum TemplateTextMode {
NORMAL,
YAML,
}
/**
*
*/
export enum PersonNameMode {
CH_NAME = "CH",
EN_NAME = "EN",
CH_EN_NAME = "CH_EN",
}
/**
*
*/
export const PersonNameModeRecords: {[key in PersonNameMode]: string} = {
[PersonNameMode.CH_NAME]: i18nHelper.getMessage('121206'),
[PersonNameMode.EN_NAME]: i18nHelper.getMessage('121207'),
[PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'),
}

@ -1,5 +1,4 @@
import { i18nHelper } from "src/lang/helper"; import {PersonNameMode} from "../constant/Constsant";
import { type } from "os";
export interface DoubanPluginSettings { export interface DoubanPluginSettings {
movieTemplate:string, movieTemplate:string,
@ -15,14 +14,10 @@ export interface DoubanPluginSettings {
personNameMode:PersonNameMode, personNameMode:PersonNameMode,
} }
export enum PersonNameMode {
CH_NAME = "CH",
EN_NAME = "EN",
CH_EN_NAME = "CH_EN",
}
export const doubanHeadrs = {
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",
@ -30,9 +25,7 @@ export const doubanHeadrs = {
export const DEFAULT_SETTINGS:DoubanPluginSettings = { export const DEFAULT_SETTINGS:DoubanPluginSettings = {
movieTemplate: movieTemplate:
` `---
![image]({{image}})
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
@ -43,16 +36,20 @@ datePublished: {{datePublished}}
director: {{director}} director: {{director}}
actor: {{actor}} actor: {{actor}}
author: {{author}} author: {{author}}
tags: {{type}}
url: {{url}} url: {{url}}
desc: {{desc}} desc: {{desc}}
---
![image]({{image}})
`, `,
bookTemplate: bookTemplate:
`![image|150]({{image}}) `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
subTitle: {{subTitle}} subTitle: {{subTitle}}
originalTitle: {{originalTitle}} originalTitle: {{originalTitle}}
series: {{series}}
type: {{type}} type: {{type}}
author: {{author}} author: {{author}}
score: {{score}} score: {{score}}
@ -64,12 +61,16 @@ url: {{url}}
totalPage: {{totalPage}} totalPage: {{totalPage}}
price: {{price}} price: {{price}}
tags: Book tags: Book
binding: {{binding}}
desc: {{desc}} desc: {{desc}}
`, ---
musicTemplate:
`
![image|150]({{image}}) ![image|150]({{image}})
{{menu}}
`,
musicTemplate:
`---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
@ -85,13 +86,17 @@ url: {{url}}
numberOfRecords: {{numberOfRecords}} numberOfRecords: {{numberOfRecords}}
tags: Music tags: Music
desc: {{desc}} desc: {{desc}}
---
![image|150]({{image}})
`, `,
noteTemplate: noteTemplate:
`--- `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
type: {{type}} type: {{type}}
author: [{{author}}]({{authorUrl}}) author: {{author}}
authorUrl: {{authorUrl}}
dateTimePublished: {{datePublished}} {{timePublished}} dateTimePublished: {{datePublished}} {{timePublished}}
url: {{url}} url: {{url}}
tags: Article tags: Article
@ -101,26 +106,28 @@ desc: {{desc}}
{{content}} {{content}}
`, `,
gameTemplate: gameTemplate:
`![image]({{image}}) `---
doubanId: {{id}} doubanId: {{id}}
title: {{title}} title: {{title}}
aliases: {{aliases}} aliases: {{aliases}}
type: {{type}} type: {{type}}
score: {{score}} score: {{score}}
tags: Game
dateTimePublished: {{datePublished}} dateTimePublished: {{datePublished}}
publisher: {{publisher}} publisher: {{publisher}}
genre: {{genre}} genre: {{genre}}
developer: {{developer}} developer: {{developer}}
platform: {{platform}} platform: {{platform}}
url: {{url}} url: {{url}}
tags: Game
desc: {{desc}} desc: {{desc}}
---
![image]({{image}})
`, `,
// totalWord: {{totalWord}} // totalWord: {{totalWord}}
searchUrl: 'https://www.douban.com/search?q=', searchUrl: 'https://www.douban.com/search?q=',
searchHeaders: JSON.stringify(doubanHeadrs), searchHeaders: JSON.stringify(doubanHeaders),
dateFormat: "yyyy-MM-DD", dateFormat: "yyyy-MM-DD",
timeFormat: "HH:mm:ss", timeFormat: "HH:mm:ss",
arraySpilt: ", ", arraySpilt: ", ",
@ -128,10 +135,3 @@ desc: {{desc}}
} }
export const personNameModeRecords: {[key in PersonNameMode]: string} = {
[PersonNameMode.CH_NAME]: i18nHelper.getMessage('121206'),
[PersonNameMode.EN_NAME]: i18nHelper.getMessage('121207'),
[PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'),
}

@ -1,8 +1,9 @@
import { App, PluginSettingTab, Setting } from "obsidian"; import { App, PluginSettingTab, Setting } from "obsidian";
import { DEFAULT_SETTINGS, PersonNameMode, personNameModeRecords } 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";
export class DoubanSettingTab extends PluginSettingTab { export class DoubanSettingTab extends PluginSettingTab {
plugin: DoubanPlugin; plugin: DoubanPlugin;
@ -17,7 +18,7 @@ export class DoubanSettingTab extends PluginSettingTab {
containerEl.empty(); containerEl.empty();
containerEl.createEl("h2", { text: i18nHelper.getMessage('1201') }); containerEl.createEl("h2", { text: 'Obsidian Douban' });
new Setting(containerEl).setName(i18nHelper.getMessage('120001')) new Setting(containerEl).setName(i18nHelper.getMessage('120001'))
.then((setting) => { .then((setting) => {
@ -77,7 +78,7 @@ export class DoubanSettingTab extends PluginSettingTab {
}) })
); );
textarea.inputEl.addClass("obsidian_douban_settings_area"); textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 10); 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) => {
@ -87,6 +88,36 @@ export class DoubanSettingTab extends PluginSettingTab {
}); });
}); });
// new Setting(containerEl)
// .setName(i18nHelper.getMessage('120101') + 111)
// .then((setting) => {
// setting.addTextArea((textarea) => {
// setting.descEl.appendChild(
// createEl('table', 'table', (table) => {
// table.createEl('thead', 'thread', (thead) => {
// thead.createEl('tr', 'tr',(tr) => {
// tr.createEl('th', { text: i18nHelper.getMessage('120108') });
// tr.createEl('th', { text: i18nHelper.getMessage('120109') });
// tr.createEl('th', { text: i18nHelper.getMessage('120110') });
// });
// });
// table.createEl('tbody', 'tbody', (tbody) => {
// personNameModeRecords.forEach((record) => {
// tbody.createEl('tr', (tr) => {
// tr.createEl('td', { text: record.name });
// tr.createEl('td', { text: record.key });
// tr.createEl('td', { text: record.desc });
// });
// });
// });
// }
//
// );
// }));
new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => { new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => {
setting.addTextArea((textarea) => { setting.addTextArea((textarea) => {
setting.descEl.appendChild( setting.descEl.appendChild(
@ -103,10 +134,12 @@ export class DoubanSettingTab extends PluginSettingTab {
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.createEl('br');
}) })
); );
textarea.inputEl.addClass("obsidian_douban_settings_area"); textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 10); 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) => {
@ -135,7 +168,7 @@ export class DoubanSettingTab extends PluginSettingTab {
}) })
); );
textarea.inputEl.addClass("obsidian_douban_settings_area"); textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 10); 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) => {
@ -159,11 +192,13 @@ export class DoubanSettingTab extends PluginSettingTab {
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.createEl('br');
}) })
); );
textarea.inputEl.addClass("obsidian_douban_settings_area"); textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 10); 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) => {
@ -190,7 +225,7 @@ export class DoubanSettingTab extends PluginSettingTab {
}) })
); );
textarea.inputEl.addClass("obsidian_douban_settings_area"); textarea.inputEl.addClass("obsidian_douban_settings_area");
textarea.inputEl.setAttr("rows", 10); textarea.inputEl.setAttr("rows", 20);
textarea.setPlaceholder(DEFAULT_SETTINGS.gameTemplate) textarea.setPlaceholder(DEFAULT_SETTINGS.gameTemplate)
.setValue(this.plugin.settings.gameTemplate) .setValue(this.plugin.settings.gameTemplate)
.onChange(async (value) => { .onChange(async (value) => {
@ -216,9 +251,9 @@ export class DoubanSettingTab extends PluginSettingTab {
); );
// 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;

@ -1,12 +1,14 @@
import { DoubanPluginSettings, PersonNameMode } from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject 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, requestUrl, RequestUrlParam, sanitizeHTMLToDom} 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 {BasicConst, PersonNameMode, TemplateTextMode} from "../../../constant/Constsant";
export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> { export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
@ -19,26 +21,101 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
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 resultContent = template ? template let frontMatterStart:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0);
.replaceAll("{{id}}", extract.id) let frontMatterEnd:number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1);
.replaceAll("{{type}}", extract.type ? extract.type : "") let frontMatter:string = '';
.replaceAll("{{title}}", extract.title ? extract.title : "") let frontMatterBefore:string = '';
.replaceAll("{{desc}}", extract.desc ? extract.desc : "") let frontMatterAfter:string = '';
.replaceAll("{{image}}", extract.image ? extract.image : "") if(frontMatterStart > -1 && frontMatterEnd > -1) {
.replaceAll("{{url}}", extract.url ? extract.url : "") frontMatterBefore = template.substring(0, frontMatterStart);
.replaceAll("{{score}}", extract.score ? extract.score + "": "") frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3);
.replaceAll("{{publisher}}", extract.publisher ? extract.publisher : "") frontMatterAfter = template.substring(frontMatterEnd + 3);
.replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") if (frontMatterBefore.length > 0) {
.replaceAll("{{timePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.timeFormat) : "") frontMatterBefore = this.parsePartText(frontMatterBefore, extract, settings);
.replaceAll("{{genre}}", extract.genre ? extract.genre.join(settings.arraySpilt) : "") }
: "" if (frontMatterAfter.length > 0) {
frontMatterAfter = this.parsePartText(frontMatterAfter, extract, settings);
}
if (frontMatter.length > 0) {
frontMatter = this.parsePartText(frontMatter, extract, settings, TemplateTextMode.YAML);
}
return frontMatterBefore + frontMatter + frontMatterAfter;
}else {
return this.parsePartText(template, extract, settings);
}
}
private parsePartText(template: string, extract: T, settings: DoubanPluginSettings, textMode:TemplateTextMode = TemplateTextMode.NORMAL): string {
let resultContent = template
.replaceAll(DoubanParameter.ID, extract.id)
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(extract.title, textMode))
.replaceAll(DoubanParameter.TYPE, extract.type)
.replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score))
.replaceAll(DoubanParameter.IMAGE, extract.image)
.replaceAll(DoubanParameter.URL, extract.url)
.replaceAll(DoubanParameter.DESC, this.handleSpecialContent(extract.desc, textMode))
.replaceAll(DoubanParameter.PUBLISHER, extract.publisher)
.replaceAll(DoubanParameter.DATE_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : '')
.replaceAll(DoubanParameter.TIME_PUBLISHED, extract.datePublished ? moment(extract.datePublished).format(settings.timeFormat) : '')
.replaceAll(DoubanParameter.GENRE, this.handleSpecialContent(extract.genre, textMode, settings))
; ;
return this.parseText(resultContent, extract, settings); return this.parseText(resultContent, extract, settings, textMode);
}
/**
*
* @param text
* @param textMode
*/
handleSpecialText(text: string, textMode: TemplateTextMode):string {
let result = text;
switch (textMode) {
case TemplateTextMode.YAML:
result = YamlUtil.handleText(text);
break;
}
return result;
}
/**
*
* @param array
* @param settings
* @param textMode
*/
handleContentArray(array: any[], settings: DoubanPluginSettings, textMode: TemplateTextMode):string {
let result = '';
switch (textMode) {
case TemplateTextMode.YAML:
result = array.map(YamlUtil.handleText).join(', ');
break;
default:
result = array.join(settings.arraySpilt);
}
return result;
}
/**
*
* @param value
* @param textMode
* @param settings
*/
handleSpecialContent(value: any, textMode:TemplateTextMode = TemplateTextMode.NORMAL, settings: DoubanPluginSettings = null): string {
let result = '';
if (value instanceof Array) {
result = this.handleContentArray(value, settings, textMode);
}else if (value instanceof Number) {
result = value ? value.toString() : '';
}else {
result = this.handleSpecialText(value, textMode);
}
return result;
} }
abstract getTemplate(settings:DoubanPluginSettings):string; abstract getTemplate(settings:DoubanPluginSettings):string;
abstract parseText(beforeContent:string, extract: T, settings:DoubanPluginSettings): string; abstract parseText(beforeContent:string, extract: T, settings:DoubanPluginSettings, textMode:TemplateTextMode): string;
abstract support(extract: DoubanSubject): boolean; abstract support(extract: DoubanSubject): boolean;

@ -1,11 +1,12 @@
import { Editor, moment, renderResults } from "obsidian"; 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 from "../model/DoubanBookSubject"; import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject";
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 {TemplateTextMode} from "../../../constant/Constsant";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> { export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
@ -13,23 +14,30 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
return settings.bookTemplate; return settings.bookTemplate;
} }
parseText(beforeContent:string, extract: DoubanBookSubject, settings:DoubanPluginSettings): string { parseText(beforeContent:string, extract: DoubanBookSubject, settings:DoubanPluginSettings, textMode: TemplateTextMode): string {
return beforeContent return beforeContent
.replaceAll("{{author}}", extract.author ? extract.author.join(settings.arraySpilt) : "") .replaceAll(DoubanBookParameter.author,
.replaceAll("{{translator}}", extract.translator ? extract.translator.join(settings.arraySpilt) : "") super.handleSpecialContent(
.replaceAll("{{totalWord}}", extract.totalWord ? extract.totalWord+"" : "") extract.author.map(this.handleSpecialAuthorName), textMode, settings))
.replaceAll("{{isbn}}", extract.isbn ? extract.isbn : "") .replaceAll(DoubanBookParameter.translator, super.handleSpecialContent(extract.translator, textMode, settings))
.replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "") .replaceAll(DoubanBookParameter.isbn, extract.isbn)
.replaceAll("{{subTitle}}", extract.subTitle ? extract.subTitle : "") .replaceAll(DoubanBookParameter.originalTitle, super.handleSpecialContent(extract.originalTitle, textMode))
.replaceAll("{{totalPage}}", extract.totalPage ? extract.totalPage + "" : "") .replaceAll(DoubanBookParameter.subTitle,super.handleSpecialContent(extract.subTitle, textMode))
.replaceAll("{{menu}}", extract.menu ? extract.menu.join(settings.arraySpilt) : "") .replaceAll(DoubanBookParameter.totalPage, super.handleSpecialContent(extract.totalPage, textMode))
.replaceAll("{{price}}", extract.price ? extract.price + "" : "") .replaceAll(DoubanBookParameter.menu, extract.menu.join('\n'))
.replaceAll("{{labels}}", extract.labels ? extract.labels.join(settings.arraySpilt) : ""); .replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode))
.replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode))
.replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode));
} }
support(extract: DoubanSubject): boolean { 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 {
return authorName.replace(/\[/g, '')
.replace(']', '/');
}
@ -39,23 +47,32 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
} }
parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject { parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject {
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 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 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 item = html(html("head > script[type='application/ld+json']").get(0)).text();
let author = html(html("head > meta[property= 'book:author']").get(0)).attr("content"); item = super.html_decode(item);
let isbn = html(html("head > meta[property= 'book:isbn']").get(0)).attr("content"); let obj = JSON.parse(item.replace(/[\r\n\s+]/g, ''));
let title = obj.name;
let url = obj.url;
let author = obj.author.map((a:any) => a.name);
let 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, string>(); 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 || key.indexOf('丛书') >= 0 || key.indexOf('译者') >= 0 || key.indexOf('出版社') >= 0){ if(key.indexOf('译者') >= 0){
value = [];
html(info.parent).find("a").map((index, a) => {
value.push(html(a).text().trim());
});
} else if(key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0){
value = html(info.next.next).text().trim(); value = html(info.next.next).text().trim();
}else{ }else{
value = html(info.next).text().trim(); value = html(info.next).text().trim();
@ -64,31 +81,32 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
}) })
let idPattern = /(\d){5,10}/g; let idPattern = /(\d){5,10}/g;
let id = idPattern.exec(url); let idE = idPattern.exec(url);
let id = idE ? idE[0]: '';
let menuIdDom = html('#dir_' + id + '_full') ? html('#dir_' + id + '_full') : html('#dir_' + id + '_short');
let menu:string[] = menuIdDom ? html(menuIdDom.get(0)).text().trim().split('\n').map(row => row.trim()) : [];
menu.length > 0 ? menu.pop() : menu;
const result:DoubanBookSubject = { const result:DoubanBookSubject = {
author: [author], author: author,
translator: [valueMap.get('translator')], translator: valueMap.has('translator') ? valueMap.get('translator') : [],
bookType: "",
image: image, image: image,
datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : undefined, datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : undefined,
totalWord: valueMap.has('totalWord') ? Number(valueMap.get('totalWord')) : null,
isbn: isbn, isbn: isbn,
publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "", publisher: valueMap.has('publisher') ? valueMap.get('publisher') : "",
score: Number(score), score: Number(score),
originalTitle: valueMap.has('originalTitle') ? valueMap.get('originalTitle') : "", originalTitle: valueMap.has('originalTitle') ? valueMap.get('originalTitle') : "",
subTitle: "", subTitle: valueMap.has('subTitle') ? valueMap.get('subTitle') : "",
totalPage: valueMap.has('originalTitle') ? Number(valueMap.get('totalPage')) : null, totalPage: valueMap.has('totalPage') ? Number(valueMap.get('totalPage')) : null,
belong: "", series: valueMap.has('series') ? valueMap.get('series') : "",
menu: [], menu: menu,
price: valueMap.has('price') ? Number(valueMap.get('price').replace('元', '')) : null, price: valueMap.has('price') ? Number(valueMap.get('price').replace('元', '')) : null,
labels: [], id: id,
id: id ? id[0] : "",
type: "Book", type: "Book",
title: title, title: title,
desc: desc, desc: desc,
url: url, url: url,
genre: [] genre: [],
binding: valueMap.has('binding') ? valueMap.get('binding') : "",
}; };
return result; return result;
} }
@ -105,8 +123,9 @@ const BookKeyValueMap:Map<string, string> = new Map(
['页数:', 'totalPage'], ['页数:', 'totalPage'],
['定价:', 'price'], ['定价:', 'price'],
['装帧:', 'binding'], ['装帧:', 'binding'],
['丛书:', 'bush'], ['丛书:', 'series'],
['ISBN:', 'isbn'], ['ISBN:', 'isbn'],
['译者', 'translator'], ['译者', 'translator'],
['副标题:', 'subTitle'],
] ]
); );

@ -1,13 +1,9 @@
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, PersonNameMode} from "src/douban/Douban"; import {DoubanPluginSettings} from "src/douban/Douban";
import SchemaOrg from "src/utils/SchemaOrg";
import { moment } from "obsidian";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import DoubanGameSubject from '../model/DoubanGameSubject'; import DoubanGameSubject from '../model/DoubanGameSubject';
import DoubanBookSubject from "@App/data/model/DoubanBookSubject";
import { log } from 'src/utils/Logutil';
export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> { export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> {

@ -3,7 +3,6 @@ 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 { moment } from "obsidian";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import DoubanMovieSubject from '../model/DoubanMovieSubject'; import DoubanMovieSubject from '../model/DoubanMovieSubject';

@ -3,7 +3,6 @@ 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 { moment } from "obsidian";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> { export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> {

@ -5,7 +5,6 @@ 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';
import { moment } from "obsidian";
export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> { export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> {

@ -1,5 +1,3 @@
import { Editor, Notice } from "obsidian";
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";

@ -32,7 +32,6 @@ export class DoubanSearchChooseItemHandler {
new DoubanGameLoadHandler(doubanPlugin), new DoubanGameLoadHandler(doubanPlugin),
this._doubanSubjectHandlerDefault]; this._doubanSubjectHandlerDefault];
} }
public handle(searchExtract:DoubanSubject, editor: Editor):void{ public handle(searchExtract:DoubanSubject, editor: Editor):void{

@ -5,7 +5,6 @@ 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";
import { moment } from "obsidian";
/** /**
* teleplay * teleplay
@ -53,7 +52,7 @@ export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler<DoubanT
const result:DoubanTeleplaySubject = { const result:DoubanTeleplaySubject = {
id: id ? id[0] : '', id: id ? id[0] : '',
type: 'Movie', type: 'Teleplay',
title: title, title: title,
originalTitle: originalTitle, originalTitle: originalTitle,
desc: obj.description, desc: obj.description,

@ -1,18 +1,30 @@
import {AggregateRating, Person, WithContext} from 'schema-dts'; 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[];
bookType:string;
totalWord:number;
isbn:string; isbn:string;
originalTitle:string; originalTitle:string;
subTitle:string; subTitle:string;
totalPage:number totalPage:number
belong:string; series:string;
menu:string[]; menu:string[];
price:number; price:number;
labels:string[]; binding:string;
}
export const DoubanBookParameter = {
author: '{{author}}',
translator: '{{translator}}',
isbn: '{{isbn}}',
originalTitle: '{{originalTitle}}',
subTitle: '{{subTitle}}',
totalPage: '{{totalPage}}',
series: '{{series}}',
menu: '{{menu}}',
price: '{{price}}',
binding: '{{binding}}',
} }

@ -1,4 +1,4 @@
export default class DoubanExtract { export default class DoubanSubject {
id: string; id: string;
title: string; title: string;
type: string; type: string;
@ -10,3 +10,21 @@ export default class DoubanExtract {
datePublished:Date; datePublished:Date;
genre:string[]; genre:string[];
} }
const ParameterMap:Map<string, string> = new Map([
['id', ''],
]);
export const DoubanParameter = {
ID: '{{id}}',
TITLE: '{{title}}',
TYPE: '{{type}}',
SCORE: '{{score}}',
IMAGE: '{{image}}',
URL: '{{url}}',
DESC: '{{desc}}',
PUBLISHER: '{{publisher}}',
DATE_PUBLISHED: '{{datePublished}}',
TIME_PUBLISHED: '{{timePublished}}',
GENRE: '{{genre}}',
}

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

@ -1,8 +1,9 @@
import { App, 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";
export {DoubanFuzzySuggester} export {DoubanFuzzySuggester}
@ -17,7 +18,7 @@ class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject>
super(app); super(app);
this.editor = editor; this.editor = editor;
this.plugin = plugin; this.plugin = plugin;
this.setPlaceholder("Choose an item..."); this.setPlaceholder(i18nHelper.getMessage('150101'));
} }
@ -28,12 +29,13 @@ class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject>
} }
getItemText(item: DoubanSearchResultSubject): string { getItemText(item: DoubanSearchResultSubject): string {
let text:string = item.type + "/" + item.score + "/" + item.title + "/" + item.cast; let text:string = item.type + "/" + (item.score ? item.score : '-') + "/" + item.title + "/" + item.cast;
return text; return text;
} }
onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void { onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void {
this.plugin.doubanEtractHandler.handle(item, this.editor); this.plugin.showStatus('140204', item.title);
this.plugin.doubanExtractHandler.handle(item, this.editor);
} }
public showSearchList(doubanSearchResultExtractList:DoubanSearchResultSubject[]) { public showSearchList(doubanSearchResultExtractList:DoubanSearchResultSubject[]) {

@ -1,4 +1,4 @@
import { DoubanPluginSettings, doubanHeadrs } from 'src/douban/Douban'; import { DoubanPluginSettings, doubanHeaders } from 'src/douban/Douban';
import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject'; import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject';
import SearchParserHandler from './SearchParser'; import SearchParserHandler from './SearchParser';

@ -14,13 +14,16 @@ export default class SearchParserHandler {
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 type = item.find("div.content > div > h3 > span").text();
let desc = item.find("div.content > p").text();
const result:DoubanSearchResultSubject = { const result:DoubanSearchResultSubject = {
id: ececResult ? ececResult[0] : '', id: ececResult ? ececResult[0] : '',
title: item.find("div.content > div > h3 > a").text(), title: title ? title : '-',
score: score ? Number(score) : null, score: score ? Number(score) : null,
cast: cast, cast: cast,
type: item.find("div.content > div > h3 > span").text(), type: type ? type : '-',
desc: item.find("div.content > p").text(), desc: desc ? desc : '-',
url: urlResult ? decodeURIComponent(urlResult[0]) : 'https://www.douban.com', url: urlResult ? decodeURIComponent(urlResult[0]) : 'https://www.douban.com',
image: "", image: "",
publisher: "", publisher: "",

@ -32,6 +32,7 @@ export default {
'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}}`,
'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.`,
@ -47,6 +48,7 @@ export default {
'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}}`,
'121301': `Game Content Template`, '121301': `Game Content Template`,
'121302': `Set markdown Game template for extract to be inserted.`, '121302': `Set markdown Game template for extract to be inserted.`,
@ -65,8 +67,8 @@ export default {
'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`,
@ -86,4 +88,16 @@ export default {
'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}'...`,
'140202': `[Obsidian Douban]: result {0} rows`,
'140203': `[Obsidian Douban]: request '{0}'`,
'140204': `[Obsidian Douban]: replace '{0}'`,
'140205': `[Obsidian Douban]: complete '{0}'`,
'140206': `[Obsidian Douban]: occur error '{0}'`,
'150101': `Choose an item...`,
//content
'200101': `. `,
} }

@ -1,4 +1,7 @@
//简体中文 //简体中文
import DoubanBookSubject from "@App/data/model/DoubanBookSubject";
import {extract} from "jest-docblock";
export default { export default {
//main.ts //main.ts
'110001': '用当前文档名搜索豆瓣并写入当前文档', '110001': '用当前文档名搜索豆瓣并写入当前文档',
@ -32,6 +35,8 @@ export default {
'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}}`,
'120301': `音乐文本模板`, '120301': `音乐文本模板`,
'120302': `设置选择音乐后导入的文本内容模板,`, '120302': `设置选择音乐后导入的文本内容模板,`,
@ -47,6 +52,7 @@ export default {
'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}}`,
'121301': `游戏文本模板`, '121301': `游戏文本模板`,
'121302': `设置选择游戏后导入的文本内容模板,`, '121302': `设置选择游戏后导入的文本内容模板,`,
@ -65,8 +71,8 @@ export default {
'120508': `格式参考`, '120508': `格式参考`,
'120601': `数组分割字符串`, '120601': `数组分割字符串`,
'120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如演员列表等. '120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如演员列表等.
: '/' : ','
: '演员1/演员2/演员3'`, : '演员1,演员2,演员3'`,
'120701': `豆瓣HTTP请求头`, '120701': `豆瓣HTTP请求头`,
'120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n '120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n
:\n :\n
@ -89,5 +95,37 @@ export default {
'130103': `Obsidian Douban插件异常提示:`, '130103': `Obsidian Douban插件异常提示:`,
'140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`, '140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`,
'140201': `[Obsidian Douban]: 开始搜索'{0}'...`,
'140202': `[Obsidian Douban]: 搜索条数{0}条`,
'140203': `[Obsidian Douban]: 请求豆瓣'{0}'...`,
'140204': `[Obsidian Douban]: 替换文本'{0}'...`,
'140205': `[Obsidian Douban]: 处理完成'{0}'`,
'140206': `[Obsidian Douban]: 出现错误'{0}'`,
'150101': `选择一项内容...`,
//content
'200101': ``,
//book example
'book': {
id: {desc: `豆瓣ID`, example: `25982198`},
title: {desc: `书名`, example: `社会心理学第11版精装彩印`},
type: {desc: `类型`, example: `Book`},
score: {desc: `评分`, example: `9.4`},
image: {desc: `图片URL`, example: `https://img1.doubanio.com/view/subject/l/public/s28261247.jpg`},
url: {desc: `豆瓣URL`, example: `https://book.douban.com/subject/25982198/`},
desc: {desc: `简述`, example: `戴维·迈尔斯的《社会心理学》是美国700 多所大专院校社会心理学教学所采用的教材自出版以来深受广大师生和社会心理学爱好者的喜爱并被翻译成多种语言有着广泛的影响力。本书译自第11 版。全书共分四...`},
publisher: {desc: `出版社`, example: `人民邮电出版社`},
datePublished: {desc: `出版时间`, example: `2014-10-1`},
genre: {desc: `类型`, example: `社会科学`},
author: {desc: `作者`, example: `戴维·迈尔斯`},
translator: {desc: `译者`, example: `侯玉波 / 乐国安 / 张志勇`},
isbn: {desc: `ISBN`, example: `9787115369840`},
originTitle: {desc: `原作名`, example: `Social Psychology (11th)`},
subTitle: {desc: `副标题`, example: `社会心理学`},
binding: {desc: `装帧`, example: `精装`},
totalPages: {desc: `页数`, example: `707`},
}
} }

32
src/utils/YamlUtil.ts Normal file

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