Deno wyszukuje emoji
Jak znaleźć emoji z terminala
Postanowiłam napisać małe narządko do wyszukiwania emoji z wiersza poleceń. Czasem potrzebuję odpowiedniego obrazka podczas pisania testu na bloga albo chcę sprawdzić, czy istnieje emoji na jakąś okazję. Nie chcę w tym celu odpalać przeglądarki. Pomyślałam więc sobie, że zrobię to używając Deno.
Wyszukiwarka emoji
W moim podejściu - jak zwykle i z konieczności “na szybko” - parsuję stronę html zwróconą przez zapytanie HTTP na https://emojipedia.org. Okazuje się, że wyszukiwarka emoji akceptuje zwykłe zapytanie GET z parametrem q: aby więc zapytać o emoji związane z domem, wystarczy wysłać https://emojipedia.org/search/?q=house.
Parsowanie
Obejrzałam źródło strony zwróconej przez wyszukiwarkę. Sprawdziłam, że wystarczy znaleźć element listy <ol class="search-results"> i przeszukać jej elementy, zawierające ikonę w elemencie <span class="emoji"> oraz opis w elemencie <p>:

Moduł deno_dom
Do parsowania używam modułu https://deno.land/x/deno_dom/deno-dom-wasm.ts (strona deno_dom na deno.land):
import {
DOMParser,
Element,
HTMLDocument,
HTMLCollection }
from "https://deno.land/x/deno_dom/deno-dom-wasm.ts";Do parsowania źródła strony użyję interfejsu DOMParser, który jest częścią WebAPI.
Żądana fraza w argumentach programu
Wyobrażam sobie, że mój program wczyta szukaną frazę jako argument(y) wywołania, więc na przykład mogę wywołać go tak:
deno run --allow-net main.ts housebądź tak:
deno run --allow-net main.ts woman techW programie odczytam argumenty wywołania ze zmiennej Deno.args i skonstruuję na tej podstawie URL:
const BASE_URL = "https://emojipedia.org/search/?q="
const url = BASE_URL + Deno.args.join("+")Pobranie źródła strony
Najpierw muszę mieć jednak źródło strony.
Użyję API fetch, w funkcji fetchFile, która zwróci Promise<string>:
const fetchFile = async (url:string): Promise<string> => {
const fresp = await fetch(url)
if (fresp.ok) {
return fresp.text()
} else
throw new Error("Something wrong")
}Zdefiniowanie typu Emo
Chcę wydłubać ikonę oraz jej opis, definiuję więc prosty “typ” Emo:
type Emo = {
e: string,
desc: string,
}Parsowanie treści strony - lista Emo
Piszę funkcję getEmos, która zawiera logikę parsowania treści strony (zwróconej przez fetchFile) - ta funkcja zwróci (być może pustą) listę Emo:
const mkDOM = (s: string): HTMLDocument|null => {
return new DOMParser().parseFromString(s, 'text/html')
}
function getEmos(content: string): Emo[] {
const d = mkDOM(content)
const getOl = (d: HTMLDocument) =>
d.getElementsByClassName('search-results')[0]
const itemToEmo = (li: Element) =>
({e: emostr(li), desc: emodesc(li)})
const emostr = (el: Element) =>
el.getElementsByClassName('emoji')[0].textContent
const emodesc = (el: Element) =>
el.getElementsByTagName('p')[0].textContent
return d ?
new Array(...getOl(d).children).map(itemToEmo) :
[]
}- mkDOM: krok pierwszy to uzyskanie modelu obiektowego strony (DOM) - tutaj właśnie, w funkcji
mkDOM, używam interfejsuDOMParser - getOl: teraz wyszukuję elementu
olz klasąsearch-results(z jej “dzieci”, elementówli, tworzę listę, której elementy mapuję na obiektyEmo - emostr: wewnątrz
liszukam tekstowej zawartości elementuspanz klasą ’emoji’ - to właśnie emoji, którego szukam - emodesc: wewnątrz
liszukam elementup- to opis emoji - itemToEmo: funkcja mapująca
linaEmo, tworzy prosty obiektEmowywołującemostriemmodesc
Pewnie da się to zrobić jakoś bardziej inteligentnie, ale rozbiłam to na małe kroczki, żeby kod był czytelny.
Program główny
Główny program zajmuje teraz dwa wiersze kodu:
const emoPrinter = (emo: Emo) => {
console.log(`${emo.e} - ${emo.desc}`)
}
if (import.meta.main) {
const url = BASE_URL + Deno.args.join("+")
getEmos(await fetchFile(url)).map(emoPrinter)
}Rezultat:
Oto rezultat działania programu po wywołaniu:
deno run --allow-net main.ts woman
Tutaj wyjście programu na konsolę:
[karma@tpd|~/d/j/emo] (main) λ deno run --allow-net main.ts woman
👩 - Emoji Meaning A woman of adult age. Differentiated from the girl emoji by the lack of pig-tails in her hair. …
👵 - Emoji Meaning An elderly woman with gray (grey) hair, and visible wrinkles. Wears glasses on some platforms. …
🤰 - Emoji Meaning A pregnant woman, intended to complete the family emoji set. Sometimes used in jest to represent feeling full after…
👡 - Emoji Meaning A sandal worn by a woman in summer, spring, or other weather that suits open-toed footwear. Has a heel at the back…
👚 - Emoji Meaning A blouse worn by women in a neat-casual setting. Shown in pink on Apple devices, yellow on Android, and purple on…
🙅♀️ - Emoji Meaning A woman with arms crossed forming an ‘X’ to indicate ‘no’ or ‘no good’. This motion is used on the TV game show Deal or No…
👩🚀 - Emoji Meaning A female astronaut or cosmonaut shown wearing a space suit and helmet. The Woman Astronaut emoji is a ZWJ…
👩💻 - Emoji Meaning A woman behind a computer screen, working in the field of technology. See also: 👨💻 Male Technologist The…
🚶♀️ - Emoji Meaning The female version of the 🚶 Pedestrian emoji. The Woman Walking emoji is a ZWJ sequence combining 🚶 Person…
🤦♀️ - Emoji Meaning The Woman Facepalming emoji is a ZWJ sequence combining 🤦 Person Facepalming, Zero Width Joiner and ♀️…
🤷♀️ - Emoji Meaning The Woman Shrugging emoji is a ZWJ sequence combining 🤷 Person Shrugging, Zero Width Joiner and ♀️ Female…
🤸♀️ - Emoji Meaning The Woman Cartwheeling emoji is a ZWJ sequence combining 🤸 Person Cartwheeling, Zero Width Joiner and ♀️…
🧏♀️ - Emoji Meaning The Deaf Woman emoji is a ZWJ sequence combining 🧏 Deaf Person, Zero Width Joiner and ♀️ Female Sign. …
🦹♀️ - Emoji Meaning The Woman Supervillain emoji is a ZWJ sequence combining 🦹 Supervillain, Zero Width Joiner and ♀️ Female…
👩🌾 - Emoji Meaning The Woman Farmer emoji is a ZWJ sequence combining 👩 Woman, Zero Width Joiner and 🌾 Sheaf of Rice. …
👩🚒 - Emoji Meaning The Woman Firefighter emoji is a ZWJ sequence combining 👩 Woman, Zero Width Joiner and 🚒 Fire Engine. …
🏃♀️ - Emoji Meaning The female version of the 🏃 Runner emoji. The Woman Running emoji is a ZWJ sequence combining 🏃 Person…
🏄♀️ - Emoji Meaning The female version of the 🏄 Surfer emoji. The Woman Surfing emoji is a ZWJ sequence combining 🏄 Person…
🚴♀️ - Emoji Meaning The female version of the 🚴 Bicyclist emoji. The Woman Biking emoji is a ZWJ sequence combining 🚴 Person…
🧎♀️ - Emoji Meaning The Woman Kneeling emoji is a ZWJ sequence combining 🧎 Person Kneeling, Zero Width Joiner and ♀️ Female…Github
Wrzucone na githuba ku pamięci: deno emoji termial search