UNPKG

node-hitomi

Version:
167 lines (164 loc) 4.16 kB
import { Base } from '../internal/base.js'; import { HitomiError } from './error.js'; import { Gallery } from './gallery.js'; class Language extends Base { constructor(hitomi, name, localName) { super(hitomi); this.name = name; this.localName = localName; this.url = '/index-' + name + '.html'; } toTag(isNegative = false) { return new Tag(this.hitomi, 'language', this.name, isNegative); } } Language.ORDERED = [ ['indonesian', 'Bahasa Indonesia'], ['javanese', 'Basa Jawa'], ['catalan', 'Català'], ['cebuano', 'Cebuano'], ['czech', 'Čeština'], ['danish', 'Dansk'], ['german', 'Deutsch'], ['estonian', 'Eesti'], ['english', 'English'], ['spanish', 'Español'], ['esperanto', 'Esperanto'], ['french', 'Français'], ['hindi', 'Hindi'], ['icelandic', 'Íslenska'], ['italian', 'Italiano'], ['latin', 'Latina'], ['hungarian', 'Magyar'], ['dutch', 'Nederlands'], ['norwegian', 'Norsk'], ['polish', 'Polski'], ['portuguese', 'Português'], ['romanian', 'Română'], ['albanian', 'Shqip'], ['slovak', 'Slovenčina'], ['serbian', 'Srpski'], ['finnish', 'Suomi'], ['swedish', 'Svenska'], ['tagalog', 'Tagalog'], ['vietnamese', 'Tiếng Việt'], ['turkish', 'Türkçe'], ['greek', 'Ελληνικά'], ['bulgarian', 'Български'], ['mongolian', 'Монгол'], ['russian', 'Русский'], ['ukrainian', 'Українська'], ['hebrew', 'עברית'], ['arabic', 'العربية'], ['persian', 'فارسی'], ['thai', 'ไทย'], ['burmese', 'မြန်မာဘာသာ'], ['korean', '한국어'], ['chinese', '中文'], ['japanese', '日本語'] ]; Language.NAMES = new Set(); for(let i = 0; i < Language.ORDERED.length; i++) { Language.NAMES.add(Language.ORDERED[i][0]); } class Tag extends Base { static compare(a, b) { if(!(a instanceof Tag)) { return b instanceof Tag ? 1 : 0; } if(!(b instanceof Tag)) { return -1; } return a.isNegative - b.isNegative; } constructor(hitomi, type, name, isNegative = false) { super(hitomi); this.type = type; this.name = name; this.isNegative = isNegative; switch(type) { case 'male': case 'female': { this.url = '/tag/' + type + '%3A'; break; } case 'type': { if(!Gallery.TYPES.has(name)) { throw HitomiError.invalidMember('Name', Gallery.TYPES); } } case 'artist': case 'group': case 'character': case 'series': case 'tag': { this.url = '/' + type + '/'; break; } case 'language': { if(!Language.NAMES.has(name)) { throw HitomiError.invalidMember('Name', Language.NAMES); } this.url = '/index-' + name + '.html'; return; } default: { throw HitomiError.invalidMember('Type', Tag.TYPES); } } this.url += encodeURIComponent(name) + '-all.html'; } async listLanguages() { const languages = []; let term; let i = 0; switch(this.type) { case 'female': case 'male': { term = 'tag/' + this.type + ':' + this.name; break; } case 'language': { for(; i < Language.ORDERED.length; i++) { if(this.name === Language.ORDERED[i][0]) { return [new Language(this.hitomi, Language.ORDERED[i][0], Language.ORDERED[i][1])]; } } throw HitomiError.invalidTagName; } default: { term = this.type + '/' + this.name; } } const version = await this.hitomi.languageIndex.retrieve(); const rootNode = await this.hitomi.languageIndex.getNodeAtAddress(0n, version); if(!rootNode) { throw HitomiError.emptyRootNode; } const data = await this.hitomi.languageIndex.binarySearch(await this.hitomi.hashTerm(term), rootNode, version); if(!data) { throw HitomiError.invalidTagName; } for(let mask = 1n; i < Language.ORDERED.length; i++, mask <<= 1n) { if(data[0] & mask) { languages.push(new Language(this.hitomi, ...Language.ORDERED[i])); } } return languages; } toString(isNegative = this.isNegative) { return (isNegative ? '-' : '') + this.type + ':' + this.name.replace(/ /g, '_'); } } Tag.TYPES = new Set([ 'artist', 'group', 'type', 'language', 'series', 'character', 'male', 'female', 'tag' ]); export { Language, Tag };