diff -r 000000000000 -r 1918ee327afb util/local_database/xpathlite.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/local_database/xpathlite.py Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,149 @@ +#!/usr/bin/env python +############################################################################# +## +## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +## All rights reserved. +## Contact: Nokia Corporation (qt-info@nokia.com) +## +## This file is part of the test suite of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:LGPL$ +## No Commercial Usage +## This file contains pre-release code and may not be distributed. +## You may use this file in accordance with the terms and conditions +## contained in the Technology Preview License Agreement accompanying +## this package. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 2.1 requirements +## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## In addition, as a special exception, Nokia gives you certain additional +## rights. These rights are described in the Nokia Qt LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +## If you have questions regarding the use of this file, please contact +## Nokia at qt-info@nokia.com. +## +## +## +## +## +## +## +## +## $QT_END_LICENSE$ +## +############################################################################# + +import sys +import os +import xml.dom.minidom + +doc_cache = {} + +class DraftResolution: + # See http://www.unicode.org/cldr/process.html for description + unconfirmed = 'unconfirmed' + provisional = 'provisional' + contributed = 'contributed' + approved = 'approved' + + +def findChild(parent, tag_name, arg_value, draft=None): + for node in parent.childNodes: + if node.nodeType != node.ELEMENT_NODE: + continue + if node.nodeName != tag_name: + continue + if arg_value: + if not node.attributes.has_key('type'): + continue + if node.attributes['type'].nodeValue != arg_value: + continue + if draft: + if node.attributes.has_key('draft'): + if node.attributes['draft'].nodeValue != draft: + continue + elif draft != DraftResolution.approved: + continue + return node + return False + +def _findEntry(file, path, draft=None): + doc = False + if doc_cache.has_key(file): + doc = doc_cache[file] + else: + doc = xml.dom.minidom.parse(file) + doc_cache[file] = doc + + elt = doc.documentElement + tag_spec_list = path.split("/") + last_entry = None + if draft is not None: + last_entry = tag_spec_list[-1] + tag_spec_list = tag_spec_list[:-1] + for tag_spec in tag_spec_list: + tag_name = tag_spec + arg_value = '' + left_bracket = tag_spec.find('[') + if left_bracket != -1: + tag_name = tag_spec[:left_bracket] + arg_value = tag_spec[left_bracket+1:-1] + elt = findChild(elt, tag_name, arg_value) + if not elt: + return "" + if last_entry is not None: + elt = findChild(elt, last_entry, '', draft) + if not elt: + return "" + return elt.firstChild.nodeValue + +def findAlias(file): + doc = doc_cache[file] + alias_elt = findChild(doc.documentElement, "alias", "") + if not alias_elt: + return False + if not alias_elt.attributes.has_key('source'): + return False + return alias_elt.attributes['source'].nodeValue + +def findEntry(base, path, draft=None): + file = base + ".xml" + + if os.path.isfile(file): + result = _findEntry(file, path, draft) + if result: + return result + + alias = findAlias(file) + if alias: + file = os.path.dirname(base) + "/" + alias + ".xml" + if os.path.isfile(file): + result = _findEntry(file, path, draft) + if result: + return result + + file = base[:-3] + ".xml" + if os.path.isfile(file): + result = _findEntry(file, path, draft) + if result: + return result + alias = findAlias(file) + if alias: + file = os.path.dirname(base) + "/" + alias + ".xml" + if os.path.isfile(file): + result = _findEntry(file, path, draft) + if result: + return result + + if not draft: + file = os.path.dirname(base) + "/root.xml" + result = _findEntry(file, path, draft) + return result +