Ai
3 Star 0 Fork 0

Gitee 极速下载/cxml-xml

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/python-openxml/cxml
克隆/下载
translator.py 6.17 KB
一键复制 编辑 原始数据 按行查看 历史
Steve Canny 提交于 2015-03-03 15:57 +08:00 . first version
# encoding: utf-8
"""
Translator taking a CXML abstract syntax tree (AST) and producing an object
graph rooted in a |RootElement| object.
"""
from __future__ import (
absolute_import, division, print_function, unicode_literals
)
from .model import (
Element, NamespaceDeclaration, RootElement, StringAttribute
)
from .symbols import attrs, qname
class CxmlTranslator(object):
"""
Constructs a |RootElement| object (with its graph) corresponding to
a Compact XML Expression Language (CXML) abstract syntax tree (AST).
"""
@classmethod
def translate(cls, tree):
"""
Return a |RootElement| object corresponding to the AST in *tree*,
containing all the right children, with all the right attributes,
etc.
"""
cxml_translator = cls()
return cxml_translator.evaluate(tree)
# -----------------------------------------------------------------------
# node evaluation methods
# -----------------------------------------------------------------------
# The role of a node evaluation method is to reduce an AST node to the
# graph subtree appropriate to the translator, like a StringAttribute
# object, etc.
# -----------------------------------------------------------------------
def evaluate(self, node):
"""
Return the value obtained by dispatching *node* to the appropriate
eval method.
"""
eval_method = getattr(self, node.name)
return eval_method(node)
def nsdecl(self, node):
"""
Return a |NamespaceDeclaration| object constructed from the
token.lexemes in *node*.
"""
name_token, _ = node.child_nodes
nspfx = name_token.lexeme
return NamespaceDeclaration(nspfx)
def qname(self, node):
"""
Return the qualified name in *node* as a single string, e.g.
'w:rPr'.
"""
return ''.join(token.lexeme for token in node.child_nodes)
def str_attr(self, node):
"""
Return a |StringAttribute| object constructed from the AST *node*.
"""
qname_node, _, text_token = node.child_nodes
qname = self.evaluate(qname_node)
value = text_token.lexeme
return StringAttribute.new(qname, value)
def attr(self, node):
"""
Return a |StringAttribute| or |NamespaceDeclaration| object,
depending on the production in *node*.
"""
str_attr_or_nsdecl_node, = node.child_nodes
return self.evaluate(str_attr_or_nsdecl_node)
def attr_list(self, node):
"""
Return a list of attribute objects produced from *node*.
"""
nodes = node.child_nodes
if len(nodes) == 1:
attr_node, = nodes
return [self.evaluate(attr_node)]
attr_node, _, attr_list_node = nodes
attr = self.evaluate(attr_node)
attr_list = self.evaluate(attr_list_node)
return [attr] + attr_list
def attrs(self, node):
"""
Return a list of attribute objects produced from *node*.
"""
_, attr_list_node, _ = node.child_nodes
return self.evaluate(attr_list_node)
def element(self, node):
"""
Return an |Element| object constructed from the values in *node*.
"""
qname_val, attrs_val, text = None, [], ''
for node in node.child_nodes:
symbol = node.symbol
if symbol == qname:
qname_val = self.evaluate(node)
elif symbol == attrs:
attrs_val = self.evaluate(node)
else:
# node is a TEXT token
text = node.lexeme
return Element.new(qname_val, attrs_val, text)
def tree(self, node):
"""
Return an (element, trees) pair constructed from the values in
*node*. The root element of each tree in *trees* is added to
*element* as a child.
"""
nodes = node.child_nodes
if len(nodes) == 1:
element_node, = nodes
return self.evaluate(element_node), []
element_node, _, trees_node = nodes
element = self.evaluate(element_node)
trees = self.evaluate(trees_node)
for child, _ in trees:
element.add_child(child)
return element, trees
def tree_list(self, node):
"""
Return a list of tree objects produced from *node*.
"""
nodes = node.child_nodes
if len(nodes) == 1:
tree_node, = nodes
return [self.evaluate(tree_node)]
tree_node, _, tree_list_node = nodes
tree = self.evaluate(tree_node)
tree_list = self.evaluate(tree_list_node)
return [tree] + tree_list
def trees(self, node):
"""
Return a list of linked tree objects produced from *node*.
"""
nodes = node.child_nodes
if len(nodes) == 1:
tree_node, = nodes
return [self.evaluate(tree_node)]
_, tree_list_node, _ = nodes
return self.evaluate(tree_list_node)
def root_element(self, node):
"""
Return a |RootElement| object constructed from the values in *node*.
"""
qname_val, attrs_val, text = None, [], ''
for node in node.child_nodes:
symbol = node.symbol
if symbol == qname:
qname_val = self.evaluate(node)
elif symbol == attrs:
attrs_val = self.evaluate(node)
else:
# node is a TEXT token
text = node.lexeme
return RootElement.new(qname_val, attrs_val, text)
def root(self, node):
"""
Return a |RootElement| object, having linked its children to it.
"""
nodes = node.child_nodes
if len(nodes) == 2: # root_element + SNTL
root_element_node, _ = nodes
root_element = self.evaluate(root_element_node)
return root_element
root_element_node, slash_token, trees_node, _ = nodes
root_element = self.evaluate(root_element_node)
trees = self.evaluate(trees_node)
for child, _ in trees:
root_element.add_child(child)
return root_element
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mirrors/cxml-xml.git
git@gitee.com:mirrors/cxml-xml.git
mirrors
cxml-xml
cxml-xml
master

搜索帮助