From a97688481d6555a980e5e87a0c651e8a96749fd9 Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Mon, 24 Oct 2022 23:14:25 +0800 Subject: [PATCH] Optimize internationalized text and remove some dependencies --- main.ts | 8 +- package.json | 70 +++-- src/douban/Douban.ts | 248 +++++++++--------- src/douban/DoubanSettingTab.ts | 107 ++++---- .../data/handler/DoubanAbstractLoadHandler.ts | 18 +- .../data/handler/DoubanOtherLoadHandler.ts | 4 +- src/douban/data/search/DoubanSearchModal.ts | 8 +- src/douban/data/search/Search.ts | 30 ++- src/lang/locale/en.ts | 159 +++++------ src/lang/locale/zh-cn.ts | 168 ++++++------ src/typings/tiny-network.d.ts | 6 - src/utils/HttpUtil.ts | 34 --- src/utils/Logutil.ts | 70 ++--- 13 files changed, 446 insertions(+), 484 deletions(-) delete mode 100644 src/typings/tiny-network.d.ts delete mode 100644 src/utils/HttpUtil.ts diff --git a/main.ts b/main.ts index 14e4f87..64c388b 100644 --- a/main.ts +++ b/main.ts @@ -16,7 +16,7 @@ export default class DoubanPlugin extends Plugin { async putToEditor(editor:Editor, extract:DoubanSubject) { if(!editor || !extract) { - log.warn(`Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`); + log.warn(i18nHelper.getMessage('140101')); return; } log.trace(`you choose item load data success: ${JSON.stringify(extract)}`); @@ -53,7 +53,7 @@ export default class DoubanPlugin extends Plugin { this.addCommand({ id: "search-douban-by-current-file-name", - name: i18nHelper.getMessage("search douban by current file name"), + name: i18nHelper.getMessage("110001"), editorCallback: (editor: Editor) => this.getDoubanTextForActiveFile(editor), }); @@ -61,14 +61,14 @@ export default class DoubanPlugin extends Plugin { this.addCommand({ id: "search-douban-and-input-current-file", - name: i18nHelper.getMessage("search douban and import to current file"), + name: i18nHelper.getMessage("110002"), editorCallback: (editor: Editor) => this.geDoubanTextForSearchTerm(editor), }); this.addCommand({ id: "sync-douban-broadcast-by-user-id", - name: i18nHelper.getMessage("sync douban broadcast by douban user id"), + name: i18nHelper.getMessage('110006'), editorCallback: (editor: Editor) => this.geDoubanTextForSearchTerm(editor), }); diff --git a/package.json b/package.json index 509d56b..b048310 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,33 @@ -{ - "name": "obsidian-sample-plugin", - "version": "v1.4.3", - "description": "This is a sample plugin for Obsidian (https://obsidian.md)", - "main": "main.js", - "scripts": { - "dev": "node esbuild.config.mjs", - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "version": "node version-bump.mjs && git add manifest.json versions.json", - "test": "jest" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@types/jest": "^28.1.4", - "@types/node": "^16.11.6", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "builtin-modules": "^3.2.0", - "esbuild": "0.13.12", - "jest": "^28.1.2", - "obsidian": "latest", - "ts-jest": "^28.0.5", - "tslib": "2.3.1", - "typescript": "^4.7.2" - }, - "dependencies": { - "@notable/html2markdown": "^1.1.3", - "axios": "^0.27.2", - "cheerio": "^1.0.0-rc.11", - "douban-search-crack": "^1.0.6", - "node-fetch": "^2.6.1", - "schema-dts": "^1.1.0", - "tiny-network": "0.0.6" - } -} +{ + "name": "obsidian-sample-plugin", + "version": "v1.4.3", + "description": "This is a sample plugin for Obsidian (https://obsidian.md)", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "version": "node version-bump.mjs && git add manifest.json versions.json", + "test": "jest" + }, + "keywords": [], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/jest": "^28.1.4", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "builtin-modules": "^3.2.0", + "esbuild": "0.13.12", + "jest": "^28.1.2", + "obsidian": "latest", + "ts-jest": "^28.0.5", + "tslib": "2.3.1", + "typescript": "^4.7.2" + }, + "dependencies": { + "@notable/html2markdown": "^1.1.3", + "cheerio": "^1.0.0-rc.11", + "schema-dts": "^1.1.0" + } +} diff --git a/src/douban/Douban.ts b/src/douban/Douban.ts index 211a6cf..c6b1182 100644 --- a/src/douban/Douban.ts +++ b/src/douban/Douban.ts @@ -1,124 +1,124 @@ -import { i18nHelper } from "src/lang/helper"; -import { type } from "os"; - -export interface DoubanPluginSettings { - movieTemplate:string, - bookTemplate:string, - musicTemplate:string, - noteTemplate:string - dateFormat:string, - dateTimeFormat:string, - searchUrl:string, - arraySpilt:string, - searchHeaders?:string, - personNameMode:PersonNameMode, -} - -export enum PersonNameMode { - CH_NAME = "CH", - EN_NAME = "EN", - CH_EN_NAME = "CH_EN", -} - - -export const doubanHeadrs = { - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7", - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", -}; - -export const DEFAULT_SETTINGS:DoubanPluginSettings = { - movieTemplate: -`--- -doubanId: {{id}} -title: {{title}} -originalTitle: {{originalTitle}} -type: {{type}} -score: {{score}} -genre: {{genre}} -datePublished: {{datePublished}} -director: {{director}} -actor: {{actor}} -author: {{author}} -url: {{url}} -desc: {{desc}} ---- - -![image]({{image}}) -`, - bookTemplate: -`--- -doubanId: {{id}} -title: {{title}} -subTitle: {{subTitle}} -originalTitle: {{originalTitle}} -type: {{type}} -author: {{author}} -score: {{score}} -datePublished: {{datePublished}} -translator: {{translator}} -publish: {{publish}} -isbn: {{isbn}} -url: {{url}} -totalPage: {{totalPage}} -price: {{price}} -tags: Book -desc: {{desc}} ---- - -![image|150]({{image}}) -`, - musicTemplate: -`--- -doubanId: {{id}} -title: {{title}} -type: {{type}} -actor: {{actor}} -score: {{score}} -genre: {{genre}} -medium: {{medium}} -albumType: {{albumType}} -datePublished: {{datePublished}} -publish: {{publish}} -barcode: {{barcode}} -url: {{url}} -numberOfRecords: {{numberOfRecords}} -tags: Music -desc: {{desc}} ---- - -![image|150]({{image}}) -`, -noteTemplate: -`--- -doubanId: {{id}} -title: {{title}} -type: {{type}} -author: [{{author}}]({{authorUrl}}) -timePublished: {{timePublished}} -url: {{url}} -tags: Article -desc: {{desc}} ---- - -- content -{{content}} -`, -// totalWord: {{totalWord}} - - searchUrl: 'https://www.douban.com/search?q=', - searchHeaders: JSON.stringify(doubanHeadrs), - dateFormat: "yyyy-MM-DD", - dateTimeFormat: "yyyy-MM-DD HH:mm:ss", - arraySpilt: ", ", - personNameMode: PersonNameMode.CH_NAME - -} - -export const personNameModeRecords: {[key in PersonNameMode]: string} = { - [PersonNameMode.CH_NAME]: i18nHelper.getMessage("Chinese Name"), - [PersonNameMode.EN_NAME]: i18nHelper.getMessage("English Name"), - [PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage("Chinese And English Name"), - } - - +import { i18nHelper } from "src/lang/helper"; +import { type } from "os"; + +export interface DoubanPluginSettings { + movieTemplate:string, + bookTemplate:string, + musicTemplate:string, + noteTemplate:string + dateFormat:string, + dateTimeFormat:string, + searchUrl:string, + arraySpilt:string, + searchHeaders?:string, + personNameMode:PersonNameMode, +} + +export enum PersonNameMode { + CH_NAME = "CH", + EN_NAME = "EN", + CH_EN_NAME = "CH_EN", +} + + +export const doubanHeadrs = { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7", + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", +}; + +export const DEFAULT_SETTINGS:DoubanPluginSettings = { + movieTemplate: +`--- +doubanId: {{id}} +title: {{title}} +originalTitle: {{originalTitle}} +type: {{type}} +score: {{score}} +genre: {{genre}} +datePublished: {{datePublished}} +director: {{director}} +actor: {{actor}} +author: {{author}} +url: {{url}} +desc: {{desc}} +--- + +![image]({{image}}) +`, + bookTemplate: +`--- +doubanId: {{id}} +title: {{title}} +subTitle: {{subTitle}} +originalTitle: {{originalTitle}} +type: {{type}} +author: {{author}} +score: {{score}} +datePublished: {{datePublished}} +translator: {{translator}} +publish: {{publish}} +isbn: {{isbn}} +url: {{url}} +totalPage: {{totalPage}} +price: {{price}} +tags: Book +desc: {{desc}} +--- + +![image|150]({{image}}) +`, + musicTemplate: +`--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +actor: {{actor}} +score: {{score}} +genre: {{genre}} +medium: {{medium}} +albumType: {{albumType}} +datePublished: {{datePublished}} +publish: {{publish}} +barcode: {{barcode}} +url: {{url}} +numberOfRecords: {{numberOfRecords}} +tags: Music +desc: {{desc}} +--- + +![image|150]({{image}}) +`, +noteTemplate: +`--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +author: [{{author}}]({{authorUrl}}) +timePublished: {{timePublished}} +url: {{url}} +tags: Article +desc: {{desc}} +--- + +- content +{{content}} +`, +// totalWord: {{totalWord}} + + searchUrl: 'https://www.douban.com/search?q=', + searchHeaders: JSON.stringify(doubanHeadrs), + dateFormat: "yyyy-MM-DD", + dateTimeFormat: "yyyy-MM-DD HH:mm:ss", + arraySpilt: ", ", + personNameMode: PersonNameMode.CH_NAME + +} + +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'), + } + + diff --git a/src/douban/DoubanSettingTab.ts b/src/douban/DoubanSettingTab.ts index 36596a1..f333d25 100644 --- a/src/douban/DoubanSettingTab.ts +++ b/src/douban/DoubanSettingTab.ts @@ -3,7 +3,6 @@ import { DEFAULT_SETTINGS, PersonNameMode, personNameModeRecords } from "./Douba import DoubanPlugin from "main"; import { i18nHelper } from "src/lang/helper"; -import { log } from "src/utils/Logutil"; export class DoubanSettingTab extends PluginSettingTab { plugin: DoubanPlugin; @@ -18,20 +17,20 @@ export class DoubanSettingTab extends PluginSettingTab { containerEl.empty(); - containerEl.createEl("h2", { text: "Obsidian Douban" }); + containerEl.createEl("h2", { text: '1201' }); - new Setting(containerEl).setName(i18nHelper.getMessage('douban search url')) + new Setting(containerEl).setName(i18nHelper.getMessage('120001')) .then((setting) => { setting.addText((textField) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('douban search url desc 1')); + frag.appendText(i18nHelper.getMessage('120002')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 2')); + frag.appendText(i18nHelper.getMessage('120003')); frag.createEl( 'a', { - text: i18nHelper.getMessage('Douban'), + text: i18nHelper.getMessage('120901'), href: 'https://www.douban.com', }, (a) => { @@ -39,11 +38,11 @@ export class DoubanSettingTab extends PluginSettingTab { } ); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 3')); + frag.appendText(i18nHelper.getMessage('120004')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 4')); + frag.appendText(i18nHelper.getMessage('120005')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 5')); + frag.appendText(i18nHelper.getMessage('120006')); frag.createEl('br'); }) ); @@ -59,21 +58,21 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage("movie content template")).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120101')).then((setting) => { setting.addTextArea((textarea) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('movie content template desc 1')); + frag.appendText(i18nHelper.getMessage('120102')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 2')); + frag.appendText(i18nHelper.getMessage('120103')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 3')); + frag.appendText(i18nHelper.getMessage('120104')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 4')); + frag.appendText(i18nHelper.getMessage('120105')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 5')); + frag.appendText(i18nHelper.getMessage('120106')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 6')); + frag.appendText(i18nHelper.getMessage('120107')); frag.createEl('br'); }) ); @@ -88,21 +87,21 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage("book content template")).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => { setting.addTextArea((textarea) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('book content template desc 1')); + frag.appendText(i18nHelper.getMessage('120202')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 2')); + frag.appendText(i18nHelper.getMessage('120203')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 3')); + frag.appendText(i18nHelper.getMessage('120204')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 4')); + frag.appendText(i18nHelper.getMessage('120205')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 5')); + frag.appendText(i18nHelper.getMessage('120206')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 6')); + frag.appendText(i18nHelper.getMessage('120207')); frag.createEl('br'); }) ); @@ -117,21 +116,21 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage("music content template")).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120201')).then((setting) => { setting.addTextArea((textarea) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('music content template desc 1')); + frag.appendText(i18nHelper.getMessage('120302')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 2')); + frag.appendText(i18nHelper.getMessage('120303')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 3')); + frag.appendText(i18nHelper.getMessage('120304')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 4')); + frag.appendText(i18nHelper.getMessage('120305')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 5')); + frag.appendText(i18nHelper.getMessage('120306')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 6')); + frag.appendText(i18nHelper.getMessage('120307')); frag.createEl('br'); }) ); @@ -146,19 +145,19 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage("note content template")).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage("120401")).then((setting) => { setting.addTextArea((textarea) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('note content template desc 1')); + frag.appendText(i18nHelper.getMessage('120402')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 2')); + frag.appendText(i18nHelper.getMessage('120403')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 3')); + frag.appendText(i18nHelper.getMessage('120404')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 4')); + frag.appendText(i18nHelper.getMessage('120405')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 5')); + frag.appendText(i18nHelper.getMessage('120406')); frag.createEl('br'); }) @@ -174,17 +173,17 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage("Person Name Language Mode")).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => { setting.addDropdown((dropdwon) => { setting.descEl.appendChild( createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('options:')); + frag.appendText(i18nHelper.getMessage('121202')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Chinese Name mode, only show Chinese name')); + frag.appendText(i18nHelper.getMessage('121203')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('English Name mode, only show English name')); + frag.appendText(i18nHelper.getMessage('121204')); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Chinese English Name mode, show Chinese English name both')); + frag.appendText(i18nHelper.getMessage('121205')); frag.createEl('br'); }) ); @@ -204,19 +203,19 @@ export class DoubanSettingTab extends PluginSettingTab { - new Setting(containerEl).setName(i18nHelper.getMessage('Date format')).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120501')).then((setting) => { setting.addMomentFormat((mf) => { setting.descEl.appendChild( createFragment((frag) => { frag.appendText( - i18nHelper.getMessage('This format will be used when available template variables contain date.') + i18nHelper.getMessage('120503') ); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('For more syntax, refer to') + ' '); + frag.appendText(i18nHelper.getMessage('120506') + ' '); frag.createEl( 'a', { - text: i18nHelper.getMessage('format reference'), + text: i18nHelper.getMessage('120508'), href: 'https://momentjs.com/docs/#/displaying/format/', }, (a) => { @@ -224,7 +223,7 @@ export class DoubanSettingTab extends PluginSettingTab { } ); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Your current syntax looks like this') + ': '); + frag.appendText(i18nHelper.getMessage('120507') + ': '); mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' })); frag.createEl('br'); }) @@ -239,19 +238,19 @@ export class DoubanSettingTab extends PluginSettingTab { }); }); - new Setting(containerEl).setName(i18nHelper.getMessage('DateTime format')).then((setting) => { + new Setting(containerEl).setName(i18nHelper.getMessage('120502')).then((setting) => { setting.addMomentFormat((mf) => { setting.descEl.appendChild( createFragment((frag) => { frag.appendText( - i18nHelper.getMessage('This format will be used when available template variables contain dateTime.') + i18nHelper.getMessage('120503') ); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('For more syntax, refer to') + ' '); + frag.appendText(i18nHelper.getMessage('120506') + ' '); frag.createEl( 'a', { - text: i18nHelper.getMessage('format reference'), + text: i18nHelper.getMessage('120508'), href: 'https://momentjs.com/docs/#/displaying/format/', }, (a) => { @@ -259,7 +258,7 @@ export class DoubanSettingTab extends PluginSettingTab { } ); frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Your current syntax looks like this') + ': '); + frag.appendText(i18nHelper.getMessage('120507') + ': '); mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' })); frag.createEl('br'); }) @@ -276,8 +275,8 @@ export class DoubanSettingTab extends PluginSettingTab { new Setting(containerEl) - .setName(i18nHelper.getMessage("Array Spilt String")) - .setDesc(i18nHelper.getMessage(`string to join between array type, such as author, actor`)) + .setName(i18nHelper.getMessage('120601')) + .setDesc(i18nHelper.getMessage('120602')) .addText((textField) => { textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt) .setValue(this.plugin.settings.arraySpilt) @@ -288,4 +287,4 @@ export class DoubanSettingTab extends PluginSettingTab { }); } - } \ No newline at end of file + } diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/douban/data/handler/DoubanAbstractLoadHandler.ts index 75477b3..7fda979 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -1,13 +1,12 @@ -import { CheerioAPI, load } from 'cheerio'; import { DoubanPluginSettings, PersonNameMode } from "src/douban/Douban"; -import { get, readStream } from "tiny-network"; import DoubanPlugin from "main"; import DoubanSubject from '../model/DoubanSubject'; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; -import { Editor } from "obsidian"; +import {Editor, request, requestUrl, RequestUrlParam, sanitizeHTMLToDom} from "obsidian"; import { i18nHelper } from 'src/lang/helper'; import { log } from "src/utils/Logutil"; +import {CheerioAPI, load} from "cheerio"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { @@ -23,14 +22,19 @@ export default abstract class DoubanAbstractLoadHandler abstract support(extract: DoubanSubject): boolean; handle(url:string, editor:Editor):void { - Promise.resolve().then(() => get(log.traceN("GET URL", url + "/"), log.traceN("GET HEAD", JSON.parse(this.doubanPlugin.settings.searchHeaders)))) - .then(readStream) + let requestUrlParam:RequestUrlParam = { + url: url, + method: "GET", + headers: JSON.parse(this.doubanPlugin.settings.searchHeaders), + throw: true + }; + request(requestUrlParam) .then(a => {log.trace(a.toString()); return a;}) .then(load) .then(this.parseSubjectFromHtml) .then(content => this.toEditor(editor, content)) // .then(content => content ? editor.replaceSelection(content) : content) - .catch(e => log.error(i18nHelper.getMessage("Fetch Data Error"))) + .catch(e => log.error(i18nHelper.getMessage('130101'))) ; } @@ -90,4 +94,4 @@ export default abstract class DoubanAbstractLoadHandler return s; } -} \ No newline at end of file +} diff --git a/src/douban/data/handler/DoubanOtherLoadHandler.ts b/src/douban/data/handler/DoubanOtherLoadHandler.ts index f11510f..0f213e2 100644 --- a/src/douban/data/handler/DoubanOtherLoadHandler.ts +++ b/src/douban/data/handler/DoubanOtherLoadHandler.ts @@ -12,7 +12,7 @@ import { log } from "src/utils/Logutil"; */ export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler { parseText(extract: DoubanSubject, settings:DoubanPluginSettings): string { - log.warn(i18nHelper.getMessage('current version not support type')); + log.warn(i18nHelper.getMessage('140101')); return ""; } support(extract: DoubanSubject): boolean { @@ -26,4 +26,4 @@ export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler { @@ -36,7 +36,7 @@ export class DoubanSearchModal extends Modal { const controls = contentEl.createDiv("controls"); const searchButton = controls.createEl("button", { - text: i18nHelper.getMessage('Search'), + text: i18nHelper.getMessage('110004'), cls: "mod-cta", attr: { autofocus: true, @@ -45,7 +45,7 @@ export class DoubanSearchModal extends Modal { searchButton.addClass("search_button"); searchButton.addEventListener("click", this.close.bind(this)); - const cancelButton = controls.createEl("button", { text: i18nHelper.getMessage('Cancel') }); + const cancelButton = controls.createEl("button", { text: i18nHelper.getMessage('110005') }); cancelButton.addEventListener("click", this.close.bind(this)); cancelButton.addClass("search_button"); @@ -61,4 +61,4 @@ export class DoubanSearchModal extends Modal { } } - } \ No newline at end of file + } diff --git a/src/douban/data/search/Search.ts b/src/douban/data/search/Search.ts index f65f562..2579565 100644 --- a/src/douban/data/search/Search.ts +++ b/src/douban/data/search/Search.ts @@ -1,24 +1,26 @@ import { DoubanPluginSettings, doubanHeadrs } from 'src/douban/Douban'; -import cheerio, { load } from 'cheerio'; -import { get, readStream } from 'tiny-network'; import DoubanSearchResultSubject from '../model/DoubanSearchResultSubject'; import SearchParserHandler from './SearchParser'; -import { ensureStatusCode } from 'src/douban/ResponseHandle'; import { log } from 'src/utils/Logutil'; +import {request, RequestUrlParam} from "obsidian"; +import {i18nHelper} from "../../../lang/helper"; +import { load } from 'cheerio'; export default class Searcher { static search(searchItem:string, doubanSettings:DoubanPluginSettings):Promise { - // getData(); - // getData2(); - // return Promise.resolve(); - return Promise - .resolve() - .then(() => get(log.traceN("GET", doubanSettings.searchUrl + searchItem), JSON.parse(doubanSettings.searchHeaders))) - .then(ensureStatusCode(200)) - .then(readStream) - .then(load) - .then(SearchParserHandler.parseSearch) - .then(log.trace); + let requestUrlParam:RequestUrlParam = { + url: doubanSettings.searchUrl + searchItem, + method: "GET", + headers: JSON.parse(doubanSettings.searchHeaders), + throw: true + }; + return request(requestUrlParam) + .then(a => {log.trace(a.toString()); return a;}) + .then(load) + .then(SearchParserHandler.parseSearch) + .catch(e => log.error(i18nHelper.getMessage('130101'))) + ; + }; } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 3baa81d..3d4a3fb 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -1,79 +1,80 @@ -//简体中文 -export default { - //main.ts - 'search douban by current file name':'search douban by current file name', - 'search douban and import to current file':'search douban and import to current file', - 'Enter Search Term:':`Enter Search Term:`, - 'Search':`Search`, - 'Cancel':`Cancel`, - "sync douban broadcast by douban user id": `sync douban broadcast ot Obsidian`, - - //DoubanSettingTab - 'douban search url': `Douban Search Url`, - 'douban search url desc 1': `Douban search page request address. `, - 'douban search url desc 2': `First go to:`, - 'douban search url desc 3': `Don't enter anything in the search input box, just click Search,`, - 'douban search url desc 4': `The redirected web page address is the search address,`, - 'douban search url desc 5': `Just copy the web address to the current input box.`, - - 'movie content template': `Movie Content Template`, - 'movie content template desc 1': `Set markdown Movie template for extract to be inserted.`, - 'movie content template desc 2': `Available template variables are :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, - 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, - 'movie content template desc 6': `{{image}}, {{url}}`, - - 'book content template': `Book Content Template`, - 'book content template desc 1': `Set markdown Book template for extract to be inserted.`, - 'book content template desc 2': `Available Book template variables are :`, - 'book content template desc 3': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, - 'book content template desc 4': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, - 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, - 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, - - 'music content template': `Music Content Template`, - 'music content template desc 1': `Set markdown Music template for extract to be inserted.`, - 'music content template desc 2': `Available Music template variables are :`, - 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, - 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, - 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, - 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, - - 'note content template': `Article Content Template`, - 'note content template desc 1': `Set markdown Article template for extract to be inserted.`, - 'note content template desc 2': `Available Article template variables are :`, - 'note content template desc 3': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, - 'note content template desc 4': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, - 'note content template desc 5': `{{content}}`, - - 'Date format': `Date Format`, - 'DateTime format': `DateTime Format`, - - 'This format will be used when available template variables contain date.': - `This format will be used when available template variables contain date.`, - 'This format will be used when available template variables contain dateTime.': - `This format will be used when available template variables contain dateTime.`, - 'For more syntax, refer to': `For more syntax, refer to`, - 'Your current syntax looks like this':`Your current syntax looks like this`, - 'format reference': `format reference`, - 'Array Spilt String':`Array Spilt String`, - 'string to join between array type, such as author, actor':`string to join between array type, such as author, actor`, - 'Douban Request Headers':`Douban Request Headers`, - 'current version not support type': `This type of import is not supported temporarily, please go to github to submit issues for help`, - 'Douban': `Douban`, - 'Person Name Language Mode':'Person Name Language Mode', - 'options:':"options:", - 'Chinese Name mode, only show Chinese name':'Chinese Name mode, person name only show Chinese name', - 'English Name mode, only show English name':'English Name mode, person name only show English name', - 'Chinese English Name mode, show Chinese English name both':'Chinese English Name mode, show Chinese and English name both', - 'Chinese Name': 'Chinese Name', - 'English Name': 'English Name', - 'Chinese And English Name': 'Chinese And English Name', - - - //error - "Fetch Data Error": "Fetch Data Error, You can go to Github add Issues", - "Obsidian Douban Plugin Error:": "Obsidian Douban Plugin Error: ", - "Obsidian Douban Plugin Warn:": "Obsidian Douban Plugin Warn: ", -} \ No newline at end of file +//简体中文 +export default { + //main.ts + '110001': 'search douban by current file name', + '110002': 'search douban and import to current file', + '110003': `Enter Search Term:`, + '110004': `Search`, + '110005': `Cancel`, + '110006': `sync douban broadcast ot Obsidian`, + + //DoubanSettingTab + '1201' : `Obsidian Douban`, + '120001': `Douban Search Url`, + '120002': `Douban search page request address. `, + '120003': `First go to:`, + '120004': `Don't enter anything in the search input box, just click Search,`, + '120005': `The redirected web page address is the search address,`, + '120006': `Just copy the web address to the current input box.`, + + '120101': `Movie Content Template`, + '120102': `Set markdown Movie template for extract to be inserted.`, + '120103': `Available template variables are :`, + '120104': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, + '120105': `{{score}}, {{datePublished}}, {{director}},`, + '120106': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, + '120107': `{{image}}, {{url}}`, + + '120201': `Book Content Template`, + '120202': `Set markdown Book template for extract to be inserted.`, + '120203': `Available Book template variables are :`, + '120204': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, + '120205': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, + '120206': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, + '120207': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, + + '120301': `Music Content Template`, + '120302': `Set markdown Music template for extract to be inserted.`, + '120303': `Available Music template variables are :`, + '120304': `{{id}}, {{title}}, {{actor}}, {{genre}},`, + '120305': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, + '120306': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, + '120307': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, + + '120401': `Article Content Template`, + '120402': `Set markdown Article template for extract to be inserted.`, + '120403': `Available Article template variables are :`, + '120404': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, + '120405': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, + '120406': `{{content}}`, + + '120501': `Date Format`, + '120502': `DateTime Format`, + + '120503': `This format will be used when available template variables contain date.`, + '120504': `This format will be used when available template variables contain dateTime.`, + '120506': `For more syntax, refer to`, + '120507': `Your current syntax looks like this`, + '120508': `format reference`, + '120601': `Array Spilt String`, + '120602': `string to join between array type, such as author, actor`, + '120701': `Douban Request Headers`, + '120801': `This type of import is not supported temporarily, please go to github to submit issues for help`, + '120901': `Douban`, + '121201': `Person Name Language Mode`, + '121202': `options:`, + '121203': `Chinese Name mode, person name only show Chinese name`, + '121204': `English Name mode, person name only show English name`, + '121205': `Chinese English Name mode, show Chinese and English name both`, + '121206': `Chinese Name`, + '121207': `English Name`, + '121208': `Chinese And English Name`, + + + //error + '130101': `Fetch Data Error, You can go to Github add Issues`, + '130201': `Obsidian Douban Plugin Error: `, + '130301': `Obsidian Douban Plugin Warn: `, + '140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`, + +} diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index a7124c4..612222e 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -1,84 +1,84 @@ -//简体中文 -export default { - //main.ts - 'search douban by current file name':'用当前文档名搜索豆瓣并写入当前文档', - 'search douban and import to current file':'在豆瓣搜索并写入到当前文档', - 'Enter Search Term:':`输入搜索内容:`, - 'Search':`搜索`, - 'Cancel':`取消`, - "sync douban broadcast by douban user id": `同步豆瓣广播至Obsidian`, - - //DoubanSettingTab - 'douban search url': `豆瓣搜索地址`, - 'douban search url desc 1': `豆瓣搜索页面请求地址, 通常是网页搜索的地址. `, - 'douban search url desc 2': `先访问:`, - 'douban search url desc 3': `然后在搜索输入框不输入任何内容,直接点击搜索,`, - 'douban search url desc 4': `所跳转的网页地址即是搜索地址,`, - 'douban search url desc 5': `将网页地址复制到当前输入框即可,`, - - 'movie content template': `电影文本模板`, - 'movie content template desc 1': `设置选择电影后导入的文本内容模板,`, - 'movie content template desc 2': `支持以下参数名称 :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, - 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, - 'movie content template desc 6': `{{image}}, {{url}}`, - - 'book content template': `书籍文本模板`, - 'book content template desc 1': `设置选择书籍后导入的文本内容模板,`, - 'book content template desc 2': `支持以下参数名称 :`, - 'book content template desc 3': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, - 'book content template desc 4': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, - 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, - 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, - - 'music content template': `音乐文本模板`, - 'music content template desc 1': `设置选择音乐后导入的文本内容模板,`, - 'music content template desc 2': `支持以下参数名称 :`, - 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, - 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, - 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, - 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, - - 'note content template': `日记文本模板`, - 'note content template desc 1': `设置选择日记后导入的文本内容模板,`, - 'note content template desc 2': `支持以下参数名称 :`, - 'note content template desc 3': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, - 'note content template desc 4': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, - 'note content template desc 5': `{{content}}`, - - - 'Date format': `参数日期格式`, - 'This format will be used when available template variables contain date.': - `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`, - - 'DateTime format': `参数时间格式`, - 'This format will be used when available template variables contain dateTime.': - `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`, - 'For more syntax, refer to': `详细介绍请参考`, - 'Your current syntax looks like this':`时间参数时间格式预览`, - 'format reference': `格式参考`, - 'Array Spilt String':`数组分割字符串`, - 'string to join between array type, such as author, actor':`当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如 演员列表等`, - 'Douban Request Headers':`豆瓣HTTP请求头`, - 'Douban Request Headers Desc': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n - 参数获取方式为:\n - 1. 访问http://www.douban.com - 2. 复制请求头,仅复制以下请求头 `, - 'current version not support type': `暂时不支持该类型导入,请至github提交issuess获取帮助`, - 'Douban': `豆瓣网`, - - 'Person Name Language Mode':'人名显示模式', - 'options:':"可选项:", - 'Chinese Name mode, only show Chinese name':'中文名称模式, 人名只显示中文名', - 'English Name mode, only show English name':'英文名称模式, 人名只显示英文名', - 'Chinese English Name mode, show Chinese English name both':'中文和英文名称模式, 人名同时显示中文和英文名', - 'Chinese Name': '中文名', - 'English Name': '英文名', - 'Chinese And English Name': '中文名和英文名', - - "Fetch Data Error": "获取数据失败,您如有需要请至Github提交Issues", - "Obsidian Douban Plugin Error: ": "Obsidian Douban插件错误提示:", - "Obsidian Douban Plugin Warn: ": "Obsidian Douban插件异常提示:", - -} \ No newline at end of file +//简体中文 +export default { + //main.ts + '110001': '用当前文档名搜索豆瓣并写入当前文档', + '110002': '在豆瓣搜索并写入到当前文档', + '110003': `输入搜索内容:`, + '110004': `搜索`, + '110005': `取消`, + '110006': `同步豆瓣广播至Obsidian`, + + //DoubanSettingTab + '1201' : `Obsidian-豆瓣`, + '120001': `豆瓣搜索地址`, + '120002': `豆瓣搜索页面请求地址, 通常是网页搜索的地址. `, + '120003': `先访问:`, + '120004': `然后在搜索输入框不输入任何内容,直接点击搜索,`, + '120005': `所跳转的网页地址即是搜索地址,`, + '120006': `将网页地址复制到当前输入框即可,`, + + '120101': `电影文本模板`, + '120102': `设置选择电影后导入的文本内容模板,`, + '120103': `支持以下参数名称 :`, + '120104': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, + '120105': `{{score}}, {{datePublished}}, {{director}},`, + '120106': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, + '120107': `{{image}}, {{url}}`, + + '120201': `书籍文本模板`, + '120202': `设置选择书籍后导入的文本内容模板,`, + '120203': `支持以下参数名称 :`, + '120204': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, + '120205': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, + '120206': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, + '120207': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, + + '120301': `音乐文本模板`, + '120302': `设置选择音乐后导入的文本内容模板,`, + '120303': `支持以下参数名称 :`, + '120304': `{{id}}, {{title}}, {{actor}}, {{genre}},`, + '120305': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, + '120306': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, + '120307': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, + + '120401': `日记文本模板`, + '120402': `设置选择日记后导入的文本内容模板,`, + '120403': `支持以下参数名称 :`, + '120404': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, + '120405': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, + '120406': `{{content}}`, + + + '120501': `参数日期格式`, + '120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`, + '120502': `参数时间格式`, + '120504': `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`, + '120506': `详细介绍请参考`, + '120507': `时间参数时间格式预览`, + '120508': `格式参考`, + '120601': `数组分割字符串`, + '120602': `当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如 演员列表等`, + '120701': `豆瓣HTTP请求头`, + '120702': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n + 参数获取方式为:\n + 1. 访问http://www.douban.com + 2. 复制请求头,仅复制以下请求头 `, + '120801': `暂时不支持该类型导入,请至github提交issuess获取帮助`, + '120901': `豆瓣网`, + + '121201': `人名显示模式`, + '121202': `可选项:`, + '121203': `中文名称模式, 人名只显示中文名`, + '121204': `英文名称模式, 人名只显示英文名`, + '121205': `中文和英文名称模式, 人名同时显示中文和英文名`, + '121206': `中文名`, + '121207': `英文名`, + '121208': `中文名和英文名`, + + '130101': `获取数据失败,您如有需要请至Github提交Issues`, + '130102': `Obsidian Douban插件错误提示:`, + '130103': `Obsidian Douban插件异常提示:`, + '140101': `当前版本暂不支持该类型导入,请升级Obsidian Douban或至github提交issuess获取帮助`, + + +} diff --git a/src/typings/tiny-network.d.ts b/src/typings/tiny-network.d.ts deleted file mode 100644 index 03d3fb7..0000000 --- a/src/typings/tiny-network.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module 'tiny-network' { - export function get(url:string, headers:any): any; - export function get(url:string): any; - export function readStream(param:any): any; - export function ensureStatusCode(code:number): any; -} \ No newline at end of file diff --git a/src/utils/HttpUtil.ts b/src/utils/HttpUtil.ts deleted file mode 100644 index 5d2b583..0000000 --- a/src/utils/HttpUtil.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as https from 'https'; - -import { get } from 'tiny-network'; -import { log } from './Logutil'; - -export default class HttpUtil { - - static getHttps(url:string, options:any):Promise { - return new Promise( - function (resolve, reject) { - https.get(url + '/', options, (response) => { - console.log('url:', url + '/'); - console.log('statusCode:', response.statusCode); - console.log('headers:', response.headers); - if (response.statusCode === 200) { - response.on('data', (d) => { - resolve(d); - }); - } if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode == 303) { - resolve(response.headers.location); - } else { - reject(new Error(response.statusMessage)); - } - response.on('data', (d) => { - process.stdout.write(d); - }); - - }).on('error', (e) => { - reject(new Error('XMLHttpRequest Error: ' + e.message)); - }); - - }); - } -} \ No newline at end of file diff --git a/src/utils/Logutil.ts b/src/utils/Logutil.ts index 21e3793..f2a7752 100644 --- a/src/utils/Logutil.ts +++ b/src/utils/Logutil.ts @@ -1,35 +1,35 @@ -import { Notice } from "obsidian"; -import SchemaOrg from "./SchemaOrg"; -import { i18nHelper } from "src/lang/helper"; - -class Logger { - - public error(e:any):any { - new Notice(i18nHelper.getMessage("Obsidian Douban Plugin Error:") + e); - return e; - } - - public warn(e:any):any { - new Notice(i18nHelper.getMessage("Obsidian Douban Plugin Warn:") + e); - return e; - } - - public info(e:any):any { - // console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } - - public trace(e:any):any { - // return e; - // console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } - - public traceN(notion:string, e:any):any { - // return e; - // console.log(`${notion} ${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } -} - -export const log:Logger = new Logger(); \ No newline at end of file +import { Notice } from "obsidian"; +import SchemaOrg from "./SchemaOrg"; +import { i18nHelper } from "src/lang/helper"; + +class Logger { + + public error(e:any):any { + new Notice(i18nHelper.getMessage('130201') + e); + return e; + } + + public warn(e:any):any { + new Notice(i18nHelper.getMessage('130301') + e); + return e; + } + + public info(e:any):any { + console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + return e; + } + + public trace(e:any):any { + // return e; + console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); + return e; + } + + public traceN(notion:string, e:any):any { + // return e; + console.log(`${notion} ${typeof e == 'string' ? e : JSON.stringify(e)}`); + return e; + } +} + +export const log:Logger = new Logger();