(elem, loader, base_url, max_depth, _parent_hrefs)
| 130 | |
| 131 | |
| 132 | def _include(elem, loader, base_url, max_depth, _parent_hrefs): |
| 133 | # look for xinclude elements |
| 134 | i = 0 |
| 135 | while i < len(elem): |
| 136 | e = elem[i] |
| 137 | if e.tag == XINCLUDE_INCLUDE: |
| 138 | # process xinclude directive |
| 139 | href = e.get("href") |
| 140 | if base_url: |
| 141 | href = urljoin(base_url, href) |
| 142 | parse = e.get("parse", "xml") |
| 143 | if parse == "xml": |
| 144 | if href in _parent_hrefs: |
| 145 | raise FatalIncludeError("recursive include of %s" % href) |
| 146 | if max_depth == 0: |
| 147 | raise LimitedRecursiveIncludeError( |
| 148 | "maximum xinclude depth reached when including file %s" % href) |
| 149 | _parent_hrefs.add(href) |
| 150 | node = loader(href, parse) |
| 151 | if node is None: |
| 152 | raise FatalIncludeError( |
| 153 | "cannot load %r as %r" % (href, parse) |
| 154 | ) |
| 155 | node = copy.copy(node) # FIXME: this makes little sense with recursive includes |
| 156 | _include(node, loader, href, max_depth - 1, _parent_hrefs) |
| 157 | _parent_hrefs.remove(href) |
| 158 | if e.tail: |
| 159 | node.tail = (node.tail or "") + e.tail |
| 160 | elem[i] = node |
| 161 | elif parse == "text": |
| 162 | text = loader(href, parse, e.get("encoding")) |
| 163 | if text is None: |
| 164 | raise FatalIncludeError( |
| 165 | "cannot load %r as %r" % (href, parse) |
| 166 | ) |
| 167 | if e.tail: |
| 168 | text += e.tail |
| 169 | if i: |
| 170 | node = elem[i-1] |
| 171 | node.tail = (node.tail or "") + text |
| 172 | else: |
| 173 | elem.text = (elem.text or "") + text |
| 174 | del elem[i] |
| 175 | continue |
| 176 | else: |
| 177 | raise FatalIncludeError( |
| 178 | "unknown parse type in xi:include tag (%r)" % parse |
| 179 | ) |
| 180 | elif e.tag == XINCLUDE_FALLBACK: |
| 181 | raise FatalIncludeError( |
| 182 | "xi:fallback tag must be child of xi:include (%r)" % e.tag |
| 183 | ) |
| 184 | else: |
| 185 | _include(e, loader, base_url, max_depth, _parent_hrefs) |
| 186 | i += 1 |
no test coverage detected
searching dependent graphs…