Author: elias
Date: Mon Apr 7 16:55:39 2008
New Revision: 25653
URL: http://svn.gna.org/viewcvs/wesnoth?rev=25653&view=rev
Log:
More work on wmlunits. Uses now an external stylesheet, performs team
colorization, displays female variants. And some bugs fixed.
Added:
trunk/data/tools/unit_tree/style.css
Modified:
trunk/data/tools/wmlunits
Added: trunk/data/tools/unit_tree/style.css
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/data/tools/unit_tree/style.css?rev=25653&view=auto
==============================================================================
--- trunk/data/tools/unit_tree/style.css (added)
+++ trunk/data/tools/unit_tree/style.css Mon Apr 7 16:55:39 2008
@@ -1,0 +1,78 @@
+body {
+ background-color: #fffbf0;
+ }
+table {
+ width: 100%;
+ border: none;
+ }
+table.frmale {
+ margin: 0px;
+ padding: 0px;
+ border: none;
+ }
+td {
+ border: none;
+ }
+td.unitcell {
+ text-align: center;
+ font-weight: bold;
+ border-bottom: 2px solid #cfcbc0;
+ }
+div#navbar a {
+ color: black;
+ font-size: small;
+ font-weight: bold;
+}
+td.raceheader {
+ background-color: black;
+ color: white;
+ font-size: xx-large;
+ font-weight: bold;
+ text-align: center;
+ }
+tr.levels th {
+ border-bottom: 1px solid #cfcbc0;
+}
+td.empty {
+ background-color: #fffbf0;
+ }
+col.col0 {
+ background-color: #efebe0;
+ width: 16%;
+}
+col.col1 {
+ background-color: #f7ebd8;
+ width: 16%;
+}
+col.col2 {
+ background-color: #f4ebdc;
+ width: 16%;
+}
+col.col3 {
+ background-color: #efebe0;
+ width: 16%;
+}
+col.col4 {
+ background-color: #f4ebdc;
+ width: 16%;
+}
+col.col5 {
+ background-color: #f7ebd8;
+ width: 16%;
+}
+td.unitcell img {
+ float: left;
+ }
+div.l {
+ color: gray;
+ font-weight: normal;
+ font-size: xx-small;
+ border: 1px solid;
+ float: right;
+ margin: 0px;
+ }
+div.attributes {
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ }
Modified: trunk/data/tools/wmlunits
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/data/tools/wmlunits?rev=25653&r1=25652&r2=25653&view=diff
==============================================================================
--- trunk/data/tools/wmlunits (original)
+++ trunk/data/tools/wmlunits Mon Apr 7 16:55:39 2008
@@ -24,15 +24,13 @@
#parser.verbose = True
# Suppress complaints about undefined terrain macros
- parser.set_macro_not_found_callback(lambda wmlparser, name, params:
name.startswith("TERRAIN") or name == "DISABLE_TRANSITIONS")
+ parser.set_macro_not_found_callback(lambda wmlparser, name, params:
+ name.startswith("TERRAIN") or name == "DISABLE_TRANSITIONS")
# Create a new WML object.
WML = wmldata.DataSub("WML")
# Parse some macros.
- # TODO: Obviously, this is not ideal, e.g. we parse the macros multiple
- # times. Could easily be fixed by keeping a reference to parser.macros
- # and re-using it instead of re-parsing.
if macros_parsed:
parser.macros = copy.copy(macros_parsed)
else:
@@ -52,19 +50,22 @@
self.images = {}
def add(self, campaign, path):
self.images[path] = campaign
- def copy_images(self, target_path):
+ def copy_and_color_images(self, target_path):
for i, c in self.images.items():
if c == "mainline":
ipath = os.path.join("data/core/images", i)
else:
ipath = os.path.join("data/campaigns/%s/images" % c, i)
- opath = os.path.join(target_path, "pics", campaign, i)
+ opath = os.path.join(target_path, "pics", c, i)
try:
os.makedirs(os.path.dirname(opath))
except OSError:
pass
if os.path.exists(ipath):
- shutil.copy2(ipath, opath)
+ #shutil.copy2(ipath, opath)
+ command = "data/tools/unit_tree/TeamColorizer %s %s" % (
+ ipath, opath)
+ os.system(command)
else:
sys.stderr.write(
"Warning: Required image \"%s\" does not exist.\n" % ipath)
@@ -91,7 +92,7 @@
if not campaign_wml:
# FIXME: The tutorial has no [campaign], need to special case
it
# somehow. Currently, we ignore it.
- return
+ return 0
# Now we get the define - strange, but seems to be how Wesnoth
# works..
define = campaign_wml.get_text_val("define")
@@ -103,7 +104,7 @@
units = WML.get_first("+units")
if not units:
# This campaign has no units. Nothing to do.
- return
+ return 0
# Find all units types.
newunits = units.get_all("unit_type")
@@ -129,6 +130,7 @@
unit.race = None
sys.stderr.write("Warning: No race \"%s\" found (%s).\n" % (
race, unit.get_text_val("id")))
+ return len(newunits)
def get_unit_value(self, unit, attribute, default = None):
value = unit.get_text_val(attribute, None)
@@ -218,16 +220,17 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<link rel=stylesheet href=\"../style.css\" type=\"text/css\">
+<link rel=stylesheet href=\"%(path)sstyle.css\" type=\"text/css\">
</head>
<body>'''.strip()
html_footer = "</body></html>"
class HTMLOutput:
- def __init__(self, isocode, output, verbose = False):
+ def __init__(self, isocode, output, campaign, verbose = False):
self.isocode = isocode
self.output = output
+ self.campaign = campaign
self.verbose = verbose
# Handle translations.
@@ -243,14 +246,14 @@
self.isocode, item.textdomain, value))
return text[text.find("^") + 1:]
- def analyze_units(self, campaign, unitlist):
+ def analyze_units(self, unitlist):
# Lookup tables.
unit_lookup = {}
race_lookup = {}
# Build an advancement tree forest of all units.
forest = UnitForest()
- for u in unitlist.units_by_campaign[campaign]:
+ for u in unitlist.units_by_campaign[self.campaign]:
forest.add_node(UnitNode(u))
forest.update_breadth()
@@ -316,11 +319,18 @@
write("Language:\n")
for lang in langlist:
- write(" <a href=\"../%s/index.html\">%s</a>" % (
- lang, languages[lang]))
+ write(" <a href=\"../%s_%s/index.html\">%s</a>" % (
+ lang, self.campaign, languages[lang]))
write("<br/>\n")
- write("By Campaign: TODO<br/>\n")
+ write("By Campaign: ")
+ for campaign in all_campaigns:
+ lang = self.isocode
+ # FIXME: translate campaign names
+ write(" <a href=\"../%s_%s/index.html\">%s</a>" % (
+ lang, campaign, campaign.replace("_", " ")))
+ write("<br/>\n")
+
write("By Faction: TODO<br/>\n")
write("By Race: ")
@@ -333,7 +343,7 @@
write("</div>\n")
- def write_units(self, campaign, unitlist):
+ def write_units(self, unitlist):
def write(x): self.output.write(x)
rows = self.unitgrid
write("<table>\n")
@@ -367,17 +377,44 @@
write("<td%s>" % attributes)
# FIXME: translation
name = self.get_translation(u, "name")
+ female = u.get_first("female")
+ if female:
+ fname = self.get_translation(female, "name")
+ if fname != name:
+ name += "<br/>" + fname
cost = u.get_text_val("cost")
hp = u.get_text_val("hitpoints")
mp = u.get_text_val("movement")
xp = u.get_text_val("experience")
- image = u.get_text_val("image")
level = u.get_text_val("level")
- image_collector.add(campaign, image)
- image = os.path.join("../pics/%s" % campaign, image)
+
+ def pic(x):
+ image = x.get_text_val("image")
+ if not image:
+ sys.stderr.write(
+ "Warning: Missing image for unit
%s(%s).\n" % (
+ u.get_text_val("id"), x.name))
+ return None
+ image_collector.add(campaign, image)
+ image = os.path.join("../pics/%s" % self.campaign,
+ image)
+ return image
+
write("<div class=\"l\">L%s</div>" % level)
write("%s<br/>" % name)
- write('<img src="%s" alt="(image)" />\n' % image)
+
+ if female:
+ mimage = pic(u)
+ fimage = pic(female)
+ if not fimage: fimage = mimage
+ write('<table class="female"><tr><td>')
+ write('<img src="%s" alt="(image)" />\n' % mimage)
+ write('</td></tr><tr><td>')
+ write('<img src="%s" alt="(image)" />\n' % fimage)
+ write('</td></tr></table>\n')
+ else:
+ image = pic(u)
+ write('<img src="%s" alt="(image)" />\n' % image)
write("<div class=\"attributes\">")
write("cost: %s<br />" % cost)
write("HP: %s<br />" % hp)
@@ -390,12 +427,12 @@
write("</tr>\n")
write("</table>\n")
- def create_page(self, campaign, unitlist):
- self.output.write(html_header)
+ def create_page(self, unitlist):
+ self.output.write(html_header % {"path" : "../"})
- self.analyze_units(campaign, unitlist)
+ self.analyze_units(unitlist)
self.write_navbar()
- self.write_units(campaign, unitlist)
+ self.write_units(unitlist)
self.output.write(html_footer)
@@ -417,6 +454,22 @@
languages_found[isocode] = name
return languages_found
+factions_found = {}
+def find_factions():
+ class Faction:
+ def __init__(self, faction):
+ self.faction = faction
+ parser = wmlparser.Parser(datadir)
+ WML = wmldata.DataSub("WML")
+ parser.parse_text("{multiplayer/eras.cfg}\n")
+ parser.parse_top(WML)
+
+ for era in WML.get_all("era"):
+ if era.get_text_val("id") == "era default":
+ for multiplayer_side in era.get_all("multiplayer_side"):
+ fid = multiplayer_side.get_text_val("id")
+ factions_found[fid] = Faction(multiplayer_side)
+
class MyFile:
"""
I don't understand why this is needed..
@@ -433,93 +486,20 @@
path = os.path.join(out_path, isocode + "_" + campaign)
if not os.path.isdir(path): os.mkdir(path)
output = MyFile(os.path.join(path, "index.html"), "w")
- html = HTMLOutput(isocode, output)
- html.create_page(campaign, unitlist)
+ html = HTMLOutput(isocode, output, campaign)
+ html.create_page(unitlist)
def write_index(out_path):
output = MyFile(os.path.join(out_path, "index.html"), "w")
- output.write(html_header)
+ output.write(html_header % {"path" : ""})
+ output.write("<div id=\"navbar\">\n")
+ output.write("Units for:<ul>")
for campaign in all_campaigns:
- output.write("<a href=\"C_%s/index.html\">%s</a>" % (
+ output.write("<li><a href=\"C_%s/index.html\">%s</a></li>" % (
campaign, campaign.replace("_", " ")))
+ output.write("</ul>")
+ output.write("</div>")
output.write(html_footer)
-
-# FIXME: place into a separate file, no points inlining this here...
-style_css = """
-body {
- background-color: #fffbf0;
- }
-table {
- width: 100%;
- border: none;
- }
-td {
- border: none;
- }
-td.unitcell {
- text-align: center;
- font-weight: bold;
- border-bottom: 2px solid #cfcbc0;
- }
-div#navbar a {
- color: black;
- font-size: small;
- font-weight: bold;
-}
-td.raceheader {
- background-color: black;
- color: white;
- font-size: xx-large;
- font-weight: bold;
- text-align: center;
- }
-tr.levels th {
- border-bottom: 1px solid #cfcbc0;
-}
-td.empty {
- background-color: #fffbf0;
- }
-col.col0 {
- background-color: #efebe0;
- width: 16%;
-}
-col.col1 {
- background-color: #f7ebd8;
- width: 16%;
-}
-col.col2 {
- background-color: #f4ebdc;
- width: 16%;
-}
-col.col3 {
- background-color: #efebe0;
- width: 16%;
-}
-col.col4 {
- background-color: #f4ebdc;
- width: 16%;
-}
-col.col5 {
- background-color: #f7ebd8;
- width: 16%;
-}
-td.unitcell img {
- float: left;
- }
-div.l {
- color: gray;
- font-weight: normal;
- font-size: xx-small;
- border: 1px solid;
- float: right;
- margin: 0px;
- }
-div.attributes {
- font-size: small;
- font-weight: normal;
- text-align: left;
- }
-"""
if __name__ == '__main__':
global all_campaigns
@@ -548,11 +528,13 @@
# Parse all unit data
# This reads in units.cfg, giving us all the mainline units.
all_campaigns = []
+ all_updated_campaigns = []
#if options.campaign == "all" or options.campaign == "mainline":
if 1: # Always need them for standard races
print "Reading mainline units."
unitlist.add("{core/units.cfg}", "mainline")
- all_campaigns.append("mainline")
+ all_updated_campaigns.append("mainline")
+ all_campaigns.append("mainline")
# Now we read each campaign in turn to get its units.
campaigns = glob.glob("data/campaigns/*")
for campaign in campaigns:
@@ -560,20 +542,21 @@
description = dirname[10:]
if options.campaign == "all" or options.campaign == description:
print "Reading %s units." % description
- unitlist.add("{%s}" % dirname, description)
- all_campaigns.append(description)
+ if unitlist.add("{%s}" % dirname, description):
+ all_updated_campaigns.append(description)
+ all_campaigns.append(description)
# Report generation
if not os.path.isdir(options.output):
os.mkdir(options.output)
write_index(options.output)
- open(os.path.join(options.output, "style.css"), "w").write(style_css)
+
if options.language == "all":
languages = find_languages().keys()
else:
languages = [options.language]
if options.campaign == "all":
- campaigns = all_campaigns
+ campaigns = all_updated_campaigns
else:
campaigns = [options.campaign]
@@ -590,5 +573,7 @@
generate_report(options.output, isocode, campaign, unitlist)
if not options.nocopy:
- image_collector.copy_images(options.output)
-
+ print "Copying files."
+ image_collector.copy_and_color_images(options.output)
+ shutil.copy2("data/tools/unit_tree/style.css", options.output)
+
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits