Make it possible for pywxrc to generate just the gettext _() strings

with no other code, and also make it possible to process more than one
XRC file at once into a single output module.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39308 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2006-05-24 04:49:07 +00:00
parent f05326bac1
commit 0fe9c32957
2 changed files with 105 additions and 54 deletions

View File

@@ -427,7 +427,7 @@ class Frame(wx.Frame):
try:
import wx.tools.pywxrc
rescomp = wx.tools.pywxrc.XmlResourceCompiler()
rescomp.MakePythonModule(dataFile, pypath, embed, genGettext)
rescomp.MakePythonModule([dataFile], pypath, embed, genGettext)
except:
inf = sys.exc_info()
wx.LogError(traceback.format_exception(inf[0], inf[1], None)[-1])

View File

@@ -19,12 +19,13 @@ pywxrc -- Python XML resource compiler
(see http://wiki.wxpython.org/index.cgi/pywxrc for more info)
Usage: python pywxrc.py -h
python pywxrc.py <resource.xrc> [-e] [-g] [-o filename]
python pywxrc.py [-p] [-g] [-e] [-o filename] xrc input files...
-h, --help show help message
-e, --embed embed resources in the output file
-g, --gettext embed list of translatable strings in the output file
-o, --output output filename, or - for stdout
-h, --help show help message
-p, --python generate python module
-g, --gettext output list of translatable strings (may be combined with -p)
-e, --embed embed XRC resources in the output file
-o, --output output filename, or - for stdout
"""
import sys, os, getopt, glob, re
@@ -79,23 +80,20 @@ class xrc%(windowName)s(wx.%(windowClass)s):
# ------------------------ Resource data ----------------------
def __init_resources():
global __res
__res = xrc.EmptyXmlResource()
"""
LOAD_RES_FILE = """\
global __res
__res = xrc.XmlResource('%(resourceFilename)s')
"""
__res.Load('%(resourceFilename)s')"""
FILE_AS_STRING = """\
%(filename)s = '''\\
%(fileData)s'''
"""
PREPARE_MEMFS = """\
# Load all the strings as memory files
wx.FileSystem.AddHandler(wx.MemoryFSHandler())
"""
@@ -104,12 +102,10 @@ def __init_resources():
"""
LOAD_RES_MEMFS = """\
global __res
__res = xrc.EmptyXmlResource()
__res.Load('memory:XRC/%(memoryPath)s/%(resourceFilename)s')
"""
GETTEXT_DUMMY_FUNC = """\
GETTEXT_DUMMY_FUNC = """
# ----------------------- Gettext strings ---------------------
def __gettext_strings():
@@ -121,7 +117,7 @@ def __gettext_strings():
def _(str): pass
%(gettextStrings)s
%s
"""
#----------------------------------------------------------------------
@@ -132,27 +128,57 @@ class XmlResourceCompiler:
"""This class generates Python code from XML resource files (XRC)."""
def MakePythonModule(self, resourceFilename, outputFilename,
def MakePythonModule(self, inputFiles, outputFilename,
embedResources=False, generateGetText=False):
if outputFilename == "-":
outputFile = sys.stdout
else:
try:
outputFile = open(outputFilename, "wt")
except IOError:
raise IOError("Can't write output to '%s'" % outputFilename)
resourceDocument = minidom.parse(resourceFilename)
outputFile = self._OpenOutputFile(outputFilename)
classes = []
resources = []
gettextStrings = []
# process all the inputFiles, collecting the output data
for inFile in inputFiles:
resourceDocument = minidom.parse(inFile)
classes.append(self.GenerateClasses(resourceDocument))
if embedResources:
res = self.GenerateInitResourcesEmbedded(inFile, resourceDocument)
else:
res = self.GenerateInitResourcesFile(inFile, resourceDocument)
resources.append(res)
if generateGetText:
gettextStrings += self.FindStringsInNode(resourceDocument.firstChild)
# now write it all out
print >>outputFile, self.templates.FILE_HEADER
print >>outputFile, self.GenerateClasses(resourceDocument)
print >>outputFile, "\n".join(classes)
print >>outputFile, self.templates.INIT_RESOURE_HEADER
if embedResources:
print >>outputFile, self.GenerateInitResourcesEmbedded(resourceFilename, resourceDocument)
else:
print >>outputFile, self.GenerateInitResourcesFile(resourceFilename, resourceDocument)
print >>outputFile, self.templates.PREPARE_MEMFS
print >>outputFile, "\n".join(resources)
if generateGetText:
print >>outputFile, self.GenerateGetText(resourceDocument)
gettextStrings = [' _("%s")' % s for s in gettextStrings]
gettextStrings = "\n".join(gettextStrings)
print >>outputFile, self.templates.GETTEXT_DUMMY_FUNC % gettextStrings
#-------------------------------------------------------------------
def MakeGetTextOutput(self, inputFiles, outputFilename):
"""
Just output the gettext strings by themselves, with no other
code generation.
"""
outputFile = self._OpenOutputFile(outputFilename)
for inFile in inputFiles:
resourceDocument = minidom.parse(inFile)
resource = resourceDocument.firstChild
strings = self.FindStringsInNode(resource)
strings = ['_("%s");' % s for s in strings]
print >>outputFile, "\n".join(strings)
#-------------------------------------------------------------------
@@ -187,20 +213,8 @@ class XmlResourceCompiler:
#-------------------------------------------------------------------
def GenerateGetText(self, resourceDocument):
resource = resourceDocument.firstChild
strings = self.FindStringsInNode(resource)
strings = [' _("%s")\n' % s for s in strings]
gettextStrings = "".join(strings)
return self.templates.GETTEXT_DUMMY_FUNC % locals()
#-------------------------------------------------------------------
def GenerateInitResourcesEmbedded(self, resourceFilename, resourceDocument):
outputList = []
outputList.append(self.templates.INIT_RESOURE_HEADER)
files = []
resourcePath = os.path.split(resourceFilename)[0]
@@ -218,8 +232,6 @@ class XmlResourceCompiler:
fileData = self.FileToString(os.path.join(resourcePath, f))
outputList.append(self.templates.FILE_AS_STRING % locals())
outputList.append(self.templates.PREPARE_MEMFS % locals())
for f in [resourceFilename] + files:
filename = self.GetMemoryFilename(f)
outputList.append(self.templates.ADD_FILE_TO_MEMFS % locals())
@@ -234,7 +246,6 @@ class XmlResourceCompiler:
# take only the filename portion out of resourceFilename
resourceFilename = os.path.split(resourceFilename)[1]
outputList = []
outputList.append(self.templates.INIT_RESOURE_HEADER)
outputList.append(self.templates.LOAD_RES_FILE % locals())
return "".join(outputList)
@@ -416,27 +427,44 @@ class XmlResourceCompiler:
return st2
#-------------------------------------------------------------------
def _OpenOutputFile(self, outputFilename):
if outputFilename == "-":
outputFile = sys.stdout
else:
try:
outputFile = open(outputFilename, "wt")
except IOError:
raise IOError("Can't write output to '%s'" % outputFilename)
return outputFile
#---------------------------------------------------------------------------
def main(args):
resourceFilename = ""
outputFilename = ""
outputFilename = None
embedResources = False
generateGetText = False
generatePython = False
try:
opts, args = getopt.gnu_getopt(args, "hego:", "help embed gettext output=".split())
opts, args = getopt.gnu_getopt(args,
"hpgeo:",
"help python gettext embed output=".split())
except getopt.GetoptError, e:
print "\nError : %s\n" % str(e)
print __doc__
sys.exit(1)
# If there is no input file argument, show help and exit
if args:
resourceFilename = args[0]
else:
if not args:
print __doc__
print "No xrc input file was specified."
sys.exit(1)
# Parse options and arguments
@@ -445,6 +473,9 @@ def main(args):
print __doc__
sys.exit(1)
if opt in ["-p", "--python"]:
generatePython = True
if opt in ["-o", "--output"]:
outputFilename = val
@@ -454,13 +485,33 @@ def main(args):
if opt in ["-g", "--gettext"]:
generateGetText = True
if outputFilename is None or outputFilename == "":
outputFilename = os.path.splitext(resourceFilename)[0] + "_xrc.py"
# check for and expand any wildcards in the list of input files
inputFiles = []
for arg in args:
inputFiles += glob.glob(arg)
comp = XmlResourceCompiler()
try:
comp.MakePythonModule(resourceFilename, outputFilename, embedResources, generateGetText)
if generatePython:
if not outputFilename:
outputFilename = os.path.splitext(args[0])[0] + "_xrc.py"
comp.MakePythonModule(inputFiles, outputFilename,
embedResources, generateGetText)
elif generateGetText:
if not outputFilename:
outputFilename = '-'
comp.MakeGetTextOutput(inputFiles, outputFilename)
else:
print __doc__
print "One or both of -p, -g must be specified."
sys.exit(1)
except IOError, e:
print >>sys.stderr, "%s." % str(e)
else: