Uživatel:ShadyMedic/Anki-WikiDefinice
Tato stránka obsahuje mé poznámky k vývoji Anki doplňku, který by zobrazoval rychlé definice k tématům, ke kterým existuje ve WikiSkriptech článek.
Plánované chování[edit | edit source]
Projekt je inspirován podobným doplňkem vydaným pro Amboss. Tento doplněk však není úplně optimální pro české Anki balíčky, jelikož vyhledává pouze pojmy v angličtině a zároveň obsahuje dost trackovacích prvků, kterých bych se rád zbavil.
Z pohledu uživatele[edit | edit source]
- Otevřu kartičku v režimu opakování nebo náhledu.
- Během okamžiku se žlutě podtrhnou pojmy, ke kterým existuje definice na WikiSkriptech.
- Po najetí na ně myší (na počítači) nebo po klepnutí na ně (na mobilu) se zobrazí pod pojmem zobrazí bublina, která bude obsahovat rychlou definici pojmu. Podobně jako když na WikiSkriptech najedeme myší na odkaz (příklad: Antihistaminika).
- Z této bubliny je možné překliknout přímo do příslušného článku na WikiSkriptech, který se otevře ve výchozím internetovém prohlížeči.
Z pohledu programátora[edit | edit source]
Aby bylo možné zajistit, že doplněk bude fungovat i na mobilu, kde není k dispozici Python kód doplňku, je potřeba využít JavaScript vložený přímo do kartiček.
Přesně takto to dělá i doplněk od Amboss, doplněk v podstatě dělá hlavně to, že do šablon všech typů kartiček vloží následující kód:
<script type="module" src="https://content-gateway.us.production.amboss.com/amboss.js" data-addon="[BASE64-zakódovaný JSON objekt obsahující user ID a token pro přístup do Amboss (jedná se o placenou službu)]==" id="amboss-snippet"></script>
Jakmile můžeme do webview Anki kartiček injektovat JavaScript, můžeme se zobrazovaným obsahem dělat prakticky cokoli.
Můžeme tedy napsat JavaScriptový kód, který se bude starat o hledání pojmů ke zvýraznění, jejich podtrhávání i zobrazování bublin. Tento kód můžeme publikovat na WikiSkriptech jako stránku, avšak bude nutné jí co nejvíce chránit před změnami, jelikož rozbití kódu může ovlivnit tisíce uživatelů. Minimálně úplný zámek (povolení editování pro správce a výše) je nutnost, možná by ale nebylo od věci jít s ochranou ještě dále a omezit editace pro správce rozhraní a administrátory, případě pouze pro uživatele s SSH přístupem k serveru.
Vše co by tedy rozšíření napsané v Pythonu muselo dělat, je vložit do modelů (na rub i líc) všech poznámek JavaScript, pravděpodobně v nějaké takovéto formě:
<script type="module" src="https://www.wikiskripta.eu/index.php?title=MediaWiki:AnkiAddon.js&action=raw" id="wikidefinitions-inject"></script>
Bude potřeba počítat s dvěma dalšími situacemi:
- Uživatel přidá (sám nebo v rámci importu balíčku či kolekce) nový typ poznámky (je potřeba přidat inject JS kódu do nových modelů)
- Uživatel bude chtít odinstalovat doplněk a uvést kartičky do původního stavu (je potřeba odstranit inject JS kódu ze všech modelů)
Akce prováděné injektovaným JavaScriptem[edit | edit source]
Po otevření kartičky (a načtení JavaScriptu) se stane následující:
1. Z webu se stáhne blacklist pojmů, které se nemají vyhledávat. To bude pravděpodobně nějaká uzamknutá stránka na WikiSkriptech, která bude obsahovat pojmy jako spojky, předložky, zájmena, apod.
GET https://www.wikiskripta.eu/index.php?title=MediaWiki:AnkiAddon-termblacklist&action=raw
2. Skript vezme veškerý viditelný textový obsah na kartičce a rozdělí jej dle mezer na jednotlivá slova.
3. Ze vzniklého pole vyfiltruje pojmy, které jsou na blacklistu staženém v kroku 1.
4. Zbylá slova skript převede do 1. pádu (to bude oříšek) a následně pro ně provede HTTP dotaz na API WikiSkript, odkud získá informace o názvu článku, část textu (před první kapitolou stránky) a náhledový obrázek.
GET https://www.wikiskripta.eu/api.php?action=query&format=json&prop=pageprops%7Cpageimages%7Cextracts%7Cinfo&generator=prefixsearch&redirects=1&converttitles=1&formatversion=2&ppprop=disambiguation&piprop=thumbnail&pithumbsize=100&pilimit=1&exsentences=3&exlimit=1&exintro=1&explaintext=1&inprop=url&gpssearch=[POJEM V PRVNÍM PÁDĚ]&gpsnamespace=0&gpslimit=2
5. Server na dotaz výše navrátí odpověď, která bude obsahovat informace o jednom nebo více článcích.
6. Pokud byly navráceny informace o jednom článku, JavaScript aplikuje na dané slovo event listener (který zajistí spuštění kroku 7 po najetí nebo klepnutí na slovo), CSS styly (které zajistí žluté podtržení) a datovžmi atributy s hodnotami vrácenými v požadavku (název článku, přímý odkaz na obrázek, shrnutí).
7. Po kliknutí na slovo se vytvoří další požadavek na API WikiSkript, který bude mít za úkol získání shrnutí/definice daného tématu nebo pokud už jsou tyto údaje uloženy v datových atributách, rovnou se použijí.
GET https://www.wikiskripta.eu/api.php?action=query&format=json&prop=pageimages%7Cextracts%7Cinfo&list=&titles=[NÁZEV ČLÁNKU]&redirects=1&converttitles=1&formatversion=2&piprop=thumbnail&pithumbsize=100&pilimit=1&exchars=525&exlimit=1&exintro=1&explaintext=1&exsectionformat=plain&inprop=url
Tento dotaz vrátí JSON objekt obsahující mimo jiné tři atributy:
- Odkaz na článek (
https://wikiskripta.eu/w/Antihistaminika
) - Přímý odkaz na obrázek (
https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Bisulepine_0%2C5mg-ml_vial_yellow_background.jpg/261px-Bisulepine_0%2C5mg-ml_vial_yellow_background.jpg
) - Shrnutí článku/rychlou definici (
Antihistaminika jsou léčiva určená k léčbě alergických stavů. Alergii přitom definujeme jako onemocnění s klinickou manifestací na orgánu či tkáni zasaženou alergenem nebo se sníženou rezistencí vůči těmto vlivům. V terapii alergií využíváme v současné době především preparátů blokujících specificky H1 receptory. Zajímavostí je, že se nejedná o antagonistické působení, ale o inverzní agonismus – na receptoru vyvolají opačný účinek, než má histamin.
)
Tyto údaje JavaScript zobrazí v bublině, která se objeví nad nebo pod vybraným pojmem.
Tip: CSS pro bubliny | |
Pro zobrazování bublin u jednotlivých zvýrazněných pojmů lze s drobnými úpravami využít CSS kód z mé aplikace Taptitle (soubory js/watch.js a css/watch.css). |
Alternativní postup[edit | edit source]
Obsah kartičky (všechen viditelný text) se po svém zobrazení odešle na server v rámci jednoho požadavku, zpracování (rozdělení na slova a vyhledání souvisejících článků) zajistí PHP skript a v odpovědi se do Anki vrátí slovník s pojmy na kartičce jako klíče a názvy článků jako hodnoty. Poté už se pokračuje od kroku 7 dále. Na serveru se budou zaznamenávat spárované pojmy s články za účelem zrychlení zpracovávání budoucích požaadavků a bude zde probíhat i kontrola proti blacklistu a jeho plnění.
Akce prováděné serverem WikiSkript[edit | edit source]
Na serveru WikiSkript by bylo potřeba udělat subdoménu (nebo nějaká jiný odizolovaný prostor, kde půjde spouštět PHP skripty pracující s MediaWiki API). Zde budou potřeba dva skripty.
get-article[edit | edit source]
Viz krok 4 výše.
Tento skript by vzal na vstupu pojem z Anki poznámky. Ten může být vyskloňovaný, bez diakritiky, s podivnou kapitalizací apod. Například kartička:
Může jako vstup tomuto skriptu posílat všechna slova, co nebudou na blacklistu (viz krok 1 výše), tady pravděpodobně:
- léčiv
- terapii
- hypertenze
- verapamil
- β-blokátory
Úkolem tohoto skriptu bude pro každý z těchto pojmů vrátit název článku na WikiSkriptech, který se k němu váže, nebo nic, pokud takový článek neexistuje. Tady například:
- NULL (obecná definice léčiva nemá článek)
- NULL (obecná definice terapie nemá článek)
- Arteriální hypertenze
- NULL (článek verapamil neexistuje)
- Beta-blokátory
Tohle bude pravděpodobně nejtěžší část celého programování. Bude potřeba vymyslet algoritmus, který vyzkouší všechny možné variace pro každý článek, od změny velikosti písmen po rozepsání řeckých písmen. Pomoci může extenzivní vytváření přesměrování, které budou ukazovat na cílový článek, jehož název má být navrácen.
- Uživatel:CeSt: A co udělat tento krok pomocí umělé inteligence, která by byla natrénovaná na datech WS a měla by zakázáno hledat jinde? Tím by odpadla spousta problémů, i když za cenu nevyzkoušené technologie :-).
- Uživatel:ShadyMedic: Spíš jsem přemýšlel o nějaké robotické proceduře, která by pro každý článek vyzjistila všechny možné zobrazované texty odkazů v jiných článcích odkazujících na ten cílový. Tím bychom získali všemožné tvary výrazů vztahujících se k danému článku. Otázka je, jestli by to nevytvořilo moc falešných odkazů (typicky když se kvůli větě "Více informací o tomto stavu naleznete zde" prováže výraz "zde" se článem "Hypertenze", bez ohledu na kontext), či naopak zda by toto vygenerovalo dostatečně široké spektrum tvarů pro významný počet článků.
Za účelem zrychlení systému bude každý výsledek každého hledání cachován. Pojmy, ke kterým nebyl nalezen článek, budou rovněž zaznamenávány a následně budou buďto přidány na blacklist (za účelem zrychlení, například obecné a nemedicínské pojmy, např. "používaných") nebo pro ně bude vytvořeno na WikiSkriptech přesměrování na existující článek.
get-summary[edit | edit source]
Viz krok 7 výše.
Tento skript bude na vstupu brát název článku na WikiSkriptech a bude vracet JSON objekt obsahující:
- Odkaz na článek
- Shrnutí článku (buďto první odstavec, nebo obsah podstránky /Shrnutí, rozhodneme-li se jít touto cestou)
- Přímý odkaz na obrázek (je-li dostupný).
Tento skript může prozatím využívat MediaWiki API stejným způsobem, jakým to dělá udělátko vytvářející náhledy článků po najetí na odkaz.