fatty 0.99.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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.envrc +2 -0
  3. data/.simplecov +23 -0
  4. data/.yardopts +4 -0
  5. data/CHANGELOG.md +34 -0
  6. data/CHANGELOG.org +38 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +31 -0
  9. data/README.org +166 -0
  10. data/Rakefile +15 -0
  11. data/TODO.org +163 -0
  12. data/examples/markdown/native-markdown.md +370 -0
  13. data/examples/markdown/ox-gfm-markdown.md +373 -0
  14. data/examples/markdown/ox-gfm-markdown.org +376 -0
  15. data/exe/fatty +275 -0
  16. data/fatty.gemspec +42 -0
  17. data/lib/fatty/accept_env.rb +32 -0
  18. data/lib/fatty/action.rb +103 -0
  19. data/lib/fatty/action_environment.rb +42 -0
  20. data/lib/fatty/actionable.rb +73 -0
  21. data/lib/fatty/alert.rb +93 -0
  22. data/lib/fatty/ansi/renderer.rb +168 -0
  23. data/lib/fatty/ansi.rb +352 -0
  24. data/lib/fatty/colors/color.rb +379 -0
  25. data/lib/fatty/colors/pairs.rb +73 -0
  26. data/lib/fatty/colors/palette.rb +73 -0
  27. data/lib/fatty/colors/rgb.txt +788 -0
  28. data/lib/fatty/colors.rb +5 -0
  29. data/lib/fatty/config.rb +86 -0
  30. data/lib/fatty/config_files/config.yml +50 -0
  31. data/lib/fatty/config_files/help.md +120 -0
  32. data/lib/fatty/config_files/help.org +124 -0
  33. data/lib/fatty/config_files/keybindings.yml +49 -0
  34. data/lib/fatty/config_files/keydefs.yml +23 -0
  35. data/lib/fatty/config_files/themes/mono.yml +76 -0
  36. data/lib/fatty/config_files/themes/nordic.yml +77 -0
  37. data/lib/fatty/config_files/themes/solarized_dark.yml +77 -0
  38. data/lib/fatty/config_files/themes/terminal.yml +90 -0
  39. data/lib/fatty/config_files/themes/wordperfect.yml +77 -0
  40. data/lib/fatty/config_files/themes/wordperfect_light.yml +77 -0
  41. data/lib/fatty/core_ext/string.rb +21 -0
  42. data/lib/fatty/core_ext.rb +3 -0
  43. data/lib/fatty/counter.rb +81 -0
  44. data/lib/fatty/curses/context.rb +279 -0
  45. data/lib/fatty/curses/curses_coder.rb +684 -0
  46. data/lib/fatty/curses/event_source.rb +230 -0
  47. data/lib/fatty/curses/key_decoder.rb +183 -0
  48. data/lib/fatty/curses/patch.rb +116 -0
  49. data/lib/fatty/curses/window_styling.rb +32 -0
  50. data/lib/fatty/curses.rb +16 -0
  51. data/lib/fatty/env.rb +100 -0
  52. data/lib/fatty/help.rb +41 -0
  53. data/lib/fatty/history/entry.rb +71 -0
  54. data/lib/fatty/history.rb +289 -0
  55. data/lib/fatty/input_buffer.rb +998 -0
  56. data/lib/fatty/input_field.rb +507 -0
  57. data/lib/fatty/key_event.rb +342 -0
  58. data/lib/fatty/key_map.rb +392 -0
  59. data/lib/fatty/keymaps/emacs.rb +189 -0
  60. data/lib/fatty/log_formats/json.rb +47 -0
  61. data/lib/fatty/log_formats/text.rb +67 -0
  62. data/lib/fatty/logger.rb +142 -0
  63. data/lib/fatty/markdown/ansi_renderer.rb +373 -0
  64. data/lib/fatty/markdown/render.rb +22 -0
  65. data/lib/fatty/markdown.rb +4 -0
  66. data/lib/fatty/menu_env.rb +22 -0
  67. data/lib/fatty/mouse_event.rb +32 -0
  68. data/lib/fatty/output_buffer.rb +78 -0
  69. data/lib/fatty/pager.rb +801 -0
  70. data/lib/fatty/prompt.rb +40 -0
  71. data/lib/fatty/renderer/curses.rb +697 -0
  72. data/lib/fatty/renderer/truecolor.rb +607 -0
  73. data/lib/fatty/renderer.rb +419 -0
  74. data/lib/fatty/screen.rb +96 -0
  75. data/lib/fatty/search.rb +43 -0
  76. data/lib/fatty/session/alert_session.rb +52 -0
  77. data/lib/fatty/session/input_session.rb +99 -0
  78. data/lib/fatty/session/isearch_session.rb +172 -0
  79. data/lib/fatty/session/keytest_session.rb +236 -0
  80. data/lib/fatty/session/modal_session.rb +61 -0
  81. data/lib/fatty/session/output_session.rb +105 -0
  82. data/lib/fatty/session/popup_session.rb +540 -0
  83. data/lib/fatty/session/prompt_session.rb +157 -0
  84. data/lib/fatty/session/search_session.rb +136 -0
  85. data/lib/fatty/session/shell_session.rb +566 -0
  86. data/lib/fatty/session.rb +173 -0
  87. data/lib/fatty/sessions.rb +14 -0
  88. data/lib/fatty/terminal/popup_owner.rb +26 -0
  89. data/lib/fatty/terminal/progress.rb +374 -0
  90. data/lib/fatty/terminal.rb +1067 -0
  91. data/lib/fatty/themes/loader.rb +136 -0
  92. data/lib/fatty/themes/manager.rb +71 -0
  93. data/lib/fatty/themes/registry.rb +64 -0
  94. data/lib/fatty/themes/resolver.rb +224 -0
  95. data/lib/fatty/themes/themes.rb +131 -0
  96. data/lib/fatty/themes.rb +6 -0
  97. data/lib/fatty/version.rb +5 -0
  98. data/lib/fatty/view/alert_view.rb +14 -0
  99. data/lib/fatty/view/cursor_view.rb +18 -0
  100. data/lib/fatty/view/input_view.rb +9 -0
  101. data/lib/fatty/view/output_view.rb +9 -0
  102. data/lib/fatty/view/status_view.rb +14 -0
  103. data/lib/fatty/view.rb +33 -0
  104. data/lib/fatty/viewport.rb +90 -0
  105. data/lib/fatty/views.rb +9 -0
  106. data/lib/fatty.rb +55 -0
  107. data/sig/fatty.rbs +4 -0
  108. metadata +250 -0
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fatty
4
+ module Colors
5
+ # Stable Curses color-pair IDs. These are intentionally constant so the
6
+ # renderer can refer to them without dynamic allocation.
7
+ #
8
+ # Pair 0 is reserved in ncurses; start at 1.
9
+ module Pairs
10
+ OUTPUT = 1
11
+ INPUT = 2
12
+ INPUT_SUGGESTION = 3
13
+ CURSOR = 4
14
+ REGION = 5
15
+
16
+ STATUS_INFO = 6
17
+ STATUS_WARN = 7
18
+ STATUS_ERROR = 8
19
+ STATUS_GOOD = 9
20
+ STATUS = 10
21
+
22
+ ALERT_INFO = 11
23
+ ALERT_WARN = 12
24
+ ALERT_ERROR = 13
25
+ ALERT_GOOD = 14
26
+ ALERT = 15
27
+
28
+ SEARCH = 20
29
+ SEARCH_HIGHLIGHT = 21
30
+ SEARCH_HIGHLIGHT_SECONDARY = 22
31
+ PAGER_STATUS = 23
32
+
33
+ POPUP = 30
34
+ POPUP_SELECTION = 31
35
+ POPUP_INPUT = 32
36
+ POPUP_FRAME = 33
37
+ POPUP_COUNTS = 34
38
+
39
+ # Role -> pair id mapping for iteration.
40
+ ROLE_TO_PAIR = {
41
+ output: OUTPUT,
42
+ input: INPUT,
43
+ input_suggestion: INPUT_SUGGESTION,
44
+ cursor: CURSOR,
45
+ region: REGION,
46
+
47
+ good: STATUS_GOOD,
48
+ info: STATUS_INFO,
49
+ warn: STATUS_WARN,
50
+ error: STATUS_ERROR,
51
+ status: STATUS,
52
+
53
+ alert_info: ALERT_INFO,
54
+ alert_warn: ALERT_WARN,
55
+ alert_error: ALERT_ERROR,
56
+ alert_good: ALERT_GOOD,
57
+ alert: ALERT,
58
+
59
+ match_current: SEARCH_HIGHLIGHT,
60
+ match_other: SEARCH_HIGHLIGHT_SECONDARY,
61
+ search_input: SEARCH,
62
+
63
+ pager_status: PAGER_STATUS,
64
+
65
+ popup: POPUP,
66
+ popup_selection: POPUP_SELECTION,
67
+ popup_input: POPUP_INPUT,
68
+ popup_frame: POPUP_FRAME,
69
+ popup_counts: POPUP_COUNTS,
70
+ }.freeze
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fatty
4
+ module Colors
5
+ # Palette compiles a resolved symbolic theme_spec into a renderer-ready
6
+ # palette.
7
+ #
8
+ # A theme_spec is produced by Fatty::Themes::Resolver. It maps role names
9
+ # to symbolic color specifications, usually color names and attributes:
10
+ #
11
+ # #+begin_src ruby
12
+ # {
13
+ # output: { fg: "white", bg: "navy" },
14
+ # alert_warn: { fg: "yellow", bg: "pink", attrs: [:bold] },
15
+ # }
16
+ # #+end_src
17
+ #
18
+ # A palette maps those same role names to concrete rendering data:
19
+ #
20
+ # #+begin_src ruby
21
+ # {
22
+ # output: {
23
+ # fg: 7,
24
+ # bg: 4,
25
+ # fg_rgb: [255, 255, 255],
26
+ # bg_rgb: [0, 0, 128],
27
+ # pair: 1,
28
+ # attrs: [],
29
+ # },
30
+ # }
31
+ # #+end_src
32
+ #
33
+ # Curses renderers use :pair and :attrs. Truecolor renderers use
34
+ # :fg_rgb, :bg_rgb, and :attrs.
35
+ #
36
+ # - .build :: returns the compiled palette without touching curses.
37
+ # - .apply! :: also initializes curses color pairs.
38
+ #
39
+ module Palette
40
+ DEFAULT_ROLE = { fg: "default", bg: "default" }.freeze
41
+
42
+ # Compile a theme_spec into a renderer-ready palette without initializing
43
+ # curses color pairs.
44
+ def self.compile(theme_spec, available_colors:)
45
+ palette = {}
46
+ roles = (theme_spec.keys + Pairs::ROLE_TO_PAIR.keys).compact.uniq
47
+
48
+ roles.each do |role|
49
+ role_spec = theme_spec.fetch(role, DEFAULT_ROLE)
50
+
51
+ fg_spec = role_spec[:fg] || DEFAULT_ROLE[:fg]
52
+ bg_spec = role_spec[:bg] || DEFAULT_ROLE[:bg]
53
+
54
+ fg = Fatty::Color.resolve(fg_spec, available_colors: available_colors)
55
+ bg = Fatty::Color.resolve(bg_spec, available_colors: available_colors)
56
+ attrs = Array(role_spec[:attrs] || role_spec["attrs"]).map(&:to_sym)
57
+ fg_rgb = Fatty::Color.rgb(fg_spec)
58
+ bg_rgb = Fatty::Color.rgb(bg_spec)
59
+
60
+ palette[role] = {
61
+ fg: fg,
62
+ bg: bg,
63
+ fg_rgb: fg_rgb,
64
+ bg_rgb: bg_rgb,
65
+ pair: Pairs::ROLE_TO_PAIR[role],
66
+ attrs: attrs,
67
+ }
68
+ end
69
+ palette
70
+ end
71
+ end
72
+ end
73
+ end