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,125 @@
1
+ module Dyndoc
2
+
3
+ class TagManager
4
+
5
+ def TagManager.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 TagManager.global_alias(aliases)
12
+ ## global aliases
13
+ @@alias=""
14
+ @@etc_alias=File.join(Dyndoc.cfg_dir[:etc],"alias")
15
+ @@alias << File.read(@@etc_alias).chomp << "\n" if File.exists? @@etc_alias
16
+ if Dyndoc.cfg_dir[:file]
17
+ @@file_alias=File.join(Dyndoc.cfg_dir[:file],'.dyn_alias')
18
+ @@alias << File.read(@@file_alias).chomp << "\n" if File.exists? @@file_alias
19
+ end
20
+ TagManager.make_alias(aliases,@@alias.chomp.split("\n"))
21
+ end
22
+
23
+ def TagManager.local_alias(aliases,input) # @alias increased
24
+ TagManager.make_alias(aliases,input.scan(/%%%alias\(([^\)]*)\)/).flatten)
25
+ end
26
+
27
+ def TagManager.apply_alias(tags,aliases) #partTag is modified at the end!
28
+ tags.replace(tags.map{|e| ( (aliases.keys.include? e) ? aliases[e] : e )}.flatten.uniq)
29
+ end
30
+
31
+
32
+ def TagManager.append(partTag,tags)
33
+ #puts "partTag";p partTag
34
+ #puts "tags";p tags
35
+ partTag.each_key{|o| partTag[o]+=tags}
36
+ end
37
+
38
+ =begin
39
+ def TagManager.tags_ok?(part,partTag)
40
+ part[0]=part[0][1..-1] if (neg=(part[0][0,1] == "-"))
41
+ tmp= (partTag & part).empty?
42
+ tmp = !tmp unless neg
43
+ puts "last";p part;p tmp
44
+ return tmp
45
+ end
46
+
47
+ def TagManager.init_input_tags(tags)
48
+ return tags
49
+ end
50
+ =end
51
+
52
+ def TagManager.init_input_tag(tag)
53
+ res=/#{"^"+tag.gsub(/\*\*:/,"[\\w\\d\\-_:]_STAR_:").gsub(/\*:/,"[\\w\\d\\-_]_STAR_:").gsub(/_STAR_/,"*")+"$"}/
54
+ #p res
55
+ res
56
+ end
57
+
58
+ def TagManager.init_input_tags(tags)
59
+ new_tags=tags.map{|t| (t.is_a?(String) ? TagManager.init_input_tag(t) : t ) }
60
+ #puts "newtags";p new_tags
61
+ return new_tags
62
+ end
63
+
64
+ def TagManager.tags_ok?(part,partTag)
65
+ ## Dyndoc.warn "tags_ok?",[part,partTag]
66
+ return true if partTag.include? /^all$/
67
+ part[0]=part[0][1..-1] if (neg=(part[0][0,1] == "-"))
68
+ tmp=false
69
+ partTag.each{|t|
70
+ #puts "t";p t
71
+ part.each{|t2|
72
+ #puts "t2";p t2
73
+ tmp=(t =~ t2)
74
+ #puts "tmp";p tmp
75
+ break if tmp
76
+ }
77
+ break if tmp
78
+ }
79
+ tmp = !tmp if neg
80
+ #puts "last";p part;p partTag;p tmp
81
+ return tmp
82
+ end
83
+
84
+ def TagManager.pre_tag(tag)
85
+ # first, replace $(i) by $dyn_curtag[i]
86
+ if $dyn_curtag
87
+ new_tag=tag.gsub(/\$\d?/){|e|
88
+ i=e[1..-1].to_i
89
+ i-=1 if i>0
90
+ ($dyn_curtag[i] ? $dyn_curtag[i] : "")
91
+ }
92
+ else
93
+ new_tag=tag.dup
94
+ end
95
+ #puts "new_tag";p new_tag
96
+ #puts "$dyn_curtag";p $dyn_curtag
97
+ # second, find $dyn_curtag
98
+ curtag=new_tag.scan(/\([^\(]*\)/)
99
+ $dyn_curtag=curtag.map{|e| e[1...-1]} unless curtag.empty?
100
+ #puts "$dyn_curtag2";p $dyn_curtag
101
+ new_tag.gsub!(/\([^\(]*\)/){|e| e[1...-1]}
102
+ #puts "new_tag2";p new_tag
103
+ return new_tag
104
+ end
105
+
106
+ def TagManager.make_tags(str)
107
+ ## Dyndoc.warn "make_tags",str
108
+ if str.is_a? String
109
+ TagManager.pre_tag(str)
110
+ str.split(",").map{|e| e.strip}.map{|t|
111
+ if t[0,1]=="-"
112
+ t
113
+ else
114
+ tmp=t.split(":")
115
+ (0...tmp.length).map{|i| tmp[0..i].join(":")}
116
+ end
117
+ }.flatten
118
+ else
119
+ str
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,216 @@
1
+ module Dyndoc
2
+
3
+ class UserTag
4
+
5
+ ## peaces of do_CMD !!!!
6
+ @@argsSep="|"
7
+ @@tags=["debug","vars","var","txt","main","end","eol","rstrip","r","rout","rb","ruby","block","call","hide","set","if","unless","else","elsif","load","input","require","binding","envir","parent","before","after","do","close","filter"]
8
+ ## tag and call are of the form : @@tagSearch[0]+@@prefix+'MACRO ou CALL'+@@tagSearch[1]
9
+ @@prefix={:tag=>"#",:call=>"@"}
10
+ @@tagSearch=["[","]"]
11
+ @@tagModifiers="[#{Regexp.escape('!+/|:')}]?"
12
+
13
+ def UserTag.tag_convert(txt,new=["[","#","@","]"],old=["[","","@","]"])
14
+ res=txt.dup
15
+ old2=old.map{|e| Regexp.escape(e)} ##escape in order to be matched!
16
+ ## tag
17
+ pat=@@tags.join("|")
18
+ res.gsub!(/#{old2[0]}#{old2[1]}((?i:#{pat}))#{old2[3]}/) {|e| new[0]+new[1]+$1+new[3]}
19
+ ## call
20
+ res.gsub!(/#{old2[0]+old2[2]}([^#{old2[0]}]*)#{old2[3]}/) {|e| new[0]+new[2]+$1+new[3]}
21
+ return res
22
+ end
23
+
24
+ def initialize(tmpl)
25
+ @tmpl=tmpl
26
+ end
27
+
28
+ def prefix(elt,type=:tag)
29
+ @@prefix[type]+elt+@@tagModifiers+@@prefix[type]+"?"
30
+ end
31
+
32
+
33
+ def evalUserTags(tex,code,filter)
34
+ pat="[#{@@prefix[:tag]}#{@@prefix[:call]}][a-z,A-Z][a-z,A-Z,0-9,_,\\-]*"+@@tagModifiers+"[#{@@prefix[:tag]}#{@@prefix[:call]}]?"
35
+ #p pat
36
+ #No filter yet
37
+ #puts "TXT=";p b
38
+ txt=(@@tagSearch[0]+@@prefix[:tag]+"TXT"+@@tagSearch[1]+code).split(/#{Regexp.escape(@@tagSearch[0])}((?i:#{pat}))#{Regexp.escape(@@tagSearch[1])}/)[1..-1]
39
+ #p txt
40
+ #puts "TXT2=";p txt
41
+ txt << "\n" if txt.length==1 and txt[0]==@@prefix[:tag]+"TXT"
42
+ #puts "TXT3=";p txt
43
+ until txt.empty?
44
+ @type,code=txt.shift,txt.shift
45
+ #puts "@type";p @type;p code
46
+ @type.downcase! unless @type[0,1]==@@prefix[:call]
47
+
48
+ ## special treatment for [@call@] with no parameter or default value. Redirection to [#txt]; Notice that this have to be locate before the "if code", otherwise a single call is not executed!
49
+ if @type[-1,1]==@@prefix[:call]
50
+ tex << @tmpl.eval_CALL(@type[1...-1],[],filter)
51
+ @type="txt"
52
+ end
53
+
54
+ # special treatment for [#tag#] with no content
55
+ if @type[-1,1]==@@prefix[:tag]
56
+ @type=@type[1...-1]
57
+ parseUserTags(tex,"",filter)
58
+ @type="txt"
59
+ end
60
+
61
+ code="" unless code
62
+ @type=(@type[0,1]==@@prefix[:tag] ? @type[1..-1] : @type)
63
+ parseUserTags(tex,code,filter)
64
+ end
65
+ end
66
+
67
+ def parseUserTags(tex,code,filter)
68
+ @modifier=nil
69
+ @type,@modifier=@type[0...-1],@type[-1,1] if @@tagModifiers.include? @type[-1,1]
70
+ p "DYN PARSING ERROR: #{@type} undeclared" unless (@@tags.include? @type) or (@tmpl.calls.keys.include? @type[1..-1])
71
+ #p @type
72
+ #p @modifier
73
+
74
+ #delegate for tags_tex
75
+ if Dyndoc.mode==:tex and (@@tags_tex.include? @type)
76
+ parseUserTexTags(tex,code,filter)
77
+ else
78
+
79
+ case @type
80
+ when "debug"
81
+ puts "calls:";p @tmpl.calls.keys.sort
82
+ puts "local:";p filter.envir.local
83
+ puts "global:";p filter.envir.global
84
+ when "vars","var"
85
+ #puts "vars";p code
86
+ args=( @modifier ? Utils.split_code_by_sep(code,@modifier) : Utils.split_code(code) )
87
+ #puts "args";p args
88
+ args.map!{|e| filter.apply(e)}
89
+ #puts "args2";p args
90
+ @tmpl.eval_VARS(args,filter) unless code.strip.empty?
91
+ #p filter.envir.local
92
+ #p filter.envir.global
93
+ when "txt","main","end","eol","do"
94
+ code=(code=="\n" ? [""] : code.split("\n",-1))
95
+ code=code[1..-1] if @type=="eol" and code.length>0
96
+ #p code if @type=="end"
97
+ out=@tmpl.eval_TXT(code,filter,false)
98
+ filter.outType=nil
99
+ #p out if @type=="end"
100
+ tex << "\n" if @modifier=="+"
101
+ tex<< out if out ##<< "\n" ##because this does not affect latex code but other doc???
102
+ when "filter"
103
+ bloc=filter.apply(code)
104
+ tex << filter.apply(bloc)
105
+ when "rstrip"
106
+ nb=( code.strip.empty? ? 1 : code.strip.to_i )
107
+ tex.rstrip!
108
+ when "r"
109
+ #p code.strip
110
+ inst=code.strip
111
+ inst=Utils.split_code_by_sep(code.strip,@modifier).join("\n") if @modifier
112
+ filter.outType=":r"
113
+ @tmpl.eval_RCODE(filter.apply(inst),filter) unless code.strip.empty?
114
+ filter.outType=nil
115
+ when "rout" #in fact equivalent to rtex preserved only for compatibility
116
+ filter.outType=":r"
117
+ tex << RServer.echo(filter.apply(code.strip))
118
+ filter.outType=nil
119
+ when "rb","ruby"
120
+ #p code.strip
121
+ inst=code.strip
122
+ inst=Utils.split_code_by_sep(code.strip,@modifier).join("\n") if @modifier
123
+ filter.outType=":rb"
124
+ @tmpl.eval_RbCODE(filter.apply(inst),filter) unless code.strip.empty?
125
+ filter.outType=nil
126
+ when "set"
127
+ inst=Utils.split_code(code)
128
+ key,b=nil,[]
129
+ inst.each{ |v|
130
+ k,o,t=v.scan(/([\s,#{FilterManager.letters}]*)(!?\+?\??)=(.*)/).flatten
131
+ if k
132
+ if key
133
+ @tmpl.eval_SET(key,b.join("\n"),filter)
134
+ b=[]
135
+ end
136
+ key=k.strip+o
137
+ b << t
138
+ else
139
+ b << v if key
140
+ end
141
+ }
142
+ @tmpl.eval_SET(key,b.join("\n"),filter) if key
143
+ when "load","require"
144
+ tmpl=Utils.split_code(code).map{|e| e.strip}
145
+ ##code.strip.split("\n").map{|e| e.split(@@argsSep)}.flatten.map{|e| e.strip}
146
+ @tmpl.eval_LOAD(tmpl,filter)
147
+ when "input"
148
+ unless code.strip.empty?
149
+ tmpl,*args=Utils.split_code(code)
150
+ ##code.strip.split("\n").map{|e| e.split(@@argsSep)}.flatten.map{|e| e.strip}
151
+ ##p tmpl;p args
152
+ tmpl=filter.apply(tmpl.strip)
153
+ tex << @tmpl.eval_INPUT(filter.apply(tmpl.strip),args,filter)
154
+ end
155
+ when "block"
156
+ unless code.strip.empty?
157
+ bloc,*b=Utils.split_code(code)
158
+ @tmpl.eval_FUNC(bloc,b)
159
+ end
160
+ when "if","unless","elsif","else"
161
+ inst=Utils.split_code(code)
162
+ ##code.split("\n").map{|e| e.split(@@argsSep)}.flatten
163
+ if @type=="else"
164
+ @cond = !@cond
165
+ else
166
+ @cond=eval(filter.apply(inst[0]),@tmpl.rbEnvir)
167
+ @cond = !@cond if @type=="unless"
168
+ inst=inst[1..-1]
169
+ end
170
+ if @cond
171
+ out=@tmpl.eval_TXT(inst,filter)
172
+ tex<< out if out
173
+ end
174
+ when "binding"
175
+ unless code.strip.empty?
176
+ env,*args=Utils.split_code(code)
177
+ ##code.strip.split("\n").map{|e| e.split(@@argsSep)}.flatten.map{|e| e.strip}
178
+ @tmpl.eval_BINDING(filter.apply(env.strip),args,filter)
179
+ end
180
+ when "parent"
181
+ unless code.strip.empty?
182
+ @tmpl.eval_PARENT(filter.apply(code.strip),filter)
183
+ end
184
+ when "close"
185
+ nb=( code.strip.empty? ? 1 : code.strip.to_i )
186
+ nb.times{filter.envir.local=filter.envir.local[:prev] if filter.envir.local[:prev]}
187
+ when "envir","after","before"
188
+ unless code.strip.empty?
189
+ env=filter.apply(code.strip)
190
+ ## save before envir
191
+ @envirs[env+"|before"]=filter.envir.local if @type=="after"
192
+ env+="|before" if @type=="before"
193
+ @tmpl.eval_ENVIR(env,filter)
194
+ end
195
+ when "hide"
196
+ ##nothing to do!!!
197
+ else
198
+ inst=Utils.split_code(code).map{|e| e.strip}
199
+ ##code.strip.split("\n").map{|e| e.split(@@argsSep)}.flatten.map{|e| e.strip}
200
+ if @type=="call"
201
+ #p "CAAAAAAAAAALLLLLLL"
202
+ call,*args=inst
203
+ call=filter.apply(call)
204
+ else
205
+ call,args=@type[1..-1],inst
206
+ end
207
+ CallFilter.parseArgs(call,args)
208
+ #puts "#call";p call;p filter.envir.local
209
+ call += "!" if @modifier=="!"
210
+ tex << @tmpl.eval_CALL(call,args,filter) #unless code.strip.empty?
211
+ end
212
+ end
213
+ end
214
+
215
+ end
216
+ end
@@ -0,0 +1,6 @@
1
+ require 'dyndoc/base/tmpl/manager'
2
+ require 'dyndoc/base/tmpl/parse_do'
3
+ require 'dyndoc/base/tmpl/oop'
4
+ require 'dyndoc/base/tmpl/eval'
5
+ require 'dyndoc/base/tmpl/rbenvir'
6
+ require 'dyndoc/base/tmpl/extension'
@@ -0,0 +1,581 @@
1
+ # encoding: UTF-8
2
+
3
+ module Dyndoc
4
+ module Ruby
5
+
6
+ class TemplateManager
7
+
8
+ def eval_TXT(b,filter,strip=@strip)
9
+ b.delete_if{|s| !s.scan(/^\s*%%%/).empty?} unless @echo>0
10
+ if b.length>0
11
+ txt=b.map{|l|
12
+ l2=filter.apply(l)
13
+ if (l.strip).scan(/^\#\{.*\}$/).empty?
14
+ l2
15
+ else
16
+ ## do not deal with empty result!!!
17
+ l2 unless l2.empty?
18
+ end
19
+ }.compact
20
+ #p "txt";p txt
21
+ txt.map!{|l| l.lstrip} if strip
22
+ #p "txt2";p txt
23
+ txt=txt.join("\n")
24
+ else
25
+ txt=nil
26
+ end
27
+ return txt
28
+ end
29
+
30
+ def eval_VARS(b,filter)
31
+ ## apply R filtering
32
+ ##b=b.map{|e| filter.apply(e)} -> apply to each line!!
33
+ ## read the bloc
34
+ dict=FilterManager.eval_dict(b,true)
35
+ #puts "eval_VARS:dict";p dict
36
+ filter.import_dict(dict)
37
+ #puts "eval_VARS:filter";p filter.envir.local
38
+ end
39
+
40
+ def eval_BINDING(env,b,filter)
41
+ eval_VARS(b,filter)
42
+ @envirs[env]=filter.envir.local
43
+ #p "BINDING#{env}";p filter; p "\n"
44
+ end
45
+
46
+ def eval_PARENT(env,filter)
47
+ filter.envir.local[:prev]=@envirs[env] if @envirs[env]
48
+ #p "PARENT#{env}";p filter; p "\n"
49
+ end
50
+
51
+ def eval_ENVIR(env,filter)
52
+ filter.envir.local=@envirs[env] if @envirs[env]
53
+ #p "ENVIR#{env}";p filter; p "\n"
54
+ end
55
+
56
+ def eval_SET(var,txt,filter,newline=nil)
57
+ ## apply R filtering
58
+ #puts "SET";p var; p txt
59
+ key=filter.apply(var)
60
+ key,opt=key.scan(/([#{FilterManager.letters}]+)\s*(!?\+?\??)/).flatten
61
+ key=filter.envir.keyMeth(key)
62
+ #puts "SET:key";p key;p Envir.to_keys(key);p opt
63
+ #p filter.envir.local
64
+ #p filter.envir.elt_defined?(Envir.to_keys(key))
65
+ txt=filter.apply(txt)
66
+ #puts "SET:txt";p txt
67
+ curElt=((opt.include? "!") ? filter.envir.elt_defined?(Envir.to_keys(key),true) : Envir.elt_defined?(filter.envir.local,Envir.to_keys(key),true) )
68
+ #puts "curElt"; p curElt
69
+ #puts "curElt if opt?"; p curElt if opt.include? "?"
70
+ return if curElt and opt.include? "?"
71
+ if key and curElt
72
+ if opt.include? "+"
73
+ curElt[:val][0] << txt
74
+ else
75
+ txt=[txt] if curElt[:attr] and curElt[:attr].include? :array
76
+ curElt[:val][0] =txt
77
+ end
78
+ curElt[:val][0] << "\n" if newline and !(curElt[:attr] and curElt[:attr].include? :array)
79
+ else
80
+ #unless ! in opt only local
81
+ key=":"+key unless opt.include? "!"
82
+ #puts "SET:new key";p key;p txt
83
+ filter.envir[key]=txt
84
+ end
85
+ end
86
+
87
+ def eval_RCODE(code,filter,opts={:pretty => true}) #pretty=true,capture=nil)
88
+ #Dyndoc.warn "eval_RCODE",p code
89
+ #Dyndoc.warn "rEnvir[0]",@rEnvir[0] #;"print(ls(.env4dyn$#{@rEnvir[0]}))".to_R
90
+ #Dyndoc.warn "output",RServer.output(code.strip,@rEnvir[0],pretty)
91
+ Utils.clean_eol(code)
92
+ #puts "eval_RCODE";p RServer.safe_output(code,@rEnvir[0],pretty,capture)
93
+ return filter.convert(RServer.safe_output(code,@rEnvir[0],opts),"#")
94
+ end
95
+
96
+ def eval_rout(code,filter)
97
+ #p code
98
+ Utils.clean_eol(code)
99
+ return RServer.rout(code,@rEnvir[0])
100
+ end
101
+
102
+ def eval_RbCODE(code,filter,opts={})
103
+ #p @rbEnvir[0];p filter.apply(code)
104
+ #puts "code";p code
105
+ if code[0,1]=="<"
106
+ i=(code=~/>/)
107
+ envir,code=code[1...i],code[(i+1)..-1]
108
+ #p envir
109
+ #p code
110
+ envir=(envir.empty? ? TOPLEVEL_BINDING : eval(envir))
111
+ #p envir
112
+ opts[:error] = "RbCode Error"
113
+ return filter.convert(RbServer.output(code,envir,opts),"#")
114
+ else
115
+ opts[:error] = "RbCode Error"
116
+ return filter.convert(RbServer.output(code,@rbEnvir[0],opts),"#")
117
+ end
118
+ end
119
+
120
+ def eval_INPUT(tmpl,b,filter)
121
+ ## register tmpl in @blocks to avoid next the same call!!!
122
+ #=begin TO REMOVE
123
+ tmpl,tags,rest=tmpl.split(/\((.*)\)/)
124
+ tags=TagManager.init_input_tags(tags.split(",").map{|e| e.strip.downcase}) if tags
125
+ #=end
126
+ tmpl,export=tmpl[0...-1],true if tmpl[-1,1]=="!"
127
+ #p tmpl;p tags;p rest
128
+ tmpl_name=tmpl
129
+ tmpl_orig=Dyndoc.doc_filename(tmpl.strip)
130
+ tmpl=Dyndoc.directory_tmpl? tmpl_orig
131
+ #TO REMOVE: init_dtag(tmpl)
132
+ #p tmpl
133
+ block=tmpl #TO REMOVE: +(partTag.empty? ? "" : "("+partTag.join(',')+")")
134
+ unless @blocks.keys.include? block
135
+ #TO REMOVE: input=PartTag.part_doc(File.read(tmpl),partTag2)
136
+ #puts "inside INPUT";p tmpl
137
+ return "Dyndoc Error: "+tmpl_name+" is not reacheable!!! " unless tmpl
138
+ input=Dyndoc.read_content_file(tmpl,{:doc => @doc})
139
+ @blocks[block]=input
140
+ #p block;p @blocks[block]
141
+ end
142
+ ## apply R filtering
143
+ b2=b.map{|e| filter.apply(e)} if b.length>0
144
+ dict2={:prev=>filter.envir.local}
145
+ if b.length>0
146
+ dict=FilterManager.eval_dict(b2) ###eval("{"+b2.join(",")+"}")
147
+ dict.each{|k,v| dict2[k.to_s]=v}
148
+ end
149
+ filter2=FilterManager.new({:global=>@global},self)
150
+ filter2.import_dict(dict2)
151
+ ###################################
152
+ # added to set the current filename
153
+ # of the template in the local environment
154
+ # _FILENAME_ is maybe obsolete now
155
+ # (see also "parse" in parse_do.rb file)
156
+ ###################################
157
+ filter2.envir["_FILENAME_CURRENT_"]=tmpl.dup
158
+ filter2.envir["_FILENAME_"]=tmpl.dup #register name of template!!!
159
+ #####################################
160
+ filter2.envir["_FILENAME_ORIG_"]=tmpl_orig.dup #register name of template!!!
161
+ filter2.envir["_PWD_"]=File.dirname(tmpl) #register name of template!!!
162
+ =begin
163
+ Envir.set_textElt!(["_FILENAME_"],tmpl.dup,filter2.envir.local) #register name of template!!!
164
+ Envir.set_textElt!(["_PWD_"],File.dirname(tmpl),filter2.envir.local) #register name of template!!!
165
+ =end
166
+ ## Text part
167
+ ## pre-filtering
168
+ b2=@blocks[block]
169
+ @current_tmpl=block
170
+ #puts "eval_INPUT:tags";p tags
171
+ txt=parse(b2,filter2,tags)
172
+ #puts "eval_INPUT:txt";p txt
173
+ ## post-filtering
174
+ txt=filter2.apply(txt,:post,false)
175
+ txt.strip! ##clean whitespace
176
+ txt += "\n" ##need one at the end!!!
177
+ filter.envir.local=filter2.envir.local if export
178
+ return txt
179
+ end
180
+
181
+ def eval_LOAD(b,filter)
182
+ ## just load and parse : read some FUNCs and EXPORT some variables
183
+ ## in the header
184
+ if b.length>0
185
+ b2=b.map{|e| filter.apply(e)}
186
+ #puts "b2";p b2
187
+ #Dyndoc.warn "LOAD",b2
188
+ b2.each{|lib|
189
+ lib,tags,rest=lib.split(/\((.*)\)/)
190
+ #p lib;p tags;p rest
191
+ tags=tags.split(",").map{|e| e.strip.downcase} if tags
192
+ #puts "lib";p lib
193
+ tmpl_orig=Dyndoc.doc_filename(lib.strip)
194
+ tmpl=Dyndoc.directory_tmpl? tmpl_orig
195
+ #puts "tmpl";p tmpl
196
+ #TO REMOVE: init_dtag(tmpl)
197
+ =begin TO REMOVE
198
+ partTag2=@partTag.dup
199
+ PartTag.append(partTag2,partTag)
200
+ input=PartTag.part_doc(File.read(tmpl),partTag2)
201
+ #p input
202
+ =end
203
+ # REPLACEMENT of ABOVE!
204
+ unless @libs.keys.include? tmpl
205
+ input=Dyndoc.read_content_file(tmpl)
206
+ @libs[tmpl]=input
207
+ filter.envir["_FILENAME_"]=tmpl.dup #register name of template!!!
208
+ filter.envir["_FILENAME_ORIG_"]=tmpl_orig.dup #register name of template!!!
209
+ filter.envir["_PWD_"]=File.dirname(tmpl) #register name of template!!!
210
+ txt=parse(@libs[tmpl],filter,tags)
211
+ end
212
+ }
213
+ end
214
+ end
215
+
216
+ def eval_LOAD_HELPERS(b,filter)
217
+ ## just load and parse
218
+ ## in the header
219
+ if b.length>0
220
+ b2=b.map{|e| filter.apply(e)}
221
+ #p b2
222
+ pathenv=File.read(File.join(Dyndoc.cfg_dir[:home],"helpers")).strip
223
+ helpers = ""
224
+
225
+ b2.each{|lib|
226
+ #p lib
227
+ filename=lib.strip
228
+ unless filename[0,1]=="#"
229
+ dirname,filename=File.split(filename)
230
+ filename=File.basename(filename,"*.rb")+".rb"
231
+ filename=File.join(dirname,filename) unless dirname=="."
232
+ #p filename
233
+ #p pathenv
234
+ filename2=Dyndoc.absolute_path(filename,pathenv)
235
+ #puts "names";p names
236
+ if filename2
237
+ helpers << File.read(filename2) << "\n"
238
+ else
239
+ puts "WARNING: helper #{filename} is unreachable in #{pathenv}!"
240
+ end
241
+ end
242
+ }
243
+ #p helpers
244
+ Dyndoc::Ruby::Helpers.module_eval(helpers)
245
+ end
246
+ end
247
+
248
+ def eval_FUNC(bloc,b)
249
+ bloc,code=Utils.end_line(bloc,b)
250
+ ##p bloc;p code
251
+ key,args=bloc.strip.split(/[|:]/)
252
+ key.strip!
253
+ #p "@calls[#{key}]"
254
+ @args[key]=args.split(",").map{|e| e.strip} if args
255
+ #p @args[key];p code
256
+ @calls[key]=code
257
+ end
258
+
259
+ def eval_CALL(call,b,filter,meth_args_b=nil,blckcode=nil)
260
+ txt=""
261
+ #puts "eval_CALL:call,b,filter,@calls";p call;p b
262
+ #p filter.envir
263
+ #p @calls
264
+ #p @calls.keys.sort
265
+ #puts "meth_args_b"; p meth_args_b
266
+ call,export=call[0...-1],true if call[-1,1]=="!"
267
+ if @calls.keys.include? call
268
+ # envir task
269
+ b2=b.map{|e| filter.apply(e)} if b and b.length>0
270
+ #puts "b2 init";p b2
271
+ dict2={:prev=>filter.envir.local}
272
+
273
+ if b and b.length>0
274
+ #puts "b2";p b2;p b2.map{|e| e.split("\n")}.flatten
275
+ dict=FilterManager.eval_dict(b2.map{|e| e.split("\n")}.flatten)
276
+ #puts "dict";p dict
277
+ dict.each{|k,v|
278
+ dict2[k.to_s]=v
279
+ }
280
+ end
281
+ #puts "dict2";p dict2
282
+ #p dict2["envir"] #if dict2["envir"]
283
+ ## local consideration: special ":envir"
284
+ dict2[:prev]=@envirs[dict2["envir"][0]] if dict2["envir"] and (dict2["envir"][1].include? :local) and @envirs[dict2["envir"][0]] and (@envirs[dict2["envir"][0]].is_a? Hash)
285
+ #p dict2 if dict2["envir"] and (dict2["envir"][1].include? :local) and @envirs[dict2["envir"][0]] and (@envirs[dict2["envir"][0]].is_a? Hash)
286
+ #puts "CALL:#{call}";p @global
287
+ #puts "dict2[\"envir\"]?";p dict2
288
+ # new filter to evualate the call
289
+ filter2=FilterManager.new({:global=>@global},self)
290
+
291
+ #puts "filter2.envir";p filter2.envir
292
+
293
+ # init body call
294
+ bCall=@calls[call]
295
+ #is a method ?
296
+ tmpCall=call.split(".")
297
+ isMeth=(bCall==:meth) or (tmpCall.length==2 and (@meths.include? tmpCall[0]))
298
+ # assign self if exists in :prev?
299
+ #puts "Assign";p dict2["self"]; p dict2[:prev]
300
+ #puts "isMeth?";p isMeth
301
+ if isMeth and dict2["self"]
302
+ #puts "dict2";p dict2
303
+ #and dict2[:prev][objName=dict2["self"][0]]
304
+ objName=dict2["self"][0]
305
+ #puts "objName";p objName
306
+ objName=objName[1..-1] if objName[0,1]==":"
307
+ objName="self"+objName if objName[0,1]=="."
308
+ #puts "objName2";p objName
309
+ #filter2.envir.local["self"]=dict2[:prev][objname]
310
+ objKeys=Envir.to_keys(objName)
311
+ #puts "objKeys";p objKeys
312
+ #puts "dict2[:prev]";p dict2[:prev]
313
+ #puts "Envir.keys_defined.";p Envir.keys_defined?(dict2[:prev],objKeys)
314
+ # RMK: 5/9/08 it seems that Envir.get_elt! is only used here and replaced by Envir.keys_defined? newly created!
315
+ #Envir.get_elt!(dict2[:prev],objKeys)
316
+
317
+ # find in dict2[:prev] and their sub :prev
318
+ dictObj=dict2[:prev]
319
+ begin
320
+ objEnv=Envir.elt_defined?(dictObj,objKeys)
321
+ dictObj=dictObj[:prev]
322
+ end while !objEnv and dictObj
323
+ #p @klasses
324
+ #p @global
325
+ #puts "objEnv(local)";p objEnv
326
+ # otherwise, find in @global envir
327
+ objEnv=Envir.elt_defined?(@global,objKeys) unless objEnv
328
+ #puts "objEnv(global)";p objEnv
329
+ # otherwise return empty env
330
+ objEnv={} unless objEnv
331
+ #puts "objEnv";p objEnv #at least {} and then nonempty!
332
+ #puts "objKeys[0]";p objKeys[0]
333
+ if objKeys[0]=="self"
334
+ #p dict2
335
+ #p @vars
336
+ objName=([dict2[:prev]["self"]["ObjectName"][:val][0]]+objKeys[1..-1]).join(".")
337
+ #puts "objName4Self";p objName
338
+ end
339
+ ##PB HERE: objEnv does not return the right envir because the object is in :prev and then objEnv[objKeys[-1]] is not correct!
340
+ # filter2.envir.local["self"] is then unset!
341
+ #puts "objKeys[-1]";p objKeys[-1]
342
+ #puts "objEnv";p objEnv
343
+ #p objEnv[objKeys[-1]]
344
+ filter2.envir.local["self"]=objEnv[objKeys[-1]]
345
+ #puts 'filter2.envir.local["self"]';p filter2.envir.local["self"]
346
+ dict2.delete("self")
347
+ #puts "dict2Self";p dict2
348
+
349
+ #attempt of autobuilding of object! (10/03/08)
350
+ elt={}
351
+ #test if it is an internal Dyn Object (DynVar, Array, ) i.e. if Class is a field?
352
+ #puts "filter2.local";p filter2.envir.local["self"]
353
+ if !objEnv.empty? and filter2.envir.local["self"]
354
+ if filter2.envir.local["self"].is_a? Array #is an Array object
355
+ elt["content"]=objEnv[objKeys[-1]]
356
+ elt["Class"]={:val=>["Array,Object"]}
357
+ elsif !filter2.envir.local["self"]["Class"] #no Class specified => A DynVar or List object
358
+ if filter2.envir.local["self"][:val] #is a DynVar object
359
+ elt["content"]= filter2.envir.local["self"]
360
+ elt["Class"]={:val=>["DynVar,Object"]}
361
+ else #is a List object
362
+ #puts "List";p objEnv[objKeys[-1]]
363
+ elt["content"]=objEnv[objKeys[-1]]
364
+ elt["Class"]={:val=>["List,Object"]}
365
+ end
366
+ end
367
+ elt["ObjectName"]={:val=>[objName]} unless elt.empty?
368
+ #puts "class";p elt["Class"]
369
+ #puts "content";p elt["content"]
370
+ end
371
+ if objEnv.empty? or !filter2.envir.local["self"]
372
+ if (elt=AutoClass.find(objName)).empty?
373
+ #is a String Vector i.e. of the form
374
+ # name1,name2,...,nameN
375
+ vals=objName.split(",").map{|e| e.strip}.map{|e| {:val=>[e]}}
376
+ elt["content"]={"value"=>{:val=>[objName]},"ary"=>vals}
377
+ elt["Class"]={:val=>["String,Object"]}
378
+ elt["ObjectName"]={:val=>[nil]} #empty ObjectName used in inspect method!
379
+ end
380
+ end
381
+ #puts "Elt:";p elt
382
+ #creation of the new object!
383
+ filter2.envir.local["self"]=elt unless elt.empty?
384
+ #p filter2.envir.local
385
+ filter2.envir.local["self"]["ObjectName"]={:val=>[objName]} unless objName=="self" or filter2.envir.local["self"]["ObjectName"]
386
+ end
387
+ #puts "filter2";p filter2.envir
388
+ #puts "dict2[:prev](???)";p dict2[:prev]
389
+ #Really IMPORTANT: for pointer tricks: first import :prev environment
390
+ filter2.import_dict({:prev=>dict2[:prev]})
391
+ dict2.delete(:prev)
392
+ #puts "dict2";p dict2
393
+ #puts "filter2a";p filter2.envir
394
+ #Really IMPORTANT: and then pointers could be recognized!
395
+ filter2.import_dict(dict2)
396
+ #puts "filter22";p filter2.envir
397
+
398
+ inR=nil
399
+ if isMeth
400
+ if bCall==:meth
401
+ #p filter2.envir
402
+ #puts "extract self";p call;p filter2.envir.extract("self")
403
+
404
+ #ICI: tester si l'objet a un champ Klass sinon faire comme avant et le déclarer en
405
+
406
+ klass=get_klass(filter2.envir.extract("self")["Class"])
407
+ #puts "call";p call
408
+ #puts "klass";p klass
409
+ #p @calls.keys
410
+ =begin
411
+ i,bCall=-1,nil
412
+ bCall=@calls[call+"."+klass[i+=1]] until bCall
413
+ call+="."+klass[i]
414
+ =end
415
+ bCall=get_method(call,klass)
416
+ #puts "call meth";p call;p klass
417
+ #p bCall
418
+ #puts some raise Error! return "" unless bCall
419
+ unless bCall
420
+ puts "DYN WARNING: Method #{call} undefined for class #{klass} (object: #{objName})"
421
+ return ""
422
+ end
423
+ #init the parameter of the true method!
424
+ if (args=@args[call])
425
+ args=args[1..-1]
426
+ args=nil if args.empty?
427
+ #p args
428
+
429
+ if meth_args_b
430
+ #puts "ICI1";p meth_args_b
431
+ CallFilter.parseArgs(call,meth_args_b,true)
432
+ #puts "eval CALL meth_b";p call;p meth_args_b
433
+
434
+ #p meth_args_b
435
+ b2=meth_args_b.map{|e| filter.apply(e)} if meth_args_b and meth_args_b.length>0
436
+
437
+ #puts "call(2)";p call;p b2
438
+ dict=FilterManager.eval_dict(b2)
439
+ #puts "dict(eval_CALL)";#p dict
440
+ #IMPORTANT: (19/10/08) remove self from dict because already imported!
441
+ dict.map!{|e| e if e[0]!="self"}.compact!
442
+
443
+ #puts "Import dict in filter2"
444
+ #p dict
445
+ #puts "eval_CALL:filter2.envir";p filter2.envir
446
+ filter2.import_dict(dict)
447
+ #puts "self";p filter2.envir.local["self"]
448
+ #p filter2.envir.local
449
+ end
450
+ end
451
+ end
452
+
453
+ # R envir
454
+ inR=filter2.envir.extract("self")["Renvir"]
455
+ #p inR
456
+
457
+ #p @args[call]
458
+ #p b2
459
+ #p filter2
460
+ end
461
+ # deal with blckcodes
462
+ #puts "<<def_blck #{call}"
463
+ #p blckcode
464
+ #puts "av:";p @def_blck
465
+ @def_blck << blckcode if blckcode and !blckcode.empty?
466
+ #puts "ap:";p @def_blck
467
+ #p blckcode
468
+
469
+ ## Tex part
470
+ ### this is wondeful (10/08/04)
471
+ ## apply filter2 for fragment before parsing
472
+ @rEnvir.unshift(inR) if inR
473
+ =begin
474
+ if call=="new.TotoIn"
475
+ puts "AVANT"
476
+ p bCall
477
+ p filter2.envir.local["self"]
478
+ end
479
+ =end
480
+ # deal with _args_ argument
481
+ #puts "filter2.local";p filter2.envir.local
482
+ #p filter2.envir.local["_args_"]
483
+ #p Envir.is_listElt?(filter2.envir.local["_args_"])
484
+ if filter2.envir.local["_args_"] and Envir.is_listElt?(filter2.envir.local["_args_"])
485
+ #puts "IICCII"
486
+ filter2.envir.local["_args_"].each{|key,val| filter2.envir.local[key]=val}
487
+ filter2.envir.local.delete("_args_")
488
+ end
489
+ #puts "filter2.local";p filter2.envir.local
490
+ #puts "bCall";p bCall
491
+ #puts "call binding";p filter2.envir.local
492
+ #Dyndoc.warn "rbEnvir tricks", [filter2.envir.extract("binding"),@rbEnvir4calls]
493
+ inRb=filter2.envir.extract("binding") #first the call parameter
494
+ inRb=@rbEnvir4calls[call] unless inRb #second, the tag binding
495
+ rbenvir_go_to(inRb)
496
+ #puts "eval_CALL:bCall";p bCall
497
+ txt=parse(bCall,filter2)
498
+ #puts "eval_CALL:txt";p txt
499
+ rbenvir_back_from(inRb)
500
+ #p filter2.envir.local
501
+ =begin
502
+ if call=="new.TotoIn"
503
+ puts "APRES"
504
+ p filter2.envir.local["self"]
505
+ end
506
+ =end
507
+ #puts ">>def_blck #{call}"
508
+ #puts "av";p @def_blck;p blckcode
509
+ @def_blck.pop if blckcode and !blckcode.empty?
510
+ #puts "ap";p @def_blck;
511
+ ## post-filtering
512
+ txt=filter2.apply(txt,:post,false) ##IMPORTANT: EST-CE VRAIMENT UTILE??? VOIR vC!!!!
513
+ @rEnvir.shift if inR
514
+ filter.envir.local=filter2.envir.local if export
515
+ end
516
+ #puts "FIN CALL"
517
+ return txt
518
+ end
519
+
520
+ def eval_func(call,code,rbEnvir)
521
+ ##p call;p code
522
+ key,args=call.strip.split(/\|/) #no longer ":"
523
+ key.strip!
524
+ #p "@calls[#{key}]"
525
+ @args[key]=args.split(",").map{|e| e.strip} if args
526
+ #p @args[key];p code
527
+ @calls[key]=code
528
+ @rbEnvir4calls={} unless @rbEnvir4calls
529
+ @rbEnvir4calls[key]=rbEnvir if rbEnvir
530
+ #p @rbEnvir4calls
531
+ end
532
+
533
+ def eval_meth(call,code)
534
+ #p call
535
+ key,args=call.strip.split(/\|/) #no longer ":"
536
+ args=(args ? "self,"+args : "self")
537
+ key.strip!
538
+ key2,klass=key.split(".")
539
+ #p "@calls[#{key}]"
540
+ #p key2;p klass
541
+ @args[key]=args.split(",").map{|e| e.strip}
542
+ #p @args[key]
543
+ #p code
544
+ @calls[key]=code
545
+ #this is a method!
546
+ @calls[key2]=:meth
547
+ @meths << key2
548
+ @meths.uniq!
549
+ #p @meths
550
+ @args[key2]=["self"]
551
+ =begin
552
+ #update method parameters
553
+ if @args[key2]
554
+ #update (only the first common parameters, the rest have to be named to be used)
555
+ ok=true
556
+ @args[key2]=(0...([@args[key].length,@args[key2].length].min)).map{|i| ok&=(@args[key][i]==@args[key2][i]);@args[key][i] if ok }.compact
557
+ else
558
+ #first init
559
+ @args[key2]=@args[key]
560
+ end
561
+ =end
562
+ #p @calls
563
+ #puts "args[new]";p @args["new"]
564
+ #p @meths
565
+ end
566
+
567
+ def eval_GLOBALVAR(var,txt,filter,mode="")
568
+ return unless filter.envir.global[var]
569
+ ## texvar already declared in DefaultPre_tmpl.tex
570
+ if mode.empty? or !(["add","append","+"].include? mode)
571
+ filter.envir.global[var][:val][0]=""
572
+ else
573
+ filter.envir.global[var][:val][0] << "\n" unless filter.envir.global[var][:val][0].empty?
574
+ end
575
+ filter.envir.global[var][:val][0] << txt
576
+ end
577
+
578
+ end
579
+
580
+ end
581
+ end