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