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.
- checksums.yaml +7 -0
- data/dyndoc/.DS_Store +0 -0
- data/dyndoc/Dyn/.postload +1 -0
- data/dyndoc/Dyn/.preload +1 -0
- data/dyndoc/Dyn/After.dyn +3 -0
- data/dyndoc/Dyn/Base.dyn +18 -0
- data/dyndoc/Dyn/Minimum.dyn +20 -0
- data/dyndoc/Model/Html/DefaultPost_html.dyn +5 -0
- data/dyndoc/Model/Html/DefaultPre_html.dyn +15 -0
- data/dyndoc/Model/Odt/DefaultPost_content.xml +3 -0
- data/dyndoc/Model/Odt/DefaultPost_tmpl_content.xml +3 -0
- data/dyndoc/Model/Odt/DefaultPre_content.xml +8 -0
- data/dyndoc/Model/Odt/DefaultPre_tmpl_content.xml +8 -0
- data/dyndoc/Model/Tex/ContentPost_tmpl.tex +1 -0
- data/dyndoc/Model/Tex/ContentPre_tmpl.tex +6 -0
- data/dyndoc/Model/Tex/DefaultPost_tmpl.tex +73 -0
- data/dyndoc/Model/Tex/DefaultPre_tmpl.tex +16 -0
- data/dyndoc/Model/Ttm/DefaultPost_tmpl.ttm +3 -0
- data/dyndoc/Model/Ttm/DefaultPre_tmpl.ttm +16 -0
- data/dyndoc/Std/Array.dyn +96 -0
- data/dyndoc/Std/Composer.dyn +38 -0
- data/dyndoc/Std/DevTag.dyn +101 -0
- data/dyndoc/Std/DynVar.dyn +23 -0
- data/dyndoc/Std/File.dyn +55 -0
- data/dyndoc/Std/Git.dyn +34 -0
- data/dyndoc/Std/List.dyn +46 -0
- data/dyndoc/Std/OOP.dyn +32 -0
- data/dyndoc/Std/Signal.dyn +18 -0
- data/dyndoc/Std/String.dyn +22 -0
- data/dyndoc/Std/Styles.dyn +1 -0
- data/dyndoc/Std/Test.dyn +282 -0
- data/dyndoc/Std/Utils.dyn +42 -0
- data/dyndoc/Std/Verb.dyn +5 -0
- data/dyndoc/Style/Notation/Math.dyn +7 -0
- data/dyndoc/Style/Notation/Stat/Classic.dyn +8 -0
- data/dyndoc/Style/Notation/Stat/Cqls.dyn +44 -0
- data/dyndoc/Style/Text/Std.dyn +5 -0
- data/dyndoc/Style/Text/StdAlias.dyn +3 -0
- data/dyndoc/Style/Text/StdTex.dyn +17 -0
- data/dyndoc/Style/Text/Txt.dyn +1 -0
- data/dyndoc/Tex/.postload +1 -0
- data/dyndoc/Tex/.preload +1 -0
- data/dyndoc/Tex/10pt_tmpl.tex +1 -0
- data/dyndoc/Tex/11pt_tmpl.tex +1 -0
- data/dyndoc/Tex/12pt_tmpl.tex +1 -0
- data/dyndoc/Tex/Article_tmpl.tex +1 -0
- data/dyndoc/Tex/Beamer.dyn_tex +35 -0
- data/dyndoc/Tex/BeamerHandout_tmpl.tex +2 -0
- data/dyndoc/Tex/Book_tmpl.tex +1 -0
- data/dyndoc/Tex/DefaultFirst_tmpl.tex +1 -0
- data/dyndoc/Tex/DefaultLast_tmpl.tex +8 -0
- data/dyndoc/Tex/Default_tmpl.tex +9 -0
- data/dyndoc/Tex/First_tmpl.tex +8 -0
- data/dyndoc/Tex/Fr_tmpl.tex +17 -0
- data/dyndoc/Tex/Header_tmpl.tex +3 -0
- data/dyndoc/Tex/InclGraph_tmpl.tex +19 -0
- data/dyndoc/Tex/InclSpatProc_tmpl.tex +70 -0
- data/dyndoc/Tex/InclSumMI_tmpl.tex +4 -0
- data/dyndoc/Tex/LargeA4_tmpl.tex +5 -0
- data/dyndoc/Tex/Last_tmpl.tex +1 -0
- data/dyndoc/Tex/Option_tmpl.tex +8 -0
- data/dyndoc/Tex/Png_tmpl.tex +1 -0
- data/dyndoc/Tex/RefCite2_tmpl.tex +16 -0
- data/dyndoc/Tex/RefCite_tmpl.tex +16 -0
- data/dyndoc/Tex/Report_tmpl.tex +1 -0
- data/dyndoc/Tex/Theorem_tmpl.tex +14 -0
- data/dyndoc/Tools/.DS_Store +0 -0
- data/dyndoc/Tools/Atom.dyn/index.dyn +42 -0
- data/dyndoc/Tools/AtomDyndocker.dyn/index.dyn +43 -0
- data/dyndoc/Tools/R/Fig.dyn +144 -0
- data/dyndoc/Tools/R/Tools.dyn +344 -0
- data/dyndoc/Tools/Tex/Beamer.dyn +204 -0
- data/dyndoc/Tools/Tex/BeamerSlide.dyn_tex +199 -0
- data/dyndoc/Tools/Tex/Pgf.dyn +115 -0
- data/dyndoc/Tools/Tex/Table.dyn +278 -0
- data/dyndoc/Tools/Tex/Tools.dyn +37 -0
- data/dyndoc/Tools/Tex/Verb.dyn +77 -0
- data/dyndoc/Tools/Web/.DS_Store +0 -0
- data/dyndoc/Tools/Web/Ace.dyn +54 -0
- data/dyndoc/Tools/Web/Code.dyn +129 -0
- data/dyndoc/Tools/Web/DHtmlX.dyn +39 -0
- data/dyndoc/Tools/Web/DataTable.dyn_html +354 -0
- data/dyndoc/Tools/Web/Html.dyn +286 -0
- data/dyndoc/Tools/Web/Html/JQuery.dyn +123 -0
- data/dyndoc/Tools/Web/Html/Styles.dyn +4 -0
- data/dyndoc/Tools/Web/JQueryTools.dyn +87 -0
- data/dyndoc/Tools/Web/Layout.dyn +86 -0
- data/dyndoc/Tools/Web/Layout/CQLS.dyn +6 -0
- data/dyndoc/Tools/Web/Layout/LJK.dyn +41 -0
- data/dyndoc/Tools/Web/TabBar.dyn +37 -0
- data/dyndoc/Tools/Web/Ttm.dyn +20 -0
- data/dyndoc/Tools/Web/Txtl.dyn +14 -0
- data/lib/dyndoc-core.rb +59 -0
- data/lib/dyndoc/base/envir.rb +541 -0
- data/lib/dyndoc/base/filter/call.rb +127 -0
- data/lib/dyndoc/base/filter/filter_mngr.rb +637 -0
- data/lib/dyndoc/base/filter/server.rb +882 -0
- data/lib/dyndoc/base/filters.rb +3 -0
- data/lib/dyndoc/base/helpers.rb +9 -0
- data/lib/dyndoc/base/helpers/core.rb +32 -0
- data/lib/dyndoc/base/helpers/parser.rb +188 -0
- data/lib/dyndoc/base/scanner.rb +886 -0
- data/lib/dyndoc/base/tags.rb +4 -0
- data/lib/dyndoc/base/tags/keys_mngr.rb +401 -0
- data/lib/dyndoc/base/tags/part_tag.rb +194 -0
- data/lib/dyndoc/base/tags/tag_mngr.rb +125 -0
- data/lib/dyndoc/base/tags/user_tag.rb +216 -0
- data/lib/dyndoc/base/tmpl.rb +6 -0
- data/lib/dyndoc/base/tmpl/eval.rb +581 -0
- data/lib/dyndoc/base/tmpl/extension.rb +337 -0
- data/lib/dyndoc/base/tmpl/manager.rb +450 -0
- data/lib/dyndoc/base/tmpl/oop.rb +57 -0
- data/lib/dyndoc/base/tmpl/parse_do.rb +2446 -0
- data/lib/dyndoc/base/tmpl/rbenvir.rb +54 -0
- data/lib/dyndoc/base/utils.rb +367 -0
- data/lib/dyndoc/common/dynArray.rb +234 -0
- data/lib/dyndoc/common/file.rb +52 -0
- data/lib/dyndoc/common/init.rb +2 -0
- data/lib/dyndoc/common/tilt.rb +149 -0
- data/lib/dyndoc/common/utils.rb +61 -0
- data/lib/dyndoc/common/uv.rb +163 -0
- data/lib/dyndoc/init/config.rb +296 -0
- data/lib/dyndoc/init/home.rb +9 -0
- data/lib/dyndoc/plugins/tex.rb +4 -0
- data/lib/dyndoc/plugins/tex/beamer.rb +208 -0
- data/lib/dyndoc/plugins/tex/tex_eval.rb +69 -0
- data/lib/dyndoc/plugins/tex/tex_parse_do.rb +25 -0
- data/lib/dyndoc/plugins/tex/tex_user_tag.rb +32 -0
- data/share/R/dyndocMsys2.R +5 -0
- data/share/R/dyndocTools.R +9 -0
- data/share/R/test.R +14 -0
- data/share/R/tools/dynArray.R +34 -0
- data/share/R/tools/dynCapture.R +84 -0
- data/share/R/tools/dynMsys2.R +54 -0
- data/share/julia/dynArray.jl +93 -0
- data/share/julia/dyndoc.jl +110 -0
- data/share/julia/ruby.jl +37 -0
- metadata +202 -0
|
@@ -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
|