tessella 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +900 -0
  4. data/doc/README.md +74 -0
  5. data/doc/bitfield.md +123 -0
  6. data/doc/charts.md +1370 -0
  7. data/doc/check.rb +75 -0
  8. data/doc/cli.md +483 -0
  9. data/doc/composition.md +599 -0
  10. data/doc/getting-started.md +121 -0
  11. data/doc/glyphs.md +134 -0
  12. data/doc/images.md +325 -0
  13. data/doc/library.md +239 -0
  14. data/doc/lint.md +270 -0
  15. data/doc/meter.md +210 -0
  16. data/doc/rule.md +51 -0
  17. data/doc/seq.md +169 -0
  18. data/doc/sparkline.md +63 -0
  19. data/doc/table.md +347 -0
  20. data/doc/targets.md +222 -0
  21. data/doc/text.md +84 -0
  22. data/doc/tree.md +108 -0
  23. data/doc/wave.md +122 -0
  24. data/examples/README.md +103 -0
  25. data/examples/ages.txt +9 -0
  26. data/examples/bad.csv +3 -0
  27. data/examples/boxes.txt +3 -0
  28. data/examples/broken.txt +4 -0
  29. data/examples/calibration.rb +12 -0
  30. data/examples/cities.csv +4 -0
  31. data/examples/cjk.rb +13 -0
  32. data/examples/comment.rb +9 -0
  33. data/examples/comment.sh +13 -0
  34. data/examples/cpu.txt +60 -0
  35. data/examples/dashboard.sh +25 -0
  36. data/examples/datasheet.rb +16 -0
  37. data/examples/disc.pgm +0 -0
  38. data/examples/disks.sh +18 -0
  39. data/examples/disks.txt +5 -0
  40. data/examples/dose.txt +7 -0
  41. data/examples/drift.txt +4 -0
  42. data/examples/ethernet.txt +3 -0
  43. data/examples/figure.c +5 -0
  44. data/examples/fit.rb +16 -0
  45. data/examples/floors.rb +21 -0
  46. data/examples/gallery.sh +20 -0
  47. data/examples/gauges.sh +31 -0
  48. data/examples/gradient.rb +16 -0
  49. data/examples/growth.txt +6 -0
  50. data/examples/hosts.csv +4 -0
  51. data/examples/icmp.txt +3 -0
  52. data/examples/ipv4.txt +12 -0
  53. data/examples/kinds.csv +4 -0
  54. data/examples/langs.csv +4 -0
  55. data/examples/lint.rb +16 -0
  56. data/examples/load.rb +14 -0
  57. data/examples/login.txt +10 -0
  58. data/examples/neg.csv +4 -0
  59. data/examples/normal.txt +200 -0
  60. data/examples/note.txt +2 -0
  61. data/examples/notes-fixed.md +17 -0
  62. data/examples/notes.md +17 -0
  63. data/examples/ohlc.txt +7 -0
  64. data/examples/os.csv +10 -0
  65. data/examples/outline.txt +8 -0
  66. data/examples/plot.txt +5 -0
  67. data/examples/refusals.rb +17 -0
  68. data/examples/report.sh +21 -0
  69. data/examples/rfc.sh +22 -0
  70. data/examples/samples.txt +7 -0
  71. data/examples/shapes.pgm +0 -0
  72. data/examples/sizes.tsv +3 -0
  73. data/examples/spi.txt +6 -0
  74. data/examples/status.sh +23 -0
  75. data/examples/stem.txt +12 -0
  76. data/examples/table-drift.txt +4 -0
  77. data/examples/temps.txt +31 -0
  78. data/examples/trig.sh +13 -0
  79. data/examples/trig.txt +102 -0
  80. data/examples/week.txt +8 -0
  81. data/examples/wide.txt +2 -0
  82. data/exe/tessella +6 -0
  83. data/lib/tessella/axis.rb +71 -0
  84. data/lib/tessella/bitfield.rb +194 -0
  85. data/lib/tessella/block.rb +56 -0
  86. data/lib/tessella/borders.rb +85 -0
  87. data/lib/tessella/canvas/area.rb +155 -0
  88. data/lib/tessella/canvas/ascii.rb +120 -0
  89. data/lib/tessella/canvas/block.rb +40 -0
  90. data/lib/tessella/canvas/braille.rb +30 -0
  91. data/lib/tessella/canvas/clip.rb +49 -0
  92. data/lib/tessella/canvas/density.rb +51 -0
  93. data/lib/tessella/canvas/dot.rb +27 -0
  94. data/lib/tessella/canvas/eighths.rb +43 -0
  95. data/lib/tessella/canvas/half.rb +51 -0
  96. data/lib/tessella/canvas/sextant.rb +36 -0
  97. data/lib/tessella/canvas.rb +168 -0
  98. data/lib/tessella/cell.rb +10 -0
  99. data/lib/tessella/chart.rb +211 -0
  100. data/lib/tessella/check.rb +52 -0
  101. data/lib/tessella/cli/bitfield.rb +121 -0
  102. data/lib/tessella/cli/chart.rb +615 -0
  103. data/lib/tessella/cli/chart_candle.rb +36 -0
  104. data/lib/tessella/cli/chart_heatmap.rb +21 -0
  105. data/lib/tessella/cli/chart_help.rb +85 -0
  106. data/lib/tessella/cli/chart_pie.rb +38 -0
  107. data/lib/tessella/cli/compose.rb +156 -0
  108. data/lib/tessella/cli/compose_options.rb +259 -0
  109. data/lib/tessella/cli/glyphs.rb +97 -0
  110. data/lib/tessella/cli/image.rb +250 -0
  111. data/lib/tessella/cli/input.rb +44 -0
  112. data/lib/tessella/cli/iso_time.rb +28 -0
  113. data/lib/tessella/cli/lint.rb +102 -0
  114. data/lib/tessella/cli/lint_options.rb +99 -0
  115. data/lib/tessella/cli/main.rb +121 -0
  116. data/lib/tessella/cli/meter.rb +80 -0
  117. data/lib/tessella/cli/rule.rb +57 -0
  118. data/lib/tessella/cli/seq.rb +117 -0
  119. data/lib/tessella/cli/sparkline.rb +72 -0
  120. data/lib/tessella/cli/table.rb +167 -0
  121. data/lib/tessella/cli/text.rb +78 -0
  122. data/lib/tessella/cli/tree.rb +100 -0
  123. data/lib/tessella/cli/wave.rb +148 -0
  124. data/lib/tessella/cli.rb +36 -0
  125. data/lib/tessella/color.rb +106 -0
  126. data/lib/tessella/compose.rb +243 -0
  127. data/lib/tessella/compose_fill.rb +176 -0
  128. data/lib/tessella/compose_grid.rb +36 -0
  129. data/lib/tessella/compose_shadow.rb +41 -0
  130. data/lib/tessella/error.rb +13 -0
  131. data/lib/tessella/frame.rb +170 -0
  132. data/lib/tessella/glyphs.rb +106 -0
  133. data/lib/tessella/image.rb +454 -0
  134. data/lib/tessella/image_octant.rb +46 -0
  135. data/lib/tessella/image_petscii.rb +116 -0
  136. data/lib/tessella/kinds/bar.rb +344 -0
  137. data/lib/tessella/kinds/box.rb +213 -0
  138. data/lib/tessella/kinds/box_upright.rb +110 -0
  139. data/lib/tessella/kinds/candlestick.rb +164 -0
  140. data/lib/tessella/kinds/columns.rb +259 -0
  141. data/lib/tessella/kinds/date_axis.rb +102 -0
  142. data/lib/tessella/kinds/error_bars.rb +71 -0
  143. data/lib/tessella/kinds/heatmap.rb +130 -0
  144. data/lib/tessella/kinds/line.rb +173 -0
  145. data/lib/tessella/kinds/multibar.rb +98 -0
  146. data/lib/tessella/kinds/multibar_columns.rb +130 -0
  147. data/lib/tessella/kinds/multibar_fine.rb +45 -0
  148. data/lib/tessella/kinds/multibar_rows.rb +93 -0
  149. data/lib/tessella/kinds/pie.rb +123 -0
  150. data/lib/tessella/kinds/pie_rim.rb +78 -0
  151. data/lib/tessella/kinds/sideways.rb +62 -0
  152. data/lib/tessella/kinds/stem.rb +134 -0
  153. data/lib/tessella/kinds/threshold.rb +73 -0
  154. data/lib/tessella/legend.rb +31 -0
  155. data/lib/tessella/lint/alphabet.rb +56 -0
  156. data/lib/tessella/lint/drift.rb +82 -0
  157. data/lib/tessella/lint/fences.rb +51 -0
  158. data/lib/tessella/lint/geometry.rb +120 -0
  159. data/lib/tessella/lint/geometry_checks.rb +224 -0
  160. data/lib/tessella/lint/lines.rb +115 -0
  161. data/lib/tessella/lint/mixing.rb +61 -0
  162. data/lib/tessella/lint/runner.rb +73 -0
  163. data/lib/tessella/lint/shadows.rb +120 -0
  164. data/lib/tessella/lint/target_rows.rb +66 -0
  165. data/lib/tessella/lint.rb +158 -0
  166. data/lib/tessella/meter.rb +133 -0
  167. data/lib/tessella/meter_upright.rb +43 -0
  168. data/lib/tessella/png.rb +456 -0
  169. data/lib/tessella/raster.rb +92 -0
  170. data/lib/tessella/rmagick_reader.rb +52 -0
  171. data/lib/tessella/rule.rb +59 -0
  172. data/lib/tessella/seq.rb +522 -0
  173. data/lib/tessella/sparkline.rb +57 -0
  174. data/lib/tessella/stats.rb +199 -0
  175. data/lib/tessella/table.rb +547 -0
  176. data/lib/tessella/table_cells.rb +225 -0
  177. data/lib/tessella/target.rb +105 -0
  178. data/lib/tessella/text.rb +76 -0
  179. data/lib/tessella/text_forms.rb +150 -0
  180. data/lib/tessella/tree.rb +221 -0
  181. data/lib/tessella/version.rb +5 -0
  182. data/lib/tessella/wave.rb +353 -0
  183. data/lib/tessella/width.rb +122 -0
  184. data/lib/tessella/width_class.rb +77 -0
  185. data/lib/tessella/width_invisible.rb +66 -0
  186. data/lib/tessella/width_invisible_high.rb +60 -0
  187. data/lib/tessella.rb +94 -0
  188. metadata +226 -0
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tessella
4
+ # Width classes (DESIGN.md, "Glyphs"): N (narrow everywhere), A
5
+ # (East Asian Ambiguous: one column in Western terminals, two in
6
+ # CJK-configured ones) and W (wide, always two), as the ascii-art
7
+ # skill's glyph palette names them. Invisible glyphs have none.
8
+ # AMBIGUOUS is Unicode 15.1's EastAsianWidth.txt class A, generated
9
+ # as Width's own tables were, so the three agree.
10
+ module Width
11
+ AMBIGUOUS = [
12
+ 0x00A1..0x00A1, 0x00A4..0x00A4, 0x00A7..0x00A8, 0x00AA..0x00AA,
13
+ 0x00AD..0x00AE, 0x00B0..0x00B4, 0x00B6..0x00BA, 0x00BC..0x00BF,
14
+ 0x00C6..0x00C6, 0x00D0..0x00D0, 0x00D7..0x00D8, 0x00DE..0x00E1,
15
+ 0x00E6..0x00E6, 0x00E8..0x00EA, 0x00EC..0x00ED, 0x00F0..0x00F0,
16
+ 0x00F2..0x00F3, 0x00F7..0x00FA, 0x00FC..0x00FC, 0x00FE..0x00FE,
17
+ 0x0101..0x0101, 0x0111..0x0111, 0x0113..0x0113, 0x011B..0x011B,
18
+ 0x0126..0x0127, 0x012B..0x012B, 0x0131..0x0133, 0x0138..0x0138,
19
+ 0x013F..0x0142, 0x0144..0x0144, 0x0148..0x014B, 0x014D..0x014D,
20
+ 0x0152..0x0153, 0x0166..0x0167, 0x016B..0x016B, 0x01CE..0x01CE,
21
+ 0x01D0..0x01D0, 0x01D2..0x01D2, 0x01D4..0x01D4, 0x01D6..0x01D6,
22
+ 0x01D8..0x01D8, 0x01DA..0x01DA, 0x01DC..0x01DC, 0x0251..0x0251,
23
+ 0x0261..0x0261, 0x02C4..0x02C4, 0x02C7..0x02C7, 0x02C9..0x02CB,
24
+ 0x02CD..0x02CD, 0x02D0..0x02D0, 0x02D8..0x02DB, 0x02DD..0x02DD,
25
+ 0x02DF..0x02DF, 0x0300..0x036F, 0x0391..0x03A1, 0x03A3..0x03A9,
26
+ 0x03B1..0x03C1, 0x03C3..0x03C9, 0x0401..0x0401, 0x0410..0x044F,
27
+ 0x0451..0x0451, 0x2010..0x2010, 0x2013..0x2016, 0x2018..0x2019,
28
+ 0x201C..0x201D, 0x2020..0x2022, 0x2024..0x2027, 0x2030..0x2030,
29
+ 0x2032..0x2033, 0x2035..0x2035, 0x203B..0x203B, 0x203E..0x203E,
30
+ 0x2074..0x2074, 0x207F..0x207F, 0x2081..0x2084, 0x20AC..0x20AC,
31
+ 0x2103..0x2103, 0x2105..0x2105, 0x2109..0x2109, 0x2113..0x2113,
32
+ 0x2116..0x2116, 0x2121..0x2122, 0x2126..0x2126, 0x212B..0x212B,
33
+ 0x2153..0x2154, 0x215B..0x215E, 0x2160..0x216B, 0x2170..0x2179,
34
+ 0x2189..0x2189, 0x2190..0x2199, 0x21B8..0x21B9, 0x21D2..0x21D2,
35
+ 0x21D4..0x21D4, 0x21E7..0x21E7, 0x2200..0x2200, 0x2202..0x2203,
36
+ 0x2207..0x2208, 0x220B..0x220B, 0x220F..0x220F, 0x2211..0x2211,
37
+ 0x2215..0x2215, 0x221A..0x221A, 0x221D..0x2220, 0x2223..0x2223,
38
+ 0x2225..0x2225, 0x2227..0x222C, 0x222E..0x222E, 0x2234..0x2237,
39
+ 0x223C..0x223D, 0x2248..0x2248, 0x224C..0x224C, 0x2252..0x2252,
40
+ 0x2260..0x2261, 0x2264..0x2267, 0x226A..0x226B, 0x226E..0x226F,
41
+ 0x2282..0x2283, 0x2286..0x2287, 0x2295..0x2295, 0x2299..0x2299,
42
+ 0x22A5..0x22A5, 0x22BF..0x22BF, 0x2312..0x2312, 0x2460..0x24E9,
43
+ 0x24EB..0x254B, 0x2550..0x2573, 0x2580..0x258F, 0x2592..0x2595,
44
+ 0x25A0..0x25A1, 0x25A3..0x25A9, 0x25B2..0x25B3, 0x25B6..0x25B7,
45
+ 0x25BC..0x25BD, 0x25C0..0x25C1, 0x25C6..0x25C8, 0x25CB..0x25CB,
46
+ 0x25CE..0x25D1, 0x25E2..0x25E5, 0x25EF..0x25EF, 0x2605..0x2606,
47
+ 0x2609..0x2609, 0x260E..0x260F, 0x261C..0x261C, 0x261E..0x261E,
48
+ 0x2640..0x2640, 0x2642..0x2642, 0x2660..0x2661, 0x2663..0x2665,
49
+ 0x2667..0x266A, 0x266C..0x266D, 0x266F..0x266F, 0x269E..0x269F,
50
+ 0x26BF..0x26BF, 0x26C6..0x26CD, 0x26CF..0x26D3, 0x26D5..0x26E1,
51
+ 0x26E3..0x26E3, 0x26E8..0x26E9, 0x26EB..0x26F1, 0x26F4..0x26F4,
52
+ 0x26F6..0x26F9, 0x26FB..0x26FC, 0x26FE..0x26FF, 0x273D..0x273D,
53
+ 0x2776..0x277F, 0x2B56..0x2B59, 0x3248..0x324F, 0xE000..0xF8FF,
54
+ 0xFE00..0xFE0F, 0xFFFD..0xFFFD, 0x1F100..0x1F10A, 0x1F110..0x1F12D,
55
+ 0x1F130..0x1F169, 0x1F170..0x1F18D, 0x1F18F..0x1F190,
56
+ 0x1F19B..0x1F1AC, 0xE0100..0xE01EF, 0xF0000..0xFFFFD,
57
+ 0x100000..0x10FFFD
58
+ ].freeze
59
+
60
+ def self.ambiguous?(code) = Width.in?(AMBIGUOUS, code)
61
+
62
+ # :N, :A, :W, or nil for an invisible glyph.
63
+ def self.class_of(char)
64
+ code = char.ord
65
+ case Width.base(code)
66
+ when 0 then nil
67
+ when 2 then :W
68
+ else ambiguous?(code) ? :A : :N
69
+ end
70
+ end
71
+
72
+ # The classes a text's visible glyphs fall into, spaces aside.
73
+ def self.classes(text)
74
+ text.each_char.reject { it == " " }.filter_map { class_of(it) }.uniq
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tessella
4
+ # Width's zero-width ranges (width.rb), generated from Unicode
5
+ # 15.1's UnicodeData.txt by tools/invisible_ranges.rb: every Mn and
6
+ # Me, the Hangul medial and final jamo, the zero-width and format
7
+ # characters, the variation selectors. Split in two files by
8
+ # plane only to keep each table a readable size.
9
+ module Width
10
+ INVISIBLE_BMP = [
11
+ 0x0300..0x036F, 0x0483..0x0489, 0x0591..0x05BD, 0x05BF..0x05BF,
12
+ 0x05C1..0x05C2, 0x05C4..0x05C5, 0x05C7..0x05C7, 0x0610..0x061A,
13
+ 0x064B..0x065F, 0x0670..0x0670, 0x06D6..0x06DC, 0x06DF..0x06E4,
14
+ 0x06E7..0x06E8, 0x06EA..0x06ED, 0x0711..0x0711, 0x0730..0x074A,
15
+ 0x07A6..0x07B0, 0x07EB..0x07F3, 0x07FD..0x07FD, 0x0816..0x0819,
16
+ 0x081B..0x0823, 0x0825..0x0827, 0x0829..0x082D, 0x0859..0x085B,
17
+ 0x0898..0x089F, 0x08CA..0x08E1, 0x08E3..0x0902, 0x093A..0x093A,
18
+ 0x093C..0x093C, 0x0941..0x0948, 0x094D..0x094D, 0x0951..0x0957,
19
+ 0x0962..0x0963, 0x0981..0x0981, 0x09BC..0x09BC, 0x09C1..0x09C4,
20
+ 0x09CD..0x09CD, 0x09E2..0x09E3, 0x09FE..0x09FE, 0x0A01..0x0A02,
21
+ 0x0A3C..0x0A3C, 0x0A41..0x0A42, 0x0A47..0x0A48, 0x0A4B..0x0A4D,
22
+ 0x0A51..0x0A51, 0x0A70..0x0A71, 0x0A75..0x0A75, 0x0A81..0x0A82,
23
+ 0x0ABC..0x0ABC, 0x0AC1..0x0AC5, 0x0AC7..0x0AC8, 0x0ACD..0x0ACD,
24
+ 0x0AE2..0x0AE3, 0x0AFA..0x0AFF, 0x0B01..0x0B01, 0x0B3C..0x0B3C,
25
+ 0x0B3F..0x0B3F, 0x0B41..0x0B44, 0x0B4D..0x0B4D, 0x0B55..0x0B56,
26
+ 0x0B62..0x0B63, 0x0B82..0x0B82, 0x0BC0..0x0BC0, 0x0BCD..0x0BCD,
27
+ 0x0C00..0x0C00, 0x0C04..0x0C04, 0x0C3C..0x0C3C, 0x0C3E..0x0C40,
28
+ 0x0C46..0x0C48, 0x0C4A..0x0C4D, 0x0C55..0x0C56, 0x0C62..0x0C63,
29
+ 0x0C81..0x0C81, 0x0CBC..0x0CBC, 0x0CBF..0x0CBF, 0x0CC6..0x0CC6,
30
+ 0x0CCC..0x0CCD, 0x0CE2..0x0CE3, 0x0D00..0x0D01, 0x0D3B..0x0D3C,
31
+ 0x0D41..0x0D44, 0x0D4D..0x0D4D, 0x0D62..0x0D63, 0x0D81..0x0D81,
32
+ 0x0DCA..0x0DCA, 0x0DD2..0x0DD4, 0x0DD6..0x0DD6, 0x0E31..0x0E31,
33
+ 0x0E34..0x0E3A, 0x0E47..0x0E4E, 0x0EB1..0x0EB1, 0x0EB4..0x0EBC,
34
+ 0x0EC8..0x0ECE, 0x0F18..0x0F19, 0x0F35..0x0F35, 0x0F37..0x0F37,
35
+ 0x0F39..0x0F39, 0x0F71..0x0F7E, 0x0F80..0x0F84, 0x0F86..0x0F87,
36
+ 0x0F8D..0x0F97, 0x0F99..0x0FBC, 0x0FC6..0x0FC6, 0x102D..0x1030,
37
+ 0x1032..0x1037, 0x1039..0x103A, 0x103D..0x103E, 0x1058..0x1059,
38
+ 0x105E..0x1060, 0x1071..0x1074, 0x1082..0x1082, 0x1085..0x1086,
39
+ 0x108D..0x108D, 0x109D..0x109D, 0x1160..0x11FF, 0x135D..0x135F,
40
+ 0x1712..0x1714, 0x1732..0x1733, 0x1752..0x1753, 0x1772..0x1773,
41
+ 0x17B4..0x17B5, 0x17B7..0x17BD, 0x17C6..0x17C6, 0x17C9..0x17D3,
42
+ 0x17DD..0x17DD, 0x180B..0x180D, 0x180F..0x180F, 0x1885..0x1886,
43
+ 0x18A9..0x18A9, 0x1920..0x1922, 0x1927..0x1928, 0x1932..0x1932,
44
+ 0x1939..0x193B, 0x1A17..0x1A18, 0x1A1B..0x1A1B, 0x1A56..0x1A56,
45
+ 0x1A58..0x1A5E, 0x1A60..0x1A60, 0x1A62..0x1A62, 0x1A65..0x1A6C,
46
+ 0x1A73..0x1A7C, 0x1A7F..0x1A7F, 0x1AB0..0x1ACE, 0x1B00..0x1B03,
47
+ 0x1B34..0x1B34, 0x1B36..0x1B3A, 0x1B3C..0x1B3C, 0x1B42..0x1B42,
48
+ 0x1B6B..0x1B73, 0x1B80..0x1B81, 0x1BA2..0x1BA5, 0x1BA8..0x1BA9,
49
+ 0x1BAB..0x1BAD, 0x1BE6..0x1BE6, 0x1BE8..0x1BE9, 0x1BED..0x1BED,
50
+ 0x1BEF..0x1BF1, 0x1C2C..0x1C33, 0x1C36..0x1C37, 0x1CD0..0x1CD2,
51
+ 0x1CD4..0x1CE0, 0x1CE2..0x1CE8, 0x1CED..0x1CED, 0x1CF4..0x1CF4,
52
+ 0x1CF8..0x1CF9, 0x1DC0..0x1DFF, 0x200B..0x200F, 0x2060..0x206F,
53
+ 0x20D0..0x20F0, 0x2CEF..0x2CF1, 0x2D7F..0x2D7F, 0x2DE0..0x2DFF,
54
+ 0xA66F..0xA672, 0xA674..0xA67D, 0xA69E..0xA69F, 0xA6F0..0xA6F1,
55
+ 0xA802..0xA802, 0xA806..0xA806, 0xA80B..0xA80B, 0xA825..0xA826,
56
+ 0xA82C..0xA82C, 0xA8C4..0xA8C5, 0xA8E0..0xA8F1, 0xA8FF..0xA8FF,
57
+ 0xA926..0xA92D, 0xA947..0xA951, 0xA980..0xA982, 0xA9B3..0xA9B3,
58
+ 0xA9B6..0xA9B9, 0xA9BC..0xA9BD, 0xA9E5..0xA9E5, 0xAA29..0xAA2E,
59
+ 0xAA31..0xAA32, 0xAA35..0xAA36, 0xAA43..0xAA43, 0xAA4C..0xAA4C,
60
+ 0xAA7C..0xAA7C, 0xAAB0..0xAAB0, 0xAAB2..0xAAB4, 0xAAB7..0xAAB8,
61
+ 0xAABE..0xAABF, 0xAAC1..0xAAC1, 0xAAEC..0xAAED, 0xAAF6..0xAAF6,
62
+ 0xABE5..0xABE5, 0xABE8..0xABE8, 0xABED..0xABED, 0xD7B0..0xD7FF,
63
+ 0xFB1E..0xFB1E, 0xFE00..0xFE0F, 0xFE20..0xFE2F, 0xFEFF..0xFEFF
64
+ ].freeze
65
+ end
66
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tessella
4
+ # Width's zero-width ranges (width.rb), generated from Unicode
5
+ # 15.1's UnicodeData.txt by tools/invisible_ranges.rb: every Mn and
6
+ # Me, the Hangul medial and final jamo, the zero-width and format
7
+ # characters, the variation selectors. This file holds the
8
+ # planes past the BMP, and joins the two.
9
+ module Width
10
+ INVISIBLE_HIGH = [
11
+ 0x101FD..0x101FD, 0x102E0..0x102E0, 0x10376..0x1037A,
12
+ 0x10A01..0x10A03, 0x10A05..0x10A06, 0x10A0C..0x10A0F,
13
+ 0x10A38..0x10A3A, 0x10A3F..0x10A3F, 0x10AE5..0x10AE6,
14
+ 0x10D24..0x10D27, 0x10EAB..0x10EAC, 0x10EFD..0x10EFF,
15
+ 0x10F46..0x10F50, 0x10F82..0x10F85, 0x11001..0x11001,
16
+ 0x11038..0x11046, 0x11070..0x11070, 0x11073..0x11074,
17
+ 0x1107F..0x11081, 0x110B3..0x110B6, 0x110B9..0x110BA,
18
+ 0x110C2..0x110C2, 0x11100..0x11102, 0x11127..0x1112B,
19
+ 0x1112D..0x11134, 0x11173..0x11173, 0x11180..0x11181,
20
+ 0x111B6..0x111BE, 0x111C9..0x111CC, 0x111CF..0x111CF,
21
+ 0x1122F..0x11231, 0x11234..0x11234, 0x11236..0x11237,
22
+ 0x1123E..0x1123E, 0x11241..0x11241, 0x112DF..0x112DF,
23
+ 0x112E3..0x112EA, 0x11300..0x11301, 0x1133B..0x1133C,
24
+ 0x11340..0x11340, 0x11366..0x1136C, 0x11370..0x11374,
25
+ 0x11438..0x1143F, 0x11442..0x11444, 0x11446..0x11446,
26
+ 0x1145E..0x1145E, 0x114B3..0x114B8, 0x114BA..0x114BA,
27
+ 0x114BF..0x114C0, 0x114C2..0x114C3, 0x115B2..0x115B5,
28
+ 0x115BC..0x115BD, 0x115BF..0x115C0, 0x115DC..0x115DD,
29
+ 0x11633..0x1163A, 0x1163D..0x1163D, 0x1163F..0x11640,
30
+ 0x116AB..0x116AB, 0x116AD..0x116AD, 0x116B0..0x116B5,
31
+ 0x116B7..0x116B7, 0x1171D..0x1171F, 0x11722..0x11725,
32
+ 0x11727..0x1172B, 0x1182F..0x11837, 0x11839..0x1183A,
33
+ 0x1193B..0x1193C, 0x1193E..0x1193E, 0x11943..0x11943,
34
+ 0x119D4..0x119D7, 0x119DA..0x119DB, 0x119E0..0x119E0,
35
+ 0x11A01..0x11A0A, 0x11A33..0x11A38, 0x11A3B..0x11A3E,
36
+ 0x11A47..0x11A47, 0x11A51..0x11A56, 0x11A59..0x11A5B,
37
+ 0x11A8A..0x11A96, 0x11A98..0x11A99, 0x11C30..0x11C36,
38
+ 0x11C38..0x11C3D, 0x11C3F..0x11C3F, 0x11C92..0x11CA7,
39
+ 0x11CAA..0x11CB0, 0x11CB2..0x11CB3, 0x11CB5..0x11CB6,
40
+ 0x11D31..0x11D36, 0x11D3A..0x11D3A, 0x11D3C..0x11D3D,
41
+ 0x11D3F..0x11D45, 0x11D47..0x11D47, 0x11D90..0x11D91,
42
+ 0x11D95..0x11D95, 0x11D97..0x11D97, 0x11EF3..0x11EF4,
43
+ 0x11F00..0x11F01, 0x11F36..0x11F3A, 0x11F40..0x11F40,
44
+ 0x11F42..0x11F42, 0x13440..0x13440, 0x13447..0x13455,
45
+ 0x16AF0..0x16AF4, 0x16B30..0x16B36, 0x16F4F..0x16F4F,
46
+ 0x16F8F..0x16F92, 0x1BC9D..0x1BC9E, 0x1CF00..0x1CF2D,
47
+ 0x1CF30..0x1CF46, 0x1D167..0x1D169, 0x1D17B..0x1D182,
48
+ 0x1D185..0x1D18B, 0x1D1AA..0x1D1AD, 0x1D242..0x1D244,
49
+ 0x1DA00..0x1DA36, 0x1DA3B..0x1DA6C, 0x1DA75..0x1DA75,
50
+ 0x1DA84..0x1DA84, 0x1DA9B..0x1DA9F, 0x1DAA1..0x1DAAF,
51
+ 0x1E000..0x1E006, 0x1E008..0x1E018, 0x1E01B..0x1E021,
52
+ 0x1E023..0x1E024, 0x1E026..0x1E02A, 0x1E08F..0x1E08F,
53
+ 0x1E130..0x1E136, 0x1E2AE..0x1E2AE, 0x1E2EC..0x1E2EF,
54
+ 0x1E4EC..0x1E4EF, 0x1E8D0..0x1E8D6, 0x1E944..0x1E94A,
55
+ 0xE0100..0xE01EF
56
+ ].freeze
57
+
58
+ INVISIBLE = (INVISIBLE_BMP + INVISIBLE_HIGH).freeze
59
+ end
60
+ end
data/lib/tessella.rb ADDED
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ # tessella -- charts and text figures for a monospace grid, in Unicode
4
+ # or pure ASCII.
5
+ #
6
+ # The load order below is the dependency order, and the only place an
7
+ # tessella file is required: tools/bundle.rb concatenates the files in
8
+ # exactly this order into one, for vendoring (DESIGN.md). Standard
9
+ # library requires live here too, above the parts, and nowhere else.
10
+ # The command line is not part of it: lib/tessella/cli.rb loads it, on
11
+ # top of this file.
12
+
13
+ require "zlib"
14
+
15
+ require_relative "tessella/version"
16
+ require_relative "tessella/error"
17
+ require_relative "tessella/check"
18
+ require_relative "tessella/target"
19
+ require_relative "tessella/width"
20
+ require_relative "tessella/width_invisible"
21
+ require_relative "tessella/width_invisible_high"
22
+ require_relative "tessella/width_class"
23
+ require_relative "tessella/borders"
24
+ require_relative "tessella/glyphs"
25
+ require_relative "tessella/block"
26
+ require_relative "tessella/compose"
27
+ require_relative "tessella/compose_shadow"
28
+ require_relative "tessella/compose_fill"
29
+ require_relative "tessella/compose_grid"
30
+ require_relative "tessella/meter"
31
+ require_relative "tessella/meter_upright"
32
+ require_relative "tessella/rule"
33
+ require_relative "tessella/sparkline"
34
+ require_relative "tessella/text_forms"
35
+ require_relative "tessella/text"
36
+ require_relative "tessella/tree"
37
+ require_relative "tessella/table"
38
+ require_relative "tessella/table_cells"
39
+ require_relative "tessella/bitfield"
40
+ require_relative "tessella/wave"
41
+ require_relative "tessella/seq"
42
+ require_relative "tessella/raster"
43
+ require_relative "tessella/png"
44
+ require_relative "tessella/rmagick_reader"
45
+ require_relative "tessella/image_octant"
46
+ require_relative "tessella/image_petscii"
47
+ require_relative "tessella/image"
48
+ require_relative "tessella/lint"
49
+ require_relative "tessella/lint/lines"
50
+ require_relative "tessella/lint/target_rows"
51
+ require_relative "tessella/lint/shadows"
52
+ require_relative "tessella/lint/mixing"
53
+ require_relative "tessella/lint/drift"
54
+ require_relative "tessella/lint/geometry_checks"
55
+ require_relative "tessella/lint/geometry"
56
+ require_relative "tessella/lint/fences"
57
+ require_relative "tessella/lint/alphabet"
58
+ require_relative "tessella/lint/runner"
59
+ require_relative "tessella/cell"
60
+ require_relative "tessella/stats"
61
+ require_relative "tessella/axis"
62
+ require_relative "tessella/color"
63
+ require_relative "tessella/canvas"
64
+ require_relative "tessella/canvas/area"
65
+ require_relative "tessella/canvas/clip"
66
+ require_relative "tessella/canvas/braille"
67
+ require_relative "tessella/canvas/block"
68
+ require_relative "tessella/canvas/dot"
69
+ require_relative "tessella/canvas/half"
70
+ require_relative "tessella/canvas/eighths"
71
+ require_relative "tessella/canvas/sextant"
72
+ require_relative "tessella/canvas/ascii"
73
+ require_relative "tessella/canvas/density"
74
+ require_relative "tessella/frame"
75
+ require_relative "tessella/legend"
76
+ require_relative "tessella/chart"
77
+ require_relative "tessella/kinds/sideways"
78
+ require_relative "tessella/kinds/date_axis"
79
+ require_relative "tessella/kinds/error_bars"
80
+ require_relative "tessella/kinds/threshold"
81
+ require_relative "tessella/kinds/line"
82
+ require_relative "tessella/kinds/columns"
83
+ require_relative "tessella/kinds/multibar_fine"
84
+ require_relative "tessella/kinds/multibar"
85
+ require_relative "tessella/kinds/multibar_rows"
86
+ require_relative "tessella/kinds/multibar_columns"
87
+ require_relative "tessella/kinds/bar"
88
+ require_relative "tessella/kinds/box"
89
+ require_relative "tessella/kinds/box_upright"
90
+ require_relative "tessella/kinds/stem"
91
+ require_relative "tessella/kinds/heatmap"
92
+ require_relative "tessella/kinds/candlestick"
93
+ require_relative "tessella/kinds/pie_rim"
94
+ require_relative "tessella/kinds/pie"
metadata ADDED
@@ -0,0 +1,226 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tessella
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Stephane D'Alu
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Line, scatter, stairs, bar, histogram, box, stem and density plots with
13
+ scaled axes, drawn in braille, block, dot or ASCII cells. No runtime dependency.
14
+ executables:
15
+ - tessella
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - LICENSE
20
+ - README.md
21
+ - doc/README.md
22
+ - doc/bitfield.md
23
+ - doc/charts.md
24
+ - doc/check.rb
25
+ - doc/cli.md
26
+ - doc/composition.md
27
+ - doc/getting-started.md
28
+ - doc/glyphs.md
29
+ - doc/images.md
30
+ - doc/library.md
31
+ - doc/lint.md
32
+ - doc/meter.md
33
+ - doc/rule.md
34
+ - doc/seq.md
35
+ - doc/sparkline.md
36
+ - doc/table.md
37
+ - doc/targets.md
38
+ - doc/text.md
39
+ - doc/tree.md
40
+ - doc/wave.md
41
+ - examples/README.md
42
+ - examples/ages.txt
43
+ - examples/bad.csv
44
+ - examples/boxes.txt
45
+ - examples/broken.txt
46
+ - examples/calibration.rb
47
+ - examples/cities.csv
48
+ - examples/cjk.rb
49
+ - examples/comment.rb
50
+ - examples/comment.sh
51
+ - examples/cpu.txt
52
+ - examples/dashboard.sh
53
+ - examples/datasheet.rb
54
+ - examples/disc.pgm
55
+ - examples/disks.sh
56
+ - examples/disks.txt
57
+ - examples/dose.txt
58
+ - examples/drift.txt
59
+ - examples/ethernet.txt
60
+ - examples/figure.c
61
+ - examples/fit.rb
62
+ - examples/floors.rb
63
+ - examples/gallery.sh
64
+ - examples/gauges.sh
65
+ - examples/gradient.rb
66
+ - examples/growth.txt
67
+ - examples/hosts.csv
68
+ - examples/icmp.txt
69
+ - examples/ipv4.txt
70
+ - examples/kinds.csv
71
+ - examples/langs.csv
72
+ - examples/lint.rb
73
+ - examples/load.rb
74
+ - examples/login.txt
75
+ - examples/neg.csv
76
+ - examples/normal.txt
77
+ - examples/note.txt
78
+ - examples/notes-fixed.md
79
+ - examples/notes.md
80
+ - examples/ohlc.txt
81
+ - examples/os.csv
82
+ - examples/outline.txt
83
+ - examples/plot.txt
84
+ - examples/refusals.rb
85
+ - examples/report.sh
86
+ - examples/rfc.sh
87
+ - examples/samples.txt
88
+ - examples/shapes.pgm
89
+ - examples/sizes.tsv
90
+ - examples/spi.txt
91
+ - examples/status.sh
92
+ - examples/stem.txt
93
+ - examples/table-drift.txt
94
+ - examples/temps.txt
95
+ - examples/trig.sh
96
+ - examples/trig.txt
97
+ - examples/week.txt
98
+ - examples/wide.txt
99
+ - exe/tessella
100
+ - lib/tessella.rb
101
+ - lib/tessella/axis.rb
102
+ - lib/tessella/bitfield.rb
103
+ - lib/tessella/block.rb
104
+ - lib/tessella/borders.rb
105
+ - lib/tessella/canvas.rb
106
+ - lib/tessella/canvas/area.rb
107
+ - lib/tessella/canvas/ascii.rb
108
+ - lib/tessella/canvas/block.rb
109
+ - lib/tessella/canvas/braille.rb
110
+ - lib/tessella/canvas/clip.rb
111
+ - lib/tessella/canvas/density.rb
112
+ - lib/tessella/canvas/dot.rb
113
+ - lib/tessella/canvas/eighths.rb
114
+ - lib/tessella/canvas/half.rb
115
+ - lib/tessella/canvas/sextant.rb
116
+ - lib/tessella/cell.rb
117
+ - lib/tessella/chart.rb
118
+ - lib/tessella/check.rb
119
+ - lib/tessella/cli.rb
120
+ - lib/tessella/cli/bitfield.rb
121
+ - lib/tessella/cli/chart.rb
122
+ - lib/tessella/cli/chart_candle.rb
123
+ - lib/tessella/cli/chart_heatmap.rb
124
+ - lib/tessella/cli/chart_help.rb
125
+ - lib/tessella/cli/chart_pie.rb
126
+ - lib/tessella/cli/compose.rb
127
+ - lib/tessella/cli/compose_options.rb
128
+ - lib/tessella/cli/glyphs.rb
129
+ - lib/tessella/cli/image.rb
130
+ - lib/tessella/cli/input.rb
131
+ - lib/tessella/cli/iso_time.rb
132
+ - lib/tessella/cli/lint.rb
133
+ - lib/tessella/cli/lint_options.rb
134
+ - lib/tessella/cli/main.rb
135
+ - lib/tessella/cli/meter.rb
136
+ - lib/tessella/cli/rule.rb
137
+ - lib/tessella/cli/seq.rb
138
+ - lib/tessella/cli/sparkline.rb
139
+ - lib/tessella/cli/table.rb
140
+ - lib/tessella/cli/text.rb
141
+ - lib/tessella/cli/tree.rb
142
+ - lib/tessella/cli/wave.rb
143
+ - lib/tessella/color.rb
144
+ - lib/tessella/compose.rb
145
+ - lib/tessella/compose_fill.rb
146
+ - lib/tessella/compose_grid.rb
147
+ - lib/tessella/compose_shadow.rb
148
+ - lib/tessella/error.rb
149
+ - lib/tessella/frame.rb
150
+ - lib/tessella/glyphs.rb
151
+ - lib/tessella/image.rb
152
+ - lib/tessella/image_octant.rb
153
+ - lib/tessella/image_petscii.rb
154
+ - lib/tessella/kinds/bar.rb
155
+ - lib/tessella/kinds/box.rb
156
+ - lib/tessella/kinds/box_upright.rb
157
+ - lib/tessella/kinds/candlestick.rb
158
+ - lib/tessella/kinds/columns.rb
159
+ - lib/tessella/kinds/date_axis.rb
160
+ - lib/tessella/kinds/error_bars.rb
161
+ - lib/tessella/kinds/heatmap.rb
162
+ - lib/tessella/kinds/line.rb
163
+ - lib/tessella/kinds/multibar.rb
164
+ - lib/tessella/kinds/multibar_columns.rb
165
+ - lib/tessella/kinds/multibar_fine.rb
166
+ - lib/tessella/kinds/multibar_rows.rb
167
+ - lib/tessella/kinds/pie.rb
168
+ - lib/tessella/kinds/pie_rim.rb
169
+ - lib/tessella/kinds/sideways.rb
170
+ - lib/tessella/kinds/stem.rb
171
+ - lib/tessella/kinds/threshold.rb
172
+ - lib/tessella/legend.rb
173
+ - lib/tessella/lint.rb
174
+ - lib/tessella/lint/alphabet.rb
175
+ - lib/tessella/lint/drift.rb
176
+ - lib/tessella/lint/fences.rb
177
+ - lib/tessella/lint/geometry.rb
178
+ - lib/tessella/lint/geometry_checks.rb
179
+ - lib/tessella/lint/lines.rb
180
+ - lib/tessella/lint/mixing.rb
181
+ - lib/tessella/lint/runner.rb
182
+ - lib/tessella/lint/shadows.rb
183
+ - lib/tessella/lint/target_rows.rb
184
+ - lib/tessella/meter.rb
185
+ - lib/tessella/meter_upright.rb
186
+ - lib/tessella/png.rb
187
+ - lib/tessella/raster.rb
188
+ - lib/tessella/rmagick_reader.rb
189
+ - lib/tessella/rule.rb
190
+ - lib/tessella/seq.rb
191
+ - lib/tessella/sparkline.rb
192
+ - lib/tessella/stats.rb
193
+ - lib/tessella/table.rb
194
+ - lib/tessella/table_cells.rb
195
+ - lib/tessella/target.rb
196
+ - lib/tessella/text.rb
197
+ - lib/tessella/text_forms.rb
198
+ - lib/tessella/tree.rb
199
+ - lib/tessella/version.rb
200
+ - lib/tessella/wave.rb
201
+ - lib/tessella/width.rb
202
+ - lib/tessella/width_class.rb
203
+ - lib/tessella/width_invisible.rb
204
+ - lib/tessella/width_invisible_high.rb
205
+ licenses:
206
+ - MIT
207
+ metadata:
208
+ rubygems_mfa_required: 'true'
209
+ rdoc_options: []
210
+ require_paths:
211
+ - lib
212
+ required_ruby_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '3.4'
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ requirements: []
223
+ rubygems_version: 4.0.21
224
+ specification_version: 4
225
+ summary: Charts for a monospace grid, in Unicode or pure ASCII
226
+ test_files: []