UNPKG

@ginstone/nga-api

Version:

177 lines (176 loc) 6.19 kB
"use strict"; // 静态资源 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResourceApi = void 0; const axios_1 = require("axios"); const ObjUtils_1 = require("../utils/ObjUtils"); const Forum_1 = require("../response/Forum"); const Emote_1 = require("../response/Emote"); const CommonUiData_1 = require("../response/CommonUiData"); // 使用gbk解码的axios实例 const instance = axios_1.default.create({ responseType: 'blob', // @ts-ignore transformResponse: [function (data) { let reader = new FileReader(); reader.readAsText(data, 'GB18030'); // return reader.result return new Promise(resolve => { reader.onload = function () { resolve(reader.result); }; }); }] }); // /** * 从 js_bbscode_core.js 文件中解析数据 * @param data 原始数据按 \n切分之后的数组 * @param prefix 该段数据开始的标识 * @param suffix 该段数据结束的标识 * @param pattern 匹配数据的正则表达式 * @param handleLine 处理匹配上的单行数据的方法 * @param handleLines 将所有行数据转换为指定输出数据的方法 */ const parseData = (data, prefix, suffix, pattern, handleLine, handleLines) => { // 是否已找到需要的数据段 let enable = false; const lines = new Array; for (let i = 0; i < data.length; i++) { // 单行数据 const line = data[i]; // 开始记录 if (prefix === line) { enable = true; continue; } // 结束记录 if (enable && suffix === line) { break; } // 注释跳过 if (line.startsWith("//")) { continue; } // 记录数据 if (enable) { const matcher = pattern.exec(line); if (matcher) { lines.push(handleLine(matcher)); } } } return handleLines(lines); }; /** * 解析表情数据 * @param data 原始数据按 \n切分之后的数组 */ function parseEmote(data) { let enable = false; const emoteArr = []; for (let i = 0; i < data.length; i++) { const line = data[i]; if ("}//s" === line) { // 结束 emoteArr.push("}"); enable = false; break; } if ("ubbcode.smiles = {" === line) { // 开始 enable = true; emoteArr.push("{"); continue; } if (enable) { if (line.startsWith("//")) { // 注释行,直接跳过 continue; } let s = line.replace(/\/\/.+/g, "") .replace(/^(\w+?):/g, "\"$1\":") .replace(/'/g, "\""); if (s !== '') { emoteArr.push(s); } } } const result = JSON.parse(emoteArr.join("")); // 删除第一组,无效 delete result[0]; return Object.keys(result).map(key => new Emote_1.EmoteGroup(key, result[key])); } const FONT_PATTERN = /'(.+?)':'(.+?)'/; /** * 需要将 "/resources" 代理到 "https://img4.nga.178.com" */ class ResourceApi { } _a = ResourceApi; /** * 获取UI相关数据,保存在静态变量中,只需要执行一次请求 */ ResourceApi.commonUi = () => { if (ResourceApi.commonUiData !== undefined) { return new Promise(r => r(ResourceApi.commonUiData)); } return instance.get("/resources/common_res/js_commonui.js") .then((res) => __awaiter(void 0, void 0, void 0, function* () { ResourceApi.commonUiData = new CommonUiData_1.CommonUiData(yield res.data); return ResourceApi.commonUiData; })); }; /** * 首页版面入口 */ ResourceApi.indexForums = () => { return instance.get("/resources/proxy/cache_attach/bbs_index_data.js") .then((res) => __awaiter(void 0, void 0, void 0, function* () { const data = yield res.data; const groups = JSON.parse(data.replace("window.script_muti_get_var_store=", "")).data[0].all; return (0, ObjUtils_1.values)(groups).map(r => new Forum_1.ForumGroup(r)).filter(r => r.subGroups.length > 0); })); }; /** * 论坛代码相关: 字体, 字体大小, 字体颜色, 官方表情包 */ ResourceApi.bbsCode = () => { return instance.get("/resources/common_res/js_bbscode_core.js").then((res) => __awaiter(void 0, void 0, void 0, function* () { const data = (yield res.data).split("\n"); // 获取字体数据 const fonts = parseData(data, "ubbcode.fonts = {", "}", FONT_PATTERN, (matcher) => { return { label: matcher[2], value: matcher[1] }; }, (lines) => { return lines; }); // 获取字体颜色数据 const fontColor = parseData(data, "ubbcode.fontColor = {", "}", /'(.+?)':0/, (matcher) => { return matcher[1]; }, (lines) => { return lines; }); // 获取字体大小数据 const fontSize = parseData(data, "ubbcode.fontSize = {", "}", FONT_PATTERN, (matcher) => { return { label: matcher[2], value: matcher[1] }; }, (lines) => { return lines; }); // 获取表情包数据 const emoteGroups = parseEmote(data); return { fonts, fontColor, fontSize, emoteGroups }; })); }; exports.ResourceApi = ResourceApi;