diff options
Diffstat (limited to 'pipeline/write.sh')
| -rwxr-xr-x | pipeline/write.sh | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/pipeline/write.sh b/pipeline/write.sh new file mode 100755 index 0000000..7e1bead --- /dev/null +++ b/pipeline/write.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# Every writer, in both languages, over every document, into $OUT/write/. +# +# write/text/{d,g}/<doc>.txt +# write/md/{d,g}/<doc>.md +# write/html/{d,g}/<doc>.html +# write/epub/{d,g}/<doc>.epub +# write/typst/{d,g}/<doc>/<doc>.typ and image/ beside it +# +# Each writer is given the .ocda.db, because that carries the images. The .ssp +# is used as well, for the one comparison that matters at this level: a writer +# is not told which serialisation it was handed, so the two must agree. +# +# The summary counts, for each format, how many documents the two languages' +# writers agreed on byte for byte. That is the check that says the model is +# sufficient: neither writer was written from the other. +set -e +. "$(dirname "$0")/config.sh" +: "${ARTEFACTS:?set ARTEFACTS to a directory of .ssp and .ocda.db files}" + +list=$(find "$ARTEFACTS" -name '*.ssp' | sort) +[ -n "$LIMIT" ] && list=$(echo "$list" | head -n "$LIMIT") + +for fmt in text md html epub typst; do + for impl in d g; do mkdir -p "$OUT/write/$fmt/$impl"; done +done + +n=0 +agree_text=0; agree_md=0; agree_html=0; agree_epub=0; agree_typst=0 +forms=0 +for ssp in $list; do + stem=$(basename "$ssp" .ssp); lang=${stem##*.}; uid=${stem%.*} + db=$(find "$ARTEFACTS" -name "$uid.ocda.db" | head -1) + src=${db:-$ssp} + [ -n "$db" ] && args="$src $lang" || args="$src" + n=$((n+1)) + one() { sh "$(dirname "$0")/one.sh" "$@"; } + + one text-d $args > "$OUT/write/text/d/$stem.txt" + one text-g $args > "$OUT/write/text/g/$stem.txt" + cmp -s "$OUT/write/text/d/$stem.txt" "$OUT/write/text/g/$stem.txt" \ + && agree_text=$((agree_text+1)) || echo "TEXT DIFFERS $stem" + + one md-d $args > "$OUT/write/md/d/$stem.md" + one md-g $args > "$OUT/write/md/g/$stem.md" + cmp -s "$OUT/write/md/d/$stem.md" "$OUT/write/md/g/$stem.md" \ + && agree_md=$((agree_md+1)) || echo "MD DIFFERS $stem" + + one html-d $args > "$OUT/write/html/d/$stem.html" + one html-g $args > "$OUT/write/html/g/$stem.html" + cmp -s "$OUT/write/html/d/$stem.html" "$OUT/write/html/g/$stem.html" \ + && agree_html=$((agree_html+1)) || echo "HTML DIFFERS $stem" + + "$WRITERS/dlang/result/bin/ocda-write" --epub $args \ + --out "$OUT/write/epub/d/$stem.epub" + "$WRITERS/gleam/result/bin/ocda-write" --epub $args \ + --out "$OUT/write/epub/g/$stem.epub" + cmp -s "$OUT/write/epub/d/$stem.epub" "$OUT/write/epub/g/$stem.epub" \ + && agree_epub=$((agree_epub+1)) || echo "EPUB DIFFERS $stem" + + # a .typ names its images by path, so it and they go in a directory together + for impl in d g; do mkdir -p "$OUT/write/typst/$impl/$stem"; done + "$WRITERS/dlang/result/bin/ocda-write" --typst $args \ + --out "$OUT/write/typst/d/$stem/$stem.typ" + "$WRITERS/gleam/result/bin/ocda-write" --typst $args \ + --out "$OUT/write/typst/g/$stem/$stem.typ" + cmp -s "$OUT/write/typst/d/$stem/$stem.typ" \ + "$OUT/write/typst/g/$stem/$stem.typ" \ + && agree_typst=$((agree_typst+1)) || echo "TYPST DIFFERS $stem" + + # and the claim that a writer cannot tell the serialisations apart. A .typ + # names its images rather than carrying them, so this one holds for it even + # though only the .ocda.db has the image files. + if [ -n "$db" ]; then + "$WRITERS/dlang/result/bin/ocda-write" --typst "$ssp" > "$OUT/from-ssp.typ" + if cmp -s "$OUT/from-ssp.typ" "$OUT/write/typst/d/$stem/$stem.typ" + then forms=$((forms+1)) + else echo "FORMS DIFFER $stem" + fi + fi +done +echo +echo "documents written: $n" +echo "D == Gleam, text $agree_text" +echo "D == Gleam, markdown $agree_md" +echo "D == Gleam, html $agree_html" +echo "D == Gleam, epub $agree_epub" +echo "D == Gleam, typst $agree_typst" +echo ".ssp and .ocda.db give the same .typ $forms" |
