summaryrefslogtreecommitdiffstats
path: root/packages/svgbob/src/map/ascii_map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'packages/svgbob/src/map/ascii_map.rs')
-rw-r--r--packages/svgbob/src/map/ascii_map.rs1105
1 files changed, 1105 insertions, 0 deletions
diff --git a/packages/svgbob/src/map/ascii_map.rs b/packages/svgbob/src/map/ascii_map.rs
new file mode 100644
index 0000000..1d6ee2d
--- /dev/null
+++ b/packages/svgbob/src/map/ascii_map.rs
@@ -0,0 +1,1105 @@
+use crate::{
+ buffer::{
+ fragment::PolygonTag::{
+ ArrowBottom, ArrowBottomLeft, ArrowBottomRight, ArrowLeft,
+ ArrowRight, ArrowTop, ArrowTopLeft, ArrowTopRight, DiamondBullet,
+ },
+ Cell, CellGrid, Settings,
+ },
+ fragment::{arc, broken_line, circle, line, polygon, rect},
+ Fragment, Property,
+ Signal::{self, Medium, Strong, Weak},
+};
+use lazy_static::lazy_static;
+use std::{collections::BTreeMap, sync::Arc};
+
+lazy_static! {
+
+ /// ```ignore
+ /// 0 1 2 3 4 B C D
+ /// 0┌─┬─┬─┬─┐ A┌─┬─┬─┬─┐E
+ /// 1├─┼─┼─┼─┤ │ │ │ │ │
+ /// 2├─┼─┼─┼─┤ F├─G─H─I─┤J
+ /// 3├─┼─┼─┼─┤ │ │ │ │ │
+ /// 4├─┼─┼─┼─┤ K├─L─M─N─┤O
+ /// 5├─┼─┼─┼─┤ │ │ │ │ │
+ /// 6├─┼─┼─┼─┤ P├─Q─R─S─┤T
+ /// 7├─┼─┼─┼─┤ │ │ │ │ │
+ /// 8└─┴─┴─┴─┘ U└─┴─┴─┴─┘Y
+ /// ``` V W X
+
+ pub static ref ASCII_PROPERTIES: BTreeMap<char, Property> = {
+ #![allow(unused)]
+
+ let cell = Cell::new(0,0);
+
+ let a = CellGrid::a();
+ let b = CellGrid::b();
+ let c = CellGrid::c();
+ let d = CellGrid::d();
+ let e = CellGrid::e();
+ let f = CellGrid::f();
+ let g = CellGrid::g();
+ let h = CellGrid::h();
+ let i = CellGrid::i();
+ let j = CellGrid::j();
+ let k = CellGrid::k();
+ let l = CellGrid::l();
+ let m = CellGrid::m();
+ let n = CellGrid::n();
+ let o = CellGrid::o();
+ let p = CellGrid::p();
+ let q = CellGrid::q();
+ let r = CellGrid::r();
+ let s = CellGrid::s();
+ let t = CellGrid::t();
+ let u = CellGrid::u();
+ let v = CellGrid::v();
+ let w = CellGrid::w();
+ let x = CellGrid::x();
+ let y = CellGrid::y();
+
+ /// cellgrids that have no names
+ /// just name them with coordinate locations
+ let _01 = CellGrid::point(0, 1);
+ let _11 = CellGrid::point(1, 1);
+ let _21 = CellGrid::point(2, 1);
+ let _31 = CellGrid::point(3, 1);
+ let _41 = CellGrid::point(4, 1);
+ let _03 = CellGrid::point(0, 3);
+ let _13 = CellGrid::point(1, 3);
+ let _23 = CellGrid::point(2, 3);
+ let _33 = CellGrid::point(3, 3);
+ let _43 = CellGrid::point(4, 3);
+ let _05 = CellGrid::point(0, 5);
+ let _15 = CellGrid::point(1, 5);
+ let _25 = CellGrid::point(2, 5);
+ let _35 = CellGrid::point(3, 5);
+ let _45 = CellGrid::point(4, 5);
+ let _07 = CellGrid::point(0, 7);
+ let _17 = CellGrid::point(1, 7);
+ let _27 = CellGrid::point(2, 7);
+ let _37 = CellGrid::point(3, 7);
+ let _47 = CellGrid::point(4, 7);
+
+ let unit1 = Cell::unit(1); // 0.25
+ let unit1_5 = Cell::unit(1) * 1.5; // 0.375
+ let unit2 = Cell::unit(2); // 0.5
+ let unit3 = Cell::unit(3); // 0.75
+ let unit4 = Cell::unit(4); // 1.0
+ let unit5 = Cell::unit(5); // 1.25
+ let unit6 = Cell::unit(6); // 1.5
+ let unit7 = Cell::unit(7); // 1.75
+ let unit8 = Cell::unit(8); // 2.0
+
+ // in between 1 and 2
+ let between1_2 = (unit1 + unit2) / 2.0; // 0.375
+
+ /// char, default fragments, conditional fragments
+ let map: Vec<(
+ char,
+ Vec<(Signal, Vec<Fragment>)>,
+ Arc<dyn Fn(&Settings, &Property, &Property, &Property, &Property, &Property, &Property, &Property, &Property) -> Vec<(bool, Vec<Fragment>)> + Sync + Send >,
+ )> = vec![
+ ///////////////
+ // dash -
+ ///////////////
+ (
+ '-',
+ vec![
+ (Strong, vec![line(k, o)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (true, vec![line(k,o)]),
+ /*
+ // |
+ // .-.
+ // |
+ (settings.enhance_circuitries && left.is('.') && right.is('.') && top.line_strongly_overlap(r,w) && bottom.line_strongly_overlap(c,h),
+ vec![arc(o,k,unit4),line(c,w)]
+ ),
+ */
+ ]
+ }
+ )
+ ),
+ ///////////////
+ // tilde ~
+ ///////////////
+ (
+ '~',
+ vec![
+ (Strong, vec![broken_line(k, o)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (true, vec![broken_line(k, o)]),
+ ]
+ }
+ )
+ ),
+ ////////////////////
+ // vertical line |
+ ////////////////////
+ (
+ '|',
+ vec![
+ (Strong, vec![line(c,w)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (!bottom_left.is('/') && !bottom_right.is('\\') && !top_left.is('\\') && !top_right.is('/'), vec![line(c,w)]),
+ // _
+ // |
+ (top_right.line_overlap(u, v), vec![line(c,e)]),
+ // _
+ // |
+ (top_left.line_overlap(x, y), vec![line(a,c)]),
+ // |_
+ (right.line_overlap(u,v), vec![line(w,y)]),
+ // _|
+ (left.line_overlap(x,y), vec![line(u,w)]),
+ // |-
+ (right.line_strongly_overlap(k,l), vec![line(m,o)]),
+ // -|
+ (left.line_strongly_overlap(n,o), vec![line(k,m)]),
+ // TODO: restrict lef, right, bottom, top_right, is not connecting to
+ // here
+ // |
+ // /
+ (bottom_left.line_overlap(e,u), vec![line(c,m),line(m,u)]),
+ // TODO: restrict left, right, bottom, top_left, top_right
+ // |
+ // \
+ (bottom_right.line_overlap(a,y), vec![line(c,m), line(m,y)]),
+ // TODO: restrict left, right, top, bottom_left, bottom_right
+ // \ /
+ // |
+ (top_left.line_overlap(a,y) && top_right.line_overlap(e,u), vec![line(a,m),line(m,w),line(m,e)]),
+ ]
+ }
+ )
+ ),
+ ////////////////////
+ // exclamation bang !
+ ////////////////////
+ (
+ '!',
+ vec![
+ (Strong, vec![broken_line(c,w)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (top.line_strongly_overlap(r,w) || bottom.line_strongly_overlap(c,h), vec![broken_line(c,w)]),
+ ]
+ }
+ )
+ ),
+ ////////////////////
+ // colon :
+ ////////////////////
+ (
+ ':',
+ vec![
+ (Strong, vec![broken_line(c,w)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (top.line_strongly_overlap(r,w) || bottom.line_strongly_overlap(c,h), vec![broken_line(c,w)]),
+ ]
+ }
+ )
+ ),
+ /////////////////////////
+ // plus cross +
+ /////////////////////////
+ (
+ '+',
+ vec![
+ (Medium, vec![line(c,w),line(k,o)]),
+ (Weak, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // |
+ // +
+ (top.line_overlap(r,w), vec![line(c, m)]),
+ // +
+ // |
+ (bottom.line_overlap(c,h), vec![line(m,w)]),
+ // -+
+ (left.line_overlap(n,o), vec![line(k,m)]),
+ // +-
+ (right.line_overlap(k,l), vec![line(m,o)]),
+
+ // .+
+ (left.line_weakly_overlap(n,o), vec![line(k,m)]),
+ // +.
+ (right.line_weakly_overlap(k,l), vec![line(m,o)]),
+
+ // \
+ // +
+ (top_left.line_overlap(s,y), vec![line(a, m)]),
+ // +
+ // \
+ (bottom_right.line_overlap(a,g), vec![line(m, y)]),
+ // /
+ // +
+ (top_right.line_overlap(q,u), vec![line(m, e)]),
+ // +
+ // /
+ (bottom_left.line_overlap(e,i), vec![line(m, u)]),
+ ]
+ }
+ )
+ ),
+ /////////////////////////
+ // letter X
+ /////////////////////////
+ (
+ 'X',
+ vec![
+ (Strong, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ /*
+ // \ X
+ // X \
+ (top_left.line_overlap(s,y) || bottom_right.line_overlap(a,g), vec![line(a, y)]),
+ // / X
+ // X /
+ (top_right.line_overlap(q,u) || bottom_left.line_overlap(e,i), vec![line(e, u)]),
+ */
+
+ // -x
+ (left.line_strongly_overlap(m,o), vec![line(m,k)]),
+ // x-
+ (right.line_strongly_overlap(k,l), vec![line(m,o)]),
+ // |
+ // x
+ (top.line_strongly_overlap(r,w), vec![line(m,c)]),
+ // x
+ // |
+ (bottom.line_strongly_overlap(c,h), vec![line(m,w)]),
+ // \
+ // x
+ (top_left.line_strongly_overlap(s,y), vec![line(m,a)]),
+ // /
+ // x
+ (top_right.line_strongly_overlap(u,q), vec![line(m,e)]),
+ // x
+ // /
+ (bottom_left.line_strongly_overlap(e,i), vec![line(m,u)]),
+ // x
+ // \
+ (bottom_right.line_strongly_overlap(a,g), vec![line(m,y)]),
+ ]
+ }
+ )
+ ),
+ /////////////////////////
+ // asterisk *
+ /////////////////////////
+ (
+ '*',
+ vec![
+ (Strong, vec![circle(m, unit1_5, true)]),
+ (Medium, vec![line(c,w),line(k,o)]),
+ (Weak, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+
+ // must have at least one connection
+ // \|/
+ // -*-
+ // /|\
+ (top.line_strongly_overlap(r,w) || bottom.line_strongly_overlap(c,h)
+ || left.line_strongly_overlap(n,o) || right.line_strongly_overlap(k,l)
+ || top_left.line_strongly_overlap(s,y)|| bottom_right.line_strongly_overlap(a,g)
+ || bottom_left.line_strongly_overlap(u,q) || top_right.line_strongly_overlap(e,i),
+ vec![circle(m,unit1_5,true)]),
+
+ // |
+ // *
+ (top.line_strongly_overlap(r,w),
+ vec![line(c,h)]
+ ),
+ // *
+ // |
+ (bottom.line_strongly_overlap(c,h),
+ vec![line(w,r)]
+ ),
+ // \
+ // *
+ (top_left.line_strongly_overlap(s,y),
+ vec![line(a,g)]
+ ),
+ // /
+ // *
+ (top_right.line_strongly_overlap(u,q),
+ vec![line(e,i)]
+ ),
+ // *
+ // /
+ (bottom_left.line_strongly_overlap(e,i),
+ vec![line(u,q)]
+ ),
+ // *
+ // \
+ (bottom_right.line_strongly_overlap(a,g),
+ vec![line(s,y)]
+ ),
+ ]
+ }
+ )
+ ),
+
+ /////////////////////////
+ // hash pound #
+ /////////////////////////
+ (
+ '#',
+ vec![
+ (Strong, vec![rect(f,t,true, false)]),
+ (Medium, vec![line(c,w),line(k,o)]),
+ (Weak, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ //
+ // |
+ // --#--
+ // |
+ (top.line_overlap(r,w) || bottom.line_overlap(c,h)
+ || left.line_overlap(n,o) || right.line_overlap(k,l),
+ vec![rect(f,t, true, false)]),
+
+ //
+ // \ # / #
+ // # \ # /
+ //
+ (top_left.line_overlap(s,y)|| bottom_right.line_overlap(a,g)
+ || bottom_left.line_overlap(u,q) || top_right.line_overlap(e,i),
+ vec![polygon(vec![m.adjust(1.4,2.0), m.adjust(1.4,-2.0), m.adjust(-1.4,-2.0),m.adjust(-1.4,2.0)], true, vec![DiamondBullet])]),
+ //
+ // |
+ // #
+ //
+ (top.line_overlap(r,w),
+ vec![line(c,h)]),
+
+ //
+ // #
+ // |
+ //
+ ( bottom.line_overlap(c,h),
+ vec![line(r,w)]),
+
+ // \
+ // #
+ (top_left.line_strongly_overlap(s,y),
+ vec![line(a,g)]
+ ),
+ // /
+ // #
+ (top_right.line_strongly_overlap(u,q),
+ vec![line(e,i)]
+ ),
+ // #
+ // /
+ (bottom_left.line_strongly_overlap(e,i),
+ vec![line(u,q)]
+ ),
+ // #
+ // \
+ (bottom_right.line_strongly_overlap(a,g),
+ vec![line(s,y)]
+ ),
+ ]
+ }
+ )
+ ),
+ /////////////////////////
+ // small letter o
+ /////////////////////////
+ (
+ 'o',
+ vec![
+ (Medium, vec![circle(m, unit1_5, false)]),
+ (Medium, vec![line(k,o)]),
+ (Weak, vec![line(c,w)]),
+ (Weak, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // must have at least one connection
+ // \|/
+ // -o-
+ // /|\
+ (top.line_strongly_overlap(r,w) || bottom.line_strongly_overlap(c,h)
+ || left.line_strongly_overlap(n,o) || right.line_strongly_overlap(k,l)
+ || top_left.line_strongly_overlap(s,y)|| bottom_right.line_strongly_overlap(a,g)
+ || bottom_left.line_strongly_overlap(u,q) || top_right.line_strongly_overlap(e,i),
+ vec![circle(m,unit1_5,false)]),
+
+ // |
+ // o
+ (top.line_strongly_overlap(r,w),
+ vec![line(c,h)]
+ ),
+ // o
+ // |
+ (bottom.line_strongly_overlap(c,h),
+ vec![line(w,r)]
+ ),
+ // \
+ // o
+ (top_left.line_strongly_overlap(s,y),
+ vec![line(a,g)]
+ ),
+ // /
+ // o
+ (top_right.line_strongly_overlap(u,q),
+ vec![line(e,i)]
+ ),
+ // o
+ // /
+ (bottom_left.line_strongly_overlap(e,i),
+ vec![line(u,q)]
+ ),
+ // o
+ // \
+ (bottom_right.line_strongly_overlap(a,g),
+ vec![line(s,y)]
+ ),
+ ]
+ }
+ )
+ ),
+ /////////////////////////
+ // big letter O
+ /////////////////////////
+ (
+ 'O',
+ vec![
+ (Medium, vec![circle(m, unit2, false)]),
+ (Medium, vec![line(k,o)]),
+ (Weak, vec![line(c,w)]),
+ (Weak, vec![line(a,y), line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // must have at least one connection
+ // \|/
+ // -O-
+ // /|\
+ (top.line_strongly_overlap(r,w) || bottom.line_strongly_overlap(c,h)
+ || left.line_strongly_overlap(n,o) || right.line_strongly_overlap(k,l)
+ || top_left.line_strongly_overlap(s,y)|| bottom_right.line_strongly_overlap(a,g)
+ || bottom_left.line_strongly_overlap(u,q) || top_right.line_strongly_overlap(e,i), vec![circle(m,unit2,false)]),
+ // |
+ // O
+ (top.line_strongly_overlap(r,w),
+ vec![line(c,h)]
+ ),
+ // O
+ // |
+ (bottom.line_strongly_overlap(c,h),
+ vec![line(w,r)]
+ ),
+ // \
+ // O
+ (top_left.line_strongly_overlap(s,y),
+ vec![line(a,g)]
+ ),
+ // /
+ // O
+ (top_right.line_strongly_overlap(u,q),
+ vec![line(e,i)]
+ ),
+ // O
+ // /
+ (bottom_left.line_strongly_overlap(e,i),
+ vec![line(u,q)]
+ ),
+ // O
+ // \
+ (bottom_right.line_strongly_overlap(a,g),
+ vec![line(s,y)]
+ ),
+ ]
+ }
+ )
+ ),
+ ////////////////////
+ // underscore _
+ ////////////////////
+ (
+ '_',
+ vec![
+ (Strong, vec![line(u, y)])
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ (true, vec![line(u,y)]),
+ // /_
+ (left.line_strongly_overlap(e,u), vec![line(u, cell.left().u())]),
+ // _\
+ (right.line_strongly_overlap(a,y), vec![line(y, cell.right().y())]),
+ ]}
+
+ )
+ ),
+ //////////////////////
+ // dot period .
+ //////////////////////
+ (
+ '.',
+ vec![
+ (Medium, vec![line(m,w)]), // connects down
+ (Weak, vec![line(m,k)]), // connects left
+ (Weak, vec![line(m,o)]), // connects right
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // .
+ // |
+ (bottom.line_strongly_overlap(c,h), vec![line(r,w)]),
+ // .
+ // / \
+ (bottom_left.line_strongly_overlap(e,i) && bottom_right.line_strongly_overlap(a,g), vec![line(m,u), line(m,y)]),
+ // .-
+ // |
+ (right.line_overlap(k,l) && bottom.line_overlap(c,h), vec![arc(o,r,unit2), line(r,w)]),
+ // .-
+ // |
+ (right.line_overlap(k,l) && bottom_left.line_overlap(c,h), vec![arc(m,cell.bottom_left().c(),unit4), line(m,o)]),
+ // -.
+ // |
+ (left.line_overlap(n,o) && bottom.line_overlap(c,h), vec![arc(r,k,unit2), line(r,w)]),
+ // -.
+ // |
+ // exemption that bottom right is not a backquote
+ (!bottom_right.is('`') && left.line_overlap(n,o) && bottom_right.line_overlap(c,h), vec![arc(cell.bottom_right().c(),m,unit4), line(k,m)]),
+ // .-
+ // /
+ (right.line_overlap(k,l) && bottom_left.line_overlap(e,i), vec![arc(o, q, unit4), line(q, u)]),
+ // .-
+ // \
+ (right.line_overlap(k,l) && bottom_right.line_overlap(a,g) , vec![arc(o, s, between1_2), line(s, y)]),
+ // -.
+ // \
+ (left.line_overlap(n,o) && bottom_right.line_overlap(a,g), vec![arc(s, k, unit4), line(s, y)]),
+ // -.
+ // /
+ (left.line_overlap(n,o) && bottom_left.line_overlap(e,i), vec![arc(q, k, between1_2), line(u, q)]),
+ // .
+ // (
+ (bottom_left.arcs_to(e,y), vec![arc(o, q, unit4), line(q, u)]),
+ // .
+ // )
+ (bottom_right.arcs_to(u,a),vec![arc(s, k, unit4), line(s, y)]),
+
+ // _.-
+ (left.line_overlap(u,y) && right.line_overlap(k,o), vec![line(u,o)]),
+ // -._
+ (left.line_overlap(k,o) && right.line_overlap(u,y), vec![line(k,y)]),
+
+ // `.
+ // `
+ (left.is('`') && bottom_right.is('`'), vec![broken_line(cell.left().c(), cell.bottom_right().c())]),
+ // .'
+ // '
+ (right.is('\'') && bottom_left.is('\''),vec![broken_line(cell.right().c(), cell.bottom_left().c())]),
+ // '. `.
+ // \ \
+ ((left.is('\'')||left.is('`')) && bottom_right.line_overlap(a,m),vec![arc(y, cell.left().a(), unit8 * 2.0)]),
+ // .'
+ // /
+ (right.is('\'') && bottom_left.line_overlap(e,m), vec![arc(cell.right().e(), u, unit8 * 2.0)]),
+ // TODO: restrict left, right, bottom, top_right, is not connecting to here
+ // |
+ // .
+ // /
+ (top.line_overlap(m,w) && bottom_left.line_overlap(e,m), vec![arc(q,h,unit8), line(c,h), line(q,u)]),
+ // TODO: restrict left, right, bottom,top, is not connecting to here
+ // /
+ // .
+ // /
+ (top_right.line_overlap(m,u) && bottom_left.line_overlap(e,m), vec![line(u,e)]),
+ // TODO: restrict left, right, bottom, top_left, does not connect to
+ // here
+ // |
+ // .
+ // \
+ (top.line_overlap(m,w) && bottom_right.line_overlap(a,m), vec![line(c,h), arc(h,s,unit8), line(s,y)]),
+ ]}
+ )
+ ),
+ //////////////////////
+ // comma ,
+ //////////////////////
+ (
+ ',',
+ vec![
+ (Medium, vec![line(m,r)]),
+ (Weak, vec![line(m,k)]), // connects left
+ (Weak, vec![line(m,o)]), // connects right
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // ,-
+ // |
+ (right.line_overlap(k,l) && bottom.line_overlap(c,h), vec![arc(o,r,unit2), line(r,w)]),
+ // ,-
+ // /
+ (right.line_overlap(k,l) && bottom_left.line_overlap(e,i), vec![arc(o, q, unit4), line(q, u)]),
+ // ,
+ // (
+ (bottom_left.arcs_to(e,y), vec![arc(o, q, unit4), line(q, u)]),
+ ]}
+ )
+ ),
+ //////////////////////
+ // single quote '
+ //////////////////////
+ (
+ '\'',
+ vec![
+ (Medium, vec![line(c,h)]), //connects top
+ (Weak, vec![line(m,k)]), // connects left
+ (Weak, vec![line(m,o)]), // connects right
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // |
+ // '
+ (top.line_strongly_overlap(m,w), vec![line(c,h)]),
+ // |
+ // '-
+ (right.line_overlap(k,l) && top.line_overlap(r,w), vec![arc(h,o, unit2), line(c,h)]),
+ // |
+ // '-
+ (right.line_overlap(k,l) && top_left.line_overlap(r,w), vec![arc(cell.top_left().w(),m, unit4), line(m,o)]),
+ // |
+ // -'
+ (left.line_overlap(n,o) && top.line_overlap(r,w), vec![arc(k,h, unit2), line(c,h)]),
+ // |
+ // -'
+ (left.line_overlap(n,o) && top_right.line_overlap(r,w), vec![arc(m,cell.top_right().w(), unit4), line(k,m)]),
+
+ // \
+ // '-
+ (top_left.line_overlap(s,y) && right.line_overlap(k,l), vec![line(a, g), arc(g, o, unit4)]),
+ // /
+ // '-
+ (top_right.line_overlap(u,q) && right.line_overlap(k,l), vec![line(e, i), arc(i, o, between1_2)]),
+ // /
+ // -'
+ (top_right.line_overlap(u,q) && left.line_overlap(n,o), vec![arc(k, i, unit4), line(i, e)]),
+ // \
+ // -'
+ (top_left.line_overlap(s,y) && left.line_overlap(n,o), vec![arc(k, g, between1_2), line(g, a)]),
+ // \ /
+ // '
+ (top_left.line_overlap(s,y) && top_right.line_overlap(u,q), vec![line(a, m), line(m, e)]),
+ // (
+ // '
+ (top_left.arcs_to(e,y), vec![line(a, g), arc(g, o, unit4)]),
+ // )
+ // '
+ (top_right.arcs_to(u,a), vec![arc(k, i, unit4), line(i, e)]),
+ // _
+ // -'
+ (left.line_overlap(k,o) && top_right.line_overlap(u,y), vec![line(k,e)]),
+ // _
+ // '-
+ (top_left.line_overlap(u,y) && right.line_overlap(k,o), vec![line(a,o)]),
+
+ // .
+ // .'
+ (left.is('.') && top_right.is('.'), vec![broken_line(cell.left().m(), cell.top_right().m())]),
+ // .
+ // '.
+ (right.is('.') && top_left.is('.'), vec![broken_line(cell.top_left().m(), cell.right().m())]),
+ // /
+ // .'
+ (left.is('.') && top_right.is('/'),vec![arc(cell.left().u(), e, unit8 * 2.0)]),
+ ]}
+ )
+ ),
+ //////////////////////
+ // other single quote ’
+ //////////////////////
+ (
+ '’',
+ vec![
+ (Medium, vec![line(c,h)]), //connects top
+ (Weak, vec![line(m,k)]), // connects left
+ (Weak, vec![line(m,o)]), // connects right
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // |
+ // ’-
+ (right.line_overlap(k,l) && top.line_overlap(r,w), vec![arc(h,o, unit2), line(c,h)]),
+ // |
+ // -’
+ (left.line_overlap(n,o) && top.line_overlap(r,w), vec![arc(k,h, unit2), line(c,h)]),
+
+ // \
+ // ’-
+ (top_left.line_overlap(s,y) && right.line_overlap(k,l), vec![line(a, g), arc(g, o, unit4)]),
+ // /
+ // ’-
+ (top_right.line_overlap(u,q) && right.line_overlap(k,l), vec![line(e, i), arc(i, o, between1_2)]),
+ // /
+ // -’
+ (top_right.line_overlap(u,q) && left.line_overlap(n,o), vec![arc(k, i, unit4), line(i, e)]),
+ // \
+ // -’
+ (top_left.line_overlap(s,y) && left.line_overlap(n,o), vec![arc(k, g, between1_2), line(g, a)]),
+ // \ /
+ // ’
+ (top_left.line_overlap(s,y) && top_right.line_overlap(u,q), vec![line(a, m), line(m, e)]),
+ // (
+ // ’
+ (top_left.arcs_to(e,y), vec![line(a, g), arc(g, o, unit4)]),
+ // )
+ // ’
+ (top_right.arcs_to(u,a), vec![arc(k, i, unit4), line(i, e)]),
+ // _
+ // -’
+ (left.line_overlap(k,o) && top_right.line_overlap(u,y), vec![line(k,e)]),
+ // _
+ // ’-
+ (top_left.line_overlap(u,y) && right.line_overlap(k,o), vec![line(a,o)]),
+
+ // .
+ // .’
+ (left.is('.') && top_right.is('.'), vec![broken_line(cell.left().m(), cell.top_right().m())]),
+ // .
+ // ’.
+ (right.is('.') && top_left.is('.'), vec![broken_line(cell.top_left().m(), cell.right().m())]),
+ ]}
+ )
+ ),
+ //////////////////////
+ // backtick / backquote `
+ //////////////////////
+ (
+ '`',
+ vec![
+ (Medium, vec![line(c,m)]),
+ (Weak, vec![line(m,k)]), // connects left
+ (Weak, vec![line(m,o)]), // connects right
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![
+ // |
+ // `-
+ (right.line_overlap(k,l) && top.line_overlap(r,w), vec![arc(h,o, unit2), line(c,h)]),
+ // \
+ // `-
+ (top_left.line_overlap(s,y) && right.line_overlap(k,l), vec![line(a, g), arc(g, o, unit4)]),
+ // (
+ // `
+ (top_left.arcs_to(e,y), vec![line(a, g), arc(g, o, unit4)]),
+ // _
+ // `-
+ (top_left.line_overlap(u,y) && right.line_overlap(k,o), vec![line(a,o)]),
+ // .
+ // `.
+ (top_left.is('.') && right.is('.'), vec![broken_line(cell.top_left().m(), cell.right().m())]),
+ // \
+ // `.
+ (top_left.is('\\') && right.is('.') ,vec![arc(a,cell.right().y(),unit8 * 2.0)]),
+ // ,
+ // `-
+ (top.is(',') && right.line_overlap(k,l), vec![arc(h,o, unit2), line(c,h)]),
+ ]}
+ )
+ ),
+ //////////////////////
+ // forward slash / slant line
+ //////////////////////
+ (
+ '/',
+ vec![
+ (Strong, vec![line(u,e)]),
+ ],
+ Arc::new(
+ move|settings, top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| {
+ vec![