dyndoc-ruby-core 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,54 @@
1
+ module Dyndoc
2
+ module Ruby
3
+
4
+ class TemplateManager
5
+
6
+ def rbenvir_init(envir)
7
+ @rbEnvir=[envir]
8
+ end
9
+
10
+ def rbenvir_new
11
+ #l'objectif est que comme c'est une méthode toutes les
12
+ #fonctions de parsing de l'objet sont connues!
13
+ binding
14
+ end
15
+
16
+ def rbenvir_go_to(inRb,envir=nil)
17
+ if inRb
18
+ #puts "rbenvir_go_to #{inRb.inspect}"
19
+ inRb=":new" if ["new","none",":none","nil"].include? inRb
20
+ @rbEnvirs={} unless @rbEnvirs
21
+ #p inRb
22
+ @rbEnvirs[inRb]=rbenvir_new if inRb==":new" or !@rbEnvirs[inRb]
23
+ @rbEnvirs[inRb]=envir if envir and inRb!=":new"
24
+ #puts "rbenvir_go_to";p envir
25
+ @rbEnvir.unshift(@rbEnvirs[inRb])
26
+ end
27
+ end
28
+
29
+ def rbenvir_back_from(inRb)
30
+ @rbEnvir.shift if inRb
31
+ end
32
+
33
+ def rbenvir_ls(rbEnvir=nil)
34
+ rbEnvir=@rbEnvir[0] unless rbEnvir
35
+ rbEnvir=@rbEnvirs[rbEnvir] if rbEnvir.is_a? Symbol
36
+ rbEnvir=@rbEnvir[rbEnvir] if rbEnvir.is_a? Integer
37
+ eval("local_variables",rbEnvir)
38
+ end
39
+
40
+ def rbenvir_get(rbEnvir=nil)
41
+ rbEnvir=@rbEnvir[0] unless rbEnvir #the current if nil
42
+ rbEnvir=@rbEnvirs[rbEnvir] if rbEnvir.is_a? Symbol
43
+ rbEnvir=@rbEnvir[rbEnvir] if rbEnvir.is_a? Integer
44
+ rbEnvir
45
+ end
46
+
47
+ def rbenvir_current
48
+ @rbEnvirs.keys.select{|b| @rbEnvirs[b]==@rbEnvir[0]}
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,367 @@
1
+ # encoding: utf-8
2
+
3
+ module Dyndoc
4
+
5
+ CHARS_SET_FIRST=[["_{_","__OPEN__"],["_}_","__CLOSE__"]]
6
+ CHARS_SET_LAST=[["__OPEN__","{"],["__CLOSE__","}"]]
7
+ PROTECT_FORMAT_BLOCKTEXT="<protect-format-blocktext>"
8
+
9
+ module Utils
10
+ ## variable sep!
11
+ def Utils.split_code_by_sep(code,sep="|")
12
+ return code.split("\n").map{|e| e.split(sep)}.flatten
13
+ end
14
+
15
+ def Utils.preserve_pattern(line,pattern,chars)
16
+ line.gsub(pattern){|s| Utils.escape(s,chars)}
17
+ end
18
+
19
+ ## used in [\#var] and [\#set]
20
+ ## protect "|" inside @{toto(...)}
21
+ def Utils.split_code(code,pattern=/@\{.*\}/,chars=["|","@@@"])
22
+ inst=Utils.preserve_pattern(code,pattern,chars)
23
+ inst,*b=inst.split(/\n\-{3,}\n/)
24
+ b=inst.strip.split("\n").map{|e| e.split(chars[0])}.flatten+b if inst
25
+ b.map!{|l| Utils.preserve_pattern(l,pattern,chars.reverse)}
26
+ return b
27
+ end
28
+
29
+ def Utils.silence_warnings(val=nil)
30
+ old_verbose, $VERBOSE = $VERBOSE, val
31
+ yield
32
+ ensure
33
+ $VERBOSE = old_verbose
34
+ end
35
+
36
+ def Utils.make_doc(txt)
37
+ out=txt.split("\n")
38
+ ## Ajout surement du à kile qui rajoutte des "\r" => générant un bug dans R
39
+ out.map!{|e| (e[-1,1]=="\r" ? e[0...-1] : e )}
40
+ return out
41
+ end
42
+
43
+ # TOOLS ###################################
44
+ def Utils.clean_comment(b)
45
+ b.map!{|l| ( l.scan(/([^%]*)(%%.*)/)[0] ? $1.strip : l)}.reject!{|e| e.empty?}
46
+ end
47
+
48
+ def Utils.clean_indent(b)
49
+ start,key=b[0].scan(/(\s*)([^\s]*)/)[0]
50
+ if start.length>0
51
+ b.map!{|l|
52
+ ( (l.index start)==0 ? l[start.length,l.length-start.length] : l )
53
+ }
54
+ end
55
+ end
56
+
57
+ def Utils.escape(str,chars)
58
+ str.gsub(/#{Regexp.escape(chars[0])}/,chars[1])
59
+ end
60
+
61
+ def Utils.escape!(str,chars_set)
62
+ chars_set.each{|chars| str.gsub!(/#{Regexp.escape(chars[0])}/,chars[1]) }
63
+ end
64
+
65
+ def Utils.escape_delim!(str,mode=:last)
66
+ chars_set=(mode==:first ? CHARS_SET_FIRST : CHARS_SET_LAST )
67
+ chars_set.each{|chars| str.gsub!(/#{Regexp.escape(chars[0])}/,chars[1]) }
68
+ return str
69
+ end
70
+
71
+ def Utils.end_line(key,code)
72
+ while key[-1,1]=="\\"
73
+ key=(key[0...-1]+(code.shift)).strip
74
+ end
75
+ return [key,code]
76
+ end
77
+
78
+ def Utils.clean_eol(str)
79
+ str.gsub!("\r\n","\n")
80
+ end
81
+
82
+ def Utils.clean_bom_utf8!(str)
83
+ str.gsub!("\xEF\xBB\xBF", '')
84
+ end
85
+
86
+ # To consider first and last whitespaces put before and after an escaped sequence! Before the string is formatted for indentation convenience!
87
+ def Utils.protect_blocktext(str,seq="__STR__")
88
+ #str=code+str if str[0,1]==" "
89
+ #str=str+code if str[-1,1]==" "
90
+ #puts "protect_blocktext";p str
91
+ #puts "format_blocktext";p Utils.format_blocktext(str)
92
+ seq+Utils.format_blocktext(str)+seq
93
+ end
94
+
95
+ # When considered, remove the escaped sequence!
96
+ def Utils.unprotect_blocktext(str,seq="__STR__")
97
+ #puts "unprotect blocktext";p str
98
+ str.gsub(seq,"")
99
+ end
100
+
101
+ def Utils.format_blocktext(str)
102
+ str.gsub(/\n[ \t\r\f]*\|/,"\n").gsub(/\|\n/,"").gsub("<\\n>","\n").gsub("<\\t>","\t")
103
+ end
104
+
105
+ #called in #txt to protect the corresponding blocktext
106
+ def Utils.protect_format_blocktext(str)
107
+ str.gsub(/\n[ \t\r\f]*\|/) {|e| e.gsub(/\|/,"__BLOCKBAR__")}.gsub(/\|\n/,"__BLOCKBAR__\n").gsub("<\\n>","__BLOCKSPACE__").gsub("<\\t>","__BLOCKTAB__")
108
+ end
109
+
110
+ def Utils.unprotect_format_blocktext(str)
111
+ str.gsub("__BLOCKBAR__","|").gsub("__BLOCKSPACE__","<\\n>").gsub("__BLOCKTAB__","<\\t>").gsub("__RAW__","")
112
+ end
113
+
114
+ def Utils.protect_txt_block(str)
115
+ str2=Utils.protect_format_blocktext(str)
116
+ Utils.escape!(str2,[["{","_{_"],["}","_}_"]])
117
+ Utils.escape_delim!(str2,:first)
118
+ str2
119
+ end
120
+
121
+ def Utils.protect_extraction(str)
122
+ str.gsub(/(?:\#|\#\#|@|#F|#R|#r|\:R|\:r|#Rb|#rb|\:|\:Rb|\:rb)+\{/) {|e| "\\"+e}
123
+ end
124
+
125
+ ## the scanner converts automatically {#toto#} in {#toto][#} and {@toto@} in {@toto][#}
126
+ ## this function does the convert when needed for verbatim or code.
127
+ def Utils.format_call_without_param(code)
128
+ code.gsub(/\{(\#|\@)(\w*)\]\[\#\}/,'{\1\2\1}')
129
+ end
130
+
131
+ def Utils.format_call_without_param!(code)
132
+ code.gsub!(/\{(\#|\@)(\w*)\]\[\#\}/,'{\1\2\1}')
133
+ end
134
+
135
+ def Utils.uuidgen
136
+ `uuidgen`.strip
137
+ end
138
+
139
+
140
+ @@raw_text,@@raw_key,@@raw_var_ls=[],[],[]
141
+
142
+ ## multilines is for @verbatim which behaves differently depending on the number of lines in the content
143
+ ## when the key replaces the content this solves the problem!
144
+ def Utils.dyndoc_raw_text_key(key=nil,multilines=nil)
145
+ "__"+(key=( key ? key : "" ))+"|"+Utils.uuidgen+"__"+(multilines ? "\n__"+key+"__" : "")
146
+ end
147
+
148
+ ## add a raw text
149
+ def Utils.dyndoc_raw_text_add(raw_text,key=nil,gen_key=true)
150
+ @@raw_key << (key=(gen_key ? Utils.dyndoc_raw_text_key(key,raw_text=~/\r?\n/) : key ))
151
+ @@raw_text << [raw_text] #like a pointer!
152
+ #puts "dyndoc_raw_text:key";p key
153
+ key
154
+ end
155
+
156
+ ## find a raw text
157
+ def Utils.dyndoc_raw_text(key=nil)
158
+ if key
159
+ ind=@@raw_key.index{|e| e==key or e=~/^\_\_#{key}/}
160
+ #p (ind ? @@raw_text[ind][0] : nil)
161
+ (ind ? @@raw_text[ind][0] : nil)
162
+ else
163
+ [@@raw_key,@@raw_text]
164
+ end
165
+ end
166
+
167
+ ## apply replacement in out
168
+ def Utils.dyndoc_raw_text!(out,opt={:clean=>nil,:once=>nil})
169
+ @@raw_key.each_index do |i|
170
+ #p [@@raw_key[i],@@raw_text[i]]
171
+ #begin puts @@raw_key[i];p @@raw_text[i];puts @@raw_text[i]; end #if i==1
172
+ @@raw_text[i][0].gsub!('\\\\','\\\\\\\\\\')
173
+ out.gsub!(@@raw_key[i],@@raw_text[i][0]) #if the result is placed into a dyn variable, it can be repeated!
174
+ @@raw_text[i][0]="" if opt[:once] #used only once!!! Ex: used by raw.
175
+ end
176
+ @@raw_text,@@raw_key=[],[] if opt[:clean]
177
+ ##puts "dyndoc_raw:out";puts out
178
+ return out
179
+ end
180
+
181
+ RAW_TAGS={"{#code]"=>"[#code}","{#raw]"=>"[#raw}"}
182
+ RAW_LANG={"r"=>"R","rb"=>"ruby"}
183
+
184
+
185
+ ## Just used inside do_rb in parse_do.rb file to save rbcode before process_rb!
186
+ @@raw_code_to_process=true
187
+ def Utils.raw_code_to_process=(state=nil)
188
+ @@raw_code_to_process=state
189
+ end
190
+
191
+ def Utils.raw_code_to_process
192
+ return @@raw_code_to_process
193
+ end
194
+
195
+
196
+
197
+ def Utils.parse_raw_text!(txt,tmplMngr=nil)
198
+ #puts "parse_raw_text:";p txt
199
+ filter=/(?:(\{\#code\]|\{\#raw\])(\s*[\w\.\-_:]+\s*)(\[\#(?:dyn|R|r|ruby|rb)(?:\>|\<)?\]\n?)|(\[\#code\}|\[\#raw\}))/m
200
+ txt2=txt.split(filter,-1)
201
+ return if txt2.length==1
202
+ #Dyndoc.warn "parse:txt2",txt2
203
+ code=""
204
+ while txt2.length>1
205
+ if RAW_TAGS.keys.include? txt2[0] and txt2[1..-1].include? RAW_TAGS[txt2[0]]
206
+ tag,name,lang=txt2.shift(3)
207
+ name=~/\s*([\w\.\-_:]+)\s*/
208
+ name=$1
209
+ lang=~/\[\#(dyn|R|r|ruby|rb)(\>|\<)?\]/
210
+ lang,type=$1,$2
211
+ lang="dyn" unless lang
212
+ lang=RAW_LANG[lang] if RAW_LANG[lang]
213
+ type="<" unless type
214
+ code2=""
215
+ code2 << txt2.shift until txt2[0]==RAW_TAGS[tag]
216
+ #puts "parse_raw_text:name,type,mode,code";p [name,type,lang,code2]
217
+ key=Utils.dyndoc_raw_text_add(code2,name+"-"+lang)
218
+ #puts "parse_raw_text:key added";p key
219
+ code << key if type==">"
220
+ if tmplMngr
221
+ ## puts inside global envir!
222
+ envir=tmplMngr.filterGlobal.envir
223
+ envir[lang+"."+name+".name"]=key
224
+ envir[lang+"."+name+".code"]=@@raw_text[-1]
225
+ ## "content" would be the name of the result after evaluation and saved in <dyn_basename_file>.dyn_out/raw_code.dyn
226
+ end
227
+ @@raw_var_ls << lang+"."+name #
228
+ txt2.shift #last close tag!
229
+ else
230
+ code << txt2.shift
231
+ end
232
+ end
233
+ code << txt2.join("") #the remaining code
234
+
235
+ ##OLD: @@raw_key_index=@@raw_key.map{|key| key=~/\_\_(.*)\|(.*)/ ? $1 : nil}.compact
236
+ ##puts "code";p code
237
+ txt.replace(code)
238
+
239
+ end
240
+
241
+ def Utils.dyndoc_raw_var_ls
242
+ @@raw_var_ls
243
+ end
244
+
245
+ def Utils.dyndoc_raw_var_eval(var,tmplMngr=nil) #var differs from key since it is saved in filter!
246
+ return "" unless tmplMngr
247
+ #p var
248
+ return ((@@raw_var_ls.include? var) ? tmplMngr.parse(tmplMngr.filterGlobal.envir[var+".code"]) : "" )
249
+ end
250
+
251
+ def Utils.dyndoc_raw_var_save(var,tmplMngr=nil)
252
+ return unless tmplMngr
253
+ #puts "raw_var_save_content";p var+".content"
254
+ envir=tmplMngr.filterGlobal.envir
255
+ content=Utils.dyndoc_raw_var_eval(var,tmplMngr)
256
+ #p content
257
+ envir[var+".eval"]=content
258
+ #for next compilation
259
+ Utils.saved_content_add_as_variable(var+".eval",content,tmplMngr.filename)
260
+ end
261
+
262
+ def Utils.dyndoc_raw_var_content(var,tmplMngr=nil)
263
+ return "" unless tmplMngr
264
+ #puts "var_content";p var+".content"
265
+ #p tmplMngr.filter.envir.global["dyn"]
266
+ #p tmplMngr.filterGlobal.envir
267
+ Utils.dyndoc_raw_var_save(var,tmplMngr) if !tmplMngr.filterGlobal.envir[var+".eval"] or Utils.saved_content_to_be_recreated(tmplMngr).include? var
268
+ tmplMngr.filterGlobal.envir[var+".eval"]
269
+ end
270
+
271
+ SAVED_CONTENTS_FILE="saved_contents.dyn"
272
+
273
+ def Utils.saved_content_fetch_variables_from_file(filename,tmplMngr=nil)
274
+ return unless tmplMngr
275
+ #p filename
276
+ return unless out_rsrc=Dyndoc::Utils.out_rsrc_exists?(filename)
277
+ return unless File.exists?(saved_contents_file=File.join(out_rsrc,SAVED_CONTENTS_FILE)) ##normally, autogenerated!
278
+ #p out_rsrc
279
+ ## fetch the contents by reading and parsing unsing the global filter!
280
+ #puts "saved_contents_file";p saved_contents_file
281
+ code="{#document][#main]"+File.read(saved_contents_file)+"[#}"
282
+ tmplMngr.parse(code,tmplMngr.filterGlobal)
283
+ #puts "fetch var:dyn";p tmplMngr.filter.envir.global["dyn"]
284
+ end
285
+
286
+ @@saved_content_ls=[]
287
+ @@saved_content_to_be_recreated=nil
288
+
289
+ def Utils.saved_content_to_be_recreated(tmplMngr)
290
+ unless @@saved_content_to_be_recreated
291
+ user_input=tmplMngr.filterGlobal.envir["_.EVAL"]
292
+ @@saved_content_to_be_recreated=(user_input ? user_input.strip.split(",") : [])
293
+ end
294
+ @@saved_content_to_be_recreated
295
+ end
296
+
297
+ def Utils.saved_content_add_as_variable(var,result,filename) #var is dyndoc variable
298
+ ##p filename
299
+ out_rsrc=Dyndoc::Utils.mkdir_out_rsrc(filename)
300
+ unless File.exists? File.join(out_rsrc,SAVED_CONTENTS_FILE)
301
+ File.open(File.join(out_rsrc,SAVED_CONTENTS_FILE),"a") do |f|
302
+ f << "[#%] File automatically generated! Remove it for regenerating it!\n"
303
+ end
304
+ end
305
+ ## if it alread exist, delete it first!
306
+ Utils.saved_content_delete_as_variable(var,filename)
307
+ File.open(File.join(out_rsrc,SAVED_CONTENTS_FILE),"a") do |f|
308
+ f << "[#=]"+var+"["+result+"]\n"
309
+ end
310
+ @@saved_content_ls << var
311
+ end
312
+
313
+ def Utils.saved_content_delete_as_variable(var,filename)
314
+ return unless out_rsrc=Dyndoc::Utils.out_rsrc_exists?(filename)
315
+ return unless File.exists?(saved_contents_file=File.join(out_rsrc,SAVED_CONTENTS_FILE))
316
+ saved_contents=File.read(saved_contents_file)
317
+ ## Normally, no problem since no [#=] inside result!
318
+ saved_contents_new=saved_contents.gsub(/\[\#\=\]\s*#{var}\s*\[.*\]\s*\[\#\=\]/m,"[#=]")
319
+ unless saved_contents==saved_contents_new
320
+ File.open(File.join(out_rsrc,SAVED_CONTENTS_FILE),"w") do |f|
321
+ f << saved_contents_new
322
+ end
323
+ @@saved_content_ls.delete(var)
324
+ end
325
+ end
326
+
327
+ def Utils.saved_content_ls
328
+ return @@saved_content_ls
329
+ end
330
+
331
+ def Utils.saved_content_get(var,tmplMngr=nil,force=nil)
332
+ return unless tmplMngr
333
+ if force
334
+ return (Utils.saved_content_to_be_recreated(tmplMngr).include? var) ? nil : tmplMngr.filterGlobal.envir[var]
335
+ else
336
+ return tmplMngr.filterGlobal.envir[var]
337
+ end
338
+ end
339
+
340
+ ## Added for atom
341
+ def Utils.protect_dyn_block_for_atom(txt)
342
+ txt.gsub("#","__DIESE_ATOM__") # => since dyndoc command uses "#" this is very easy way to protect evaluation
343
+ end
344
+
345
+ def Utils.parse_dyn_block_for_interactive!(txt)
346
+ #Dyndoc.warn "parse_dyn_block_for_atom",txt
347
+ filter=/(?:(\{\#dyn>\])|(\[\#dyn>\}))/m
348
+ txt2=txt.split(filter,-1)
349
+ return if txt2.length==1
350
+ #Dyndoc.warn "parse:txt2",txt2
351
+ code=""
352
+ while txt2.length>1
353
+ if txt2[0]=="{#dyn>]" and txt2[1..-1].include? "[#dyn>}"
354
+ start,tmp,stop=txt2.shift(3)
355
+ ## protect the dyndoc code to delay the evaluation after unprotection (in javascript)
356
+ code << Utils.protect_dyn_block_for_atom(tmp.inspect)
357
+ else
358
+ code << txt2.shift
359
+ end
360
+ end
361
+ code << txt2.join("") #the remaining code
362
+ #Dyndoc.warn "atom",code
363
+ txt.replace(code)
364
+ end
365
+
366
+ end
367
+ end
@@ -0,0 +1,234 @@
1
+ #require 'jl4rb'
2
+ #require 'R4rb'
3
+
4
+ # Since more than one language is used for Array transfert
5
+ # This stuff is moved from R4rb package to here
6
+ # => Undone because R4rb is not self-content
7
+ # => methods :> and :< overloaded from R4rb
8
+
9
+ class Array
10
+
11
+ ## Already in R4rb and still there to be self-contents
12
+ # def rb2R=(mode=nil)
13
+ # ##puts "rb2R mode #{object_id}";p mode
14
+ # mode=R4rb unless mode
15
+ # return if @rb2R_mode and @rb2R_mode==mode
16
+ # @rb2R_mode=mode unless @rb2R_mode
17
+ # @rb2R=(@rb2R_mode==Rserve ? Rserve::RVector.new("") : R2rb::RVector.new("") )
18
+ # ##puts "rb2R=";p @rb2R
19
+ # end
20
+
21
+ def rb2jl! #only one mode
22
+ @rb2jl= Julia::Vector.new("")
23
+ ##puts "rb2jl=";p @rb2jl
24
+ end
25
+ # out is a String representing a R or Julia expression
26
+
27
+ def >(out)
28
+ out.strip!
29
+ mode=:r
30
+ #out represents here an R or Julia object
31
+ if out =~ /^jl\:/
32
+ mode,out=:jl,out[3..-1]
33
+ elsif out =~ /^(r|R)\:/
34
+ out=out[2..-1]
35
+ end
36
+ case mode
37
+ when :r
38
+ self.rb2R=nil unless @rb2R
39
+ @rb2R << out
40
+ @rb2R < self
41
+ when :jl
42
+ self.rb2jl=nil unless @rb2jl
43
+ @rb2jl << out
44
+ @rb2jl < self
45
+ end
46
+ return self
47
+ end
48
+
49
+ def <(out) #out represents here an R or Julia expression to execute and put inside the Array
50
+ out.strip!
51
+ mode=:r
52
+ #out represents here an R or Julia object
53
+ if out =~ /^jl\:/
54
+ mode,out=:jl,out[3..-1]
55
+ elsif out =~ /^(r|R)\:/
56
+ out=out[2..-1]
57
+ end
58
+ case mode
59
+ when :r
60
+ self.rb2R=nil unless @rb2R
61
+ @rb2R << out
62
+ @rb2R > self
63
+ when :jl
64
+ self.rb2jl! unless @rb2jl
65
+ @rb2jl << out
66
+ @rb2jl > self
67
+ end
68
+
69
+ return self
70
+ end
71
+
72
+ end
73
+
74
+
75
+ ## Dyndoc Array : ruby Array synchronized to Julia or R Vector
76
+ # when change occurs from any language
77
+ module Dyndoc
78
+
79
+ # Just a fancy funcion to access Dyndoc::Vector in the way as Julia and R
80
+ def Dyndoc.Vec
81
+ Dyndoc::Vector
82
+ end
83
+
84
+ class Vector
85
+
86
+ ## global stuff
87
+ @@all={}
88
+
89
+ def Vector.get
90
+ @@all
91
+ end
92
+
93
+ def Vector.[](key)
94
+ @@all[key.to_s]
95
+ end
96
+
97
+ def Vector.[]=(key,value)
98
+ @@all[key.to_s].replace(value) if value.is_a? Array
99
+ @@all[key.to_s]
100
+ end
101
+
102
+ ## object stuff
103
+ attr_accessor :vectors, :ary, :id
104
+
105
+ # ary is a String when lang is not :rb
106
+ def initialize(langs=[:r],first=[],lang=:rb,vname=nil)
107
+ @ary=(first.is_a? String) ? [] : first
108
+ @vectors={}
109
+ #@to_update={}
110
+ @vname,@id=vname,vname #+"@"+self.object_id.abs.to_s
111
+ if langs.include? :r
112
+ Array.initR
113
+ @vectors[:r]=R4rb::RVector.new ""
114
+ @vectors[:r] << ids(:r)
115
+ @vectors[:r] < @ary unless @ary.empty?
116
+ ##@to_update[:r]=nil
117
+ end
118
+ if langs.include? :jl
119
+ Julia.init
120
+ @vectors[:jl]=Julia::Vector.new ""
121
+ @vectors[:jl] << ids(:jl)
122
+ Julia << wrapper(:jl)+"=Any[]"
123
+ @vectors[:jl] < @ary unless @ary.empty?
124
+ #@to_update[:jl]=nil
125
+ end
126
+ # global register => callable for update
127
+ @@all[ids(:rb)]=self
128
+ # first init
129
+ @unlock=true
130
+ case lang
131
+ when :jl
132
+ Julia << ids(:jl)+"="+first
133
+ sync(:jl)
134
+ ## Julia << "println("+wrapper(:jl)+")"
135
+ when :r,:R
136
+ R4rb << ids(:r)+"<-"+first
137
+ sync(:r)
138
+ ## R4rb << "print("+wrapper(:r)+")"
139
+ end
140
+ end
141
+
142
+ def inspect
143
+ @ary.inspect
144
+ end
145
+
146
+ def ids(lang)
147
+ case lang
148
+ when :rb
149
+ @id
150
+ when :jl
151
+ "Dyndoc.Vec[\""+@id+"\"].ary"
152
+ when :r
153
+ "Dyndoc.Vec[\""+@id+"\"]"
154
+ end
155
+ end
156
+
157
+ def wrapper(lang)
158
+ case lang
159
+ when :rb
160
+ "Dyndoc.Vec[:"+@id+"]"
161
+ when :jl
162
+ "Dyndoc.Vec[\""+@id+"\"]"
163
+ when :r
164
+ "Dyndoc.Vec[\""+@id+"\"]"
165
+ end
166
+ end
167
+
168
+ # from is :rb, :jl or :r
169
+ def sync(from=:rb)
170
+ if @unlock
171
+ @unlock=nil #to avoid the same update several times
172
+ ## Dyndoc.warn "rb sync (from #{from}):",ids(:rb)
173
+ @vectors[from] > @ary unless from==:rb
174
+ ## Dyndoc.warn "new ary",[@vectors[from].name,@vectors[from].value,@ary]
175
+ ([:jl,:r]-[from]).each do |to|
176
+ ## Dyndoc.warn "rb sync (to #{to})"
177
+ @vectors[to] < @ary
178
+ ## Dyndoc.warn "@vectors[#{to}].value", @vectors[to].value
179
+ end
180
+ @unlock=true
181
+ end
182
+ end
183
+
184
+ ## Replacement of sync splitted into 2 parts!
185
+ ## Does not work for sync_to(:jl) => so OBSOLETE from now!
186
+ # from is :rb, :jl or :r
187
+ # def sync_from(from=:rb)
188
+ # if @unlock
189
+ # @unlock=nil #to avoid the same update several times
190
+ # ## Dyndoc.warn "rb sync (from #{from}):",ids(:rb)
191
+ # @vectors[from] > @ary unless from==:rb
192
+ # ## Dyndoc.warn "sync from #{from}",[@vectors[from].name,@vectors[from].value,@ary]
193
+ # ## delay the update when demanded!
194
+ # @to_update[:r]=true unless from==:r
195
+ # @to_update[:jl]=true unless from==:jl
196
+ # @unlock=true
197
+ # end
198
+ # end
199
+
200
+ # # to is :jl or :r (:rb is always up to date)
201
+ # def sync_to(to=:r)
202
+ # if @unlock and @to_update[to]
203
+ # @unlock=nil #to avoid the same update several times
204
+ # ## Dyndoc.warn "sync to #{to}",[@ary,@vectors[to].name]
205
+ # @vectors[to] < @ary
206
+ # ## Dyndoc.warn "done", [@vectors[to].name,@vectors[to].value]
207
+ # @to_update[to]=nil
208
+ # @unlock=true
209
+ # end
210
+ # end
211
+
212
+
213
+ def [](key)
214
+ @ary[key]
215
+ end
216
+
217
+ # when modified from ruby, other languages are updated
218
+ def []=(key,val)
219
+ @ary[key]=val #super
220
+ sync
221
+ self
222
+ end
223
+
224
+
225
+ def replace(ary)
226
+ @ary.replace ary #super ary
227
+ sync
228
+ self
229
+ end
230
+
231
+
232
+ end
233
+
234
+ end