YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,119 @@
1
+
2
+
3
+ class AdhocLiterals
4
+ class Email
5
+ def initialize arg
6
+ @literal = arg
7
+ end
8
+ end
9
+ def self.__email__ arg
10
+ Email.new arg
11
+ end
12
+ end
13
+
14
+
15
+ class GrammerExt
16
+ class Indenter
17
+ EMAIL_HEAD = "AdhocLietarls::__email__("
18
+ def checkEmail st
19
+ if st.is_a? Integer # called from :bare
20
+ atPos = st if @expr[st] == "@"
21
+ i = st
22
+ i += 1 if @expr[i] == "}" #embeded expression closing
23
+ k = nil
24
+ while o = @expr[i]
25
+ if !atPos
26
+ case o
27
+ when "@"
28
+ atPos = i
29
+ when "#" #embeded expression do not allow first ".", "/", "?", "*", "{}", "[]", otherwise use #wpd{...}, w:wild([],{}.?,*), p:period(.), d:directory(/)
30
+ k = checkExtendedEmbExpr(i, :email)
31
+ when /[()<>[\\\]:;@,"]/
32
+ return nil
33
+ else
34
+ if o.ord <= 0x20
35
+ return nil
36
+ end
37
+ end
38
+ else
39
+ case o.ord
40
+ when ?A.ord .. ?Z.ord, ?a.ord .. ?z.ord, ?0.ord .. ?9.ord, ?..ord, ?-.ord
41
+ when "#" #embeded expression do not allow first ".", "/", "?", "*", "{}", "[]", otherwise use #wpd{...}, w:wild([],{}.?,*), p:period(.), d:directory(/)
42
+ k = checkExtendedEmbExpr(i, :email)
43
+ else
44
+ if o.ord < 0x80
45
+ if atPos != i - 1
46
+ yield i - 1
47
+ else
48
+ return nil
49
+ end
50
+ end
51
+ end
52
+ end
53
+ if !k
54
+ i += 1
55
+ else
56
+ i = k + 1
57
+ k = nil
58
+ end
59
+ end
60
+ else # tenum
61
+ tenum = st
62
+ t = token = tenum.peek
63
+ st = token.first
64
+ if t.dprev&.kind == :on_tstring_end && t.dprev.beginner.str == "\""
65
+ org = t.beginner.first
66
+ orgIsQ = true
67
+ else
68
+ i = token.first - 1
69
+ while o = @expr[i]
70
+ case o
71
+ when /[()<>[\\\]:;@,"]/
72
+ break
73
+ else
74
+ if o.ord <= 0x20
75
+ break
76
+ end
77
+ end
78
+ i -= 1
79
+ end
80
+ i += 1
81
+ if expr[i] == "@"
82
+ return nil
83
+ end
84
+ org = i
85
+ end
86
+ i = token.first + 1
87
+ ed = nil
88
+ while o = @expr[i]
89
+ case o.ord
90
+ when ?A.ord .. ?Z.ord, ?a.ord .. ?z.ord, ?0.ord .. ?9.ord, ?..ord, ?-.ord
91
+ when "#" #embeded expression do not allow first ".", "/", "?", "*", "{}", "[]", otherwise use #wpd{...}, w:wild([],{}.?,*), p:period(.), d:directory(/)
92
+ k = checkExtendedEmbExpr(i, :email)
93
+ else
94
+ if o.ord < 0x80
95
+ if atPos != i - 1
96
+ ed = i - 1
97
+ break
98
+ else
99
+ return nil
100
+ end
101
+ end
102
+ end
103
+ if !k
104
+ i += 1
105
+ else
106
+ i = k + 1
107
+ k = nil
108
+ end
109
+ end
110
+ if orgIsQ
111
+ @expr[org .. ed] = EMAIL_HEAD + '"\\' + @expr[org...st - 1] + '\"' + @expr[st .. ed] + ")"
112
+ else
113
+ @expr[org .. ed] = EMAIL_HEAD + @expr[org .. ed] + ")"
114
+ end
115
+ raise Restart.new
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,402 @@
1
+
2
+
3
+ class AdhocLiterals
4
+ class Path
5
+ def initialize arg
6
+ @literal = arg
7
+ end
8
+ end
9
+ def self.__path__ arg
10
+ Path.new arg
11
+ end
12
+ end
13
+
14
+
15
+ class GrammerExt
16
+ class Indenter
17
+ PATH_HEAD = "AdhocLiterals::__path__("
18
+ BOTH_HEAD = "AdhocLiterals::__reg_path__("
19
+ CSelectInPathRegExpr = '\[(\!|\^|)(\\\-|\.|\~|\w|[A-Z]\-[A-Z]|[a-z]\-[a-z]|[0-9]\-[0-9])*\]'
20
+ CSelectInPathRegExprPrev = Regexp.new(CSelectInPathRegExpr + '$')
21
+ CSelectInPathRegExprCur = Regexp.new('^' + CSelectInPathRegExpr)
22
+ def mayConcatenatePath t
23
+ if t.kind != :on_nl && t.kind != :on_sp && !@expr.anot[t.first]
24
+ ett = tt = t.prev
25
+ if fap, mode = @expr.anot[tt.first]
26
+ modeList.unshift [mode, tt.first]
27
+ loop do
28
+ begin
29
+ ftt = tt
30
+ tt = tt.prev
31
+ end until fap != (tfap, mode = @expr.anot[tt.first])[0]
32
+ if mode
33
+ modeList.unshift [mode, tt.first]
34
+ else
35
+ break
36
+ end
37
+ fap = tfap
38
+ end
39
+ if modeList.size > 1
40
+ modeList.each_cons 2 do |f, n|
41
+ case [f[0][0], n[0][0]]
42
+ when [:sl_beg, :sl_beg],
43
+ [:sl_beg, :sl_both],
44
+ [:sl_middle, :sl_beg],
45
+ [:sl_middle, :sl_both],
46
+ [:sl_end, :sl_end],
47
+ [:sl_end, :sl_middle],
48
+ [:sl_both, :sl_end],
49
+ [:sl_both, :sl_middle],
50
+ [:sl_url, :sl_beg],
51
+ [:sl_url, :sl_both]
52
+ else
53
+ raise Error.new("cannot concatenate path")
54
+ end
55
+ end
56
+ end
57
+ toConcatenate = @expr[ftt.first...ett.first + ett.str.size]
58
+ head = if defined?(AdhocLiterals::Url) && @expr[ftt.iops] =~ /^[a-zA-Z][a-zA-Z0-9\.+\-]*:/
59
+ URL_HEAD
60
+ elsif defined?(AdhocLiterals::Path)
61
+ modeList[0][1] == :both ? BOTH_HEAD : PATH_HEAD
62
+ end
63
+ if head
64
+ @expr[ftt.first...ett.first + ett.str.size] = head + toConcatenate + ")"
65
+ @expr.clear_anot
66
+ raise Restart.new
67
+ end
68
+ end
69
+ end
70
+ end
71
+ def pathRestart st, ed, pstack, mode
72
+ subst = ""
73
+ inDQ = false
74
+ dqStart = nil
75
+ if st < pstack[0]
76
+ if !["'", '"'].include? @expr[st]
77
+ subst += '"'
78
+ dqStart = st
79
+ inDQ = true
80
+ end
81
+ end
82
+ pstack.each_index do |idx|
83
+ i, j = pstack[idx], pstack[idx + 1]
84
+ if inDQ
85
+ if j
86
+ if i + 1 == j
87
+ next
88
+ elsif ["'", '"'].include? @expr[i + 1]
89
+ subst += @expr[dqStart .. i] + '"'
90
+ inDQ = false
91
+ end
92
+ end
93
+ else
94
+ subst += '"'
95
+ dqStart = i
96
+ inDQ = true
97
+ end
98
+ end
99
+ # inDQ should be true
100
+ if ed - 1 > pstack[-1]
101
+ if ["'", '"'].include? @expr[ed - 1]
102
+ subst += @expr[dqStart .. pstack[-1]] + '"' + @expr[pstack[-1] + 1 ... ed]
103
+ else
104
+ subst += @expr[dqStart ... ed] + '"'
105
+ end
106
+ else
107
+ subst += '"'
108
+ end
109
+ emode = case [@expr[st] == "/", @expr[ed] == "/"]
110
+ when [true, true]
111
+ :sl_both
112
+ when [true, false]
113
+ :sl_beg
114
+ when [false, true]
115
+ :sl_end
116
+ when [false, false]
117
+ :sl_middle
118
+ end
119
+ @expr.ssubst st...ed, subst, [mode, emode]
120
+ raise Restart.new
121
+ end
122
+ # /"can use backslash escape" :path
123
+ # /cannot_use_backslash_escape :path
124
+ # /using\ backslash\ / :regexp
125
+ # /path[)}\]] :path and closing ')', '}', ']'
126
+ # /path,(\s|$) :path '/path' and comma operator
127
+ # /path\s :path '/path'
128
+ # /foo/i :both functional object '/foo/i', without space and backslash until closing '/'
129
+ # /foo/.to_s :path '/foo/.to_s'
130
+ # /foo/ .to_s :both functional object '/foo/' calling method '.to_s'
131
+ # / a :devide operator
132
+ # /ab[)\]}] :path, '/ab' and parenthesis/bracket/brace closing
133
+ # /ab,(\s|$) :path, '/ab' and comma operator
134
+ # /ab,c :path, '/ab,c'
135
+ # /"ab c" :path
136
+ # /"ab c"aaa :error
137
+ # /abc"aa :error
138
+ # /abc"aa/ :regexp
139
+ # /abc"aa / :error: path '/abc"aa', '/'
140
+ # /"abc / regexp
141
+ # /"abc/" error, path segment cannot contain '/'
142
+ # /"abc\/" error, path segment cannot contain '/'
143
+ # /\"abc d/ regexp
144
+ # /* c comment start
145
+ #
146
+ def checkPath st, origin = nil, pstack = []
147
+ firstSlash = @expr[st] == "/"
148
+ bstack = []
149
+ i = st
150
+ i += 1 if @expr[i] == "}" #embeded expression closing
151
+ k = nil
152
+ res = nil
153
+ mode = origin && st != origin ? :path : nil
154
+ while o = @expr[i]
155
+ case o
156
+ when "/"
157
+ pstack.push i
158
+ if pstack.size == 3
159
+ mode = :path
160
+ end
161
+ rp = i
162
+ while ["'", '"'].include? @expr[i + 1]
163
+ i = getStringEndExceptSlash(i + 1)
164
+ if !i
165
+ raise Error.new("cannot find string end, #{@expr[i + 1]}")
166
+ else
167
+ j = i
168
+ while @expr[i + 1] == "/"
169
+ i += 1
170
+ pstack.push i
171
+ end
172
+ end
173
+ end
174
+ if rp != i
175
+ mode = :path
176
+ if @expr[i] != "/"
177
+ break # /"foo"[^\/]
178
+ end
179
+ #else continue after "/"
180
+ end
181
+ when ",", ";"
182
+ if @expr[i, 2] =~ /^.(\s|$)/
183
+ break
184
+ end
185
+ when '"', "'", "`"
186
+ break
187
+ when ")", "]", "}" #orphan
188
+ break
189
+ when "[", "{", "("
190
+ break if !firstSlash
191
+ if !(k = getClosing(i))
192
+ raise Error.new("cannot find closing #{@expr[i]}")
193
+ end
194
+ when "#" #embeded expression do not allow first ".", "/", "?", "*", "{}", "[]", otherwise use #wpd{...}, w:wild([],{}.?,*), p:period(.), d:directory(/)
195
+ k = checkExtendedEmbExpr(i, :path)
196
+ when "\\"
197
+ if mode == :path || pstack.size >= 2
198
+ raise Error.new("path expression without double quotation cannot contain bare backslash, '\\'")
199
+ else
200
+ mode = :regexp
201
+ break
202
+ end
203
+ when /\s/
204
+ break
205
+ else
206
+ if o < 0x20
207
+ raise Error.new("cannot use control character, chr(0x0x#{o.t_s.sprintf('%02x')})")
208
+ end
209
+ end
210
+ if !k
211
+ i += 1
212
+ else
213
+ i = k + 1
214
+ k = nil
215
+ end
216
+ end
217
+ if !mode && pstack.size == 2
218
+ ropts = "uesnmxi"
219
+ j = 1
220
+ while (c = @expr[pstack[1] + j]) && (roi = ropts.index(c))
221
+ ropts.slice!(roi)
222
+ ++j
223
+ end
224
+ if j != 1 && @expr[pstack[1] + j - 1, 2] =~ /.\b/
225
+ mode = :both
226
+ else
227
+ mode = :path
228
+ end
229
+ end
230
+ if pstack.size != 0
231
+ if firstSlash
232
+ if !origin || origin == st
233
+ pathRestart @expr, st, i, pstack, mode
234
+ else
235
+ pathRestart @expr, origin, i, pstack, mode
236
+ end
237
+ else
238
+ yield i, pstack
239
+ end
240
+ end
241
+ end
242
+ def checkPrevIsPath tenum, st = nil, ed = nil, pstack = nil
243
+ if tenum
244
+ t = token = tenum.peek
245
+ last = nil
246
+ while t.dprev&.kind == :on_tstring_end && ['"', "'"].include?(t.dprev.beginner.str[0])
247
+ t = t.beginner
248
+ end
249
+ if t != token
250
+ checkPath token.first, t.first # no return raise Restart
251
+ end
252
+ i = token.first
253
+ else
254
+ i = st
255
+ end
256
+ k = nil
257
+ while o = @expr[i]
258
+ case o
259
+ when "[", "{", "("
260
+ break
261
+ when "]", "}", ")"
262
+ #if !(k = getOpening(@expr, i))
263
+ break
264
+ #end
265
+ when "\\", '"', "'", '`'
266
+ break
267
+ when 0x20
268
+ if @expr[i - 1] == "\\"
269
+ i -= 1
270
+ else
271
+ break
272
+ end
273
+ else
274
+ if o < 0x20
275
+ break
276
+ end
277
+ end
278
+ if k
279
+ i = k - 1
280
+ k = nil
281
+ else
282
+ i -= 1
283
+ end
284
+ end
285
+ if tenum
286
+ checkPath token.first, i + 1
287
+ else
288
+ pathRestart i + 1, ed, pstack, :path
289
+ end
290
+ end
291
+
292
+ end
293
+ end
294
+
295
+
296
+ =begin
297
+
298
+ case foo
299
+ when /etc, / # Pathname("/etc"), Pathname("/")
300
+ ...
301
+ end
302
+
303
+ ROOT (do|then|else|end|ensure|when|in|rescue|elsif|if|unless) #ok
304
+ ROOT \w+ #ng
305
+ ROOT ! #ng
306
+ ROOT # #ok: comment
307
+ ROOT# #ng
308
+ ROOT $[^\s] #ng
309
+ ROOT $\s #ng
310
+ ROOT %{ #ng
311
+ ROOT %[^{] #ng
312
+ ROOT & #ng
313
+ ROOT ' #ng
314
+ ROOT ( #ng
315
+ ROOT ) #ok
316
+ ROOT) #ok
317
+ ROOT * #ng
318
+ ROOT+ #ng
319
+ ROOT + #ok
320
+ ROOT += #ng
321
+ ROOT , #ok
322
+ ROOT, #ok
323
+ ROOT - #ng
324
+ ROOT .\w+ #ok
325
+ ROOT . #ng
326
+ ROOT / ... #reference below
327
+ ROOT /[^\s]+ #ng
328
+ ROOT :[^\s] #ng, symbol
329
+ ROOT :\s #ok operator, ? :
330
+ ROOT: #ng
331
+ ROOT ; #ok
332
+ ROOT; #ok
333
+ ROOT < #ng
334
+ ROOT = #ng
335
+ ROOT => #ok
336
+ ROOT=> #ng
337
+ ROOT < #ng
338
+ ROOT ? #ng
339
+ ROOT [ #ng
340
+ ROOT \ #ng
341
+ ROOT ] #ok
342
+ ROOT] #ok
343
+ ROOT ^ #ng
344
+ ROOT _.* #ng
345
+ ROOT { #ok, maybe iterator
346
+ ROOT | #ng
347
+ ROOT } #ok
348
+ ROOT} #ok
349
+ ROOT ~ #ng
350
+
351
+ divide operator after root path
352
+
353
+ ROOT / \w+ #ok
354
+ ROOT / ! #ok: not operator
355
+ ROOT /# #ok: comment
356
+ ROOT / $[^\s] #ok: global variable
357
+ ROOT / $\s #ng
358
+ ROOT / %{ #ok: percent expression
359
+ ROOT / %[^{] #ng
360
+ ROOT / & #ng
361
+ ROOT / ' #ok: string literal
362
+ ROOT / ( #ok: bracket open
363
+ ROOT / ) #ng
364
+ ROOT / * #ng
365
+ ROOT / + #ng
366
+ ROOT / , #ng
367
+ ROOT / - #ng
368
+ ROOT / . #ng
369
+ ROOT / / #ng
370
+ ROOT / /\w+ #ng: cannot catenate absolute path or regular expression
371
+ ROOT / :[^\s] #ok: symbol
372
+ ROOT / :\s #ng: operator, ? :
373
+ ROOT / ; #ng
374
+ ROOT / < #ng
375
+ ROOT /= #ok
376
+ ROOT / = #ng
377
+ ROOT / < #ng
378
+ ROOT / ? #ng
379
+ ROOT / [ #ng
380
+ ROOT / \ #ng
381
+ ROOT / ] #ng
382
+ ROOT / { #ng
383
+ ROOT / ^ #ng
384
+ ROOT / _.* #ok
385
+ ROOT / { #ng
386
+ ROOT / | #ng
387
+ ROOT / } #ok
388
+ ROOT / ~ #ok
389
+
390
+ ROOT_DIR = /etc/ # also used as regexpr
391
+ ROOT = /
392
+ | /etc
393
+ PATH = /etc/test.conf
394
+ | /etc/i # also used as regexpr
395
+ | ~/test.conf
396
+ | ./test.conf
397
+ | test/test.conf # relative
398
+ DIR = /etc/test/
399
+ | test/ # relarive directory
400
+
401
+ =end
402
+
@@ -0,0 +1,19 @@
1
+ class AdhocLiterals
2
+ class Email
3
+ def initialize arg
4
+ @literal = arg
5
+ end
6
+ end
7
+ def self.__email__ arg
8
+ Email.new arg
9
+ end
10
+ end
11
+
12
+
13
+ class GrammerExt
14
+ class Indenter
15
+ def checkTag st
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+
2
+
3
+ class AdhocLiterals
4
+ class Url
5
+ def initialize arg
6
+ @literal = arg
7
+ end
8
+ end
9
+ def self.__url__ arg
10
+ Url.new arg
11
+ end
12
+ end
13
+
14
+
15
+ AdhocLiterals.require 'path'
16
+
17
+ class GrammerExt
18
+ class Indenter
19
+ URL_HEAD = "AdhocLiterals::__url__("
20
+ def checkURL st
21
+ checkPath st + 1 do |ed, pstack|
22
+ if st + 1 != ed
23
+ if @expr[0..st - 1] =~ /\b[A-Za-z][A-Za-z0-9\.+\-]*$/
24
+ stt = st - (s = $&).size + 1
25
+ if ['"', "'"].include? @expr[st + 1]
26
+ @expr.ssubst stt .. ed, "\"#{s}:\"" + @expr[st + 1 .. ed], :sl_url
27
+ else
28
+ @expr.ssubst stt .. ed, '"' + @expr[stt .. ed] + '"', :sl_url
29
+ end
30
+ raise Restart.new
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end