webgen 1.5.0 → 1.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -5
- data/THANKS +1 -0
- data/VERSION +1 -1
- data/data/webgen/passive_sources/templates/sitemap.template +1 -1
- data/data/webgen/passive_sources/templates/tikz.template +1 -2
- data/lib/webgen/bundle/built-in/info.yaml +14 -0
- data/lib/webgen/bundle/built-in/init.rb +2 -1
- data/lib/webgen/content_processor/erb.rb +1 -1
- data/lib/webgen/content_processor/html_head.rb +3 -0
- data/lib/webgen/content_processor/tikz.rb +16 -11
- data/lib/webgen/context/html_head.rb +7 -0
- data/lib/webgen/item_tracker/node_meta_info.rb +7 -1
- data/lib/webgen/path_handler/api.rb +68 -5
- data/lib/webgen/source/tar_archive.rb +1 -1
- data/lib/webgen/tag.rb +1 -0
- data/lib/webgen/version.rb +1 -1
- data/test/webgen/content_processor/test_builder.rb +4 -4
- data/test/webgen/content_processor/test_haml.rb +1 -1
- data/test/webgen/content_processor/test_html_head.rb +10 -3
- data/test/webgen/content_processor/test_ruby.rb +2 -2
- data/test/webgen/content_processor/test_sass.rb +1 -1
- data/test/webgen/content_processor/test_tikz.rb +4 -4
- data/test/webgen/item_tracker/test_node_meta_info.rb +9 -1
- data/test/webgen/path_handler/test_api.rb +34 -0
- data/test/webgen/test_context.rb +2 -0
- metadata +9 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1754f53e6bf21861fe5ede0bdc46d9ec59b5e38a0f011037b19a218f3b1ba642
|
4
|
+
data.tar.gz: 766b0d8e4ba1b5ad86d9ad7655e9c92cac3ba43dbeff2747c8a83cbec6f1cd33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a05b2c6b2ea95ce22c58d57d6145e92fbdec870f27f750fc847fa372c96b9bf2ea751d6cacabe8bf344e3a1cdf08a8ea2d78b28966d864cd666b3ad378e0162
|
7
|
+
data.tar.gz: c3724710f6745d87dd92531f8b2f6a06a82be518af9057b46c9b4d62e94cbc9831c24b8b670c3525168dd2e999f67c37807e3c600d0737d93d1db2f547a68d3d
|
data/Rakefile
CHANGED
@@ -109,16 +109,16 @@ EOF
|
|
109
109
|
|
110
110
|
s.add_dependency('cmdparse', '~> 3.0', '>= 3.0.1')
|
111
111
|
s.add_dependency('systemu', '~> 2.5')
|
112
|
-
s.add_dependency('kramdown', '~>
|
112
|
+
s.add_dependency('kramdown', '~> 2.3')
|
113
113
|
s.add_development_dependency('rake', '>= 0.8.3')
|
114
114
|
s.add_development_dependency('minitest', '~> 5.0')
|
115
115
|
s.add_development_dependency('diff-lcs', '~> 1.0')
|
116
116
|
s.add_development_dependency('maruku', '~> 0.7')
|
117
117
|
s.add_development_dependency('RedCloth', '~> 4.1')
|
118
|
-
s.add_development_dependency('haml', '~>
|
118
|
+
s.add_development_dependency('haml', '~> 5.0')
|
119
119
|
s.add_development_dependency('sass', '~> 3.2')
|
120
120
|
s.add_development_dependency('builder', '~> 2.1')
|
121
|
-
s.add_development_dependency('rdoc', '~>
|
121
|
+
s.add_development_dependency('rdoc', '~> 6.0')
|
122
122
|
s.add_development_dependency('coderay', '~> 1.0')
|
123
123
|
s.add_development_dependency('erubis', '~> 2.6')
|
124
124
|
s.add_development_dependency('rdiscount', '~> 1.3')
|
@@ -128,11 +128,9 @@ EOF
|
|
128
128
|
s.files = PKG_FILES.to_a
|
129
129
|
s.require_path = 'lib'
|
130
130
|
s.executables = ['webgen']
|
131
|
-
s.default_executable = 'webgen'
|
132
131
|
|
133
132
|
#### Documentation
|
134
133
|
|
135
|
-
s.has_rdoc = true
|
136
134
|
s.rdoc_options = ['--line-numbers', '--main', 'API.rdoc']
|
137
135
|
s.extra_rdoc_files = ['API.rdoc']
|
138
136
|
|
data/THANKS
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.7.1
|
@@ -5,7 +5,7 @@
|
|
5
5
|
context.node.sitemap_entries.each do |item|
|
6
6
|
%>
|
7
7
|
<url>
|
8
|
-
<loc><%=
|
8
|
+
<loc><%= ERB::Util.url_encode(item.url) %></loc>
|
9
9
|
<lastmod><%= item['modified_at'].iso8601 %></lastmod>
|
10
10
|
<changefreq><%= item['change_freq'] || context.node['default_change_freq'] %></changefreq>
|
11
11
|
<% if priority = item['priority'] || context.node['default_priority'] %>
|
@@ -404,6 +404,20 @@ options:
|
|
404
404
|
\tikz \draw (0,0) -- (0,2) -- (2,2);
|
405
405
|
{tikz}
|
406
406
|
|
407
|
+
content_processor.tikz.engine:
|
408
|
+
summary: |
|
409
|
+
Specifies which LaTeX engine should be used. Default is pdflatex, but you may want to use
|
410
|
+
xelatex or lualatex if needed.
|
411
|
+
syntax: |
|
412
|
+
`pdflatex` or `lualatex` or `xelatex`
|
413
|
+
example:
|
414
|
+
config: |
|
415
|
+
content_processor.tikz.engine: lualatex
|
416
|
+
tag: |
|
417
|
+
{tikz:: {path: tikz.png, content_processor.tikz.engine: xelatex}}
|
418
|
+
\tikz \draw (0,0) -- (0,2) -- (2,2);
|
419
|
+
{tikz}
|
420
|
+
|
407
421
|
content_processor.xmllint.options:
|
408
422
|
summary: |
|
409
423
|
Options passed to the `xmllint` command.
|
@@ -65,7 +65,7 @@ content_processor.register('Blocks')
|
|
65
65
|
content_processor.register('Builder')
|
66
66
|
content_processor.register('CSSMinify', :name => 'cssminify')
|
67
67
|
content_processor.register('Erb')
|
68
|
-
option('content_processor.erb.trim_mode',
|
68
|
+
option('content_processor.erb.trim_mode', nil, &is_string)
|
69
69
|
|
70
70
|
content_processor.register('Erubis')
|
71
71
|
option('content_processor.erubis.use_pi', false, &true_or_false)
|
@@ -112,6 +112,7 @@ option('content_processor.tikz.resolution', '72 72',) do |val|
|
|
112
112
|
end
|
113
113
|
option('content_processor.tikz.transparent', false, &true_or_false)
|
114
114
|
option('content_processor.tikz.template', '/templates/tikz.template', &is_string)
|
115
|
+
option('content_processor.tikz.engine', 'pdflatex', &is_string)
|
115
116
|
|
116
117
|
content_processor.register('Xmllint')
|
117
118
|
option('content_processor.xmllint.options', "--catalogs --noout --valid", &is_string)
|
@@ -13,7 +13,7 @@ module Webgen
|
|
13
13
|
|
14
14
|
# Process the Ruby statements embedded in the content of +context+.
|
15
15
|
def self.call(context)
|
16
|
-
erb = ERB.new(context.content,
|
16
|
+
erb = ERB.new(context.content, trim_mode: context.website.config['content_processor.erb.trim_mode'])
|
17
17
|
erb.filename = context.ref_node.alcn
|
18
18
|
context.content = erb.result(binding)
|
19
19
|
context
|
@@ -73,6 +73,9 @@ module Webgen
|
|
73
73
|
((context.persistent[:cp_html_head] || {})[:meta] || {}).merge(context.content_node['meta'] || {}).each do |name, content|
|
74
74
|
result += "\n<meta name=\"#{ERB::Util.h(name)}\" content=\"#{ERB::Util.h(content)}\" />"
|
75
75
|
end
|
76
|
+
((context.persistent[:cp_html_head] || {})[:meta_property] || {}).merge(context.content_node['meta_property'] || {}).each do |property, content|
|
77
|
+
result += "\n<meta property=\"#{ERB::Util.h(property)}\" content=\"#{ERB::Util.h(content)}\" />"
|
78
|
+
end
|
76
79
|
result
|
77
80
|
end
|
78
81
|
|
@@ -7,7 +7,6 @@ require 'webgen/content_processor'
|
|
7
7
|
require 'webgen/utils/external_command'
|
8
8
|
|
9
9
|
Webgen::Utils::ExternalCommand.ensure_available!('pdflatex', '-v')
|
10
|
-
Webgen::Utils::ExternalCommand.ensure_available!('pdfcrop', '--version')
|
11
10
|
Webgen::Utils::ExternalCommand.ensure_available!('gs', '-v')
|
12
11
|
Webgen::Utils::ExternalCommand.ensure_available!('convert', '-version')
|
13
12
|
Webgen::Utils::ExternalCommand.ensure_available!('identify', '-version')
|
@@ -31,7 +30,7 @@ module Webgen
|
|
31
30
|
def self.prepare_options(context)
|
32
31
|
%w[content_processor.tikz.resolution content_processor.tikz.transparent
|
33
32
|
content_processor.tikz.libraries content_processor.tikz.opts
|
34
|
-
content_processor.tikz.template].each do |opt|
|
33
|
+
content_processor.tikz.template content_processor.tikz.engine].each do |opt|
|
35
34
|
context[opt] = context.content_node[opt] || context.website.config[opt]
|
36
35
|
end
|
37
36
|
context['data'] = context.content
|
@@ -66,29 +65,35 @@ module Webgen
|
|
66
65
|
def self.compile(context, cwd, tex_file, basename, ext)
|
67
66
|
render_res, output_res = context['content_processor.tikz.resolution'].split(' ')
|
68
67
|
|
68
|
+
engine = context['content_processor.tikz.engine']
|
69
69
|
File.write(tex_file, context.content)
|
70
|
-
execute("
|
70
|
+
execute("#{engine} -shell-escape -interaction=nonstopmode -halt-on-error #{basename}.tex", cwd, context) do |_status, stdout, stderr|
|
71
71
|
errors = (stdout+stderr).scan(/^!(.*\n.*)/).join("\n")
|
72
|
-
raise Webgen::RenderError.new("Error while parsing TikZ picture commands with
|
72
|
+
raise Webgen::RenderError.new("Error while parsing TikZ picture commands with #{engine}: #{errors}",
|
73
73
|
'content_processor.tikz', context.dest_node, context.ref_node)
|
74
74
|
end
|
75
75
|
|
76
|
-
execute("pdfcrop #{basename}.pdf #{basename}.pdf", cwd, context)
|
77
|
-
|
78
76
|
if context['content_processor.tikz.transparent'] && ext =~ /\.png/i
|
79
77
|
cmd = "gs -dSAFER -dBATCH -dNOPAUSE -r#{render_res} -sDEVICE=pngalpha -dGraphicsAlphaBits=4 " +
|
80
78
|
"-dTextAlphaBits=4 -sOutputFile=#{basename}#{ext} #{basename}.pdf"
|
79
|
+
elsif ext =~ /\.svg/i
|
80
|
+
# some installations of ghostscript (`gs`) also have a svg output device, but pdf2svg
|
81
|
+
# is a safer bet.
|
82
|
+
cmd = "pdf2svg #{basename}.pdf #{basename}.svg"
|
81
83
|
else
|
82
84
|
cmd = "convert -density #{render_res} #{basename}.pdf #{basename}#{ext}"
|
83
85
|
end
|
84
86
|
execute(cmd, cwd, context)
|
85
87
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
# resizing doesn't really make sense on a vector graphic.
|
89
|
+
unless ext =~ /\.svg/i
|
90
|
+
if render_res != output_res
|
91
|
+
_status, stdout, _stderr = execute("identify #{basename}#{ext}", cwd, context)
|
92
|
+
width, height = stdout.scan(/\s\d+x\d+\s/).first.strip.split('x').collect do |s|
|
93
|
+
s.to_f * output_res.to_f / render_res.to_f
|
94
|
+
end
|
95
|
+
execute("convert -resize #{width}x#{height} #{basename}#{ext} #{basename}#{ext}", cwd, context)
|
90
96
|
end
|
91
|
-
execute("convert -resize #{width}x#{height} #{basename}#{ext} #{basename}#{ext}", cwd, context)
|
92
97
|
end
|
93
98
|
end
|
94
99
|
private_class_method :compile
|
@@ -23,6 +23,13 @@ module Webgen
|
|
23
23
|
(cp_hash[:meta] ||= {})[name] = content
|
24
24
|
end
|
25
25
|
|
26
|
+
# Set the meta tag to the provided value, using +property+ instead of +name+.
|
27
|
+
#
|
28
|
+
# Note that some meta information keys may not be specified multiple times!
|
29
|
+
def meta_property(name, content)
|
30
|
+
(cp_hash[:meta_property] ||= {})[name] = content
|
31
|
+
end
|
32
|
+
|
26
33
|
# Add a link to the given file in the HTML head section.
|
27
34
|
#
|
28
35
|
# The type can either be :css for CSS files or :js for javascript files. The path to the
|
@@ -35,7 +35,13 @@ module Webgen
|
|
35
35
|
|
36
36
|
def item_data(alcn, key = nil) #:nodoc:
|
37
37
|
mi = @website.tree[alcn].meta_info
|
38
|
-
key.nil?
|
38
|
+
if key.nil? && mi['modified_at_in_dest_path']
|
39
|
+
mi
|
40
|
+
elsif key.nil?
|
41
|
+
(mi = mi.dup; mi.delete(CONTENT_MODIFICATION_KEY); mi)
|
42
|
+
else
|
43
|
+
mi[key].dup
|
44
|
+
end
|
39
45
|
end
|
40
46
|
|
41
47
|
def item_changed?(iid, old_data) #:nodoc:
|
@@ -47,8 +47,9 @@ module Webgen
|
|
47
47
|
klass_node = create_page_node_for_class(path, dir_node, klass, output_flag_file)
|
48
48
|
api.class_nodes[klass.full_name] = klass_node
|
49
49
|
klass_node.node_info[:api] = api
|
50
|
-
|
51
|
-
|
50
|
+
create_fragment_nodes_for_constants(path, klass_node, klass)
|
51
|
+
create_fragment_nodes_for_attributes(path, klass_node, klass)
|
52
|
+
create_fragment_nodes_for_methods(path, klass_node, klass)
|
52
53
|
end
|
53
54
|
|
54
55
|
rdoc.store.all_files.sort.each do |file|
|
@@ -91,7 +92,6 @@ module Webgen
|
|
91
92
|
rdoc.options = rdoc_options(options)
|
92
93
|
rdoc.store = rdoc_store(rdoc.options, cache_dir)
|
93
94
|
|
94
|
-
rdoc.exclude = rdoc.options.exclude
|
95
95
|
rdoc.last_modified.replace(rdoc.setup_output_dir(cache_dir, false))
|
96
96
|
|
97
97
|
if !(rdoc.parse_files(rdoc.options.files)).empty?
|
@@ -179,13 +179,76 @@ module Webgen
|
|
179
179
|
end
|
180
180
|
protected :create_page_node_for_class
|
181
181
|
|
182
|
+
# Creates fragment nodes for constants under the "Constants" fragment.
|
183
|
+
def create_fragment_nodes_for_constants(api_path, klass_node, klass)
|
184
|
+
return if klass.constants.none? {|const| const.display? }
|
185
|
+
constants_url = "#{klass_node.alcn}#Constants"
|
186
|
+
path = Webgen::Path.new(constants_url,
|
187
|
+
{'handler' => 'copy', 'modified_at' => api_path['modified_at'],
|
188
|
+
'pipeline' => [], 'no_output' => true, 'title' => "Constants"})
|
189
|
+
const_node = @website.ext.path_handler.create_secondary_nodes(path).first
|
190
|
+
klass.constants.sort_by(&:name).each do |const|
|
191
|
+
create_fragment_node_for_constant(api_path, const_node, const)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
protected :create_fragment_nodes_for_constants
|
195
|
+
|
196
|
+
# Create a fragment node for the given constant.
|
197
|
+
#
|
198
|
+
# A link definition entry for the method is also created.
|
199
|
+
def create_fragment_node_for_constant(api_path, parent_node, constant)
|
200
|
+
constant_url = "#{parent_node.alcn.sub(/#.*$/, '')}##{constant.name}"
|
201
|
+
path = Webgen::Path.new(constant_url,
|
202
|
+
{'handler' => 'copy', 'modified_at' => api_path['modified_at'],
|
203
|
+
'parent_alcn' => parent_node.alcn,
|
204
|
+
'pipeline' => [], 'no_output' => true, 'title' => constant.name})
|
205
|
+
@website.ext.path_handler.create_secondary_nodes(path)
|
206
|
+
add_link_definition(api_path, constant.full_name, constant_url, constant.full_name)
|
207
|
+
end
|
208
|
+
protected :create_fragment_node_for_constant
|
209
|
+
|
210
|
+
# Creates fragment nodes for attributes under the "Attributes" fragment.
|
211
|
+
def create_fragment_nodes_for_attributes(api_path, parent_node, klass)
|
212
|
+
return if klass.attributes.none? {|attr| attr.display? }
|
213
|
+
attributes_url = "#{parent_node.alcn}#Attributes"
|
214
|
+
path = Webgen::Path.new(attributes_url,
|
215
|
+
{'handler' => 'copy', 'modified_at' => api_path['modified_at'],
|
216
|
+
'parent_alcn' => parent_node.alcn,
|
217
|
+
'pipeline' => [], 'no_output' => true, 'title' => "Attributes"})
|
218
|
+
attr_node = @website.ext.path_handler.create_secondary_nodes(path).first
|
219
|
+
klass.attributes.sort_by(&:name).each do |attribute|
|
220
|
+
create_fragment_node_for_method(api_path, attr_node, attribute)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
protected :create_fragment_nodes_for_attributes
|
224
|
+
|
225
|
+
# Creates fragment nodes for methods under the "Class Methods" or "Instance Methods"
|
226
|
+
# fragments.
|
227
|
+
def create_fragment_nodes_for_methods(api_path, klass_node, klass)
|
228
|
+
["Class", "Instance"].each do |type|
|
229
|
+
method_list = klass.send("#{type.downcase}_method_list")
|
230
|
+
next if method_list.empty?
|
231
|
+
meth_url = "#{klass_node.alcn}##{type}-Methods"
|
232
|
+
path = Webgen::Path.new(meth_url,
|
233
|
+
{'handler' => 'copy', 'modified_at' => api_path['modified_at'],
|
234
|
+
'pipeline' => [], 'no_output' => true,
|
235
|
+
'title' => "#{type} Methods"})
|
236
|
+
meth_node = @website.ext.path_handler.create_secondary_nodes(path).first
|
237
|
+
method_list.sort_by(&:name).each do |method|
|
238
|
+
create_fragment_node_for_method(api_path, meth_node, method)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
protected :create_fragment_nodes_for_attributes
|
243
|
+
|
182
244
|
# Create a fragment node for the given method.
|
183
245
|
#
|
184
246
|
# A link definition entry for the method is also created.
|
185
|
-
def create_fragment_node_for_method(api_path,
|
186
|
-
method_url = "#{
|
247
|
+
def create_fragment_node_for_method(api_path, parent_node, method)
|
248
|
+
method_url = "#{parent_node.alcn.sub(/#.*$/, '')}##{method.aref}"
|
187
249
|
path = Webgen::Path.new(method_url,
|
188
250
|
{'handler' => 'copy', 'modified_at' => api_path['modified_at'],
|
251
|
+
'parent_alcn' => parent_node.alcn,
|
189
252
|
'pipeline' => [], 'no_output' => true, 'title' => method.name})
|
190
253
|
@website.ext.path_handler.create_secondary_nodes(path)
|
191
254
|
add_link_definition(api_path, method.full_name, method_url, method.full_name)
|
@@ -38,7 +38,7 @@ module Webgen
|
|
38
38
|
def paths
|
39
39
|
if !defined?(@paths)
|
40
40
|
stream = open(@uri)
|
41
|
-
stream = Zlib::GzipReader.new(stream) if @uri =~ /(\.tar\.gz|\.tgz)$/
|
41
|
+
stream = Zlib::GzipReader.new(stream) if @uri.to_s =~ /(\.tar\.gz|\.tgz)$/
|
42
42
|
Archive::Tar::Minitar::Input.open(stream) do |input|
|
43
43
|
@paths = input.collect do |entry|
|
44
44
|
path = entry.full_name
|
data/lib/webgen/tag.rb
CHANGED
data/lib/webgen/version.rb
CHANGED
@@ -13,13 +13,13 @@ class TestBuilder < Minitest::Test
|
|
13
13
|
cp = Webgen::ContentProcessor::Builder
|
14
14
|
|
15
15
|
@context.content = "xml.div(:path => context.node.alcn) { xml.strong('test'); " +
|
16
|
-
"context.website; context
|
16
|
+
"context.website; context.ref_node; context.dest_node }"
|
17
17
|
assert_equal("<div path=\"/test\">\n <strong>test</strong>\n</div>\n", cp.call(@context).content)
|
18
18
|
|
19
|
-
@context.content = "xml.div do \
|
20
|
-
assert_error_on_line(SyntaxError,
|
19
|
+
@context.content = "xml.div do \n=+6\nend"
|
20
|
+
assert_error_on_line(SyntaxError, 2) { cp.call(@context) }
|
21
21
|
|
22
|
-
@context.content = "xml.div do \
|
22
|
+
@context.content = "xml.div do \nx=5+5\nunknown\n+6\nend"
|
23
23
|
assert_error_on_line(NameError, 3) { cp.call(@context) }
|
24
24
|
end
|
25
25
|
|
@@ -12,7 +12,7 @@ class TestHaml < Minitest::Test
|
|
12
12
|
cp = Webgen::ContentProcessor::Haml
|
13
13
|
|
14
14
|
@context.content = "#content\n %h1 Hallo\n = [context.node.alcn, context.ref_node.alcn, context.dest_node.alcn].join"
|
15
|
-
assert_equal("<div id='content'>\n
|
15
|
+
assert_equal("<div id='content'>\n<h1>Hallo</h1>\n/test/test/test\n</div>\n", cp.call(@context).content)
|
16
16
|
|
17
17
|
@context.content = "#cont\n % = + unknown"
|
18
18
|
assert_error_on_line(Webgen::RenderError, 2) { cp.call(@context) }
|
@@ -24,13 +24,15 @@ class TestHtmlHead < Minitest::Test
|
|
24
24
|
|
25
25
|
def test_tags_from_context_data
|
26
26
|
@node.meta_info['meta'] = {'other' => 'me'}
|
27
|
+
@node.meta_info['meta_property'] = {'otherprop' => 'me'}
|
27
28
|
context = Webgen::Context.new(@website, :chain => [@node])
|
28
29
|
context.persistent[:cp_html_head] = {
|
29
30
|
:js_file => ['hallo.js', 'hallo2.js', 'hallo.js'],
|
30
31
|
:js_inline => ["somescript", "anotherscript"],
|
31
32
|
:css_file => ['hallo.css', 'hallo2.css', 'hallo.css'],
|
32
33
|
:css_inline => ["somestyle", "anotherstyle"],
|
33
|
-
:meta => {:lucky => 'me<"'}
|
34
|
+
:meta => {:lucky => 'me<"'},
|
35
|
+
:meta_property => {:unlucky => 'me'},
|
34
36
|
}
|
35
37
|
assert_equal("\n<script type=\"text/javascript\" src=\"hallo.js\"></script>" +
|
36
38
|
"\n<script type=\"text/javascript\" src=\"hallo2.js\"></script>" +
|
@@ -41,10 +43,15 @@ class TestHtmlHead < Minitest::Test
|
|
41
43
|
"\n<style type=\"text/css\">/*<![CDATA[/*/\nsomestyle\n/*]]>*/</style>" +
|
42
44
|
"\n<style type=\"text/css\">/*<![CDATA[/*/\nanotherstyle\n/*]]>*/</style>" +
|
43
45
|
"\n<meta name=\"lucky\" content=\"me<"\" />" +
|
44
|
-
"\n<meta name=\"other\" content=\"me\" />"
|
46
|
+
"\n<meta name=\"other\" content=\"me\" />" +
|
47
|
+
"\n<meta property=\"unlucky\" content=\"me\" />" +
|
48
|
+
"\n<meta property=\"otherprop\" content=\"me\" />",
|
49
|
+
@obj.tags_from_context_data(context))
|
45
50
|
|
46
51
|
context.persistent[:cp_html_head] = nil
|
47
|
-
assert_equal("\n<meta name=\"other\" content=\"me\" />"
|
52
|
+
assert_equal("\n<meta name=\"other\" content=\"me\" />" +
|
53
|
+
"\n<meta property=\"otherprop\" content=\"me\" />",
|
54
|
+
@obj.tags_from_context_data(context))
|
48
55
|
|
49
56
|
end
|
50
57
|
|
@@ -14,10 +14,10 @@ class TestContentProcessorRuby < Minitest::Test
|
|
14
14
|
@context.content = "context.content = context.dest_node.alcn"
|
15
15
|
assert_equal(@context.dest_node.alcn, cp.call(@context).content)
|
16
16
|
|
17
|
-
@context.content = "5+5\n+=+6\n"
|
17
|
+
@context.content = "x = 5+5\n+=+6\n"
|
18
18
|
assert_error_on_line(SyntaxError, 2) { cp.call(@context) }
|
19
19
|
|
20
|
-
@context.content = "5+5\nunknown\n++6"
|
20
|
+
@context.content = "x = 5+5\nunknown\n++6"
|
21
21
|
assert_error_on_line(NameError, 2) { cp.call(@context) }
|
22
22
|
end
|
23
23
|
|
@@ -14,7 +14,7 @@ class TestSass < Minitest::Test
|
|
14
14
|
@website.config['content_processor.sass.options'] = {}
|
15
15
|
cp = Webgen::ContentProcessor::Sass
|
16
16
|
|
17
|
-
@context.content = "#main\n
|
17
|
+
@context.content = "#main\n background-color: #000"
|
18
18
|
result = "#main {\n background-color: #000; }\n"
|
19
19
|
assert_equal(result, cp.call(@context).content)
|
20
20
|
|
@@ -19,13 +19,13 @@ class TestContentProcessorTikz < Minitest::Test
|
|
19
19
|
|
20
20
|
@context.node.define_singleton_method(:[]) {|_ignored| nil}
|
21
21
|
|
22
|
-
call('\tikz \draw (0,0) -- (
|
23
|
-
Timeout.timeout(0.2) { call('\tikz \draw (0,0) -- (
|
22
|
+
call('\tikz \draw (0,0) -- (1,1);', 'test.png', [], '', '72 72', false)
|
23
|
+
Timeout.timeout(0.2) { call('\tikz \draw (0,0) -- (1,1);', 'test.png', [], '', '72 72', false) } # test cache
|
24
24
|
refute_nil(@context.content)
|
25
25
|
|
26
26
|
assert_raises(Webgen::RenderError) { call('\tikz \asdfasdfasf', 'test.png', [], '', '72 72', false) }
|
27
27
|
|
28
|
-
call('\tikz \draw (0,0) -- (
|
28
|
+
call('\tikz \draw (0,0) -- (1,1);', '/images/test.gif', ['arrows'], '->', '72 72', true)
|
29
29
|
refute_nil(@context.content)
|
30
30
|
end
|
31
31
|
|
@@ -44,7 +44,7 @@ class TestContentProcessorTikz < Minitest::Test
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def teardown
|
47
|
-
FileUtils.rm_rf(@website.directory) if @website
|
47
|
+
#FileUtils.rm_rf(@website.directory) if @website
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
@@ -8,7 +8,8 @@ class TestNodeMetaInfo < Minitest::Test
|
|
8
8
|
def setup
|
9
9
|
@website = Object.new
|
10
10
|
@node = node = Object.new
|
11
|
-
@
|
11
|
+
@meta_info_data = meta_info_data = {'key' => 'value'}
|
12
|
+
@node.define_singleton_method(:meta_info) { meta_info_data }
|
12
13
|
@website.define_singleton_method(:tree) { {'alcn' => node} }
|
13
14
|
@obj = Webgen::ItemTracker::NodeMetaInfo.new(@website)
|
14
15
|
end
|
@@ -24,6 +25,13 @@ class TestNodeMetaInfo < Minitest::Test
|
|
24
25
|
refute_same(@node.meta_info, @obj.item_data('alcn'))
|
25
26
|
assert_equal('value', @obj.item_data('alcn', 'key'))
|
26
27
|
refute_same(@node.meta_info['key'], @obj.item_data('alcn', 'key'))
|
28
|
+
|
29
|
+
@meta_info_data['modified_at'] = 5
|
30
|
+
assert_equal({'key' => 'value'}, @obj.item_data('alcn'))
|
31
|
+
@meta_info_data['modified_at_in_dest_path'] = true
|
32
|
+
|
33
|
+
assert_equal({'key' => 'value', 'modified_at' => 5, 'modified_at_in_dest_path' => true},
|
34
|
+
@obj.item_data('alcn'))
|
27
35
|
end
|
28
36
|
|
29
37
|
def test_item_changed?
|
@@ -5,6 +5,18 @@ require 'webgen/path_handler/api'
|
|
5
5
|
|
6
6
|
class TestPathHandlerApi < Minitest::Test
|
7
7
|
|
8
|
+
# Some Constant
|
9
|
+
TEST_CONST = 42
|
10
|
+
|
11
|
+
# Other Constant
|
12
|
+
OTHER_CONST = 43
|
13
|
+
|
14
|
+
def self.test_meth; end
|
15
|
+
def self.other_meth; end
|
16
|
+
|
17
|
+
attr_reader :test_attr
|
18
|
+
attr_reader :other_attr
|
19
|
+
|
8
20
|
class SampleTestSubclass
|
9
21
|
end
|
10
22
|
|
@@ -44,9 +56,31 @@ class TestPathHandlerApi < Minitest::Test
|
|
44
56
|
assert(@website.tree["#{test_alcn}#method-i-setup"])
|
45
57
|
assert_equal(["#{test_alcn}#method-i-setup", 'TestPathHandlerApi#setup'],
|
46
58
|
@website.ext.link_definitions['my_api:TestPathHandlerApi#setup'])
|
59
|
+
assert(@website.tree["#{test_alcn}#method-c-test_meth"])
|
60
|
+
assert_equal(["#{test_alcn}#method-c-test_meth", 'TestPathHandlerApi::test_meth'],
|
61
|
+
@website.ext.link_definitions['my_api:TestPathHandlerApi::test_meth'])
|
62
|
+
assert(@website.tree["#{test_alcn}#attribute-i-test_attr"])
|
63
|
+
assert_equal(["#{test_alcn}#attribute-i-test_attr", 'TestPathHandlerApi#test_attr'],
|
64
|
+
@website.ext.link_definitions['my_api:TestPathHandlerApi#test_attr'])
|
65
|
+
assert(@website.tree["#{test_alcn}#TEST_CONST"])
|
66
|
+
assert_equal(["#{test_alcn}#TEST_CONST", 'TestPathHandlerApi::TEST_CONST'],
|
67
|
+
@website.ext.link_definitions['my_api:TestPathHandlerApi::TEST_CONST'])
|
47
68
|
assert(@website.tree['/my_dir/API_rdoc.en.html'])
|
48
69
|
assert(@website.tree['/my_dir/TestPathHandlerApi/SampleTestSubclass.en.html'])
|
49
70
|
|
71
|
+
collector = lambda do |node|
|
72
|
+
node.children.empty? ? node.lcn : [node.lcn, node.children.map(&collector)]
|
73
|
+
end
|
74
|
+
result = @website.tree[test_alcn].children.map(&collector)
|
75
|
+
|
76
|
+
assert_equal([["#Constants", ["#OTHER_CONST", "#TEST_CONST"]],
|
77
|
+
["#Attributes", ["#attribute-i-other_attr", "#attribute-i-test_attr"]],
|
78
|
+
["#Class-Methods", ["#method-c-other_meth", "#method-c-test_meth"]],
|
79
|
+
["#Instance-Methods", ["#method-i-assert_common_tests_for_create_nodes",
|
80
|
+
"#method-i-setup", "#method-i-setup_for_create_nodes", "#method-i-teardown",
|
81
|
+
"#method-i-test_create_nodes", "#method-i-test_create_nodes_hierarchical",
|
82
|
+
"#method-i-test_rdoc_options", "#method-i-test_rdoc_store"]]], result)
|
83
|
+
|
50
84
|
cache_dir = @website.tmpdir(File.join('path_handler.api', 'my_api'))
|
51
85
|
assert(File.directory?(cache_dir))
|
52
86
|
end
|
data/test/webgen/test_context.rb
CHANGED
@@ -74,10 +74,12 @@ class TestContext < Minitest::Test
|
|
74
74
|
@context.html_head.inline_fragment(:css, "content")
|
75
75
|
@context.html_head.inline_fragment(:js, "content")
|
76
76
|
@context.html_head.meta('name', 'content')
|
77
|
+
@context.html_head.meta_property('property', 'content')
|
77
78
|
|
78
79
|
assert_equal(['content'], @context.persistent[:cp_html_head][:css_inline])
|
79
80
|
assert_equal(['content'], @context.persistent[:cp_html_head][:js_inline])
|
80
81
|
assert_equal({'name' => 'content'}, @context.persistent[:cp_html_head][:meta])
|
82
|
+
assert_equal({'property' => 'content'}, @context.persistent[:cp_html_head][:meta_property])
|
81
83
|
end
|
82
84
|
|
83
85
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '2.3'
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '2.3'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rake
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,14 +134,14 @@ dependencies:
|
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '
|
137
|
+
version: '5.0'
|
138
138
|
type: :development
|
139
139
|
prerelease: false
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '
|
144
|
+
version: '5.0'
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: sass
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,14 +176,14 @@ dependencies:
|
|
176
176
|
requirements:
|
177
177
|
- - "~>"
|
178
178
|
- !ruby/object:Gem::Version
|
179
|
-
version: '
|
179
|
+
version: '6.0'
|
180
180
|
type: :development
|
181
181
|
prerelease: false
|
182
182
|
version_requirements: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
184
|
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version: '
|
186
|
+
version: '6.0'
|
187
187
|
- !ruby/object:Gem::Dependency
|
188
188
|
name: coderay
|
189
189
|
requirement: !ruby/object:Gem::Requirement
|
@@ -516,8 +516,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
516
516
|
- !ruby/object:Gem::Version
|
517
517
|
version: '0'
|
518
518
|
requirements: []
|
519
|
-
|
520
|
-
rubygems_version: 2.7.3
|
519
|
+
rubygems_version: 3.0.3
|
521
520
|
signing_key:
|
522
521
|
specification_version: 4
|
523
522
|
summary: webgen is a fast, powerful, and extensible static website generator.
|