#!/usr/bin/env python################################################################################# Copyright (C) 2010 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 sysimport osimport xml.dom.minidomdoc_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 Falsedef _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.nodeValuedef 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'].nodeValuedef 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