docgenerator 1.1.1 → 1.2.1
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.
- data/examples/docgenerator_example.rb +34 -17
- data/examples/docgenerator_example_footnote.rb +82 -61
- data/examples/docgenerator_example_list.rb +24 -18
- data/examples/docgenerator_example_restrictions.rb +17 -27
- data/examples/docgenerator_example_tabular.rb +20 -20
- data/examples/docgenerator_example_tripfalls.rb +28 -20
- data/examples/results/readme +1 -0
- data/examples/results_expected/docgenerator_example.html +39 -0
- data/examples/results_expected/docgenerator_example.pdf +0 -0
- data/examples/results_expected/docgenerator_example.tex +56 -0
- data/examples/results_expected/docgenerator_example_footnote.html +40 -0
- data/examples/results_expected/docgenerator_example_footnote.pdf +0 -0
- data/examples/results_expected/docgenerator_example_footnote.tex +50 -0
- data/examples/results_expected/docgenerator_example_list.html +18 -0
- data/examples/results_expected/docgenerator_example_list.pdf +0 -0
- data/examples/results_expected/docgenerator_example_list.tex +46 -0
- data/examples/results_expected/docgenerator_example_restrictions.html +22 -0
- data/examples/results_expected/docgenerator_example_restrictions.pdf +0 -0
- data/examples/results_expected/docgenerator_example_restrictions.tex +31 -0
- data/examples/results_expected/docgenerator_example_tabular.html +37 -0
- data/examples/results_expected/docgenerator_example_tabular.pdf +0 -0
- data/examples/results_expected/docgenerator_example_tabular.tex +41 -0
- data/examples/results_expected/docgenerator_example_tripfalls.html +27 -0
- data/examples/results_expected/docgenerator_example_tripfalls.pdf +0 -0
- data/examples/results_expected/docgenerator_example_tripfalls.tex +31 -0
- data/lib/creole/creole2doc.rb +291 -140
- data/lib/creole/creole_inclusion_and_plugins.rb +142 -39
- data/lib/creole/creole_placeholder.rb +92 -30
- data/lib/creole/creole_tabular.rb +119 -20
- data/lib/docgenerator.rb +209 -118
- data/lib/{docgenerator_attribute.rb → docgenerator/attribute.rb} +2 -1
- data/lib/{docgenerator_characters.rb → docgenerator/characters.rb} +75 -6
- data/lib/{docgenerator_css.rb → docgenerator/css.rb} +0 -0
- data/lib/docgenerator/document.rb +588 -0
- data/lib/{docgenerator_element.rb → docgenerator/element.rb} +52 -80
- data/lib/{docgenerator_elements.rb → docgenerator/elements.rb} +43 -17
- data/lib/{docgenerator_environments.rb → docgenerator/environments.rb} +20 -6
- data/lib/{docgenerator_footnote.rb → docgenerator/footnote.rb} +22 -18
- data/lib/{docgenerator_lists.rb → docgenerator/lists.rb} +17 -1
- data/lib/{docgenerator_sections.rb → docgenerator/sections.rb} +9 -1
- data/lib/docgenerator/standard.rb +81 -0
- data/lib/{docgenerator_tabular.rb → docgenerator/tabular.rb} +9 -5
- data/lib/packages/docgenerator_listings.rb +9 -5
- data/lib/packages/docgenerator_pdfpages.rb +17 -11
- data/lib/packages/docgenerator_url.rb +0 -2
- data/lib/templates/docgenerator_template.rb +66 -29
- data/lib/templates/docgenerator_template.yaml +18 -0
- data/lib/wiki2doc/wiki2docgenerator.rb +6 -2
- data/readme.rd +132 -0
- data/unittest/expected/test_document_usepackage_undefined.log +2 -0
- data/unittest/expected/test_enumerate.context +4 -0
- data/unittest/expected/test_footnote.html +4 -4
- data/unittest/expected/test_footnote.latex +4 -4
- data/unittest/expected/test_footnote_group.html +6 -6
- data/unittest/expected/test_footnote_group.latex +6 -6
- data/unittest/expected/test_href.html +2 -2
- data/unittest/expected/test_href.latex +2 -2
- data/unittest/expected/test_href.text +2 -2
- data/unittest/expected/test_itemize.context +4 -0
- data/unittest/expected/test_runtex.stdout +3 -0
- data/unittest/expected/test_runtex_2.stdout +3 -0
- data/unittest/expected/test_section.context +20 -0
- data/unittest/expected/test_tabular.html +2 -2
- data/unittest/expected/test_verbatim.html +3 -0
- data/unittest/expected/test_verbatim.latex +4 -0
- data/unittest/expected/test_verbatim_array.html +1 -0
- data/unittest/expected/test_verbatim_array.latex +2 -0
- data/unittest/expected_creole/test_creole_characters_all.html +12 -5
- data/unittest/expected_creole/test_creole_characters_all.latex +20 -6
- data/unittest/expected_creole/test_creole_comment.context +11 -0
- data/unittest/expected_creole/test_creole_comment.creole +12 -0
- data/unittest/expected_creole/test_creole_comment.html +9 -0
- data/unittest/expected_creole/test_creole_comment.latex +11 -0
- data/unittest/expected_creole/test_creole_creole1.0test.html +3 -3
- data/unittest/expected_creole/test_creole_creole1.0test.latex +3 -3
- data/unittest/expected_creole/test_creole_creole1.0test.text +4 -4
- data/unittest/expected_creole/test_creole_ignore.html +3 -0
- data/unittest/expected_creole/test_creole_ignore.latex +4 -0
- data/unittest/expected_creole/test_creole_ignore.text +2 -0
- data/unittest/expected_creole/test_creole_input.normsource +12 -12
- data/unittest/expected_creole/test_creole_input_file_simple.html +15 -0
- data/unittest/expected_creole/test_creole_input_file_simple_readlines.html +15 -0
- data/unittest/expected_creole/test_creole_links_external_implicit.html +2 -2
- data/unittest/expected_creole/test_creole_links_external_implicit.latex +2 -2
- data/unittest/expected_creole/test_creole_links_external_implicit.text +2 -2
- data/unittest/expected_creole/test_creole_links_implicit_end.creole +4 -0
- data/unittest/expected_creole/test_creole_links_implicit_end.html +3 -0
- data/unittest/expected_creole/test_creole_links_implicit_end.latex +4 -0
- data/unittest/expected_creole/test_creole_list_ul.normsource +42 -42
- data/unittest/expected_creole/test_creole_mix_titles_list.html +10 -0
- data/unittest/expected_creole/test_creole_mix_titles_list.latex +18 -0
- data/unittest/expected_creole/test_creole_mix_titles_list.text +12 -0
- data/unittest/expected_creole/test_creole_paragraphs.normsource +15 -15
- data/unittest/expected_creole/test_creole_pictures_css.html +4 -1
- data/unittest/expected_creole/test_creole_pictures_css.latex +5 -1
- data/unittest/expected_creole/test_creole_pictures_longdesc.html +3 -0
- data/unittest/expected_creole/test_creole_pictures_width.html +3 -0
- data/unittest/expected_creole/test_creole_pictures_width.latex +4 -0
- data/unittest/expected_creole/test_creole_short_html.html +3 -0
- data/unittest/expected_creole/test_creole_short_html.latex +4 -0
- data/unittest/expected_creole/test_creole_short_html.text +2 -0
- data/unittest/expected_creole/test_creole_shy.creole +6 -0
- data/unittest/expected_creole/test_creole_shy.html +6 -0
- data/unittest/expected_creole/test_creole_shy.latex +8 -0
- data/unittest/expected_creole/test_creole_shy.text +4 -0
- data/unittest/expected_creole/test_creole_tabular_with_cell_option.html +20 -0
- data/unittest/expected_creole/test_creole_toc.html +3 -1
- data/unittest/expected_creole/test_creole_toc.latex +1 -1
- data/unittest/expected_creole/test_creole_toc.text +1 -1
- data/unittest/expected_creole/test_creole_toc_level.html +7 -0
- data/unittest/expected_creole/test_creole_toc_level.latex +10 -0
- data/unittest/expected_creole/test_creole_toc_level.text +3 -0
- data/unittest/expected_creole/test_creole_toc_level_text.html +8 -0
- data/unittest/expected_creole/test_creole_toc_level_text.latex +9 -0
- data/unittest/expected_creole/test_creole_verbatim.html +1 -1
- data/unittest/expected_creole/test_creole_verbatim.latex +1 -1
- data/unittest/expected_creole/test_creole_verbatim.text +1 -1
- data/unittest/expected_creole/test_creole_verbatim_inline.html +1 -1
- data/unittest/expected_creole/test_creole_verbatim_inline.latex +1 -1
- data/unittest/expected_wiki/test_wiki_description.html +5 -5
- data/unittest/expected_wiki/test_wiki_description.latex +5 -5
- data/unittest/expected_wiki/test_wiki_description.text +5 -5
- data/unittest/expected_wiki/test_wiki_description.wiki +5 -5
- data/unittest/test_rakefile_docgenerator.rb +43 -0
- data/unittest/unittest_creole2doc.rb +415 -27
- data/unittest/unittest_docgenerator.rb +256 -23
- data/unittest/unittest_docgenerator_runtex.rb +83 -0
- data/unittest/unittest_versions.rb +44 -0
- data/unittest/unittest_wiki2doc.rb +28 -27
- metadata +473 -106
- data/lib/docgenerator_document.rb +0 -525
- data/lib/packages/docgenerator_beamer.rb +0 -253
- data/lib/yaml2presentation/yaml2presentation.rb +0 -1091
- data/unittest/expected/beamer_01_article.tex +0 -13
- data/unittest/expected/beamer_01_attachment.tex +0 -15
- data/unittest/expected/beamer_01_doc.html +0 -13
- data/unittest/expected/beamer_01_doc.tex +0 -18
- data/unittest/expected/beamer_01_notes_only.tex +0 -13
- data/unittest/expected/beamer_01_notes_onlyslideswithnotes.tex +0 -13
- data/unittest/expected/beamer_01_notes_show.tex +0 -13
- data/unittest/expected/beamer_01_presentation.tex +0 -13
- data/unittest/expected/beamer_02_doc.html +0 -29
- data/unittest/expected/beamer_02_doc.tex +0 -34
- data/unittest/expected/beamer_block.html +0 -1
- data/unittest/expected/beamer_block.latex +0 -1
- data/unittest/expected/beamer_doc_fragile_doc.tex +0 -33
- data/unittest/expected/beamer_doc_html_overview_with_detailpic_and_text_doc.html +0 -34
- data/unittest/expected/beamer_doc_html_overview_with_detailpic_doc.html +0 -34
- data/unittest/expected/beamer_doc_key_doc.html +0 -20
- data/unittest/expected/beamer_doc_key_doc.tex +0 -29
- data/unittest/expected/beamer_doc_note_doc.html +0 -30
- data/unittest/expected/beamer_doc_note_doc.tex +0 -37
- data/unittest/expected/beamer_doc_pic_bottom_doc.html +0 -24
- data/unittest/expected/beamer_doc_pic_doc.html +0 -24
- data/unittest/expected/beamer_doc_pic_doc.tex +0 -28
- data/unittest/expected/beamer_doc_pic_left_doc.html +0 -24
- data/unittest/expected/beamer_doc_pic_left_doc.tex +0 -28
- data/unittest/expected/beamer_doc_pic_ratio_doc.tex +0 -29
- data/unittest/expected/beamer_doc_pic_right_doc.html +0 -24
- data/unittest/expected/beamer_doc_pic_right_doc.tex +0 -28
- data/unittest/expected/beamer_doc_pic_top_doc.html +0 -24
- data/unittest/expected/beamer_frame.html +0 -5
- data/unittest/expected/beamer_frame.tex +0 -11
- data/unittest/expected/beamer_frame_fragile.tex +0 -7
- data/unittest/expected/beamer_frame_id.html +0 -1
- data/unittest/expected/beamer_frame_id.tex +0 -4
- data/unittest/expected/beamer_framepic.html +0 -5
- data/unittest/expected/beamer_framepic.latex +0 -1
- data/unittest/expected/beamer_framepic_link.html +0 -5
- data/unittest/expected/beamer_framepic_link.latex +0 -1
- data/unittest/expected/beamer_frametitle.html +0 -1
- data/unittest/expected/beamer_frametitle.latex +0 -1
- data/unittest/expected/beamer_note.html +0 -1
- data/unittest/expected/beamer_note.latex +0 -1
- data/unittest/expected_privat/test_creole_test_document.html +0 -6
- data/unittest/expected_wiki/test_wiki_amazon.html +0 -10
- data/unittest/expected_wiki/test_wiki_link.log +0 -3
- data/unittest/test_docgenerator.rb +0 -107
- data/unittest/unittest_yaml2pres.rb +0 -336
@@ -1,525 +0,0 @@
|
|
1
|
-
#
|
2
|
-
#Container for a document.
|
3
|
-
#
|
4
|
-
#Each document contains a header and a body. Both are special Element classes.
|
5
|
-
#
|
6
|
-
class Document
|
7
|
-
#Valid meta tags, used for HTML
|
8
|
-
#
|
9
|
-
#This meta-tags are used by sitegenerator
|
10
|
-
VALID_META_TAGS = %w{
|
11
|
-
keywords
|
12
|
-
description
|
13
|
-
id
|
14
|
-
altlang
|
15
|
-
toc
|
16
|
-
pdf
|
17
|
-
odp
|
18
|
-
amazon
|
19
|
-
forum
|
20
|
-
feed
|
21
|
-
}
|
22
|
-
class << VALID_META_TAGS
|
23
|
-
# Return true if self is part of the given parameter.
|
24
|
-
def ===(o)
|
25
|
-
return self.include?(o)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
#Create a new document.
|
30
|
-
#There are different document templates supported.
|
31
|
-
#The templates refer to the corresponding TeX-classes.
|
32
|
-
#- article
|
33
|
-
#- report
|
34
|
-
#- book
|
35
|
-
def initialize( settings = {} )
|
36
|
-
#Set template defaults
|
37
|
-
@template = {
|
38
|
-
:html => DocumentTemplate[:html],
|
39
|
-
:latex => DocumentTemplate[:article],
|
40
|
-
:text => DocumentTemplate[:text],
|
41
|
-
:wiki => DocumentTemplate[:wiki],
|
42
|
-
}
|
43
|
-
@language = 'ngerman' #default
|
44
|
-
@date = nil
|
45
|
-
|
46
|
-
##>>>>temporary check, old interface
|
47
|
-
#~ puts settings.inspect
|
48
|
-
if ! settings.is_a?(Hash)
|
49
|
-
#Make an exception to correct data
|
50
|
-
raise "Old interface for Document#new, use :template => "
|
51
|
-
settings = { :template => settings }
|
52
|
-
end
|
53
|
-
##<<<<temporary check, old interface
|
54
|
-
|
55
|
-
@log = settings[:log]
|
56
|
-
if ! @log
|
57
|
-
@log = Log4r::Logger.new( 'Doc', Log4r::WARN )
|
58
|
-
@log.outputters = Log4r::StdoutOutputter.new('log_xxx')
|
59
|
-
end
|
60
|
-
@meta = {} #some meta-Tags for HTML
|
61
|
-
@body = element( :body )
|
62
|
-
@head = element( :head )
|
63
|
-
#~ @body.part_of << self
|
64
|
-
#~ @head.part_of << self
|
65
|
-
@options = []
|
66
|
-
#Flag to avoid double definition of docinfo()
|
67
|
-
@docinfo_called = false
|
68
|
-
@creator = nil
|
69
|
-
|
70
|
-
settings.each{|key, value|
|
71
|
-
case key
|
72
|
-
when :title, :shorttitle, :author, :date, :keywords, :description, :creator, :language
|
73
|
-
self.send("#{key}=".to_sym, value)
|
74
|
-
#~ when :odp, :pdf, :amazon #VALID_META_TAGS
|
75
|
-
when *VALID_META_TAGS.map{|mkey|mkey.to_sym}
|
76
|
-
self.meta( key, value )
|
77
|
-
when :template
|
78
|
-
[value].flatten.each{|template|
|
79
|
-
case template
|
80
|
-
when DocumentTemplate
|
81
|
-
@template[template.target] = template
|
82
|
-
when Symbol
|
83
|
-
templ = DocumentTemplate[template]
|
84
|
-
if ! templ.is_a?( DocumentTemplate )
|
85
|
-
@log.fatal("Unknown template #{template}, valid:\n\t#{DocumentTemplate.keys.join("\n\t")}") if @log.fatal?
|
86
|
-
else
|
87
|
-
@template[templ.target] = templ
|
88
|
-
end
|
89
|
-
end
|
90
|
-
} #templates
|
91
|
-
when :css
|
92
|
-
if ! File.exist?(value)
|
93
|
-
@log.warn("CSS-Reference not found (#{value})") if @log.warn?
|
94
|
-
end
|
95
|
-
#~ @head << element(:htmlonly,{}, <<css
|
96
|
-
#~ <meta http-equiv="Content-Style-Type" content="text/css">
|
97
|
-
#~ css
|
98
|
-
#~ <link rel="stylesheet" type="text/css" href="#{value}">
|
99
|
-
#~ ).cr
|
100
|
-
@head << element( :link, {
|
101
|
-
:href => value,
|
102
|
-
:rel => 'stylesheet',
|
103
|
-
:type => "text/css" } ).cr. restrict_to(:html)
|
104
|
-
when :maketitle
|
105
|
-
#:maketitle is defined, but we have also to check, if it is true
|
106
|
-
@body << element(:maketitle ).cr if settings[key]
|
107
|
-
when :log
|
108
|
-
else
|
109
|
-
@log.warn("Document.new: Unknown setting #{key.inspect} (=#{value.inspect})") if @log.warn?
|
110
|
-
end
|
111
|
-
} #settings
|
112
|
-
|
113
|
-
end
|
114
|
-
#body and head are lists, containing elements.
|
115
|
-
attr_reader :body, :head
|
116
|
-
attr_reader :template
|
117
|
-
#Logger for the document
|
118
|
-
attr_reader :log
|
119
|
-
#Document title
|
120
|
-
attr_accessor :title, :shorttitle
|
121
|
-
#Set document description
|
122
|
-
attr_writer :author, :date, :keywords, :description, :creator
|
123
|
-
attr_writer :language
|
124
|
-
#Flag, if tex should be started immediate after document creation.
|
125
|
-
attr_writer :runtex
|
126
|
-
#Add more keywords
|
127
|
-
def keyword_add( keyword )
|
128
|
-
@keywords << ", #{keyword}"
|
129
|
-
end
|
130
|
-
|
131
|
-
#Constant to detect the generated header
|
132
|
-
PREFIX_ENDFLAG = 'Generation-Info-End'
|
133
|
-
#
|
134
|
-
#Define, if there should be a message in case of:
|
135
|
-
#-:change Document changed
|
136
|
-
#-:nochange Document existed, but is unchanged
|
137
|
-
#Give an array with the wanted values.
|
138
|
-
def Document.givemessage=( value = [:change, :nochange] )
|
139
|
-
@@givemessage = value
|
140
|
-
end
|
141
|
-
@@givemessage = [:change, :nochange]
|
142
|
-
def Document.givemessage(); @@givemessage; end
|
143
|
-
#Add a meta-tag-information for the HTML-Output.
|
144
|
-
def meta( key, content )
|
145
|
-
key = key.to_s
|
146
|
-
|
147
|
-
if ! VALID_META_TAGS.include?(key)
|
148
|
-
@log.warn("Unknown meta-tag #{key} (#{content})") if @log.warn?
|
149
|
-
@log.info("\tAllowed meta-tags: #{VALID_META_TAGS.join(', ')}") if @log.info?
|
150
|
-
end
|
151
|
-
if @meta[key]
|
152
|
-
@log.warn("Double definition meta-tag #{key} (old: #{@meta[key]}, new: #{content})") if @log.warn? and @meta[key] != content
|
153
|
-
end
|
154
|
-
|
155
|
-
@meta[key] = content
|
156
|
-
end
|
157
|
-
#Prepare the docinfo.
|
158
|
-
#May be called only once.
|
159
|
-
#
|
160
|
-
#If the title should change (e.g. when you save the document twice in different versions)
|
161
|
-
#you can do it via the parameter.
|
162
|
-
def docinfo()
|
163
|
-
#If this method is called twice (e.g. with save to tex and html),
|
164
|
-
#then the title is doubled in the second output.
|
165
|
-
#(Elements are added to @head)
|
166
|
-
return nil if @docinfo_called
|
167
|
-
@docinfo_called = true
|
168
|
-
|
169
|
-
#Build docinfo.
|
170
|
-
result = []
|
171
|
-
result << element( :title, {:short => @shorttitle }, @title).CR if @title
|
172
|
-
result << element( :author, {}, @author).cr if @author
|
173
|
-
result << element( :date, {}, @date).cr if @date
|
174
|
-
result << element( :keywords, {}, @keywords).cr if @keywords
|
175
|
-
result << element( :metadescription, {}, @description).cr if @description
|
176
|
-
result << element( :creator, {}, @creator).cr if @creator
|
177
|
-
@meta.each{ |key, content|
|
178
|
-
result << element( :meta, { :name => key, :content => content } ).cr
|
179
|
-
}
|
180
|
-
return result
|
181
|
-
end
|
182
|
-
def add_option( option)
|
183
|
-
@options << option
|
184
|
-
end
|
185
|
-
#Prepare a table of content.
|
186
|
-
#
|
187
|
-
#There is no sense to use it with LaTeX, better you use \tableofcontents
|
188
|
-
#
|
189
|
-
#Options:
|
190
|
-
#- id: Id of div, needed for CSS-formatting
|
191
|
-
#- tocfilename: Added as prefix to link.
|
192
|
-
# can be used to make toc for in another file (cross-referencing)
|
193
|
-
#- level: Depth of toc
|
194
|
-
#The document should be filled before you add the toc.
|
195
|
-
#You an use Element#insertbefore:
|
196
|
-
# doc.body.insertbefore(start, doc.toc)
|
197
|
-
def toc( options = {} )
|
198
|
-
opt = {
|
199
|
-
:id => 'toc',
|
200
|
-
:tocfilename => nil, #Can be used to build cross references
|
201
|
-
:level => 3,
|
202
|
-
:log => @log
|
203
|
-
}.update(options)
|
204
|
-
|
205
|
-
opt[:level] = 3 unless opt[:level]
|
206
|
-
opt[:log].info("Prepare Table of contents, options: #{options.keys.inspect}") if opt[:log].info?
|
207
|
-
opt[:log].debug("Options: #{[:id, :level, :tocfilename].map{|k| "#{k}: #{opt[k].inspect}"}.join(',')}") if opt[:log].debug?
|
208
|
-
|
209
|
-
toc = element(:div, { :id => opt[:id] }).cR
|
210
|
-
opt[:pre].is_a?(String) ? toc << element(:p, {}, opt[:pre] ).cr : toc << opt[:pre]
|
211
|
-
|
212
|
-
toc_uls = [ toc ]
|
213
|
-
|
214
|
-
#fixme
|
215
|
-
#It would be nicer to get something like 1-1-1 instead of a counter.
|
216
|
-
toccnt = 0
|
217
|
-
toc_ids = [ :chapter, :section,:subsection, :subsubsection, :paragraph, :subparagraph,:minisec]
|
218
|
-
@body.content.flatten.each{|el|
|
219
|
-
if ! el.respond_to?(:ids)
|
220
|
-
#e.g. Wikitext. Has a to_doc, but doesn't react on flatten.
|
221
|
-
opt[:log].error("Toc: Element ohne :ids #{el.class}") if opt[:log].error?
|
222
|
-
next
|
223
|
-
end
|
224
|
-
depth = toc_ids.index((el.ids & toc_ids)[0])
|
225
|
-
next if ! depth #Element is no header
|
226
|
-
|
227
|
-
opt[:log].debug("Toc: Found entry on level #{depth}: <#{el.content}>") if opt[:log].debug?
|
228
|
-
#Create an id if not already defined
|
229
|
-
if el[:id].content.empty?
|
230
|
-
el[:id] << "toc#{toccnt += 1}"
|
231
|
-
end
|
232
|
-
if depth > opt[:level]
|
233
|
-
opt[:log].debug("Toc: Reject by level #{el.content}") if opt[:log].debug?
|
234
|
-
next
|
235
|
-
end
|
236
|
-
|
237
|
-
#Check missing levels
|
238
|
-
(depth - toc_uls.size).times{|i|
|
239
|
-
opt[:log].warn("Toc: Jump over section level #{depth-1+i} (#{opt[:tocfilename]})") if opt[:log].warn?
|
240
|
-
toc_uls << element(:ul, {}, element(:li ).cr ).cR
|
241
|
-
if toc_uls.size == 2 #First entry
|
242
|
-
toc_uls.first << toc_uls.last
|
243
|
-
else
|
244
|
-
toc_uls[-2].content.last << toc_uls.last
|
245
|
-
end
|
246
|
-
}
|
247
|
-
|
248
|
-
#Build new toc-list and deletet bigger ones
|
249
|
-
if ! toc_uls[depth]
|
250
|
-
opt[:log].debug("Toc: Start new level #{depth}") if opt[:log].debug?
|
251
|
-
toc_uls << element(:ul).cR
|
252
|
-
if depth == 1
|
253
|
-
toc << toc_uls[depth]
|
254
|
-
else
|
255
|
-
toc_uls[depth -1 ].content.last << toc_uls[depth]
|
256
|
-
end
|
257
|
-
else #delete levels under actual level
|
258
|
-
if toc_uls.slice!(depth+1..toc_uls.size+1)
|
259
|
-
opt[:log].debug("Toc: Stop level > #{depth}") if opt[:log].debug?
|
260
|
-
end
|
261
|
-
end
|
262
|
-
toc_uls[depth] << element(:li, {}, element(:a, {:href => "#{opt[:tocfilename]}##{el[:id]}" }, el.content ) ).cr
|
263
|
-
}
|
264
|
-
opt[:post].is_a?(String) ? toc << element(:p, {}, opt[:post] ).cr : toc << opt[:post]
|
265
|
-
|
266
|
-
return toc
|
267
|
-
end #toc
|
268
|
-
#Save the file.
|
269
|
-
#The type of the document is determined by the file extensison.
|
270
|
-
#Supported document types are:
|
271
|
-
#- tex
|
272
|
-
#- html
|
273
|
-
#- (wiki)
|
274
|
-
#- (text)
|
275
|
-
#Depending on a template, different results are created.
|
276
|
-
#
|
277
|
-
#There is a comparison between an already existing file and the new one.
|
278
|
-
#To write a new version, the document must change and overwrite must be true.
|
279
|
-
#
|
280
|
-
#Valid options:
|
281
|
-
#- :replacements
|
282
|
-
# It is possible to give pairs of RegExp (pattern) and replacements to the result.
|
283
|
-
#- overwrite [true]
|
284
|
-
# allows to overwrite
|
285
|
-
#- :additional_options
|
286
|
-
# List of options.
|
287
|
-
# If you want to give parameters to specific 'Element'-obejcts you can define the keys here.
|
288
|
-
# If you don't make it, you get warnings about undefined options.
|
289
|
-
#
|
290
|
-
def save( filename, options = {} )
|
291
|
-
#check old interface before 1.1.0
|
292
|
-
case options
|
293
|
-
when true, false
|
294
|
-
@log.warn( "Old interface for Document.save, use :overwrite => true/false" ) if @log.error?
|
295
|
-
options = { :overwrite => options }
|
296
|
-
end
|
297
|
-
|
298
|
-
options = {
|
299
|
-
:overwrite => true,
|
300
|
-
:replacements => {} ,
|
301
|
-
:additional_options => [],
|
302
|
-
}.update(options)
|
303
|
-
|
304
|
-
#Check valid options
|
305
|
-
options.each{|key,value|
|
306
|
-
case key
|
307
|
-
when :overwrite, :replacements
|
308
|
-
when :additional_options
|
309
|
-
else
|
310
|
-
if options[:additional_options].include?(key)
|
311
|
-
@log.warn( "unknown option #{key.inspect} for Document.save" ) if @log.warn?
|
312
|
-
else
|
313
|
-
@log.debug( "Save-Specific option #{key.inspect} in Document.save" ) if @log.debug?
|
314
|
-
end
|
315
|
-
end
|
316
|
-
}
|
317
|
-
|
318
|
-
if ! @template
|
319
|
-
@log.error( "No template available to create #{filename}" ) if @log.error?
|
320
|
-
return false
|
321
|
-
end
|
322
|
-
|
323
|
-
#Get old content for comparison
|
324
|
-
old = nil
|
325
|
-
prefix = [ nil,
|
326
|
-
"Build by\t#{__FILE__}",
|
327
|
-
"Dir:\t\t#{Dir.pwd}",
|
328
|
-
"Creator:\t#{$0}",
|
329
|
-
"Target:\t\t#{filename}",
|
330
|
-
"#{Time.now.strftime('%Y/%m/%d %H:%M:%S')}",
|
331
|
-
nil,
|
332
|
-
"#{PREFIX_ENDFLAG}"
|
333
|
-
].join("\n\t")
|
334
|
-
if File.exist?( filename )
|
335
|
-
old = File.read( filename )
|
336
|
-
end
|
337
|
-
#Determine the target document type, depending on extension.
|
338
|
-
extension = File.basename( filename ).split( /\./).last
|
339
|
-
case extension
|
340
|
-
when /tex/i
|
341
|
-
target = :latex
|
342
|
-
when /htm[l]?/i
|
343
|
-
target = :html
|
344
|
-
when /txt/
|
345
|
-
target = :text
|
346
|
-
when /wiki/
|
347
|
-
target = :wiki
|
348
|
-
else
|
349
|
-
@log.fatal( "Unknown Extension #{extension} for #{File.basename( filename )}" ) if @log.fatal?
|
350
|
-
raise "Unknown Extension #{extension}"
|
351
|
-
end
|
352
|
-
|
353
|
-
new = to_doc( target, {
|
354
|
-
:template=> @template[target],
|
355
|
-
:filename => filename,
|
356
|
-
:replacements => options[:replacements],
|
357
|
-
:log => @log
|
358
|
-
})
|
359
|
-
|
360
|
-
case target
|
361
|
-
when :latex
|
362
|
-
prefix.gsub!( /^/, '%' )
|
363
|
-
old.sub!(/\A.*#{PREFIX_ENDFLAG}/m, '<<prefix>>' ) if old
|
364
|
-
when :html
|
365
|
-
#Delete prefix (with generation time) for later compare.
|
366
|
-
old.sub!(/\A.*#{PREFIX_ENDFLAG}/m, "<!--\n<<prefix>>" ) if old
|
367
|
-
when :text
|
368
|
-
when :wiki
|
369
|
-
#~ new.squeeze!("\n")
|
370
|
-
else
|
371
|
-
@log.fatal( "Unknown target #{target} for #{File.basename( filename )}" ) if @log.fatal?
|
372
|
-
raise "Unknown target #{target}"
|
373
|
-
end
|
374
|
-
#Make it a bit more compact.
|
375
|
-
#TeX requires at least 2 \n for paragraph changes
|
376
|
-
new.gsub!(/\n+\n\n/, "\n\n")
|
377
|
-
|
378
|
-
if ! new.kind_of?( String )
|
379
|
-
@log.error( "New is wrong type: #{new.inspect}" ) if @log.error?
|
380
|
-
end
|
381
|
-
|
382
|
-
if new != old
|
383
|
-
new.sub!( '<<prefix>>', prefix)
|
384
|
-
if ( File.exist?( filename ) and ! options[:overwrite] )
|
385
|
-
puts "Datei #{filename} exist already \nContinue [yn]?"
|
386
|
-
answer = $stdin.gets() if $stdin.tty? #nur bei call aus DOS-Box
|
387
|
-
if ! ( answer =~ /[YyjJ].*/ )
|
388
|
-
puts "Bye"
|
389
|
-
@log.info( "Overwrite #{filename} after confirmation" ) if @log.info?
|
390
|
-
return false
|
391
|
-
end
|
392
|
-
end
|
393
|
-
f = File.new( filename, 'w' )
|
394
|
-
f << new
|
395
|
-
f.close
|
396
|
-
@log.info( "Save changed\t#{filename}") if @log.info?
|
397
|
-
puts "Save changed\t#{filename}" if @@givemessage.include?(:change)
|
398
|
-
#Save copy of old version (attention, *.bak makes no control on tex or html)
|
399
|
-
#~ f = File.new( filename.sub( extension, 'bak'), 'w' )
|
400
|
-
#~ f << old
|
401
|
-
#~ f.close
|
402
|
-
Document.runtex( filename, @runtex ) if @runtex and target == :latex
|
403
|
-
return true
|
404
|
-
elsif old
|
405
|
-
@log.info("Unchanged\t#{filename}") if @log.info?
|
406
|
-
puts "Unchanged\t#{filename}" if @@givemessage.include?(:nochange)
|
407
|
-
return false
|
408
|
-
end
|
409
|
-
end #Document#save
|
410
|
-
#Build the content for the target format.
|
411
|
-
#Supported target formats are:
|
412
|
-
#- :latex
|
413
|
-
#- :html
|
414
|
-
#- :text
|
415
|
-
#If the standard templates are used, there is a <<prefix>> left
|
416
|
-
#(used from Document#save to include some additional information).
|
417
|
-
#
|
418
|
-
#If the method is called directly to prepare document snipplets, you can use:
|
419
|
-
# puts Document#to_doc( :latex, '<<body>>')
|
420
|
-
#
|
421
|
-
#It is possible to give pairs of RegExp (pattern) and a replacement to the result.
|
422
|
-
def to_doc( target, options )
|
423
|
-
#~ o = Docgenerator_logger.set_option_defaults(options)
|
424
|
-
options[:log].info( "Build document for #{target.inspect}" ) if options[:log].info?
|
425
|
-
template = options[:template]
|
426
|
-
if ! template
|
427
|
-
options[:log].error( "No template available to create #{target.inspect} #{self.class}" ) if options[:log].error?
|
428
|
-
return ''
|
429
|
-
end
|
430
|
-
replacements = options[:replacements] || {}
|
431
|
-
options[:log].warn( "No filename given " ) if options[:log].warn? and ! options[:filename]
|
432
|
-
|
433
|
-
new = template.template
|
434
|
-
case target
|
435
|
-
when :latex
|
436
|
-
add_option( @language )
|
437
|
-
when :html
|
438
|
-
when :text
|
439
|
-
when :wiki
|
440
|
-
else
|
441
|
-
options[:log].fatal( "Unknown target #{target} for #{options[:filename]}" ) if options[:log].fatal?
|
442
|
-
return ''
|
443
|
-
end
|
444
|
-
if ! new.kind_of?( String )
|
445
|
-
options[:log].error( "New is wrong type: #{new.inspect}") if options[:log].error?
|
446
|
-
end
|
447
|
-
|
448
|
-
options[:document] = self
|
449
|
-
@head << self.docinfo()
|
450
|
-
options[:log].debug( "Build header data") if options[:log].debug?
|
451
|
-
new.sub!( '<<head>>', @head.to_doc(target, options ))
|
452
|
-
options[:log].debug( "Build body") if options[:log].debug?
|
453
|
-
new.sub!( '<<body>>', @body.to_doc(target, options))
|
454
|
-
new.sub!( '<<classoptions>>', @options.uniq.join(','))
|
455
|
-
|
456
|
-
|
457
|
-
replacements.each{|pattern, replace |
|
458
|
-
options[:log].info("Replace text #{pattern.source} with #{replace}" ) if options[:log].info?
|
459
|
-
new.gsub!( pattern, replace ) if replace
|
460
|
-
}
|
461
|
-
return new
|
462
|
-
end #Document#to_doc
|
463
|
-
#Return the actual target type.
|
464
|
-
#Needed by Element#to_s to decide which method is used to prepare the output.
|
465
|
-
#
|
466
|
-
#The usage of this technic makes similar processing unposibble.
|
467
|
-
#Set in Document#save.
|
468
|
-
attr_reader :target
|
469
|
-
|
470
|
-
#Call TeX and translate the file.
|
471
|
-
#Experimental, unpublished feature up to now.
|
472
|
-
#Fixme: Chain
|
473
|
-
def Document.runtex( filename, format = :pdflualatex )
|
474
|
-
begin
|
475
|
-
require 'runtex'
|
476
|
-
#~ require 'c:/usr/script/runtex/lib/runtex'
|
477
|
-
rescue LoadError
|
478
|
-
puts "Sorry, I didn't find the experimental tex translation tool to translate #{filename}"
|
479
|
-
return false
|
480
|
-
end
|
481
|
-
#~ puts "Unknown texfile #{filename}" if ! filename
|
482
|
-
tex = RunTeX::Job_chain.new( filename,
|
483
|
-
:format => format )
|
484
|
-
#~ case format
|
485
|
-
#~ when true: tex.pdflualatex() #default
|
486
|
-
#~ when false, nil
|
487
|
-
#~ when :pdflatex; tex.pdflatex()
|
488
|
-
#~ when :pdflualatex; tex.pdflualatex()
|
489
|
-
#~ when :xelatex; tex.xelatex()
|
490
|
-
#~ when :latex; tex.latex()
|
491
|
-
#~ else
|
492
|
-
#~ puts "Undefined chain #{format.inspect} for runtex, use pdflualatex"
|
493
|
-
#~ tex.pdflualatex() #default
|
494
|
-
#~ end
|
495
|
-
#~ tex.file = filename
|
496
|
-
begin
|
497
|
-
puts "Start TeX-job #{tex.basename}"
|
498
|
-
tex.log.level = Log4r::WARN
|
499
|
-
tex.start(format)
|
500
|
-
rescue SystemExit
|
501
|
-
puts "rescued a SystemExit exception"
|
502
|
-
return false
|
503
|
-
end
|
504
|
-
end
|
505
|
-
#Make some basic replacements for TeX.
|
506
|
-
#There is no sense to use it with HTML.
|
507
|
-
#
|
508
|
-
#Better solution: Puts String into \path, \verb or similar.
|
509
|
-
def Document.texify( input )
|
510
|
-
out = input.strip
|
511
|
-
#~ out.gsub!( /&/, '\\\&') #geht schief. erzeugt <<body>>...
|
512
|
-
#~ out.gsub!( /\\/, '\\\\')
|
513
|
-
out.gsub!( /%/, '\%')
|
514
|
-
out.gsub!( /\$/, '\$')
|
515
|
-
out.gsub!( /&/, '\\\\&')
|
516
|
-
out.gsub!( /_/, '\_')
|
517
|
-
out.gsub!( /#/, '\#')
|
518
|
-
out.gsub!( /�/, '\euro ')
|
519
|
-
return out
|
520
|
-
end
|
521
|
-
def inspect()
|
522
|
-
return "#<Document '#{@title}'>"
|
523
|
-
#~ return "#<Document '#{@title} #{@body.inspect}>'"
|
524
|
-
end
|
525
|
-
end #Document
|