node-hitomi
Version:
Hitomi.la API for Node.js
170 lines (166 loc) • 4.26 kB
JavaScript
'use strict';
const base = require('../internal/base.cjs');
const error = require('./error.cjs');
const gallery = require('./gallery.cjs');
class Language extends base.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.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.Gallery.TYPES.has(name)) {
throw error.HitomiError.invalidMember('Name', gallery.Gallery.TYPES);
}
}
case 'artist':
case 'group':
case 'character':
case 'series':
case 'tag': {
this.url = '/' + type + '/';
break;
}
case 'language': {
if(!Language.NAMES.has(name)) {
throw error.HitomiError.invalidMember('Name', Language.NAMES);
}
this.url = '/index-' + name + '.html';
return;
}
default: {
throw error.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 error.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 error.HitomiError.emptyRootNode;
}
const data = await this.hitomi.languageIndex.binarySearch(await this.hitomi.hashTerm(term), rootNode, version);
if(!data) {
throw error.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'
]);
exports.Language = Language;
exports.Tag = Tag;