nanoc 3.2.4 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. data/.gemtest +0 -0
  2. data/ChangeLog +3 -0
  3. data/Gemfile +32 -0
  4. data/LICENSE +19 -0
  5. data/NEWS.md +470 -0
  6. data/README.md +114 -0
  7. data/Rakefile +14 -0
  8. data/bin/nanoc +7 -27
  9. data/bin/nanoc3 +3 -0
  10. data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
  11. data/lib/nanoc.rb +41 -0
  12. data/lib/nanoc/base.rb +49 -0
  13. data/lib/nanoc/base/compilation/checksum_store.rb +57 -0
  14. data/lib/nanoc/base/compilation/compiled_content_cache.rb +62 -0
  15. data/lib/nanoc/base/compilation/compiler.rb +458 -0
  16. data/lib/nanoc/base/compilation/compiler_dsl.rb +214 -0
  17. data/lib/nanoc/base/compilation/dependency_tracker.rb +200 -0
  18. data/lib/nanoc/base/compilation/filter.rb +165 -0
  19. data/lib/nanoc/base/compilation/item_rep_proxy.rb +103 -0
  20. data/lib/nanoc/base/compilation/item_rep_recorder_proxy.rb +102 -0
  21. data/lib/nanoc/base/compilation/outdatedness_checker.rb +223 -0
  22. data/lib/nanoc/base/compilation/outdatedness_reasons.rb +46 -0
  23. data/lib/nanoc/base/compilation/rule.rb +73 -0
  24. data/lib/nanoc/base/compilation/rule_context.rb +84 -0
  25. data/lib/nanoc/base/compilation/rule_memory_calculator.rb +40 -0
  26. data/lib/nanoc/base/compilation/rule_memory_store.rb +53 -0
  27. data/lib/nanoc/base/compilation/rules_collection.rb +243 -0
  28. data/lib/nanoc/base/context.rb +47 -0
  29. data/lib/nanoc/base/core_ext.rb +6 -0
  30. data/lib/nanoc/base/core_ext/array.rb +62 -0
  31. data/lib/nanoc/base/core_ext/hash.rb +63 -0
  32. data/lib/nanoc/base/core_ext/pathname.rb +26 -0
  33. data/lib/nanoc/base/core_ext/string.rb +46 -0
  34. data/lib/nanoc/base/directed_graph.rb +275 -0
  35. data/lib/nanoc/base/errors.rb +211 -0
  36. data/lib/nanoc/base/memoization.rb +67 -0
  37. data/lib/nanoc/base/notification_center.rb +84 -0
  38. data/lib/nanoc/base/ordered_hash.rb +200 -0
  39. data/lib/nanoc/base/plugin_registry.rb +181 -0
  40. data/lib/nanoc/base/result_data/item_rep.rb +492 -0
  41. data/lib/nanoc/base/source_data/code_snippet.rb +58 -0
  42. data/lib/nanoc/base/source_data/configuration.rb +24 -0
  43. data/lib/nanoc/base/source_data/data_source.rb +234 -0
  44. data/lib/nanoc/base/source_data/item.rb +301 -0
  45. data/lib/nanoc/base/source_data/layout.rb +130 -0
  46. data/lib/nanoc/base/source_data/site.rb +361 -0
  47. data/lib/nanoc/base/store.rb +135 -0
  48. data/lib/nanoc/cli.rb +137 -0
  49. data/lib/nanoc/cli/command_runner.rb +104 -0
  50. data/lib/nanoc/cli/commands/autocompile.rb +58 -0
  51. data/lib/nanoc/cli/commands/compile.rb +297 -0
  52. data/lib/nanoc/cli/commands/create_item.rb +60 -0
  53. data/lib/nanoc/cli/commands/create_layout.rb +73 -0
  54. data/lib/nanoc/cli/commands/create_site.rb +411 -0
  55. data/lib/nanoc/cli/commands/debug.rb +117 -0
  56. data/lib/nanoc/cli/commands/deploy.rb +79 -0
  57. data/lib/nanoc/cli/commands/info.rb +98 -0
  58. data/lib/nanoc/cli/commands/nanoc.rb +38 -0
  59. data/lib/nanoc/cli/commands/prune.rb +50 -0
  60. data/lib/nanoc/cli/commands/update.rb +70 -0
  61. data/lib/nanoc/cli/commands/view.rb +82 -0
  62. data/lib/nanoc/cli/commands/watch.rb +124 -0
  63. data/lib/nanoc/cli/error_handler.rb +199 -0
  64. data/lib/nanoc/cli/logger.rb +92 -0
  65. data/lib/nanoc/data_sources.rb +29 -0
  66. data/lib/nanoc/data_sources/deprecated/delicious.rb +42 -0
  67. data/lib/nanoc/data_sources/deprecated/last_fm.rb +87 -0
  68. data/lib/nanoc/data_sources/deprecated/twitter.rb +38 -0
  69. data/lib/nanoc/data_sources/filesystem.rb +299 -0
  70. data/lib/nanoc/data_sources/filesystem_unified.rb +121 -0
  71. data/lib/nanoc/data_sources/filesystem_verbose.rb +91 -0
  72. data/lib/nanoc/extra.rb +24 -0
  73. data/lib/nanoc/extra/auto_compiler.rb +103 -0
  74. data/lib/nanoc/extra/chick.rb +125 -0
  75. data/lib/nanoc/extra/core_ext.rb +6 -0
  76. data/lib/nanoc/extra/core_ext/enumerable.rb +33 -0
  77. data/lib/nanoc/extra/core_ext/pathname.rb +30 -0
  78. data/lib/nanoc/extra/core_ext/time.rb +19 -0
  79. data/lib/nanoc/extra/deployer.rb +47 -0
  80. data/lib/nanoc/extra/deployers.rb +15 -0
  81. data/lib/nanoc/extra/deployers/fog.rb +98 -0
  82. data/lib/nanoc/extra/deployers/rsync.rb +70 -0
  83. data/lib/nanoc/extra/file_proxy.rb +40 -0
  84. data/lib/nanoc/extra/pruner.rb +86 -0
  85. data/lib/nanoc/extra/validators.rb +12 -0
  86. data/lib/nanoc/extra/validators/links.rb +268 -0
  87. data/lib/nanoc/extra/validators/w3c.rb +95 -0
  88. data/lib/nanoc/extra/vcs.rb +66 -0
  89. data/lib/nanoc/extra/vcses.rb +17 -0
  90. data/lib/nanoc/extra/vcses/bazaar.rb +25 -0
  91. data/lib/nanoc/extra/vcses/dummy.rb +24 -0
  92. data/lib/nanoc/extra/vcses/git.rb +25 -0
  93. data/lib/nanoc/extra/vcses/mercurial.rb +25 -0
  94. data/lib/nanoc/extra/vcses/subversion.rb +25 -0
  95. data/lib/nanoc/filters.rb +59 -0
  96. data/lib/nanoc/filters/asciidoc.rb +38 -0
  97. data/lib/nanoc/filters/bluecloth.rb +19 -0
  98. data/lib/nanoc/filters/coderay.rb +21 -0
  99. data/lib/nanoc/filters/coffeescript.rb +20 -0
  100. data/lib/nanoc/filters/colorize_syntax.rb +298 -0
  101. data/lib/nanoc/filters/erb.rb +38 -0
  102. data/lib/nanoc/filters/erubis.rb +34 -0
  103. data/lib/nanoc/filters/haml.rb +27 -0
  104. data/lib/nanoc/filters/kramdown.rb +20 -0
  105. data/lib/nanoc/filters/less.rb +53 -0
  106. data/lib/nanoc/filters/markaby.rb +20 -0
  107. data/lib/nanoc/filters/maruku.rb +20 -0
  108. data/lib/nanoc/filters/mustache.rb +24 -0
  109. data/lib/nanoc/filters/rainpress.rb +19 -0
  110. data/lib/nanoc/filters/rdiscount.rb +22 -0
  111. data/lib/nanoc/filters/rdoc.rb +33 -0
  112. data/lib/nanoc/filters/redcarpet.rb +62 -0
  113. data/lib/nanoc/filters/redcloth.rb +47 -0
  114. data/lib/nanoc/filters/relativize_paths.rb +94 -0
  115. data/lib/nanoc/filters/rubypants.rb +20 -0
  116. data/lib/nanoc/filters/sass.rb +74 -0
  117. data/lib/nanoc/filters/slim.rb +25 -0
  118. data/lib/nanoc/filters/typogruby.rb +23 -0
  119. data/lib/nanoc/filters/uglify_js.rb +42 -0
  120. data/lib/nanoc/filters/xsl.rb +46 -0
  121. data/lib/nanoc/filters/yui_compressor.rb +23 -0
  122. data/lib/nanoc/helpers.rb +16 -0
  123. data/lib/nanoc/helpers/blogging.rb +319 -0
  124. data/lib/nanoc/helpers/breadcrumbs.rb +40 -0
  125. data/lib/nanoc/helpers/capturing.rb +138 -0
  126. data/lib/nanoc/helpers/filtering.rb +50 -0
  127. data/lib/nanoc/helpers/html_escape.rb +55 -0
  128. data/lib/nanoc/helpers/link_to.rb +151 -0
  129. data/lib/nanoc/helpers/rendering.rb +140 -0
  130. data/lib/nanoc/helpers/tagging.rb +71 -0
  131. data/lib/nanoc/helpers/text.rb +44 -0
  132. data/lib/nanoc/helpers/xml_sitemap.rb +76 -0
  133. data/lib/nanoc/tasks.rb +10 -0
  134. data/lib/nanoc/tasks/clean.rake +16 -0
  135. data/lib/nanoc/tasks/clean.rb +29 -0
  136. data/lib/nanoc/tasks/deploy/rsync.rake +16 -0
  137. data/lib/nanoc/tasks/validate.rake +92 -0
  138. data/nanoc.gemspec +49 -0
  139. data/tasks/doc.rake +16 -0
  140. data/tasks/test.rake +46 -0
  141. data/test/base/core_ext/array_spec.rb +73 -0
  142. data/test/base/core_ext/hash_spec.rb +98 -0
  143. data/test/base/core_ext/pathname_spec.rb +27 -0
  144. data/test/base/core_ext/string_spec.rb +37 -0
  145. data/test/base/test_checksum_store.rb +35 -0
  146. data/test/base/test_code_snippet.rb +31 -0
  147. data/test/base/test_compiler.rb +403 -0
  148. data/test/base/test_compiler_dsl.rb +161 -0
  149. data/test/base/test_context.rb +31 -0
  150. data/test/base/test_data_source.rb +46 -0
  151. data/test/base/test_dependency_tracker.rb +262 -0
  152. data/test/base/test_directed_graph.rb +288 -0
  153. data/test/base/test_filter.rb +83 -0
  154. data/test/base/test_item.rb +179 -0
  155. data/test/base/test_item_rep.rb +579 -0
  156. data/test/base/test_layout.rb +59 -0
  157. data/test/base/test_memoization.rb +90 -0
  158. data/test/base/test_notification_center.rb +34 -0
  159. data/test/base/test_outdatedness_checker.rb +394 -0
  160. data/test/base/test_plugin.rb +30 -0
  161. data/test/base/test_rule.rb +19 -0
  162. data/test/base/test_rule_context.rb +65 -0
  163. data/test/base/test_site.rb +190 -0
  164. data/test/cli/commands/test_compile.rb +33 -0
  165. data/test/cli/commands/test_create_item.rb +14 -0
  166. data/test/cli/commands/test_create_layout.rb +28 -0
  167. data/test/cli/commands/test_create_site.rb +24 -0
  168. data/test/cli/commands/test_deploy.rb +74 -0
  169. data/test/cli/commands/test_help.rb +12 -0
  170. data/test/cli/commands/test_info.rb +11 -0
  171. data/test/cli/commands/test_prune.rb +98 -0
  172. data/test/cli/commands/test_update.rb +10 -0
  173. data/test/cli/test_cli.rb +102 -0
  174. data/test/cli/test_error_handler.rb +29 -0
  175. data/test/cli/test_logger.rb +10 -0
  176. data/test/data_sources/test_filesystem.rb +433 -0
  177. data/test/data_sources/test_filesystem_unified.rb +536 -0
  178. data/test/data_sources/test_filesystem_verbose.rb +357 -0
  179. data/test/extra/core_ext/test_enumerable.rb +30 -0
  180. data/test/extra/core_ext/test_pathname.rb +17 -0
  181. data/test/extra/core_ext/test_time.rb +15 -0
  182. data/test/extra/deployers/test_fog.rb +67 -0
  183. data/test/extra/deployers/test_rsync.rb +100 -0
  184. data/test/extra/test_auto_compiler.rb +417 -0
  185. data/test/extra/test_file_proxy.rb +19 -0
  186. data/test/extra/test_vcs.rb +22 -0
  187. data/test/extra/validators/test_links.rb +62 -0
  188. data/test/extra/validators/test_w3c.rb +47 -0
  189. data/test/filters/test_asciidoc.rb +22 -0
  190. data/test/filters/test_bluecloth.rb +18 -0
  191. data/test/filters/test_coderay.rb +44 -0
  192. data/test/filters/test_coffeescript.rb +18 -0
  193. data/test/filters/test_colorize_syntax.rb +379 -0
  194. data/test/filters/test_erb.rb +105 -0
  195. data/test/filters/test_erubis.rb +78 -0
  196. data/test/filters/test_haml.rb +96 -0
  197. data/test/filters/test_kramdown.rb +18 -0
  198. data/test/filters/test_less.rb +113 -0
  199. data/test/filters/test_markaby.rb +24 -0
  200. data/test/filters/test_maruku.rb +18 -0
  201. data/test/filters/test_mustache.rb +25 -0
  202. data/test/filters/test_rainpress.rb +29 -0
  203. data/test/filters/test_rdiscount.rb +31 -0
  204. data/test/filters/test_rdoc.rb +18 -0
  205. data/test/filters/test_redcarpet.rb +73 -0
  206. data/test/filters/test_redcloth.rb +33 -0
  207. data/test/filters/test_relativize_paths.rb +533 -0
  208. data/test/filters/test_rubypants.rb +18 -0
  209. data/test/filters/test_sass.rb +229 -0
  210. data/test/filters/test_slim.rb +35 -0
  211. data/test/filters/test_typogruby.rb +21 -0
  212. data/test/filters/test_uglify_js.rb +30 -0
  213. data/test/filters/test_xsl.rb +105 -0
  214. data/test/filters/test_yui_compressor.rb +44 -0
  215. data/test/gem_loader.rb +11 -0
  216. data/test/helper.rb +207 -0
  217. data/test/helpers/test_blogging.rb +754 -0
  218. data/test/helpers/test_breadcrumbs.rb +81 -0
  219. data/test/helpers/test_capturing.rb +41 -0
  220. data/test/helpers/test_filtering.rb +106 -0
  221. data/test/helpers/test_html_escape.rb +32 -0
  222. data/test/helpers/test_link_to.rb +249 -0
  223. data/test/helpers/test_rendering.rb +89 -0
  224. data/test/helpers/test_tagging.rb +87 -0
  225. data/test/helpers/test_text.rb +24 -0
  226. data/test/helpers/test_xml_sitemap.rb +103 -0
  227. data/test/tasks/test_clean.rb +67 -0
  228. metadata +327 -15
  229. data/bin/nanoc-select +0 -86
  230. data/lib/nanoc-select.rb +0 -11
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::MustacheTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_filter
8
+ if_have 'mustache' do
9
+ # Create item
10
+ item = Nanoc::Item.new(
11
+ 'content',
12
+ { :title => 'Max Payne', :protagonist => 'Max Payne' },
13
+ '/games/max-payne/'
14
+ )
15
+
16
+ # Create filter
17
+ filter = ::Nanoc::Filters::Mustache.new({ :item => item })
18
+
19
+ # Run filter
20
+ result = filter.run('The protagonist of {{title}} is {{protagonist}}.')
21
+ assert_equal('The protagonist of Max Payne is Max Payne.', result)
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RainpressTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_filter
8
+ if_have 'rainpress' do
9
+ # Create filter
10
+ filter = ::Nanoc::Filters::Rainpress.new
11
+
12
+ # Run filter
13
+ result = filter.run("body { color: black; }")
14
+ assert_equal("body{color:#000}", result)
15
+ end
16
+ end
17
+
18
+ def test_filter_with_options
19
+ if_have 'rainpress' do
20
+ # Create filter
21
+ filter = ::Nanoc::Filters::Rainpress.new
22
+
23
+ # Run filter
24
+ result = filter.run("body { color: #aabbcc; }", :colors => false)
25
+ assert_equal("body{color:#aabbcc}", result)
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RDiscountTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_filter
8
+ if_have 'rdiscount' do
9
+ # Create filter
10
+ filter = ::Nanoc::Filters::RDiscount.new
11
+
12
+ # Run filter
13
+ result = filter.run("> Quote")
14
+ assert_match(/<blockquote>\s*<p>Quote<\/p>\s*<\/blockquote>/, result)
15
+ end
16
+ end
17
+
18
+ def test_with_extensions
19
+ if_have 'rdiscount' do
20
+ # Create filter
21
+ filter = ::Nanoc::Filters::RDiscount.new
22
+
23
+ # Run filter
24
+ input = "The quotation 'marks' sure make this look sarcastic!"
25
+ output_expected = /The quotation &lsquo;marks&rsquo; sure make this look sarcastic!/
26
+ output_actual = filter.run(input, :extensions => [ :smart ])
27
+ assert_match(output_expected, output_actual)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RDocTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_filter
8
+ if_have 'rdoc' do
9
+ # Get filter
10
+ filter = ::Nanoc::Filters::RDoc.new
11
+
12
+ # Run filter
13
+ result = filter.run("= Foo")
14
+ assert_match(%r{<h1( id="label-Foo")?>Foo</h1>\Z}, result)
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RedcarpetTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_find
8
+ if_have 'redcarpet' do
9
+ refute Nanoc::Filter.named(:redcarpet).nil?
10
+ end
11
+ end
12
+
13
+ def test_filter
14
+ if_have 'redcarpet' do
15
+ # Create filter
16
+ filter = ::Nanoc::Filters::Redcarpet.new
17
+
18
+ # Run filter
19
+ result = filter.run("> Quote")
20
+ assert_match(/<blockquote>\s*<p>Quote<\/p>\s*<\/blockquote>/, result)
21
+ end
22
+ end
23
+
24
+ def test_with_extensions
25
+ if_have 'redcarpet' do
26
+ # Create filter
27
+ filter = ::Nanoc::Filters::Redcarpet.new
28
+
29
+ # Run filter
30
+ if ::Redcarpet::VERSION > '2'
31
+ input = "this is ~~good~~ bad"
32
+ output_expected = /this is <del>good<\/del> bad/
33
+ output_actual = filter.run(input, :options => { :strikethrough => true })
34
+ else
35
+ input = "The quotation 'marks' sure make this look sarcastic!"
36
+ output_expected = /The quotation &lsquo;marks&rsquo; sure make this look sarcastic!/
37
+ output_actual = filter.run(input, :options => [ :smart ])
38
+ end
39
+ assert_match(output_expected, output_actual)
40
+ end
41
+ end
42
+
43
+ def test_html_by_default
44
+ if_have 'redcarpet' do
45
+ # Create filter
46
+ filter = ::Nanoc::Filters::Redcarpet.new
47
+
48
+ # Run filter
49
+ input = "![Alt](/path/to/img 'Title')"
50
+ output_expected = %r{<img src="/path/to/img" alt="Alt" title="Title">}
51
+ output_actual = filter.run(input)
52
+ assert_match(output_expected, output_actual)
53
+ end
54
+ end
55
+
56
+ def test_xhtml_if_requested
57
+ if_have 'redcarpet' do
58
+ # Create filter
59
+ filter = ::Nanoc::Filters::Redcarpet.new
60
+
61
+ # Run filter
62
+ input = "![Alt](/path/to/img 'Title')"
63
+ output_expected = %r{<img src="/path/to/img" alt="Alt" title="Title"/>}
64
+ if ::Redcarpet::VERSION > '2'
65
+ output_actual = filter.run(input, :renderer_options => { :xhtml => true })
66
+ else
67
+ output_actual = filter.run(input, :options => [ :xhtml ])
68
+ end
69
+ assert_match(output_expected, output_actual)
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RedClothTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+ def test_filter
8
+ if_have 'redcloth' do
9
+ # Get filter
10
+ filter = ::Nanoc::Filters::RedCloth.new
11
+
12
+ # Run filter
13
+ result = filter.run("h1. Foo")
14
+ assert_equal("<h1>Foo</h1>", result)
15
+ end
16
+ end
17
+
18
+ def test_filter_with_options
19
+ if_have 'redcloth' do
20
+ # Get filter
21
+ filter = ::Nanoc::Filters::RedCloth.new
22
+
23
+ # Run filter without options
24
+ result = filter.run("I am a member of SPECTRE.")
25
+ assert_equal("<p>I am a member of <span class=\"caps\">SPECTRE</span>.</p>", result)
26
+
27
+ # Run filter with options
28
+ result = filter.run("I am a member of SPECTRE.", :no_span_caps => true)
29
+ assert_equal("<p>I am a member of SPECTRE.</p>", result)
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,533 @@
1
+ # encoding: utf-8
2
+
3
+ class Nanoc::Filters::RelativizePathsTest < MiniTest::Unit::TestCase
4
+
5
+ include Nanoc::TestHelpers
6
+
7
+
8
+ def test_filter_html_with_double_quotes
9
+ # Create filter with mock item
10
+ filter = Nanoc::Filters::RelativizePaths.new
11
+
12
+ # Mock item
13
+ filter.instance_eval do
14
+ @item_rep = Nanoc::ItemRep.new(
15
+ Nanoc::Item.new(
16
+ 'content',
17
+ {},
18
+ '/foo/bar/baz/'),
19
+ :blah)
20
+ @item_rep.path = '/foo/bar/baz/'
21
+ end
22
+
23
+ # Set content
24
+ raw_content = %[<a href="/foo">foo</a>]
25
+ expected_content = %[<a href="../..">foo</a>]
26
+
27
+ # Test
28
+ actual_content = filter.run(raw_content, :type => :html)
29
+ assert_equal(expected_content, actual_content)
30
+ end
31
+
32
+ def test_filter_html_with_single_quotes
33
+ # Create filter with mock item
34
+ filter = Nanoc::Filters::RelativizePaths.new
35
+
36
+ # Mock item
37
+ filter.instance_eval do
38
+ @item_rep = Nanoc::ItemRep.new(
39
+ Nanoc::Item.new(
40
+ 'content',
41
+ {},
42
+ '/foo/bar/baz/'),
43
+ :blah)
44
+ @item_rep.path = '/foo/bar/baz/'
45
+ end
46
+
47
+ # Set content
48
+ raw_content = %[<a href='/foo'>foo</a>]
49
+ expected_content = %[<a href='../..'>foo</a>]
50
+
51
+ # Test
52
+ actual_content = filter.run(raw_content, :type => :html)
53
+ assert_equal(expected_content, actual_content)
54
+ end
55
+
56
+ def test_filter_html_without_quotes
57
+ # Create filter with mock item
58
+ filter = Nanoc::Filters::RelativizePaths.new
59
+
60
+ # Mock item
61
+ filter.instance_eval do
62
+ @item_rep = Nanoc::ItemRep.new(
63
+ Nanoc::Item.new(
64
+ 'content',
65
+ {},
66
+ '/foo/bar/baz/'),
67
+ :blah)
68
+ @item_rep.path = '/foo/bar/baz/'
69
+ end
70
+
71
+ # Set content
72
+ raw_content = %[<a href=/foo>foo</a>]
73
+ expected_content = %[<a href=../..>foo</a>]
74
+
75
+ # Test
76
+ actual_content = filter.run(raw_content, :type => :html)
77
+ assert_equal(expected_content, actual_content)
78
+ end
79
+
80
+ def test_filter_html_multiple
81
+ # Create filter with mock item
82
+ filter = Nanoc::Filters::RelativizePaths.new
83
+
84
+ # Mock item
85
+ filter.instance_eval do
86
+ @item_rep = Nanoc::ItemRep.new(
87
+ Nanoc::Item.new(
88
+ 'content',
89
+ {},
90
+ '/foo/bar/baz/'),
91
+ :blah)
92
+ @item_rep.path = '/foo/bar/baz/'
93
+ end
94
+
95
+ # Set content
96
+ raw_content = %[<a href="/foo">foo</a> <a href="/bar">bar</a>]
97
+ expected_content = %[<a href="../..">foo</a> <a href="../../../bar">bar</a>]
98
+
99
+ # Test
100
+ actual_content = filter.run(raw_content, :type => :html)
101
+ assert_equal(expected_content, actual_content)
102
+ end
103
+
104
+ def test_filter_html_outside_tag
105
+ # Create filter with mock item
106
+ filter = Nanoc::Filters::RelativizePaths.new
107
+
108
+ # Mock item
109
+ filter.instance_eval do
110
+ @item_rep = Nanoc::ItemRep.new(
111
+ Nanoc::Item.new(
112
+ 'content',
113
+ {},
114
+ '/foo/bar/baz/'),
115
+ :blah)
116
+ @item_rep.path = '/foo/bar/baz/'
117
+ end
118
+
119
+ # Set content
120
+ raw_content = %[stuff href="/foo" more stuff]
121
+ expected_content = %[stuff href="/foo" more stuff]
122
+
123
+ # Test
124
+ actual_content = filter.run(raw_content, :type => :html)
125
+ assert_equal(expected_content, actual_content)
126
+ end
127
+
128
+ def test_filter_html_root
129
+ # Create filter with mock item
130
+ filter = Nanoc::Filters::RelativizePaths.new
131
+
132
+ # Mock item
133
+ filter.instance_eval do
134
+ @item_rep = Nanoc::ItemRep.new(
135
+ Nanoc::Item.new(
136
+ 'content',
137
+ {},
138
+ '/foo/bar/baz/'),
139
+ :blah)
140
+ @item_rep.path = '/woof/meow/'
141
+ end
142
+
143
+ # Set content
144
+ raw_content = %[<a href="/">foo</a>]
145
+ expected_content = %[<a href="../../">foo</a>]
146
+
147
+ # Test
148
+ actual_content = filter.run(raw_content, :type => :html)
149
+ assert_equal(expected_content, actual_content)
150
+ end
151
+
152
+ def test_filter_html_network_path
153
+ # Create filter with mock item
154
+ filter = Nanoc::Filters::RelativizePaths.new
155
+
156
+ # Mock item
157
+ filter.instance_eval do
158
+ @item_rep = Nanoc::ItemRep.new(
159
+ Nanoc::Item.new(
160
+ 'content',
161
+ {},
162
+ '/foo/bar/baz/'),
163
+ :blah)
164
+ @item_rep.path = '/woof/meow/'
165
+ end
166
+
167
+ # Set content
168
+ raw_content = %[<a href="//example.com/">example.com</a>]
169
+ expected_content = %[<a href="//example.com/">example.com</a>]
170
+
171
+ # Test
172
+ actual_content = filter.run(raw_content, :type => :html)
173
+ assert_equal(expected_content, actual_content)
174
+ end
175
+
176
+ def test_filter_implicit
177
+ # Create filter with mock item
178
+ filter = Nanoc::Filters::RelativizePaths.new
179
+
180
+ # Test
181
+ assert_raises(RuntimeError) do
182
+ filter.run("moo")
183
+ end
184
+ end
185
+
186
+ def test_filter_css_with_double_quotes
187
+ # Create filter with mock item
188
+ filter = Nanoc::Filters::RelativizePaths.new
189
+
190
+ # Mock item
191
+ filter.instance_eval do
192
+ @item_rep = Nanoc::ItemRep.new(
193
+ Nanoc::Item.new(
194
+ 'content',
195
+ {},
196
+ '/foo/bar/baz/'),
197
+ :blah)
198
+ @item_rep.path = '/foo/bar/baz/'
199
+ end
200
+
201
+ # Set content
202
+ raw_content = %[background: url("/foo/bar/background.png");]
203
+ expected_content = %[background: url("../background.png");]
204
+
205
+ # Test
206
+ actual_content = filter.run(raw_content, :type => :css)
207
+ assert_equal(expected_content, actual_content)
208
+ end
209
+
210
+ def test_filter_css_with_single_quotes
211
+ # Create filter with mock item
212
+ filter = Nanoc::Filters::RelativizePaths.new
213
+
214
+ # Mock item
215
+ filter.instance_eval do
216
+ @item_rep = Nanoc::ItemRep.new(
217
+ Nanoc::Item.new(
218
+ 'content',
219
+ {},
220
+ '/foo/bar/baz/'),
221
+ :blah)
222
+ @item_rep.path = '/foo/bar/baz/'
223
+ end
224
+
225
+ # Set content
226
+ raw_content = %[background: url('/foo/bar/background.png');]
227
+ expected_content = %[background: url('../background.png');]
228
+
229
+ # Test
230
+ actual_content = filter.run(raw_content, :type => :css)
231
+ assert_equal(expected_content, actual_content)
232
+ end
233
+
234
+ def test_filter_css_without_quotes
235
+ # Create filter with mock item
236
+ filter = Nanoc::Filters::RelativizePaths.new
237
+
238
+ # Mock item
239
+ filter.instance_eval do
240
+ @item_rep = Nanoc::ItemRep.new(
241
+ Nanoc::Item.new(
242
+ 'content',
243
+ {},
244
+ '/foo/bar/baz/'),
245
+ :blah)
246
+ @item_rep.path = '/foo/bar/baz/'
247
+ end
248
+
249
+ # Set content
250
+ raw_content = %[background: url(/foo/bar/background.png);]
251
+ expected_content = %[background: url(../background.png);]
252
+
253
+ # Test
254
+ actual_content = filter.run(raw_content, :type => :css)
255
+ assert_equal(expected_content, actual_content)
256
+ end
257
+
258
+ def test_filter_css_multiple
259
+ # Create filter with mock item
260
+ filter = Nanoc::Filters::RelativizePaths.new
261
+
262
+ # Mock item
263
+ filter.instance_eval do
264
+ @item_rep = Nanoc::ItemRep.new(
265
+ Nanoc::Item.new(
266
+ 'content',
267
+ {},
268
+ '/foo/bar/baz/'),
269
+ :blah)
270
+ @item_rep.path = '/foo/bar/baz/'
271
+ end
272
+
273
+ # Set content
274
+ raw_content = %[background: url(/foo/bar/a.png) url(/foo/bar/b.png);]
275
+ expected_content = %[background: url(../a.png) url(../b.png);]
276
+
277
+ # Test
278
+ actual_content = filter.run(raw_content, :type => :css)
279
+ assert_equal(expected_content, actual_content)
280
+ end
281
+
282
+ def test_filter_css_root
283
+ # It is probably a bit weird to have “url(/)” in CSS, but I’ve made a
284
+ # test case for this situation anyway. Can’t hurt…
285
+
286
+ # Create filter with mock item
287
+ filter = Nanoc::Filters::RelativizePaths.new
288
+
289
+ # Mock item
290
+ filter.instance_eval do
291
+ @item_rep = Nanoc::ItemRep.new(
292
+ Nanoc::Item.new(
293
+ 'content',
294
+ {},
295
+ '/foo/bar/baz/'),
296
+ :blah)
297
+ @item_rep.path = '/woof/meow/'
298
+ end
299
+
300
+ # Set content
301
+ raw_content = %[background: url(/);]
302
+ expected_content = %[background: url(../../);]
303
+
304
+ # Test
305
+ actual_content = filter.run(raw_content, :type => :css)
306
+ assert_equal(expected_content, actual_content)
307
+ end
308
+
309
+ def test_filter_css_network_path
310
+ # Create filter with mock item
311
+ filter = Nanoc::Filters::RelativizePaths.new
312
+
313
+ # Mock item
314
+ filter.instance_eval do
315
+ @item_rep = Nanoc::ItemRep.new(
316
+ Nanoc::Item.new(
317
+ 'content',
318
+ {},
319
+ '/foo/bar/baz/'),
320
+ :blah)
321
+ @item_rep.path = '/woof/meow/'
322
+ end
323
+
324
+ # Set content
325
+ raw_content = %[background: url(//example.com);]
326
+ expected_content = %[background: url(//example.com);]
327
+
328
+ # Test
329
+ actual_content = filter.run(raw_content, :type => :css)
330
+ assert_equal(expected_content, actual_content)
331
+ end
332
+
333
+ def test_filter_xml
334
+ if_have 'nokogiri' do
335
+ # Create filter with mock item
336
+ filter = Nanoc::Filters::RelativizePaths.new
337
+
338
+ # Mock item
339
+ filter.instance_eval do
340
+ @item_rep = Nanoc::ItemRep.new(
341
+ Nanoc::Item.new(
342
+ 'content',
343
+ {},
344
+ '/foo/bar/baz/'),
345
+ :blah)
346
+ @item_rep.path = '/foo/bar/baz/'
347
+ end
348
+
349
+ # Set content
350
+ raw_content = <<-XML
351
+ <?xml version="1.0" encoding="utf-8"?>
352
+ <foo>
353
+ <bar boo="/foo">baz</bar>
354
+ </foo>
355
+ XML
356
+
357
+ expected_content = <<-XML
358
+ <?xml version="1.0" encoding="utf-8"?>
359
+ <foo>
360
+ <bar boo="../..">baz</bar>
361
+ </foo>
362
+ XML
363
+
364
+ # Test
365
+ actual_content = filter.run(raw_content, :type => :xml, :select => ['*/@boo'])
366
+ assert_equal(expected_content, actual_content)
367
+ end
368
+ end
369
+
370
+ def test_filter_fragment_xml
371
+ if_have 'nokogiri' do
372
+ # Create filter with mock item
373
+ filter = Nanoc::Filters::RelativizePaths.new
374
+
375
+ # Mock item
376
+ filter.instance_eval do
377
+ @item_rep = Nanoc::ItemRep.new(
378
+ Nanoc::Item.new(
379
+ 'content',
380
+ {},
381
+ '/foo/bar/baz/'),
382
+ :blah)
383
+ @item_rep.path = '/foo/bar/baz/'
384
+ end
385
+
386
+ # Set content
387
+ raw_content = <<-XML
388
+ <foo>
389
+ <bar><far href="/foo">baz</far></bar>
390
+ </foo>
391
+ XML
392
+
393
+ expected_content = <<-XML
394
+ <foo>
395
+ <bar><far href="../..">baz</far></bar>
396
+ </foo>
397
+ XML
398
+
399
+ # Test
400
+ actual_content = filter.run(raw_content, :type => :xml, :select => ['far/@href'])
401
+ assert_equal(expected_content, actual_content)
402
+ end
403
+ end
404
+
405
+ def test_filter_xml_with_namespaces
406
+ if_have 'nokogiri' do
407
+ # Create filter with mock item
408
+ filter = Nanoc::Filters::RelativizePaths.new
409
+
410
+ # Mock item
411
+ filter.instance_eval do
412
+ @item_rep = Nanoc::ItemRep.new(
413
+ Nanoc::Item.new(
414
+ 'content',
415
+ {},
416
+ '/foo/bar/baz/'),
417
+ :blah)
418
+ @item_rep.path = '/foo/bar/baz/'
419
+ end
420
+
421
+ # Set content
422
+ raw_content = <<-XML
423
+ <foo xmlns="http://example.org">
424
+ <bar><a href="/foo">baz</a></bar>
425
+ </foo>
426
+ XML
427
+
428
+ expected_content = <<-XML
429
+ <foo xmlns="http://example.org">
430
+ <bar><a href="../..">baz</a></bar>
431
+ </foo>
432
+ XML
433
+
434
+ # Test
435
+ actual_content = filter.run(raw_content, {
436
+ :type => :xml,
437
+ :namespaces => {:ex => 'http://example.org'},
438
+ :select => ['ex:a/@href']
439
+ })
440
+ assert_equal(expected_content, actual_content)
441
+ end
442
+ end
443
+
444
+ def test_filter_xhtml
445
+ if_have 'nokogiri' do
446
+ # Create filter with mock item
447
+ filter = Nanoc::Filters::RelativizePaths.new
448
+
449
+ # Mock item
450
+ filter.instance_eval do
451
+ @item_rep = Nanoc::ItemRep.new(
452
+ Nanoc::Item.new(
453
+ 'content',
454
+ {},
455
+ '/foo/bar/baz/'),
456
+ :blah)
457
+ @item_rep.path = '/foo/bar/baz/'
458
+ end
459
+
460
+ # Set content
461
+ raw_content = <<-XML
462
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
463
+ <html xmlns="http://www.w3.org/1999/xhtml">
464
+ <head>
465
+ <link rel="stylesheet" href="/css"/>
466
+ <script src="/js"></script>
467
+ </head>
468
+ <body>
469
+ <a href="/foo">bar</a>
470
+ <img src="/img"/>
471
+ </body>
472
+ </html>
473
+ XML
474
+
475
+ expected_content = <<-XML
476
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
477
+ <html xmlns="http://www.w3.org/1999/xhtml">
478
+ <head>
479
+ <link rel="stylesheet" href="../../../css" />
480
+ <script src="../../../js"></script>
481
+ </head>
482
+ <body>
483
+ <a href="../..">bar</a>
484
+ <img src="../../../img" />
485
+ </body>
486
+ </html>
487
+ XML
488
+
489
+ # Test
490
+ actual_content = filter.run(raw_content, :type => :xhtml)
491
+ assert_equal(expected_content, actual_content)
492
+ end
493
+ end
494
+
495
+ def test_filter_fragment_xhtml
496
+ if_have 'nokogiri' do
497
+ # Create filter with mock item
498
+ filter = Nanoc::Filters::RelativizePaths.new
499
+
500
+ # Mock item
501
+ filter.instance_eval do
502
+ @item_rep = Nanoc::ItemRep.new(
503
+ Nanoc::Item.new(
504
+ 'content',
505
+ {},
506
+ '/foo/bar/baz/'),
507
+ :blah)
508
+ @item_rep.path = '/foo/bar/baz/'
509
+ end
510
+
511
+ # Set content
512
+ raw_content = <<-XML
513
+ <a href="/foo">bar</a>
514
+ <p>
515
+ <img src="/img"/>
516
+ </p>
517
+ XML
518
+
519
+ expected_content = <<-XML
520
+ <a href="../..">bar</a>
521
+ <p>
522
+ <img src="../../../img" />
523
+ </p>
524
+ XML
525
+
526
+ # Test
527
+ actual_content = filter.run(raw_content, :type => :xhtml)
528
+ assert_equal(expected_content, actual_content)
529
+ end
530
+ end
531
+
532
+
533
+ end