12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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":
- 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(
- creator=creator,
- fileversion=fileversion,
- 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)
|