#!/usr/bin/env python
#encoding: utf8
"""
wmlunits -- tool to output information on all units in HTML
Run without arguments to see usage.
"""
# Makes things faster on 32-bit systems
try: import psyco; psyco.full()
except ImportError: pass
import sys, os, glob, shutil, urllib2, optparse, traceback
import subprocess, yaml
import wesnoth.wmlparser2 as wmlparser2
import unit_tree.helpers as helpers
import unit_tree.animations as animations
import unit_tree.html_output as html_output
import unit_tree.overview
import unit_tree.wiki_output as wiki_output
def copy_images():
print("Recolorizing pictures.")
image_collector.copy_and_color_images(options.output)
shutil.copy2(os.path.join(image_collector.datadir,
"data/tools/unit_tree/style.css"), options.output)
shutil.copy2(os.path.join(image_collector.datadir,
"data/tools/unit_tree/menu.js"), options.output)
for grab in [
"http://www.wesnoth.org/mw/skins/glamdrol/headerbg.jpg",
"http://www.wesnoth.org/mw/skins/glamdrol/wesnoth-logo.jpg",
"http://www.wesnoth.org/mw/skins/glamdrol/navbg.png"]:
local = os.path.join(options.output, grab[grab.rfind("/") + 1:])
if not os.path.exists(local):
print "Fetching", grab
url = urllib2.urlopen(grab)
file(local, "w").write(url.read())
def shell(com):
#print(com)
p = subprocess.Popen(com, stdout = subprocess.PIPE,
stderr = subprocess.PIPE, shell = True)
out, err = p.communicate()
#if out: sys.stdout.write(out)
#if err: sys.stdout.write(err)
return p.returncode
def shell_out(com):
p = subprocess.Popen(com,
stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = p.communicate()
return out
def bash(name):
return "'" + name.replace("'", "'\\''") + "'"
def move(f, t, name):
if os.path.exists(f + "/" + name + ".cfg"):
com = "mv " + f + "/" + bash(name + ".cfg") + " " + t + "/"
shell(com)
com = "mv " + f + "/" + bash(name) + " " + t + "/"
return shell(com)
def list_contents():
class Empty: pass
local = Empty()
mainline_eras = set()
filename = options.list
def append(info, id, define, c = None, name = None, domain = None):
info.append({})
info[-1]["id"]= id
info[-1]["define"] = define
if c:
info[-1]["name"] = c.get_text_val("name")
else:
info[-1]["name"] = name
info[-1]["units"] = "?"
info[-1]["translations"] = {}
info[-1]["translations"] = {}
for isocode in languages:
translation = html_output.Translation(options.transdir, isocode)
def translate(string, domain):
return translation.translate(string, domain)
if c:
info[-1]["translations"][isocode] = c.get_text_val("name",
translation = translate)
else:
info[-1]["translations"][isocode] = translate(name, domain)
def list_eras(addon):
eras = local.wesnoth.parser.get_all(tag = "era")
if addon != "mainline":
eras = [x for x in eras if not x.get_text_val("id") in mainline_eras]
info = []
for era in eras:
eid = era.get_text_val("id")
if addon == "mainline":
mainline_eras.add(eid)
append(info, eid, "MULTIPLAYER", c = era)
return info
def list_campaigns(addon):
campaigns = local.wesnoth.parser.get_all(tag = "campaign")
info = []
for campaign in campaigns:
cid = campaign.get_text_val("id")
d = campaign.get_text_val("define")
d2 = campaign.get_text_val("extra_defines")
if d2: d += "," + d2
append(info, cid, d, c = campaign)
return info
def parse(wml, defines):
local.wesnoth = helpers.WesnothList(
options.wesnoth,
options.config_dir,
options.data_dir,
options.transdir)
local.wesnoth.parser.parse_text(wml, defines)
def get_version(addon):
try:
parser = wmlparser2.Parser(options.wesnoth, options.config_dir,
options.data_dir, no_preprocess = False)
parser.parse_file(options.config_dir + "/data/add-ons/" + addon + "/_info.cfg")
for info in parser.get_all(tag = "info"):
return info.get_text_val("version") + "*" + info.get_text_val("uploads")
except wmlparser2.WMLError as e:
print(e)
try: os.makedirs(options.output + "/mainline")
except OSError: pass
try:
batchlist = yaml.load(open(options.list))
except IOError:
batchlist = []
def search(name):
for info in batchlist:
if info and info["name"] == name: return info
batchlist.append({})
batchlist[-1]["name"] = name
return batchlist[-1]
print("mainline")
info = search("mainline")
info["version"] = "mainline"
info["parsed"] = "false"
parse("{core}{multiplayer/eras.cfg}", "SKIP_CORE")
info["eras"] = list_eras("mainline")
# Fake mainline campaign to have an overview of the mainline units
info["campaigns"] = []
append(info["campaigns"], "mainline", "", name = "Units", domain = "wesnoth-help")
if not options.addons_only:
parse("{core}{campaigns}", "SKIP_CORE")
info["campaigns"] += list_campaigns("mainline")
addons = []
if options.addons:
addons = os.listdir(options.addons)
for i, addon in enumerate(addons):
if not os.path.isdir(options.addons + "/" + addon): continue
sys.stdout.write("%4d/%4d " % (1 + i, len(addons)) + addon + " ... ")
sys.stdout.flush()
d = options.output + "/" + addon
logname = d + "/error.log"
try: os.makedirs(d)
except OSError: pass
move(options.addons, options.config_dir + "/data/add-ons", addon)
try:
info = search(addon)
version = get_version(addon)
if info.get("version", "") == version and info.get("parsed", False) == True:
sys.stdout.write("up to date\n")
continue
info["parsed"] = False
parse("{core}{multiplayer}{~add-ons}", "MULTIPLAYER,SKIP_CORE")
info["eras"] = list_eras(addon)
info["campaigns"] = list_campaigns(addon)
info["version"] = version
sys.stdout.write("ok\n")
except wmlparser2.WMLError as e:
ef = open(logname, "w")
ef.write("
%s
\n" % (u.rid,)) f.write("