197 lines
5.8 KiB
JavaScript
197 lines
5.8 KiB
JavaScript
const fs = require('fs');
|
||
const path = require('path');
|
||
const OpenCC = require('opencc-js'); //需要安装
|
||
const converter = OpenCC.Converter({ from: 'hk', to: 'cn' });
|
||
const tsConverter = OpenCC.CustomConverter([
|
||
['点阵图', '像素画'],
|
||
['魔物猎人', '怪物猎人'],
|
||
['结他', '吉他'],
|
||
['琴键', '键盘'],
|
||
//万智牌
|
||
['魔法风云会', '万智牌'],
|
||
//漫威
|
||
['MARVEL', '漫威'],
|
||
['铁甲奇侠', '钢铁侠'],
|
||
['变形侠医', '绿巨人'],
|
||
['变形女侠', '女绿巨人'],
|
||
['毒魔', '毒液'],
|
||
['魁隆', '灭霸'],
|
||
['福瑞', '弗瑞'],
|
||
['末日博士', '毁灭博士'],
|
||
['邪恶史传奇', '邪恶奇异'],
|
||
//奥特曼
|
||
['超人系列', '奥特曼系列'],
|
||
['超人吉田/超人力霸王', '奥特曼【初代】'],
|
||
['贝塔胶囊', 'β魔棒'],
|
||
['超人迪加', '迪迦奥特曼'],
|
||
['超人贝利尔', '贝利亚奥特曼'],
|
||
['超人七号', '赛文奥特曼'],
|
||
['超人之眼', '奥特眼镜'],
|
||
['超人Zero/杰洛', '赛罗奥特曼'],
|
||
['超越Zero/杰洛', '赛罗奥特曼 无限形态'],
|
||
['超人Trigger/特利卡', '特利迦奥特曼'],
|
||
['GUTS 神光海帕枪', '胜利神光棒'],
|
||
['超人捷德', '捷德奥特曼'],
|
||
['Geed Riser', '捷德升华器'],
|
||
['超人太郎', '泰罗奥特曼'],
|
||
['超级炸弹', '奥特炸弹'],
|
||
['超级徽章', '奥特徽章'],
|
||
['超人Ace/卫司', '艾斯奥特曼'],
|
||
['超级戒指', '奥特戒指'],
|
||
['超人帝拿/帝纳', '戴拿奥特曼'],
|
||
['超人佳亚/盖亚', '盖亚奥特曼'],
|
||
['超人之父', '奥特之父'],
|
||
['超人之母', '奥特之母'],
|
||
['哥摩拉', '哥莫拉'],
|
||
['电王兽', '艾雷王'],
|
||
['金古乔', '金古桥'],
|
||
['美特隆', '梅特龙'],
|
||
['卡内贡', '卡尼贡'],
|
||
['超人硬币', '奥特曼硬币'],
|
||
['超人(新・超人)', '奥特曼【新・初代】'],
|
||
['超人梅比斯', '梦比优斯奥特曼'],
|
||
['梅比斯', '梦比优斯'], //注意这个顺序在上面那个之后
|
||
['超人德卡/Decker', '戴卡奥特曼'],
|
||
['超人Z', '泽塔奥特曼'],
|
||
['暗黑特利卡', '暗黑特利迦'],
|
||
['超人尼奥/超人雷欧', '雷欧奥特曼'],
|
||
['阿尔法锋刃', '阿尔法利刃'],
|
||
['德尔塔升华钩爪', '德尔塔升爪'],
|
||
//海贼王
|
||
['ONE PIECE FILM RED', '海贼王'],
|
||
['骗人布', '乌索普'],
|
||
['香吉士', '山治'],
|
||
//三丽鸥
|
||
['SANRIO CHARACTERS', '三丽鸥角色'],
|
||
]);
|
||
|
||
const sourceFolder = "Download-pad.skyozora.com/pad.skyozora.com"; //战友网数据的存储问文件夹
|
||
const outJSON_cht = "custom/cht.json"; //输出的繁体JSON文件
|
||
const outJSON_chs = "custom/chs.json"; //输出的简体JSON文件
|
||
|
||
let monArr_cht, monArr_chs;
|
||
//读取繁体
|
||
try
|
||
{
|
||
monArr_cht = fs.existsSync(outJSON_cht) ? JSON.parse(fs.readFileSync(outJSON_cht, 'utf-8')) : [];
|
||
}catch(e)
|
||
{
|
||
monArr_cht = [];
|
||
}
|
||
//读取简体
|
||
try
|
||
{
|
||
monArr_chs = fs.existsSync(outJSON_chs) ? JSON.parse(fs.readFileSync(outJSON_chs, 'utf-8')) : [];
|
||
}catch(e)
|
||
{
|
||
monArr_chs = [];
|
||
}
|
||
class monInfo
|
||
{
|
||
constructor(id)
|
||
{
|
||
this.id = id;
|
||
this.name = null;
|
||
this.tags = [];
|
||
}
|
||
}
|
||
|
||
//根据文件路径读取文件,返回文件列表
|
||
fs.readdir(sourceFolder,function(err,files){
|
||
|
||
if(err){
|
||
console.warn(err);
|
||
}else{
|
||
//遍历读取到的文件列表
|
||
files.forEach(function(filename){
|
||
const searchID = /^(\d+)\.html$/i.exec(filename);
|
||
const mId = searchID ? parseInt(searchID[1],10) : null;
|
||
if (mId != null && !monArr_cht.some(cn => cn.id == mId)) //有ID,且不繁体数据中不存在时
|
||
{
|
||
const filepath = path.join(sourceFolder, filename);//合并当前文件的路径
|
||
const htmlText = fs.readFileSync(filepath, 'utf-8'); //使用同步读取
|
||
|
||
const m = new monInfo(mId);
|
||
|
||
//添加分类tag
|
||
const regTags = /<a [^>]+?\s?class="category"\s?[^>]+>\s*<span>\s*#([^<]+?)\s*<\/span>\s*<\/a>/igm;
|
||
let resTags;
|
||
while(resTags = regTags.exec(htmlText))
|
||
{
|
||
let mTag = resTags[1].trim();
|
||
if (mTag.length>0)
|
||
{
|
||
m.tags.push(mTag);
|
||
}
|
||
}
|
||
|
||
//添加怪物名
|
||
const regName = /<h2 .+>\s*?([\s\S]*)\s*?<\/h2>/igm;
|
||
let resName = regName.exec(htmlText);
|
||
if (resName)
|
||
{
|
||
let mName = resName[1].trim();
|
||
mName = mName.replace(/探偵/g,"偵探"); //把日语的探侦都换成侦探
|
||
if (mName.length>0)
|
||
{
|
||
m.name = mName;
|
||
monArr_cht.push(m);
|
||
if (monArr_cht.length % 100 == 0)
|
||
{
|
||
console.log("已添加 %d 个数据", monArr_cht.length);
|
||
const str = JSON.stringify(monArr_cht);
|
||
fs.writeFileSync(outJSON_cht,str,function(err){
|
||
//每添加一部分就写入一次,避免每次重头再来
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
});
|
||
}
|
||
}else
|
||
{
|
||
console.log("%s 的中文名为空。", filename);
|
||
}
|
||
}else
|
||
{
|
||
console.log("%s 未找到中文名Node。", filename);
|
||
}
|
||
}
|
||
});
|
||
|
||
monArr_cht.forEach(function(m_cht){
|
||
if (monArr_chs.some(cn => cn.id == m_cht.id))
|
||
{
|
||
return;
|
||
}else
|
||
{
|
||
const m = new monInfo(m_cht.id);
|
||
|
||
m.name = tsConverter(converter(m_cht.name));
|
||
m.tags = m_cht.tags.map(tag=> tsConverter(converter(tag)));
|
||
monArr_chs.push(m);
|
||
}
|
||
});
|
||
|
||
monArr_cht.sort(function(a,b){
|
||
return a.id - b.id;
|
||
});
|
||
monArr_chs.sort(function(a,b){
|
||
return a.id - b.id;
|
||
});
|
||
|
||
fs.writeFile(outJSON_cht, JSON.stringify(monArr_cht, null, '\t') ,function(err){
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
console.log("---繁体中文导出成功,共 %d 个名称---", monArr_cht.length);
|
||
});
|
||
fs.writeFile(outJSON_chs, JSON.stringify(monArr_chs, null, '\t') ,function(err){
|
||
if(err){
|
||
console.error(err);
|
||
}
|
||
console.log("---简体中文导出成功,共 %d 个名称---", monArr_cht.length);
|
||
});
|
||
}
|
||
});
|
||
|