Skip to content

Commit

Permalink
Merge pull request #811 from AncientLich/wmlxgettext
Browse files Browse the repository at this point in the history
wmlxgettext: added support for plural forms (used on lua files)
  • Loading branch information
loonycyborg committed Oct 9, 2016
2 parents aabc655 + cb11bcc commit 1695e46
Show file tree
Hide file tree
Showing 5 changed files with 641 additions and 42 deletions.
8 changes: 3 additions & 5 deletions utils/pywmlx/nodemanip.py
Expand Up @@ -61,9 +61,6 @@ def newnode(tagname):
if tagname == "[lua]":
nodes.append( pos.WmlNode(fileref, fileno,
tagname, autowml=False) )
# elif tagname == "":
# self.nodes.append( WmlNode(self.fileref, self.fileno,
# "[unknown]", False) )
else:
nodes.append( pos.WmlNode(fileref, fileno,
tagname, autowml=True) )
Expand Down Expand Up @@ -100,14 +97,15 @@ def closenode(closetag, mydict, lineno):


def addNodeSentence(sentence, *, ismultiline, lineno, lineno_sub,
override, addition):
override, addition, plural=None):
global nodes
if nodes is None:
nodes = [pos.WmlNode(fileref=fileref, fileno=fileno,
tagname="", autowml=False)]
nodes[-1].add_sentence(sentence, ismultiline=ismultiline,
lineno=lineno, lineno_sub=lineno_sub,
override=override, addition=addition)
override=override, addition=addition,
plural=plural)


def addWmlInfo(info):
Expand Down
109 changes: 91 additions & 18 deletions utils/pywmlx/postring.py
@@ -1,15 +1,37 @@
import re



# PoCommentedStringPL represents a 'plural' form of a PoCommentedString or a
# WmlNode. Currently PoCommentedStringPL is actually used only within
# PoCommentedString
# (until wesnoth supports plural forms only on lua code)
class PoCommentedStringPL:
def __init__(self, value, *, ismultiline=False):
self.value = value
self.ismultiline = ismultiline



class PoCommentedString:
def __init__(self, sentence, *, orderid, ismultiline,
wmlinfos, finfos, addedinfos):
wmlinfos, finfos, addedinfos, plural=None):
self.sentence = sentence
self.wmlinfos = wmlinfos
self.addedinfos = addedinfos
self.finfos = finfos
self.orderid = orderid
self.ismultiline = ismultiline
self.plural = None
if isinstance(plural, PoCommentedStringPL):
self.plural = plural

def set_plural(self, plural_value, *, ismultiline=False):
# set_plural is a safe way to add a plural form into a sentence
# if plural form is still stored, no plural form is added
if self.plural is None:
self.plural = PoCommentedStringPL(plural_value, ismultiline)

def update_orderid(self, orderid):
if orderid < self.orderid:
self.orderid = orderid
Expand All @@ -22,9 +44,11 @@ def update_with_commented_string(self, commented_string):
self.addedinfos += commented_string.addedinfos
self.finfos += commented_string.finfos
self.update_orderid(commented_string.orderid)
# if commented_string.orderid < self.orderid:
# self.orderid = commented_string.orderid
# self.sentence = commented_string.sentence
# update plural value only if current sentence actually don't have
# a plural form
if self.plural is None and isinstance(commented_string.plural,
PoCommentedStringPL):
self.plural = commented_string.plural

def write(self, filebuf, fuzzy):
if self.wmlinfos is not None:
Expand All @@ -44,13 +68,19 @@ def write(self, filebuf, fuzzy):
self.sentence = re.sub(r'(\n\r|\r\n|[\n\r])', lf, self.sentence)
self.sentence = '""\n' + self.sentence
print('msgid', self.sentence, file=filebuf)
print('msgstr ""', file=filebuf)

if self.plural is None:
print('msgstr ""', file=filebuf)
else:
# self.plural must be an instance of PoCommentedStringPL
print('msgid_plural', self.plural.value, file=filebuf)
print('msgstr[0] ""', file=filebuf)
print('msgstr[1] ""', file=filebuf)


# WmlNodeSentence use PoCommentedStringPL for 'plural' parameter
class WmlNodeSentence:
def __init__(self, sentence, *, ismultiline, lineno, lineno_sub=0,
override=None, addition=None):
plural=None, override=None, addition=None):
self.sentence = sentence
# Say if it is multiline or not.
self.ismultiline = ismultiline
Expand All @@ -72,7 +102,18 @@ def __init__(self, sentence, *, ismultiline, lineno, lineno_sub=0,
# list will contains custom comment that will be added at the
# end of translator's comment list.
self.addedinfo = addition
if addition is None: self.addedinfo = []
if addition is None:
self.addedinfo = []
# plural forms (if any) will be stored in WmlNodeSentence
self.plural = None
if isinstance(plural, PoCommentedStringPL):
self.plural = plural

def set_plural(self, plural_value, *, ismultiline=False):
# add_plural is a safe way to add a plural form into a sentence
# if plural form is still stored, no plural form is added
if self.plural is None:
self.plural = PoCommentedStringPL(plural_value, ismultiline)



Expand All @@ -86,13 +127,37 @@ def __init__(self, fileref, fileno, tagname, *, autowml=True):
self.autowml = autowml

def add_sentence(self, sentence, *, ismultiline, lineno,
lineno_sub=0, override=None, addition=None):
lineno_sub=0, plural=None, override=None, addition=None):
if self.sentences is None:
self.sentences = []
# 'plural' parameter accepted by WmlNode.add_sentence can be:
# 1) A string
# 2) A tuple of two values (string, bool)
# 3) An actual PoCommentedStringPL object
# This is why we need to add an extra variable here (plural_value)
# wich will store an PoCommentedStringPL object (or will be None)
plural_value = None
if plural is not None:
if isinstance(plural, str):
plural_value = PoCommentedStringPL(plural)
elif isinstance(plural, tuple) or isinstance(plural, list):
if len(plural) == 2:
if(isinstance(plural[0], str) and
isinstance(plural[1], bool)):
plural_value = PoCommentedStringPL(plural[0],
plural[1])
elif(isinstance(plural[0], bool) and
isinstance(plural[1], str)):
plural_value = PoCommentedStringPL(plural[1],
plural[0])
elif isinstance(plural, PoCommentedStringPL):
plural_value = plural
plural = None
self.sentences.append( WmlNodeSentence(sentence,
ismultiline=ismultiline,
lineno=lineno,
lineno_sub=lineno_sub,
lineno_sub=lineno_sub,
plural=plural_value,
override=override,
addition=addition) )

Expand Down Expand Up @@ -139,15 +204,17 @@ def nodesentence_to_posentence(self, nodesentence):
wmlinfos=[],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=nodesentence.addedinfo)
addedinfos=nodesentence.addedinfo,
plural=nodesentence.plural )
else:
return PoCommentedString(nodesentence.sentence,
ismultiline=nodesentence.ismultiline,
orderid=self.assemble_orderid(nodesentence),
wmlinfos=[],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=[])
addedinfos=[],
plural=nodesentence.plural )
else: # having a non-empty override
if(nodesentence.addedinfo is not None and
nodesentence.addedinfo != ""):
Expand All @@ -157,15 +224,17 @@ def nodesentence_to_posentence(self, nodesentence):
wmlinfos=[nodesentence.overrideinfo],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=nodesentence.addedinfo)
addedinfos=nodesentence.addedinfo,
plural=nodesentence.plural )
else:
return PoCommentedString(nodesentence.sentence,
ismultiline=nodesentence.ismultiline,
orderid=self.assemble_orderid(nodesentence),
wmlinfos=[nodesentence.overrideinfo],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=[])
addedinfos=[],
plural=nodesentence.plural )
# if you don't have override and autowml is true
# --> wmlinfos will be always added
elif self.autowml == True:
Expand All @@ -177,15 +246,17 @@ def nodesentence_to_posentence(self, nodesentence):
wmlinfos=[self.assemble_wmlinfo()],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=nodesentence.addedinfo)
addedinfos=nodesentence.addedinfo,
plural=nodesentence.plural )
else:
return PoCommentedString(nodesentence.sentence,
ismultiline=nodesentence.ismultiline,
orderid=self.assemble_orderid(nodesentence),
wmlinfos=[self.assemble_wmlinfo()],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=[])
addedinfos=[],
plural=nodesentence.plural )
# if you don't have override and autowml is false
# --> wmlinfos will never added
else:
Expand All @@ -197,13 +268,15 @@ def nodesentence_to_posentence(self, nodesentence):
wmlinfos=[],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=nodesentence.addedinfo)
addedinfos=nodesentence.addedinfo,
plural=nodesentence.plural )
else:
return PoCommentedString(nodesentence.sentence,
ismultiline=nodesentence.ismultiline,
orderid=self.assemble_orderid(nodesentence),
wml_infos=[],
finfos=[self.fileref +
str(nodesentence.lineno)],
addedinfos=[])
addedinfos=[],
plural=nodesentence.plural )

0 comments on commit 1695e46

Please sign in to comment.