terminal_rb 0.9.4 → 0.9.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9409becbf807905a0659436c9e0f5c3644208006e23c038dbf43a621410c7c7
4
- data.tar.gz: 7a583438aa3b66faa19a9bbd035ad26d2c74f889b923e2f410d6468291006495
3
+ metadata.gz: d20a3a35e0ac4ef63e9275befee56d97d7fd611db9dcc3438de5a49bb0938eef
4
+ data.tar.gz: 86475f7f6d2f89e86353e25fe9bae8803d4a75a3df0a8aab2ae58b4fdd4a5a92
5
5
  SHA512:
6
- metadata.gz: 3aa083acc102175661145c924b62d3cee717a9453bb73abc6415800d70193ef957abe998732592d1171244a2393767141254891db15a73b96ff2d76bca5c38d8
7
- data.tar.gz: 3375ed736835332ed58078ca090922f483a81b3c7a4e6d10b87c9abb64fc6260a67649c5e4a06147e0fa89bea44d623f6613f803e24f02c171830647864a88f2
6
+ metadata.gz: b10bd0a2329433e8452b63b2291d4e888937ef8329d5557da7943605131b1a1ec8a42cbb77e6b8f2757f70525b8723d1c1a8242bd1f18593b1a47be6b7c7a655
7
+ data.tar.gz: d08a89d748cf95019615005bfa5370884e2f235f1721df29963a2acaf733ce2e6c06c912d9833cfa4660ca99972126b19477af380641673d63019ae6a9af5827
@@ -18,5 +18,5 @@ while true
18
18
  Terminal.puts(
19
19
  " [blue]: [yellow]#{raw.inspect} [bold bright_green]#{name}[/]"
20
20
  )
21
- break puts if name == 'Esc'
21
+ break puts if raw.nil? || name == 'Esc'
22
22
  end
@@ -1,12 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Terminal
4
- module CSIUMode
4
+ module CSIuKeys
5
5
  class << self
6
- def type = :csi_u
7
-
8
- def key_name(key)
9
- return unless key
6
+ def [](key)
10
7
  return ORD[key.ord] if key.size == 1
11
8
  return if key[0] != "\e"
12
9
  return C0_LEGACY[key[1].ord] if key.size == 2 # ESC ?
@@ -113,5 +110,5 @@ module Terminal
113
110
  128 => 'Num'
114
111
  }.freeze
115
112
  end
116
- private_constant :CSIUMode
113
+ private_constant :CSIuKeys
117
114
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Terminal
4
+ module DumbKeys
5
+ def self.[](key)
6
+ ORD[key.ord] if key.size == 1
7
+ end
8
+
9
+ ORD = {
10
+ 0x05 => 'Ctrl+c',
11
+ 0x08 => 'Back',
12
+ 0x09 => 'Tab',
13
+ 0x0a => 'Enter',
14
+ 0x0d => 'Return',
15
+ 0x1b => 'Esc'
16
+ }.compare_by_identity.freeze
17
+ end
18
+ end
@@ -1,12 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Terminal
4
- module LegacyMode
4
+ module LegacyKeys
5
5
  class << self
6
- def type = :legacy
7
-
8
- def key_name(key)
9
- return unless key
6
+ def [](key)
10
7
  return ORD[key.ord] if key.size == 1
11
8
  return if key[0] != "\e"
12
9
  return csi(key) if key[1] == '['
@@ -118,5 +115,5 @@ module Terminal
118
115
  128 => 'Num'
119
116
  }.freeze
120
117
  end
121
- private_constant :LegacyMode
118
+ private_constant :LegacyKeys
122
119
  end
@@ -7,14 +7,17 @@ module Terminal
7
7
  # Supported input mode.
8
8
  #
9
9
  # @attribute [r] input_mode
10
- # @return [:csi_u] when CSIu protocol support
11
- # @return [:legacy] for standard terminal
12
- # @return [:dumb] for non-interactive input (pipes etc.)
13
- # @return [:error] when input device is closed
10
+ #
11
+ # @return [:csi_u]
12
+ # when CSIu protocol support
13
+ # @return [:legacy]
14
+ # for standard terminal
15
+ # @return [:dumb]
16
+ # for non-interactive input (pipes etc.)
17
+ # @return [:error]
18
+ # when input device is closed
14
19
  def input_mode
15
- return @inp_mode.type if (@inp ||= find_inp) == READ_TTY_INP
16
- return :dumb if @inp == READ_DUMB_INP
17
- :error
20
+ @input_mode ||= find_input_mode
18
21
  end
19
22
 
20
23
  # Read next keyboard input.
@@ -27,44 +30,48 @@ module Terminal
27
30
  # @return [String] key name in `:named` mode
28
31
  # @return [[String, String]] key code and key name in `:both` mode
29
32
  def read_key(mode: :named)
30
- key = (@inp ||= find_inp).call or return
31
- return key if mode == :raw
32
- return key, @inp_mode.key_name(key) if mode == :both
33
- @inp_mode.key_name(key) || key
33
+ case input_mode
34
+ when :dumb
35
+ read_dumb(mode)
36
+ when :legacy
37
+ read_legacy(mode)
38
+ when :csi_u
39
+ read_csi_u(mode)
40
+ end
34
41
  end
35
42
 
36
43
  private
37
44
 
38
- def find_inp
39
- return READ_DUMB_INP unless STDIN.tty?
40
- return READ_TTY_INP if !ansi? || _write("\e[>1u\e[?u\e[c").nil?
41
- while true
42
- result = READ_TTY_INP.call
43
- if result.include?("\e[?1u")
44
- @inp_mode = CSIUMode
45
- at_exit { _write("\e[<u") } if ENV['ENV'] != 'test'
46
- end
47
- return READ_TTY_INP if result[-1] == 'c'
48
- end
49
- rescue IOError, SystemCallError
50
- -> {}
51
- ensure
52
- @inp_mode ||= LegacyMode
53
- end
54
- end
55
-
56
- READ_DUMB_INP =
57
- lambda do
58
- STDIN.getc
45
+ def read_dumb(mode)
46
+ translate_key(STDIN.getc, mode, DumbKeys)
59
47
  rescue Interrupt
60
- nil
48
+ translate_key("\x05", mode, DumbKeys)
61
49
  rescue IOError, SystemCallError
62
- @inp = -> {}
50
+ @input_mode = :error
63
51
  nil
64
52
  end
65
53
 
66
- READ_TTY_INP =
67
- lambda do
54
+ def read_legacy(mode) = translate_key(read_tty, mode, LegacyKeys)
55
+
56
+ def read_csi_u(mode)
57
+ if _write("\e[>1u")
58
+ key = read_tty
59
+ _write("\e[<u")
60
+ translate_key(key, mode, CSIuKeys)
61
+ else
62
+ @input_mode = :legacy
63
+ read_legacy(mode)
64
+ end
65
+ end
66
+
67
+ def translate_key(key, mode, translator)
68
+ return unless key
69
+ return key if mode == :raw
70
+ name = translator[key]
71
+ mode == :both ? [key, name] : name || key
72
+ end
73
+
74
+ def read_tty
68
75
  key = STDIN.getch
69
76
  while (nc = STDIN.read_nonblock(1, exception: false))
70
77
  String === nc ? key += nc : break
@@ -73,12 +80,33 @@ module Terminal
73
80
  rescue Interrupt
74
81
  key
75
82
  rescue IOError, SystemCallError
76
- @inp = READ_DUMB_INP
83
+ @input_mode = :error
77
84
  nil
78
85
  end
79
86
 
87
+ def find_input_mode
88
+ return :dumb unless STDIN.tty?
89
+ return :legacy if !ansi? || _write("\e[>1u\e[?u\e[c").nil? || !csi_u?
90
+ _write("\e[<u")
91
+ :csi_u
92
+ rescue IOError, SystemCallError
93
+ :error
94
+ end
95
+
96
+ def csi_u?
97
+ ret = false
98
+ while true
99
+ result = read_tty or return false
100
+ ret = true if result.include?("\e[?1u")
101
+ break if result[-1] == 'c'
102
+ end
103
+ ret
104
+ end
105
+ end
106
+
80
107
  dir = __dir__
81
- autoload :LegacyMode, "#{dir}/input/legacy_mode.rb"
82
- autoload :CSIUMode, "#{dir}/input/csiu_mode.rb"
83
- private_constant :READ_DUMB_INP, :READ_TTY_INP, :LegacyMode, :CSIUMode
108
+ autoload :CSIuKeys, "#{dir}/input/csiu_keys.rb"
109
+ autoload :DumbKeys, "#{dir}/input/dumb_keys.rb"
110
+ autoload :LegacyKeys, "#{dir}/input/legacy_keys.rb"
111
+ private_constant :CSIuKeys, :LegacyKeys
84
112
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Terminal
4
4
  # The version number of the gem.
5
- VERSION = '0.9.4'
5
+ VERSION = '0.9.5'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terminal_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Blumtritt
@@ -34,9 +34,9 @@ files:
34
34
  - lib/terminal/ansi/named_colors.rb
35
35
  - lib/terminal/detect.rb
36
36
  - lib/terminal/input.rb
37
- - lib/terminal/input/csiu_mode.rb
38
- - lib/terminal/input/legacy_mode.rb
39
- - lib/terminal/preload.rb
37
+ - lib/terminal/input/csiu_keys.rb
38
+ - lib/terminal/input/dumb_keys.rb
39
+ - lib/terminal/input/legacy_keys.rb
40
40
  - lib/terminal/rspec/helper.rb
41
41
  - lib/terminal/text.rb
42
42
  - lib/terminal/text/char_width.rb
@@ -49,7 +49,7 @@ metadata:
49
49
  rubygems_mfa_required: 'true'
50
50
  source_code_uri: https://codeberg.org/mblumtritt/Terminal.rb
51
51
  bug_tracker_uri: https://codeberg.org/mblumtritt/Terminal.rb/issues
52
- documentation_uri: https://rubydoc.info/gems/terminal_rb/0.9.4/Terminal
52
+ documentation_uri: https://rubydoc.info/gems/terminal_rb/0.9.5/Terminal
53
53
  rdoc_options: []
54
54
  require_paths:
55
55
  - lib
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../terminal'
4
- require_relative 'ansi/named_colors'
5
- require_relative 'text'
6
- require_relative 'text/char_width'
7
- require_relative 'detect'
8
- require_relative 'version'