|
@@ -0,0 +1,77 @@
|
|
|
+import abstract_syntax
|
|
|
+
|
|
|
+def parseFile(path) -> abstract_syntax.XournalFile:
|
|
|
+ """Parse a .xopp file."""
|
|
|
+
|
|
|
+ def parseLayer(context):
|
|
|
+ elements = []
|
|
|
+ for (event, element) in context:
|
|
|
+ if event == "start":
|
|
|
+ if element.tag == "text":
|
|
|
+ elements.append(
|
|
|
+ abstract_syntax.Text(
|
|
|
+ text=element.text, attributes=element.attrib))
|
|
|
+ elif element.tag == "stroke":
|
|
|
+ elements.append(
|
|
|
+ abstract_syntax.Stroke(
|
|
|
+ values=element.text, attributes=element.attrib))
|
|
|
+ else:
|
|
|
+ raise Error("Unsupported tag:" + element.tag)
|
|
|
+ elif event == "end":
|
|
|
+ if element.tag == "layer":
|
|
|
+ return abstract_syntax.Layer(elements=elements)
|
|
|
+
|
|
|
+ def parsePage(element, context):
|
|
|
+ from decimal import Decimal
|
|
|
+ width = Decimal(element.get("width"))
|
|
|
+ height = Decimal(element.get("height"))
|
|
|
+ layers = []
|
|
|
+ for (event, element) in context:
|
|
|
+ if event == "start":
|
|
|
+ if element.tag == "background":
|
|
|
+ background = abstract_syntax.Background(
|
|
|
+ type=element.get("type"),
|
|
|
+ color=element.get("color"),
|
|
|
+ style=element.get("plain"))
|
|
|
+ elif element.tag == "layer":
|
|
|
+ layers.append(parseLayer(context))
|
|
|
+ else:
|
|
|
+ raise Error("Unsupported tag:" + element.tag)
|
|
|
+ elif event == "end":
|
|
|
+ if element.tag == "page":
|
|
|
+ return abstract_syntax.Page(
|
|
|
+ width=width,
|
|
|
+ height=height,
|
|
|
+ background=background,
|
|
|
+ layers=layers)
|
|
|
+
|
|
|
+ def parseXournal(context):
|
|
|
+ pages = []
|
|
|
+ for (event, element) in context:
|
|
|
+ if event == "start":
|
|
|
+ if element.tag == "xournal":
|
|
|
+ header = abstract_syntax.Header(
|
|
|
+ creator=element.get("creator"),
|
|
|
+ fileversion=int(element.get("fileversion")),
|
|
|
+ )
|
|
|
+ elif element.tag == "title":
|
|
|
+ title = element.text
|
|
|
+ elif element.tag == "preview":
|
|
|
+ import base64
|
|
|
+ preview = base64.b64decode(element.text)
|
|
|
+ elif element.tag == "page":
|
|
|
+ pages.append(parsePage(element, context))
|
|
|
+ else:
|
|
|
+ raise Error("Unsupported tag:" + element.tag)
|
|
|
+
|
|
|
+ return abstract_syntax.XournalFile(
|
|
|
+ header=header,
|
|
|
+ title=title,
|
|
|
+ preview=preview,
|
|
|
+ pages=pages)
|
|
|
+
|
|
|
+ import gzip
|
|
|
+ with gzip.open(path, mode='rt') as f:
|
|
|
+ from xml.etree import ElementTree
|
|
|
+ context = ElementTree.iterparse(f, events=["start", "end"])
|
|
|
+ return parseXournal(context)
|