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,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