generated from obsidianmd/obsidian-sample-plugin
-
-
Notifications
You must be signed in to change notification settings - Fork 45
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
5 changed files
with
186 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
import { Application, Context, createHttpExceptionBody } from "https://deno.land/x/abc@v1.3.3/mod.ts"; | ||
import { DOMParser } from "https://deno.land/x/deno_dom/deno-dom-wasm.ts"; | ||
import { NodeList } from "https://deno.land/x/deno_dom@v0.1.21-alpha/src/dom/node-list.ts"; | ||
import { Definition, DictionaryWord } from "./types.ts"; | ||
|
||
const app = new Application(); | ||
|
||
const LANGUAGES = { | ||
'en': 'english', | ||
'de': 'deutsch', | ||
} | ||
|
||
console.log("http://localhost:5000/"); | ||
|
||
app | ||
.get("/v1/definition", async (ctx: Context) => { | ||
const lang = LANGUAGES[ctx.queryParams.lang as keyof typeof LANGUAGES]; | ||
if(!lang) { | ||
return "Unsupported Language"; | ||
} | ||
|
||
if(!ctx.queryParams.word) { | ||
return "Supply a word"; | ||
} | ||
|
||
try { | ||
const result = await fetch(`https://www.google.co.in/search?q=define+${ctx.queryParams.word.replaceAll(' ', '+')}+${lang}`, { | ||
headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } | ||
}); | ||
|
||
const doc = new DOMParser().parseFromString(await result.text(), 'text/html')!; | ||
const data = doc.querySelector(`div[data-query-term=${ctx.queryParams.word}]`); | ||
|
||
if(!data) throw ""; | ||
|
||
const def: DictionaryWord = { | ||
phonetics: [], | ||
meanings: [], | ||
word: data.querySelector('span[data-dobid="hdw"]')?.textContent ?? ctx.queryParams.word | ||
}; | ||
|
||
//Something like eɪpr(ɪ)l (April) | ||
const phoneticText = data.querySelector('.LTKOO > span')?.textContent; | ||
if (phoneticText) { | ||
def.phonetics.push({ | ||
text: phoneticText, | ||
audio: data.querySelector('audio > source')?.getAttribute('src') ?? undefined | ||
}); | ||
} | ||
|
||
//Something like noun | ||
const type = data.querySelector('.vmod i')?.textContent; | ||
if (type) { | ||
const defGenerator = (defs: NodeList) => { | ||
|
||
const out: Definition[] = []; | ||
const syns: string[] = []; | ||
const tmp = data.querySelectorAll('.lr_container div[role="button"] span'); | ||
tmp.forEach((el) => { | ||
if (!el.parentElement?.getAttribute('data-topic') && el.textContent) { | ||
syns.push(el.textContent.trim()); | ||
} | ||
}) | ||
defs.forEach((el, idx) => { | ||
out.push({ | ||
definition: el.textContent, | ||
example: el.nextSibling?.textContent, | ||
synonyms: !idx ? syns : undefined | ||
}) | ||
}) | ||
return out; | ||
} | ||
|
||
def.meanings.push({ | ||
partOfSpeech: type, | ||
definitions: defGenerator(data.querySelectorAll('div[data-dobid="dfn"]')) | ||
}); | ||
} | ||
|
||
return def; | ||
} catch (_) { | ||
return createHttpExceptionBody('No definition found'); | ||
} | ||
}) | ||
.start({ port: 5000 }); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
import type { Definition, DefinitionProvider, DictionaryWord, PartOfSpeech, Synonym, SynonymProvider } from "src/integrations/types"; | ||
import { requestUrl } from "obsidian"; | ||
|
||
class Base { | ||
name = "Google"; | ||
url?: "https://support.google.com/websearch/answer/10106608"; | ||
offline = false; | ||
supportedLanguages = [ | ||
"en_US", | ||
"de", | ||
"es", | ||
"fr" | ||
]; | ||
|
||
static LANGUAGES = { | ||
'en_US': 'english', | ||
'de': 'deutsch', | ||
"es": "Español", | ||
"fr": "Français" | ||
} | ||
} | ||
|
||
export class GoogleScraperDefinitionProvider extends Base implements DefinitionProvider { | ||
async requestDefinitions(query: string, lang: string): Promise<DictionaryWord> { | ||
const result = await requestUrl({ | ||
url: `https://www.google.com/search?q=define+${query.replace(/\s/g, '+')}+${GoogleScraperDefinitionProvider.LANGUAGES[lang]}`, | ||
headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } | ||
}); | ||
console.log(result); | ||
|
||
const doc = new DOMParser().parseFromString(result.text, 'text/html'); | ||
const data = doc.querySelector(`div[data-query-term=${query}]`); | ||
|
||
if (!data) throw ""; | ||
|
||
const def: DictionaryWord = { | ||
phonetics: [], | ||
meanings: [], | ||
word: data.querySelector('span[data-dobid="hdw"]')?.textContent ?? query | ||
}; | ||
|
||
//Something like eɪpr(ɪ)l (April) | ||
const phoneticText = data.querySelector('.LTKOO > span')?.textContent; | ||
if (phoneticText) { | ||
def.phonetics.push({ | ||
text: phoneticText, | ||
audio: data.querySelector('audio > source')?.getAttribute('src') ?? undefined | ||
}); | ||
} | ||
|
||
//Something like noun | ||
const type = data.querySelector('.vmod i')?.textContent; | ||
if (type) { | ||
const defGenerator = (defs: NodeList) => { | ||
|
||
const out: Definition[] = []; | ||
const syns: string[] = []; | ||
const tmp = data.querySelectorAll('.lr_container div[role="button"] span'); | ||
tmp.forEach((el) => { | ||
if (!el.parentElement?.getAttribute('data-topic') && el.textContent) { | ||
syns.push(el.textContent.trim()); | ||
} | ||
}) | ||
defs.forEach((el, idx) => { | ||
out.push({ | ||
definition: el.textContent, | ||
example: el.nextSibling?.textContent, | ||
synonyms: !idx ? syns : undefined | ||
}) | ||
}) | ||
return out; | ||
} | ||
|
||
def.meanings.push({ | ||
partOfSpeech: type, | ||
definitions: defGenerator(data.querySelectorAll('div[data-dobid="dfn"]')) | ||
}); | ||
} | ||
|
||
return def; | ||
} | ||
} | ||
|
||
export class GoogleScraperSynonymProvider extends Base implements SynonymProvider { | ||
provider: GoogleScraperDefinitionProvider; | ||
constructor() { | ||
super(); | ||
this.provider = new GoogleScraperDefinitionProvider(); | ||
} | ||
|
||
async requestSynonyms(query: string, lang: string, _?: PartOfSpeech): Promise<Synonym[]> { | ||
return (await this.provider.requestDefinitions(query, lang)).meanings.first().definitions.first().synonyms.map<Synonym>(synonym => { return { word: synonym } }); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters