YkLib 0.1.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 (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "pty"
4
+ require "Yk/io_aux"
5
+ require "Yk/path_aux"
6
+ require "Yk/selector"
7
+
8
+
9
+ module TtyRewrite
10
+ def handleIO (arr, bl)
11
+ if bl
12
+ begin
13
+ t = Process.detach arr[0].pid
14
+ t2 = Thread.new do
15
+ t.join
16
+ arr[0].close
17
+ if arr[0].respond_to? :selectors
18
+ arr[0].selectors.each do |s|
19
+ s.int
20
+ end
21
+ end
22
+ end
23
+ ret = bl.call *arr
24
+ t2.join
25
+ ret = !$?.exitstatus ? nil : $?.exitstatus == 0
26
+ ensure
27
+ arr.each do |e|
28
+ e.closed? || e.close
29
+ end
30
+ end
31
+ ret
32
+ else
33
+ arr
34
+ end
35
+ end
36
+ def pty_spawn3 (*args, &bl)
37
+ mio = nil
38
+ args.delete_if do |s|
39
+ if s.is_a? IO
40
+ mio = s
41
+ true
42
+ else
43
+ false
44
+ end
45
+ end
46
+ #if !mio.tty? || (CYGWIN || "/dev/" + `ps -p #{$$} -o tty`.split[1] != "/proc/#{$$}/fd/#{mio.to_i}".readlink)
47
+ # mio = nil
48
+ #else
49
+ stty = `stty -g`
50
+ #end
51
+ fp, slave = PTY.open
52
+ if fp
53
+ Exception.new("cannot allocate pseudo tty")
54
+ end
55
+ pid = fork do
56
+ Process.setsid
57
+ #Process.setpgrp
58
+ fq = File.open pty.slave, "rw"
59
+ fq.reopen fqFile
60
+ if mio
61
+ fq.attr = mio.attr
62
+ fq.winsz = mio.winsz
63
+ end
64
+ STDIN.reopen fq
65
+ STDOUT.reopen fq
66
+ STDERR.reopen fq
67
+ if stty
68
+ system "stty #{stty}"
69
+ end
70
+ fq.close
71
+ fp.close
72
+ exec *args
73
+ end
74
+ trap :WINCH do
75
+ fp.winsz = STDIN.winsz
76
+ Process.kill :WINCH, pid
77
+ end
78
+ fp.__defun__ :pid, pid
79
+ handleIO [fp], bl
80
+ end
81
+ module_function :handleIO, :pty_spawn3
82
+ end
83
+
84
+ #STDIN.set_raw do
85
+ # t1 = fp.transfer_to STDOUT
86
+ # t2 = STDIN.transfer_to fp
87
+ # t1.join
88
+ # t2.join
89
+ #end
90
+
91
+ # trap SIGWINCH ?ƃV?O?i???̓]???B
92
+
93
+ class String
94
+ def tty_rewrite &bl
95
+ [self].tty_rewrite &bl
96
+ end
97
+ end
98
+
99
+
100
+ class Array
101
+ def tty_rewrite
102
+ TtyRewrite.pty_spawn3 STDIN, *self do |fp|
103
+ STDIN.set_raw do
104
+ Selector.select do |s|
105
+ s.at_read STDIN do |buff|
106
+ buff == "" && closing = true
107
+ yield buff, "r", fp.pid
108
+ s.reserve_write fp, buff
109
+ if closing
110
+ s.reserve_write fp, nil
111
+ end
112
+ end
113
+ s.at_read fp do |buff|
114
+ buff == "" && closing = true
115
+ yield buff, "w", fp.pid
116
+ s.reserve_write STDOUT, buff
117
+ if closing
118
+ s.reserve_write STDOUT, nil
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+
128
+ if __FILE__.expand_path == $0.expand_path
129
+ def main
130
+ ARGV.tty_rewrite do |buff, mode|
131
+ case mode
132
+ when "r"
133
+
134
+ when "w"
135
+
136
+ end
137
+ end
138
+ end
139
+ main
140
+ end
141
+
142
+
@@ -0,0 +1,461 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'Yk/tty_char'
5
+
6
+
7
+ class TZWhen
8
+ def self.& obj
9
+ new obj
10
+ end
11
+ def initialize obj
12
+ @args = []
13
+ if obj.is_a? Symbol
14
+ @mname = obj
15
+ else
16
+ @obj = obj
17
+ end
18
+ end
19
+ def & ag
20
+ if !@obj
21
+ @obj = ag
22
+ else
23
+ (@args ||= []).push ag
24
+ end
25
+ return self
26
+ end
27
+ def === carg
28
+ if !@obj
29
+ carg.method(@mname).call *@args
30
+ elsif @mname
31
+ args = []
32
+ @args.each do |e|
33
+ if e == :_1
34
+ args.push carg
35
+ else
36
+ args.push e
37
+ end
38
+ end
39
+ @obj.method(@mname).call(*args)
40
+ else
41
+ raise Exception("unbound method")
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+ class String
48
+ class SGRStat
49
+ Reset = "\x1b[0m\x1b[39m\x1b[49m"
50
+ def << code
51
+ while code =~ /((((3|4)8);(5;\d+|2;\d+;\d+;\d+))|(\d+))($|;)/
52
+ tcCmd, cmd, code = $2, $6 ? $6.to_i : $3.to_i, $'
53
+ case cmd
54
+ when 0
55
+ @bold = nil
56
+ @thin = nil
57
+ @italic = nil
58
+ @underline = nil
59
+ @blink = nil
60
+ @reverse = nil
61
+ @hidden = nil
62
+ @strike = nil
63
+ @fgColor = nil
64
+ @bgColor = nil
65
+ when 1
66
+ @bold = true
67
+ when 2
68
+ @thin = true
69
+ when 3
70
+ @italic = true
71
+ when 4
72
+ @underline = true
73
+ when 5
74
+ @blink = :on
75
+ when 6
76
+ @blink = :quick
77
+ when 7
78
+ @reverse = true
79
+ when 8
80
+ @hidden = true
81
+ when 9
82
+ @strike = true
83
+ when 30 .. 37
84
+ @fgColor = code % 30
85
+ when 38
86
+ @fgColor = tCmd
87
+ when 39
88
+ @fgColor = -1
89
+ when 40 .. 47
90
+ @bgColor = code % 30
91
+ when 48
92
+ @bgColor = tCmd
93
+ when 49
94
+ @bgColor = -1
95
+ when 90 .. 97
96
+ @fgColor = code % 90 + 10
97
+ when 100 .. 107
98
+ @bgColor = code % 100 + 10
99
+ end
100
+ end
101
+ end
102
+ def restart
103
+ cmds = []
104
+ @bold && cmds.push(1)
105
+ @thin && cmds.push(2)
106
+ @italic && cmds.push(3)
107
+ @underline && cmds.push(4)
108
+ case @blink
109
+ when :on
110
+ cmds.push(5)
111
+ when :quick
112
+ cmds.push(6)
113
+ end
114
+ @reverse && cmds.push(7)
115
+ @hidden && cmds.push(8)
116
+ @strike && cmds.push(9)
117
+ case @fgColor
118
+ when 0..7
119
+ cmds.push(@fgColor + 30)
120
+ when 10..17
121
+ cmds.push(@fgColor + 80)
122
+ when -1
123
+ cmds.push(39)
124
+ when nil
125
+ else
126
+ cmds.push(38, *@fgColor.split(/;/))
127
+ end
128
+ case @bgColor
129
+ when 0..7
130
+ cmds.push(@bgColor + 40)
131
+ when 10..17
132
+ cmds.push(@bgColor + 90)
133
+ when -1
134
+ cmds.push(49)
135
+ when nil
136
+ else
137
+ cmds.push(48, *@bgColor.split(/;/))
138
+ end
139
+ "\x1b[#{cmds.map{|e| e.to_s}.join(';')}m"
140
+ end
141
+ end
142
+ def String.tty_char_width c
143
+ ->{
144
+ if c.size > 1
145
+ if c[0] == "\x1b"
146
+ return 0 # escape sequence
147
+ else
148
+ raise Exception("is not one character")
149
+ end
150
+ end
151
+ a = TTYChar::Alt[c]
152
+ if a
153
+ a.size
154
+ else
155
+ TTYChar::Width[c]
156
+ end
157
+ }[] || '\u{' + c.ord.to_s(16) + '}'.size
158
+ end
159
+ def tty_alt
160
+ ->{
161
+ a = TTYChar::Alt[self]
162
+ if a
163
+ a
164
+ elsif TTYChar::Width[self]
165
+ self
166
+ end
167
+ }[] || '\u{' + ord.to_s(16) + '}'
168
+ end
169
+ class TTYPos
170
+ def initialize buff, locOrTopTTYPos
171
+ end
172
+ def slice! #entityの場合、後続のアクサンを削除
173
+ end
174
+ def set pos
175
+ end
176
+ def < arg
177
+ end
178
+ def <= arg
179
+ end
180
+ def > arg
181
+ end
182
+ def >= arg
183
+ end
184
+ def +
185
+ end
186
+ def -
187
+ end
188
+ def move_tty_size
189
+ end
190
+ def set_at_entity pos
191
+ end
192
+ def tty_location
193
+ end
194
+ end
195
+ def is_combining?
196
+ TTYChar::Width[self] == 0
197
+ end
198
+ def is_attribute?
199
+ self =~ /^\x1b\[(\d+(;\d+)*)m$/
200
+ end
201
+ def is_escseq?
202
+ self =~ /\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)$/
203
+ end
204
+ def is_combinable?
205
+ if size == 1
206
+ ord = self.ord
207
+ if ord < 0x20 || (0x7f <= ord && ord <= 0x80) || org == 0xad
208
+ return false
209
+ end
210
+ if TTYChar::Width[self] == 1 || TTYChar::Width[self] == 2
211
+ return true
212
+ end
213
+ end
214
+ return false
215
+ end
216
+ def tty_width tabstop = 8
217
+ ret = 0
218
+ escRemoved = self.gsub /\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)/, ""
219
+ escRemoved.each_char do |c|
220
+ case c
221
+ when "\t"
222
+ ret = (ret.div tabstop) * tabstop
223
+ else
224
+ ret += TTYChar::Width[c]
225
+ end
226
+ end
227
+ ret
228
+ end
229
+ def tty_len range
230
+ tty_each do |c|
231
+
232
+ end
233
+ end
234
+ def tty_substr range
235
+
236
+ end
237
+ def _tty_width
238
+ ret = 0
239
+ escRemoved = self.gsub /\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)/, ""
240
+ escRemoved.each do |c|
241
+ ret += TTYChar::Width[c]
242
+ end
243
+ ret
244
+ end
245
+ def tty_slice! w
246
+ i = 0
247
+ each do |c|
248
+ cw = TTYChar::Width[c]
249
+ if w - cw < 0
250
+ break
251
+ end
252
+ i += 1
253
+ end
254
+ slice!(0...i)
255
+ end
256
+ class LetterDivider
257
+ def initialize &bl
258
+ @buff = ""
259
+ @block = bl
260
+ @gs = GStat.new
261
+ end
262
+ def flush
263
+ return if !@char
264
+ lmode = case @char
265
+ when " "
266
+ @forceLetter ? :non_space : :space
267
+ when "\t"
268
+ :tab
269
+ when TZWhen & "`'\"([{「『({〔[【‘“《〈‹«" & :include?
270
+ :no_last
271
+ when TZWhen & " 、。,.・:;!?」』)}〕]】!?%)\]},.:;'\"`’”》〉›»" & :include?
272
+ :no_first
273
+ else
274
+ :non_space
275
+ end
276
+ @block[@buff, @char, lmode, @gs]
277
+ @char = nil
278
+ @forceLetter = false
279
+ true
280
+ end
281
+ def << c
282
+ if c.is_combining?
283
+ if !@char || (!@char.is_combinable? && flush)
284
+ @char = " "
285
+ @buff += " "
286
+ end
287
+ @buff += c
288
+ @forceLetter = true
289
+ elsif c.is_attribute?
290
+ @buff += c
291
+ @gs << c
292
+ @gs = @gs.clone
293
+ elsif !c.is_escseq?
294
+ if @char
295
+ flush
296
+ else
297
+ @char = c
298
+ @buff += c
299
+ end
300
+ end
301
+ end
302
+ def close
303
+ flush if @char
304
+ end
305
+ end
306
+ NSPC = /[^ \t]/
307
+ NFST = /[^ 、。,.・:;!?」』)}〕]】!?%)\]},.:;'\"`’”》〉›»]/
308
+ NLST = /[^`'"(\[{「『({〔[【‘“《〈‹«]/
309
+ def tty_each_word
310
+ ret = ""
311
+ c = nil
312
+ last_char = nil
313
+ last_lmode = nil
314
+ last_gs = nil
315
+ ld = LetterDivider.new do |c, char, lmode, gs|
316
+ case Match::Tuple[last_char, char]
317
+ when [nil, /\w/], [/(\.|\-|\w)/, /\w/], [/\d/, /(\.|\-)/]
318
+ ret += c
319
+ else
320
+ case [last_mode, mode]
321
+ when [:non_space, :no_first], [:no_last, :non_space]
322
+ ret += c
323
+ else
324
+ yield ret, last_lmode, last_gs if ret != ""
325
+ ret.replace c
326
+ end
327
+ end
328
+ last_char = char
329
+ last_gs = gs
330
+ last_lmode = lmode
331
+ end
332
+ while res =~ /\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)/
333
+ c, nres = $&, $'
334
+ ld << c
335
+ end
336
+ yield ret, last_lmode, last_gs if ret != ""
337
+ end
338
+ def tty_each_line width, tabstop = 8, &bl
339
+ _tty_line width width, tabstop, &bl
340
+ end
341
+ def tty_line width, tabstop = 8
342
+ _tty_line width width, tabstop
343
+ end
344
+ def _tty_line width, tabstop = 8, &bl #block is needed if print multiline
345
+ ln = ""
346
+ isMultiLine = false
347
+ pos = 0
348
+ tty_each_word do |w, lmode, gs|
349
+ case lmode
350
+ when :tab
351
+ newPos = (pos.div tabstop) * tabstop
352
+ if newPos > width
353
+ ln += w.sub("\t", " " * (width - pos))
354
+ pos = width
355
+ else
356
+ ln += w.sub("\t", " " * (newPos - pos))
357
+ pos = newPos
358
+ end
359
+ when :space
360
+ if isMultiLine && pos == 0
361
+ ln += w.sub(" ", "")
362
+ next
363
+ end
364
+ else
365
+ newPos = pos + w._tty_width
366
+ if newPos > width
367
+ if pos > 0
368
+ ln += " " * (width - pos)
369
+ pos = 0
370
+ else
371
+ sliced = w.tty_slice!(width)
372
+ if sliced != ""
373
+ ln += sliced
374
+ end
375
+ end
376
+ if bl
377
+ bl.call ln + SGRStat::Reset
378
+ isMultiLine = true
379
+ else
380
+ return ln + SGRStat::Reset
381
+ end
382
+ ln.replace gs.restart
383
+ redo
384
+ else
385
+ ln += w
386
+ end
387
+ end
388
+ if pos >= width
389
+ if bl
390
+ bl.call ln + SGRStat::Reset
391
+ isMultiLine = true
392
+ else
393
+ return ln + SGRStat::Reset
394
+ end
395
+ ln.replace gs.restart
396
+ pos = 0
397
+ end
398
+ end
399
+ if bl
400
+ bl.call ln + SGRStat::Reset if ln != ""
401
+ else
402
+ return ln + SGRStat::Reset
403
+ end
404
+ end
405
+ InputConv = {
406
+ "\x1b[A" => :up,
407
+ "\x1b[B" => :down,
408
+ "\x1b[C" => :right,
409
+ "\x1b[D" => :left,
410
+ "\x1b[5~" => :pgaeUp,
411
+ "\x1b[6~" => :pgaeDown,
412
+ "\x1b[H" => :home,
413
+ "\x1b[F" => :end,
414
+ "\x1b[3" => :del,
415
+ "\x7f" => :bs,
416
+ "\r" => :enter,
417
+ "\x1bOR" => :f3,
418
+ "\x1b[1;2R" => :F3,
419
+ "\x1b" => :esc,
420
+ "\u0003" => :INT
421
+ }
422
+ def tty_each
423
+ res = self
424
+ while res =~ /^(\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)|.)/
425
+ yield $&
426
+ res = $'
427
+ end
428
+ end
429
+ def tty_each_input
430
+ res = self
431
+ while res =~ /^(\x1b(\[(\d+(;\d+)*|)([^\d;])|[O#()].|.)|.)/
432
+ c = $&
433
+ cv = InputConv[c]
434
+ if !cv && (c.ord < 0x20 || (0x80 <= c.ord && c.ord <= 0x9f))
435
+ cv = c.intern
436
+ end
437
+ yield cv || c
438
+ res = $'
439
+ end
440
+ end
441
+ end
442
+
443
+
444
+ if __FILE__ == $0
445
+ require 'Yk/fib'
446
+ require 'Yk/path_aux'
447
+ require 'Yk/debug2'
448
+ Fib.spawn do
449
+ "/proc/#{$$}/fd/0".readlink.open "rw" do |fp|
450
+ fp.set_raw
451
+ buff = ""
452
+ loop do
453
+ c = Fib.read fp, buff
454
+ buff.tty_each_input do |c|
455
+ print c.inspect + "\r\n"
456
+ end
457
+ end
458
+ end
459
+ end
460
+ end
461
+
@@ -0,0 +1,114 @@
1
+ [0x0000, -1], [0x0020, 1], [0x007f, -1], [0x009b, -1], [0x009c, -1],
2
+ [0x00a0, 1], [0x00a7, -1], [0x00a9, 1], [0x00b0, -1], [0x00b2, 1],
3
+ [0x00b4, -1], [0x00b5, 1], [0x00b6, -1], [0x00b7, 1], [0x00d7, -1],
4
+ [0x00d8, 1], [0x00f7, -1], [0x00f8, 1], [0x01ce, -1], [0x01cf, 1],
5
+ [0x01d0, -1], [0x01d1, 1], [0x01d2, -1], [0x01d3, 1], [0x01d4, -1],
6
+ [0x01d5, 1], [0x01d6, -1], [0x01d7, 1], [0x01d8, -1], [0x01d9, 1],
7
+ [0x01da, -1], [0x01db, 1], [0x01dc, -1], [0x01dd, 1], [0x02ca, -1],
8
+ [0x02cc, 1], [0x0300, -1], [0x0370, 1], [0x0391, -1], [0x03a2, 1],
9
+ [0x03a3, -1], [0x03aa, 1], [0x03b1, -1], [0x03c2, 1], [0x03c3, -1],
10
+ [0x03ca, 1], [0x0401, -1], [0x0402, 1], [0x0410, -1], [0x0450, 1],
11
+ [0x0451, -1], [0x0452, 1], [0x0483, -1], [0x0487, 1], [0x0488, -1],
12
+ [0x048a, 1], [0x0591, -1], [0x05be, 1], [0x05bf, -1], [0x05c0, 1],
13
+ [0x05c1, -1], [0x05c3, 1], [0x05c4, -1], [0x05c6, 1], [0x05c7, -1],
14
+ [0x05c8, 1], [0x0600, -1], [0x0604, 1], [0x0610, -1], [0x0616, 1],
15
+ [0x064b, -1], [0x065f, 1], [0x0670, -1], [0x0671, 1], [0x06d6, -1],
16
+ [0x06e5, 1], [0x06e7, -1], [0x06e9, 1], [0x06ea, -1], [0x06ee, 1],
17
+ [0x070f, -1], [0x0710, 1], [0x0711, -1], [0x0712, 1], [0x0730, -1],
18
+ [0x074b, 1], [0x07a6, -1], [0x07b1, 1], [0x07eb, -1], [0x07f4, 1],
19
+ [0x0901, -1], [0x0903, 1], [0x093c, -1], [0x093d, 1], [0x0941, -1],
20
+ [0x0949, 1], [0x094d, -1], [0x094e, 1], [0x0951, -1], [0x0955, 1],
21
+ [0x0962, -1], [0x0964, 1], [0x0981, -1], [0x0982, 1], [0x09bc, -1],
22
+ [0x09bd, 1], [0x09c1, -1], [0x09c5, 1], [0x09cd, -1], [0x09ce, 1],
23
+ [0x09e2, -1], [0x09e4, 1], [0x0a01, -1], [0x0a03, 1], [0x0a3c, -1],
24
+ [0x0a3d, 1], [0x0a41, -1], [0x0a43, 1], [0x0a47, -1], [0x0a49, 1],
25
+ [0x0a4b, -1], [0x0a4e, 1], [0x0a70, -1], [0x0a72, 1], [0x0a81, -1],
26
+ [0x0a83, 1], [0x0abc, -1], [0x0abd, 1], [0x0ac1, -1], [0x0ac6, 1],
27
+ [0x0ac7, -1], [0x0ac9, 1], [0x0acd, -1], [0x0ace, 1], [0x0ae2, -1],
28
+ [0x0ae4, 1], [0x0b01, -1], [0x0b02, 1], [0x0b3c, -1], [0x0b3d, 1],
29
+ [0x0b3f, -1], [0x0b40, 1], [0x0b41, -1], [0x0b44, 1], [0x0b4d, -1],
30
+ [0x0b4e, 1], [0x0b56, -1], [0x0b57, 1], [0x0b82, -1], [0x0b83, 1],
31
+ [0x0bc0, -1], [0x0bc1, 1], [0x0bcd, -1], [0x0bce, 1], [0x0c3e, -1],
32
+ [0x0c41, 1], [0x0c46, -1], [0x0c49, 1], [0x0c4a, -1], [0x0c4e, 1],
33
+ [0x0c55, -1], [0x0c57, 1], [0x0cbc, -1], [0x0cbd, 1], [0x0cbf, -1],
34
+ [0x0cc0, 1], [0x0cc6, -1], [0x0cc7, 1], [0x0ccc, -1], [0x0cce, 1],
35
+ [0x0ce2, -1], [0x0ce4, 1], [0x0d41, -1], [0x0d44, 1], [0x0d4d, -1],
36
+ [0x0d4e, 1], [0x0dca, -1], [0x0dcb, 1], [0x0dd2, -1], [0x0dd5, 1],
37
+ [0x0dd6, -1], [0x0dd7, 1], [0x0e31, -1], [0x0e32, 1], [0x0e34, -1],
38
+ [0x0e3b, 1], [0x0e47, -1], [0x0e4f, 1], [0x0eb1, -1], [0x0eb2, 1],
39
+ [0x0eb4, -1], [0x0eba, 1], [0x0ebb, -1], [0x0ebd, 1], [0x0ec8, -1],
40
+ [0x0ece, 1], [0x0f18, -1], [0x0f1a, 1], [0x0f35, -1], [0x0f36, 1],
41
+ [0x0f37, -1], [0x0f38, 1], [0x0f39, -1], [0x0f3a, 1], [0x0f71, -1],
42
+ [0x0f7f, 1], [0x0f80, -1], [0x0f85, 1], [0x0f86, -1], [0x0f88, 1],
43
+ [0x0f90, -1], [0x0f98, 1], [0x0f99, -1], [0x0fbd, 1], [0x0fc6, -1],
44
+ [0x0fc7, 1], [0x102d, -1], [0x1031, 1], [0x1032, -1], [0x1033, 1],
45
+ [0x1036, -1], [0x1038, 1], [0x1039, -1], [0x103a, 1], [0x1058, -1],
46
+ [0x105a, 1], [0x1100, 2], [0x1160, -1], [0x1200, 1], [0x135f, -1],
47
+ [0x1360, 1], [0x1712, -1], [0x1715, 1], [0x1732, -1], [0x1735, 1],
48
+ [0x1752, -1], [0x1754, 1], [0x1772, -1], [0x1774, 1], [0x17b4, -1],
49
+ [0x17b6, 1], [0x17b7, -1], [0x17be, 1], [0x17c6, -1], [0x17c7, 1],
50
+ [0x17c9, -1], [0x17d4, 1], [0x17dd, -1], [0x17de, 1], [0x180b, -1],
51
+ [0x180e, 1], [0x18a9, -1], [0x18aa, 1], [0x1920, -1], [0x1923, 1],
52
+ [0x1927, -1], [0x1929, 1], [0x1932, -1], [0x1933, 1], [0x1939, -1],
53
+ [0x193c, 1], [0x1a17, -1], [0x1a19, 1], [0x1b00, -1], [0x1b04, 1],
54
+ [0x1b34, -1], [0x1b35, 1], [0x1b36, -1], [0x1b3b, 1], [0x1b3c, -1],
55
+ [0x1b3d, 1], [0x1b42, -1], [0x1b43, 1], [0x1b6b, -1], [0x1b74, 1],
56
+ [0x1dc0, -1], [0x1dcb, 1], [0x1dfe, -1], [0x1e00, 1], [0x200b, -1],
57
+ [0x2011, 1], [0x2015, -1], [0x2017, 1], [0x2018, -1], [0x201a, 1],
58
+ [0x201c, -1], [0x201e, 1], [0x2020, -1], [0x2022, 1], [0x2025, -1],
59
+ [0x2027, 1], [0x202a, -1], [0x202f, 1], [0x2030, -1], [0x2031, 1],
60
+ [0x2032, -1], [0x2034, 1], [0x203b, -1], [0x203c, 1], [0x2060, -1],
61
+ [0x2064, 1], [0x206a, -1], [0x2070, 1], [0x20d0, -1], [0x20f0, 1],
62
+ [0x2103, -1], [0x2104, 1], [0x2116, -1], [0x2117, 1], [0x2121, -1],
63
+ [0x2122, 1], [0x212b, -1], [0x212c, 1], [0x2160, -1], [0x216c, 1],
64
+ [0x2170, -1], [0x217a, 1], [0x2189, -1], [0x218a, 1], [0x2190, -1],
65
+ [0x2194, 1], [0x21d2, -1], [0x21d3, 1], [0x21d4, -1], [0x21d5, 1],
66
+ [0x2200, -1], [0x2201, 1], [0x2202, -1], [0x2204, 1], [0x2207, -1],
67
+ [0x2209, 1], [0x220b, -1], [0x220c, 1], [0x2211, -1], [0x2212, 1],
68
+ [0x221a, -1], [0x221b, 1], [0x221d, -1], [0x2221, 1], [0x2225, -1],
69
+ [0x2226, 1], [0x2227, -1], [0x222d, 1], [0x222e, -1], [0x222f, 1],
70
+ [0x2234, -1], [0x2236, 1], [0x223d, -1], [0x223e, 1], [0x2252, -1],
71
+ [0x2253, 1], [0x2260, -1], [0x2262, 1], [0x2266, -1], [0x2268, 1],
72
+ [0x226a, -1], [0x226c, 1], [0x2282, -1], [0x2284, 1], [0x2286, -1],
73
+ [0x2288, 1], [0x22a5, -1], [0x22a6, 1], [0x22bf, -1], [0x22c0, 1],
74
+ [0x2312, -1], [0x2313, 1], [0x231a, -1], [0x231b, 1], [0x2328, -1],
75
+ [0x2329, 2], [0x232b, 1], [0x23e9, -1], [0x23eb, 1], [0x23ed, -1],
76
+ [0x23ef, 1], [0x23f0, -1], [0x23f3, 1], [0x23f8, -1], [0x23fb, 1],
77
+ [0x2460, -1], [0x24ea, 1], [0x24eb, -1], [0x2500, 1], [0x25a0, -1],
78
+ [0x25a2, 1], [0x25b2, -1], [0x25b4, 1], [0x25bc, -1], [0x25be, 1],
79
+ [0x25c6, -1], [0x25c8, 1], [0x25cb, -1], [0x25cc, 1], [0x25ce, -1],
80
+ [0x25d0, 1], [0x25ef, -1], [0x25f0, 1], [0x25fb, -1], [0x25ff, 1],
81
+ [0x2600, -1], [0x2607, 1], [0x2609, -1], [0x260a, 1], [0x260e, -1],
82
+ [0x2610, 1], [0x2611, -1], [0x2612, 1], [0x2614, -1], [0x2616, 1],
83
+ [0x2618, -1], [0x2619, 1], [0x261c, -1], [0x261f, 1], [0x2620, -1],
84
+ [0x2621, 1], [0x2622, -1], [0x2624, 1], [0x2626, -1], [0x2627, 1],
85
+ [0x262a, -1], [0x262b, 1], [0x262e, -1], [0x2630, 1], [0x2638, -1],
86
+ [0x2639, 1], [0x2640, -1], [0x2641, 1], [0x2642, -1], [0x2643, 1],
87
+ [0x2648, -1], [0x2654, 1], [0x265f, -1], [0x2660, 1], [0x2668, -1],
88
+ [0x2669, 1], [0x266a, -1], [0x266b, 1], [0x266d, -1], [0x266e, 1],
89
+ [0x266f, -1], [0x2670, 1], [0x267b, -1], [0x267c, 1], [0x267e, -1],
90
+ [0x267f, 1], [0x2692, -1], [0x2693, 1], [0x2694, -1], [0x2695, 1],
91
+ [0x2696, -1], [0x2698, 1], [0x2699, -1], [0x269a, 1], [0x269b, -1],
92
+ [0x269d, 1], [0x269e, -1], [0x26a1, 1], [0x26aa, -1], [0x26ac, 1],
93
+ [0x26b0, -1], [0x26b1, 1], [0x26bd, -1], [0x26c0, 1], [0x26c4, -1],
94
+ [0x26e2, 1], [0x26e3, -1], [0x26e4, 1], [0x26e8, -1], [0x2700, 1],
95
+ [0x2702, -1], [0x2703, 1], [0x2705, -1], [0x2706, 1], [0x2708, -1],
96
+ [0x270e, 1], [0x270f, -1], [0x2710, 1], [0x2712, -1], [0x2713, 1],
97
+ [0x2714, -1], [0x2715, 1], [0x2716, -1], [0x2717, 1], [0x271d, -1],
98
+ [0x271e, 1], [0x2721, -1], [0x2722, 1], [0x2728, -1], [0x2729, 1],
99
+ [0x2733, -1], [0x2735, 1], [0x273d, -1], [0x273e, 1], [0x2744, -1],
100
+ [0x2745, 1], [0x2747, -1], [0x2748, 1], [0x274c, -1], [0x274d, 1],
101
+ [0x274e, -1], [0x274f, 1], [0x2753, -1], [0x2755, 1], [0x2763, -1],
102
+ [0x2765, 1], [0x2776, -1], [0x2780, 1], [0x2795, -1], [0x2798, 1],
103
+ [0x27a1, -1], [0x27a2, 1], [0x27b0, -1], [0x27b1, 1], [0x27bf, -1],
104
+ [0x27c0, 1], [0x2b05, -1], [0x2b08, 1], [0x2b1b, -1], [0x2b1d, 1],
105
+ [0x2b50, -1], [0x2b51, 1], [0x2b55, -1], [0x2b5a, 1], [0x2e80, 2],
106
+ [0x302a, -1], [0x3030, 2], [0x303f, 1], [0x3040, -1], [0x3041, 2],
107
+ [0x3097, -1], [0x309b, 2], [0x3100, -1], [0x3105, 2], [0x312f, -1],
108
+ [0x3131, 2], [0x318f, -1], [0x3190, 2], [0x4dc0, -1], [0x4e00, 2],
109
+ [0xa4c7, -1], [0xa4d0, 1], [0xa806, -1], [0xa807, 1], [0xa80b, -1],
110
+ [0xa80c, 1], [0xa825, -1], [0xa827, 1], [0xa960, -1], [0xa97d, 1],
111
+ [0xac00, 2], [0xd7a4, 1], [0xd800, -1], [0xf900, 2], [0xfb00, 1],
112
+ [0xfb1e, -1], [0xfb1f, 1], [0xfe00, -1], [0xfe24, 1], [0xfe30, 2],
113
+ [0xfe6c, -1], [0xfe70, 1], [0xfeff, -1], [0xff01, 2], [0xff61, 1],
114
+ [0xffe0, 2], [0xffe7, 1], [0xfff9, -1], [0xfffc, 1]