CrowdAnki
CrowdAnki copied to clipboard
Support Yaml as alternative serialization format
Yaml is nice and potentially friendlier to git diffs than JSON
It would be pretty simple to implement the YAML serialization/deserialization. The only problem would be to ship the pyyaml dependency with anki because looks like it uses .c extensions and requires a compiler.
I wrote this script so I can use it now .yaml instead of .json, by external conversion between one and another after I export the .json as .yml to versioning it with git: https://gist.github.com/evandrocoan/7804f10e442e5a379bf1c604b96dc123
The only problem would be to ship the pyyaml dependency with anki because looks like it uses .c extensions and requires a compiler.
I don't think the C extension (libyaml) is a hard dependency of pyyaml — installing with --without-libyaml should install without it.
Testing installation with pip3 install pyyaml --global-option=--without-libyaml into a virtualenv and very quickly inspecting the virtualenv I indeed don't find any compiled (e.g. .so files).
Hence, I don't think that pyyaml is problematic as a dependency.
Edit: besides we already have pyyaml (an old version that didn't rely on libyaml at all) as a dependency, for the personal fields file.
Unrelated edit2 (to avoid spamming with more comments, but so that I don't forget): Another, very human-readable option might be Nested Text. It's main disadvantages are:
-
It only has string fields, in order to correctly deal with some of the numerical values we'd need a schema when reading to correctly specify the type of the fields.
-
It's "non-standard" (i.e. not very popular).
I see, good to know it can be used without c extensions. Although I just stopped using it due to this problem: https://stackoverflow.com/questions/71836675/force-pyyaml-to-write-multiline-string-literals-regardless-of-string-content, it was causing trouble in templates, and they would not be viewed as plain text but as escaped strings, i.e., "my\nsome". The change was trivial; I updated my code post with it.
--- a/convert_yaml_json.py
+++ b/convert_yaml_json.py
@@ -9,7 +9,10 @@ import tempfile
import pathlib
# python3 -m pip install pyyaml
-import yaml
+# import yaml
+# python3 -m pip install ruamel.yaml
+import ruamel.yaml as yaml
import sys
import json
@@ -80,6 +83,7 @@ def fast_scandir(current_directory: Path, max_recursion=1, to_json=False, recurs
print(f"Converting to yml {fullpath}.", file=sys.stderr)
yaml.dump(json.load(readjson), temporaryfile,
default_flow_style=False,
+ default_style='|',
allow_unicode=True)
temporaryfile.flush() # atomic write for safety
os.replace(temporaryfile.name, newymlpath)