diff --git a/douban/Douban.ts b/douban/Douban.ts index a3e2765..10cc5b9 100644 --- a/douban/Douban.ts +++ b/douban/Douban.ts @@ -18,7 +18,7 @@ export const DEFAULT_SETTINGS:DoubanPluginSettings = { "---\n" + "title: {{title}}" + "cast: {{cast}}" + - "score: {{score}}" + + "score: {{score}}\n" + "---", searchUrl: 'https://www.douban.com/search?q=', searchHeaders: JSON.stringify(doubanHeadrs) diff --git a/douban/DoubanExtractHandler.ts b/douban/DoubanExtractHandler.ts deleted file mode 100644 index e67e047..0000000 --- a/douban/DoubanExtractHandler.ts +++ /dev/null @@ -1,28 +0,0 @@ -import DoubanPlugin from "main"; -import { App } from "obsidian"; -import DoubanMovieLoadHandler from "./handler/DoubanMovieLoadHandler"; -import DoubanSubjectLoadHandler from "./handler/DoubanSubjectLoadHandler"; -import DoubanSubject from "./model/DoubanSubject"; - -export class DoubanEtractHandler { - - private _app:App; - private _doubanPlugin:DoubanPlugin; - private _doubanSubjectHandlers:DoubanSubjectLoadHandler[]; - - public DoubanEtractHandler(app:App, doubanPlugin:DoubanPlugin) { - this._app = app; - this._doubanPlugin = doubanPlugin; - this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(), ] - } - - public getSubjectTextById(searchExtract:DoubanSubject):string | undefined{ - if(!searchExtract) { - return; - } - - - } - -} - diff --git a/douban/DoubanSearchModal.ts b/douban/DoubanSearchModal.ts deleted file mode 100644 index 975c798..0000000 --- a/douban/DoubanSearchModal.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { App, Editor, Modal, TextComponent } from "obsidian"; -import { log } from "utils/logutil"; -import DoubanPlugin from "../main"; - -export class DoubanSearchModal extends Modal { - searchTerm: string; - plugin: DoubanPlugin; - editor: Editor; - - constructor(app: App, plugin: DoubanPlugin, editor: Editor) { - super(app); - this.plugin = plugin; - this.editor = editor; - } - - onOpen() { - let { contentEl } = this; - - contentEl.createEl("h2", { text: "Enter Search Term:" }); - - const inputs = contentEl.createDiv("inputs"); - const searchInput = new TextComponent(inputs).onChange((searchTerm) => { - this.searchTerm = searchTerm; - }); - searchInput.inputEl.focus(); - searchInput.inputEl.addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this.search(); - } - }); - - - - const controls = contentEl.createDiv("controls"); - const searchButton = controls.createEl("button", { - text: "Search", - cls: "mod-cta", - attr: { - autofocus: true, - }, - }); - searchButton.addEventListener("click", this.close.bind(this)); - const cancelButton = controls.createEl("button", { text: "Cancel" }); - cancelButton.addEventListener("click", this.close.bind(this)); - } - async search() { - log.info("start search :" + this.searchTerm); - let { contentEl } = this; - contentEl.empty(); - if (this.searchTerm) { - this.close(); - await this.plugin.search(this.searchTerm); - // await this.plugin.pasteIntoEditor(this.editor, null); - - } - } - - - - async onClose() { - let { contentEl } = this; - - contentEl.empty(); - if (this.searchTerm) { - // await this.plugin.pasteIntoEditor(this.editor, this.searchTerm); - } - } - - } \ No newline at end of file diff --git a/douban/handler/DoubanAbstractLoadHandler.ts b/douban/handler/DoubanAbstractLoadHandler.ts index 8eb9b47..45297e9 100644 --- a/douban/handler/DoubanAbstractLoadHandler.ts +++ b/douban/handler/DoubanAbstractLoadHandler.ts @@ -1,19 +1,34 @@ import { DoubanPluginSettings } from "douban/Douban"; import DoubanSubject from "douban/model/DoubanSubject"; +import cheerio, { CheerioAPI } from "cheerio"; +import { get, readStream } from "tiny-network"; +import { log } from "utils/logutil"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; +import DoubanPlugin from "main"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { - doubanSettings:DoubanPluginSettings; + doubanPlugin:DoubanPlugin; - DoubanAbstractLoadHandler(doubanSettings:DoubanPluginSettings) { - this.doubanSettings = doubanSettings; + constructor(doubanPlugin:DoubanPlugin) { + this.doubanPlugin = doubanPlugin; } - abstract getSubject(url:string): T; - abstract getTextResult(url:string): string; - abstract getType(): string; + handle(url:string):void { + Promise + .resolve() + .then(() => get(url, JSON.parse(this.doubanPlugin.settings.searchHeaders))) + .then(readStream) + .then(log.info) + .then(cheerio.load) + .then(this.parseSubjectFromHtml); + + } + + abstract parseSubjectFromHtml(data:CheerioAPI):T | undefined; + + abstract getType(): string | undefined; diff --git a/douban/handler/DoubanExtractHandler.ts b/douban/handler/DoubanExtractHandler.ts new file mode 100644 index 0000000..697fda4 --- /dev/null +++ b/douban/handler/DoubanExtractHandler.ts @@ -0,0 +1,31 @@ +import DoubanPlugin from "main"; +import { App } from "obsidian"; +import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler"; +import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; +import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; +import DoubanSubject from "../model/DoubanSubject"; + +export class DoubanEtractHandler { + + private _app:App; + private _doubanPlugin:DoubanPlugin; + private _doubanSubjectHandlers:DoubanSubjectLoadHandler[]; + + constructor(app:App, doubanPlugin:DoubanPlugin) { + this._app = app; + this._doubanPlugin = doubanPlugin; + this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(this._doubanPlugin), + new DoubanOtherLoadHandler(this._doubanPlugin)]; + } + + public handle(searchExtract:DoubanSubject):void{ + if(!searchExtract) { + return; + } + this._doubanSubjectHandlers + .filter(h => h.support) + .forEach(h => h.handle(searchExtract.url)); + } + +} + diff --git a/douban/handler/DoubanMovieLoadHandler.ts b/douban/handler/DoubanMovieLoadHandler.ts index c103f6f..8c581ce 100644 --- a/douban/handler/DoubanMovieLoadHandler.ts +++ b/douban/handler/DoubanMovieLoadHandler.ts @@ -3,42 +3,21 @@ import { get, readStream } from "tiny-network"; import { log } from "utils/logutil"; import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; import cheerio, { CheerioAPI } from 'cheerio'; +import { DoubanPluginSettings } from "douban/Douban"; +import DoubanPlugin from "main"; export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { - - - - getSubject(url:string): DoubanMovieSubject { - return this.fetchFromDouban(url); - } - getTextResult(url:string): string { - throw new Error("Method not implemented."); - } - getType(): string { - throw new Error("Method not implemented."); - } - - fetchFromDouban(url:string):DoubanMovieSubject { - const reuslt = await this.fetchFromDoubanWeb(url); - return reuslt; + + constructor(doubanPlugin:DoubanPlugin) { + super(doubanPlugin); } - fetchFromDoubanWeb(url:string):Promise { - return Promise - .resolve() - .then(() => get(url, JSON.parse(this.doubanSettings.searchHeaders))) - .then(readStream) - .then(log.info) - .then(cheerio.load) - .then(this.parseMovieSubjectFromHtml); - } - - parseMovieSubjectFromHtml(responseHtml:CheerioAPI):DoubanMovieSubject { - return responseHtml('.result') + parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject { + return data('.result') .get() .map((i:any) => { - const item = responseHtml(i); + const item = data(i); var idPattern = /(\d){5,10}/g; var urlPattern = /(https%3A%2F%2F)\S+(\d){5,10}/g; var linkValue = item.find("div.content > div > h3 > a").text(); @@ -60,8 +39,13 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { - getSubject(): DoubanSubject { - throw new Error("Method not implemented."); - } - getTextResult(): string { - throw new Error("Method not implemented."); - } - getType(): string { + parseSubjectFromHtml(data: CheerioAPI): DoubanSubject | undefined{ return undefined; } + getType(): string | undefined{ + return undefined + } + diff --git a/douban/handler/DoubanSubjectLoadHandler.ts b/douban/handler/DoubanSubjectLoadHandler.ts index acb028c..9d92402 100644 --- a/douban/handler/DoubanSubjectLoadHandler.ts +++ b/douban/handler/DoubanSubjectLoadHandler.ts @@ -2,12 +2,11 @@ import DoubanSubject from "douban/model/DoubanSubject"; export default interface DoubanSubjectLoadHandler { - getType():string; + getType():string | undefined; support(extract:DoubanSubject):boolean; - getSubject(url:string):T; + handle(url:string):void; - getTextResult(url:string):string; } \ No newline at end of file diff --git a/douban/movie/Movie.ts b/douban/movie/Movie.ts deleted file mode 100644 index 30fb520..0000000 --- a/douban/movie/Movie.ts +++ /dev/null @@ -1,54 +0,0 @@ -import cheerio from 'cheerio'; -import { DoubanExtract, doubanHeadrs } from 'douban/Douban'; -import { get, readStream } from 'tiny-network'; -import { ensureStatusCode } from 'douban/ResponseHandle'; - - -interface DoubanMovieExtract extends DoubanExtract { - -} - -export const playing = (city:string) => { - return Promise - .resolve() - .then(() => get(`https://movie.douban.com/cinema/nowplaying/${city}/`)) - .then(ensureStatusCode(200)) - .then(readStream) - .then(cheerio.load) - .then(parsePlaying) -}; - - -export const parsePlaying = (dataHtml:any) => { - return dataHtml('.list-item') - .get() - .map((i:any) => { - const item = dataHtml(i); - console.log("version 5"); - const result = { - id: item.attr('id'), - title: item.attr('data-title'), - score: item.attr('data-score'), - duration: item.attr('data-duration'), - region: item.attr('data-region'), - director: item.attr('data-director'), - actors: item.attr('data-actors'), - poster: item.find('.poster img').attr('src'), - link: `https://movie.douban.com/subject/${item.attr('id')}`, - }; - // console.log("content is " + JSON.stringify(result)); - - return result; - }) - }; - - - - - - - - - - - diff --git a/douban/search/DoubanSearchFuzzySuggestModal.ts b/douban/search/DoubanSearchFuzzySuggestModal.ts index 6a812e4..c4ae11c 100644 --- a/douban/search/DoubanSearchFuzzySuggestModal.ts +++ b/douban/search/DoubanSearchFuzzySuggestModal.ts @@ -1,17 +1,17 @@ +import DoubanSearchResultSubject from "douban/model/DoubanSearchResultSubject"; import DoubanPlugin from "main"; import { FuzzySuggestModal,App } from "obsidian"; import { log } from "utils/logutil"; -import { DoubanSearchResultExtract } from "./SearchParser"; export {DoubanFuzzySuggester} -class DoubanFuzzySuggester extends FuzzySuggestModal { +class DoubanFuzzySuggester extends FuzzySuggestModal { public app: App; private plugin: DoubanPlugin; - private doubanSearchResultExtract:DoubanSearchResultExtract[] + private doubanSearchResultExtract:DoubanSearchResultSubject[] constructor(app: App, plugin: DoubanPlugin) { super(app); @@ -35,20 +35,20 @@ class DoubanFuzzySuggester extends FuzzySuggestModal } } - getItems(): DoubanSearchResultExtract[] { + getItems(): DoubanSearchResultSubject[] { return this.doubanSearchResultExtract; } - getItemText(item: DoubanSearchResultExtract): string { + getItemText(item: DoubanSearchResultSubject): string { let text:string = item.type + "/" + item.score + "/" + item.title + "/" + item.cast; return text; } - onChooseItem(item: DoubanSearchResultExtract, evt: MouseEvent | KeyboardEvent): void { - this.plugin.geDoubanMovieTextForSearchTerm + onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void { + this.plugin.doubanEtractHandler.handle(item); } - public showSearchList(doubanSearchResultExtractList:DoubanSearchResultExtract[]) { + public showSearchList(doubanSearchResultExtractList:DoubanSearchResultSubject[]) { this.doubanSearchResultExtract = doubanSearchResultExtractList; log.info("show search result" ); this.start();