diff options
Diffstat (limited to 'svgbob/src/map/ascii_map.rs')
-rw-r--r-- | svgbob/src/map/ascii_map.rs | 908 |
1 files changed, 908 insertions, 0 deletions
diff --git a/svgbob/src/map/ascii_map.rs b/svgbob/src/map/ascii_map.rs new file mode 100644 index 0000000..e82445c --- /dev/null +++ b/svgbob/src/map/ascii_map.rs @@ -0,0 +1,908 @@ +use crate::{ + buffer::{ + fragment::PolygonTag::{ + ArrowBottom, ArrowBottomLeft, ArrowBottomRight, ArrowLeft, ArrowRight, ArrowTop, + ArrowTopLeft, ArrowTopRight, DiamondBullet, + }, + Cell, CellGrid, + }, + 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 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(&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|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (true, vec![line(k, o)]), + ] + } + ) + ), + /////////////// + // tilde ~ + /////////////// + ( + '~', + vec![ + (Strong, vec![broken_line(k, o)]), + ], + Arc::new( + move|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|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)]), + // TODO: restrict lef, right, bottom, top_right, is not connecting to + // here + // | + // / + (bottom_left.is('/'), vec![line(c,m),line(m,u)]), + // TODO: restrict left, right, bottom, top_left, top_right + // | + // \ + (bottom_right.is('\\'), vec![line(c,m), line(m,y)]), + // TODO: restrict left, right, top, bottom_left, bottom_right + // \ / + // | + (top_left.is('\\') && top_right.is('/'), vec![line(a,m),line(m,w),line(m,e)]), + ] + } + ) + ), + //////////////////// + // exclamation bang ! + //////////////////// + ( + '!', + vec![ + (Strong, vec![broken_line(c,w)]), + ], + Arc::new( + move|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|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![ + (Strong, vec![line(c,w),line(k,o)]), + (Weak, vec![line(a,y), line(u,e)]), + ], + Arc::new( + move|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|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)]), + ] + } + ) + ), + ///////////////////////// + // asterisk * + ///////////////////////// + ( + '*', + vec![ + (Strong, vec![circle(m, unit2, true)]), + (Medium, vec![line(c,w),line(k,o)]), + (Weak, vec![line(a,y), line(u,e)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (true, vec![circle(m,unit2, true)]), + ] + } + ) + ), + + ///////////////////////// + // 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|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![k,h,o,r,k],true, vec![DiamondBullet])]), + ] + } + ) + ), + ///////////////////////// + // small letter o + ///////////////////////// + ( + 'o', + vec![ + (Medium, vec![circle(m, unit1, false)]), + (Medium, vec![line(k,o)]), + (Weak, vec![line(c,w)]), + (Weak, vec![line(a,y), line(u,e)]), + ], + Arc::new( + move|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,false)]), + ] + } + ) + ), + ///////////////////////// + // 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|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)]), + ] + } + ) + ), + //////////////////// + // underscore _ + //////////////////// + ( + '_', + vec![ + (Strong, vec![line(u, y)]) + ], + Arc::new( + move|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|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.is('\\'),vec![arc(y, cell.left().a(), unit8 * 2.0)]), + // .' + // / + (right.is('\'') && bottom_left.is('/'), vec![arc(cell.right().e(), u, unit8 * 2.0)]), + // TODO: restrict left, right, bottom, top_right, is not connecting to here + // | + // . + // / + (top.is('|') && bottom_left.is('/'), vec![arc(q,h,unit8), line(c,h), line(q,u)]), + // TODO: restrict left, right, bottom,top, is not connecting to here + // / + // . + // / + (top_right.is('/') && bottom_left.is('/'), vec![line(u,e)]), + // TODO: restrict left, right, bottom, top_left, does not connect to + // here + // | + // . + // \ + (top.is('|') && bottom_right.is('\\'), 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|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|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|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|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 / + ////////////////////// + ( + '/', + vec![ + (Strong, vec![line(u,e)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (true, vec![line(u,e)]), + ]} + ) + ), + ////////////////////// + // backward slash \ + ////////////////////// + ( + '\\', + vec![ + (Strong, vec![line(a,y)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (!bottom.is('|'), vec![line(a,y)]), + /* + // . + // \ + // | + (top_left.is('.') && bottom_right.is('|'), vec![arc(cell.bottom_right().w(),a, unit8 * 4.0)]), + */ + + // \ + // | + (bottom.is('|'), vec![line(a,m),line(m,w)]), + ] + } + ) + ), + //////////////////////// + // open parenthesis ( + //////////////////////// + ('(', + vec![ + (Medium, vec![arc(e,y, unit8)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (true, vec![arc(e,y,unit8)]), + ] + } + ) + ), + //////////////////////// + // close parenthesis ) + //////////////////////// + (')', + vec![ + (Medium, vec![arc(u,a, unit8)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + (!top.is('|') && !bottom.is('|'), vec![arc(u,a,unit8)]), + // | + // ) + // | + (top.is('|') && bottom.is('|'), vec![arc(w,c,unit8)]), + // TODO: this should be gated with Settings.enhance_circuitries + // -)- + (left.line_overlap(m,o) && right.line_overlap(k,l), vec![line(k,o)]), + ] + } + ) + ), + //////////////////////// + // big letter V + //////////////////////// + ('V', + vec![ + (Medium, vec![polygon(vec![f,j,w], true, vec![ArrowBottom])]), + (Weak, vec![line(m,w)]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + // | + // V + (top.line_overlap(r,w), vec![polygon(vec![f,j,w], true, vec![ArrowBottom])]), + // \ + // V + // TODO: use arrow function which alias to a polygon + (top_left.line_overlap(s,y), vec![polygon(vec![f,s,_21], true, vec![ArrowBottomRight])]), + // / + // V + (top_right.line_overlap(u,q), vec![polygon(vec![j,q,_21], true, vec![ArrowBottomLeft])]), + // `. + // V + (top_left.is('.'), vec![polygon(vec![f,o,c], true, vec![ArrowBottomRight])]), + // .' + // V + (top_right.is('.'), vec![polygon(vec![j,k,c], true, vec![ArrowBottomLeft])]), + // V + // | + (bottom.line_overlap(c,h), vec![line(a,w), line(w,e)]) + ] + } + ) + ), + //////////////////////// + // letter v + //////////////////////// + ('v', + vec![ + (Medium, vec![polygon(vec![f,j,w], true, vec![ArrowBottom])]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + // | + // v + (top.line_overlap(r,w), vec![polygon(vec![f,j,w], true, vec![ArrowBottom])]), + // \ + // v + (top_left.line_overlap(s,y), vec![polygon(vec![f,s,_21], true, vec![ArrowBottomRight])]), + // / + // v + (top_right.line_overlap(u,q), vec![polygon(vec![j,q,_21], true, vec![ArrowBottomLeft])]), + // `. + // v + (top_left.is('.'), vec![polygon(vec![f,o,c], true, vec![ArrowBottomRight])]), + // .' + // v + (top_right.is('.'), vec![polygon(vec![j,k,c], true, vec![ArrowBottomLeft])]), + // v + // | + (bottom.line_overlap(c,h) && !top.line_overlap(r,w), vec![line(a,w), line(w,e)]) + ] + } + ) + ), + //////////////////////// + // caret ^ + //////////////////////// + ('^', + vec![ + (Medium, vec![polygon(vec![p,c,t], true, vec![ArrowTop])]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + // ^ + // | + (bottom.line_overlap(c,h), vec![polygon(vec![p,c,t], true, vec![ArrowTop])]), + // ^ + // \ + (bottom_right.line_overlap(a,g) &&!bottom_left.is('/'), vec![polygon(vec![t,g,_27], true, vec![ArrowTopLeft])]), + // ^ + // / + (bottom_left.line_overlap(e,i) && !bottom_right.is('\\'), vec![polygon(vec![p,i,_27], true, vec![ArrowTopRight])]), + // | + // ^ + (top.line_overlap(r,w) && !bottom.line_overlap(c,h), vec![line(c,u), line(c,y)]), + // ^ + // / \ + (bottom_left.is('/') && bottom_right.is('\\'), vec![line(c,u), line(c,y)]) + ] + } + ) + ), + //////////////////////// + // greater than > + //////////////////////// + ('>', + vec![ + (Medium, vec![polygon(vec![f,o,p], true, vec![ArrowRight])]), + ], + Arc::new( + move|top_left, top, top_right, left, right, bottom_left, bottom, bottom_right| { + vec![ + // ---> + (left.line_overlap(n,o), vec![polygon(vec![f,o,p], true, vec![ArrowRight])]), + // >---- + (right.line_overlap(k,l) && !left.line_overlap(n,o), vec![line(f,o), line(o,p)]), + // `> |