gemini-browser

A text-based gemini browser
git clone git://git.laack.co/gemini-browser.git
Log | Files | Refs | README

semigraphics.go (20742B)


      1 package tview
      2 
      3 import "github.com/gdamore/tcell/v2"
      4 
      5 // Semigraphics provides an easy way to access unicode characters for drawing.
      6 //
      7 // Named like the unicode characters, 'Semigraphics'-prefix used if unicode block
      8 // isn't prefixed itself.
      9 const (
     10 	// Block: General Punctuation U+2000-U+206F (http://unicode.org/charts/PDF/U2000.pdf)
     11 	SemigraphicsHorizontalEllipsis rune = '\u2026' // …
     12 
     13 	// Block: Box Drawing U+2500-U+257F (http://unicode.org/charts/PDF/U2500.pdf)
     14 	BoxDrawingsLightHorizontal                    rune = '\u2500' // ─
     15 	BoxDrawingsHeavyHorizontal                    rune = '\u2501' // ━
     16 	BoxDrawingsLightVertical                      rune = '\u2502' // │
     17 	BoxDrawingsHeavyVertical                      rune = '\u2503' // ┃
     18 	BoxDrawingsLightTripleDashHorizontal          rune = '\u2504' // ┄
     19 	BoxDrawingsHeavyTripleDashHorizontal          rune = '\u2505' // ┅
     20 	BoxDrawingsLightTripleDashVertical            rune = '\u2506' // ┆
     21 	BoxDrawingsHeavyTripleDashVertical            rune = '\u2507' // ┇
     22 	BoxDrawingsLightQuadrupleDashHorizontal       rune = '\u2508' // ┈
     23 	BoxDrawingsHeavyQuadrupleDashHorizontal       rune = '\u2509' // ┉
     24 	BoxDrawingsLightQuadrupleDashVertical         rune = '\u250a' // ┊
     25 	BoxDrawingsHeavyQuadrupleDashVertical         rune = '\u250b' // ┋
     26 	BoxDrawingsLightDownAndRight                  rune = '\u250c' // ┌
     27 	BoxDrawingsDownLightAndRightHeavy             rune = '\u250d' // ┍
     28 	BoxDrawingsDownHeavyAndRightLight             rune = '\u250e' // ┎
     29 	BoxDrawingsHeavyDownAndRight                  rune = '\u250f' // ┏
     30 	BoxDrawingsLightDownAndLeft                   rune = '\u2510' // ┐
     31 	BoxDrawingsDownLightAndLeftHeavy              rune = '\u2511' // ┑
     32 	BoxDrawingsDownHeavyAndLeftLight              rune = '\u2512' // ┒
     33 	BoxDrawingsHeavyDownAndLeft                   rune = '\u2513' // ┓
     34 	BoxDrawingsLightUpAndRight                    rune = '\u2514' // └
     35 	BoxDrawingsUpLightAndRightHeavy               rune = '\u2515' // ┕
     36 	BoxDrawingsUpHeavyAndRightLight               rune = '\u2516' // ┖
     37 	BoxDrawingsHeavyUpAndRight                    rune = '\u2517' // ┗
     38 	BoxDrawingsLightUpAndLeft                     rune = '\u2518' // ┘
     39 	BoxDrawingsUpLightAndLeftHeavy                rune = '\u2519' // ┙
     40 	BoxDrawingsUpHeavyAndLeftLight                rune = '\u251a' // ┚
     41 	BoxDrawingsHeavyUpAndLeft                     rune = '\u251b' // ┛
     42 	BoxDrawingsLightVerticalAndRight              rune = '\u251c' // ├
     43 	BoxDrawingsVerticalLightAndRightHeavy         rune = '\u251d' // ┝
     44 	BoxDrawingsUpHeavyAndRightDownLight           rune = '\u251e' // ┞
     45 	BoxDrawingsDownHeavyAndRightUpLight           rune = '\u251f' // ┟
     46 	BoxDrawingsVerticalHeavyAndRightLight         rune = '\u2520' // ┠
     47 	BoxDrawingsDownLightAndRightUpHeavy           rune = '\u2521' // ┡
     48 	BoxDrawingsUpLightAndRightDownHeavy           rune = '\u2522' // ┢
     49 	BoxDrawingsHeavyVerticalAndRight              rune = '\u2523' // ┣
     50 	BoxDrawingsLightVerticalAndLeft               rune = '\u2524' // ┤
     51 	BoxDrawingsVerticalLightAndLeftHeavy          rune = '\u2525' // ┥
     52 	BoxDrawingsUpHeavyAndLeftDownLight            rune = '\u2526' // ┦
     53 	BoxDrawingsDownHeavyAndLeftUpLight            rune = '\u2527' // ┧
     54 	BoxDrawingsVerticalHeavyAndLeftLight          rune = '\u2528' // ┨
     55 	BoxDrawingsDownLightAndLeftUpHeavy            rune = '\u2529' // ┨
     56 	BoxDrawingsUpLightAndLeftDownHeavy            rune = '\u252a' // ┪
     57 	BoxDrawingsHeavyVerticalAndLeft               rune = '\u252b' // ┫
     58 	BoxDrawingsLightDownAndHorizontal             rune = '\u252c' // ┬
     59 	BoxDrawingsLeftHeavyAndRightDownLight         rune = '\u252d' // ┭
     60 	BoxDrawingsRightHeavyAndLeftDownLight         rune = '\u252e' // ┮
     61 	BoxDrawingsDownLightAndHorizontalHeavy        rune = '\u252f' // ┯
     62 	BoxDrawingsDownHeavyAndHorizontalLight        rune = '\u2530' // ┰
     63 	BoxDrawingsRightLightAndLeftDownHeavy         rune = '\u2531' // ┱
     64 	BoxDrawingsLeftLightAndRightDownHeavy         rune = '\u2532' // ┲
     65 	BoxDrawingsHeavyDownAndHorizontal             rune = '\u2533' // ┳
     66 	BoxDrawingsLightUpAndHorizontal               rune = '\u2534' // ┴
     67 	BoxDrawingsLeftHeavyAndRightUpLight           rune = '\u2535' // ┵
     68 	BoxDrawingsRightHeavyAndLeftUpLight           rune = '\u2536' // ┶
     69 	BoxDrawingsUpLightAndHorizontalHeavy          rune = '\u2537' // ┷
     70 	BoxDrawingsUpHeavyAndHorizontalLight          rune = '\u2538' // ┸
     71 	BoxDrawingsRightLightAndLeftUpHeavy           rune = '\u2539' // ┹
     72 	BoxDrawingsLeftLightAndRightUpHeavy           rune = '\u253a' // ┺
     73 	BoxDrawingsHeavyUpAndHorizontal               rune = '\u253b' // ┻
     74 	BoxDrawingsLightVerticalAndHorizontal         rune = '\u253c' // ┼
     75 	BoxDrawingsLeftHeavyAndRightVerticalLight     rune = '\u253d' // ┽
     76 	BoxDrawingsRightHeavyAndLeftVerticalLight     rune = '\u253e' // ┾
     77 	BoxDrawingsVerticalLightAndHorizontalHeavy    rune = '\u253f' // ┿
     78 	BoxDrawingsUpHeavyAndDownHorizontalLight      rune = '\u2540' // ╀
     79 	BoxDrawingsDownHeavyAndUpHorizontalLight      rune = '\u2541' // ╁
     80 	BoxDrawingsVerticalHeavyAndHorizontalLight    rune = '\u2542' // ╂
     81 	BoxDrawingsLeftUpHeavyAndRightDownLight       rune = '\u2543' // ╃
     82 	BoxDrawingsRightUpHeavyAndLeftDownLight       rune = '\u2544' // ╄
     83 	BoxDrawingsLeftDownHeavyAndRightUpLight       rune = '\u2545' // ╅
     84 	BoxDrawingsRightDownHeavyAndLeftUpLight       rune = '\u2546' // ╆
     85 	BoxDrawingsDownLightAndUpHorizontalHeavy      rune = '\u2547' // ╇
     86 	BoxDrawingsUpLightAndDownHorizontalHeavy      rune = '\u2548' // ╈
     87 	BoxDrawingsRightLightAndLeftVerticalHeavy     rune = '\u2549' // ╉
     88 	BoxDrawingsLeftLightAndRightVerticalHeavy     rune = '\u254a' // ╊
     89 	BoxDrawingsHeavyVerticalAndHorizontal         rune = '\u254b' // ╋
     90 	BoxDrawingsLightDoubleDashHorizontal          rune = '\u254c' // ╌
     91 	BoxDrawingsHeavyDoubleDashHorizontal          rune = '\u254d' // ╍
     92 	BoxDrawingsLightDoubleDashVertical            rune = '\u254e' // ╎
     93 	BoxDrawingsHeavyDoubleDashVertical            rune = '\u254f' // ╏
     94 	BoxDrawingsDoubleHorizontal                   rune = '\u2550' // ═
     95 	BoxDrawingsDoubleVertical                     rune = '\u2551' // ║
     96 	BoxDrawingsDownSingleAndRightDouble           rune = '\u2552' // ╒
     97 	BoxDrawingsDownDoubleAndRightSingle           rune = '\u2553' // ╓
     98 	BoxDrawingsDoubleDownAndRight                 rune = '\u2554' // ╔
     99 	BoxDrawingsDownSingleAndLeftDouble            rune = '\u2555' // ╕
    100 	BoxDrawingsDownDoubleAndLeftSingle            rune = '\u2556' // ╖
    101 	BoxDrawingsDoubleDownAndLeft                  rune = '\u2557' // ╗
    102 	BoxDrawingsUpSingleAndRightDouble             rune = '\u2558' // ╘
    103 	BoxDrawingsUpDoubleAndRightSingle             rune = '\u2559' // ╙
    104 	BoxDrawingsDoubleUpAndRight                   rune = '\u255a' // ╚
    105 	BoxDrawingsUpSingleAndLeftDouble              rune = '\u255b' // ╛
    106 	BoxDrawingsUpDoubleAndLeftSingle              rune = '\u255c' // ╜
    107 	BoxDrawingsDoubleUpAndLeft                    rune = '\u255d' // ╝
    108 	BoxDrawingsVerticalSingleAndRightDouble       rune = '\u255e' // ╞
    109 	BoxDrawingsVerticalDoubleAndRightSingle       rune = '\u255f' // ╟
    110 	BoxDrawingsDoubleVerticalAndRight             rune = '\u2560' // ╠
    111 	BoxDrawingsVerticalSingleAndLeftDouble        rune = '\u2561' // ╡
    112 	BoxDrawingsVerticalDoubleAndLeftSingle        rune = '\u2562' // ╢
    113 	BoxDrawingsDoubleVerticalAndLeft              rune = '\u2563' // ╣
    114 	BoxDrawingsDownSingleAndHorizontalDouble      rune = '\u2564' // ╤
    115 	BoxDrawingsDownDoubleAndHorizontalSingle      rune = '\u2565' // ╥
    116 	BoxDrawingsDoubleDownAndHorizontal            rune = '\u2566' // ╦
    117 	BoxDrawingsUpSingleAndHorizontalDouble        rune = '\u2567' // ╧
    118 	BoxDrawingsUpDoubleAndHorizontalSingle        rune = '\u2568' // ╨
    119 	BoxDrawingsDoubleUpAndHorizontal              rune = '\u2569' // ╩
    120 	BoxDrawingsVerticalSingleAndHorizontalDouble  rune = '\u256a' // ╪
    121 	BoxDrawingsVerticalDoubleAndHorizontalSingle  rune = '\u256b' // ╫
    122 	BoxDrawingsDoubleVerticalAndHorizontal        rune = '\u256c' // ╬
    123 	BoxDrawingsLightArcDownAndRight               rune = '\u256d' // ╭
    124 	BoxDrawingsLightArcDownAndLeft                rune = '\u256e' // ╮
    125 	BoxDrawingsLightArcUpAndLeft                  rune = '\u256f' // ╯
    126 	BoxDrawingsLightArcUpAndRight                 rune = '\u2570' // ╰
    127 	BoxDrawingsLightDiagonalUpperRightToLowerLeft rune = '\u2571' // ╱
    128 	BoxDrawingsLightDiagonalUpperLeftToLowerRight rune = '\u2572' // ╲
    129 	BoxDrawingsLightDiagonalCross                 rune = '\u2573' // ╳
    130 	BoxDrawingsLightLeft                          rune = '\u2574' // ╴
    131 	BoxDrawingsLightUp                            rune = '\u2575' // ╵
    132 	BoxDrawingsLightRight                         rune = '\u2576' // ╶
    133 	BoxDrawingsLightDown                          rune = '\u2577' // ╷
    134 	BoxDrawingsHeavyLeft                          rune = '\u2578' // ╸
    135 	BoxDrawingsHeavyUp                            rune = '\u2579' // ╹
    136 	BoxDrawingsHeavyRight                         rune = '\u257a' // ╺
    137 	BoxDrawingsHeavyDown                          rune = '\u257b' // ╻
    138 	BoxDrawingsLightLeftAndHeavyRight             rune = '\u257c' // ╼
    139 	BoxDrawingsLightUpAndHeavyDown                rune = '\u257d' // ╽
    140 	BoxDrawingsHeavyLeftAndLightRight             rune = '\u257e' // ╾
    141 	BoxDrawingsHeavyUpAndLightDown                rune = '\u257f' // ╿
    142 
    143 	// Block Elements.
    144 	BlockUpperHalfBlock                              rune = '\u2580' // ▀
    145 	BlockLowerOneEighthBlock                         rune = '\u2581' // ▁
    146 	BlockLowerOneQuarterBlock                        rune = '\u2582' // ▂
    147 	BlockLowerThreeEighthsBlock                      rune = '\u2583' // ▃
    148 	BlockLowerHalfBlock                              rune = '\u2584' // ▄
    149 	BlockLowerFiveEighthsBlock                       rune = '\u2585' // ▅
    150 	BlockLowerThreeQuartersBlock                     rune = '\u2586' // ▆
    151 	BlockLowerSevenEighthsBlock                      rune = '\u2587' // ▇
    152 	BlockFullBlock                                   rune = '\u2588' // █
    153 	BlockLeftSevenEighthsBlock                       rune = '\u2589' // ▉
    154 	BlockLeftThreeQuartersBlock                      rune = '\u258A' // ▊
    155 	BlockLeftFiveEighthsBlock                        rune = '\u258B' // ▋
    156 	BlockLeftHalfBlock                               rune = '\u258C' // ▌
    157 	BlockLeftThreeEighthsBlock                       rune = '\u258D' // ▍
    158 	BlockLeftOneQuarterBlock                         rune = '\u258E' // ▎
    159 	BlockLeftOneEighthBlock                          rune = '\u258F' // ▏
    160 	BlockRightHalfBlock                              rune = '\u2590' // ▐
    161 	BlockLightShade                                  rune = '\u2591' // ░
    162 	BlockMediumShade                                 rune = '\u2592' // ▒
    163 	BlockDarkShade                                   rune = '\u2593' // ▓
    164 	BlockUpperOneEighthBlock                         rune = '\u2594' // ▔
    165 	BlockRightOneEighthBlock                         rune = '\u2595' // ▕
    166 	BlockQuadrantLowerLeft                           rune = '\u2596' // ▖
    167 	BlockQuadrantLowerRight                          rune = '\u2597' // ▗
    168 	BlockQuadrantUpperLeft                           rune = '\u2598' // ▘
    169 	BlockQuadrantUpperLeftAndLowerLeftAndLowerRight  rune = '\u2599' // ▙
    170 	BlockQuadrantUpperLeftAndLowerRight              rune = '\u259A' // ▚
    171 	BlockQuadrantUpperLeftAndUpperRightAndLowerLeft  rune = '\u259B' // ▛
    172 	BlockQuadrantUpperLeftAndUpperRightAndLowerRight rune = '\u259C' // ▜
    173 	BlockQuadrantUpperRight                          rune = '\u259D' // ▝
    174 	BlockQuadrantUpperRightAndLowerLeft              rune = '\u259E' // ▞
    175 	BlockQuadrantUpperRightAndLowerLeftAndLowerRight rune = '\u259F' // ▟
    176 )
    177 
    178 // SemigraphicJoints is a map for joining semigraphic (or otherwise) runes.
    179 // So far only light lines are supported but if you want to change the border
    180 // styling you need to provide the joints, too.
    181 // The matching will be sorted ascending by rune value, so you don't need to
    182 // provide all rune combinations,
    183 // e.g. (─) + (│) = (┼) will also match (│) + (─) = (┼)
    184 var SemigraphicJoints = map[string]rune{
    185 	// (─) + (│) = (┼)
    186 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVertical}): BoxDrawingsLightVerticalAndHorizontal,
    187 	// (─) + (┌) = (┬)
    188 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndRight}): BoxDrawingsLightDownAndHorizontal,
    189 	// (─) + (┐) = (┬)
    190 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal,
    191 	// (─) + (└) = (┴)
    192 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndRight}): BoxDrawingsLightUpAndHorizontal,
    193 	// (─) + (┘) = (┴)
    194 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal,
    195 	// (─) + (├) = (┼)
    196 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
    197 	// (─) + (┤) = (┼)
    198 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
    199 	// (─) + (┬) = (┬)
    200 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
    201 	// (─) + (┴) = (┴)
    202 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
    203 	// (─) + (┼) = (┼)
    204 	string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    205 
    206 	// (│) + (┌) = (├)
    207 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndRight}): BoxDrawingsLightVerticalAndRight,
    208 	// (│) + (┐) = (┤)
    209 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightVerticalAndLeft,
    210 	// (│) + (└) = (├)
    211 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight,
    212 	// (│) + (┘) = (┤)
    213 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft,
    214 	// (│) + (├) = (├)
    215 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
    216 	// (│) + (┤) = (┤)
    217 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
    218 	// (│) + (┬) = (┼)
    219 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    220 	// (│) + (┴) = (┼)
    221 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    222 	// (│) + (┼) = (┼)
    223 	string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    224 
    225 	// (┌) + (┐) = (┬)
    226 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal,
    227 	// (┌) + (└) = (├)
    228 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight,
    229 	// (┌) + (┘) = (┼)
    230 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
    231 	// (┌) + (├) = (├)
    232 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
    233 	// (┌) + (┤) = (┼)
    234 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
    235 	// (┌) + (┬) = (┬)
    236 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
    237 	// (┌) + (┴) = (┼)
    238 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    239 	// (┌) + (┴) = (┼)
    240 	string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    241 
    242 	// (┐) + (└) = (┼)
    243 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndHorizontal,
    244 	// (┐) + (┘) = (┤)
    245 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft,
    246 	// (┐) + (├) = (┼)
    247 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
    248 	// (┐) + (┤) = (┤)
    249 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
    250 	// (┐) + (┬) = (┬)
    251 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
    252 	// (┐) + (┴) = (┼)
    253 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    254 	// (┐) + (┼) = (┼)
    255 	string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    256 
    257 	// (└) + (┘) = (┴)
    258 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal,
    259 	// (└) + (├) = (├)
    260 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
    261 	// (└) + (┤) = (┼)
    262 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
    263 	// (└) + (┬) = (┼)
    264 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    265 	// (└) + (┴) = (┴)
    266 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
    267 	// (└) + (┼) = (┼)
    268 	string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    269 
    270 	// (┘) + (├) = (┼)
    271 	string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
    272 	// (┘) + (┤) = (┤)
    273 	string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
    274 	// (┘) + (┬) = (┼)
    275 	string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    276 	// (┘) + (┴) = (┴)
    277 	string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
    278 	// (┘) + (┼) = (┼)
    279 	string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    280 
    281 	// (├) + (┤) = (┼)
    282 	string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
    283 	// (├) + (┬) = (┼)
    284 	string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    285 	// (├) + (┴) = (┼)
    286 	string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    287 	// (├) + (┼) = (┼)
    288 	string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    289 
    290 	// (┤) + (┬) = (┼)
    291 	string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    292 	// (┤) + (┴) = (┼)
    293 	string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    294 	// (┤) + (┼) = (┼)
    295 	string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    296 
    297 	// (┬) + (┴) = (┼)
    298 	string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    299 	// (┬) + (┼) = (┼)
    300 	string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    301 
    302 	// (┴) + (┼) = (┼)
    303 	string([]rune{BoxDrawingsLightUpAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
    304 }
    305 
    306 // PrintJoinedSemigraphics prints a semigraphics rune into the screen at the given
    307 // position with the given style, joining it with any existing semigraphics
    308 // rune.At this point, only regular single line borders are supported.
    309 func PrintJoinedSemigraphics(screen tcell.Screen, x, y int, ch rune, style tcell.Style) {
    310 	previous, _, _, _ := screen.GetContent(x, y)
    311 
    312 	// What's the resulting rune?
    313 	var result rune
    314 	if ch == previous {
    315 		result = ch
    316 	} else {
    317 		if ch < previous {
    318 			previous, ch = ch, previous
    319 		}
    320 		result = SemigraphicJoints[string([]rune{previous, ch})]
    321 	}
    322 	if result == 0 {
    323 		result = ch
    324 	}
    325 
    326 	// We only print something if we have something.
    327 	screen.SetContent(x, y, result, nil, style)
    328 }