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