dyndoc-ruby-core 1.0.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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/dyndoc/.DS_Store +0 -0
  3. data/dyndoc/Dyn/.postload +1 -0
  4. data/dyndoc/Dyn/.preload +1 -0
  5. data/dyndoc/Dyn/After.dyn +3 -0
  6. data/dyndoc/Dyn/Base.dyn +18 -0
  7. data/dyndoc/Dyn/Minimum.dyn +20 -0
  8. data/dyndoc/Model/Html/DefaultPost_html.dyn +5 -0
  9. data/dyndoc/Model/Html/DefaultPre_html.dyn +15 -0
  10. data/dyndoc/Model/Odt/DefaultPost_content.xml +3 -0
  11. data/dyndoc/Model/Odt/DefaultPost_tmpl_content.xml +3 -0
  12. data/dyndoc/Model/Odt/DefaultPre_content.xml +8 -0
  13. data/dyndoc/Model/Odt/DefaultPre_tmpl_content.xml +8 -0
  14. data/dyndoc/Model/Tex/ContentPost_tmpl.tex +1 -0
  15. data/dyndoc/Model/Tex/ContentPre_tmpl.tex +6 -0
  16. data/dyndoc/Model/Tex/DefaultPost_tmpl.tex +73 -0
  17. data/dyndoc/Model/Tex/DefaultPre_tmpl.tex +16 -0
  18. data/dyndoc/Model/Ttm/DefaultPost_tmpl.ttm +3 -0
  19. data/dyndoc/Model/Ttm/DefaultPre_tmpl.ttm +16 -0
  20. data/dyndoc/Std/Array.dyn +96 -0
  21. data/dyndoc/Std/Composer.dyn +38 -0
  22. data/dyndoc/Std/DevTag.dyn +101 -0
  23. data/dyndoc/Std/DynVar.dyn +23 -0
  24. data/dyndoc/Std/File.dyn +55 -0
  25. data/dyndoc/Std/Git.dyn +34 -0
  26. data/dyndoc/Std/List.dyn +46 -0
  27. data/dyndoc/Std/OOP.dyn +32 -0
  28. data/dyndoc/Std/Signal.dyn +18 -0
  29. data/dyndoc/Std/String.dyn +22 -0
  30. data/dyndoc/Std/Styles.dyn +1 -0
  31. data/dyndoc/Std/Test.dyn +282 -0
  32. data/dyndoc/Std/Utils.dyn +42 -0
  33. data/dyndoc/Std/Verb.dyn +5 -0
  34. data/dyndoc/Style/Notation/Math.dyn +7 -0
  35. data/dyndoc/Style/Notation/Stat/Classic.dyn +8 -0
  36. data/dyndoc/Style/Notation/Stat/Cqls.dyn +44 -0
  37. data/dyndoc/Style/Text/Std.dyn +5 -0
  38. data/dyndoc/Style/Text/StdAlias.dyn +3 -0
  39. data/dyndoc/Style/Text/StdTex.dyn +17 -0
  40. data/dyndoc/Style/Text/Txt.dyn +1 -0
  41. data/dyndoc/Tex/.postload +1 -0
  42. data/dyndoc/Tex/.preload +1 -0
  43. data/dyndoc/Tex/10pt_tmpl.tex +1 -0
  44. data/dyndoc/Tex/11pt_tmpl.tex +1 -0
  45. data/dyndoc/Tex/12pt_tmpl.tex +1 -0
  46. data/dyndoc/Tex/Article_tmpl.tex +1 -0
  47. data/dyndoc/Tex/Beamer.dyn_tex +35 -0
  48. data/dyndoc/Tex/BeamerHandout_tmpl.tex +2 -0
  49. data/dyndoc/Tex/Book_tmpl.tex +1 -0
  50. data/dyndoc/Tex/DefaultFirst_tmpl.tex +1 -0
  51. data/dyndoc/Tex/DefaultLast_tmpl.tex +8 -0
  52. data/dyndoc/Tex/Default_tmpl.tex +9 -0
  53. data/dyndoc/Tex/First_tmpl.tex +8 -0
  54. data/dyndoc/Tex/Fr_tmpl.tex +17 -0
  55. data/dyndoc/Tex/Header_tmpl.tex +3 -0
  56. data/dyndoc/Tex/InclGraph_tmpl.tex +19 -0
  57. data/dyndoc/Tex/InclSpatProc_tmpl.tex +70 -0
  58. data/dyndoc/Tex/InclSumMI_tmpl.tex +4 -0
  59. data/dyndoc/Tex/LargeA4_tmpl.tex +5 -0
  60. data/dyndoc/Tex/Last_tmpl.tex +1 -0
  61. data/dyndoc/Tex/Option_tmpl.tex +8 -0
  62. data/dyndoc/Tex/Png_tmpl.tex +1 -0
  63. data/dyndoc/Tex/RefCite2_tmpl.tex +16 -0
  64. data/dyndoc/Tex/RefCite_tmpl.tex +16 -0
  65. data/dyndoc/Tex/Report_tmpl.tex +1 -0
  66. data/dyndoc/Tex/Theorem_tmpl.tex +14 -0
  67. data/dyndoc/Tools/.DS_Store +0 -0
  68. data/dyndoc/Tools/Atom.dyn/index.dyn +42 -0
  69. data/dyndoc/Tools/AtomDyndocker.dyn/index.dyn +43 -0
  70. data/dyndoc/Tools/R/Fig.dyn +144 -0
  71. data/dyndoc/Tools/R/Tools.dyn +344 -0
  72. data/dyndoc/Tools/Tex/Beamer.dyn +204 -0
  73. data/dyndoc/Tools/Tex/BeamerSlide.dyn_tex +199 -0
  74. data/dyndoc/Tools/Tex/Pgf.dyn +115 -0
  75. data/dyndoc/Tools/Tex/Table.dyn +278 -0
  76. data/dyndoc/Tools/Tex/Tools.dyn +37 -0
  77. data/dyndoc/Tools/Tex/Verb.dyn +77 -0
  78. data/dyndoc/Tools/Web/.DS_Store +0 -0
  79. data/dyndoc/Tools/Web/Ace.dyn +54 -0
  80. data/dyndoc/Tools/Web/Code.dyn +129 -0
  81. data/dyndoc/Tools/Web/DHtmlX.dyn +39 -0
  82. data/dyndoc/Tools/Web/DataTable.dyn_html +354 -0
  83. data/dyndoc/Tools/Web/Html.dyn +286 -0
  84. data/dyndoc/Tools/Web/Html/JQuery.dyn +123 -0
  85. data/dyndoc/Tools/Web/Html/Styles.dyn +4 -0
  86. data/dyndoc/Tools/Web/JQueryTools.dyn +87 -0
  87. data/dyndoc/Tools/Web/Layout.dyn +86 -0
  88. data/dyndoc/Tools/Web/Layout/CQLS.dyn +6 -0
  89. data/dyndoc/Tools/Web/Layout/LJK.dyn +41 -0
  90. data/dyndoc/Tools/Web/TabBar.dyn +37 -0
  91. data/dyndoc/Tools/Web/Ttm.dyn +20 -0
  92. data/dyndoc/Tools/Web/Txtl.dyn +14 -0
  93. data/lib/dyndoc-core.rb +59 -0
  94. data/lib/dyndoc/base/envir.rb +541 -0
  95. data/lib/dyndoc/base/filter/call.rb +127 -0
  96. data/lib/dyndoc/base/filter/filter_mngr.rb +637 -0
  97. data/lib/dyndoc/base/filter/server.rb +882 -0
  98. data/lib/dyndoc/base/filters.rb +3 -0
  99. data/lib/dyndoc/base/helpers.rb +9 -0
  100. data/lib/dyndoc/base/helpers/core.rb +32 -0
  101. data/lib/dyndoc/base/helpers/parser.rb +188 -0
  102. data/lib/dyndoc/base/scanner.rb +886 -0
  103. data/lib/dyndoc/base/tags.rb +4 -0
  104. data/lib/dyndoc/base/tags/keys_mngr.rb +401 -0
  105. data/lib/dyndoc/base/tags/part_tag.rb +194 -0
  106. data/lib/dyndoc/base/tags/tag_mngr.rb +125 -0
  107. data/lib/dyndoc/base/tags/user_tag.rb +216 -0
  108. data/lib/dyndoc/base/tmpl.rb +6 -0
  109. data/lib/dyndoc/base/tmpl/eval.rb +581 -0
  110. data/lib/dyndoc/base/tmpl/extension.rb +337 -0
  111. data/lib/dyndoc/base/tmpl/manager.rb +450 -0
  112. data/lib/dyndoc/base/tmpl/oop.rb +57 -0
  113. data/lib/dyndoc/base/tmpl/parse_do.rb +2446 -0
  114. data/lib/dyndoc/base/tmpl/rbenvir.rb +54 -0
  115. data/lib/dyndoc/base/utils.rb +367 -0
  116. data/lib/dyndoc/common/dynArray.rb +234 -0
  117. data/lib/dyndoc/common/file.rb +52 -0
  118. data/lib/dyndoc/common/init.rb +2 -0
  119. data/lib/dyndoc/common/tilt.rb +149 -0
  120. data/lib/dyndoc/common/utils.rb +61 -0
  121. data/lib/dyndoc/common/uv.rb +163 -0
  122. data/lib/dyndoc/init/config.rb +296 -0
  123. data/lib/dyndoc/init/home.rb +9 -0
  124. data/lib/dyndoc/plugins/tex.rb +4 -0
  125. data/lib/dyndoc/plugins/tex/beamer.rb +208 -0
  126. data/lib/dyndoc/plugins/tex/tex_eval.rb +69 -0
  127. data/lib/dyndoc/plugins/tex/tex_parse_do.rb +25 -0
  128. data/lib/dyndoc/plugins/tex/tex_user_tag.rb +32 -0
  129. data/share/R/dyndocMsys2.R +5 -0
  130. data/share/R/dyndocTools.R +9 -0
  131. data/share/R/test.R +14 -0
  132. data/share/R/tools/dynArray.R +34 -0
  133. data/share/R/tools/dynCapture.R +84 -0
  134. data/share/R/tools/dynMsys2.R +54 -0
  135. data/share/julia/dynArray.jl +93 -0
  136. data/share/julia/dyndoc.jl +110 -0
  137. data/share/julia/ruby.jl +37 -0
  138. metadata +202 -0
@@ -0,0 +1,4 @@
1
+ require 'dyndoc/base/tags/user_tag'
2
+ require 'dyndoc/base/tags/part_tag'
3
+ require "dyndoc/base/tags/tag_mngr"
4
+ require "dyndoc/base/tags/keys_mngr"
@@ -0,0 +1,401 @@
1
+ module Dyndoc
2
+
3
+ class KeysManager
4
+
5
+ ######## word ########
6
+
7
+ def KeysManager.word_key(key)
8
+ key2=/#{"^"+key.gsub(/\*/,"[\\w\\d\\.\\-:]_STAR_").gsub(/_STAR_/,"*")}/
9
+ #p res
10
+ key2
11
+ end
12
+
13
+ def KeysManager.word_lock(lock)
14
+
15
+ end
16
+
17
+ def KeysManager.word_unlocked?(lock,key)
18
+ return nil if lock.nil?
19
+ lock.strip=="*" or lock=~key
20
+ end
21
+
22
+ ########## list ########
23
+ def KeysManager.list_key(key)
24
+ key2=/#{"^"+key.gsub(/\*/,"[\\w\\d\\.\\-:]_STAR_").gsub(/_STAR_/,"*").gsub(/[\w\,]+/) {|e| "(?:#{$&})"}.gsub(",","|")}/
25
+ #p key2
26
+ key2
27
+ end
28
+
29
+ def KeysManager.list_unlocked?(lock,key)
30
+ #puts "list_unlocked";p lock;p key
31
+ return nil if lock.nil?
32
+ return true if lock.strip=="*"
33
+ l=lock.split(",").map{|e| e.strip}
34
+ cpt,ok=0,nil
35
+ begin
36
+ ok=l[cpt]=~key
37
+ end while !ok and (cpt+=1)<l.length
38
+ #p ok
39
+ return ok
40
+ end
41
+
42
+
43
+ ########## path ########
44
+ def KeysManager.path_key(key)
45
+ # key is automatically completed with -**
46
+ #puts "path_key:key";p key
47
+ key2="^"+(key+"-**").gsub(/[\w\,\*]+/) {|e| "(?:#{$&})"}.gsub(",","|").gsub(/\*\*/,"[\\w\\d\\-\\.:]_STAR_").gsub(/\*/,"[\\w\\d\\.:]_STAR_").gsub(/_STAR_/,"*")
48
+ #p key;p key2
49
+ /#{key2}/
50
+ end
51
+
52
+ def KeysManager.path_lock(lock)
53
+ lock+"-"
54
+ end
55
+
56
+ def KeysManager.path_unlocked?(lock,key)
57
+ return nil if lock.nil?
58
+ return (lock.strip=="*" or KeysManager.path_lock(lock)=~key)
59
+ end
60
+
61
+ ########## depth ########
62
+ def KeysManager.depth_key(key)
63
+ # key is automatically completed with -**
64
+ #puts "depth_key";p key
65
+ key2=((key.is_a? Array) ? key : eval(key).to_a)
66
+ #p key2
67
+ key2
68
+ end
69
+
70
+ def KeysManager.depth_lock(lock)
71
+ eval(lock).to_a
72
+ end
73
+
74
+ def KeysManager.depth_unlocked?(lock,key)
75
+ return nil if lock.nil?
76
+ #p KeysManager.depth_lock(lock) & key
77
+ return (lock.strip=="*" or !(KeysManager.depth_lock(lock) & key).empty?)
78
+ end
79
+
80
+ ########## num ########
81
+ def KeysManager.num_val(val)
82
+ val.to_i
83
+ end
84
+
85
+ def KeysManager.num_unlocked?(lock,key)
86
+ return nil if lock.nil?
87
+ #p KeysManager.depth_lock(lock) & key
88
+ return key[:order].include?(KeysManager.num_val(lock) <=> key[:val])
89
+ end
90
+ ########## date ########
91
+ def KeysManager.date_val(val)
92
+ Date.new(*val.split(/(?:\-|\/)/).reverse.map{|e| e.to_i})
93
+ end
94
+
95
+ def KeysManager.date_unlocked?(lock,key)
96
+ return nil if lock.nil?
97
+ #p KeysManager.depth_lock(lock) & key
98
+ return key[:order].include?(KeysManager.date_val(lock) <=> key[:val])
99
+ end
100
+
101
+ ########## section ########
102
+ def KeysManager.section_unlocked?(lock,key)
103
+ return true
104
+ end
105
+
106
+ ## general
107
+ def KeysManager.complete_name(k)
108
+ k2=$dyn_keys[:index][k] if k.is_a? Integer
109
+ k2=$dyn_keys[:index].find{|v| v=~/^#{k}/} unless k2
110
+ unless k2
111
+ k2=$dyn_keys[$dyn_keys[:alias].find_all{|v| v=~/^#{k}/}.sort[0]]
112
+ end
113
+ raise "Dyndoc Error: complete_name #{k}!" unless k2
114
+ return k2
115
+ end
116
+
117
+ def KeysManager.prepare_comp(crit)
118
+ res={}
119
+ if crit=~/^(?:!=|>=|<=|>|<|=)/
120
+ res[:order]= KeysManager.complete_comp($~[0])
121
+ crit.replace($~.post_match)
122
+ else
123
+ res[:order]=[0]
124
+ end
125
+ res
126
+ end
127
+
128
+
129
+ def KeysManager.complete_comp(comp)
130
+ case comp
131
+ when "="; [0]
132
+ when "!="; [-1,1]
133
+ when ">"; [1]
134
+ when "<" ;[-1]
135
+ when "<="; -1..0
136
+ when ">="; 0..1
137
+ end
138
+ end
139
+
140
+ # complete the name of criteria
141
+ def KeysManager.var_names(keys,clean=nil)
142
+ if $dyn_keys
143
+ keys2,index,aliases={},$dyn_keys[:index].dup,$dyn_keys[:alias].dup
144
+ #puts "var_names: index";p index
145
+ index_to_clean=[]
146
+ keys.each_key{|k|
147
+ #puts "k";p k
148
+ to_merge=nil
149
+ k,to_merge=k[0...-1],true if k.is_a? String and k[-1,1]=="?"
150
+ #p index
151
+ k2=$dyn_keys[:index][k] if k.is_a? Integer
152
+ k2=index.find{|v| v=~/^#{k}/} unless k2
153
+ index_to_clean << index.delete(k2) if k2
154
+ unless k2
155
+ k2=$dyn_keys[aliases.find_all{|v| v=~/^#{k}/}.sort[0]]
156
+ index_to_clean << aliases.delete(k) if k2
157
+ end
158
+ #puts "k2";p k2
159
+
160
+ keys2[(to_merge ? k2+"?" : k2)]=keys[(to_merge ? k+"?" : k)] if k2
161
+ }
162
+ #update keys by deleting dealt elements
163
+ index_to_clean.each{|k| keys.delete(k)} if clean
164
+ return keys2
165
+ end
166
+ end
167
+
168
+ def KeysManager.make_title(lock)
169
+ lock.each{|key,val|
170
+ if val and val.include? "("
171
+ $dyn_keys[:title]={} unless $dyn_keys[:title]
172
+ $dyn_keys[:title][key]=[] unless $dyn_keys[:title][key]
173
+ val,title=val.scan(/(.*)\((.*)\)/)[0]
174
+ lock[key]=val
175
+ $dyn_keys[:title][key] << [val,title]
176
+ end
177
+ }
178
+ end
179
+
180
+ def KeysManager.make_keys(init_keys)
181
+ #p keys
182
+ keys=KeysManager.var_names(init_keys,true)
183
+ #puts "make_keys";p keys
184
+ keys.each_key{|k|
185
+ next if k.is_a? Symbol
186
+ case $dyn_keys[k][:type]
187
+ when :word
188
+ keys[k]=KeysManager.word_key(keys[k])
189
+ when :path
190
+ keys[k]=KeysManager.path_key(keys[k])
191
+ when :list
192
+ keys[k]=KeysManager.list_key(keys[k])
193
+ when :depth
194
+ keys[k]=KeysManager.depth_key(keys[k])
195
+ when :num
196
+ crit=keys[k].strip
197
+ res=KeysManager.prepare_comp(crit)
198
+ res[:val]=KeysManager.num_val(crit)
199
+ keys[k]=res
200
+ when :date
201
+ crit=keys[k].strip
202
+ res=KeysManager.prepare_comp(crit)
203
+ res[:val]=KeysManager.date_val(crit)
204
+ keys[k]=res
205
+ when :order #k="order"!
206
+ crits=keys[k].strip
207
+ #p crits
208
+ keys["order"]=keys["order"].strip.split(",").map{|crit|
209
+ res={:order=>1}
210
+ if "+-><".include? crit[0,1]
211
+ case crit[0,1]
212
+ when ">","+"
213
+ res[:order]=1
214
+ when "<","-"
215
+ res[:order]=-1
216
+ end
217
+ crit=crit[1..-1].strip
218
+ end
219
+ res[:val]= KeysManager.complete_name(crit)
220
+ keys[:required]=[] unless keys[:required]
221
+ keys[:required] |= [res[:val]]
222
+ res
223
+ }
224
+ when :required #k="required"!
225
+ crits=keys["required"].strip.split(",")
226
+ keys[:required]=[] unless keys[:required]
227
+ keys["required"]=crits.map{|crit| KeysManager.complete_name(crit)}
228
+ keys[:required] |=keys["required"]
229
+ end
230
+ }
231
+ KeysManager.keys_section(keys)
232
+ keys
233
+ #puts "make_keys(OUT)";p keys
234
+ end
235
+
236
+ def KeysManager.begin(lock_keys_orig,lock,keys)
237
+ #p $dyn_keys[:begin_end]
238
+ #p ($dyn_keys[:begin_end] & lock.keys).empty?
239
+ unless ($dyn_keys[:begin] & lock_keys_orig ).empty?
240
+ #puts "begin:lock" ;p lock_keys_orig
241
+ $dyn_keys[:begin].each{|key|
242
+ case $dyn_keys[key][:type]
243
+ when :section
244
+ #p $dyn_keys[:section][key]
245
+ $dyn_keys[:section][key]=[] unless $dyn_keys[:section][key]
246
+ if $dyn_keys[:section][key].empty? or $dyn_keys[:section][key][-1][:state]==:open
247
+ #puts "begin #{k}"
248
+ $dyn_keys[:section][key] << {:cpt=>1,:state=>:open}
249
+ else
250
+ #puts "incr #{k}"
251
+ $dyn_keys[:section][key][-1][:cpt]+=1
252
+ $dyn_keys[:section][key][-1][:state]=:open
253
+ end
254
+ #p $dyn_keys[:section][k]
255
+ lock[key]=$dyn_keys[:section][key].map{|e| e[:cpt]}
256
+ #puts "lock[#{k}]";p lock[k]
257
+ #puts "begin:section_rel";p lock;p keys
258
+ #puts "keys2";p keys2;p lock
259
+ if KeysManager.unlocked?(lock,$dyn_keys[:section_required][:keys])
260
+ $dyn_keys[:section_rel][key]=[] unless $dyn_keys[:section_rel][key]
261
+ if $dyn_keys[:section_rel][key].empty? or $dyn_keys[:section_rel][key][-1][:state]==:open
262
+ #puts "begin #{k}"
263
+ $dyn_keys[:section_rel][key] << {:cpt=>1,:state=>:open}
264
+ else
265
+ #puts "incr #{k}"
266
+ $dyn_keys[:section_rel][key][-1][:cpt]+=1
267
+ $dyn_keys[:section_rel][key][-1][:state]=:open
268
+ end
269
+ #p $dyn_keys[:section][k]
270
+ lock[key+"_rel"]=$dyn_keys[:section_rel][key].map{|e| e[:cpt]}
271
+ #puts "lock[section_rel]";p lock[key+"_rel"]
272
+ end
273
+ end
274
+ }
275
+ end
276
+ end
277
+
278
+ def KeysManager.end(lock_keys_orig,lock,keys)
279
+ #p $dyn_keys[:begin_end]
280
+ #p ($dyn_keys[:begin_end] & lock.keys).empty?
281
+ unless ($dyn_keys[:end] & lock_keys_orig).empty?
282
+ #puts "end:lock" ;p lock_keys_orig
283
+ $dyn_keys[:end].each{|key|
284
+ case $dyn_keys[key][:type]
285
+ when :section
286
+ #puts "close #{k}"
287
+ $dyn_keys[:section][key].pop if $dyn_keys[:section][key][-1][:state]==:close
288
+ $dyn_keys[:section][key][-1][:state]=:close if $dyn_keys[:section][key][-1][:state]==:open
289
+ if KeysManager.unlocked?(lock,$dyn_keys[:section_required][:keys])
290
+ $dyn_keys[:section_rel][key].pop if $dyn_keys[:section_rel][key][-1][:state]==:close
291
+ $dyn_keys[:section_rel][key][-1][:state]=:close if $dyn_keys[:section_rel][key][-1][:state]==:open
292
+ end
293
+ end
294
+ #p $dyn_keys[:section][k]
295
+ }
296
+ end
297
+ end
298
+
299
+
300
+ def KeysManager.init_keys(keys)
301
+ #p keys
302
+ #merge the different keys
303
+ keys2={}
304
+ key=keys.join(",")
305
+ KeysManager.make(key,keys2)
306
+ #puts "KeysManager.init_keys";p keys2
307
+ return keys2
308
+ end
309
+
310
+ def KeysManager.keys_section(keys,section_required=["theme","part","topic"])
311
+ #put the two lines below in register!
312
+ $dyn_keys[:section]={} unless $dyn_keys[:section]
313
+ $dyn_keys[:section_rel]={} unless $dyn_keys[:section_rel]
314
+ $dyn_keys[:section_required]={:set=>section_required}
315
+ $dyn_keys[:section_required][:keys]={};keys.select{|k,e| $dyn_keys[:section_required][:set].include? k}.each{|k,e| $dyn_keys[:section_required][:keys][k]=e}
316
+ end
317
+
318
+
319
+ def KeysManager.make(str,obj=nil)
320
+ cpt=-1
321
+ #str+=$dyn_keys[:require] unless obj
322
+ #puts "make_lock";p str
323
+ obj={} unless obj
324
+ str.split(/[:]/).each{|e|
325
+ cpt+=1
326
+ key,*val=e.split("=").map{|e2| e2.strip}
327
+ val=val.join("=") unless val.empty?
328
+ key,val=cpt,key if val.empty?
329
+ obj[key]=val if val and !obj[key]
330
+ }
331
+ #p obj
332
+ return obj
333
+ end
334
+
335
+ def KeysManager.simplify(obj)
336
+ obj.each_key{|key|
337
+ if key[-1,1]=="?"
338
+ obj[key[0...-1]]=obj[key] unless obj[key[0...-1]]
339
+ obj.delete(key)
340
+ end
341
+ }
342
+ #p obj
343
+ end
344
+
345
+ def KeysManager.merge(obj2,obj=$dyn_keys[:lastlock].dup)
346
+ #puts "merge_lock";p obj
347
+ #p obj2
348
+ obj.each_key{|key|
349
+ next if key.is_a? Symbol
350
+ #puts "merge #{key}";p (obj2[key] and !(obj2[key]=~/^\s*\w/))
351
+ if obj2[key+"?"] or !obj2[key]
352
+ obj2.delete(key+"?") if obj2[key+"?"]
353
+ obj2[key]=obj[key] unless obj2[key]
354
+ elsif $dyn_keys[key][:type]==:path
355
+ #obj2[key] and !(obj2[key]=~/^\s*\w/) #for :list and :path
356
+ #puts "add";p obj2[key]
357
+ obj2[key]=obj[key]+"-"+obj2[key].strip
358
+ elsif $dyn_keys[key][:type]==:list
359
+ obj2[key]=obj[key]+","+obj2[key].strip
360
+ end
361
+ }
362
+ #p obj2
363
+ end
364
+
365
+ def KeysManager.unlocked?(lock,keys)
366
+ #puts "unlocked?";p lock
367
+ lock_keys=lock.keys
368
+ #puts "required?";p lock_keys;p keys[:required]
369
+ return nil unless !keys[:required] or (keys[:required]-lock_keys).empty?
370
+ to_open=keys.keys-[:required,"required","order"] #& lock_keys
371
+ #puts "to_open";p to_open
372
+ ok=(to_open.empty? ? true : to_open.map{|k|
373
+ #puts "k=#{k}";p lock[k];p keys[k]
374
+ next if k.is_a? Symbol
375
+ case $dyn_keys[k][:type]
376
+ when :word
377
+ res=KeysManager.word_unlocked?(lock[k],keys[k])
378
+ when :path
379
+ res=KeysManager.path_unlocked?(lock[k],keys[k])
380
+ when :list
381
+ res=KeysManager.list_unlocked?(lock[k],keys[k])
382
+ when :depth
383
+ res=KeysManager.depth_unlocked?(lock[k],keys[k])
384
+ when :num
385
+ res=KeysManager.num_unlocked?(lock[k],keys[k])
386
+ when :date
387
+ res=KeysManager.date_unlocked?(lock[k],keys[k])
388
+ when :section
389
+ res=KeysManager.section_unlocked?(lock[k],keys[k])
390
+ end
391
+ #puts "ok#{k}?";p res
392
+ res
393
+ }.all?)
394
+ #puts "ok?";p ok
395
+ return ok
396
+ end
397
+
398
+
399
+ end
400
+
401
+ end
@@ -0,0 +1,194 @@
1
+ module Dyndoc
2
+
3
+ class PartTag
4
+
5
+ def PartTag.make_alias(aliases,alias_lines) #alias_lines= array of lines of the form "alias1,...,aliasN=tag1,...,tagP"
6
+ #p alias_lines
7
+ alias_lines.map{|e| e.split(/[=>]/)}.map{|e,e2,e3| tmp=e.split(",").map{|ee| ee.strip};tmp2=e2.split(",").map{|ee| ee.strip}+tmp;tmp.map{|ee| aliases[ee] = tmp2}}.flatten
8
+ #aliases updated!
9
+ end
10
+
11
+ def PartTag.global_alias(aliases)
12
+ ## global aliases
13
+ @@alias=""
14
+ @@sys_alias=File.join(Dyndoc.cfg_dir[:sys],"alias")
15
+ @@alias << File.read(@@sys_alias).chomp << "\n" if File.exists? @@sys_alias
16
+ @@home_alias=File.join(Dyndoc.cfg_dir[:home],'alias')
17
+ @@alias << File.read(@@home_alias).chomp << "\n" if File.exists? @@home_alias
18
+ if Dyndoc.cfg_dir[:file]
19
+ @@file_alias=File.join(Dyndoc.cfg_dir[:file],'.dyn_alias')
20
+ @@alias << File.read(@@file_alias).chomp << "\n" if File.exists? @@file_alias
21
+ end
22
+ PartTag.make_alias(aliases,@@alias.chomp.split("\n"))
23
+ end
24
+
25
+ def PartTag.local_alias(aliases,input) # @alias increased
26
+ PartTag.make_alias(aliases,input.scan(/%%%alias\(([^\)]*)\)/).flatten)
27
+ end
28
+
29
+ def PartTag.apply_alias(partTag,aliases) #partTag is modified at the end!
30
+ partTag.each_key{|o|
31
+ partTag[o]=partTag[o].map{|e| ( (aliases.keys.include? e) ? aliases[e] : e )}.flatten.uniq
32
+ }
33
+ end
34
+
35
+ @@partTagDefault=["main"]
36
+
37
+ def PartTag.partTagDefault(out_tag)
38
+ partTag={}
39
+ out_tag.each{|o|
40
+ partTag[o]=@@partTagDefault.dup
41
+ partTag[o] << o unless o==:default
42
+ }
43
+ partTag
44
+ end
45
+
46
+ def PartTag.append(partTag,tags)
47
+ #puts "partTag";p partTag
48
+ #puts "tags";p tags
49
+ partTag.each_key{|o| partTag[o]+=tags}
50
+ end
51
+
52
+ def PartTag.is_part_ok?(part,partTag)
53
+ part[0]=part[0][1..-1] if (neg=(part[0][0,1] == "-"))
54
+ tmp= (partTag & part).empty?
55
+ tmp = !tmp unless neg
56
+ return tmp
57
+ end
58
+
59
+ def PartTag.make_part(str)
60
+ if str.is_a? String
61
+ str.split(",").map{|e| e.strip}.map{|t|
62
+ if t[0,1]=="-"
63
+ t
64
+ else
65
+ tmp=t.split(":")
66
+ (0...tmp.length).map{|i| tmp[0..i].join(":")}
67
+ end
68
+ }.flatten
69
+ else
70
+ str
71
+ end
72
+ end
73
+
74
+ @@partEmbed=["{","}"]
75
+ ## filter part in doc
76
+ def PartTag.part_doc(txt,partTag=[],partTagLimit=[Regexp.escape("%("),Regexp.escape(")")])
77
+ return txt if partTag.empty? #nothing to do!
78
+ parts=txt.scan(/#{partTagLimit[0]}([\#\d\w\-\:,]*[#{Regexp.escape(@@partEmbed[0]+@@partEmbed[1])}]?)#{partTagLimit[1]}/).flatten
79
+ #p partTag
80
+ #p parts
81
+ #parts.map!{|pa| ( pa[0,1]==@@partEmbed[0] ? pa[1..-1]+pa[0,1] : pa ) }
82
+ #Rule opentag!
83
+ # 1) an opentag non closed is as a norma tag
84
+ # 2) a closetag non related to an opentag is ignored
85
+ # These rules may be useful!
86
+ open_part,close_part={},{}
87
+ stack=[]
88
+ parts.each_index{|i|
89
+ tag=parts[i]
90
+ case tag[-1,1]
91
+ when @@partEmbed[0]
92
+ prec_tag=nil
93
+ if i>0
94
+ prec_tag=parts[i-1]
95
+ #p prec_tag
96
+ case prec_tag[-1,1]
97
+ when @@partEmbed[0]
98
+ prec_tag=prec_tag[0...-1]
99
+ when @@partEmbed[1]
100
+ =begin
101
+ p i
102
+ p stack
103
+ p open_part
104
+ p close_part
105
+ =end
106
+ prec_tag=open_part[close_part[i-1]][:prec_tag]
107
+ end
108
+ else
109
+ prec_tag="main"
110
+ end
111
+ stack.push({:index=>i,:name=>tag[0...-1],:prec_tag=>PartTag.make_part(prec_tag)})
112
+ when @@partEmbed[1]
113
+ close_tag=tag[0...-1]
114
+ open_tag=stack.pop
115
+ if open_tag and close_tag==open_tag[:name]
116
+ open_part[open_tag[:index]]={:tag_name=>open_tag[:name],:close_index=>i,:prec_tag=>open_tag[:prec_tag]}
117
+ close_part[i]=open_tag[:index] #to retrieve the information of the associated open_part
118
+ else
119
+ stack.push(open_tag) if open_tag
120
+ end
121
+ #nothing is done if no associated open-close parts!
122
+ end
123
+ }
124
+
125
+ parts=parts.map{|pa|
126
+ pa=pa[0...-1] if pa[-1,1]=~/[#{Regexp.escape(@@partEmbed[0]+@@partEmbed[1])}]/
127
+ PartTag.make_part(pa)
128
+ }
129
+
130
+ blocks=txt.split(/#{partTagLimit[0]}[\#\d\w\-\:,]*[#{Regexp.escape(@@partEmbed[0]+@@partEmbed[1])}]?#{partTagLimit[1]}/,-1)
131
+ txt2=blocks[0]
132
+
133
+ open_keys,close_keys=open_part.keys,close_part.keys
134
+ locked={};partTag.each_key{|ot| locked[ot]=nil}
135
+
136
+ parts.each_index{|i|
137
+ #is a open tag?
138
+ if open_keys.include? i
139
+ open_tag=open_part[i]
140
+ part_tag=PartTag.make_part(open_tag[:tag_name])
141
+ #is locked or unlocked?
142
+ partTag.each_key{|ot|
143
+ locked[ot]=open_tag[:close_index] if !(PartTag.is_part_ok?(part_tag,partTag[ot]))
144
+ }
145
+ elsif close_keys.include? i
146
+ #part_tag is the same before the open_tag!
147
+ part_tag=open_part[close_part[i]][:prec_tag]
148
+ #pop the last state of the open-close tag_block!
149
+ partTag.each_key{|ot| locked[ot]=nil if locked[ot]==i}
150
+ else
151
+ part_tag=parts[i]
152
+ end
153
+ #RMK: N'y-a-t-il pas une différence entre ne outtag et un part_tag???
154
+ ## et les blocks ouvert et fermé n'ont-ils pas de sens que pour les part_tags?
155
+
156
+ out_tag=[]
157
+ partTag.each_key{|ot|
158
+ out_tag << ot.to_s if !locked[ot] and PartTag.is_part_ok?(part_tag,partTag[ot])
159
+ }
160
+ unless out_tag.empty?
161
+ txt2 += "%("+out_tag.join(",")+")"
162
+ txt2 += blocks[i+1]
163
+ end
164
+ }
165
+ return txt2
166
+ end
167
+
168
+
169
+ ## filter out_tag in doc
170
+ def PartTag.out_tag_doc(txt,content,partTagLimit=[Regexp.escape("%("),Regexp.escape(")")])
171
+ parts=txt.scan(/#{partTagLimit[0]}([\#\d\w\-\:,]*)#{partTagLimit[1]}/).flatten
172
+ parts=parts.map{|pa|
173
+ pa.split(",").map{|e| e.strip}.map{|t|
174
+ if t[0,1]=="-"
175
+ t
176
+ else
177
+ tmp=t.split(":")
178
+ (0...tmp.length).map{|i| tmp[0..i].join(":")}
179
+ end
180
+ }.flatten
181
+ }
182
+ blocks=txt.split(/#{partTagLimit[0]}[\#\d\w\-\:,]*#{partTagLimit[1]}/,-1)
183
+ content.each_key{|ot| content[ot] << blocks[0]}
184
+ parts.each_index{|i|
185
+ parts[i].each{|ot|
186
+ ot=:default if ot=="default"
187
+ content[ot] += blocks[i+1]
188
+ }
189
+ }
190
+ end
191
+
192
+ end
193
+
194
+ end