dyndoc-ruby-doc 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/lib/dyndoc/content_only.rb +66 -0
- data/lib/dyndoc/document.rb +909 -0
- metadata +48 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 8973b5e9a90ab0745a7cac9429e9e840a2cbea74
|
|
4
|
+
data.tar.gz: c59310d22bb29f4aeddd9c9c19cc4d9bbf188f5d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5e47f6c9ac9d89057cf07b035296441a91ac8d5203333ad0bebe99fc99a962d00688f8748cbe8d925b05a7991ac24174574be9c5a1bbafb4088001b165d79502
|
|
7
|
+
data.tar.gz: 493a011ea9176bab86823e8e6bd85c7af2000bd2e4d9e4be6cbdce88a49ab1e9fdc08cd14d0034913d15e7ac82ba08897f8be6babd5b9739c861e7d90d61dfd7
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Dyndoc
|
|
2
|
+
|
|
3
|
+
class TemplateContentOnly
|
|
4
|
+
|
|
5
|
+
@@cfg={
|
|
6
|
+
:version=>:V3,
|
|
7
|
+
:format_doc => :tex, #instead of :output
|
|
8
|
+
:format_output => :tex, ## :tex or :html or :tm or :odt
|
|
9
|
+
:mode_doc => :tex, #execution mode
|
|
10
|
+
:rootDoc=>"",
|
|
11
|
+
#:model_doc=>"default", #NO MODEL in this mode
|
|
12
|
+
:pre_doc=>[],
|
|
13
|
+
:post_doc=>[],
|
|
14
|
+
:cmd=> [], # :save , :cat, :pdf or :png, :view behaving differently depending on the format_doc
|
|
15
|
+
:cmd_pandoc_options => [],
|
|
16
|
+
:enc => "utf8"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
attr_accessor :cfg, :tmpl_cfg, :content
|
|
21
|
+
|
|
22
|
+
def initialize(cfg={})
|
|
23
|
+
@content=""
|
|
24
|
+
@cfg=cfg
|
|
25
|
+
@tmpl_cfg=@@cfg.dup
|
|
26
|
+
@tmplMngr=Dyndoc.tmpl_mngr
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def init_tmpl
|
|
30
|
+
@tmplMngr.init_doc(@tmpl_cfg)
|
|
31
|
+
@tmplMngr.init_model(@content) #no model since @cfg[:model_doc] is nil! But, default libraries are loaded!
|
|
32
|
+
@tmplMngr.parse(File.read(Dyndoc.doc_filename("Dyn/Minimum"))+"\n",@tmplMngr.filterGlobal)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
alias init_doc init_tmpl
|
|
36
|
+
|
|
37
|
+
def require_dyndoc_libs(libs)
|
|
38
|
+
libs="{#require]\n"+libs.split("\n").map{|lib| lib.split(",")}.flatten.uniq.join("\n")+"\n[#}\n"
|
|
39
|
+
@tmplMngr.parse(libs,@tmplMngr.filterGlobal)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def prepare_content
|
|
43
|
+
#Dyndoc.warn "prepare_content",@content
|
|
44
|
+
out=@tmplMngr.parse(@content)
|
|
45
|
+
return out
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def make_content(content=nil)
|
|
49
|
+
@content=content if content
|
|
50
|
+
##@tmplMngr.cfg[:debug]=true
|
|
51
|
+
if @tmplMngr.cfg[:debug]
|
|
52
|
+
##puts "@content";p @content
|
|
53
|
+
return prepare_content
|
|
54
|
+
else
|
|
55
|
+
begin
|
|
56
|
+
return prepare_content
|
|
57
|
+
# rescue
|
|
58
|
+
# print "WARNING: fail to eval content #{@content} !!\n"
|
|
59
|
+
# return ""
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
@@ -0,0 +1,909 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'dyndoc-software'
|
|
3
|
+
require 'dyndoc-core'
|
|
4
|
+
|
|
5
|
+
module Dyndoc
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
=begin ##OBSOLETE## replaced by system like dyndoc-ruby-task
|
|
9
|
+
# used for Docker mode
|
|
10
|
+
|
|
11
|
+
module Docker
|
|
12
|
+
|
|
13
|
+
## TO TEST: @@task_file = "/Users/remy/DOCKER_TASK_FILE"
|
|
14
|
+
@@task_file = "/dyndoc-proj/.cache/task_latex_file"
|
|
15
|
+
@@tasks=nil
|
|
16
|
+
|
|
17
|
+
def Docker.init_task_file
|
|
18
|
+
FileUtils.rm_f(@@task_file)
|
|
19
|
+
@@tasks=[]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def Docker.add_task(task)
|
|
23
|
+
@@tasks << task
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def Docker.save_task_file
|
|
27
|
+
File.open(@@task_file,"w") do |f|
|
|
28
|
+
f << @@tasks.join(",")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
=end
|
|
34
|
+
|
|
35
|
+
module DynConfig
|
|
36
|
+
|
|
37
|
+
def init_cfg(cfg=nil)
|
|
38
|
+
@cfg=@@cfg.dup
|
|
39
|
+
read_cfg(cfg) if cfg
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def read_cfg(cfg)
|
|
43
|
+
cfg.each_key do |k|
|
|
44
|
+
@cfg[k]=cfg[k]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# append with partial match
|
|
49
|
+
def append_cfg(cfg)
|
|
50
|
+
return unless cfg.respond_to? "[]"
|
|
51
|
+
keys=@cfg.keys.map{|e| e.to_s}.sort
|
|
52
|
+
cfg.each_key do |k|
|
|
53
|
+
#like R, partial match of the parameter names
|
|
54
|
+
if k2=keys.find{|e| e=~/^#{k}/}
|
|
55
|
+
@cfg[k2.to_sym]=cfg[k]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def [](key)
|
|
61
|
+
@cfg[key]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def []=(key,value)
|
|
65
|
+
@cfg[key]=value
|
|
66
|
+
return self
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
EMPTY_ODT=File.join(ENV["HOME"],"dyndoc","share","odt","2004","empty.odt") if File.exists? File.join(ENV["HOME"],"dyndoc","share","odt","2004","empty.odt")
|
|
72
|
+
EMPTY_ODT=File.join($dyn_gem_root,"share","odt","2004","emptyTex4Ht.odt") if $dyn_gem_root and File.exists? File.join($dyn_gem_root,"share","odt","2004","empty.odt")
|
|
73
|
+
EMPTY_ODT=File.join("/export/prjCqls","share","rsrc","dyndoc","odt","2004","empty.odt") if File.exists? File.join("/export/prjCqls","share","rsrc","dyndoc","odt","2004","empty.odt")
|
|
74
|
+
|
|
75
|
+
#just for a shortcut
|
|
76
|
+
TexDoc={
|
|
77
|
+
:docs=>{
|
|
78
|
+
"main"=>{:cmd=>[:save]} #,:pdf,:view]},
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
OdtDoc={
|
|
83
|
+
:docs=>{
|
|
84
|
+
"main"=>{:cmd=>[:save],:format_doc=>:odt},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
TtmDoc={
|
|
89
|
+
:docs=>{
|
|
90
|
+
"main"=>{:cmd=>[:save],:format_doc=>:ttm},
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
HtmlDoc={
|
|
95
|
+
:docs=>{
|
|
96
|
+
"main"=>{:cmd=>[:save],:format_doc=>:html},
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
class TemplateDocument
|
|
101
|
+
|
|
102
|
+
# GOAL: to deal with a master document which may generate many output with different formats
|
|
103
|
+
# RMK: no attempt to deal with template in odt format which is a next objective.
|
|
104
|
+
# RMK2: later on, one could imagine to propose a text language easily convertible to the expected formats
|
|
105
|
+
|
|
106
|
+
@@cfg={
|
|
107
|
+
:working_dir => "", #directory where dyndoc is processed
|
|
108
|
+
:dyndoc_mode => :normal, #default mode, alternative modes :local_server, :remote_server
|
|
109
|
+
## OBSOLETE: :docker_mode => false,
|
|
110
|
+
:filename_tmpl=>"", #be specified later
|
|
111
|
+
:filename_tmpl_orig=>"", #be specified later
|
|
112
|
+
:lib_dyn_content=>"",
|
|
113
|
+
:dirname_docs=>"", #default directory unless specified by doc!
|
|
114
|
+
:rootDoc=>"",
|
|
115
|
+
:user_input=>[],
|
|
116
|
+
:tag_tmpl=>[], #old part_tag!
|
|
117
|
+
:keys_tmpl=>[],
|
|
118
|
+
:docs=>[], #this one is introduced from version V3 to deal with multidocuments
|
|
119
|
+
:doc_list=>[], #list of documents if nonempty
|
|
120
|
+
:cmd=>[], #list of commands if nonempty for every document
|
|
121
|
+
:cmd_pandoc_options => [], #pandoc options
|
|
122
|
+
:pandoc_filter => "",
|
|
123
|
+
:options => {}, # added for example to compile twice latex
|
|
124
|
+
:dtag=>:dtag,
|
|
125
|
+
:dtags=>[:dtag],
|
|
126
|
+
:raw_mode=>false,
|
|
127
|
+
:model_tmpl=>"default",
|
|
128
|
+
:model_doc=>"default",
|
|
129
|
+
:append => "",
|
|
130
|
+
:verbose => false,
|
|
131
|
+
:debug => false
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
include DynConfig
|
|
136
|
+
|
|
137
|
+
attr_accessor :tmpl_mngr, :docs, :cfg, :basename, :dirname, :basename_orig, :dirname_orig, :content
|
|
138
|
+
|
|
139
|
+
def initialize(name) #docs is a hash containing all the files
|
|
140
|
+
## complete with default extension if not provided
|
|
141
|
+
name += ".dyn" if File.basename(name) == File.basename(name,".*")
|
|
142
|
+
@name=name
|
|
143
|
+
## read config from name
|
|
144
|
+
@cfg=@@cfg.dup
|
|
145
|
+
read_cfg(@name)
|
|
146
|
+
## the template manager
|
|
147
|
+
Dyndoc.tmpl_mngr=@tmpl_mngr = Dyndoc::Ruby::TemplateManager.new(@cfg)
|
|
148
|
+
## the documents
|
|
149
|
+
@docs={}
|
|
150
|
+
make_doc_list
|
|
151
|
+
if @cfg[:content] #a non file based document is a Hash cfg with :content inside (give a basename used for generated files)
|
|
152
|
+
@content=@cfg[:content]
|
|
153
|
+
else
|
|
154
|
+
# find the basename of the template
|
|
155
|
+
@basename=basename_tmpl
|
|
156
|
+
@dirname=File.dirname(@basename)
|
|
157
|
+
@basename=File.basename(@basename)
|
|
158
|
+
#p @basename
|
|
159
|
+
@basename_orig=basename_tmpl_orig
|
|
160
|
+
@dirname_orig=File.dirname(@basename_orig)
|
|
161
|
+
@basename_orig=File.basename(@basename_orig)
|
|
162
|
+
#p @basename_orig
|
|
163
|
+
# read content of the template
|
|
164
|
+
@content=File.read(@cfg[:filename_tmpl])
|
|
165
|
+
end
|
|
166
|
+
# list of Document objects
|
|
167
|
+
#puts "@doc_list (init)";p @doc_list
|
|
168
|
+
@doc_list.each do |kdoc|
|
|
169
|
+
@docs[kdoc]=Document.new(kdoc,self)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def read_cfg(name,mode=:all)
|
|
174
|
+
# cfg_dyn is the options given inside the master template
|
|
175
|
+
cfg_dyn=nil
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
name_tmpl=Dyndoc.name_tmpl(name,mode)
|
|
179
|
+
#Dyndoc.warn "read_cfg:name_tmpl",[name,name_tmpl]
|
|
180
|
+
if name_tmpl
|
|
181
|
+
name_tmpl2=Dyndoc.directory_tmpl? name_tmpl
|
|
182
|
+
if name_tmpl2
|
|
183
|
+
# test if [#cfg] block exists inside _lib.dyn file
|
|
184
|
+
lib_dyn_content=lib_dyn_content_from(name_tmpl2)
|
|
185
|
+
tmp=cfg_dyn_from_lib(lib_dyn_content)
|
|
186
|
+
if tmp[:cfg]
|
|
187
|
+
#p :cfg_from_lib
|
|
188
|
+
cfg_dyn=cfg_dyn_from_code(tmp[:cfg])
|
|
189
|
+
lib_dyn_content=tmp[:lib_dyn_content]
|
|
190
|
+
else
|
|
191
|
+
cfg_dyn=cfg_dyn_from(name_tmpl2)
|
|
192
|
+
end
|
|
193
|
+
cfg_dyn[:filename_tmpl]=name_tmpl2
|
|
194
|
+
cfg_dyn[:lib_dyn_content]=lib_dyn_content
|
|
195
|
+
else
|
|
196
|
+
cfg_dyn=Dyndoc::TexDoc
|
|
197
|
+
end
|
|
198
|
+
cfg_dyn[:filename_tmpl_orig] = name_tmpl
|
|
199
|
+
end
|
|
200
|
+
#Dyndoc.warn "read_cfg:cfg_dyn",cfg_dyn
|
|
201
|
+
|
|
202
|
+
#otherwise it is the default version!
|
|
203
|
+
append_cfg(cfg_dyn) if cfg_dyn
|
|
204
|
+
#read the optional cfg
|
|
205
|
+
read_cmdline
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def lib_dyn_content_from(tmpl=nil)
|
|
209
|
+
code,lib_file = "",nil
|
|
210
|
+
code=File.read(lib_file) if (lib_file=(Dyndoc::Utils.lib_file_exists? tmpl))
|
|
211
|
+
return code
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def cfg_dyn_from_code(code)
|
|
215
|
+
if code and code.is_a? String
|
|
216
|
+
code="{\n"+code+"\n}" if code=~/\A\s*\:/m #to avoid at the beginning { and at the end }!
|
|
217
|
+
##p [code,Object.class_eval(code)]
|
|
218
|
+
return Object.class_eval(code)
|
|
219
|
+
end
|
|
220
|
+
return nil
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def cfg_dyn_from_lib(content)
|
|
224
|
+
return {:cfg=> nil, :lib_dyn_content => content} if content.empty?
|
|
225
|
+
tmp=content.force_encoding("utf-8").split(/\[\#/)
|
|
226
|
+
if tmp[0].empty? and tmp[1][0...4]=="cfg]"
|
|
227
|
+
return {:cfg=> tmp[1][4..-1], :lib_dyn_content => (tmp[0,1]+tmp[2..-1]).join('[#')}
|
|
228
|
+
else
|
|
229
|
+
return {:cfg=> nil, :lib_dyn_content => content}
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def cfg_dyn_from(tmpl)
|
|
234
|
+
code,cfg_file=nil,nil
|
|
235
|
+
code=File.read(cfg_file) if (cfg_file=(Dyndoc::Utils.cfg_file_exists? tmpl))
|
|
236
|
+
##puts "code";p code;p cfg_file
|
|
237
|
+
Utils.clean_bom_utf8!(code) if code
|
|
238
|
+
code="Dyndoc::TexDoc" unless code
|
|
239
|
+
return cfg_dyn_from_code(code)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def read_cmdline
|
|
243
|
+
##p [:read_cmdline,Dyndoc.cfg_dyn]
|
|
244
|
+
cfg_cmdline={}
|
|
245
|
+
cfg_cmdline[:doc_list]=Dyndoc.cfg_dyn[:doc_list] unless Dyndoc.cfg_dyn[:doc_list].empty?
|
|
246
|
+
cfg_cmdline[:cmd]=Dyndoc.cfg_dyn[:cmd_doc] unless Dyndoc.cfg_dyn[:cmd_doc].empty?
|
|
247
|
+
cfg_cmdline[:model_doc]=Dyndoc.cfg_dyn[:model_doc] unless Dyndoc.cfg_dyn[:model_doc].empty?
|
|
248
|
+
cfg_cmdline[:tag_tmpl]=Dyndoc.cfg_dyn[:tag_tmpl] unless Dyndoc.cfg_dyn[:tag_tmpl].empty?
|
|
249
|
+
cfg_cmdline[:options]=Dyndoc.cfg_dyn[:options] unless Dyndoc.cfg_dyn[:options].empty?
|
|
250
|
+
## select doc_list by reading "[#default]" useful in atom
|
|
251
|
+
if !@cfg[:content] and Dyndoc.cfg_dyn[:doc_list].empty? and Dyndoc.cfg_dyn[:tag_tmpl].empty?
|
|
252
|
+
if File.read(@cfg[:filename_tmpl]).force_encoding("utf-8") =~ /^\[\#default\]([^\[]*)\[\#/
|
|
253
|
+
cfg_cmdline[:doc_list]=$1.strip.split(",").map{|e| e.strip}
|
|
254
|
+
puts "Default document: "+cfg_cmdline[:doc_list].join(",")
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
append_cfg(cfg_cmdline)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def make_doc_list
|
|
261
|
+
doc_list=@cfg[:docs].keys
|
|
262
|
+
#puts "@cfg[doc_list]";p @cfg[:doc_list]
|
|
263
|
+
doc_list &= @cfg[:doc_list] unless @cfg[:doc_list].empty?
|
|
264
|
+
#p doc_list
|
|
265
|
+
#deal with aliases
|
|
266
|
+
doc_alias={}
|
|
267
|
+
@cfg[:docs].each_pair{|key,doc|
|
|
268
|
+
doc_alias[key]=doc if doc.is_a? Array
|
|
269
|
+
}
|
|
270
|
+
#puts "doc_alias";p doc_alias
|
|
271
|
+
doc_list=doc_list.map{|key| (doc_alias[key] ? doc_alias[key] : key )}.flatten until (doc_list & doc_alias.keys).empty?
|
|
272
|
+
@doc_list=doc_list
|
|
273
|
+
#puts "doc_list";p @doc_list
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# document basename from template filename
|
|
277
|
+
def basename_tmpl
|
|
278
|
+
##p @cfg[:filename_tmpl]
|
|
279
|
+
mode=Dyndoc.guess_mode(@cfg[:filename_tmpl])
|
|
280
|
+
##p ["mode",mode,Dyndoc.tmplExt[mode]]
|
|
281
|
+
if mode
|
|
282
|
+
name,ext=@cfg[:filename_tmpl].scan(/^(.*)(?:#{Dyndoc.tmplExt[mode].join("|")})$/).flatten.compact
|
|
283
|
+
else
|
|
284
|
+
name,ext=@cfg[:filename_tmpl].scan(/^(.*)(?:_tmpl(\..*)|(\.dyn))$/).flatten.compact
|
|
285
|
+
end
|
|
286
|
+
#p [:name,@cfg[:filename_tmpl],name]
|
|
287
|
+
name
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def basename_tmpl_orig
|
|
291
|
+
mode=Dyndoc.guess_mode(@cfg[:filename_tmpl_orig])
|
|
292
|
+
if mode
|
|
293
|
+
name,ext=@cfg[:filename_tmpl_orig].scan(/^(.*)(?:#{Dyndoc.tmplExt[mode].join("|")})$/).flatten.compact
|
|
294
|
+
else
|
|
295
|
+
name,ext=@cfg[:filename_tmpl_orig].scan(/^(.*)(?:_tmpl(\..*)|(\.dyn))$/).flatten.compact
|
|
296
|
+
end
|
|
297
|
+
name
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def make_all
|
|
301
|
+
if @cfg[:cmd].include? :list
|
|
302
|
+
puts "document list: "+@cfg[:docs].keys.join(", ")
|
|
303
|
+
return
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Added for docker mode
|
|
307
|
+
##OBSOLETE## Docker.init_task_file if Dyndoc.cfg_dyn[:docker_mode]
|
|
308
|
+
|
|
309
|
+
##puts "@doc_list"; p @doc_list
|
|
310
|
+
@doc_list.each do |kdoc|
|
|
311
|
+
@docs[kdoc].make_all
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
##OBSOLETE## Docker.save_task_file if Dyndoc.cfg_dyn[:docker_mode]
|
|
315
|
+
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
class Document ## or more explicitly, CreatedDocument from TemplateDocument
|
|
321
|
+
# each document has its own config parameters
|
|
322
|
+
|
|
323
|
+
@@cfg={
|
|
324
|
+
:key_doc=>"", #to specify in initialize
|
|
325
|
+
:format_doc => :tex, #instead of :output
|
|
326
|
+
:format_output => :tex,
|
|
327
|
+
:mode_doc => :tex, #execution mode
|
|
328
|
+
:rootDoc=>"",
|
|
329
|
+
:model_doc=>"default",
|
|
330
|
+
:pre_doc=>[],
|
|
331
|
+
:post_doc=>[],
|
|
332
|
+
:cmd=> [], # :save , :cat, :pdf or :png, :view behaving differently depending on the format_doc
|
|
333
|
+
:cmd_pandoc_options => [],
|
|
334
|
+
:pandoc_filter => "",
|
|
335
|
+
:filename_doc => "",
|
|
336
|
+
:created_docs => [],
|
|
337
|
+
:dirname_doc=>"",
|
|
338
|
+
:append_doc=>"",
|
|
339
|
+
:tag_doc => [],
|
|
340
|
+
:keys_doc=>[],
|
|
341
|
+
:enc => "utf8",
|
|
342
|
+
:options => {}, # added for example to compile twice latex
|
|
343
|
+
:input => [] # added
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
def Document.cfg
|
|
347
|
+
@@cfg.dup
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
include Dyndoc::DynConfig
|
|
351
|
+
|
|
352
|
+
# gather in @cfg optionnal parameters
|
|
353
|
+
# @content really matters to be included in @cfg!
|
|
354
|
+
|
|
355
|
+
attr_accessor :tmpl_doc, :cfg, :content, :inputs
|
|
356
|
+
|
|
357
|
+
def initialize(key_doc,tmpl_doc)
|
|
358
|
+
@tmpl_doc=tmpl_doc #to be aware of the cfg of tmpl_doc!
|
|
359
|
+
##p [:tmpl_doc,@tmpl_doc]
|
|
360
|
+
@cfg=Document.cfg
|
|
361
|
+
@content=""
|
|
362
|
+
@cfg[:key_doc]=key_doc #just to record the key of this document
|
|
363
|
+
# update @cfg
|
|
364
|
+
## cmd
|
|
365
|
+
@cfg[:cmd].uniq!
|
|
366
|
+
@cfg[:cmd] = [:save] if @cfg[:model_doc] and @cfg[:model_doc] != "default"
|
|
367
|
+
append_cfg(@tmpl_doc.cfg[:docs][key_doc])
|
|
368
|
+
## from command line
|
|
369
|
+
read_cmdline
|
|
370
|
+
# update cmd
|
|
371
|
+
# p @tmpl_doc.cfg[:cmd];p @cfg[:cmd]
|
|
372
|
+
@cfg[:cmd]=@tmpl_doc.cfg[:cmd] unless @tmpl_doc.cfg[:cmd].empty?
|
|
373
|
+
## TODO: MODE MULTIDOC => maybe to correct if options differ for each document
|
|
374
|
+
@cfg[:cmd_pandoc_options]=@tmpl_doc.cfg[:cmd_pandoc_options] unless @tmpl_doc.cfg[:cmd_pandoc_options].empty?
|
|
375
|
+
##p [:pandoc_cfg,@tmpl_doc.cfg[:pandoc_filter]]
|
|
376
|
+
@cfg[:pandoc_filter]=@tmpl_doc.cfg[:pandoc_filter] unless @tmpl_doc.cfg[:pandoc_filter].empty?
|
|
377
|
+
# debug mode
|
|
378
|
+
p @tmpl_doc.cfg if @tmpl_doc.cfg[:debug]
|
|
379
|
+
p [:cfg,@cfg] if @tmpl_doc.cfg[:debug]
|
|
380
|
+
# autocomplete the document filename if necessary!
|
|
381
|
+
filename_completion
|
|
382
|
+
@filename = @cfg[:filename_doc]
|
|
383
|
+
@dirname = @tmpl_doc.dirname_orig
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def read_cmdline
|
|
387
|
+
cfg_cmdline={}
|
|
388
|
+
cfg_cmdline[:format_doc]=Dyndoc.cfg_dyn[:format_doc] unless Dyndoc.cfg_dyn[:format_doc].empty?
|
|
389
|
+
cfg_cmdline[:pandoc_filter]=Dyndoc.cfg_dyn[:pandoc_filter] unless Dyndoc.cfg_dyn[:pandoc_filter].empty?
|
|
390
|
+
append_cfg(cfg_cmdline)
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
=begin
|
|
394
|
+
# do we have to save the content to some file
|
|
395
|
+
def to_be_saved?
|
|
396
|
+
@cfg[:filename_doc]!=:no
|
|
397
|
+
end
|
|
398
|
+
=end
|
|
399
|
+
|
|
400
|
+
def filename_completion
|
|
401
|
+
#p @tmpl_doc.basename_orig
|
|
402
|
+
#p @cfg[:append_doc]
|
|
403
|
+
#p Dyndoc.docExt(@cfg[:format_doc])
|
|
404
|
+
ext_mode=nil
|
|
405
|
+
if @tmpl_doc.basename_orig =~ /\_(html|tex|c|rb|txtl|md|txt|raw)$/
|
|
406
|
+
@cfg[:cmd] += [:make_content,:save]
|
|
407
|
+
ext_mode=$1.to_sym
|
|
408
|
+
@cfg[:format_doc]=@cfg[:mode_doc]=@cfg[:format_output]=(ext_mode == :raw ? :txt : ext_mode )
|
|
409
|
+
last=-(2 + $1.length)
|
|
410
|
+
else
|
|
411
|
+
last=-1
|
|
412
|
+
end
|
|
413
|
+
##DEBUG:
|
|
414
|
+
p [@tmpl_doc.basename_orig[0..last],@tmpl_doc.cfg[:append],@cfg[:append_doc],@cfg[:format_doc],Dyndoc.docExt(ext_mode || @cfg[:format_doc])]
|
|
415
|
+
@cfg[:filename_doc]=@tmpl_doc.basename_orig[0..last]+@tmpl_doc.cfg[:append]+@cfg[:append_doc]+Dyndoc.docExt(ext_mode || @cfg[:format_doc]) if @cfg[:filename_doc].empty?
|
|
416
|
+
##p [:filename_completion,@filename,@cfg[:filename_doc] ]
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
# start ##################################################
|
|
420
|
+
def make_all
|
|
421
|
+
#puts "make_all";p @cfg[:cmd]
|
|
422
|
+
make_prelim
|
|
423
|
+
#
|
|
424
|
+
puts "make_all";p @cfg[:cmd]
|
|
425
|
+
cd_new
|
|
426
|
+
open_log
|
|
427
|
+
|
|
428
|
+
# First, save or rm (both is useless) the old file
|
|
429
|
+
make_old(:save) if @cfg[:cmd].include? :save_old
|
|
430
|
+
make_old(:rm) if @cfg[:cmd].include? :rm_old
|
|
431
|
+
|
|
432
|
+
# make content
|
|
433
|
+
make_content if @cfg[:cmd].include? :make_content
|
|
434
|
+
##OBSOLETE## @content=make_ttm if @cfg[:format_doc]==:ttm
|
|
435
|
+
#puts "make_all";p @cfg[:cmd]
|
|
436
|
+
make_save unless (@cfg[:cmd] & [:save,:save!]).empty?
|
|
437
|
+
##OBSOLETE## make_pandoc if @cfg[:cmd].include? :pandoc
|
|
438
|
+
##OBSOLETE## make_backup if @cfg[:cmd].include? :backup
|
|
439
|
+
##OBSOLETE## make_cat if @cfg[:cmd].include? :cat
|
|
440
|
+
# added for docker mode when latex is done via another docker
|
|
441
|
+
##OBSOLETE## make_docker if Dyndoc.cfg_dyn[:docker_mode] and @cfg[:format_doc]==:tex
|
|
442
|
+
make_task_pdflatex if @cfg[:cmd].include? :pdf ##OBSOLETE## and !Dyndoc.cfg_dyn[:docker_mode]
|
|
443
|
+
make_task_pandoc if @cfg[:cmd].include? :make_task_pandoc
|
|
444
|
+
##OBSOLETE## make_png if @cfg[:cmd].include? :png ##OBSOLETE## and !Dyndoc.cfg_dyn[:docker_mode]
|
|
445
|
+
##OBSOLETE## make_view if @cfg[:cmd].include? :view # added for docker mode when latex is done via another docker
|
|
446
|
+
close_log
|
|
447
|
+
cd_old
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
def open_log
|
|
451
|
+
#p [@tmpl_doc.basename_orig,@tmpl_doc.basename]
|
|
452
|
+
# logfile=File.join(@dirname,@tmpl_doc.basename_orig+".dyn_log")
|
|
453
|
+
# #p logfile
|
|
454
|
+
# $dyn_logger=File.new(logfile,"w")
|
|
455
|
+
@cfg[:created_docs] << @basename+".dyn_log"
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
def close_log
|
|
459
|
+
$dyn_logger.close if $dyn_logger
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def make_prelim
|
|
463
|
+
init_doc
|
|
464
|
+
@cfg[:created_docs]=[]
|
|
465
|
+
##p [:make_prelim,@cfg]
|
|
466
|
+
#update @dirname if @cfg[:dirname_doc] or @tmpl_doc.cfg[:dirname_docs] is fixed!
|
|
467
|
+
if @dirname.empty? and @cfg[:dirname_doc] and !@cfg[:dirname_doc].empty? and File.exist? @cfg[:dirname_doc]
|
|
468
|
+
@dirname= @cfg[:dirname_doc]
|
|
469
|
+
elsif @dirname.empty? and @tmpl_doc.cfg[:dirname_docs] and !@tmpl_doc.cfg[:dirname_docs].empty? and File.exist? @tmpl_doc.cfg[:dirname_docs]
|
|
470
|
+
@dirname= @tmpl_doc.cfg[:dirname_docs]
|
|
471
|
+
end
|
|
472
|
+
#rsrc!
|
|
473
|
+
$dyn_rsrc=File.join("rsrc",@filename)
|
|
474
|
+
@basename=File.basename(@filename,".*")
|
|
475
|
+
Dyndoc.cfg_dir[:file]=File.expand_path(@dirname)
|
|
476
|
+
@curdir=Dir.pwd
|
|
477
|
+
=begin
|
|
478
|
+
# read current path if it exists
|
|
479
|
+
cur_path=File.join(@dirname,".dyn_path")
|
|
480
|
+
Dyndoc.setRootDoc(@cfg[:rootDoc],File.read(cur_path).chomp,true) if File.exists? cur_path
|
|
481
|
+
Dyndoc.make_append unless Dyndoc.appendVar
|
|
482
|
+
=end
|
|
483
|
+
#p "ici";p @cfg
|
|
484
|
+
##p [:pandoc_filter,@cfg[:pandoc_filter]]
|
|
485
|
+
require "dyndoc/common/init"
|
|
486
|
+
#p PANDOC_CMDS
|
|
487
|
+
if @basename =~ /\_(md|tex)2(odt|docx|beamer|s5|dzslides|slideous|slidy|revealjs)$/ or (pandoc_cmd=PANDOC_CMDS.include? "--"+@cfg[:pandoc_filter])
|
|
488
|
+
#p [@basename,$1,$2,pandoc_cmd]
|
|
489
|
+
if pandoc_cmd
|
|
490
|
+
@cfg[:pandoc_filter] =~ /(md|tex)2(odt|docx|beamer|s5|dzslides|slideous|slidy|revealjs)$/
|
|
491
|
+
else
|
|
492
|
+
@basename = @basename[0..(@basename.length-$1.length-$2.length-3)] unless pandoc_cmd
|
|
493
|
+
end
|
|
494
|
+
#p @basename
|
|
495
|
+
@cfg[:cmd] << :make_content << :make_task_pandoc
|
|
496
|
+
@cfg[:cmd] -= [:save]
|
|
497
|
+
@cfg[:cmd].uniq!
|
|
498
|
+
@cfg[:format_doc]=@cfg[:mode_doc]=$1.to_sym
|
|
499
|
+
@cfg[:format_output]=$2.to_sym
|
|
500
|
+
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
def init_doc
|
|
505
|
+
Dyndoc.mode=out=@cfg[:format_doc]
|
|
506
|
+
unless @tmpl_doc.cfg[:raw_mode]
|
|
507
|
+
if ( tmp=Dyndoc.doc_filename("Dyn/.preload",[""],nil))
|
|
508
|
+
@cfg[:pre_doc] += File.read(tmp).split("\n").map{|l| l.split(",")}.flatten.map{|e| e.strip}
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
if (tmp=Dyndoc.doc_filename("Dyn/.postload",[""],nil))
|
|
512
|
+
@cfg[:post_doc] += File.read(tmp).split("\n").map{|l| l.split(",")}.flatten.map{|e| e.strip}
|
|
513
|
+
end
|
|
514
|
+
if out
|
|
515
|
+
## default preload
|
|
516
|
+
out=:tex if out==:ttm
|
|
517
|
+
outDir=out.to_s.capitalize
|
|
518
|
+
if (tmp=Dyndoc.doc_filename("#{outDir}/.preload",[""],nil))
|
|
519
|
+
@cfg[:pre_doc] += File.read(tmp).split("\n").map{|l| l.split(",")}.flatten.map{|e| e.strip}.map{|t| File.join(Dyndoc.cfg_dir[:tmpl_path][out],t)}
|
|
520
|
+
end
|
|
521
|
+
## default postload
|
|
522
|
+
if (tmp=Dyndoc.doc_filename("#{outDir}/.postload",[""],nil))
|
|
523
|
+
@cfg[:post_doc] += File.read(tmp).split("\n").map{|l| l.split(",")}.flatten.map{|e| e.strip}.map{|t| File.join(Dyndoc.cfg_dir[:tmpl_path][out],t)}
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
end
|
|
527
|
+
#p @cfg[:pre_doc]
|
|
528
|
+
#p @cfg[:post_doc]
|
|
529
|
+
#model_doc
|
|
530
|
+
@cfg[:model_doc]=nil unless @tmpl_doc.cfg[:model_tmpl]
|
|
531
|
+
@cfg[:model_doc]=@tmpl_doc.cfg[:model_doc] if @tmpl_doc.cfg[:model_doc]
|
|
532
|
+
@cfg[:cmd] -= [:png,:pdf,:view] if @cfg[:model_doc]=="content"
|
|
533
|
+
# TO REMOVE: Dyndoc.mode=(out)
|
|
534
|
+
# prepare the initialization of the TemplateManager
|
|
535
|
+
@tmpl_doc.tmpl_mngr.init_doc(@cfg)
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
def cd_new
|
|
539
|
+
Dir.chdir(@dirname)
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
def cd_old
|
|
543
|
+
Dir.chdir(@curdir)
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
#like txt (see below) but for string!
|
|
547
|
+
def output(input,echo=0)
|
|
548
|
+
@cfg[:cmd]=:txt
|
|
549
|
+
@cfg[:output]=:txt if @cfg[:output]== :tex
|
|
550
|
+
@cfg[:raw_mode],@cfg[:model_tmpl]=false,nil
|
|
551
|
+
init(@cfg[:output])
|
|
552
|
+
@tmpl_doc.echo=echo
|
|
553
|
+
@tmpl_doc.reinit
|
|
554
|
+
@tmpl_doc.output input
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
# make ###########################################
|
|
559
|
+
# make content
|
|
560
|
+
def make_content
|
|
561
|
+
## if true
|
|
562
|
+
if @tmpl_doc.cfg[:debug] or Settings["cfg_dyn.debug"]
|
|
563
|
+
@tmpl_doc.tmpl_mngr.echo=0
|
|
564
|
+
@tmpl_doc.tmpl_mngr.doc=self
|
|
565
|
+
## p [:make_content,@tmpl_doc.content]
|
|
566
|
+
@content=@tmpl_doc.tmpl_mngr.output(@tmpl_doc.content)
|
|
567
|
+
print "\nmake content for #{@basename} in #{@dirname} -> ok\n"
|
|
568
|
+
else
|
|
569
|
+
print "\nmake content for #{@basename} in #{@dirname}\n"
|
|
570
|
+
begin
|
|
571
|
+
@tmpl_doc.tmpl_mngr.echo=0
|
|
572
|
+
@tmpl_doc.tmpl_mngr.doc=self
|
|
573
|
+
@content=@tmpl_doc.tmpl_mngr.output(@tmpl_doc.content)
|
|
574
|
+
##puts "@content";p @content
|
|
575
|
+
print " -> ok\n"
|
|
576
|
+
rescue
|
|
577
|
+
ok=false
|
|
578
|
+
@content=nil ## added to know if one need to restaure
|
|
579
|
+
print " -> NO, NO and NO!!\n"
|
|
580
|
+
end
|
|
581
|
+
end
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
def make_task_pdflatex
|
|
585
|
+
echo = @cfg[:options][:echo_mode] || @tmpl_doc.cfg[:options][:echo_mode] || false
|
|
586
|
+
nb = @cfg[:options][:pdflatex_nb_pass] || @tmpl_doc.cfg[:options][:pdflatex_nb_pass] || 1
|
|
587
|
+
if @cfg[:format_doc]==:tex
|
|
588
|
+
require 'dyntask'
|
|
589
|
+
DynTask.add_task({cmd: :pdflatex, source: "%"+@basename+".tex", content: @content.force_encoding("utf-8"), nb_pass: nb, echo: echo})
|
|
590
|
+
DynTask.save_tasks(@basename)
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
def make_task_pandoc
|
|
595
|
+
filter=@cfg[:format_doc].to_s + "2" + @cfg[:format_output].to_s
|
|
596
|
+
require 'dyntask'
|
|
597
|
+
task={cmd: :pandoc, content: @content.force_encoding("utf-8"), filter: filter}
|
|
598
|
+
task[:source]="%"+@basename+".tex" if ["tex2docx","tex2odt"].include? filter
|
|
599
|
+
DynTask.add_task(task)
|
|
600
|
+
DynTask.save_tasks(@basename)
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
def make_odt_content_xml
|
|
604
|
+
@content_xml=REXML::Document.new(@content)
|
|
605
|
+
#p @content_xml.to_s
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
def make_odt_automatic_styles
|
|
609
|
+
#puts "make_odt_automatic_styles:@inputs"; p @inputs
|
|
610
|
+
return if !@inputs or @inputs.empty?
|
|
611
|
+
autostyles = @content_xml.root.elements['office:automatic-styles']
|
|
612
|
+
#puts "autostyles";p autostyles
|
|
613
|
+
#p @automatic_styles
|
|
614
|
+
# add the automatic styles from input template
|
|
615
|
+
if autostyles
|
|
616
|
+
@inputs.values.each do |input|
|
|
617
|
+
input.automatic_styles.each_element do |e|
|
|
618
|
+
autostyles << e
|
|
619
|
+
end
|
|
620
|
+
end
|
|
621
|
+
end
|
|
622
|
+
end
|
|
623
|
+
|
|
624
|
+
def make_odt_ressources
|
|
625
|
+
return if !@inputs or @inputs.empty?
|
|
626
|
+
# create directories if necessary
|
|
627
|
+
@ar.find_entry('ObjectReplacements') || @ar.mkdir('ObjectReplacements')
|
|
628
|
+
@ar.find_entry('Pictures') || @ar.mkdir('Pictures')
|
|
629
|
+
# create the necessary files
|
|
630
|
+
@inputs.values.each do |input|
|
|
631
|
+
input.xlink_href.keys.each do |key|
|
|
632
|
+
if (entry=input.ar.find_entry(key))
|
|
633
|
+
@ar.get_output_stream(input.xlink_href[key]) do |f|
|
|
634
|
+
f.write input.ar.read(entry)
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
=begin ##OBSOLETE##
|
|
642
|
+
def make_pandoc
|
|
643
|
+
opts=@cfg[:cmd_pandoc_options]+["-o",@cfg[:pandoc_file_output]]
|
|
644
|
+
## p ["make_pandoc",@content]
|
|
645
|
+
if @cfg[:pandoc_file_input]
|
|
646
|
+
opts << @cfg[:pandoc_file_input]
|
|
647
|
+
p [:make_pandoc_input, opts.join(" ")]
|
|
648
|
+
Converter.pandoc(nil,opts.join(" "))
|
|
649
|
+
else
|
|
650
|
+
p [:make_pandoc_content, opts.join(" "),@content]
|
|
651
|
+
Converter.pandoc(@content,opts.join(" "))
|
|
652
|
+
end
|
|
653
|
+
@cfg[:created_docs] << @cfg[:pandoc_file_output]
|
|
654
|
+
end
|
|
655
|
+
=end
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
# As soon as possible when using dropbox or tools
|
|
659
|
+
def make_old(mode=:rm) #mode=:rm or :save
|
|
660
|
+
## After introduction of dyntask, the default is to save the old file if existing
|
|
661
|
+
if File.exists? @filename
|
|
662
|
+
case mode
|
|
663
|
+
when :save
|
|
664
|
+
FileUtils.mkdir_p(File.join(File.dirname(@filename),".save"))
|
|
665
|
+
FileUtils.mv(@filename,@filename_old=File.join(File.dirname(@filename),".save",File.basename(@filename)))
|
|
666
|
+
when :rm
|
|
667
|
+
FileUtils.rm(@filename)
|
|
668
|
+
end
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
def make_save
|
|
673
|
+
case @cfg[:format_doc]
|
|
674
|
+
when :odt
|
|
675
|
+
#before saving: make automatic styles!
|
|
676
|
+
make_odt_content_xml
|
|
677
|
+
make_odt_automatic_styles
|
|
678
|
+
FileUtils.cp(EMPTY_ODT,@cfg[:filename_doc]) unless File.exists? @cfg[:filename_doc]
|
|
679
|
+
require 'zip'
|
|
680
|
+
@ar=Zip::ZipFile.open(@cfg[:filename_doc])
|
|
681
|
+
@ar.get_output_stream('content.xml') do |f|
|
|
682
|
+
f.write @content_xml.to_s
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
make_odt_ressources
|
|
686
|
+
@ar.close
|
|
687
|
+
else
|
|
688
|
+
##p [:cfg,Dir.pwd,@dirname]
|
|
689
|
+
print "\nsave content in #{@cfg[:filename_doc]} or #{@filename}"
|
|
690
|
+
##p [:make_save,@cfg[:cmd]]
|
|
691
|
+
FileUtils.mkdir_p(File.dirname(@cfg[:filename_doc])) if @cfg[:cmd].include? :save!
|
|
692
|
+
|
|
693
|
+
## if @content is nil => bad execution
|
|
694
|
+
if !@content
|
|
695
|
+
FileUtils.mv(@filename_old,@filename) if @filename_old and File.exists? @filename_old
|
|
696
|
+
else
|
|
697
|
+
## Save new
|
|
698
|
+
File.open(@cfg[:filename_doc],"w") do |f|
|
|
699
|
+
f << @content
|
|
700
|
+
end
|
|
701
|
+
print " -> ok\n"
|
|
702
|
+
@cfg[:created_docs] << @filename #( @dirname.empty? ? "" : @dirname+"/" ) + @filename
|
|
703
|
+
end
|
|
704
|
+
end
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
=begin ##OBSOLETE##
|
|
709
|
+
|
|
710
|
+
def make_cat
|
|
711
|
+
puts @content
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
# make pdf
|
|
716
|
+
|
|
717
|
+
def make_pdf
|
|
718
|
+
nb = @cfg[:options][:pdflatex_nb_pass] || @tmpl_doc.cfg[:options][:pdflatex_nb_pass] || 1
|
|
719
|
+
echo_mode=@cfg[:options][:pdflatex_echo] || @tmpl_doc.cfg[:options][:pdflatex_echo] || false
|
|
720
|
+
nb.times {|i| make_pdflatex(echo_mode) } if @cfg[:format_doc]==:tex
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
def make_docker
|
|
724
|
+
nb = @cfg[:options][:pdflatex_nb_pass] || @tmpl_doc.cfg[:options][:pdflatex_nb_pass] || 1
|
|
725
|
+
if @cfg[:format_doc]==:tex
|
|
726
|
+
Docker.add_task @dirname+";"+@basename+";"+nb.to_s
|
|
727
|
+
end
|
|
728
|
+
end
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
# make prj-tex
|
|
733
|
+
def make_prj_tex
|
|
734
|
+
system "prj-tex #{@basename}"
|
|
735
|
+
print "\nprj-tex #{@basename} in #{@dirname} -> ok\n"
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
# make pdflatex
|
|
739
|
+
def make_pdflatex(echo_mode=false)
|
|
740
|
+
if File.read(@basename+".tex").empty?
|
|
741
|
+
msg="No pdflatex #{@basename} in #{@dirname} since empty file!"
|
|
742
|
+
print "\n==> "+msg
|
|
743
|
+
$dyn_logger.write("ERROR pdflatex: "+msg+"\n") unless Dyndoc.cfg_dyn[:dyndoc_mode]==:normal
|
|
744
|
+
return ""
|
|
745
|
+
end
|
|
746
|
+
print "\n==> #{Dyndoc.pdflatex} #{@basename} in #{@dirname}"
|
|
747
|
+
# NEW: Not to be devkit dependent!!!
|
|
748
|
+
# if RUBY_PLATFORM =~ /(win|w)32$/
|
|
749
|
+
# unless SOFTWARE[:taskkill]
|
|
750
|
+
# cmd = `which taskkill`.strip
|
|
751
|
+
# SOFTWARE[:taskkill]=cmd unless cmd.empty?
|
|
752
|
+
# end
|
|
753
|
+
# if SOFTWARE[:taskkill]
|
|
754
|
+
# system(SOFTWARE[:taskkill]+" /FI \"windowtitle eq "+@basename+".pdf*\"")
|
|
755
|
+
# end
|
|
756
|
+
# end
|
|
757
|
+
|
|
758
|
+
out=`#{Dyndoc.pdflatex} -halt-on-error -file-line-error -interaction=nonstopmode #{@basename}`
|
|
759
|
+
out=out.b if RUBY_VERSION >= "1.9" #because out is not necessarily utf8 encoded
|
|
760
|
+
out=out.split("\n")
|
|
761
|
+
puts out if echo_mode
|
|
762
|
+
if out[-2].include? "Fatal error"
|
|
763
|
+
if Dyndoc.cfg_dyn[:dyndoc_mode]==:normal
|
|
764
|
+
print " -> NOT OKAY!!!\n==> "
|
|
765
|
+
puts out[-4...-1]
|
|
766
|
+
raise SystemExit
|
|
767
|
+
else
|
|
768
|
+
# File.open("#{@dirname}/#{@basename}.dyn_log","w") do |f|
|
|
769
|
+
# f << out[-4...-1]
|
|
770
|
+
# end
|
|
771
|
+
#p out[-4...-1]
|
|
772
|
+
$dyn_logger.write("ERROR pdflatex: "+out[-4...-1].to_s+"\n") if $dyn_logger
|
|
773
|
+
@cfg[:created_docs] << @basename+".log"
|
|
774
|
+
end
|
|
775
|
+
else
|
|
776
|
+
print " -> OKAY!!!\n"
|
|
777
|
+
@cfg[:created_docs] << @basename+".pdf" #( @dirname.empty? ? "" : @dirname+"/" ) + @basename+".pdf"
|
|
778
|
+
end
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# make png
|
|
782
|
+
|
|
783
|
+
def make_png
|
|
784
|
+
make_dvipng if @cfg[:format_doc]==:tex
|
|
785
|
+
end
|
|
786
|
+
|
|
787
|
+
# make latex and dvipng
|
|
788
|
+
def make_dvipng
|
|
789
|
+
system "latex #{@basename}.tex"
|
|
790
|
+
print "\nlatex #{@basename}.tex -> ok\n"
|
|
791
|
+
system "dvipng --nogssafer #{@basename}.dvi -o #{@basename}.png"
|
|
792
|
+
print "\ndvipng --nogssafer #{@basename}.dvi -o #{@basename}.png -> ok\n"
|
|
793
|
+
end
|
|
794
|
+
|
|
795
|
+
# make ttm
|
|
796
|
+
def make_ttm
|
|
797
|
+
#puts "make_ttm:begin"
|
|
798
|
+
Dyndoc::Converter.ttm(@content)
|
|
799
|
+
end
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
# make view
|
|
803
|
+
def make_view
|
|
804
|
+
make_viewpdf if @cfg[:cmd].include? :pdf
|
|
805
|
+
make_viewpng if @cfg[:cmd].include? :png
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
# make view pdf
|
|
810
|
+
def make_viewpdf
|
|
811
|
+
if RUBY_PLATFORM =~ /(win|w)32$/
|
|
812
|
+
unless SOFTWARE[:pdfviewer]
|
|
813
|
+
SOFTWARE[:pdfviewer]="start"
|
|
814
|
+
end
|
|
815
|
+
elsif RUBY_PLATFORM =~ /darwin/
|
|
816
|
+
unless SOFTWARE[:pdfviewer]
|
|
817
|
+
SOFTWARE[:pdfviewer]="open"
|
|
818
|
+
end
|
|
819
|
+
else
|
|
820
|
+
if @tmpl_doc.cfg[:pdfviewer]=="xpdf"
|
|
821
|
+
SOFTWARE[:pdfviewer]="xpdf"
|
|
822
|
+
else
|
|
823
|
+
cmd = `which #{@tmpl_doc.cfg[:pdfviewer]}`.strip
|
|
824
|
+
SOFTWARE[:pdfviewer]=cmd unless cmd.empty?
|
|
825
|
+
end
|
|
826
|
+
end
|
|
827
|
+
if SOFTWARE[:pdfviewer]
|
|
828
|
+
if SOFTWARE[:pdfviewer]=="xpdf"
|
|
829
|
+
##test xpdf is already open
|
|
830
|
+
if `ps aux`.scan("xpdf-#{@basename}").length>0
|
|
831
|
+
system "xpdf -remote xpdf-#{@basename} -reload"
|
|
832
|
+
else
|
|
833
|
+
system "xpdf -remote xpdf-#{@basename} #{@basename}.pdf&"
|
|
834
|
+
end
|
|
835
|
+
print "\n==> xpdf #{@cfg[:filename_doc]}.pdf -> OKAY!!!\n"
|
|
836
|
+
else
|
|
837
|
+
if RUBY_PLATFORM =~ /(win|w)32$/
|
|
838
|
+
`start /B #{@basename}.pdf`
|
|
839
|
+
elsif RUBY_PLATFORM =~ /darwin/
|
|
840
|
+
`open #{@basename}.pdf`
|
|
841
|
+
else
|
|
842
|
+
`#{SOFTWARE[:pdfviewer]} #{@basename}.pdf&`
|
|
843
|
+
end
|
|
844
|
+
end
|
|
845
|
+
end
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
# make view png
|
|
849
|
+
def make_viewpng
|
|
850
|
+
system "#{@tmpl_doc.cfg[:pngviewer]} #{@basename}.png&"
|
|
851
|
+
end
|
|
852
|
+
|
|
853
|
+
=end
|
|
854
|
+
|
|
855
|
+
# TODO: TO UPDATE!!!! file ############################################
|
|
856
|
+
# file tex
|
|
857
|
+
def tex(name)
|
|
858
|
+
@name=name
|
|
859
|
+
start
|
|
860
|
+
cd_new
|
|
861
|
+
make_tex
|
|
862
|
+
make_backup
|
|
863
|
+
cd_old
|
|
864
|
+
end
|
|
865
|
+
|
|
866
|
+
# file pdf
|
|
867
|
+
def tex_pdf(name)
|
|
868
|
+
@cfg[:cmd]=:pdf
|
|
869
|
+
@name=name
|
|
870
|
+
start
|
|
871
|
+
cd_new
|
|
872
|
+
make_tex
|
|
873
|
+
make_backup
|
|
874
|
+
make_pdflatex
|
|
875
|
+
cd_old
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
# file pdf+viewer
|
|
879
|
+
def tex_xpdf(name)
|
|
880
|
+
tex_pdf(name)
|
|
881
|
+
make_viewpdf
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
# file png
|
|
885
|
+
def tex_png(name)
|
|
886
|
+
@cfg[:cmd]=:png
|
|
887
|
+
@name=name
|
|
888
|
+
start
|
|
889
|
+
cd_new
|
|
890
|
+
make_tex
|
|
891
|
+
make_dvipng
|
|
892
|
+
cd_old
|
|
893
|
+
make_viewpng
|
|
894
|
+
end
|
|
895
|
+
|
|
896
|
+
#file txt
|
|
897
|
+
def txt(name)
|
|
898
|
+
@cfg[:cmd]=:txt
|
|
899
|
+
@cfg[:output]=:txt if @cfg[:output]== :tex
|
|
900
|
+
@cfg[:raw_mode],@cfg[:model_tmpl]=false,nil
|
|
901
|
+
@name=name
|
|
902
|
+
start
|
|
903
|
+
cd_new
|
|
904
|
+
make_txt
|
|
905
|
+
cd_old
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
end
|
|
909
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dyndoc-ruby-doc
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- CQLS
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-02-21 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: |2
|
|
14
|
+
Provide templating in text document.
|
|
15
|
+
email: rdrouilh@gmail.com
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- lib/dyndoc/content_only.rb
|
|
21
|
+
- lib/dyndoc/document.rb
|
|
22
|
+
homepage: http://cqls.upmf-grenoble.fr
|
|
23
|
+
licenses:
|
|
24
|
+
- MIT
|
|
25
|
+
- GPL-2
|
|
26
|
+
metadata: {}
|
|
27
|
+
post_install_message:
|
|
28
|
+
rdoc_options: []
|
|
29
|
+
require_paths:
|
|
30
|
+
- lib
|
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
32
|
+
requirements:
|
|
33
|
+
- - '>='
|
|
34
|
+
- !ruby/object:Gem::Version
|
|
35
|
+
version: '0'
|
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
requirements:
|
|
42
|
+
- none
|
|
43
|
+
rubyforge_project:
|
|
44
|
+
rubygems_version: 2.0.14
|
|
45
|
+
signing_key:
|
|
46
|
+
specification_version: 4
|
|
47
|
+
summary: dyndoc document
|
|
48
|
+
test_files: []
|