parser.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import abstract_syntax
  2. def parseFile(path) -> abstract_syntax.XournalFile:
  3. """Parse a .xopp file."""
  4. def parseLayer(context):
  5. elements = []
  6. for (event, element) in context:
  7. if event == "start":
  8. if element.tag == "text":
  9. elements.append(
  10. abstract_syntax.Text(
  11. text=element.text, attributes=element.attrib))
  12. elif element.tag == "stroke":
  13. elements.append(
  14. abstract_syntax.Stroke(
  15. values=element.text, attributes=element.attrib))
  16. else:
  17. raise Error("Unsupported tag:" + element.tag)
  18. elif event == "end":
  19. if element.tag == "layer":
  20. return abstract_syntax.Layer(elements=elements)
  21. def parsePage(element, context):
  22. from decimal import Decimal
  23. width = Decimal(element.get("width"))
  24. height = Decimal(element.get("height"))
  25. layers = []
  26. for (event, element) in context:
  27. if event == "start":
  28. if element.tag == "background":
  29. background = abstract_syntax.Background(
  30. type=element.get("type"),
  31. color=element.get("color"),
  32. style=element.get("plain"))
  33. elif element.tag == "layer":
  34. layers.append(parseLayer(context))
  35. else:
  36. raise Error("Unsupported tag:" + element.tag)
  37. elif event == "end":
  38. if element.tag == "page":
  39. return abstract_syntax.Page(
  40. width=width,
  41. height=height,
  42. background=background,
  43. layers=layers)
  44. def parseXournal(context):
  45. pages = []
  46. for (event, element) in context:
  47. if event == "start":
  48. if element.tag == "xournal":
  49. creator=element.get("creator")
  50. fileversion=int(element.get("fileversion"))
  51. elif element.tag == "title":
  52. title = element.text
  53. elif element.tag == "preview":
  54. import base64
  55. preview = base64.b64decode(element.text)
  56. elif element.tag == "page":
  57. pages.append(parsePage(element, context))
  58. else:
  59. raise Error("Unsupported tag:" + element.tag)
  60. return abstract_syntax.XournalFile(
  61. creator=creator,
  62. fileversion=fileversion,
  63. title=title,
  64. preview=preview,
  65. pages=pages)
  66. import gzip
  67. with gzip.open(path, mode='rt') as f:
  68. from xml.etree import ElementTree
  69. context = ElementTree.iterparse(f, events=["start", "end"])
  70. return parseXournal(context)