From c745dc42ebecf0e66cc68b02b12b881b0670d619 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Mon, 13 Mar 2023 15:20:04 +0100 Subject: [PATCH 01/10] Update OML generator with latest vocabulary version. --- src/xopp2oml/README.md | 2 +- src/xopp2oml/template.oml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/xopp2oml/README.md b/src/xopp2oml/README.md index 34a1eed..114940f 100644 --- a/src/xopp2oml/README.md +++ b/src/xopp2oml/README.md @@ -2,4 +2,4 @@ This exporter generates OML descriptions that use the following vocabulary: -https://msdl.uantwerpen.be/git/lucasalbertins/DTDesign/src/d070f9e9e932ad9910eaab92eabc368e7ee96058/examples/oml/CDF/src/oml/flandersmake.be/cdf/vocabulary/xopp.oml \ No newline at end of file +https://msdl.uantwerpen.be/git/lucasalbertins/DTDesign/src/15c791c78589f9c064fc402feec5228b5a80f549/examples/oml/CDF/src/oml/flandersmake.be/cdf/vocabulary/xopp.oml \ No newline at end of file diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index afd77db..5c6f511 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -1,8 +1,8 @@ {%- macro attributes(pageindex, page, layerindex, layer, elementindex, element) -%} {%- for key,value in element.attributes.items() %} ci p{{pageindex}}l{{layerindex}}e{{elementindex}}a{{loop.index}} : xopp:XMLAttribute [ - xopp:hasKey "{{key}}" - xopp:hasValue "{{value}}" + dict:hasKey "{{key}}" + dict:hasValue "{{value}}" xopp:ofLayerElement p{{pageindex}}l{{layerindex}}e{{elementindex}} object_diagram:inModel model ] @@ -51,6 +51,7 @@ description as {{namespa uses as xopp uses as object_diagram + uses as dict ci model : xopp:Model [] From e9e83da78bb5e9491b8613f56fadd70b09611bb9 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Mon, 20 Mar 2023 16:22:33 +0100 Subject: [PATCH 02/10] Update OML generator to use DTDesign namespaces + simplify OML template --- src/xopp2oml/template.oml | 97 +++++++++++++++++---------------------- src/xopp2oml/writer.py | 41 +++++++++++++++-- 2 files changed, 80 insertions(+), 58 deletions(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index 5c6f511..488ad88 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -1,69 +1,58 @@ -{%- macro attributes(pageindex, page, layerindex, layer, elementindex, element) -%} -{%- for key,value in element.attributes.items() %} - ci p{{pageindex}}l{{layerindex}}e{{elementindex}}a{{loop.index}} : xopp:XMLAttribute [ - dict:hasKey "{{key}}" - dict:hasValue "{{value}}" - xopp:ofLayerElement p{{pageindex}}l{{layerindex}}e{{elementindex}} - object_diagram:inModel model - ] -{% endfor %} -{%- endmacro -%} - -{%- macro elements(pageindex, page, layerindex, layer) -%} -{% for el in layer.elements %} - ci p{{pageindex}}l{{layerindex}}e{{loop.index}} : xopp:{{el.__class__.__name__}} [ - xopp:hasText "{{el.text}}" - xopp:inLayer p{{pageindex}}l{{layerindex}} - object_diagram:inModel model - ] - {{ attributes(pageindex, page, layerindex, layer, loop.index, el) -}} -{% endfor %} -{%- endmacro -%} - -{%- macro layers(pageindex, page) -%} -{% for layer in page.layers %} - ci p{{pageindex}}l{{loop.index}} : xopp:Layer [ - xopp:inPage p{{pageindex}} - object_diagram:inModel model - ] - {{ elements(pageindex, page, loop.index, layer) -}} -{% endfor %} -{%- endmacro -%} - -{%- macro pages(file) -%} -{% for page in file.pages -%} - ci p{{loop.index}} : xopp:Page [ - xopp:hasWidth {{ page.width }} - xopp:hasHeight {{ page.height }} - xopp:hasBackgroundType "{{ page.background_type }}" - xopp:hasBackgroundColor "{{ page.background_color }}" - xopp:hasBackgroundStyle "{{ page.background_style }}" - xopp:inFile file - object_diagram:inModel model - ] - {{ layers(loop.index, page) -}} -{%- endfor %} -{%- endmacro -%} // Warning: Generated code! Do not edit! // Input file: '{{inputfile}}' // Generator: https://msdl.uantwerpen.be/git/jexelmans/xopp2py -description as {{namespace}} { - uses as xopp - uses as object_diagram - uses as dict +description <{{namespaces.description}}#> as {{namespaces.shorthand}} { + + uses <{{namespaces.xopp}}#> as xopp + uses <{{namespaces.object_diagram}}#> as object_diagram + uses <{{namespaces.dict}}#> as dict ci model : xopp:Model [] ci file : xopp:File [ - xopp:hasCreator "{{ file.creator }}" + xopp:hasCreator {{ file.creator | to_oml_string_literal }} xopp:hasFileVersion {{ file.fileversion }} - xopp:hasTitle "{{ file.title }}" + xopp:hasTitle {{ file.title | to_oml_string_literal }} {%- if file.preview != None %} - xopp:hasPreview "{{ toBase64(file.preview).decode('utf-8') }}" + xopp:hasPreview {{ file.preview | to_base64_string }} {%- endif %} object_diagram:inModel model ] - {{ pages(file) }} + {% for page_index, page in enumerate(file.pages) %} + ci p{{page_index}} : xopp:Page [ + xopp:hasWidth {{ page.width }} + xopp:hasHeight {{ page.height }} + xopp:hasBackgroundType {{ page.background_type | to_oml_string_literal }} + xopp:hasBackgroundColor {{ page.background_color | to_oml_string_literal }} + xopp:hasBackgroundStyle {{ page.background_style | to_oml_string_literal }} + xopp:inFile file + object_diagram:inModel model + ] + + {%- for layer_index, layer in enumerate(page.layers) %} + ci p{{page_index}}l{{layer_index}} : xopp:Layer [ + xopp:inPage p{{page_index}} + object_diagram:inModel model + ] + + {%- for el_index, el in enumerate(layer.elements) %} + ci p{{page_index}}l{{layer_index}}e{{el_index}} : xopp:{{el.__class__.__name__}} [ + xopp:hasText {{el.text | to_oml_string_literal}} + xopp:inLayer p{{page_index}}l{{layer_index}} + object_diagram:inModel model + ] + + {%- for key, value in el.attributes.items() %} + ci p{{page_index}}l{{layer_index}}e{{el_index}}a{{loop.index}} : xopp:XMLAttribute [ + dict:hasKey {{key | to_oml_string_literal}} + dict:hasValue {{value | to_oml_string_literal}} + xopp:ofLayerElement p{{page_index}}l{{layer_index}}e{{el_index}} + object_diagram:inModel model + ] + {% endfor %} + {% endfor %} + {% endfor %} + {% endfor %} } diff --git a/src/xopp2oml/writer.py b/src/xopp2oml/writer.py index ad13c8f..7608c71 100644 --- a/src/xopp2oml/writer.py +++ b/src/xopp2oml/writer.py @@ -1,18 +1,51 @@ from xopp2py import abstract_syntax import io +import base64 + +CDF_NAMESPACES = { + # namespace of generated description + "description": "http://flandersmake.be/cdf/description/my_xopp", + "shorthand": "my_xopp", + + # vocabulary namespaces + "xopp": "http://flandersmake.be/cdf/vocabulary/xopp", + "object_diagram": "http://flandersmake.be/cdf/vocabulary/object_diagram", + "dict": "http://flandersmake.be/cdf/vocabulary/dict", +} + +DTDESIGN_NAMESPACES = { + # namespace of generated description + "description": "http://ua.be/sdo2l/description/artifacts/my_xopp", + "shorthand": "my_xopp", + + # vocabulary namespaces + "xopp": "http://ua.be/sdo2l/vocabulary/formalisms/xopp", + "object_diagram": "http://ua.be/sdo2l/vocabulary/formalisms/object_diagram", + "dict": "http://ua.be/sdo2l/vocabulary/formalisms/dict", +} + +def to_oml_string_literal(python_string): + # Not sure which characters to escape in OML. + # At the very least, quotes should be escaped: + return '"' + python_string.replace('"', '\\"') + '"' + +def to_base64_string(bytes): + return '"' + base64.b64encode(bytes).decode('utf-8') + '"' def writeOML(xournalFile: abstract_syntax.XournalFile, inputfile:str, namespace:str, ostream: io.TextIOBase): import jinja2 import os - import base64 environment = jinja2.Environment( loader=jinja2.FileSystemLoader(os.path.dirname(__file__))) + environment.filters['to_oml_string_literal'] = to_oml_string_literal + environment.filters['to_base64_string'] = to_base64_string + template = environment.get_template("template.oml") for piece in template.generate( file=xournalFile, - toBase64=base64.b64encode, inputfile=inputfile, - namespace=namespace): - ostream.write(piece) + enumerate=enumerate, + namespaces=DTDESIGN_NAMESPACES): + ostream.write(piece) From dffe13e9a775b8a3e01ff401286cc13fe233cb54 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Fri, 24 Mar 2023 16:59:16 +0100 Subject: [PATCH 03/10] Add "minimal mode" to OML generator, omitting additional XML attributes and non-text nodes --- src/xopp2oml/template.oml | 59 ++++++++++++++++++++++++--------------- src/xopp2oml/writer.py | 1 + 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index 488ad88..8165a01 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -1,12 +1,17 @@ // Warning: Generated code! Do not edit! // Input file: '{{inputfile}}' // Generator: https://msdl.uantwerpen.be/git/jexelmans/xopp2py +{%- if minimal %} +// Minimal mode enabled: All XML attributes and non-text nodes are omitted. +{%- endif %} description <{{namespaces.description}}#> as {{namespaces.shorthand}} { uses <{{namespaces.xopp}}#> as xopp uses <{{namespaces.object_diagram}}#> as object_diagram + {%- if not minimal %} uses <{{namespaces.dict}}#> as dict + {%- endif %} ci model : xopp:Model [] @@ -20,7 +25,8 @@ description <{{namespaces.description}}#> as {{namespaces.shorthand}} { object_diagram:inModel model ] - {% for page_index, page in enumerate(file.pages) %} + {%- for page_index, page in enumerate(file.pages) %} + ci p{{page_index}} : xopp:Page [ xopp:hasWidth {{ page.width }} xopp:hasHeight {{ page.height }} @@ -31,28 +37,35 @@ description <{{namespaces.description}}#> as {{namespaces.shorthand}} { object_diagram:inModel model ] - {%- for layer_index, layer in enumerate(page.layers) %} - ci p{{page_index}}l{{layer_index}} : xopp:Layer [ - xopp:inPage p{{page_index}} - object_diagram:inModel model - ] + {%- for layer_index, layer in enumerate(page.layers) %} - {%- for el_index, el in enumerate(layer.elements) %} - ci p{{page_index}}l{{layer_index}}e{{el_index}} : xopp:{{el.__class__.__name__}} [ - xopp:hasText {{el.text | to_oml_string_literal}} - xopp:inLayer p{{page_index}}l{{layer_index}} - object_diagram:inModel model - ] + ci p{{page_index}}l{{layer_index}} : xopp:Layer [ + xopp:inPage p{{page_index}} + object_diagram:inModel model + ] - {%- for key, value in el.attributes.items() %} - ci p{{page_index}}l{{layer_index}}e{{el_index}}a{{loop.index}} : xopp:XMLAttribute [ - dict:hasKey {{key | to_oml_string_literal}} - dict:hasValue {{value | to_oml_string_literal}} - xopp:ofLayerElement p{{page_index}}l{{layer_index}}e{{el_index}} - object_diagram:inModel model - ] - {% endfor %} - {% endfor %} - {% endfor %} - {% endfor %} + {%- for el_index, el in enumerate(layer.elements) %} + {%- if not minimal or el.__class__.__name__ == "Text" %} + + ci p{{page_index}}l{{layer_index}}e{{el_index}} : xopp:{{el.__class__.__name__}} [ + xopp:hasText {{el.text | to_oml_string_literal}} + xopp:inLayer p{{page_index}}l{{layer_index}} + object_diagram:inModel model + ] + + {%- if not minimal %} + {%- for key, value in el.attributes.items() %} + + ci p{{page_index}}l{{layer_index}}e{{el_index}}a{{loop.index}} : xopp:XMLAttribute [ + dict:hasKey {{key | to_oml_string_literal}} + dict:hasValue {{value | to_oml_string_literal}} + xopp:ofLayerElement p{{page_index}}l{{layer_index}}e{{el_index}} + object_diagram:inModel model + ] + {%- endfor %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- endfor %} + {%- endfor %} } diff --git a/src/xopp2oml/writer.py b/src/xopp2oml/writer.py index 7608c71..12589ea 100644 --- a/src/xopp2oml/writer.py +++ b/src/xopp2oml/writer.py @@ -44,6 +44,7 @@ def writeOML(xournalFile: abstract_syntax.XournalFile, inputfile:str, namespace: template = environment.get_template("template.oml") for piece in template.generate( + minimal=True, file=xournalFile, inputfile=inputfile, enumerate=enumerate, From 218695c392c1118d2f055a0232cab94b72eb8f52 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Wed, 12 Apr 2023 18:08:47 +0200 Subject: [PATCH 04/10] Add more parameters to OML generator --- src/xopp2oml/template.oml | 2 +- src/xopp2oml/writer.py | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index 8165a01..a55d48f 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -5,7 +5,7 @@ // Minimal mode enabled: All XML attributes and non-text nodes are omitted. {%- endif %} -description <{{namespaces.description}}#> as {{namespaces.shorthand}} { +description <{{output_namespace}}#> as {{shorthand}} { uses <{{namespaces.xopp}}#> as xopp uses <{{namespaces.object_diagram}}#> as object_diagram diff --git a/src/xopp2oml/writer.py b/src/xopp2oml/writer.py index 12589ea..758d541 100644 --- a/src/xopp2oml/writer.py +++ b/src/xopp2oml/writer.py @@ -22,6 +22,8 @@ DTDESIGN_NAMESPACES = { "xopp": "http://ua.be/sdo2l/vocabulary/formalisms/xopp", "object_diagram": "http://ua.be/sdo2l/vocabulary/formalisms/object_diagram", "dict": "http://ua.be/sdo2l/vocabulary/formalisms/dict", + + "artifacts": "http://ua.be/sdo2l/description/artifacts/", } def to_oml_string_literal(python_string): @@ -32,7 +34,20 @@ def to_oml_string_literal(python_string): def to_base64_string(bytes): return '"' + base64.b64encode(bytes).decode('utf-8') + '"' -def writeOML(xournalFile: abstract_syntax.XournalFile, inputfile:str, namespace:str, ostream: io.TextIOBase): +def writeOML( + xournalFile: abstract_syntax.XournalFile, + inputfile:str, + model_name: str, + ostream: io.TextIOBase, + namespaces=DTDESIGN_NAMESPACES): + """ Write out a Xournal++ file as an OML description. + Parameters: + xournalFile: abstract syntax of a parsed .xopp file + inputfile: name of input file (only for documentation/traceability purposes - any value can be used here) + model_name: used to determine the namespace of the generated OML description + namespace: namespace of xopp-OML-vocabulary + ostream: output stream to write to + """ import jinja2 import os @@ -48,5 +63,7 @@ def writeOML(xournalFile: abstract_syntax.XournalFile, inputfile:str, namespace: file=xournalFile, inputfile=inputfile, enumerate=enumerate, - namespaces=DTDESIGN_NAMESPACES): + output_namespace=namespaces['artifacts']+model_name+"_xopp", + shorthand=model_name+"_xopp", + namespaces=namespaces): ostream.write(piece) From 62f87af80bcb2a613fa4b9acbf8a9cf49734a887 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Thu, 13 Apr 2023 11:28:44 +0200 Subject: [PATCH 05/10] Add mandatory name attribute to OML model --- src/xopp2oml/template.oml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index a55d48f..b4fb7b4 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -13,7 +13,9 @@ description <{{output_namespace}}#> as {{shorthand}} { uses <{{namespaces.dict}}#> as dict {%- endif %} - ci model : xopp:Model [] + ci model : xopp:Model [ + object_diagram:hasName "{{shorthand}}" + ] ci file : xopp:File [ xopp:hasCreator {{ file.creator | to_oml_string_literal }} From 30298afa471887f86f889ab3aa7c5ccd05ece379 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Sat, 22 Apr 2023 01:23:56 +0200 Subject: [PATCH 06/10] Fun with flakes --- .gitignore | 3 ++- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 13 ++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore index ba0430d..e482470 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -__pycache__/ \ No newline at end of file +__pycache__/ +*.egg-info/ \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..694bbd4 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1681920287, + "narHash": "sha256-+/d6XQQfhhXVfqfLROJoqj3TuG38CAeoT6jO1g9r1k0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "645bc49f34fa8eff95479f0345ff57e55b53437e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6383574 --- /dev/null +++ b/flake.nix @@ -0,0 +1,13 @@ +{ + inputs = { + nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable; + flake-utils.url = github:numtide/flake-utils; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: { + defaultPackage = (import ./default.nix) { pkgs = nixpkgs.legacyPackages.${system}; }; + }); + + nixConfig.bash-prompt-prefix = "\\e\[94;1m[xopp2py]\\e\[m "; +} \ No newline at end of file From bb260387547e9d1ce5bce917645e69235ef890dd Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Tue, 2 May 2023 11:24:34 +0200 Subject: [PATCH 07/10] Update dependencies --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 694bbd4..c0ecefd 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1681920287, - "narHash": "sha256-+/d6XQQfhhXVfqfLROJoqj3TuG38CAeoT6jO1g9r1k0=", + "lastModified": 1682879489, + "narHash": "sha256-sASwo8gBt7JDnOOstnps90K1wxmVfyhsTPPNTGBPjjg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "645bc49f34fa8eff95479f0345ff57e55b53437e", + "rev": "da45bf6ec7bbcc5d1e14d3795c025199f28e0de0", "type": "github" }, "original": { From df5f0b2d51032a1d421f12a9ee63ac0859742c59 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Wed, 3 May 2023 15:17:19 +0200 Subject: [PATCH 08/10] Update nixpkgs --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index c0ecefd..e6f9099 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1682879489, - "narHash": "sha256-sASwo8gBt7JDnOOstnps90K1wxmVfyhsTPPNTGBPjjg=", + "lastModified": 1683014792, + "narHash": "sha256-6Va9iVtmmsw4raBc3QKvQT2KT/NGRWlvUlJj46zN8B8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "da45bf6ec7bbcc5d1e14d3795c025199f28e0de0", + "rev": "1a411f23ba299db155a5b45d5e145b85a7aafc42", "type": "github" }, "original": { From 236f52c7dd92ff33f94acf1261cf9d8564bdfaa2 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Thu, 4 May 2023 11:35:01 +0200 Subject: [PATCH 09/10] Update template --- src/xopp2oml/template.oml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index b4fb7b4..d5bf719 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -15,16 +15,12 @@ description <{{output_namespace}}#> as {{shorthand}} { ci model : xopp:Model [ object_diagram:hasName "{{shorthand}}" - ] - - ci file : xopp:File [ xopp:hasCreator {{ file.creator | to_oml_string_literal }} xopp:hasFileVersion {{ file.fileversion }} xopp:hasTitle {{ file.title | to_oml_string_literal }} {%- if file.preview != None %} xopp:hasPreview {{ file.preview | to_base64_string }} {%- endif %} - object_diagram:inModel model ] {%- for page_index, page in enumerate(file.pages) %} @@ -35,7 +31,7 @@ description <{{output_namespace}}#> as {{shorthand}} { xopp:hasBackgroundType {{ page.background_type | to_oml_string_literal }} xopp:hasBackgroundColor {{ page.background_color | to_oml_string_literal }} xopp:hasBackgroundStyle {{ page.background_style | to_oml_string_literal }} - xopp:inFile file + xopp:inFile model object_diagram:inModel model ] From f6f90171a5e1e72e515e74ad7090b375ae6dc763 Mon Sep 17 00:00:00 2001 From: Joeri Exelmans Date: Thu, 4 May 2023 11:52:50 +0200 Subject: [PATCH 10/10] Fix bug: can handle empty text nodes in Xournal++ --- src/xopp2oml/template.oml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xopp2oml/template.oml b/src/xopp2oml/template.oml index d5bf719..3c3076c 100644 --- a/src/xopp2oml/template.oml +++ b/src/xopp2oml/template.oml @@ -43,7 +43,7 @@ description <{{output_namespace}}#> as {{shorthand}} { ] {%- for el_index, el in enumerate(layer.elements) %} - {%- if not minimal or el.__class__.__name__ == "Text" %} + {%- if not minimal or el.__class__.__name__ == "Text" and el.text != None %} ci p{{page_index}}l{{layer_index}}e{{el_index}} : xopp:{{el.__class__.__name__}} [ xopp:hasText {{el.text | to_oml_string_literal}}