docgenerator 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/docgenerator.rb +137 -0
- data/docgenerator_attribute.rb +142 -0
- data/docgenerator_characters.rb +171 -0
- data/docgenerator_css.rb +207 -0
- data/docgenerator_document.rb +374 -0
- data/docgenerator_element.rb +570 -0
- data/docgenerator_elements.rb +554 -0
- data/docgenerator_environments.rb +73 -0
- data/docgenerator_footnote.rb +106 -0
- data/docgenerator_lists.rb +163 -0
- data/docgenerator_sections.rb +88 -0
- data/docgenerator_tabular.rb +376 -0
- data/docgenerator_template.rb +103 -0
- data/examples/docgenerator_example.rb +185 -0
- data/packages/docgenerator_attachfile.rb +71 -0
- data/packages/docgenerator_beamer.rb +250 -0
- data/packages/docgenerator_caption.rb +43 -0
- data/packages/docgenerator_hyperref.rb +109 -0
- data/packages/docgenerator_listings.rb +100 -0
- data/packages/docgenerator_pdfpages.rb +18 -0
- data/packages/docgenerator_scrlettr2.rb +128 -0
- data/packages/docgenerator_scrpage2.rb +172 -0
- data/packages/docgenerator_url.rb +84 -0
- metadata +68 -0
@@ -0,0 +1,570 @@
|
|
1
|
+
class Object
|
2
|
+
alias :old_is_a? :is_a?
|
3
|
+
#Redefine the standard is_a?
|
4
|
+
#Returns also true, if one of the ids is in testvalu
|
5
|
+
def is_a?( testvalue)
|
6
|
+
if testvalue.old_is_a?(Symbol)
|
7
|
+
if old_is_a?(Element)
|
8
|
+
return ids.include?(testvalue)
|
9
|
+
else
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
else
|
13
|
+
return old_is_a?(testvalue)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
#This class defines possible elements of a document.
|
18
|
+
#For each type of elements a class is defined.
|
19
|
+
#The definition can be done explicite or generic with Element.create.
|
20
|
+
#
|
21
|
+
#All types of elements are stored in a hash,
|
22
|
+
#the elements can be created via the method Element.get (or element() ).
|
23
|
+
#
|
24
|
+
#Tracing
|
25
|
+
#Often there is the problem, that you get an error when you write the element.
|
26
|
+
#But the error is done, when the element is created.
|
27
|
+
#When you redefine ELEMENTS_TRACE, some tracing information are stored during creation.
|
28
|
+
class Element
|
29
|
+
include Backlinks
|
30
|
+
#Hash with all ids and their corresponding classes.
|
31
|
+
@@ids = Hash.new( )
|
32
|
+
#All attributes are stored in this hash.
|
33
|
+
#The key is the corresponding class.
|
34
|
+
@@attr = { Element => {} }
|
35
|
+
#All output routines are stored in this hash.
|
36
|
+
#The key is the corresponding class.
|
37
|
+
@@log = false
|
38
|
+
def Element.log=( log )
|
39
|
+
@@log = log
|
40
|
+
end
|
41
|
+
#Flag, if the calling stack should be analysed for each Element
|
42
|
+
#Only for document debbuging
|
43
|
+
@@trace = nil
|
44
|
+
#Set Element tracing on/off
|
45
|
+
def Element.trace=( val )
|
46
|
+
@@trace = val
|
47
|
+
end
|
48
|
+
|
49
|
+
SUPPORTED_TARGETS = [ :latex, :html, :wiki, :text, :debug ]
|
50
|
+
|
51
|
+
#Return a element class.
|
52
|
+
def Element.get( name )
|
53
|
+
return @@ids[name]
|
54
|
+
end
|
55
|
+
#This method is called, when a subclass of this class is defined.
|
56
|
+
#This can happen via Element.create or in another programm.
|
57
|
+
#
|
58
|
+
#Add subclasses to the list of all element classes and initialize some internal hashes.
|
59
|
+
def Element.inherited( subclass )
|
60
|
+
puts "New subclass for 'Element' created: '#{subclass}'" if @@log
|
61
|
+
#All attributes of a class are collected in a hash.
|
62
|
+
@@attr[subclass] = {}
|
63
|
+
#Fill @@ids
|
64
|
+
#There is no possibility to give a list of id's or names to a 'inherit'-method.
|
65
|
+
#So a special method Element.add is used.
|
66
|
+
Element.add( [subclass], subclass )
|
67
|
+
end
|
68
|
+
#Add a new element class or assign another name (synonym) for a class.
|
69
|
+
#The initial call is made by Element.inherited.
|
70
|
+
def Element.add( idlist, elementClass )
|
71
|
+
if ! elementClass.new.kind_of?( Element )
|
72
|
+
raise "Element.add get no Element-class #{elementClass}"
|
73
|
+
end
|
74
|
+
if ! idlist.kind_of?( Array )
|
75
|
+
idlist = [ idlist ]
|
76
|
+
end
|
77
|
+
idlist.each{|id|
|
78
|
+
if @@ids[ id ] == nil
|
79
|
+
puts "Element class '#{id}' is new: #{elementClass}" if @@log
|
80
|
+
#All new ids are collected
|
81
|
+
@@ids[ id ] = elementClass
|
82
|
+
elsif @@ids[ id ] == elementClass
|
83
|
+
puts "Element class '#{id}' is defined double: #{elementClass}" if @@log
|
84
|
+
else
|
85
|
+
puts "Error: ID '#{id}' is redefined #{@@ids[id]} -> #{elementClass}"
|
86
|
+
@@ids[id] = elementClass
|
87
|
+
end
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
#Generic creation of a new class to define a new element.
|
92
|
+
#- name must be defined.
|
93
|
+
#- attr is a hash with all attributes.
|
94
|
+
# For details see Element.add_attributes
|
95
|
+
#- content is a flag, which defines if the element contains "content".
|
96
|
+
# Valid values are:
|
97
|
+
# - true: content available and necessary (e.g. <p>)
|
98
|
+
# - :empty_ok: content available, but not necessary (e.g. <td> or iframe)
|
99
|
+
# - false: no content, no endtag, but tag closed with / (example: <br />)
|
100
|
+
# - nil: no content, no endtag, no closing (example: <br>)
|
101
|
+
#- output contains a hash with logic, how to handle the output.
|
102
|
+
# -:htmltag Tag for html-output.
|
103
|
+
# -:latex Template for LaTeX-output
|
104
|
+
# -:html Template for HTML-output
|
105
|
+
def Element.create( name, attr = {}, content = false, output = {} )
|
106
|
+
#First some checks
|
107
|
+
if ! attr.kind_of?( Hash )
|
108
|
+
raise "Type error Element.create: Expected Hash, get #{attr.class}"
|
109
|
+
end
|
110
|
+
#Generic class creation
|
111
|
+
elementclass = Class.new( Element )
|
112
|
+
#Add the id of the new class to central collection.
|
113
|
+
Element.add( name, elementclass )
|
114
|
+
|
115
|
+
#Set a flag, if the class can contain 'content'.
|
116
|
+
#-true: content available and necessary (e.g. <p>)
|
117
|
+
#-:empty_ok: content available, but not necessary (e.g. <td>)
|
118
|
+
#-false: no content, no endtag, but tag closed with / (example: <br />)
|
119
|
+
#-nil: no content, no endtag, no closing (example: <br>)
|
120
|
+
elementclass.class_eval( %Q|
|
121
|
+
def content?()
|
122
|
+
return #{content.inspect}
|
123
|
+
end|)
|
124
|
+
|
125
|
+
output.each{ |k,v|
|
126
|
+
case k
|
127
|
+
when :latex
|
128
|
+
elementclass.add_output( :latex, v )
|
129
|
+
when :html
|
130
|
+
elementclass.add_output( :html, v )
|
131
|
+
when :text
|
132
|
+
elementclass.add_output( :text, v )
|
133
|
+
when :wiki
|
134
|
+
elementclass.add_output( :wiki, v )
|
135
|
+
when :htmltag
|
136
|
+
if v
|
137
|
+
elementclass.class_eval( "def htmltag()\n'#{v}'\nend" )
|
138
|
+
else
|
139
|
+
elementclass.class_eval( "def htmltag()\nnil\nend" )
|
140
|
+
end
|
141
|
+
else
|
142
|
+
puts "Unknown format #{k} for #{name}"
|
143
|
+
end
|
144
|
+
}
|
145
|
+
elementclass.add_attributes( attr )
|
146
|
+
#Return the class.
|
147
|
+
return elementclass
|
148
|
+
end
|
149
|
+
#Return all id's of the class.
|
150
|
+
#This method is expanded in Element.add.
|
151
|
+
def ids( )
|
152
|
+
myids = []
|
153
|
+
@@ids.each{|k,v| myids << k if v == self.class }
|
154
|
+
return myids
|
155
|
+
end
|
156
|
+
#Prepares an overview on all Elements.
|
157
|
+
#Can be used for some debugging.
|
158
|
+
def Element.overview( list = @@ids.values.uniq )
|
159
|
+
if ! list.kind_of?(Array)
|
160
|
+
list = [ list ]
|
161
|
+
end
|
162
|
+
result = '=' * 10 + "\nElement overview:"
|
163
|
+
list.each{ |k|
|
164
|
+
result += "\n#{k}\n"
|
165
|
+
result += "\tId's:\t\t"
|
166
|
+
result += k.new.ids.join("\n\t\t\t")
|
167
|
+
result += "\n\tAttributes:\t"
|
168
|
+
result += "can contain "
|
169
|
+
result += "no " if ! k.new.content?
|
170
|
+
result += "content\n\t\t\t"
|
171
|
+
@@attr[k].each{ |k2,v|
|
172
|
+
result += "#{k2}:\t#{v.inspect}\n\t\t\t"
|
173
|
+
}
|
174
|
+
}
|
175
|
+
return result
|
176
|
+
end
|
177
|
+
#Add possible attributes to an element class.
|
178
|
+
#Attributes are defined in a hash, each key get a array with values.
|
179
|
+
#The values can be:
|
180
|
+
#- OBLIGATORY/OPTIONAL
|
181
|
+
#- Alias (this allows the usage of a position and a name for a parameter).
|
182
|
+
#- allowed elements ( e.g. list content only list items)
|
183
|
+
#Problem: Attributes are not inherited. See Element.get_attribute_list
|
184
|
+
#
|
185
|
+
#This method is called from a subclass.
|
186
|
+
#Fixme: add_attributes overwrites everything.
|
187
|
+
def Element.add_attributes( attr )
|
188
|
+
elattr = @@attr[self] #self is the class
|
189
|
+
attr.each{ |k,a |
|
190
|
+
elattr[k] = a
|
191
|
+
}
|
192
|
+
end
|
193
|
+
#Returns list of attributes.
|
194
|
+
#Can be used for copying attributes from one class to another class.
|
195
|
+
def Element.get_attribute_list( elementclass )
|
196
|
+
return @@attr[elementclass]
|
197
|
+
end
|
198
|
+
#Add an output routine.
|
199
|
+
def Element.add_output( target, string )
|
200
|
+
case target
|
201
|
+
when :latex
|
202
|
+
cmd = "def to_latex()\n"
|
203
|
+
when :html
|
204
|
+
cmd = "def to_html()\n"
|
205
|
+
when :text
|
206
|
+
cmd = "def to_text()\n"
|
207
|
+
when :wiki
|
208
|
+
cmd = "def to_wiki()\n"
|
209
|
+
else
|
210
|
+
puts "#{self}: Undefined target format #{target}"
|
211
|
+
end
|
212
|
+
if ! string.kind_of?( String )
|
213
|
+
puts "Error element <#{self.new.ids}>: #{string.inspect} is no String"
|
214
|
+
end
|
215
|
+
template = string.gsub(/\\/, '\\\\\\')
|
216
|
+
template.gsub!(/"/, '\"')
|
217
|
+
cmd += "\"#{template}\"\n"
|
218
|
+
cmd += "end\n"
|
219
|
+
class_eval( cmd )
|
220
|
+
end
|
221
|
+
#Defines an element.
|
222
|
+
#
|
223
|
+
#There are two ways to add values:
|
224
|
+
#- "named" values in an hash.
|
225
|
+
# This named values can be attributes of a HTML-Tag or Parameters of a TeX-Makro.
|
226
|
+
# There is a check, if the attribute exist.
|
227
|
+
#- Content. Values "inside" the element.
|
228
|
+
# The content can be the content of a HTML-Tag or the content of a TeX-Environment.
|
229
|
+
# There is a check, if this class allows content.
|
230
|
+
def initialize( attr={}, content = nil)
|
231
|
+
#@attr is a hash containing the values for each attribute.
|
232
|
+
@attr = Hash.new( )
|
233
|
+
if self.content?()
|
234
|
+
@content = []
|
235
|
+
else
|
236
|
+
@content = nil
|
237
|
+
end
|
238
|
+
@part_of = [] #list of elements, where this element is part of (normaly only one element)
|
239
|
+
@part_of_doc = [] #list of documents, where this element is part of (normaly only one element)
|
240
|
+
@crbefore = false #make \n before element
|
241
|
+
@crmid = false #make \n before and after opening/closing html-tag
|
242
|
+
@crafter = false #make \n after element
|
243
|
+
#List of targets, where the element can be used.
|
244
|
+
#Details see method restrict_to()
|
245
|
+
#Default: allsupported targets
|
246
|
+
@targets = SUPPORTED_TARGETS.dup
|
247
|
+
@suppressed_targets = []
|
248
|
+
|
249
|
+
#Initialize the attribute hash.
|
250
|
+
@@attr[self.class].each{ |k,a|
|
251
|
+
#type check on Attribute does not work .
|
252
|
+
if a.kind_of?( Symbol )
|
253
|
+
#Filled in the second run
|
254
|
+
#~ @attr[k] = @attr[a]
|
255
|
+
elsif a #.kind_of?( Attribute )
|
256
|
+
@attr[k] = a.new( k, self )
|
257
|
+
else
|
258
|
+
@attr[k] = Attribute.create().new( k, self )
|
259
|
+
end
|
260
|
+
}
|
261
|
+
#Assign Alias-Attributes
|
262
|
+
@@attr[self.class].each{ |k,a|
|
263
|
+
next if !a.kind_of?( Symbol )
|
264
|
+
if @attr[a]
|
265
|
+
@attr[k] = @attr[a]
|
266
|
+
else
|
267
|
+
puts "Undefined Alias-Attribute #{k}"
|
268
|
+
@attr[k] = Attribute.create().new( k, self )
|
269
|
+
end
|
270
|
+
}
|
271
|
+
attr.each{ |k,v|
|
272
|
+
if @attr[k]
|
273
|
+
@attr[k] << v
|
274
|
+
else
|
275
|
+
puts "Usage of unknown attribute '#{k}' in '#{self.ids.join(',')}'"
|
276
|
+
end
|
277
|
+
}
|
278
|
+
@called_by = prepare_tracing_info( @@trace )
|
279
|
+
self << content if content
|
280
|
+
end
|
281
|
+
#List (array) of targets, where the element can be used.
|
282
|
+
#Default are all supported targets.
|
283
|
+
#
|
284
|
+
#With restrictions of this attribute, elements can be restricted on special documents.
|
285
|
+
def restrict_to( *argv )
|
286
|
+
@targets = []
|
287
|
+
@suppressed_targets = SUPPORTED_TARGETS.dup
|
288
|
+
puts "Element#restrict_to: #{self.inspect} restrict to #{argv.inspect}" if @@log
|
289
|
+
argv.each{ |arg|
|
290
|
+
#~ if ! SUPPORTED_TARGETS.include?( arg )
|
291
|
+
if ! @suppressed_targets.delete( arg )
|
292
|
+
puts "Restriction for unsupported target #{arg}" if @@log
|
293
|
+
end
|
294
|
+
@targets << arg
|
295
|
+
}
|
296
|
+
self
|
297
|
+
end
|
298
|
+
#Only for debbuging reasons.
|
299
|
+
#Should contain the first "no docgenerator.rb-place, where part is called
|
300
|
+
#if @@trace is on, some tracing information is stored during creation.
|
301
|
+
def prepare_tracing_info( doit = @@trace )
|
302
|
+
return nil if ! doit
|
303
|
+
caller().each{|c|
|
304
|
+
next if ( /DocumentGenerator/ =~ c )
|
305
|
+
return c
|
306
|
+
}
|
307
|
+
#--> No calling stack found --> Error
|
308
|
+
puts '----'*10
|
309
|
+
puts 'Element#prepare_tracing_info: Found no starting place in caller stack'
|
310
|
+
caller().each{|c| puts c }
|
311
|
+
puts '----'*10
|
312
|
+
return caller()
|
313
|
+
end
|
314
|
+
def inspect()
|
315
|
+
if @@trace
|
316
|
+
called_by = ", Created in #{@called_by}"
|
317
|
+
else
|
318
|
+
called_by = nil #'unknown. Please set Elements.trace if needed'
|
319
|
+
end
|
320
|
+
return "<Class Element(#{self.ids.join(',')})#{called_by}>"
|
321
|
+
#~ if @content
|
322
|
+
#~ return "<Class Element(#{self.ids.join(',')}) @content=#{@content.inspect}>"
|
323
|
+
#~ else
|
324
|
+
#~ return "<Class Element(#{self.ids.join(',')}) @attr=#{@attr.inspect}>"
|
325
|
+
#~ end
|
326
|
+
end
|
327
|
+
#Accessor on content
|
328
|
+
attr_reader :content
|
329
|
+
#Add something to the content.
|
330
|
+
#Only possible on elements, which supports "content".
|
331
|
+
def << ( content )
|
332
|
+
if @content
|
333
|
+
@content << content
|
334
|
+
else
|
335
|
+
puts "Add content to an element without this feature (#{self.ids}, #{content.inspect}"
|
336
|
+
#~ @site.add2log( :error, "Add content to an element without this feature (#{self.ids}, #{content.inspect}" )
|
337
|
+
end
|
338
|
+
set_backlink( content )
|
339
|
+
end
|
340
|
+
|
341
|
+
#Add content after a target (other content)
|
342
|
+
# insertafter(target,*obj)
|
343
|
+
#Requires the ability of "content".
|
344
|
+
def insertafter(target,*obj)
|
345
|
+
self.insert(target, 1, obj)
|
346
|
+
end
|
347
|
+
#Add content before a target (other content)
|
348
|
+
# insertbefore(target,*obj)
|
349
|
+
#Requires the ability of "content".
|
350
|
+
def insertbefore(target,*obj)
|
351
|
+
self.insert(target, 0, obj)
|
352
|
+
end
|
353
|
+
#Insert content relative to a given target.
|
354
|
+
#The target must exist, pos defines the relative position (0=before, 1=one after the element).
|
355
|
+
#Method called by Element#insertbefore and Element#insertafter.
|
356
|
+
def insert(target,pos,*obj )
|
357
|
+
if @content
|
358
|
+
if @content.include?( target )
|
359
|
+
@content[@content.index(target)+pos ,0] = obj
|
360
|
+
else
|
361
|
+
puts "Insert content not possible. Reference object does not exist (#{target.inspect})"
|
362
|
+
end
|
363
|
+
else
|
364
|
+
puts "Add content to an element without this feature"
|
365
|
+
end
|
366
|
+
self
|
367
|
+
end
|
368
|
+
#Delete the given object.
|
369
|
+
def delete(target )
|
370
|
+
if @content
|
371
|
+
@content.delete( target )
|
372
|
+
else
|
373
|
+
puts "Delete content of an element without this feature"
|
374
|
+
end
|
375
|
+
self
|
376
|
+
end
|
377
|
+
#Insert an empty line after the last entry
|
378
|
+
def cr()
|
379
|
+
@crafter = true
|
380
|
+
self
|
381
|
+
end
|
382
|
+
#Insert an empty line before and after the last entry
|
383
|
+
def Cr()
|
384
|
+
@crbefore = true
|
385
|
+
@crafter = true
|
386
|
+
self
|
387
|
+
end
|
388
|
+
#Insert an empty line after the last entry and after the opening of the tag.
|
389
|
+
#This feature has it reason for lists, when each :li-tag gets a cr.
|
390
|
+
#The first item gets also a cr.
|
391
|
+
def cR()
|
392
|
+
@crbefore = false
|
393
|
+
@crmid = true
|
394
|
+
@crafter = true
|
395
|
+
self
|
396
|
+
end
|
397
|
+
#Insert an empty line before and after the last entry and after the opening of the tag.
|
398
|
+
def CR()
|
399
|
+
@crbefore = true
|
400
|
+
@crmid = true
|
401
|
+
@crafter = true
|
402
|
+
self
|
403
|
+
end
|
404
|
+
#Accessor on attribute list
|
405
|
+
attr_reader :attr
|
406
|
+
#Return an attribute to add content.
|
407
|
+
def [] (key)
|
408
|
+
attr = @attr[key]
|
409
|
+
if !attr
|
410
|
+
puts "Request unknown attribute '#{key}', return a dummy"
|
411
|
+
attr = Attribute.create( ).new(key, self)
|
412
|
+
end
|
413
|
+
return attr
|
414
|
+
end
|
415
|
+
#Default setting, each element class may contain contents.
|
416
|
+
#Can be redefined by Elements.create.
|
417
|
+
#-true: content available and necessary (e.g. <p>)
|
418
|
+
#-:empty_ok: content available, but not necessary (e.g. <td>)
|
419
|
+
#-false: no content, no endtag, but tag closed with / (example: <br />)
|
420
|
+
#-nil: no content, no endtag, no closing (example: <br>)
|
421
|
+
def content?()
|
422
|
+
return true
|
423
|
+
end
|
424
|
+
#check if there is content assigned.
|
425
|
+
def empty?()
|
426
|
+
return @content.empty?
|
427
|
+
end
|
428
|
+
@@level = 0
|
429
|
+
#Build a String to be used for the target document.
|
430
|
+
#Calls Element#to_latex and Element#to_html.
|
431
|
+
def to_s( target = Document.target( self ) )
|
432
|
+
#Return empty string, if target is not requested.
|
433
|
+
if ! @targets.include?( target )
|
434
|
+
if @suppressed_targets.include?(target)
|
435
|
+
puts "Element#to_s: Content of #{self.inspect} suppressed for Target #{target.inspect}." if @@log
|
436
|
+
else
|
437
|
+
puts "Element#to_s: Target #{target.inspect} not supported for #{self.inspect}." if @@log
|
438
|
+
end
|
439
|
+
return ''
|
440
|
+
end
|
441
|
+
#Some checks
|
442
|
+
@attr.each{|k,v|
|
443
|
+
if v.required? and v.to_s == '' and v.settings.include?(target)
|
444
|
+
puts "#{self.ids}: Attribut '#{k}' without required value"
|
445
|
+
end
|
446
|
+
}
|
447
|
+
#Build the string.
|
448
|
+
result = ''
|
449
|
+
case target
|
450
|
+
when :latex
|
451
|
+
result = to_latex()
|
452
|
+
when :html
|
453
|
+
result = to_html()
|
454
|
+
when :wiki
|
455
|
+
result = to_wiki()
|
456
|
+
when :text
|
457
|
+
result = to_text()
|
458
|
+
when :debug
|
459
|
+
@@level += 1
|
460
|
+
result = "\n<element #{self.ids.join(',')} begin>"
|
461
|
+
@attr.each{|k,v|
|
462
|
+
#result += "\n\t#{k}: #{v.inspect}"
|
463
|
+
if v != []
|
464
|
+
result += "\n\t#{k}:"
|
465
|
+
v.each{|v2|
|
466
|
+
result += v2.to_s
|
467
|
+
}
|
468
|
+
end
|
469
|
+
}
|
470
|
+
result += @content.to_s
|
471
|
+
result += "\n<element #{self.ids.join(',')} end>"
|
472
|
+
@@level -= 1
|
473
|
+
result.gsub!(/^/, "\t" * @@level )
|
474
|
+
else
|
475
|
+
puts "Undefined target format '#{target}'"
|
476
|
+
end
|
477
|
+
#Already added in submethods
|
478
|
+
#~ result = "\n#{result}" if @crbefore
|
479
|
+
#~ result << "\n" if @crafter
|
480
|
+
return result
|
481
|
+
end
|
482
|
+
#This is a dummy method, called from Element#to_s for the target format LaTeX.
|
483
|
+
#This method must be overwritten from the element class.
|
484
|
+
#
|
485
|
+
#By default, the concatenation of all ids and the content is taken.
|
486
|
+
def to_latex()
|
487
|
+
puts "Missing output routine for LaTeX (#{self.ids.join(',')}) [#{@called_by}]" if @@log
|
488
|
+
cmd = ''
|
489
|
+
cmd << "\n" if @crbefore
|
490
|
+
cmd << "\\#{self.ids}{#{@content}}"
|
491
|
+
cmd << "\n" if @crafter
|
492
|
+
return cmd
|
493
|
+
end
|
494
|
+
#Method for definition inside Element.create.
|
495
|
+
def linebreak( flag = true )
|
496
|
+
flag ? "\n" : ''
|
497
|
+
end
|
498
|
+
#Prints the optional attribut key inside []. If empty, nil is returned
|
499
|
+
def texoptional(key)
|
500
|
+
return nil if ! @attr[key].filled?
|
501
|
+
return "[#{@attr[key]}]"
|
502
|
+
end
|
503
|
+
#Build key-val options from attributs.
|
504
|
+
#Used e.g. by includegraphics.
|
505
|
+
def texkeyval()
|
506
|
+
keyval = []
|
507
|
+
@attr.sort_by{|k,v| v.sortkey }.each{|k,v|
|
508
|
+
keyval << "#{k}={#{v}}" if v.to_s != '' and v.texkeyval?
|
509
|
+
}
|
510
|
+
return keyval.join(', ')
|
511
|
+
end
|
512
|
+
#Method for html-output.
|
513
|
+
#If the method is redefined, the result is taken as a tag.
|
514
|
+
def htmltag()
|
515
|
+
''
|
516
|
+
end
|
517
|
+
#This is a dummy method, called from Element#to_s for the target format HTML.
|
518
|
+
#The tag from Element.htmltag is taken and all attributes and the content are used.
|
519
|
+
#
|
520
|
+
#This method can be overwriten from the element class.
|
521
|
+
def to_html()
|
522
|
+
tag = htmltag()
|
523
|
+
if ! tag
|
524
|
+
puts "No HTML element available (#{self.ids.join(',')})" if @@log
|
525
|
+
return ''
|
526
|
+
elsif tag == ''
|
527
|
+
tag = 'span'
|
528
|
+
puts "Missing output routine for HTML (#{self.ids.join(',')}) [#{@called_by}]" if @@log
|
529
|
+
end
|
530
|
+
#Test if the HTML-Tag should contain something, but there is nothing.
|
531
|
+
#If :empty_ok it is ok, that there is no content (e.g <td>)
|
532
|
+
#May make problems, if an empty tag is used to set a id-mark.
|
533
|
+
if content?() and content? != :empty_ok and
|
534
|
+
( ! @content or @content == [] or @content == [nil] )
|
535
|
+
puts "HTML-Tag #{tag} without content -> ignored" if @@log
|
536
|
+
return ''
|
537
|
+
end
|
538
|
+
html = String.new()
|
539
|
+
html << "\n" if @crbefore
|
540
|
+
html << "<#{tag} "
|
541
|
+
@attr.sort_by{|k,v| v.sortkey }.each{|k,v|
|
542
|
+
html << "#{k} = \"#{v}\" " if v.to_s != '' and v.html?
|
543
|
+
}
|
544
|
+
if @content
|
545
|
+
html << ">"
|
546
|
+
html <<"\n" if @crmid
|
547
|
+
html << "#{@content}"
|
548
|
+
html << "\n" if @crmid and @content.size > 0 and html[-1,1] != "\n"
|
549
|
+
html << "</#{tag}>"
|
550
|
+
elsif content?() == nil
|
551
|
+
html << '>'
|
552
|
+
else
|
553
|
+
html << '/>'
|
554
|
+
end
|
555
|
+
html << "\n" if @crafter
|
556
|
+
return html
|
557
|
+
end #to_html
|
558
|
+
def to_wiki()
|
559
|
+
puts "Missing output routine for Wiki (#{self.ids.join(',')}) [#{@called_by}]" if @@log
|
560
|
+
return "#{@content}\n"
|
561
|
+
end
|
562
|
+
def to_text()
|
563
|
+
puts "Missing output routine for Text (#{self.ids.join(',')}) [#{@called_by}]" if @@log
|
564
|
+
text = String.new()
|
565
|
+
text << "\n" if @crbefore
|
566
|
+
text = "#{@content}".strip
|
567
|
+
text << "\n" if @crafter
|
568
|
+
return text
|
569
|
+
end
|
570
|
+
end
|