wesnoth/data/tools/about_cfg_to_wiki
2013-08-09 00:13:46 +02:00

123 lines
4.3 KiB
Python
Executable file

#!/usr/bin/env python
# encoding: utf8
#
#
# This must be run from the Wesnoth root directory.
#
# Run as:
#
# data/tools/about_cfg_to_wiki -w path_to_wesnoth_exe > about.wiki
#
# (-h option outputs help)
import sys, re, glob
import wesnoth.wmlparser2 as wmldata
def output(text):
sys.stdout.write(text.encode("utf8"))
if __name__ == "__main__":
import argparse
argument_parser = argparse.ArgumentParser()
argument_parser.add_argument("-w", "--wesnoth",
help="Specify the wesnoth executable to use.")
args = argument_parser.parse_args()
files = ["data/core/about.cfg"]
files.extend(glob.glob("data/campaigns/*/_main.cfg"))
if not args.wesnoth:
args.wesnoth = "./wesnoth"
# Parse WML.
class Section:
def __init__(self, title):
self.title = title
self.lines = []
chapters = []
for arg in files:
sections = []
wml_parser = wmldata.Parser(args.wesnoth, None, None, False)
wml_parser.parse_file(arg)
wml = wml_parser
if not wml.get_all(tag="about"):
wml = wml.get_all(tag="campaign")
if not wml or not wml[0].get_all(tag="about"):
sys.stderr.write("No about section found in %s\n" % arg)
continue
wml = wml[0]
for about in wml.get_all(tag="about"):
section = Section(about.get_text_val("title"))
for entry in about.get_all(tag="entry"):
name = entry.get_text_val("name")
comment = entry.get_text_val("comment", "")
wikiuser = entry.get_text_val("wikiuser", "")
email = entry.get_text_val("email", "")
# Mask email names from spammers
email = email.replace("@", "@").replace(".", ".")
# Interpret our local conventions for obfuscating in repo files
email = email.replace("_AT_", "@").replace("_DOT_", ".")
section.lines.append((name, comment, wikiuser, email))
if section.title:
sections.append(section)
chapters.append((arg, sections))
# Output.
output("""
{| style="float:right"
|
__TOC__
|}
__NOEDITSECTION__
In July 2003, '''David White''' released the first version of Wesnoth. Since
then, many people have joined the project, contributing in very different ways.
To make any changes to this list, please modify about.cfg in the repo or ask any
developer to do it for you.
""".lstrip())
for path, sections in chapters:
if path == "data/core/about.cfg":
output("== Contributors ==\n")
else:
slash1 = path.rfind("/")
slash2 = path.rfind("/", 0, slash1)
beautified = path[slash2 + 1:slash1]
beautified = beautified.replace("_", " ")
beautified = beautified[0].upper() + beautified[1:]
output("== %s ==\n" % beautified)
for section in sections:
output("=== %s ===\n" % section.title)
for name, comment, wikiuser, email in section.lines:
if name == "*":
output("<hr>\n")
continue
if comment:
comment = " - " + comment
if wikiuser:
# If a wiki user is given, the nickname is turned into a
# wiki link, or else the whole name.
if "(" in name:
name = re.sub(r"\((.*)\)", "([[User:%s|\\1]])" % wikiuser, name)
else:
# The whole name is turned into a link, but also an
# email is given - in this case add an extra link.
if email:
name += " ([[User:%s|%s]])" % (wikiuser, wikiuser)
else:
name = "[[User:%s|%s]]" % (wikiuser, name)
if email:
if "(" in name:
name, nick = name.split("(", 1)
name = name.strip()
name = "[mailto:%s %s] (%s" % (email, name, nick)
else:
name = "[mailto:%s %s]" % (email, name)
output("* %s%s\n" % (name, comment))
output("""[[Category:Generated]]""")