UNPKG

@iwater/mdict-ts

Version:

mdict (*.mdx, *.mdd) file reader

159 lines (158 loc) 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRes = exports.getGlobalStyle = exports.createRecordBlockTable = exports.getAdaptKey = exports.readUTF16 = exports.isTrue = exports.parseXml = exports.REGEXP_STRIPKEY = exports.getExtension = exports.readFile = exports.newUint8Array = exports.resolve = exports.textDecoder = exports.dataView = exports.isBrowser = void 0; exports.isBrowser = typeof window !== "undefined"; let dataView, textDecoder, parse; exports.dataView = dataView; exports.textDecoder = textDecoder; if (!exports.isBrowser) { exports.dataView = dataView = require('buffer-dataview'); exports.textDecoder = textDecoder = require('text-encoding').TextDecoder; parse = require('xmldom').DOMParser; } else { exports.dataView = dataView = DataView; exports.textDecoder = textDecoder = TextDecoder; parse = DOMParser; } function resolve(value) { return Promise.resolve(value); } exports.resolve = resolve; function newUint8Array(buf, offset, len) { if (!exports.isBrowser) { const ret = new Uint8Array(len); buf.copy(ret, 0, offset, offset + len); return ret; } else { return new Uint8Array(buf, offset, len); } } exports.newUint8Array = newUint8Array; async function readFile(file, offset, len) { if (exports.isBrowser) { return new Promise(resolve => { const reader = new FileReader(); reader.onload = () => { resolve(reader.result); }; reader.readAsArrayBuffer(file.slice(offset, offset + len)); }); } else { const fs = require('fs'); return new Promise(resolve => { fs.open(file, 'r', (err, fd) => { if (err) throw err; const res = Buffer.alloc(len); fs.read(fd, res, 0, len, offset, (err, bytesRead, buffer) => { if (err) throw err; resolve(buffer); }); }); }); } } exports.readFile = readFile; exports.getExtension = filename => /(?:\.([^.]+))?$/.exec(filename)[1]; exports.REGEXP_STRIPKEY = { 'mdx': /[()., '/\\@_-]()/g, 'mdd': /([.][^.]*$)|[()., '/\\@_-]/g }; function parseXml(xml) { return new parse().parseFromString(xml, 'text/xml'); } exports.parseXml = parseXml; function isTrue(v) { v = ((v || false) + '').toLowerCase(); return v === 'yes' || v === 'true'; } exports.isTrue = isTrue; function readUTF16(buf, len) { return new textDecoder('utf-16le').decode(newUint8Array(buf, 0, len)); } exports.readUTF16 = readUTF16; function getAdaptKey(attrs, ext) { let regexp = exports.REGEXP_STRIPKEY[ext]; if (isTrue(attrs.KeyCaseSensitive)) { return key => { return isTrue(attrs.StripKey) ? key.replace(regexp, '$1') : key; }; } else { return key => { return isTrue(attrs.StripKey || (this.v2 ? '' : 'yes')) ? key.toLowerCase().replace(regexp, '$1') : key.toLowerCase(); }; } } exports.getAdaptKey = getAdaptKey; function createRecordBlockTable() { let pos = 0, arr; return { alloc: function (len) { arr = new Uint32Array(len * 2); }, put: function (offset_comp, offset_decomp) { arr[pos++] = offset_comp; arr[pos++] = offset_decomp; }, find: function (keyAt) { let hi = (arr.length >> 1) - 1, lo = 0, i = (lo + hi) >> 1, val = arr[(i << 1) + 1]; if (keyAt > arr[(hi << 1) + 1] || keyAt < 0) return; while (true) { if (hi - lo <= 1) { if (i < hi) { return { block_no: i, comp_offset: arr[i <<= 1], comp_size: arr[i + 2] - arr[i], decomp_offset: arr[i + 1], decomp_size: arr[i + 3] - arr[i + 1] }; } else { return; } } (keyAt < val) ? hi = i : lo = i; i = (lo + hi) >> 1; val = arr[(i << 1) + 1]; } }, }; } exports.createRecordBlockTable = createRecordBlockTable; function getGlobalStyle(stylesheet) { let res = [], i = 0; stylesheet.split(' ').forEach(e => { if (!e) return; if (isNaN(Number(e))) { if (!res[i]) res[i] = ['']; e.indexOf('/') < 0 ? res[i][0] += (' ' + e) : res[i].push(e); } else { i++; } }); return res; } exports.getGlobalStyle = getGlobalStyle; function parseRes(str, style) { let result = ''; let split = str.split('`'); for (let k = 0; k < split.length; k++) { let num = Number(split[k]); if (split[k] && num) result += (style[num][0] + split[++k] + style[num][1]); } return result; } exports.parseRes = parseRes;