refactor layout, add jp sort pages, data update
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import sys
|
||||
import json
|
||||
import os.path
|
||||
import types
|
||||
|
||||
import _pathfix
|
||||
|
||||
@@ -10,67 +11,65 @@ from mhapi.db import MHDB
|
||||
from mhapi.util import get_utf8_writer
|
||||
|
||||
|
||||
def print_header_nav(current_page_id):
|
||||
pages = [("page-skilltrees", "Skill Trees"),
|
||||
("page-items", "Items"),
|
||||
("page-gather", "Gather"),
|
||||
("page-carve", "Carve"),
|
||||
("page-hunterarts", "Hunter Arts"),
|
||||
("page-monsters", "Monsters")]
|
||||
def print_header_nav(title, pid):
|
||||
print """
|
||||
<div data-role="header" data-position="fixed">
|
||||
<div data-role="navbar">
|
||||
<ul>
|
||||
""".strip("\n")
|
||||
for page_id, page_name in pages:
|
||||
if current_page_id == page_id:
|
||||
print """
|
||||
<li><a href="#%s"
|
||||
class="ui-btn-active ui-state-persist">%s</a></li>
|
||||
""".strip("\n") % (page_id, page_name)
|
||||
else:
|
||||
print """
|
||||
<li><a href="#%s">%s</a></li>
|
||||
""".strip("\n") % (page_id, page_name)
|
||||
print """
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
""".strip("\n")
|
||||
<div data-role="header" data-position="fixed">
|
||||
<a href="#page-home" class="ui-btn-left ui-btn ui-btn-inline ui-mini ui-corner-all ui-btn-icon-left ui-icon-home">Home</a>
|
||||
<h1>%s</h1>
|
||||
""".strip() % title
|
||||
|
||||
alt_pid = None
|
||||
if pid.endswith("-en"):
|
||||
alt_pid = pid.replace("-en", "-jp")
|
||||
alt_title = "jp"
|
||||
if pid.endswith("-jp"):
|
||||
alt_pid = pid.replace("-jp", "-en")
|
||||
alt_title = "en"
|
||||
|
||||
if alt_pid is not None:
|
||||
print """
|
||||
<a href="#%s" class="ui-btn-right ui-btn ui-btn-inline ui-mini">%s</a>
|
||||
""".strip() % (alt_pid, alt_title)
|
||||
|
||||
print " </div>"
|
||||
|
||||
|
||||
def mk_html_list(dict_list, keys, sort_keys, divider_fn=None):
|
||||
if divider_fn is None:
|
||||
def mk_html_list(dict_list, keys, sort_keys, divider_fn="auto"):
|
||||
if divider_fn == "auto":
|
||||
print ('<ul data-role="listview" data-filter="true"'
|
||||
' data-autodividers="true">')
|
||||
else:
|
||||
print '<ul data-role="listview" data-filter="true">'
|
||||
|
||||
def sort_fn(d):
|
||||
return tuple(d[k] for k in sort_keys)
|
||||
if isinstance(sort_keys, types.FunctionType):
|
||||
sort_fn = sort_keys
|
||||
else:
|
||||
def sort_fn(d):
|
||||
return tuple(d[k] for k in sort_keys)
|
||||
prev_d = None
|
||||
if sort_keys is not None:
|
||||
it = sorted(dict_list, key=sort_fn)
|
||||
else:
|
||||
it = dict_list
|
||||
for d in it:
|
||||
if divider_fn is not None:
|
||||
if divider_fn not in (None, "auto"):
|
||||
divider_text = divider_fn(d, prev_d)
|
||||
if divider_text is not None:
|
||||
print ' <li data-role="list-divider">%s</li>' % divider_text
|
||||
print " <li>"
|
||||
for k in keys:
|
||||
for i, k in enumerate(keys):
|
||||
value = d[k]
|
||||
if k == "description":
|
||||
if k in ("section", "description"):
|
||||
if value:
|
||||
print ' <p class="ui-li-desc">%s</p>' % value
|
||||
continue
|
||||
elif k == "title_jp":
|
||||
if value not in ("", None, "None", "N/A", "(?)"):
|
||||
elif k == "title_jp" and i != 0:
|
||||
# NB: for monster by title we want it to be a normal column
|
||||
if value:
|
||||
print ' <p class="ui-li-desc">Title: %s</p>' % value
|
||||
continue
|
||||
if value.endswith(".png"):
|
||||
value = ('<img class="icon" src="/img/icons_items/%s" />'
|
||||
value = ('<img class="icon" src="../img/icons_items/%s" />'
|
||||
% value)
|
||||
print ' <span class="%s">%s</span>' % (k, value)
|
||||
print " </li>"
|
||||
@@ -80,7 +79,7 @@ def mk_html_list(dict_list, keys, sort_keys, divider_fn=None):
|
||||
|
||||
def _main():
|
||||
db = MHDB()
|
||||
strees = db.get_skill_trees()
|
||||
#strees = db.get_skill_trees()
|
||||
items = db.get_items(item_types=("Tool", "Book", "Consumable", "Ammo"))
|
||||
gather_items = db.get_items(item_types=
|
||||
("Bone", "Plant", "Ore", "Fish", "Bug", "Sac/Fluid", "Meat"))
|
||||
@@ -117,12 +116,41 @@ def _main():
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div data-role="page" id="page-home">
|
||||
<div data-role="header" data-position="fixed">
|
||||
<h1>Home</h1>
|
||||
</div>
|
||||
<div data-role="main" class="ui-content">
|
||||
<ul data-role="listview">
|
||||
<li><a href="#page-skilltrees-en">Skill Trees</a></li>
|
||||
<li><a href="#page-hunterarts-en">Hunter Arts</a></li>
|
||||
<li><a href="#page-monsters-en">Monsters</a></li>
|
||||
<li><a href="#page-monsters-title">Monster Titles</a></li>
|
||||
<li data-role="list-divider">Items</li>
|
||||
<li><a href="#page-item-usable">Usable</a></li>
|
||||
<li><a href="#page-item-gather">Gatherable</a></li>
|
||||
<li><a href="#page-item-carve">Monster Carves</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
stree_path = os.path.join(_pathfix.project_path, "db",
|
||||
"mhx_skill_tree_list.json")
|
||||
with open(stree_path) as f:
|
||||
stree_list = json.load(f)
|
||||
|
||||
print '<div data-role="page" id="page-skilltrees">'
|
||||
print_header_nav("page-skilltrees")
|
||||
print '<div data-role="page" id="page-skilltrees-en">'
|
||||
print_header_nav("Skill Trees (en)", "page-skilltrees-en")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(strees, ("name", "name_jp"), ("name",))
|
||||
mk_html_list(stree_list, ("name", "name_jp"), ("name",))
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
print '<div data-role="page" id="page-skilltrees-jp">'
|
||||
print_header_nav("Skill Trees (jp)", "page-skilltrees-jp")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(stree_list, ("name_jp", "name"), jplen_sort_fn,
|
||||
divider_fn=jplen_divider_fn)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
@@ -132,24 +160,24 @@ def _main():
|
||||
if prefix != prev_prefix:
|
||||
return prefix
|
||||
return None
|
||||
print '<div data-role="page" id="page-items">'
|
||||
print_header_nav("page-items")
|
||||
print '<div data-role="page" id="page-item-usable">'
|
||||
print_header_nav("Items: Usable", "page-item-usable")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(items, ("icon_name", "name", "name_jp"),
|
||||
("icon_name", "name"), divider_fn=item_divider_fn)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
print '<div data-role="page" id="page-gather">'
|
||||
print_header_nav("page-gather")
|
||||
print '<div data-role="page" id="page-item-gather">'
|
||||
print_header_nav("Items: Gatherable", "page-item-gather")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(gather_items, ("icon_name", "name", "name_jp"),
|
||||
("icon_name", "name"), divider_fn=item_divider_fn)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
print '<div data-role="page" id="page-carve">'
|
||||
print_header_nav("page-carve")
|
||||
print '<div data-role="page" id="page-item-carve">'
|
||||
print_header_nav("Items: Carve", "page-item-carve")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(carve_items, ("icon_name", "name", "name_jp"),
|
||||
("icon_name", "name"), divider_fn=item_divider_fn)
|
||||
@@ -166,26 +194,53 @@ def _main():
|
||||
elif d["section"] != prev_d["section"]:
|
||||
return d["section"]
|
||||
return None
|
||||
print '<div data-role="page" id="page-hunterarts">'
|
||||
print_header_nav("page-hunterarts")
|
||||
print '<div data-role="page" id="page-hunterarts-en">'
|
||||
print_header_nav("Hunter Arts (en)", "page-hunterarts-en")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(ha_list, ("name", "name_jp", "description"), None,
|
||||
divider_fn=ha_divider_fn)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
print '<div data-role="page" id="page-hunterarts-jp">'
|
||||
print_header_nav("Hunter Arts (jp)", "page-hunterarts-jp")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(ha_list, ("name_jp", "name", "section", "description"),
|
||||
jplen_sort_fn, divider_fn=jplen_divider_fn)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
|
||||
monster_path = os.path.join(_pathfix.project_path, "db",
|
||||
"mhx_monster_list.json")
|
||||
with open(monster_path) as f:
|
||||
monster_list = json.load(f)
|
||||
|
||||
print '<div data-role="page" id="page-monsters">'
|
||||
print_header_nav("page-monsters")
|
||||
print '<div data-role="page" id="page-monsters-en">'
|
||||
print_header_nav("Monsters (en)", "page-monsters-en")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(monster_list, ("name", "name_jp", "title_jp"), ("name",))
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
print '<div data-role="page" id="page-monsters-jp">'
|
||||
print_header_nav("Monsters (jp)", "page-monsters-jp")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(monster_list, ("name_jp", "name", "title_jp"), ("name_jp",))
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
titled_monster_list = [m for m in monster_list if m["title_jp"]]
|
||||
print '<div data-role="page" id="page-monsters-title">'
|
||||
print_header_nav("Monster Titles", "page-monsters-title")
|
||||
print '<div data-role="main" class="ui-content">'
|
||||
mk_html_list(titled_monster_list, ("title_jp", "name"), ("title_jp",),
|
||||
divider_fn=None)
|
||||
print '</div>'
|
||||
print '</div>'
|
||||
|
||||
|
||||
|
||||
|
||||
print """
|
||||
</body>
|
||||
@@ -198,6 +253,20 @@ def _icon_prefix(d):
|
||||
return parts[0].replace(".png", "")
|
||||
|
||||
|
||||
def jplen_divider_fn(d, prev_d):
|
||||
jplen = len(d["name_jp"].strip(" I"))
|
||||
if prev_d is None:
|
||||
return jplen
|
||||
prev_jplen = len(prev_d["name_jp"].strip(" I"))
|
||||
if jplen != prev_jplen:
|
||||
return jplen
|
||||
return None
|
||||
|
||||
|
||||
def jplen_sort_fn(d):
|
||||
return (len(d["name_jp"].strip(" I")), d["name_jp"])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.stdout = get_utf8_writer(sys.stdout)
|
||||
_main()
|
||||
|
||||
@@ -60,6 +60,8 @@ def parse_wikia_monsters(f):
|
||||
m = MONSTER_RE.search(line)
|
||||
if m:
|
||||
monster = dict(href=m.group(1), name=m.group(2))
|
||||
if monster["name"].startswith("File:"):
|
||||
continue
|
||||
if monster["name"] not in seen:
|
||||
data.append(monster)
|
||||
seen.add(monster["name"])
|
||||
@@ -95,11 +97,14 @@ def _main():
|
||||
names = get_jp_names(m["href"])
|
||||
if len(names) == 0:
|
||||
print >>sys.stderr, "ERROR: no names for %s" % name
|
||||
names = ["(?)", "(?)"]
|
||||
names = ["", ""]
|
||||
if len(names) == 1:
|
||||
names.append("(?)")
|
||||
print >>sys.stderr, "ERROR: no title for %s" % name
|
||||
names.append("")
|
||||
m["name_jp"] = names[0]
|
||||
m["title_jp"] = names[1]
|
||||
if m["title_jp"] in ("None", "N/A", "(?)"):
|
||||
m["title_jp"] = ""
|
||||
print json.dumps(monster_list, indent=2)
|
||||
|
||||
|
||||
|
||||
53
bin/parse-wikia-skills.py
Executable file
53
bin/parse-wikia-skills.py
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- 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]>([^<]*)')
|
||||
|
||||
|
||||
def parse_wikia_skill_trees(f):
|
||||
data = []
|
||||
seen = set()
|
||||
while True:
|
||||
line = f.readline()
|
||||
if not line:
|
||||
break
|
||||
line = line.strip()
|
||||
m = TREE_RE.match(line)
|
||||
if m:
|
||||
stree = dict(name=m.group(1), name_jp=m.group(2))
|
||||
if stree["name"] not in seen:
|
||||
data.append(stree)
|
||||
seen.add(stree["name"])
|
||||
return data
|
||||
|
||||
|
||||
def _main():
|
||||
with open(sys.argv[1]) as f:
|
||||
stree_list = parse_wikia_skill_trees(f)
|
||||
print json.dumps(stree_list, indent=2)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
_main()
|
||||
Reference in New Issue
Block a user