You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.6 KiB
98 lines
3.6 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf8 -*-
|
|
"""
|
|
Parse skill tree names and jp names for monster hunter X.
|
|
http://monsterhunter.wikia.com/wiki/MHX:_Skill_List
|
|
|
|
Returns list of dict, e.g.:
|
|
[
|
|
{
|
|
"name": "Testucabra",
|
|
"name_jp": "...",
|
|
},
|
|
...
|
|
]
|
|
"""
|
|
|
|
import sys
|
|
import re
|
|
import json
|
|
from collections import defaultdict, OrderedDict
|
|
|
|
import requests
|
|
|
|
|
|
#<td rowspan="1" style="vertical-align: top; background-color: #ddeeee; font-size:12pt; border-bottom: 2px solid #000000;"><h3><span class="mw-headline" id="Ammo_Saver">Ammo Saver</span></h3>弾薬節約
|
|
TREE_RE = re.compile('^<td [^>]*><h[23]><span class="mw-headline" id="[^"]*">(?:<b>)?([^<]*)(?:</b>)?</span></h[23]>([^<]*)')
|
|
|
|
# <td style="color: #000000;"> Guard +1<br />ガード性能+1
|
|
# <td style="color: #ff0000; border-bottom: 2px solid #000000;"> Cold Surge<br />寒さ倍加
|
|
# </td><td style="color: #000000; border-bottom: 2px solid #000000;"> Charm Up <img src="data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D" alt="New" class="lzy lzyPlcHld " data-image-key="New.gif" data-image-name="New.gif" data-src="https://vignette1.wikia.nocookie.net/monsterhunter/images/e/e0/New.gif/revision/latest?cb=20111022174959" width="46" height="12" onload="if(typeof ImgLzy==='object'){ImgLzy.load(this)}" ><noscript><img src="https://vignette1.wikia.nocookie.net/monsterhunter/images/e/e0/New.gif/revision/latest?cb=20111022174959" alt="New" class="" data-image-key="New.gif" data-image-name="New.gif" width="46" height="12" ></noscript><br />護石系統倍加
|
|
SKILL_RE = re.compile(
|
|
'(?:</td>)?<td style="color: #[0f][0f]0000;[^>]*>([^<>]+)((?:<img[^>]* alt="New" [^>]*>)?)(?:<[^>]+>)*<br />(.*)')
|
|
|
|
|
|
def parse_wikia_skill_trees(f):
|
|
strees = []
|
|
skills = []
|
|
seen = set()
|
|
in_tree = 0
|
|
is_new = False
|
|
while True:
|
|
line = f.readline()
|
|
if not line:
|
|
break
|
|
line = line.strip()
|
|
if in_tree:
|
|
if not line:
|
|
in_tree -= 1
|
|
continue
|
|
m = SKILL_RE.match(line)
|
|
if m:
|
|
assert len(m.groups()) == 3
|
|
is_new = len(m.group(2)) > 0
|
|
stree = strees[-1]
|
|
skill = dict(name=m.group(1).strip(), new=is_new,
|
|
name_jp=m.group(3).strip(),
|
|
tree=stree["name"],
|
|
tree_jp=stree["name_jp"])
|
|
skills.append(skill)
|
|
if is_new:
|
|
stree["new"] = True
|
|
else:
|
|
stree["new"] = False
|
|
# next line should be number of points
|
|
next_line = f.readline()
|
|
points = next_line[next_line.rfind('>')+1:].strip()
|
|
skill["points"] = points
|
|
continue
|
|
|
|
m = TREE_RE.match(line)
|
|
if m:
|
|
stree = dict(name=m.group(1).strip(), name_jp=m.group(2).strip())
|
|
if stree["name"] not in seen:
|
|
strees.append(stree)
|
|
seen.add(stree["name"])
|
|
# three blank lines divides skill tree rows
|
|
in_tree = 3
|
|
is_new = False
|
|
return strees, skills
|
|
|
|
|
|
def _main():
|
|
if len(sys.argv) != 4:
|
|
print("Usage: %s infile out_strees.json out_skills.json" % sys.argv[0])
|
|
sys.exit(1)
|
|
with open(sys.argv[1]) as f:
|
|
strees, skills = parse_wikia_skill_trees(f)
|
|
with open(sys.argv[2], "w") as f:
|
|
json.dump(strees, f, indent=2)
|
|
f.write("\n")
|
|
with open(sys.argv[3], "w") as f:
|
|
json.dump(skills, f, indent=2)
|
|
f.write("\n")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
_main()
|