summaryrefslogtreecommitdiff
path: root/itstool.in
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2012-09-26 07:46:10 -0400
committerShaun McCance <shaunm@gnome.org>2012-09-26 07:46:10 -0400
commit24811c8cfcbc14cc480a2fbef2288245019f8a7e (patch)
tree4d6fa2a872f60f6f2049b6686ac5ff5d562f4b2d /itstool.in
parent1440e3b495ae502658e5e5ede6c09babce4bc4f9 (diff)
downloaditstool-24811c8cfcbc14cc480a2fbef2288245019f8a7e.tar.gz
Implemented ITS 2.0 "ID Value" data category
Diffstat (limited to 'itstool.in')
-rwxr-xr-xitstool.in48
1 files changed, 47 insertions, 1 deletions
diff --git a/itstool.in b/itstool.in
index ec9cf72..3aff4ea 100755
--- a/itstool.in
+++ b/itstool.in
@@ -34,6 +34,7 @@ NS_ITS = 'http://www.w3.org/2005/11/its'
NS_ITST = 'http://itstool.org/extensions/'
NS_BLANK = 'http://itstool.org/extensions/blank/'
NS_XLINK = 'http://www.w3.org/1999/xlink'
+NS_XML = 'http://www.w3.org/XML/1998/namespace'
class NoneTranslations:
def gettext(self, message):
@@ -94,6 +95,8 @@ class MessageList (object):
msgdict[key].add_marker(marker)
for comment in msg.get_comments():
msgdict[key].add_comment(comment)
+ for idvalue in msg.get_id_values():
+ msgdict[key].add_id_value(idvalue)
if msg.get_preserve_space():
msgdict[key].set_preserve_space()
if msg.get_locale_filter() is not None:
@@ -174,6 +177,7 @@ class Message (object):
self._placeholders = []
self._sources = []
self._markers = []
+ self._id_values = []
self._locale_filter = None
self._comments = []
self._preserve = False
@@ -268,6 +272,12 @@ class Message (object):
def get_markers (self):
return self._markers
+ def add_id_value(self, id_value):
+ self._id_values.append(id_value)
+
+ def get_id_values(self):
+ return self._id_values
+
def add_comment (self, comment):
if comment is not None:
self._comments.append(comment)
@@ -307,6 +317,8 @@ class Message (object):
if not markers.has_key(marker):
ret += '#. (itstool) path: ' + marker + '\n'
markers[marker] = marker
+ for idvalue in self._id_values:
+ ret += '#. (itstool) id: ' + idvalue + '\n'
if self._locale_filter is not None:
ret += '#. (itstool) locale filter: ' + self._locale_filter + '\n'
comments = []
@@ -471,7 +483,7 @@ class Document (object):
self._its_translate_nodes = {}
self._its_within_text_nodes = {}
self._its_locale_filters = {}
-
+ self._its_id_values = {}
self._its_loc_notes = {}
self._its_preserve_space_nodes = {}
self._itst_drop_nodes = {}
@@ -514,6 +526,25 @@ class Document (object):
if rule.nsProp('selector', None) is not None:
for node in self._try_xpath_eval(xpath, rule.nsProp('selector', None)):
self._itst_drop_nodes[node] = rule.nsProp('drop', None)
+ elif xml_is_ns_name(rule, NS_ITS, 'idValueRule'):
+ sel = rule.nsProp('selector', None)
+ idv = rule.nsProp('idValue', None)
+ if sel is not None and idv is not None:
+ for node in self._try_xpath_eval(xpath, sel):
+ try:
+ oldnode = xpath.contextNode()
+ except:
+ oldnode = None
+ xpath.setContextNode(node)
+ idvalue = self._try_xpath_eval(xpath, idv)
+ if isinstance(idvalue, basestring):
+ self._its_id_values[node] = idvalue
+ else:
+ for val in idvalues:
+ self._its_id_values[node] = val.content
+ break
+ xpath.setContextNode(oldnode)
+ pass
elif xml_is_ns_name(rule, NS_ITST, 'contextRule'):
if rule.nsProp('selector', None) is not None:
for node in self._try_xpath_eval(xpath, rule.nsProp('selector', None)):
@@ -982,6 +1013,10 @@ class Document (object):
ctxt = self._itst_contexts.get(node)
if ctxt is not None:
msg.set_context(ctxt)
+ idvalue = self.get_its_id_value(node)
+ if idvalue is not None:
+ basename = os.path.basename(self._filename)
+ msg.add_id_value(basename + '#' + idvalue)
if self.get_preserve_space(node):
msg.set_preserve_space()
if self.get_its_locale_filter(node) != '*':
@@ -1025,6 +1060,10 @@ class Document (object):
self.generate_external_resource_message(node)
for attr in xml_attr_iter(node):
self.generate_external_resource_message(attr)
+ idvalue = self.get_its_id_value(node)
+ if idvalue is not None:
+ basename = os.path.basename(self._filename)
+ msg.add_id_value(basename + '#' + idvalue)
if withinText:
path = path + '/' + node.name
@@ -1130,6 +1169,11 @@ class Document (object):
return 'yes'
return 'no'
+ def get_its_id_value(self, node):
+ if node.hasNsProp('id', NS_XML):
+ return node.nsProp('id', NS_XML)
+ return self._its_id_values.get(node, None)
+
def get_its_loc_notes(self, node):
ret = []
if node.hasNsProp('locNote', NS_ITS):
@@ -1157,6 +1201,8 @@ class Document (object):
compval = 'its:localeFilterList="%s"' % self.get_its_locale_filter(node)
elif category == 'externalResourceRefPointer':
compval = 'its:externalResourceRefPointer="%s"' % self._its_externals.get(node, '')
+ elif category == 'idValue':
+ compval = 'its:idValue="%s"' % (self.get_its_id_value(node) or '')
else:
sys.stderr.write('Error: Unrecognized category %s\n' % category)
sys.exit(1)