@ginstone/nga-api
Version:
177 lines (176 loc) • 6.19 kB
JavaScript
;
// 静态资源
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;