Convert the View AST into an XML fragment
| 66 | |
| 67 | |
| 68 | class ConvertXML(BaseProcessor): |
| 69 | """Convert the View AST into an XML fragment""" |
| 70 | |
| 71 | local_post_xslt = etree.parse(str(local_view_resources / "local_post_process.xslt")) |
| 72 | local_post_transform = etree.XSLT(local_post_xslt) |
| 73 | |
| 74 | def __init__(self, *, pretty_print: bool = False, fragment: bool = False) -> None: |
| 75 | self.pretty_print: bool = pretty_print |
| 76 | self.fragment: bool = fragment |
| 77 | super().__init__() |
| 78 | |
| 79 | def __call__(self, _: t.Any) -> ElementT: |
| 80 | initial_doc = self.convert_xml() |
| 81 | transformed_doc = self.post_transforms(initial_doc) |
| 82 | |
| 83 | # convert to string |
| 84 | view_xml_str: str = etree.tounicode(transformed_doc, pretty_print=self.pretty_print) |
| 85 | # s1 = dc.replace(s, view_xml=view_xml_str) |
| 86 | self.s.view_xml = view_xml_str |
| 87 | |
| 88 | if log.isEnabledFor(logging.DEBUG): |
| 89 | log.debug(etree.tounicode(transformed_doc, pretty_print=True)) |
| 90 | |
| 91 | # return the doc for further processing (xml str stored in state) |
| 92 | return transformed_doc |
| 93 | |
| 94 | def convert_xml(self) -> ElementT: |
| 95 | # create initial state |
| 96 | builder_state = XMLBuilder(store=self.s.store) |
| 97 | self.s.blocks.accept(builder_state) |
| 98 | return builder_state.get_root(self.fragment) |
| 99 | |
| 100 | def post_transforms(self, view_doc: ElementT) -> ElementT: |
| 101 | # TODO - post-xml transformations, essentially xslt / lxml-based DOM operations |
| 102 | # post_process via xslt |
| 103 | processed_view_doc: ElementT = self.local_post_transform(view_doc) |
| 104 | |
| 105 | # TODO - custom lxml-based transforms go here... |
| 106 | |
| 107 | # validate post all transformations |
| 108 | validate_view_doc(xml_doc=processed_view_doc) |
| 109 | return processed_view_doc |
| 110 | |
| 111 | |
| 112 | class PreUploadProcessor(BaseProcessor): |
no outgoing calls