The prefix normalizer provides namespace prefix normalization. @ivar node: A node to normalize. @type node: L{Element} @ivar branch: The nodes flattened branch. @type branch: [L{Element},..] @ivar namespaces: A unique list of namespaces (URI). @type namespaces: [str,]
| 986 | |
| 987 | |
| 988 | class PrefixNormalizer: |
| 989 | """ |
| 990 | The prefix normalizer provides namespace prefix normalization. |
| 991 | @ivar node: A node to normalize. |
| 992 | @type node: L{Element} |
| 993 | @ivar branch: The nodes flattened branch. |
| 994 | @type branch: [L{Element},..] |
| 995 | @ivar namespaces: A unique list of namespaces (URI). |
| 996 | @type namespaces: [str,] |
| 997 | @ivar prefixes: A reverse dict of prefixes. |
| 998 | @type prefixes: {u, p} |
| 999 | """ |
| 1000 | |
| 1001 | @classmethod |
| 1002 | def apply(cls, node): |
| 1003 | """ |
| 1004 | Normalize the specified node. |
| 1005 | @param node: A node to normalize. |
| 1006 | @type node: L{Element} |
| 1007 | @return: The normalized node. |
| 1008 | @rtype: L{Element} |
| 1009 | """ |
| 1010 | pn = PrefixNormalizer(node) |
| 1011 | return pn.refit() |
| 1012 | |
| 1013 | def __init__(self, node): |
| 1014 | """ |
| 1015 | @param node: A node to normalize. |
| 1016 | @type node: L{Element} |
| 1017 | """ |
| 1018 | self.node = node |
| 1019 | self.branch = node.branch() |
| 1020 | self.namespaces = self.getNamespaces() |
| 1021 | self.prefixes = self.genPrefixes() |
| 1022 | |
| 1023 | def getNamespaces(self): |
| 1024 | """ |
| 1025 | Get the I{unique} set of namespaces referenced in the branch. |
| 1026 | @return: A set of namespaces. |
| 1027 | @rtype: set |
| 1028 | """ |
| 1029 | s = set() |
| 1030 | for n in self.branch + self.node.ancestors(): |
| 1031 | if self.permit(n.expns): |
| 1032 | s.add(n.expns) |
| 1033 | s = s.union(self.pset(n)) |
| 1034 | return s |
| 1035 | |
| 1036 | def pset(self, n): |
| 1037 | """ |
| 1038 | Convert the nodes nsprefixes into a set. |
| 1039 | @param n: A node. |
| 1040 | @type n: L{Element} |
| 1041 | @return: A set of namespaces. |
| 1042 | @rtype: set |
| 1043 | """ |
| 1044 | s = set() |
| 1045 | for ns in n.nsprefixes.items(): |