From 3303f085664c9d7add74753b1b1541871cd31498 Mon Sep 17 00:00:00 2001 From: joelholdsworth Date: Tue, 18 Mar 2008 23:02:45 +0000 Subject: [PATCH] Added new extension: Alphabet Soup --- configure.ac | 1 + share/extensions/Makefile.am | 4 + share/extensions/alphabet_soup/2.svg | 11 + share/extensions/alphabet_soup/3.svg | 11 + share/extensions/alphabet_soup/6.svg | 10 + share/extensions/alphabet_soup/7.svg | 10 + share/extensions/alphabet_soup/Cblob.svg | 10 + share/extensions/alphabet_soup/Chook.svg | 10 + share/extensions/alphabet_soup/Ctail.svg | 10 + share/extensions/alphabet_soup/Delta.svg | 10 + share/extensions/alphabet_soup/Eb.svg | 10 + share/extensions/alphabet_soup/Eserif.svg | 16 + share/extensions/alphabet_soup/Et.svg | 10 + share/extensions/alphabet_soup/G.svg | 10 + share/extensions/alphabet_soup/IBSerif.svg | 10 + share/extensions/alphabet_soup/ITSerif.svg | 10 + share/extensions/alphabet_soup/Lb.svg | 10 + share/extensions/alphabet_soup/Lt.svg | 10 + share/extensions/alphabet_soup/Makefile.am | 78 +++ share/extensions/alphabet_soup/Ocross.svg | 10 + share/extensions/alphabet_soup/Oterm.svg | 10 + share/extensions/alphabet_soup/P.svg | 10 + share/extensions/alphabet_soup/Q.svg | 10 + share/extensions/alphabet_soup/Rblock.svg | 10 + share/extensions/alphabet_soup/Tb.svg | 16 + share/extensions/alphabet_soup/Tt.svg | 16 + share/extensions/alphabet_soup/U.svg | 10 + share/extensions/alphabet_soup/Vser.svg | 10 + share/extensions/alphabet_soup/Xh.svg | 10 + share/extensions/alphabet_soup/Xne.svg | 10 + share/extensions/alphabet_soup/Xnw.svg | 10 + share/extensions/alphabet_soup/Xvb.svg | 10 + share/extensions/alphabet_soup/Xvt.svg | 10 + share/extensions/alphabet_soup/a.svg | 10 + share/extensions/alphabet_soup/abase.svg | 10 + share/extensions/alphabet_soup/acap.svg | 10 + share/extensions/alphabet_soup/b.svg | 10 + share/extensions/alphabet_soup/bar.svg | 10 + share/extensions/alphabet_soup/bar2.svg | 10 + share/extensions/alphabet_soup/barcap.svg | 10 + share/extensions/alphabet_soup/c.svg | 10 + share/extensions/alphabet_soup/cross.svg | 10 + share/extensions/alphabet_soup/cserif.svg | 10 + share/extensions/alphabet_soup/e.svg | 10 + share/extensions/alphabet_soup/epsilon.svg | 8 + share/extensions/alphabet_soup/f.svg | 16 + share/extensions/alphabet_soup/gamma.svg | 10 + share/extensions/alphabet_soup/h.svg | 10 + share/extensions/alphabet_soup/h2.svg | 10 + share/extensions/alphabet_soup/hcap.svg | 10 + share/extensions/alphabet_soup/idot.svg | 10 + share/extensions/alphabet_soup/j.svg | 10 + share/extensions/alphabet_soup/k.svg | 10 + share/extensions/alphabet_soup/l.svg | 10 + share/extensions/alphabet_soup/lserif.svg | 10 + share/extensions/alphabet_soup/m.svg | 10 + share/extensions/alphabet_soup/mcap.svg | 10 + share/extensions/alphabet_soup/n.svg | 10 + share/extensions/alphabet_soup/o.svg | 10 + share/extensions/alphabet_soup/ocap.svg | 10 + share/extensions/alphabet_soup/question.svg | 10 + share/extensions/alphabet_soup/r.svg | 10 + share/extensions/alphabet_soup/rcap.svg | 10 + share/extensions/alphabet_soup/s.svg | 10 + share/extensions/alphabet_soup/serif.svg | 10 + share/extensions/alphabet_soup/t.svg | 16 + share/extensions/alphabet_soup/tserif.svg | 16 + share/extensions/alphabet_soup/v.svg | 10 + share/extensions/alphabet_soup/vcap.svg | 10 + share/extensions/alphabet_soup/vserl.svg | 10 + share/extensions/alphabet_soup/vserr.svg | 10 + share/extensions/alphabet_soup/x.svg | 10 + share/extensions/alphabet_soup/y.svg | 10 + share/extensions/alphabet_soup/yogh.svg | 10 + share/extensions/alphabet_soup/z.svg | 10 + share/extensions/render_alphabetsoup.inx | 19 + share/extensions/render_alphabetsoup.py | 456 ++++++++++++++ .../extensions/render_alphabetsoup_config.py | 581 ++++++++++++++++++ 78 files changed, 1895 insertions(+) create mode 100755 share/extensions/alphabet_soup/2.svg create mode 100755 share/extensions/alphabet_soup/3.svg create mode 100755 share/extensions/alphabet_soup/6.svg create mode 100755 share/extensions/alphabet_soup/7.svg create mode 100755 share/extensions/alphabet_soup/Cblob.svg create mode 100755 share/extensions/alphabet_soup/Chook.svg create mode 100755 share/extensions/alphabet_soup/Ctail.svg create mode 100755 share/extensions/alphabet_soup/Delta.svg create mode 100755 share/extensions/alphabet_soup/Eb.svg create mode 100755 share/extensions/alphabet_soup/Eserif.svg create mode 100755 share/extensions/alphabet_soup/Et.svg create mode 100755 share/extensions/alphabet_soup/G.svg create mode 100755 share/extensions/alphabet_soup/IBSerif.svg create mode 100755 share/extensions/alphabet_soup/ITSerif.svg create mode 100755 share/extensions/alphabet_soup/Lb.svg create mode 100755 share/extensions/alphabet_soup/Lt.svg create mode 100644 share/extensions/alphabet_soup/Makefile.am create mode 100755 share/extensions/alphabet_soup/Ocross.svg create mode 100755 share/extensions/alphabet_soup/Oterm.svg create mode 100755 share/extensions/alphabet_soup/P.svg create mode 100755 share/extensions/alphabet_soup/Q.svg create mode 100755 share/extensions/alphabet_soup/Rblock.svg create mode 100755 share/extensions/alphabet_soup/Tb.svg create mode 100755 share/extensions/alphabet_soup/Tt.svg create mode 100755 share/extensions/alphabet_soup/U.svg create mode 100755 share/extensions/alphabet_soup/Vser.svg create mode 100755 share/extensions/alphabet_soup/Xh.svg create mode 100755 share/extensions/alphabet_soup/Xne.svg create mode 100755 share/extensions/alphabet_soup/Xnw.svg create mode 100755 share/extensions/alphabet_soup/Xvb.svg create mode 100755 share/extensions/alphabet_soup/Xvt.svg create mode 100755 share/extensions/alphabet_soup/a.svg create mode 100755 share/extensions/alphabet_soup/abase.svg create mode 100644 share/extensions/alphabet_soup/acap.svg create mode 100755 share/extensions/alphabet_soup/b.svg create mode 100755 share/extensions/alphabet_soup/bar.svg create mode 100755 share/extensions/alphabet_soup/bar2.svg create mode 100644 share/extensions/alphabet_soup/barcap.svg create mode 100755 share/extensions/alphabet_soup/c.svg create mode 100755 share/extensions/alphabet_soup/cross.svg create mode 100755 share/extensions/alphabet_soup/cserif.svg create mode 100755 share/extensions/alphabet_soup/e.svg create mode 100755 share/extensions/alphabet_soup/epsilon.svg create mode 100755 share/extensions/alphabet_soup/f.svg create mode 100755 share/extensions/alphabet_soup/gamma.svg create mode 100755 share/extensions/alphabet_soup/h.svg create mode 100755 share/extensions/alphabet_soup/h2.svg create mode 100644 share/extensions/alphabet_soup/hcap.svg create mode 100755 share/extensions/alphabet_soup/idot.svg create mode 100755 share/extensions/alphabet_soup/j.svg create mode 100755 share/extensions/alphabet_soup/k.svg create mode 100755 share/extensions/alphabet_soup/l.svg create mode 100755 share/extensions/alphabet_soup/lserif.svg create mode 100755 share/extensions/alphabet_soup/m.svg create mode 100644 share/extensions/alphabet_soup/mcap.svg create mode 100755 share/extensions/alphabet_soup/n.svg create mode 100755 share/extensions/alphabet_soup/o.svg create mode 100644 share/extensions/alphabet_soup/ocap.svg create mode 100644 share/extensions/alphabet_soup/question.svg create mode 100755 share/extensions/alphabet_soup/r.svg create mode 100644 share/extensions/alphabet_soup/rcap.svg create mode 100755 share/extensions/alphabet_soup/s.svg create mode 100755 share/extensions/alphabet_soup/serif.svg create mode 100755 share/extensions/alphabet_soup/t.svg create mode 100755 share/extensions/alphabet_soup/tserif.svg create mode 100755 share/extensions/alphabet_soup/v.svg create mode 100644 share/extensions/alphabet_soup/vcap.svg create mode 100755 share/extensions/alphabet_soup/vserl.svg create mode 100755 share/extensions/alphabet_soup/vserr.svg create mode 100755 share/extensions/alphabet_soup/x.svg create mode 100755 share/extensions/alphabet_soup/y.svg create mode 100755 share/extensions/alphabet_soup/yogh.svg create mode 100755 share/extensions/alphabet_soup/z.svg create mode 100644 share/extensions/render_alphabetsoup.inx create mode 100644 share/extensions/render_alphabetsoup.py create mode 100644 share/extensions/render_alphabetsoup_config.py diff --git a/configure.ac b/configure.ac index fd924a8aa..13e608c76 100644 --- a/configure.ac +++ b/configure.ac @@ -909,6 +909,7 @@ share/Makefile share/clipart/Makefile share/examples/Makefile share/extensions/Makefile +share/extensions/alphabet_soup/Makefile share/extensions/Barcode/Makefile share/extensions/xaml2svg/Makefile share/fonts/Makefile diff --git a/share/extensions/Makefile.am b/share/extensions/Makefile.am index 026fe010c..9d716fa85 100644 --- a/share/extensions/Makefile.am +++ b/share/extensions/Makefile.am @@ -1,5 +1,6 @@ SUBDIRS = \ + alphabet_soup \ Barcode \ xaml2svg @@ -79,6 +80,8 @@ extensions = \ pturtle.py \ radiusrand.py \ render_barcode.py \ + render_alphabetsoup.py \ + render_alphabetsoup_config.py \ rtree.py \ rubberstretch.py\ simplepath.py \ @@ -191,6 +194,7 @@ modules = \ randompnt.inx \ randompos.inx \ render_barcode.inx \ + render_alphabetsoup.inx \ rubberstretch.inx \ rtree.inx \ sk_input.inx \ diff --git a/share/extensions/alphabet_soup/2.svg b/share/extensions/alphabet_soup/2.svg new file mode 100755 index 000000000..d1989397a --- /dev/null +++ b/share/extensions/alphabet_soup/2.svg @@ -0,0 +1,11 @@ + + + + diff --git a/share/extensions/alphabet_soup/3.svg b/share/extensions/alphabet_soup/3.svg new file mode 100755 index 000000000..3c6d97dda --- /dev/null +++ b/share/extensions/alphabet_soup/3.svg @@ -0,0 +1,11 @@ + + + + diff --git a/share/extensions/alphabet_soup/6.svg b/share/extensions/alphabet_soup/6.svg new file mode 100755 index 000000000..d05c5083d --- /dev/null +++ b/share/extensions/alphabet_soup/6.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/7.svg b/share/extensions/alphabet_soup/7.svg new file mode 100755 index 000000000..e921bb5ff --- /dev/null +++ b/share/extensions/alphabet_soup/7.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Cblob.svg b/share/extensions/alphabet_soup/Cblob.svg new file mode 100755 index 000000000..3c747307a --- /dev/null +++ b/share/extensions/alphabet_soup/Cblob.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Chook.svg b/share/extensions/alphabet_soup/Chook.svg new file mode 100755 index 000000000..aab0fa280 --- /dev/null +++ b/share/extensions/alphabet_soup/Chook.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Ctail.svg b/share/extensions/alphabet_soup/Ctail.svg new file mode 100755 index 000000000..54d55dec1 --- /dev/null +++ b/share/extensions/alphabet_soup/Ctail.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Delta.svg b/share/extensions/alphabet_soup/Delta.svg new file mode 100755 index 000000000..82e60c34f --- /dev/null +++ b/share/extensions/alphabet_soup/Delta.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Eb.svg b/share/extensions/alphabet_soup/Eb.svg new file mode 100755 index 000000000..c9c42a550 --- /dev/null +++ b/share/extensions/alphabet_soup/Eb.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Eserif.svg b/share/extensions/alphabet_soup/Eserif.svg new file mode 100755 index 000000000..51e46b90e --- /dev/null +++ b/share/extensions/alphabet_soup/Eserif.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/Et.svg b/share/extensions/alphabet_soup/Et.svg new file mode 100755 index 000000000..1c69936ba --- /dev/null +++ b/share/extensions/alphabet_soup/Et.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/G.svg b/share/extensions/alphabet_soup/G.svg new file mode 100755 index 000000000..d6fb0c314 --- /dev/null +++ b/share/extensions/alphabet_soup/G.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/IBSerif.svg b/share/extensions/alphabet_soup/IBSerif.svg new file mode 100755 index 000000000..774f52d06 --- /dev/null +++ b/share/extensions/alphabet_soup/IBSerif.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/ITSerif.svg b/share/extensions/alphabet_soup/ITSerif.svg new file mode 100755 index 000000000..df4023dbd --- /dev/null +++ b/share/extensions/alphabet_soup/ITSerif.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Lb.svg b/share/extensions/alphabet_soup/Lb.svg new file mode 100755 index 000000000..164c956fd --- /dev/null +++ b/share/extensions/alphabet_soup/Lb.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Lt.svg b/share/extensions/alphabet_soup/Lt.svg new file mode 100755 index 000000000..60b288eda --- /dev/null +++ b/share/extensions/alphabet_soup/Lt.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Makefile.am b/share/extensions/alphabet_soup/Makefile.am new file mode 100644 index 000000000..004da4e8c --- /dev/null +++ b/share/extensions/alphabet_soup/Makefile.am @@ -0,0 +1,78 @@ + +alphabet_soupdir = $(datadir)/inkscape/extensions/alphabet_soup + +alphabet_soup_DATA = \ + 2.svg \ + 3.svg \ + 6.svg \ + 7.svg \ + abase.svg \ + a.svg \ + acap.svg \ + bar2.svg \ + barcap.svg \ + bar.svg \ + b.svg \ + Cblob.svg \ + Chook.svg \ + cross.svg \ + cserif.svg \ + c.svg \ + Ctail.svg \ + Delta.svg \ + Eb.svg \ + epsilon.svg \ + Eserif.svg \ + e.svg \ + Et.svg \ + f.svg \ + gamma.svg \ + G.svg \ + h2.svg \ + hcap.svg \ + h.svg \ + IBSerif.svg \ + idot.svg \ + ITSerif.svg \ + j.svg \ + k.svg \ + Lb.svg \ + lserif.svg \ + l.svg \ + Lt.svg \ + mcap.svg \ + m.svg \ + n.svg \ + ocap.svg \ + Ocross.svg \ + o.svg \ + Oterm.svg \ + P.svg \ + Q.svg \ + question.svg \ + Rblock.svg \ + rcap.svg \ + r.svg \ + serif.svg \ + s.svg \ + Tb.svg \ + tserif.svg \ + t.svg \ + Tt.svg \ + U.svg \ + vcap.svg \ + vserl.svg \ + vserr.svg \ + Vser.svg \ + v.svg \ + Xh.svg \ + Xne.svg \ + Xnw.svg \ + x.svg \ + Xvb.svg \ + Xvt.svg \ + yogh.svg \ + y.svg \ + z.svg + +EXTRA_DIST = $(alphabet_soup_DATA) diff --git a/share/extensions/alphabet_soup/Ocross.svg b/share/extensions/alphabet_soup/Ocross.svg new file mode 100755 index 000000000..63b1caafa --- /dev/null +++ b/share/extensions/alphabet_soup/Ocross.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Oterm.svg b/share/extensions/alphabet_soup/Oterm.svg new file mode 100755 index 000000000..f01085811 --- /dev/null +++ b/share/extensions/alphabet_soup/Oterm.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/P.svg b/share/extensions/alphabet_soup/P.svg new file mode 100755 index 000000000..5e61cf6b0 --- /dev/null +++ b/share/extensions/alphabet_soup/P.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Q.svg b/share/extensions/alphabet_soup/Q.svg new file mode 100755 index 000000000..2da900b5d --- /dev/null +++ b/share/extensions/alphabet_soup/Q.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Rblock.svg b/share/extensions/alphabet_soup/Rblock.svg new file mode 100755 index 000000000..a2f4e9d70 --- /dev/null +++ b/share/extensions/alphabet_soup/Rblock.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Tb.svg b/share/extensions/alphabet_soup/Tb.svg new file mode 100755 index 000000000..2a75ac5b4 --- /dev/null +++ b/share/extensions/alphabet_soup/Tb.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/Tt.svg b/share/extensions/alphabet_soup/Tt.svg new file mode 100755 index 000000000..04d2a1829 --- /dev/null +++ b/share/extensions/alphabet_soup/Tt.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/U.svg b/share/extensions/alphabet_soup/U.svg new file mode 100755 index 000000000..e8b8244c3 --- /dev/null +++ b/share/extensions/alphabet_soup/U.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Vser.svg b/share/extensions/alphabet_soup/Vser.svg new file mode 100755 index 000000000..e1467702f --- /dev/null +++ b/share/extensions/alphabet_soup/Vser.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Xh.svg b/share/extensions/alphabet_soup/Xh.svg new file mode 100755 index 000000000..c60f3048f --- /dev/null +++ b/share/extensions/alphabet_soup/Xh.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Xne.svg b/share/extensions/alphabet_soup/Xne.svg new file mode 100755 index 000000000..9dc54f19d --- /dev/null +++ b/share/extensions/alphabet_soup/Xne.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Xnw.svg b/share/extensions/alphabet_soup/Xnw.svg new file mode 100755 index 000000000..98cd8bc1f --- /dev/null +++ b/share/extensions/alphabet_soup/Xnw.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Xvb.svg b/share/extensions/alphabet_soup/Xvb.svg new file mode 100755 index 000000000..16e80b42c --- /dev/null +++ b/share/extensions/alphabet_soup/Xvb.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/Xvt.svg b/share/extensions/alphabet_soup/Xvt.svg new file mode 100755 index 000000000..9747d84d7 --- /dev/null +++ b/share/extensions/alphabet_soup/Xvt.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/a.svg b/share/extensions/alphabet_soup/a.svg new file mode 100755 index 000000000..284de78ea --- /dev/null +++ b/share/extensions/alphabet_soup/a.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/abase.svg b/share/extensions/alphabet_soup/abase.svg new file mode 100755 index 000000000..0a95a6273 --- /dev/null +++ b/share/extensions/alphabet_soup/abase.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/acap.svg b/share/extensions/alphabet_soup/acap.svg new file mode 100644 index 000000000..dfc7ede1b --- /dev/null +++ b/share/extensions/alphabet_soup/acap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/b.svg b/share/extensions/alphabet_soup/b.svg new file mode 100755 index 000000000..fd01a263b --- /dev/null +++ b/share/extensions/alphabet_soup/b.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/bar.svg b/share/extensions/alphabet_soup/bar.svg new file mode 100755 index 000000000..8b477e378 --- /dev/null +++ b/share/extensions/alphabet_soup/bar.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/bar2.svg b/share/extensions/alphabet_soup/bar2.svg new file mode 100755 index 000000000..39ed825ae --- /dev/null +++ b/share/extensions/alphabet_soup/bar2.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/barcap.svg b/share/extensions/alphabet_soup/barcap.svg new file mode 100644 index 000000000..0f7626d9b --- /dev/null +++ b/share/extensions/alphabet_soup/barcap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/c.svg b/share/extensions/alphabet_soup/c.svg new file mode 100755 index 000000000..c6261a0e5 --- /dev/null +++ b/share/extensions/alphabet_soup/c.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/cross.svg b/share/extensions/alphabet_soup/cross.svg new file mode 100755 index 000000000..89b67fefe --- /dev/null +++ b/share/extensions/alphabet_soup/cross.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/cserif.svg b/share/extensions/alphabet_soup/cserif.svg new file mode 100755 index 000000000..14669a0ad --- /dev/null +++ b/share/extensions/alphabet_soup/cserif.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/e.svg b/share/extensions/alphabet_soup/e.svg new file mode 100755 index 000000000..03106dd97 --- /dev/null +++ b/share/extensions/alphabet_soup/e.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/epsilon.svg b/share/extensions/alphabet_soup/epsilon.svg new file mode 100755 index 000000000..a2dd33e60 --- /dev/null +++ b/share/extensions/alphabet_soup/epsilon.svg @@ -0,0 +1,8 @@ + + + diff --git a/share/extensions/alphabet_soup/f.svg b/share/extensions/alphabet_soup/f.svg new file mode 100755 index 000000000..c0f94c3ed --- /dev/null +++ b/share/extensions/alphabet_soup/f.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/gamma.svg b/share/extensions/alphabet_soup/gamma.svg new file mode 100755 index 000000000..29cc11fbd --- /dev/null +++ b/share/extensions/alphabet_soup/gamma.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/h.svg b/share/extensions/alphabet_soup/h.svg new file mode 100755 index 000000000..ee0b78365 --- /dev/null +++ b/share/extensions/alphabet_soup/h.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/h2.svg b/share/extensions/alphabet_soup/h2.svg new file mode 100755 index 000000000..636b4dfd4 --- /dev/null +++ b/share/extensions/alphabet_soup/h2.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/hcap.svg b/share/extensions/alphabet_soup/hcap.svg new file mode 100644 index 000000000..4ec6ad5ab --- /dev/null +++ b/share/extensions/alphabet_soup/hcap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/idot.svg b/share/extensions/alphabet_soup/idot.svg new file mode 100755 index 000000000..d3d0dadb0 --- /dev/null +++ b/share/extensions/alphabet_soup/idot.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/j.svg b/share/extensions/alphabet_soup/j.svg new file mode 100755 index 000000000..14350d4b0 --- /dev/null +++ b/share/extensions/alphabet_soup/j.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/k.svg b/share/extensions/alphabet_soup/k.svg new file mode 100755 index 000000000..314f2b0b9 --- /dev/null +++ b/share/extensions/alphabet_soup/k.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/l.svg b/share/extensions/alphabet_soup/l.svg new file mode 100755 index 000000000..00beccf9f --- /dev/null +++ b/share/extensions/alphabet_soup/l.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/lserif.svg b/share/extensions/alphabet_soup/lserif.svg new file mode 100755 index 000000000..082093191 --- /dev/null +++ b/share/extensions/alphabet_soup/lserif.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/m.svg b/share/extensions/alphabet_soup/m.svg new file mode 100755 index 000000000..abe974a58 --- /dev/null +++ b/share/extensions/alphabet_soup/m.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/mcap.svg b/share/extensions/alphabet_soup/mcap.svg new file mode 100644 index 000000000..373e133dd --- /dev/null +++ b/share/extensions/alphabet_soup/mcap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/n.svg b/share/extensions/alphabet_soup/n.svg new file mode 100755 index 000000000..420042a19 --- /dev/null +++ b/share/extensions/alphabet_soup/n.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/o.svg b/share/extensions/alphabet_soup/o.svg new file mode 100755 index 000000000..967bad08f --- /dev/null +++ b/share/extensions/alphabet_soup/o.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/ocap.svg b/share/extensions/alphabet_soup/ocap.svg new file mode 100644 index 000000000..3eeb2aab3 --- /dev/null +++ b/share/extensions/alphabet_soup/ocap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/question.svg b/share/extensions/alphabet_soup/question.svg new file mode 100644 index 000000000..90b012f3e --- /dev/null +++ b/share/extensions/alphabet_soup/question.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/r.svg b/share/extensions/alphabet_soup/r.svg new file mode 100755 index 000000000..bb2273a0a --- /dev/null +++ b/share/extensions/alphabet_soup/r.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/rcap.svg b/share/extensions/alphabet_soup/rcap.svg new file mode 100644 index 000000000..a887ab827 --- /dev/null +++ b/share/extensions/alphabet_soup/rcap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/s.svg b/share/extensions/alphabet_soup/s.svg new file mode 100755 index 000000000..dc7c6fc16 --- /dev/null +++ b/share/extensions/alphabet_soup/s.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/serif.svg b/share/extensions/alphabet_soup/serif.svg new file mode 100755 index 000000000..d2bf55e0a --- /dev/null +++ b/share/extensions/alphabet_soup/serif.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/t.svg b/share/extensions/alphabet_soup/t.svg new file mode 100755 index 000000000..7940a68e2 --- /dev/null +++ b/share/extensions/alphabet_soup/t.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/tserif.svg b/share/extensions/alphabet_soup/tserif.svg new file mode 100755 index 000000000..df095c093 --- /dev/null +++ b/share/extensions/alphabet_soup/tserif.svg @@ -0,0 +1,16 @@ + + + + + + diff --git a/share/extensions/alphabet_soup/v.svg b/share/extensions/alphabet_soup/v.svg new file mode 100755 index 000000000..917580771 --- /dev/null +++ b/share/extensions/alphabet_soup/v.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/vcap.svg b/share/extensions/alphabet_soup/vcap.svg new file mode 100644 index 000000000..c36f5d466 --- /dev/null +++ b/share/extensions/alphabet_soup/vcap.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/vserl.svg b/share/extensions/alphabet_soup/vserl.svg new file mode 100755 index 000000000..90c92276b --- /dev/null +++ b/share/extensions/alphabet_soup/vserl.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/vserr.svg b/share/extensions/alphabet_soup/vserr.svg new file mode 100755 index 000000000..964ae97a8 --- /dev/null +++ b/share/extensions/alphabet_soup/vserr.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/x.svg b/share/extensions/alphabet_soup/x.svg new file mode 100755 index 000000000..f40b0a9fb --- /dev/null +++ b/share/extensions/alphabet_soup/x.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/y.svg b/share/extensions/alphabet_soup/y.svg new file mode 100755 index 000000000..089cec9c8 --- /dev/null +++ b/share/extensions/alphabet_soup/y.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/yogh.svg b/share/extensions/alphabet_soup/yogh.svg new file mode 100755 index 000000000..6e6f19d19 --- /dev/null +++ b/share/extensions/alphabet_soup/yogh.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/alphabet_soup/z.svg b/share/extensions/alphabet_soup/z.svg new file mode 100755 index 000000000..7826d59e0 --- /dev/null +++ b/share/extensions/alphabet_soup/z.svg @@ -0,0 +1,10 @@ + + + + diff --git a/share/extensions/render_alphabetsoup.inx b/share/extensions/render_alphabetsoup.inx new file mode 100644 index 000000000..4eccecb8d --- /dev/null +++ b/share/extensions/render_alphabetsoup.inx @@ -0,0 +1,19 @@ + + <_name>Alphabet Soup + org.ekips.filter.alphabetsoup + render_alphabetsoup.py + render_alphabetsoup_config.py + inkex.py + Inkscape + 8.0 + 0 + + all + + + + + + diff --git a/share/extensions/render_alphabetsoup.py b/share/extensions/render_alphabetsoup.py new file mode 100644 index 000000000..e3f64fc07 --- /dev/null +++ b/share/extensions/render_alphabetsoup.py @@ -0,0 +1,456 @@ +#!/usr/bin/env python +''' +Copyright (C) 2001-2002 Matt Chisholm matt@theory.org +Copyright (C) 2008 Joel Holdsworth joel@airwebreathe.org.uk + for AP + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +''' + +import copy +import inkex +import simplestyle +import math +import cmath +import string +import random +import render_alphabetsoup_config +import bezmisc +import simplepath +import os +import sys + +syntax = render_alphabetsoup_config.syntax +alphabet = render_alphabetsoup_config.alphabet +units = render_alphabetsoup_config.units +font = render_alphabetsoup_config.font + +# Loads a super-path from a given SVG file +def loadPath( svgPath ): + extensionDir = os.path.normpath(os.path.join(os.getcwd(),os.path.dirname(sys.argv[0]))) + tree = inkex.etree.parse( extensionDir + "/" + svgPath ) + root = tree.getroot() + pathElement = root.find('{http://www.w3.org/2000/svg}path') + if pathElement == None: + return None, 0, 0 + d = pathElement.get("d") + width = float(root.get("width")) + height = float(root.get("height")) + return simplepath.parsePath(d), width, height # Currently we only support a single path + +def combinePaths( pathA, pathB ): + if pathA == None and pathB == None: + return None + elif pathA == None: + return pathB + elif pathB == None: + return pathA + else: + return pathA + pathB + +def flipLeftRight( sp, width ): + for cmd,params in sp: + defs = simplepath.pathdefs[cmd] + for i in range(defs[1]): + if defs[3][i] == 'x': + params[i] = width - params[i] + +def flipTopBottom( sp, height ): + for cmd,params in sp: + defs = simplepath.pathdefs[cmd] + for i in range(defs[1]): + if defs[3][i] == 'y': + params[i] = height - params[i] + +def solveQuadratic(a, b, c): + det = b*b - 4.0*a*c + if det >= 0: # real roots + sdet = math.sqrt(det) + else: # complex roots + sdet = cmath.sqrt(det) + return (-b + sdet) / (2*a), (-b - sdet) / (2*a) + +def cbrt(x): + if x >= 0: + return x**(1.0/3.0) + else: + return -((-x)**(1.0/3.0)) + +def findRealRoots(a,b,c,d): + if a != 0: + a, b, c, d = 1, b/float(a), c/float(a), d/float(a) # Divide through by a + t = b / 3.0 + p, q = c - 3 * t**2, d - c * t + 2 * t**3 + u, v = solveQuadratic(1, q, -(p/3.0)**3) + if type(u) == type(0j): # Complex Cubic Root + r = math.sqrt(u.real**2 + u.imag**2) + w = math.atan2(u.imag, u.real) + y1 = 2 * cbrt(r) * math.cos(w / 3.0) + else: # Complex Real Root + y1 = cbrt(u) + cbrt(v) + + y2, y3 = solveQuadratic(1, y1, p + y1**2) + + if type(y2) == type(0j): # Are y2 and y3 complex? + return [y1 - t] + return [y1 - t, y2 - t, y3 - t] + elif b != 0: + det=c*c - 4.0*b*d + if det >= 0: + return [(-c + math.sqrt(det))/(2.0*b),(-c - math.sqrt(det))/(2.0*b)] + elif c != 0: + return [-d/c] + return [] + +def getPathBoundingBox( sp ): + + box = None + last = None + lostctrl = None + + for cmd,params in sp: + + segmentBox = None + + if cmd == 'M': + # A move cannot contribute to the bounding box + last = params[:] + lastctrl = params[:] + elif cmd == 'L': + if last: + segmentBox = (min(params[0], last[0]), max(params[0], last[0]), min(params[1], last[1]), max(params[1], last[1])) + last = params[:] + lastctrl = params[:] + elif cmd == 'C': + if last: + segmentBox = (min(params[4], last[0]), max(params[4], last[0]), min(params[5], last[1]), max(params[5], last[1])) + + bx0, by0 = last[:] + bx1, by1, bx2, by2, bx3, by3 = params[:] + + # Compute the x limits + a = (-bx0 + 3*bx1 - 3*bx2 + bx3)*3 + b = (3*bx0 - 6*bx1 + 3*bx2)*2 + c = (-3*bx0 + 3*bx1) + ts = findRealRoots(0, a, b, c) + for t in ts: + if t >= 0 and t <= 1: + x = (-bx0 + 3*bx1 - 3*bx2 + bx3)*(t**3) + \ + (3*bx0 - 6*bx1 + 3*bx2)*(t**2) + \ + (-3*bx0 + 3*bx1)*t + \ + bx0 + segmentBox = (min(segmentBox[0], x), max(segmentBox[1], x), segmentBox[2], segmentBox[3]) + + # Compute the y limits + a = (-by0 + 3*by1 - 3*by2 + by3)*3 + b = (3*by0 - 6*by1 + 3*by2)*2 + c = (-3*by0 + 3*by1) + ts = findRealRoots(0, a, b, c) + for t in ts: + if t >= 0 and t <= 1: + y = (-by0 + 3*by1 - 3*by2 + by3)*(t**3) + \ + (3*by0 - 6*by1 + 3*by2)*(t**2) + \ + (-3*by0 + 3*by1)*t + \ + by0 + segmentBox = (segmentBox[0], segmentBox[1], min(segmentBox[2], y), max(segmentBox[3], y)) + + last = params[-2:] + lastctrl = params[2:4] + + elif cmd == 'Q': + # Provisional + if last: + segmentBox = (min(params[0], last[0]), max(params[0], last[0]), min(params[1], last[1]), max(params[1], last[1])) + last = params[-2:] + lastctrl = params[2:4] + + elif cmd == 'A': + # Provisional + if last: + segmentBox = (min(params[0], last[0]), max(params[0], last[0]), min(params[1], last[1]), max(params[1], last[1])) + last = params[-2:] + lastctrl = params[2:4] + + if segmentBox: + if box: + box = (min(segmentBox[0],box[0]), max(segmentBox[1],box[1]), min(segmentBox[2],box[2]), max(segmentBox[3],box[3])) + else: + box = segmentBox + return box + +def mxfm( image, width, height, stack ): # returns possibly transformed image + tbimage = image + if ( stack[0] == "-" ): # top-bottom flip + flipTopBottom(tbimage, height) + stack.pop( 0 ) + + lrimage = tbimage + if ( stack[0] == "|" ): # left-right flip + flipLeftRight(tbimage, width) + stack.pop( 0 ) + return lrimage + +def comparerule( rule, nodes ): # compare node list to nodes in rule + for i in range( 0, len(nodes)): # range( a, b ) = (a, a+1, a+2 ... b-2, b-1) + if (nodes[i] == rule[i][0]): + pass + else: return 0 + return 1 + +def findrule( state, nodes ): # find the rule which generated this subtree + ruleset = syntax[state][1] + nodelen = len(nodes) + for rule in ruleset: + rulelen = len(rule) + if ((rulelen == nodelen) and (comparerule( rule, nodes ))): + return rule + return + +def generate( state ): # generate a random tree (in stack form) + stack = [ state ] + if ( len(syntax[state]) == 1 ): # if this is a stop symbol + return stack + else: + stack.append( "[" ) + path = random.randint(0, (len(syntax[state][1])-1)) # choose randomly from next states + for symbol in syntax[state][1][path]: # recurse down each non-terminal + if ( symbol != 0 ): # 0 denotes end of list ### + substack = generate( symbol[0] ) # get subtree + for elt in substack: + stack.append( elt ) + if (symbol[3]):stack.append( "-" ) # top-bottom flip + if (symbol[4]):stack.append( "|" ) # left-right flip + #else: + #inkex.debug("found end of list in generate( state =", state, ")") # this should be deprecated/never happen + stack.append("]") + return stack + +def draw( stack ): # draw a character based on a tree stack + state = stack.pop(0) + #print state, + + image, width, height = loadPath( font+syntax[state][0] ) # load the image + if (stack[0] != "["): # terminal stack element + if (len(syntax[state]) == 1): # this state is a terminal node + return image, width, height + else: + substack = generate( state ) # generate random substack + return draw( substack ) # draw random substack + else: + #inkex.debug("[") + stack.pop(0) + images = [] # list of daughter images + nodes = [] # list of daughter names + while (stack[0] != "]"): # for all nodes in stack + newstate = stack[0] # the new state + newimage, width, height = draw( stack ) # draw the daughter state + if (newimage): + tfimage = mxfm( newimage, width, height, stack ) # maybe transform daughter state + images.append( [tfimage, width, height] ) # list of daughter images + nodes.append( newstate ) # list of daughter nodes + else: + #inkex.debug(("recurse on",newstate,"failed")) # this should never happen + return None, 0, 0 + rule = findrule( state, nodes ) # find the rule for this subtree + + for i in range( 0, len(images)): + currimg, width, height = images[i] + + if currimg: + #box = getPathBoundingBox(currimg) + dx = rule[i][1]*units + dy = rule[i][2]*units + #newbox = ((box[0]+dx),(box[1]+dy),(box[2]+dx),(box[3]+dy)) + simplepath.translatePath(currimg, dx, dy) + image = combinePaths( image, currimg ) + + stack.pop( 0 ) + return image, width, height + +def draw_crop_scale( stack, zoom ): # draw, crop and scale letter image + image, width, height = draw(stack) + bbox = getPathBoundingBox(image) + simplepath.translatePath(image, -bbox[0], 0) + simplepath.scalePath(image, zoom/units, zoom/units) + return image, bbox[1] - bbox[0], bbox[3] - bbox[2] + +def randomize_input_string( str, zoom ): # generate list of images based on input string + imagelist = [] + + for i in range(0,len(str)): + char = str[i] + #if ( re.match("[a-zA-Z0-9?]", char)): + if ( alphabet.has_key(char)): + if ((i > 0) and (char == str[i-1])): # if this letter matches previous letter + imagelist.append(imagelist[len(stack)-1])# make them the same image + else: # generate image for letter + stack = string.split( alphabet[char][random.randint(0,(len(alphabet[char])-1))] , "." ) + #stack = string.split( alphabet[char][random.randint(0,(len(alphabet[char])-2))] , "." ) + imagelist.append( draw_crop_scale( stack, zoom )) + elif( char == " "): # add a " " space to the image list + imagelist.append( " " ) + else: # this character is not in config.alphabet, skip it + print "bad character", char + return imagelist + +def optikern( image, width, zoom ): # optical kerning algorithm + left = [] + right = [] + + for i in range( 0, 36 ): + y = 0.5 * (i + 0.5) * zoom + xmin = None + xmax = None + + for cmd,params in image: + + segmentBox = None + + if cmd == 'M': + # A move cannot contribute to the bounding box + last = params[:] + lastctrl = params[:] + elif cmd == 'L': + if (y >= last[1] and y <= params[1]) or (y >= params[1] and y <= last[1]): + if params[0] == last[0]: + x = params[0] + else: + a = (params[1] - last[1]) / (params[0] - last[0]) + b = last[1] - a * last[0] + if a != 0: + x = (y - b) / a + else: x = None + + if x: + if xmin == None or x < xmin: xmin = x + if xmax == None or x > xmax: xmax = x + + last = params[:] + lastctrl = params[:] + elif cmd == 'C': + if last: + bx0, by0 = last[:] + bx1, by1, bx2, by2, bx3, by3 = params[:] + + d = by0 - y + c = -3*by0 + 3*by1 + b = 3*by0 - 6*by1 + 3*by2 + a = -by0 + 3*by1 - 3*by2 + by3 + + ts = findRealRoots(a, b, c, d) + + for t in ts: + if t >= 0 and t <= 1: + x = (-bx0 + 3*bx1 - 3*bx2 + bx3)*(t**3) + \ + (3*bx0 - 6*bx1 + 3*bx2)*(t**2) + \ + (-3*bx0 + 3*bx1)*t + \ + bx0 + if xmin == None or x < xmin: xmin = x + if xmax == None or x > xmax: xmax = x + + last = params[-2:] + lastctrl = params[2:4] + + elif cmd == 'Q': + # Quadratic beziers are ignored + last = params[-2:] + lastctrl = params[2:4] + + elif cmd == 'A': + # Arcs are ignored + last = params[-2:] + lastctrl = params[2:4] + + + if xmin != None and xmax != None: + left.append( xmin ) # distance from left edge of region to left edge of bbox + right.append( width - xmax ) # distance from right edge of region to right edge of bbox + else: + left.append( width ) + right.append( width ) + + return (left, right) + +def layoutstring( imagelist, zoom ): # layout string of letter-images using optical kerning + kernlist = [] + length = zoom + for entry in imagelist: + if (entry == " "): # leaving room for " " space characters + length = length + (zoom * render_alphabetsoup_config.space) + else: + image, width, height = entry + length = length + width + zoom # add letter length to overall length + kernlist.append( optikern(image, width, zoom) ) # append kerning data for this image + + workspace = None + + position = zoom + for i in range(0, len(kernlist)): + while(imagelist[i] == " "): + position = position + (zoom * render_alphabetsoup_config.space ) + imagelist.pop(i) + image, width, height = imagelist[i] + + # set the kerning + if i == 0: kern = 0 # for first image, kerning is zero + else: + kerncompare = [] # kerning comparison array + for j in range( 0, len(kernlist[i][0])): + kerncompare.append( kernlist[i][0][j]+kernlist[i-1][1][j] ) + kern = min( kerncompare ) + + position = position - kern # move position back by kern amount + thisimage = copy.deepcopy(image) + simplepath.translatePath(thisimage, position, 0) + workspace = combinePaths(workspace, thisimage) + position = position + width + zoom # advance position by letter width + + return workspace + +class AlphabetSoup(inkex.Effect): + def __init__(self): + inkex.Effect.__init__(self) + self.OptionParser.add_option("-t", "--text", + action="store", type="string", + dest="text", default="Inkscape", + help="The text for alphabet soup") + self.OptionParser.add_option("-z", "--zoom", + action="store", type="float", + dest="zoom", default="8.0", + help="The zoom on the output graphics") + self.OptionParser.add_option("-s", "--seed", + action="store", type="int", + dest="seed", default="0", + help="The random seed for the soup") + + def effect(self): + zoom = self.options.zoom + random.seed(self.options.seed) + + imagelist = randomize_input_string(self.options.text, zoom) + image = layoutstring( imagelist, zoom ) + + if image: + s = { 'stroke': 'none', 'fill': '#000000' } + + new = inkex.etree.Element(inkex.addNS('path','svg')) + new.set('style', simplestyle.formatStyle(s)) + + new.set('d', simplepath.formatPath(image)) + self.current_layer.append(new) + +e = AlphabetSoup() +e.affect() + diff --git a/share/extensions/render_alphabetsoup_config.py b/share/extensions/render_alphabetsoup_config.py new file mode 100644 index 000000000..7bd674d03 --- /dev/null +++ b/share/extensions/render_alphabetsoup_config.py @@ -0,0 +1,581 @@ +# Syntax format: (raise your hand if you know lisp :-) +# +# 'state0': ("file.svg", ( ( ('state1', dx, dy, T-B, L|R),), +# ( ('state2', ...), ('state3', ...),), +# ( ('state4', ...),), +# ) ), +# ) +# +# Translation of the above in CNF: +# state0 -> state1 +# state0 -> state2 state3 +# state0 -> state4 +# +# Semantics at state0: +# Paste subtree image from state1 onto "file.svg". +# Subtree image is translated by (dx, dy) (measured in units, not pixels!). +# Subtree image is flipped top to bottom if v==1. +# Subtree image is flipped left to right if h==1. +# +# Notes: +# Origin (0,0) is at *upper* left corner. +# For optional reflections, add both reflecting and non-reflecting rules +# For 180 degree rotations, set v = 1, h = 1. +# It helps to have an empty "epsilon" image. +# +# Jan. 16 2002 +# Removed zeros from the end of rules, changed the code to reflect this. +# Remember to add trailing ',' at ends of lists, especially singletons. +# +# Jan. 20-26 2002 +# Added uppercase. + +syntax = { + 'start': ("epsilon.svg", ((('lc', 0,0,0,0),),# start state + (('UC', 0,0,0,0),), + )), + # lowercase + 'lc': ("epsilon.svg", ((('barsym', 0,0,0,0),), #(2096714) (26) + (('lc2', 0,0,0,0),), #(830) (19) + )), + # uppercase + 'UC': ("epsilon.svg", ((('UCb', 0,0,0,0),), #(2160) (30) + (('UCu', 0,-5,0,0),), + )), + 'UCb': ("epsilon.svg", ((('Bar', 0,0,0,0),), #(21) Psi T I KK Phi + (('Bar', 0,0,0,1),), # + (('D', 0,0,0,0),), #(39) D O Q C G + (('D', 0,0,0,1),), # + (('E', 0,0,0,0),), #(373) E B PL 3 3r 8 S Theta Eth/Dyet + (('E', 0,0,0,1),), # + (('F', 0,0,0,0),), #(84) F P R + (('F', 0,0,0,1),), # + (('H', 0,0,0,0),), #(8) H Hblock + (('H', 0,0,0,1),), # + (('L', 0,0,0,0),), #(12) L J U + (('L', 0,0,0,1),), # + (('V', 0,0,0,1),), #(6) A V M Delta Forall W + (('X', 0,0,0,0),), #(172) X N M W Sigma NN + (('X', 0,0,0,0),), #(172) X N M W Sigma NN + )), + 'UCu': ("epsilon.svg", ((('UCb', 0,0,1,1),),)), + # for statistical balancing + 'lc2': ("epsilon.svg", ((('osym', 0,0,0,0),), #(40) o, c, e, ou + (('vsym', 0,0,0,0),), #(40) v, w, ^, y + (('dsym', 0,0,0,1),), #(96) x, z, 7, 2, yogh + (('lc3', 0,0,0,0),), #(928) (5) + )), + 'lc3': ("epsilon.svg", ((('3sym', 0,0,0,0),), #(40) epsilon + (('ssym', 0,0,0,0),), #(8) s + (('asym', 0,0,0,0),), #(880) a 6 9 + )), + # symmetry rules + 'barsym':("epsilon.svg", ((('bar', 0,0,0,0),), + (('bar', 0,0,0,1),), + (('bar', 0,0,1,0),), + (('bar', 0,0,1,1),), + )), + '6sym': ("epsilon.svg", ((('6', 0,0,0,0),), + (('6', 0,0,0,1),), + (('6', 0,0,1,0),), + (('6', 0,0,1,1),), + )), + '3sym': ("epsilon.svg", ((('3', 0,0,0,0),), + (('3', 0,0,0,1),), + (('3', 0,0,1,0),), + (('3', 0,0,1,1),), + )), + 'vsym': ("epsilon.svg", ((('v', 0,0,0,0),), + (('v', 0,0,1,1),), + )), + 'osym': ("epsilon.svg", ((('o', 0,0,0,0),), + (('o', 0,0,0,1),), + )), + 'ssym': ("epsilon.svg", ((('s', 0,0,0,0),), + (('s', 0,0,0,1),), + )), + 'dsym': ("epsilon.svg", ((('diag', 0,0,0,0), ('diag', 0,0,1,1),), + (('diag', 0,0,0,1), ('diag', 0,0,1,0),), + (('dstk', 0,0,0,0),), + )), + 'dstk': ("epsilon.svg", ((('stik', 0,4,0,0), ('z', 0,0,1,1),), + (('stik', 0,4,0,0), ('x', 0,0,1,1),), + (('stik', 0,4,0,1), ('z', 0,0,1,0),), + (('stik', 0,4,0,1), ('x', 0,0,1,0),), + )), + 'asym': ("epsilon.svg", ((('abase', 0,0,0,0),), + (('abase', 0,0,0,1),), + (('abase', 0,0,1,0),), + (('abase', 0,0,1,1),), + )), + # epsilon rules + 'diag': ("epsilon.svg", ((('x', 0,0,0,0),), + (('yogh', 0,0,1,1),), + (('z', 0,0,0,0),), + (('7', 0,0,0,0),), + (('2', 0,0,0,0),), + )), + 'bar': ("bar.svg", ((('vert', 0,0,0,0), ('vert', 0,0,1,0),), # f l i t j glot. + (('k', 0,0,0,0), ('vert', 0,0,0,0), ('vert', 0,0,1,0),), # k + (('b', 0,0,0,0), ('vert', 0,0,1,0),), # h heng + (('n', 0,0,0,0), ('vert', 0,0,1,0),), # n m r eng u uu mu + (('b1', 0,0,0,0), ('b0', 0,0,1,0),), # thorn eject. + (('b1', 0,0,0,0), ('n0', 0,0,1,0),), # b p q d + (('n1', 0,0,0,0), ('n0', 0,0,1,0),), # open-a + )), + 'vert': ("epsilon.svg", ((('xtnd', 0,0,0,0),), + (('srf', 0,0,1,0),), + #(('xtnd', 0,0,0,1),), + #(('srf', 0,0,1,1),), + )), + 'srf': ("epsilon.svg", ((('lserif', 0,0,0,0),), + (('lserif', 0,0,0,1),), + (('serif', 0,0,0,0),), + (('tserif', 0,0,0,0),), + (('tserif', 0,0,0,1),), + )), + 'xtnd': ("epsilon.svg", ((('cross', 0,0,0,0),), # this needs to be L-R flippable + (('cross', 0,0,0,1),), + (('l', 0,0,0,0),), + (('?', 0,0,0,0),), + (('?', 0,0,0,1),), + (('idot', 0,0,0,0),), + )), + 'loop': ("epsilon.svg", ((('o0', 5,0,0,1),), # loop-around elts + (('30', 5,0,0,1),), + )), + 'elike': ("epsilon.svg", ((('e', 0,0,0,0), ('crv', 0,0,1,0),), + (('a', 0,0,0,0), ('crv', 0,0,1,0),), + (('crv', 0,0,0,0), ('crv', 0,0,1,0),), + )), + 'loop2': ("epsilon.svg", ((('elike', 0,0,0,0),), + (('loop', 0,0,0,0),), + )), + 'hlike': ("epsilon.svg", ((('h', 0,0,0,0),), # h-like extensions + (('m', 0,0,0,0),), + (('crv', 0,0,0,0),), + )), + 'crv': ("epsilon.svg", ((('r', 0,0,0,0),), # curvy things + (('cserif', 0,0,1,0),), + )), + # image rules + 'abase': ("abase.svg", ((('n0', 0,0,1,0), ('loop2', 0,0,0,0),), + (('n0', 0,0,1,0), ('loop2', 0,0,1,0),), + (('b0', 0,0,1,0), ('loop2', 0,0,0,0),), + (('b0', 0,0,1,0), ('loop2', 0,0,1,0),), + )), + 'v': ("v.svg", ((('vserl', 0,0,0,0), ('vserr', 0,0,0,0),), + (('vserl', 0,0,0,0), ('vserr', 0,0,0,0), ('y0', 0,0,0,0),), + (('vserl', 0,0,0,0), ('w', 6,0,0,0),), + (('vserl', 0,0,0,0), ('w', 6,0,0,0), ('y0', 0,0,0,0),), + )), + 'w': ("v.svg", ((('vserr', 0,0,0,0),), + (('vserr', 0,0,0,0), ('y0', 0,0,0,0),), + )), + 'y0': ("epsilon.svg", ((('y', 0,0,0,1),), + (('y', 0,0,0,0),), + (('gamma', 0,0,0,0),), + )), + 'l': ("l.svg", ((('j', 0,0,0,0),), + (('j', 0,0,0,1),), + (('srf', 0,-4,1,0),), + )), + 'o': ("o.svg", ((('loop2', 0,0,0,0),), + (('loop2', 0,0,1,0),), + )), + 'cross': ("cross.svg", ((('t', 0,0,0,0),), + (('f0', 0,0,0,0),), + )), + 'f': ("f.svg", ((('j', 0, 0,0,0),), + (('j', 0, 0,0,1),), + (('srf', 0,-4,1,0),), + )), + 'f0': ("f.svg", ((('j', 0, 0,0,0),), + (('srf', 0,-4,1,0),), + )), + 'idot': ("idot.svg", ((('serif', 0,0,1,0),), + (('lserif', 0,0,1,0),), + (('lserif', 0,0,1,1),), + )), + 'stik': ("f.svg", ((('srf', 0,-4,1,0),), + #(('srf', 0,-4,1,1),), + )), + '3': ("3.svg", ((('loop2', 0,0,0,0),), + )), + # uppercase + # Bar rules + 'X': ("epsilon.svg", ((('Xtb', 0,0,0,0), ('Xtb', 0,-5,1,1),), + (('Xlr', 0,0,0,0), ('Xlr', 0,-5,1,1),), + (('Xtb', 0,0,0,0), ('Xtb2', 0,-5,1,1),), + (('Xlr', 0,0,0,0), ('Xlr2', 0,-5,1,1),), + (('Xtb2', 0,0,0,0), ('Xtb', 0,-5,1,1),), + (('Xlr2', 0,0,0,0), ('Xlr', 0,-5,1,1),), + )), + + 'Xtb': ("epsilon.svg", ((('Xnw', 0,0,0,0), ('Xne', 0,0,0,0),), + (('Xne', 0,0,0,0), ('Xh', 0,0,0,0), ('Lterm2', 0,0,0,0),), + (('Xnw', 0,0,0,0), ('Xh', 0,0,0,1), ('Lterm2', 0,0,0,1),), + (('Xne', 0,0,0,0), ('Xh', 0,0,0,0), ('Xnw', 0,0,0,0), ('Xh', 0,0,0,1),), + )), + 'Xlr': ("epsilon.svg", ((('Xne', 0,-5,1,1), ('Xnw', 0,0,0,0),), + (('Xne', 0,-5,1,1), ('Xvt', 0,0,0,0), ('Xvb', 0,0,0,0), ('ITSerif', 0.5,0,0,0),), + (('Xnw', 0, 0,0,0), ('Xvt', 0,0,0,0), ('Xvt', 0,-5,1,0), ('IBSerif', 0,0,0,0),), + (('Xne', 0,-5,1,1), ('Xnw', 0,0,0,0), ('Xvt', 0,0,0,0), ('Xvb', 0,0,0,0),), + )), + + 'Xtb2': ("epsilon.svg", ((('Xne', 0,0,0,0),), + (('Xnw', 0,0,0,0),), + )), + 'Xlr2': ("epsilon.svg", ((('Xnw', 0,0,0,0),), + (('Xne', 0,-5,1,1),), + )), + + 'Xne': ("Xne.svg",), + 'Xnw': ("Xnw.svg",), + 'Xh': ("Xh.svg",), + 'Xvt': ("Xvt.svg",), + 'Xvb': ("Xvb.svg",), + + + 'Bar': ("barcap.svg", ((('Bartop', 0,0,0,0), ('Barbot', 0,0,0,0), ('Barmid', 0,0,0,0),), + (('Bartop2', 0,0,0,0), ('Barbot2', 0,0,0,0),), + )), + 'Bartop': ("epsilon.svg", ((('ITSerif', 0.5,0,0,0),), + (('Tt', 0, 0,0,0),), + )), + 'Barbot': ("epsilon.svg", ((('IBSerif', 0,0,0,0),), + (('Tb', 0,0,0,0),), + )), + 'Barbot2': ("epsilon.svg", ((('Barbot', 0,0,0,0),), + (('Psi', 0,0,0,0),), + )), + 'Bartop2': ("epsilon.svg", ((('Bartop', 0, 0,0,0),), + (('Psi', 0,-5,1,0),), + )), + 'Barmid': ("epsilon.svg", ((('Hm', 0,0,0,0), ('Eserif', 0,0,0,0), ('Hm', -7.5,0,0,1), ('Eserif', -7.5,0,0,1),), + (('P', -2.5,3,0,0), ('P', -5, 3,0,1),), + (('P', -5,3,0,1),), #points left + )), + 'Psi': ("epsilon.svg", ((('IBSerif', 0,0,0,0), ('R', -2.5,0,0,0,), ('R', -5,0,0,1,),), + )), + # D / E / F / H / L rules + 'D': ("epsilon.svg", ((('Dterm', 0,0,0,0), ('Dterm', 0,0,0,1),), + (('Dterm', 0,0,0,0), ('Dterm2', 0,0,0,1),), + )), + 'E': ("epsilon.svg", ((('Eterm', 0,0,0,0), ('Eterm', 0,0,0,1),), + (('Eterm', 0,0,0,0), ('Eterm2', 0,0,0,1),), + (('Eterm2', 0,0,0,1), ('Eterm2', 0,-5,1,0),), # for S + )), + 'F': ("epsilon.svg", ((('Fterm', 0,0,0,0), ('Fterm', 0,0,0,1),), + (('Fterm', 0,0,0,0), ('Fterm2', 0,0,0,1),), + )), + 'H': ("epsilon.svg", ((('Hterm', 0,0,0,0), ('Hterm', 0,0,0,1),), + (('Hterm', 0,0,0,0), ('Hterm2', 0,0,0,1),), + )), + 'L': ("epsilon.svg", ((('Lterm', 0,0,0,0), ('Lterm', 0,0,0,1),), + (('Lterm', 0,0,0,0), ('Lterm2', 0,0,0,1),), + )), + 'Dterm': ("epsilon.svg", ((('Barterm', 0,0,0,0), ('Et', 0,0,0,0), ('Eb', 0,0,0,0),), + (('O', 0,0,0,0),), + )), + 'Dterm2':("epsilon.svg", ((('C', 0,0,0,1),), + (('Ltserif', 0,0,0,1), ('Lbserif', 0,0,0,1),), + )), + 'Eterm': ("epsilon.svg", ((('Barterm', 0,0,0,0), ('Et', 0,0,0,0), ('Hm', 0,0,0,0), ('Eb', 0,0,0,0),), + (('B', 0,0,0,1),), + (('O', 0,0,0,0), ('Ocross', 0,0,0,0),), + (('Dterm', 0,0,0,0), ('Eserif', 0,0,0,1),), + (('Dterm2', 0,0,0,0), ('Eserif', 0,0,0,1),), + )), + 'Eterm2':("epsilon.svg", ((('P', 0,0,0,1), ('Lterm2', 0,-5,1,0),), + )), + 'Fterm': ("epsilon.svg", ((('Barterm', 0,0,0,0), ('Et', 0,0,0,0), ('Hm', 0,0,0,0), ('IBSerif', 0,0,0,0),), + (('Lterm', 0,0,0,0), ('Eserif', 0,0,0,1),), + (('P', 0,0,0,1), ('R', 0,0,0,1),), + (('Ltserif', 0,0,0,1), ('R', 0,0,0,1),), + (('Ltserif', 0,0,0,1), ('Rblock', 0,0,0,1),), + (('Uterm', 0,0,0,0), ('Ocross', 0,0,0,0),), + )), + 'Fterm2':("epsilon.svg", ((('P', 0,0,0,1),), + (('Lterm2', 0,0,0,0), ('Eserif', 0,0,0,1),), + )), + 'Hterm': ("epsilon.svg", ((('Barterm', 0,0,0,0), ('Hm', 0,0,0,0), ('ITSerif', 0.5,0,0,0), ('IBSerif', 0,0,0,0),), + (('R', 0,0,0,1), ('R', 0,-5,1,1),), + )), + 'Hterm2':("epsilon.svg", ((('R', 0,0,0,1),), + (('Rblock',0,0,0,1),), + )), + 'Lterm': ("epsilon.svg", ((('Barterm', 0,0,0,0), ('Et', 0,0,0,0), ('IBSerif', 0,0,0,0),), + (('Uterm', 0,0,0,0),), + )), + 'Lterm2':("epsilon.svg", ((('Ltserif', 0,0,0,1),), + (('Cserif', 0,-5,1,1),), + )), + 'B': ("epsilon.svg", ((('P', 0,0,0,0), ('P', 0,6,0,0),),)), + 'C': ("epsilon.svg", ((('Cserif', 0,0,0,0), ('Cserif', 0,-5,1,0),),)), + 'Cserif':("epsilon.svg", (#(('Ctail', 0,0,0,0),), # I just hate the way these look... + (('Cblob', 0,0,0,0),), + (('Chook', 0,-5,1,0),), + (('G', 0,0,0,0),), + ),), + 'O': ("epsilon.svg", ((('Oterm', 0,0,0,0),), + (('Q', 0,0,0,1),), + (('Qu', 0,0,0,1),), + )), + 'Qu': ("epsilon.svg", ((('Q', 0,-5,1,0),),)), + 'Barterm':("barcap.svg",), + 'Ctail': ("Ctail.svg",), + 'Chook': ("Chook.svg",), + 'Cblob': ("Cblob.svg",), + 'G': ("G.svg",), + 'Ltserif':("Lt.svg",), + 'Lbserif':("Lb.svg",), + 'Et': ("Et.svg",), + 'Eb': ("Eb.svg",), + 'Hm': ("hcap.svg",), + 'P': ("P.svg",), + 'Tb': ("Tb.svg",), + 'Tt': ("Tt.svg",), + 'Ocross':("Ocross.svg",), + 'Oterm': ("ocap.svg",), + 'Q': ("Q.svg",), + 'R': ("rcap.svg", ((('IBSerif', -0.5,0,0,1),),)), + 'Rblock':("Rblock.svg", ((('IBSerif', -0.5,0,0,1),),)), + 'Uterm': ("U.svg", ((('IBSerif', -0.5,0,0,0),),)), + 'IBSerif':("IBSerif.svg",), + 'ITSerif':("ITSerif.svg",), + 'Eserif':("Eserif.svg",), + # V rules + 'V': ("vcap.svg", ((('V2', 0,0,0,0),), + (('V2', 0,0,0,0), ('Across', 0,0,0,0)), + )), + 'V2': ("epsilon.svg", ((('M', 0,0,0,0),), + (('Delta', 0,0,0,0),), + (('Vser', 0,0,0,0),), + )), + 'M': ("mcap.svg", ((('IBSerif', -1.5,0,0,0), ('IBSerif', 1.5,0,0,1),),)), + 'Delta': ("Delta.svg",), + 'Vser': ("Vser.svg",), + 'Across':("acap.svg",), + # single daughter rules + 'b': ("b.svg", ((('hlike', 0,0,0,0), ('f', 0,0,0,0),), + #(('hlike', 0,0,0,0), ('f', 0,0,0,1),), + )), + 'b1': ("b.svg", ((('loop', 0,0,0,0), ('f', 0,0,0,0),), + #(('loop', 0,0,0,0), ('f', 0,0,0,1),), + )), + 'b0': ("b.svg", ((('f', 0,0,0,0),), + #(('f', 0,0,0,1),), + )), + 'h': ("h.svg", ((('vert', 5,0,1,0),),)), + 'm': ("m.svg", ((('h', 5,0,0,0), ('vert', 5,0,1,0),),)),# change later to allow 3 humped m + 'n': ("n.svg", ((('hlike', 0,0,0,0),),)), + 'n1': ("n.svg", ((('loop', 0,0,0,0),),)), + 's': ("s.svg", ((('crv', 0,0,0,0), ('crv', 5,0,1,1),),)), + 'j': ("j.svg", ((('crv', 0,-5,0,0),),)), + '?': ("question.svg", ((('crv', -2.5,-5,0,0),),)), + 'yogh': ("yogh.svg",((('crv', -2.5,4,1,0),),)), + #terminal rules + '2': ("2.svg",), + '30': ("3.svg",), + '7': ("7.svg",), + 'a': ("a.svg",), + 'cserif':("cserif.svg",), + 'e': ("e.svg",), + 'k': ("k.svg",), + 'n0': ("n.svg",), + 'o0': ("o.svg",), + 'r': ("r.svg",), + 'serif': ("serif.svg",), + 'tserif':("tserif.svg",), + 'lserif':("lserif.svg",), + 't': ("t.svg",), + 'x': ("x.svg",), + 'z': ("z.svg",), + 'vserl': ("vserl.svg",), + 'vserr': ("vserr.svg",), + 'y': ("y.svg",), + 'gamma': ("gamma.svg",) + } + +alphabet = { + # Uppercase fix Y make 2) + '1': ("start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Bartop.[.ITSerif.].].Barbot2.[.Barbot.[.IBSerif.].].].].].]",), + '33': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.[.C.|.].Eserif.|.].Eterm.[.O.Ocross.].|.].].].]",), + '3': ("start.[.UC.[.UCb.[.E.[.Eterm.[.B.[.P.P.].|.].Eterm.[.Dterm2.[.C.|.].Eserif.|.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.[.C.|.].Eserif.|.].Eterm.[.O.Ocross.].|.].].].]",), + '4': ("start.[.UC.[.UCu.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm2.[.Rblock.[.IBSerif.|.].|.].|.].].-.|.].].]",), + '5': ("start.[.UC.[.UCu.[.UCb.[.E.[.Eterm.[.Dterm2.[.Ltserif.|.Lbserif.|.].Eserif.|.].Eterm2.[.P.|.Lterm2.[.Ltserif.|.].-.].|.].|.].-.|.].].]",), + '6': ("start.[.UC.[.UCu.[.UCb.[.E.[.Eterm.[.Dterm.[.O.].Eserif.|.].Eterm2.[.P.|.Lterm2.-.].|.].|.].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.E.[.Eterm.[.O.Ocross.].Eterm2.[.P.|.Lterm2.-.].|.].|.].-.|.].].]",), + '7': ("start.[.UC.[.UCb.[.X.[.Xtb.[.Xne.Xh.Lterm2.[.Ltserif.|.].].Xtb2.[.Xne.].-.|.].].].]",), + '8': ("start.[.UC.[.UCb.[.E.[.Eterm.[.B.[.P.P.].|.].Eterm.[.B.[.P.P.].|.].|.].].].]",), + '9': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm.[.O.].Eserif.|.].Eterm2.[.P.|.Lterm2.-.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.O.Ocross.].Eterm2.[.P.|.Lterm2.-.].|.].|.].].]",), + '0': ("start.[.UC.[.UCb.[.D.[.Dterm.[.O.].Dterm.[.O.].|.].].].]",), + 'A': ("start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Barterm.Et.Hm.IBSerif.].|.].].].]", # no flip needed + "start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Uterm.[.IBSerif.].Ocross.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Uterm.[.IBSerif.].Ocross.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].Fterm.[.Uterm.[.IBSerif.].Ocross.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm.[.Uterm.[.IBSerif.].Ocross.].|.].].].]", + "start.[.UC.[.UCu.[.UCb.[.V.[.V2.[.Vser.].Across.].|.].-.|.].].]",), + 'B': ("start.[.UC.[.UCb.[.E.[.Eterm.[.B.[.P.P.].|.].Eterm.|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm.Eserif.|.].Eterm.[.B.[.P.P.].|.].|.].].].]",), + 'Be': ("start.[.UC.[.UCu.[.UCb.[.E.[.Eterm.[.Barterm.Et.Hm.Eb.].Eterm2.[.P.|.Lterm2.-.].|.].|.].-.|.].].]", #cyrillic + "start.[.UC.[.UCu.[.UCb.[.E.[.Eterm.[.Dterm.[.Barterm.Et.Eb.].Eserif.|.].Eterm2.[.P.|.Lterm2.-.].|.].|.].-.|.].].]",), + 'C': ("start.[.UC.[.UCb.[.D.[.Dterm.[.O.[.Oterm.].].Dterm2.[.C.|.].|.].].].]",), + 'D': ("start.[.UC.[.UCb.[.D.[.Dterm.Dterm.[.O.[.Oterm.].].|.].].].]", + "start.[.UC.[.UCb.[.D.[.Dterm.[.O.[.Oterm.].].Dterm2.[.Ltserif.|.Lbserif.|.].|.].|.].].].", + "start.[.UC.[.UCb.[.D.[.Dterm.[.Barterm.Et.Eb.].Dterm.[.Barterm.Et.Eb.].|.].].].]",), + 'Delta': ("start.[.UC.[.UCu.[.UCb.[.V.[.V2.[.Delta.].].|.].-.|.].].]",), #Delta + 'De': ("start.[.UC.[.UCu.[.UCb.[.D.[.Dterm.[.Barterm.Et.Eb.].Dterm.[.Barterm.Et.Eb.].|.].].-.|.].].]",), #Cyrillic + 'E': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.Eserif.|.].Eterm.[.Dterm.[.Barterm.Et.Eb.].Eserif.|.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.Eserif.|.].Eterm.[.Dterm.[.O.].Eserif.|.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.Eserif.|.].Eterm.[.B.[.P.P.].|.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.Eserif.|.].Eterm.[.Barterm.Et.Hm.Eb.].|.].|.].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.O.Ocross.].Eterm.[.Dterm2.Eserif.|.].|.].].].]",), + 'Eth': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm.[.O.].Eserif.|.].Eterm.[.Barterm.Et.Hm.Eb.].|.].|.].].]",), + 'F': ("start.[.UC.[.UCb.[.F.[.Fterm.Fterm2.[.Lterm2.Eserif.|.].|.].].].]",), + 'G': ("start.[.UC.[.UCb.[.D.[.Dterm.[.O.].Dterm2.[.C.[.Cserif.[.G.].Cserif.-.].|.].|.].].].]",), + 'Gamma': ("start.[.UC.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm2.|.].].].]",), #Gamma + 'H': ("start.[.UC.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm.[.Barterm.Hm.ITSerif.IBSerif.].|.].].].]", + "start.[.UC.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm2.[.R.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm2.[.Rblock.[.IBSerif.|.].|.].|.].].].]",), + 'Che': ("start.[.UC.[.UCu.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm2.[.Rblock.[.IBSerif.|.].|.].|.].].-.|.].].]", #Cyrillic + "start.[.UC.[.UCu.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm2.[.R.[.IBSerif.|.].|.].|.].].-.|.].].]",), + 'Heng': ("start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Ltserif.|.R.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm.[.Ltserif.|.Rblock.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm.[.Ltserif.|.R.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm.[.Ltserif.|.Rblock.[.IBSerif.|.].|.].|.].].].]",), + 'I': ("start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Bartop.[.ITSerif.].].Barbot2.[.Barbot.[.IBSerif.].].].].].]", + "start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Bartop.[.Tt.].].Barbot2.[.Barbot.[.Tb.].].].].].]",), + 'J': ("start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Uterm.[.IBSerif.].].Lterm2.|.].].-.|.].].]",), + 'K': ("start.[.UC.[.UCu.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xnw.].Xlr.[.Xne.-.|.Xvt.Xvb.ITSerif.].-.|.].].-.|.].].]", + "start.[.UC.[.UCb.[.H.[.Hterm.[.Barterm.Hm.ITSerif.IBSerif.].Hterm.[.R.[.IBSerif.|.].|.R.[.IBSerif.|.].-.|.].|.].].].]",), + 'Zhe': ("start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Psi.[.IBSerif.R.[.IBSerif.|.].R.[.IBSerif.|.].|.].-.].Barbot2.[.Psi.[.IBSerif.R.[.IBSerif.|.].R.[.IBSerif.|.].|.].].].].].]",), # Cyrillic + 'L': ("start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm2.|.].|.].-.|.].].]",), + 'Lambda':("start.[.UC.[.UCu.[.UCb.[.V.[.V2.[.Vser.].].|.].-.|.].].]",),# Lambda + 'M': ("start.[.UC.[.UCu.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xvt.Xvb.ITSerif.].Xlr.[.Xnw.Xvt.Xvt.-.IBSerif.].-.|.].].-.|.].].]", + "start.[.UC.[.UCb.[.V.[.V2.[.M.[.IBSerif.IBSerif.|.].].].|.].].]",), + 'N': ("start.[.UC.[.UCu.[.UCb.[.X.[.Xlr.[.Xnw.Xvt.Xvt.-.IBSerif.].Xlr.[.Xnw.Xvt.Xvt.-.IBSerif.].-.|.].].-.|.].].]", + "start.[.UC.[.UCb.[.L.[.Lterm.[.Uterm.[.IBSerif.].].Lterm.[.Barterm.Et.IBSerif.].|.].|.].].]",), + 'NN': ("start.[.UC.[.UCu.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xvt.Xvb.ITSerif.].Xlr.[.Xne.-.|.Xvt.Xvb.ITSerif.].-.|.].].-.|.].].]",), # Cyrillic I + 'O': ("start.[.UC.[.UCb.[.D.[.Dterm.[.O.].Dterm.[.O.].|.].].].]",), + 'P': ("start.[.UC.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm2.[.P.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Ltserif.|.R.[.IBSerif.|.].|.].Fterm2.[.P.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Ltserif.|.Rblock.[.IBSerif.|.].|.].Fterm2.[.P.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm2.[.P.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].Fterm2.[.P.|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm2.[.P.|.].|.].].].]",), + 'PL': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm.[.Barterm.Et.Eb.].Eserif.|.].Eterm2.[.P.|.Lterm2.-.].|.].].].]", + "start.[.UC.[.UCb.[.E.[.Eterm.[.Barterm.Et.Hm.Eb.].Eterm2.[.P.|.Lterm2.[.Cserif.-.|.].-.].|.].].].]",), + 'Phi': ("start.[.UC.[.UCb.[.Bar.[.Bartop.[.ITSerif.].Barbot.[.IBSerif.].Barmid.[.P.P.|.].].].].]",), + 'Pi': ("start.[.UC.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm.[.Barterm.Et.IBSerif.].|.].].].]",), + 'Psi': ("start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Psi.[.IBSerif.R.[.IBSerif.|.].R.[.IBSerif.|.].|.].-.].Barbot2.[.Barbot.[.IBSerif.].].].].].]",), + 'Soft': ("start.[.UC.[.UCu.[.UCb.[.F.[.Fterm.[.Barterm.Et.Hm.IBSerif.].Fterm2.[.P.|.].|.].|.].-.|.].].]",# Cyrillic Yeru/Soft/Hard + "start.[.UC.[.UCu.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm2.[.P.|.].|.].|.].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.F.[.Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].Fterm2.[.P.|.].|.].|.].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.F.[.Fterm.[.Ltserif.|.Rblock.[.IBSerif.|.].|.].Fterm2.[.P.|.].|.].|.].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm2.[.P.|.].|.].|.].-.|.].].]",), + 'Q': ("start.[.UC.[.UCb.[.D.[.Dterm.[.O.[.Oterm.].].Dterm.[.O.[.Q.|.].].|.].].].]",), + 'R': ("start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.P.|.R.[.IBSerif.|.].|.].Fterm.[.Barterm.Et.Hm.IBSerif.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].].].]",), + 'Ya': ("start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Barterm.Et.IBSerif.].Eserif.|.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Lterm.[.Uterm.[.IBSerif.].].Eserif.|.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].|.].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.P.|.R.[.IBSerif.|.].|.].Fterm.[.Barterm.Et.Hm.IBSerif.].|.].].].]", + "start.[.UC.[.UCb.[.F.[.Fterm.[.Uterm.[.IBSerif.].Ocross.].Fterm.[.P.|.R.[.IBSerif.|.].|.].|.].|.].].]",), + 'S': ("start.[.UC.[.UCb.[.E.[.Eterm2.[.P.|.Lterm2.-.].|.Eterm2.[.P.|.Lterm2.-.].-.].|.].].]",), + 'Sigma': ("start.[.UC.[.UCb.[.X.[.Xtb.[.Xnw.Xh.|.Lterm2.|.].Xtb.[.Xne.Xh.Lterm2.].-.|.].].].]",), + 'T': ("start.[.UC.[.UCb.[.Bar.[.Bartop2.[.Bartop.[.Tt.].].Barbot2.[.Barbot.[.IBSerif.].].].].].]", + "start.[.UC.[.UCb.[.Bar.[.Bartop.[.ITSerif.].Barbot.[.IBSerif.].Barmid.[.Hm.Eserif.Hm.|.Eserif.|.].].].].]",), + 'Theta': ("start.[.UC.[.UCb.[.E.[.Eterm.[.O.Ocross.].Eterm.[.O.Ocross.].|.].].].]",), + 'Thorn': ("start.[.UC.[.UCu.[.UCb.[.Bar.[.Bartop.[.ITSerif.].Barbot.[.IBSerif.].Barmid.[.P.|.].].].-.|.].].]",), + 'U': ("start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm.[.Barterm.Et.IBSerif.].|.].|.].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm.[.Uterm.[.IBSerif.].].|.].].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Uterm.[.IBSerif.].].Lterm.[.Uterm.[.IBSerif.].].|.].].-.|.].].]", + "start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm.[.Barterm.Et.IBSerif.].|.].].-.|.].].]",), + 'Tse': ("start.[.UC.[.UCu.[.UCb.[.L.[.Lterm.[.Barterm.Et.IBSerif.].Lterm.[.Barterm.Et.IBSerif.].|.].].-.|.].].]",),# Cyrillic + 'V': ("start.[.UC.[.UCb.[.V.[.V2.[.Vser.].].|.].].]",), + 'W': ("start.[.UC.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xvt.Xvb.ITSerif.].Xlr.[.Xnw.Xvt.Xvt.-.IBSerif.].-.|.].].].]", + "start.[.UC.[.UCu.[.UCb.[.V.[.V2.[.M.[.IBSerif.IBSerif.|.].].].|.].-.|.].].]",), + 'X': ("start.[.UC.[.UCu.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xnw.].Xlr.[.Xne.-.|.Xnw.].-.|.].].-.|.].].]", + "start.[.UC.[.UCb.[.H.[.Hterm.[.R.|.R.-.|.].Hterm.[.R.|.R.-.|.].|.].].].]",), + 'Xi': ("start.[.UC.[.UCb.[.E.[.Eterm.[.Dterm2.[.Ltserif.|.Lbserif.|.].Eserif.|.].Eterm.[.Dterm2.[.Ltserif.|.Lbserif.|.].Eserif.|.].|.].|.].].]",), + 'Y': ("start.[.UC.[.UCb.[.X.[.Xlr.[.Xne.-.|.Xnw.].Xlr2.[.Xne.-.|.].-.|.].].].]",), + 'Z': ("start.[.UC.[.UCb.[.X.[.Xtb.[.Xne.Xh.Lterm2.].Xtb.[.Xne.Xh.Lterm2.].-.|.].].].]",), + # Lowercase + 'a': ("start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.n0.-.loop2.[.elike.[.a.crv.-.].].-.].|.].].].].]", + "start.[.lc.[.barsym.[.bar.[.n1.[.loop.].n0.-.].-.|.].].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.n0.-.loop2.[.loop.].].|.].].].].]",), + 'carat':("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.vserr.].-.|.].].].]",), + 'b': ("start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.].n0.-.].].].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.].-.loop2.[.loop.].].-.].].].].]", + "start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.|.].n0.-.].].].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.|.].-.loop2.[.loop.].].-.].].].].]",), + 'c': ("start.[.lc.[.lc2.[.osym.[.o.[.loop2.[.elike.[.crv.-.|.crv.|.].|.].].].].].]",), + 'd': ("start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.].n0.-.].].|.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.].-.loop2.[.loop.].].-.].|.].].].]", + "start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.|.].n0.-.].].|.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.|.].-.loop2.[.loop.].].-.].|.].].].]",), + 'e': ("start.[.lc.[.lc2.[.osym.[.o.[.loop2.[.elike.[.e.crv.-.].].].].].].]", + "start.[.lc.[.lc2.[.lc3.[.3sym.[.3.[.loop2.[.elike.[.crv.crv.-.].].].].].].].]",), + 'epsi': ("start.[.lc.[.lc2.[.lc3.[.3sym.[.3.[.loop2.[.elike.[.crv.crv.-.].].].].].].].]",), + 'f': ("start.[.lc.[.barsym.[.bar.[.vert.[.xtnd.[.cross.[.f0.[.j.].].].].vert.-.].].].]",), + 'g': ("start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.[.j.[.crv.].].].n0.-.].-.|.].].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.[.j.].].-.loop2.[.loop.].].-.].-.|.].].].]",), + 'gamma':("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.vserr.y0.[.gamma.].].].].].]",), + 'h': ("start.[.lc.[.barsym.[.bar.[.b.[.hlike.[.h.].f.].vert.-.].].].]", + "start.[.lc.[.barsym.[.bar.[.b.[.hlike.[.h.].f.|.].vert.-.].].].]",), + 'heng': ("start.[.lc.[.barsym.[.bar.[.b.[.hlike.[.h.[.vert.[.xtnd.[.l.[.j.[.crv.].].].|.].-.].].f.[.j.[.crv.].].].vert.[.srf.-.|.].-.].].].]",), + 'i': ("start.[.lc.[.barsym.[.bar.[.vert.vert.[.xtnd.[.idot.].-.].].-.|.].].]", + "start.[.lc.[.barsym.[.bar.[.vert.vert.[.xtnd.[.idot.].-.].|.].-.|.].].]",), + 'j': ("start.[.lc.[.barsym.[.bar.[.vert.[.xtnd.[.idot.].-.].vert.[.xtnd.[.l.[.j.].].].|.].-.].].]",), + 'k': ("start.[.lc.[.barsym.[.bar.[.k.vert.vert.-.].].].]",), + 'l': ("start.[.lc.[.barsym.[.bar.[.vert.vert.[.xtnd.[.l.].-.].|.].-.|.].].]", + "start.[.lc.[.barsym.[.bar.[.vert.vert.[.xtnd.[.l.|.].-.].|.].-.|.].].]",), + 'lambda':("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.vserr.y0.].-.|.].].].]",), + 'm': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.m.[.h.[.vert.-.].vert.-.].].].vert.-.].].].]",), + 'mu': ("start.[.lc.[.barsym.[.bar.[.b.[.hlike.[.h.[.vert.-.].].f.].vert.-.].-.|.].].]",), + 'muu': ("start.[.lc.[.barsym.[.bar.[.b.[.hlike.[.m.[.h.[.vert.-.].vert.-.].].f.].vert.-.|.].-.|.].].]",), + 'n': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.h.[.vert.-.].].].vert.-.].].].]",), + 'ng': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.h.[.vert.[.xtnd.[.l.[.j.].].|.].-.].].].vert.-.].].].]",), + 'o': ("start.[.lc.[.lc2.[.osym.[.o.[.loop2.[.loop.[.o0.|.].].].].].].]",), + 'p': ("start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.].n0.-.].].-.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.].-.loop2.[.loop.].].-.].-.].].].]", + "start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.|.].n0.-.].].-.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.|.].-.loop2.[.loop.].].-.].-.].].].]",), + 'q': ("start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.].n0.-.].].-.|.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.].-.loop2.[.loop.].].-.].-.|.].].].]", + "start.[.lc.[.barsym.[.bar.[.b1.[.loop.f.|.].n0.-.].].-.|.].]", + "start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.|.].-.loop2.[.loop.].].-.].-.|.].].].]",), + 'r': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.crv.].].vert.-.].].].]",), + 's': ("start.[.lc.[.lc2.[.lc3.[.ssym.[.s.[.crv.crv.-.|.].].].].].]",), + 't': ("start.[.lc.[.barsym.[.bar.[.vert.[.xtnd.[.cross.[.f0.].].].vert.-.].].].]",), + 'u': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.h.[.vert.-.].].].vert.-.].-.|.].].]",), + 'uu': ("start.[.lc.[.barsym.[.bar.[.n.[.hlike.[.m.[.h.[.vert.-.].vert.-.].].].vert.-.].-.|.].].]",), + 'v': ("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.vserr.].].].].]",), + 'w': ("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.w.[.vserr.].].].].].]",), + 'x': ("start.[.lc.[.lc2.[.dsym.[.diag.[.x.].-.diag.[.x.].|.].-.].].]",), + 'y': ("start.[.lc.[.lc2.[.vsym.[.v.[.vserl.vserr.y0.].].].].]",), + 'yogh': ("start.[.lc.[.lc2.[.dsym.[.diag.[.z.].|.diag.[.yogh.[.crv.-.].-.|.].-.].].].]",), + 'z': ("start.[.lc.[.lc2.[.dsym.[.diag.[.z.].diag.[.z.].-.|.].|.].].]",), + 'glot': ("start.[.lc.[.barsym.[.bar.[.vert.[.xtnd.[.?.|.].].vert.-.].].].]",), + '1l': ("start.[.lc.[.barsym.[.bar.[.vert.[.srf.[.lserif.].].vert.[.srf.[.serif.].-.].|.].].-.].]",), + '2l': ("start.[.lc.[.lc2.[.dsym.[.diag.[.2.].diag.[.z.].-.|.].|.].].]",), + '3l': ("start.[.lc.[.lc2.[.dsym.[.diag.[.z.].|.diag.[.yogh.[.crv.-.].-.|.].-.].].].]",), + '6l': ("start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.[.j.].].-.loop2.[.loop.].-.].-.].].].].]",), + '7l': ("start.[.lc.[.lc2.[.dsym.[.diag.[.z.].diag.[.7.].-.|.].|.].].]",), + '8l': ("start.[.lc.[.lc2.[.lc3.[.3sym.[.3.[.loop2.[.loop.[.30.|.].].].].].].].]",), + '9l': ("start.[.lc.[.lc2.[.lc3.[.asym.[.abase.[.b0.[.f.[.j.].].-.loop2.[.loop.].-.].|.].].].].]",), + '0l': ("start.[.lc.[.lc2.[.osym.[.o.[.loop2.[.loop.[.o0.|.].].].].].].]",) + } + +space = 4 # number of unit boxes to make a " " space in string +units = 36 # pixels per unit box in font +font = "alphabet_soup/" # location of font images + -- 2.30.2