diff options
author | Sebastian Koslowski <sebastian.koslowski@gmail.com> | 2016-05-03 17:13:08 +0200 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2017-06-29 09:16:49 -0700 |
commit | 7f7fa2f91467fdb2b11312be8562e7b51fdeb199 (patch) | |
tree | 24268bac15b9920d2a15ddbb45eaf3b9b03718a1 /grc/converter/xml.py | |
parent | 44cae388881821942e691a4d69a923bbd8d347db (diff) |
grc: added yaml/mako support
Includes basic converter from XML/Cheetah to YAML/Mako based block format.
Diffstat (limited to 'grc/converter/xml.py')
-rw-r--r-- | grc/converter/xml.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/grc/converter/xml.py b/grc/converter/xml.py new file mode 100644 index 0000000000..2eda786c0f --- /dev/null +++ b/grc/converter/xml.py @@ -0,0 +1,82 @@ +# Copyright 2017 Free Software Foundation, Inc. +# This file is part of GNU Radio +# +# GNU Radio Companion is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# GNU Radio Companion is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +from __future__ import absolute_import, division + +import re +from os import path + +try: + # raise ImportError() + from lxml import etree + HAVE_LXML = True +except ImportError: + import xml.etree.ElementTree as etree + HAVE_LXML = False + + +_validator_cache = {None: lambda xml: True} + + +def _get_validator(dtd=None): + validator = _validator_cache.get(dtd) + if not validator: + if not path.isabs(dtd): + dtd = path.join(path.dirname(__file__), dtd) + validator = _validator_cache[dtd] = etree.DTD(dtd).validate + return validator + + +def load_lxml(filename, document_type_def=None): + """Load block description from xml file""" + + try: + xml_tree = etree.parse(filename) + _get_validator(document_type_def) + element = xml_tree.getroot() + except etree.LxmlError: + raise ValueError("Failed to parse or validate {}".format(filename)) + + version_info = {} + for inst in xml_tree.xpath('/processing-instruction()'): + if inst.target == 'grc': + version_info.update(inst.attrib) + + return element, version_info + + +def load_stdlib(filename, document_type_def=None): + """Load block description from xml file""" + + with open(filename, 'rb') as xml_file: + data = xml_file.read().decode('utf-8') + + try: + element = etree.fromstring(data) + except etree.ParseError: + raise ValueError("Failed to parse {}".format(filename)) + + version_info = {} + for body in re.findall(r'<\?(.*?)\?>', data): + element = etree.fromstring('<' + body + '/>') + if element.tag == 'grc': + version_info.update(element.attrib) + + return element, version_info + + +load = load_lxml if HAVE_LXML else load_stdlib |