wesnoth/data/tools/pywmlx/nodemanip.py

118 lines
3.6 KiB
Python

import re
import pywmlx.postring as pos
from pywmlx.wmlerr import wmlerr
from pywmlx.wmlerr import wmlwarn
fileref = None
fileno = None
nodes = None
onDefineMacro = False
def _closenode_update_dict(podict):
if nodes[-1].sentences is not None:
for i in nodes[-1].sentences:
posentence = podict.get(i.sentence)
if posentence is None:
podict[i.sentence] = (
nodes[-1].nodesentence_to_posentence(i) )
else:
posentence.update_with_commented_string(
nodes[-1].nodesentence_to_posentence(i) )
def newfile(file_ref, file_no):
global fileref
global fileno
global nodes
global onDefineMacro
onDefineMacro = False
fileref = file_ref
fileno = file_no
if nodes is not None:
del nodes[:]
nodes = None
def closefile(mydict, lineno):
if nodes is not None:
if len(nodes) > 1:
err_message = ("End of WML file reached, but some tags were " +
"not properly closed.\n"
"(nearest unclosed tag is: " +
nodes[-1].tagname + ")" )
finfo = fileref + ":" + str(lineno)
wmlerr(finfo, err_message)
else:
_closenode_update_dict(mydict)
def newnode(tagname):
global fileref
global fileno
global nodes
if nodes is None:
nodes = [pos.WmlNode(fileref, fileno, "", autowml=False)]
if tagname == "[lua]":
nodes.append( pos.WmlNode(fileref, fileno,
tagname, autowml=False) )
else:
nodes.append( pos.WmlNode(fileref, fileno,
tagname, autowml=True) )
def closenode(closetag, mydict, lineno):
global fileref
global fileno
global nodes
if nodes is None:
err_message = ("unexpected closing tag '" +
closetag + "' outside any scope.")
finfo = fileref + ":" + str(lineno)
wmlerr(finfo, err_message)
else:
# node to close is the LAST element in self.nodes list
mytag = nodes[-1].tagname
mynode = nodes[-1]
expected_closetag = re.sub(r'\[', r'[/', mytag)
finfo = fileref + ":" + str(lineno)
if mynode.tagname == "":
err_message = ("unexpected closing tag '" +
closetag + "' outside any scope.")
wmlerr(finfo, err_message)
else:
if closetag != expected_closetag:
err_message = ("expected closing tag '" +
expected_closetag + "' but '" +
closetag + "' found.")
wmlerr(finfo, err_message)
_closenode_update_dict(mydict)
nodes.pop()
def addNodeSentence(sentence, *, ismultiline, lineno, lineno_sub,
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,
plural=plural)
def addWmlInfo(info):
global nodes
if nodes is None:
nodes = [pos.WmlNode(fileref=fileref, fileno=fileno,
tagname="", autowml=False)]
if nodes[-1].wmlinfos is None:
nodes[-1].wmlinfos = []
nodes[-1].wmlinfos.append(info)