nanoc3 3.2.4 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. metadata +14 -313
  2. data/.gemtest +0 -0
  3. data/ChangeLog +0 -3
  4. data/Gemfile +0 -29
  5. data/LICENSE +0 -19
  6. data/NEWS.md +0 -449
  7. data/README.md +0 -108
  8. data/Rakefile +0 -14
  9. data/bin/nanoc3 +0 -12
  10. data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
  11. data/lib/nanoc3.rb +0 -28
  12. data/lib/nanoc3/base.rb +0 -49
  13. data/lib/nanoc3/base/compilation/checksum_store.rb +0 -57
  14. data/lib/nanoc3/base/compilation/compiled_content_cache.rb +0 -62
  15. data/lib/nanoc3/base/compilation/compiler.rb +0 -455
  16. data/lib/nanoc3/base/compilation/compiler_dsl.rb +0 -214
  17. data/lib/nanoc3/base/compilation/dependency_tracker.rb +0 -196
  18. data/lib/nanoc3/base/compilation/filter.rb +0 -165
  19. data/lib/nanoc3/base/compilation/item_rep_proxy.rb +0 -102
  20. data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +0 -88
  21. data/lib/nanoc3/base/compilation/outdatedness_checker.rb +0 -223
  22. data/lib/nanoc3/base/compilation/outdatedness_reasons.rb +0 -46
  23. data/lib/nanoc3/base/compilation/rule.rb +0 -73
  24. data/lib/nanoc3/base/compilation/rule_context.rb +0 -84
  25. data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -40
  26. data/lib/nanoc3/base/compilation/rule_memory_store.rb +0 -53
  27. data/lib/nanoc3/base/compilation/rules_collection.rb +0 -231
  28. data/lib/nanoc3/base/context.rb +0 -47
  29. data/lib/nanoc3/base/core_ext.rb +0 -6
  30. data/lib/nanoc3/base/core_ext/array.rb +0 -62
  31. data/lib/nanoc3/base/core_ext/hash.rb +0 -63
  32. data/lib/nanoc3/base/core_ext/pathname.rb +0 -26
  33. data/lib/nanoc3/base/core_ext/string.rb +0 -46
  34. data/lib/nanoc3/base/directed_graph.rb +0 -275
  35. data/lib/nanoc3/base/errors.rb +0 -174
  36. data/lib/nanoc3/base/memoization.rb +0 -67
  37. data/lib/nanoc3/base/notification_center.rb +0 -84
  38. data/lib/nanoc3/base/ordered_hash.rb +0 -200
  39. data/lib/nanoc3/base/plugin_registry.rb +0 -165
  40. data/lib/nanoc3/base/result_data/item_rep.rb +0 -488
  41. data/lib/nanoc3/base/source_data/code_snippet.rb +0 -58
  42. data/lib/nanoc3/base/source_data/configuration.rb +0 -24
  43. data/lib/nanoc3/base/source_data/data_source.rb +0 -234
  44. data/lib/nanoc3/base/source_data/item.rb +0 -301
  45. data/lib/nanoc3/base/source_data/layout.rb +0 -130
  46. data/lib/nanoc3/base/source_data/site.rb +0 -361
  47. data/lib/nanoc3/base/store.rb +0 -135
  48. data/lib/nanoc3/cli.rb +0 -133
  49. data/lib/nanoc3/cli/command.rb +0 -139
  50. data/lib/nanoc3/cli/commands/autocompile.rb +0 -60
  51. data/lib/nanoc3/cli/commands/compile.rb +0 -280
  52. data/lib/nanoc3/cli/commands/create_item.rb +0 -62
  53. data/lib/nanoc3/cli/commands/create_layout.rb +0 -75
  54. data/lib/nanoc3/cli/commands/create_site.rb +0 -410
  55. data/lib/nanoc3/cli/commands/debug.rb +0 -119
  56. data/lib/nanoc3/cli/commands/info.rb +0 -98
  57. data/lib/nanoc3/cli/commands/nanoc.rb +0 -37
  58. data/lib/nanoc3/cli/commands/update.rb +0 -72
  59. data/lib/nanoc3/cli/commands/view.rb +0 -84
  60. data/lib/nanoc3/cli/commands/watch.rb +0 -125
  61. data/lib/nanoc3/cli/error_handler.rb +0 -193
  62. data/lib/nanoc3/cli/logger.rb +0 -91
  63. data/lib/nanoc3/data_sources.rb +0 -29
  64. data/lib/nanoc3/data_sources/deprecated/delicious.rb +0 -42
  65. data/lib/nanoc3/data_sources/deprecated/last_fm.rb +0 -87
  66. data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -38
  67. data/lib/nanoc3/data_sources/filesystem.rb +0 -299
  68. data/lib/nanoc3/data_sources/filesystem_unified.rb +0 -116
  69. data/lib/nanoc3/data_sources/filesystem_verbose.rb +0 -86
  70. data/lib/nanoc3/extra.rb +0 -22
  71. data/lib/nanoc3/extra/auto_compiler.rb +0 -103
  72. data/lib/nanoc3/extra/chick.rb +0 -125
  73. data/lib/nanoc3/extra/core_ext.rb +0 -4
  74. data/lib/nanoc3/extra/core_ext/enumerable.rb +0 -33
  75. data/lib/nanoc3/extra/core_ext/time.rb +0 -19
  76. data/lib/nanoc3/extra/deployers.rb +0 -11
  77. data/lib/nanoc3/extra/deployers/rsync.rb +0 -114
  78. data/lib/nanoc3/extra/file_proxy.rb +0 -40
  79. data/lib/nanoc3/extra/validators.rb +0 -12
  80. data/lib/nanoc3/extra/validators/links.rb +0 -264
  81. data/lib/nanoc3/extra/validators/w3c.rb +0 -95
  82. data/lib/nanoc3/extra/vcs.rb +0 -66
  83. data/lib/nanoc3/extra/vcses.rb +0 -17
  84. data/lib/nanoc3/extra/vcses/bazaar.rb +0 -25
  85. data/lib/nanoc3/extra/vcses/dummy.rb +0 -24
  86. data/lib/nanoc3/extra/vcses/git.rb +0 -25
  87. data/lib/nanoc3/extra/vcses/mercurial.rb +0 -25
  88. data/lib/nanoc3/extra/vcses/subversion.rb +0 -25
  89. data/lib/nanoc3/filters.rb +0 -53
  90. data/lib/nanoc3/filters/asciidoc.rb +0 -38
  91. data/lib/nanoc3/filters/bluecloth.rb +0 -19
  92. data/lib/nanoc3/filters/coderay.rb +0 -21
  93. data/lib/nanoc3/filters/colorize_syntax.rb +0 -261
  94. data/lib/nanoc3/filters/erb.rb +0 -35
  95. data/lib/nanoc3/filters/erubis.rb +0 -27
  96. data/lib/nanoc3/filters/haml.rb +0 -27
  97. data/lib/nanoc3/filters/kramdown.rb +0 -20
  98. data/lib/nanoc3/filters/less.rb +0 -53
  99. data/lib/nanoc3/filters/markaby.rb +0 -20
  100. data/lib/nanoc3/filters/maruku.rb +0 -20
  101. data/lib/nanoc3/filters/mustache.rb +0 -24
  102. data/lib/nanoc3/filters/rainpress.rb +0 -19
  103. data/lib/nanoc3/filters/rdiscount.rb +0 -22
  104. data/lib/nanoc3/filters/rdoc.rb +0 -33
  105. data/lib/nanoc3/filters/redcarpet.rb +0 -27
  106. data/lib/nanoc3/filters/redcloth.rb +0 -47
  107. data/lib/nanoc3/filters/relativize_paths.rb +0 -45
  108. data/lib/nanoc3/filters/rubypants.rb +0 -20
  109. data/lib/nanoc3/filters/sass.rb +0 -66
  110. data/lib/nanoc3/filters/slim.rb +0 -25
  111. data/lib/nanoc3/filters/typogruby.rb +0 -23
  112. data/lib/nanoc3/filters/uglify_js.rb +0 -42
  113. data/lib/nanoc3/helpers.rb +0 -16
  114. data/lib/nanoc3/helpers/blogging.rb +0 -319
  115. data/lib/nanoc3/helpers/breadcrumbs.rb +0 -40
  116. data/lib/nanoc3/helpers/capturing.rb +0 -138
  117. data/lib/nanoc3/helpers/filtering.rb +0 -50
  118. data/lib/nanoc3/helpers/html_escape.rb +0 -55
  119. data/lib/nanoc3/helpers/link_to.rb +0 -151
  120. data/lib/nanoc3/helpers/rendering.rb +0 -140
  121. data/lib/nanoc3/helpers/tagging.rb +0 -71
  122. data/lib/nanoc3/helpers/text.rb +0 -44
  123. data/lib/nanoc3/helpers/xml_sitemap.rb +0 -76
  124. data/lib/nanoc3/tasks.rb +0 -10
  125. data/lib/nanoc3/tasks/clean.rake +0 -16
  126. data/lib/nanoc3/tasks/clean.rb +0 -29
  127. data/lib/nanoc3/tasks/deploy/rsync.rake +0 -14
  128. data/lib/nanoc3/tasks/validate.rake +0 -92
  129. data/nanoc3.gemspec +0 -49
  130. data/tasks/doc.rake +0 -16
  131. data/tasks/test.rake +0 -44
  132. data/test/base/core_ext/array_spec.rb +0 -73
  133. data/test/base/core_ext/hash_spec.rb +0 -98
  134. data/test/base/core_ext/pathname_spec.rb +0 -27
  135. data/test/base/core_ext/string_spec.rb +0 -37
  136. data/test/base/test_checksum_store.rb +0 -35
  137. data/test/base/test_code_snippet.rb +0 -31
  138. data/test/base/test_compiler.rb +0 -316
  139. data/test/base/test_compiler_dsl.rb +0 -161
  140. data/test/base/test_context.rb +0 -31
  141. data/test/base/test_data_source.rb +0 -46
  142. data/test/base/test_dependency_tracker.rb +0 -262
  143. data/test/base/test_directed_graph.rb +0 -283
  144. data/test/base/test_filter.rb +0 -83
  145. data/test/base/test_item.rb +0 -179
  146. data/test/base/test_item_rep.rb +0 -553
  147. data/test/base/test_layout.rb +0 -59
  148. data/test/base/test_memoization.rb +0 -90
  149. data/test/base/test_notification_center.rb +0 -34
  150. data/test/base/test_outdatedness_checker.rb +0 -394
  151. data/test/base/test_plugin.rb +0 -30
  152. data/test/base/test_rule.rb +0 -19
  153. data/test/base/test_rule_context.rb +0 -65
  154. data/test/base/test_site.rb +0 -190
  155. data/test/cli/commands/test_compile.rb +0 -33
  156. data/test/cli/commands/test_create_item.rb +0 -14
  157. data/test/cli/commands/test_create_layout.rb +0 -28
  158. data/test/cli/commands/test_create_site.rb +0 -24
  159. data/test/cli/commands/test_help.rb +0 -12
  160. data/test/cli/commands/test_info.rb +0 -11
  161. data/test/cli/commands/test_update.rb +0 -10
  162. data/test/cli/test_cli.rb +0 -102
  163. data/test/cli/test_error_handler.rb +0 -29
  164. data/test/cli/test_logger.rb +0 -10
  165. data/test/data_sources/test_filesystem.rb +0 -433
  166. data/test/data_sources/test_filesystem_unified.rb +0 -536
  167. data/test/data_sources/test_filesystem_verbose.rb +0 -357
  168. data/test/extra/core_ext/test_enumerable.rb +0 -30
  169. data/test/extra/core_ext/test_time.rb +0 -15
  170. data/test/extra/deployers/test_rsync.rb +0 -232
  171. data/test/extra/test_auto_compiler.rb +0 -417
  172. data/test/extra/test_file_proxy.rb +0 -19
  173. data/test/extra/test_vcs.rb +0 -22
  174. data/test/extra/validators/test_links.rb +0 -51
  175. data/test/extra/validators/test_w3c.rb +0 -47
  176. data/test/filters/test_asciidoc.rb +0 -22
  177. data/test/filters/test_bluecloth.rb +0 -18
  178. data/test/filters/test_coderay.rb +0 -44
  179. data/test/filters/test_colorize_syntax.rb +0 -283
  180. data/test/filters/test_erb.rb +0 -99
  181. data/test/filters/test_erubis.rb +0 -70
  182. data/test/filters/test_haml.rb +0 -96
  183. data/test/filters/test_kramdown.rb +0 -18
  184. data/test/filters/test_less.rb +0 -113
  185. data/test/filters/test_markaby.rb +0 -24
  186. data/test/filters/test_maruku.rb +0 -18
  187. data/test/filters/test_mustache.rb +0 -25
  188. data/test/filters/test_rainpress.rb +0 -29
  189. data/test/filters/test_rdiscount.rb +0 -31
  190. data/test/filters/test_rdoc.rb +0 -18
  191. data/test/filters/test_redcarpet.rb +0 -63
  192. data/test/filters/test_redcloth.rb +0 -33
  193. data/test/filters/test_relativize_paths.rb +0 -332
  194. data/test/filters/test_rubypants.rb +0 -18
  195. data/test/filters/test_sass.rb +0 -229
  196. data/test/filters/test_slim.rb +0 -35
  197. data/test/filters/test_typogruby.rb +0 -21
  198. data/test/filters/test_uglify_js.rb +0 -30
  199. data/test/gem_loader.rb +0 -11
  200. data/test/helper.rb +0 -179
  201. data/test/helpers/test_blogging.rb +0 -754
  202. data/test/helpers/test_breadcrumbs.rb +0 -81
  203. data/test/helpers/test_capturing.rb +0 -41
  204. data/test/helpers/test_filtering.rb +0 -106
  205. data/test/helpers/test_html_escape.rb +0 -32
  206. data/test/helpers/test_link_to.rb +0 -249
  207. data/test/helpers/test_rendering.rb +0 -89
  208. data/test/helpers/test_tagging.rb +0 -87
  209. data/test/helpers/test_text.rb +0 -24
  210. data/test/helpers/test_xml_sitemap.rb +0 -103
  211. data/test/tasks/test_clean.rb +0 -67
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Provides support for breadcrumbs, which allow the user to go up in the
6
- # page hierarchy.
7
- module Breadcrumbs
8
-
9
- # Creates a breadcrumb trail leading from the current item to its parent,
10
- # to its parent’s parent, etc, until the root item is reached. This
11
- # function does not require that each intermediate item exist; for
12
- # example, if there is no `/foo/` item, breadcrumbs for a `/foo/bar/` item
13
- # will contain a `nil` element.
14
- #
15
- # @return [Array] The breadcrumbs, starting with the root item and ending
16
- # with the item itself
17
- def breadcrumbs_trail
18
- breadcrumbs_for_identifier(@item.identifier)
19
- end
20
-
21
- def item_with_identifier(identifier)
22
- @identifier_cache ||= {}
23
- @identifier_cache[identifier] ||= begin
24
- @items.find { |i| i.identifier == identifier }
25
- end
26
- end
27
-
28
- def breadcrumbs_for_identifier(identifier)
29
- @breadcrumbs_cache ||= {}
30
- @breadcrumbs_cache[identifier] ||= begin
31
- head = (identifier == '/' ? [] : breadcrumbs_for_identifier(identifier.sub(/[^\/]+\/$/, '')) )
32
- tail = [ item_with_identifier(identifier) ]
33
-
34
- head + tail
35
- end
36
- end
37
-
38
- end
39
-
40
- end
@@ -1,138 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Provides functionality for “capturing” content in one place and reusing
6
- # this content elsewhere.
7
- #
8
- # For example, suppose you want the sidebar of your site to contain a short
9
- # summary of the item. You could put the summary in the meta file, but
10
- # that’s not possible when the summary contains eRuby. You could also put
11
- # the sidebar inside the actual item, but that’s not very pretty. Instead,
12
- # you write the summary on the item itself, but capture it, and print it in
13
- # the sidebar layout.
14
- #
15
- # This helper has been tested with ERB and Haml. Other filters may not work
16
- # correctly.
17
- #
18
- # @example Capturing content for a summary
19
- #
20
- # <% content_for :summary do %>
21
- # <p>On this item, nanoc is introduced, blah blah.</p>
22
- # <% end %>
23
- #
24
- # @example Showing captured content in a sidebar
25
- #
26
- # <div id="sidebar">
27
- # <h3>Summary</h3>
28
- # <%= content_for(@item, :summary) || '(no summary)' %>
29
- # </div>
30
- #
31
- # @example Showing captured content in a sidebar the old, deprecated way (do not use or I will become very angry)
32
- #
33
- # <div id="sidebar">
34
- # <h3>Summary</h3>
35
- # <%= @item[:content_for_summary] || '(no summary)' %>
36
- # </div>
37
- module Capturing
38
-
39
- # @api private
40
- class CapturesStore
41
-
42
- require 'singleton'
43
- include Singleton
44
-
45
- def initialize
46
- @store = {}
47
- end
48
-
49
- def []=(item, name, content)
50
- @store[item.identifier] ||= {}
51
- @store[item.identifier][name] = content
52
- end
53
-
54
- def [](item, name)
55
- @store[item.identifier] ||= {}
56
- @store[item.identifier][name]
57
- end
58
-
59
- end
60
-
61
- # @overload content_for(name, &block)
62
- #
63
- # Captures the content inside the block and stores it so that it can be
64
- # referenced later on. The same method, {#content_for}, is used for
65
- # getting the captured content as well as setting it. When capturing,
66
- # the content of the block itself will not be outputted.
67
- #
68
- # For backwards compatibility, it is also possible to fetch the captured
69
- # content by getting the contents of the attribute named `content_for_`
70
- # followed by the given name. This way of accessing captures is
71
- # deprecated.
72
- #
73
- # @param [Symbol, String] name The base name of the attribute into which
74
- # the content should be stored
75
- #
76
- # @return [void]
77
- #
78
- # @overload content_for(item, name)
79
- #
80
- # Fetches the capture with the given name from the given item and
81
- # returns it.
82
- #
83
- # @param [Nanoc3::Item] item The item for which to get the capture
84
- #
85
- # @param [Symbol, String] name The name of the capture to fetch
86
- #
87
- # @return [String] The stored captured content
88
- def content_for(*args, &block)
89
- if block_given? # Set content
90
- # Get args
91
- if args.size != 1
92
- raise ArgumentError, "expected 1 argument (the name " +
93
- "of the capture) but got #{args.size} instead"
94
- end
95
- name = args[0]
96
-
97
- # Capture and store
98
- content = capture(&block)
99
- CapturesStore.instance[@item, name.to_sym] = content
100
- else # Get content
101
- # Get args
102
- if args.size != 2
103
- raise ArgumentError, "expected 2 arguments (the item " +
104
- "and the name of the capture) but got #{args.size} instead"
105
- end
106
- item = args[0]
107
- name = args[1]
108
-
109
- # Get content
110
- CapturesStore.instance[item, name.to_sym]
111
- end
112
- end
113
-
114
- # Evaluates the given block and returns its contents. The contents of the
115
- # block is not outputted.
116
- #
117
- # @return [String] The captured result
118
- def capture(&block)
119
- # Get erbout so far
120
- erbout = eval('_erbout', block.binding)
121
- erbout_length = erbout.length
122
-
123
- # Execute block
124
- block.call
125
-
126
- # Get new piece of erbout
127
- erbout_addition = erbout[erbout_length..-1]
128
-
129
- # Remove addition
130
- erbout[erbout_length..-1] = ''
131
-
132
- # Done
133
- erbout_addition
134
- end
135
-
136
- end
137
-
138
- end
@@ -1,50 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Provides functionality for filtering parts of an item or a layout.
6
- module Filtering
7
-
8
- require 'nanoc3/helpers/capturing'
9
- include Nanoc3::Helpers::Capturing
10
-
11
- # Filters the content in the given block and outputs it. This function
12
- # does not return anything; instead, the filtered contents is directly
13
- # appended to the output buffer (`_erbout`).
14
- #
15
- # This function has been tested with ERB and Haml. Other filters may not
16
- # work correctly.
17
- #
18
- # @example Running a filter on a part of an item or layout
19
- #
20
- # <p>Lorem ipsum dolor sit amet...</p>
21
- # <% filter :rubypants do %>
22
- # <p>Consectetur adipisicing elit...</p>
23
- # <% end %>
24
- #
25
- # @param [Symbol] filter_name The name of the filter to run on the
26
- # contents of the block
27
- #
28
- # @param [Hash] argument Arguments to pass to the filter
29
- #
30
- # @return [void]
31
- def filter(filter_name, arguments={}, &block)
32
- # Capture block
33
- data = capture(&block)
34
-
35
- # Find filter
36
- klass = Nanoc3::Filter.named(filter_name)
37
- raise Nanoc3::Errors::UnknownFilter.new(filter_name) if klass.nil?
38
- filter = klass.new(@item_rep.assigns)
39
-
40
- # Filter captured data
41
- filtered_data = filter.run(data, arguments)
42
-
43
- # Append filtered data to buffer
44
- buffer = eval('_erbout', block.binding)
45
- buffer << filtered_data
46
- end
47
-
48
- end
49
-
50
- end
@@ -1,55 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Contains functionality for HTML-escaping strings.
6
- module HTMLEscape
7
-
8
- require 'nanoc3/helpers/capturing'
9
- include Nanoc3::Helpers::Capturing
10
-
11
- # Returns the HTML-escaped representation of the given string or the given
12
- # block. Only `&`, `<`, `>` and `"` are escaped. When given a block, the
13
- # contents of the block will be escaped and appended to the output buffer,
14
- # `_erbout`.
15
- #
16
- # @example Escaping a string
17
- #
18
- # h('<br>')
19
- # # => '&lt;br&gt;'
20
- #
21
- # @example Escaping with a block
22
- #
23
- # <% h do %>
24
- # <h1>Hello <em>world</em>!</h1>
25
- # <% end %>
26
- # # The buffer will now contain “&lt;h1&gt;Hello &lt;em&gt;world&lt;/em&gt;!&lt;/h1&gt;”
27
- #
28
- # @param [String] string The string to escape
29
- #
30
- # @return [String] The escaped string
31
- def html_escape(string=nil, &block)
32
- if block_given?
33
- # Capture and escape block
34
- data = capture(&block)
35
- escaped_data = html_escape(data)
36
-
37
- # Append filtered data to buffer
38
- buffer = eval('_erbout', block.binding)
39
- buffer << escaped_data
40
- elsif string
41
- string.gsub('&', '&amp;').
42
- gsub('<', '&lt;').
43
- gsub('>', '&gt;').
44
- gsub('"', '&quot;')
45
- else
46
- raise RuntimeError, "The #html_escape or #h function needs either a " \
47
- "string or a block to HTML-escape, but neither a string nor a block was given"
48
- end
49
- end
50
-
51
- alias h html_escape
52
-
53
- end
54
-
55
- end
@@ -1,151 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Contains functions for linking to items and item representations.
6
- module LinkTo
7
-
8
- require 'nanoc3/helpers/html_escape'
9
- include Nanoc3::Helpers::HTMLEscape
10
-
11
- # Creates a HTML link to the given path or item representation, and with
12
- # the given text. All attributes of the `a` element, including the `href`
13
- # attribute, will be HTML-escaped; the contents of the `a` element, which
14
- # can contain markup, will not be HTML-escaped. The HTML-escaping is done
15
- # using {Nanoc3::Helpers::HTMLEscape#html_escape}.
16
- #
17
- # @param [String] text The visible link text
18
- #
19
- # @param [String, Nanoc3::Item, Nanoc3::ItemRep] target The path/URL,
20
- # item or item representation that should be linked to
21
- #
22
- # @param [Hash] attributes A hash containing HTML attributes (e.g.
23
- # `rel`, `title`, …) that will be added to the link.
24
- #
25
- # @return [String] The link text
26
- #
27
- # @example Linking to a path
28
- #
29
- # link_to('Blog', '/blog/')
30
- # # => '<a href="/blog/">Blog</a>'
31
- #
32
- # @example Linking to an item
33
- #
34
- # about = @items.find { |i| i.identifier == '/about/' }
35
- # link_to('About Me', about)
36
- # # => '<a href="/about.html">About Me</a>'
37
- #
38
- # @example Linking to an item representation
39
- #
40
- # about = @items.find { |i| i.identifier == '/about/' }
41
- # link_to('My vCard', about.rep(:vcard))
42
- # # => '<a href="/about.vcf">My vCard</a>'
43
- #
44
- # @example Linking with custom attributes
45
- #
46
- # link_to('Blog', '/blog/', :title => 'My super cool blog')
47
- # # => '<a title="My super cool blog" href="/blog/">Blog</a>'
48
- def link_to(text, target, attributes={})
49
- # Find path
50
- if target.is_a?(String)
51
- path = target
52
- else
53
- path = target.path
54
- raise RuntimeError, "Cannot create a link to #{target.inspect} because this target is not outputted (its routing rule returns nil)" if path.nil?
55
- end
56
-
57
- # Join attributes
58
- attributes = attributes.inject('') do |memo, (key, value)|
59
- memo + key.to_s + '="' + h(value) + '" '
60
- end
61
-
62
- # Create link
63
- "<a #{attributes}href=\"#{h path}\">#{text}</a>"
64
- end
65
-
66
- # Creates a HTML link using {#link_to}, except when the linked item is
67
- # the current one. In this case, a span element with class “active” and
68
- # with the given text will be returned. The HTML-escaping rules for
69
- # {#link_to} apply here as well.
70
- #
71
- # @param [String] text The visible link text
72
- #
73
- # @param [String, Nanoc3::Item, Nanoc3::ItemRep] target The path/URL,
74
- # item or item representation that should be linked to
75
- #
76
- # @param [Hash] attributes A hash containing HTML attributes (e.g.
77
- # `rel`, `title`, …) that will be added to the link.
78
- #
79
- # @return [String] The link text
80
- #
81
- # @example Linking to a different page
82
- #
83
- # link_to_unless_current('Blog', '/blog/')
84
- # # => '<a href="/blog/">Blog</a>'
85
- #
86
- # @example Linking to the same page
87
- #
88
- # link_to_unless_current('This Item', @item)
89
- # # => '<span class="active" title="You\'re here.">This Item</span>'
90
- def link_to_unless_current(text, target, attributes={})
91
- # Find path
92
- path = target.is_a?(String) ? target : target.path
93
-
94
- if @item_rep && @item_rep.path == path
95
- # Create message
96
- "<span class=\"active\" title=\"You're here.\">#{text}</span>"
97
- else
98
- link_to(text, target, attributes)
99
- end
100
- end
101
-
102
- # Returns the relative path from the current item to the given path or
103
- # item representation. The returned path will not be HTML-escaped.
104
- #
105
- # @param [String, Nanoc3::Item, Nanoc3::ItemRep] target The path/URL,
106
- # item or item representation to which the relative path should be
107
- # generated
108
- #
109
- # @return [String] The relative path to the target
110
- #
111
- # @example
112
- #
113
- # # if the current item's path is /foo/bar/
114
- # relative_path_to('/foo/qux/')
115
- # # => '../qux/'
116
- def relative_path_to(target)
117
- require 'pathname'
118
-
119
- # Find path
120
- if target.is_a?(String)
121
- path = target
122
- else
123
- path = target.path
124
- raise RuntimeError, "Cannot get the relative path to #{target.inspect} because this target is not outputted (its routing rule returns nil)" if path.nil?
125
- end
126
-
127
- # Get source and destination paths
128
- dst_path = Pathname.new(path)
129
- raise RuntimeError, "Cannot get the relative path to #{path} because the current item representation, #{@item_rep.inspect}, is not outputted (its routing rule returns nil)" if @item_rep.path.nil?
130
- src_path = Pathname.new(@item_rep.path)
131
-
132
- # Calculate the relative path (method depends on whether destination is
133
- # a directory or not).
134
- if src_path.to_s[-1,1] != '/'
135
- relative_path = dst_path.relative_path_from(src_path.dirname).to_s
136
- else
137
- relative_path = dst_path.relative_path_from(src_path).to_s
138
- end
139
-
140
- # Add trailing slash if necessary
141
- if dst_path.to_s[-1,1] == '/'
142
- relative_path << '/'
143
- end
144
-
145
- # Done
146
- relative_path
147
- end
148
-
149
- end
150
-
151
- end
@@ -1,140 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::Helpers
4
-
5
- # Provides functionality for rendering layouts as partials.
6
- module Rendering
7
-
8
- include Nanoc3::Helpers::Capturing
9
-
10
- # Renders the given layout. The given layout will be run through the first
11
- # matching layout rule.
12
- #
13
- # When this method is invoked _without_ a block, the return value will be
14
- # the rendered layout (a string) and `_erbout` will not be modified.
15
- #
16
- # When this method is invoked _with_ a block, an empty string will be
17
- # returned and the rendered content will be appended to `_erbout`. In this
18
- # case, the content of the block will be captured (using the
19
- # {Nanoc3::Helpers::Capturing} helper) and this content will be made
20
- # available with `yield`. In other words, a `yield` inside the partial
21
- # will output the content of the block passed to the method.
22
- #
23
- # (For the curious: the reason why {#render} with a block has this
24
- # behaviour of returning an empty string and modifying `_erbout` is
25
- # because ERB does not support combining the `<%= ... %>` form with a
26
- # method call that takes a block.)
27
- #
28
- # The assigns (`@item`, `@config`, …) will be available in the partial. It
29
- # is also possible to pass custom assigns to the method; these assigns
30
- # will be made available as instance variables inside the partial.
31
- #
32
- # @param [String] identifier The identifier of the layout that should be
33
- # rendered
34
- #
35
- # @param [Hash] other_assigns A hash containing extra assigns that will be
36
- # made available as instance variables in the partial
37
- #
38
- # @example Rendering a head and a foot partial around some text
39
- #
40
- # <%= render 'head' %> - MIDDLE - <%= render 'foot' %>
41
- # # => "HEAD - MIDDLE - FOOT"
42
- #
43
- # @example Rendering a head partial with a custom title
44
- #
45
- # # The 'head' layout
46
- # <h1><%= @title %></h1>
47
- #
48
- # # The item/layout where the partial is rendered
49
- # <%= render 'head', :title => 'Foo' %>
50
- # # => "<h1>Foo</h1>"
51
- #
52
- # @example Yielding inside a partial
53
- #
54
- # # The 'box' partial
55
- # <div class="box">
56
- # <%= yield %>
57
- # </div>
58
- #
59
- # # The item/layout where the partial is rendered
60
- # <% render 'box' do %>
61
- # I'm boxy! Luvz!
62
- # <% end %>
63
- #
64
- # # Result
65
- # <div class="box">
66
- # I'm boxy! Luvz!
67
- # </div>
68
- #
69
- # @raise [Nanoc3::Errors::UnknownLayout] if the given layout does not
70
- # exist
71
- #
72
- # @raise [Nanoc3::Errors::CannotDetermineFilter] if there is no layout
73
- # rule for the given layout
74
- #
75
- # @raise [Nanoc3::Errors::UnknownFilter] if the layout rule for the given
76
- # layout specifies an unknown filter
77
- #
78
- # @return [String, nil] The rendered partial, or nil if this method was
79
- # invoked with a block
80
- def render(identifier, other_assigns={}, &block)
81
- # Find layout
82
- layout = @site.layouts.find { |l| l.identifier == identifier.cleaned_identifier }
83
- raise Nanoc3::Errors::UnknownLayout.new(identifier.cleaned_identifier) if layout.nil?
84
-
85
- # Visit
86
- Nanoc3::NotificationCenter.post(:visit_started, layout)
87
- Nanoc3::NotificationCenter.post(:visit_ended, layout)
88
-
89
- # Capture content, if any
90
- captured_content = block_given? ? capture(&block) : nil
91
-
92
- # Get assigns
93
- assigns = {
94
- :content => captured_content,
95
- :item => @item,
96
- :item_rep => @item_rep,
97
- :items => @items,
98
- :layout => layout,
99
- :layouts => @layouts,
100
- :config => @config,
101
- :site => @site
102
- }.merge(other_assigns)
103
-
104
- # Get filter name
105
- filter_name, filter_args = @site.compiler.rules_collection.filter_for_layout(layout)
106
- raise Nanoc3::Errors::CannotDetermineFilter.new(layout.identifier) if filter_name.nil?
107
-
108
- # Get filter class
109
- filter_class = Nanoc3::Filter.named(filter_name)
110
- raise Nanoc3::Errors::UnknownFilter.new(filter_name) if filter_class.nil?
111
-
112
- # Create filter
113
- filter = filter_class.new(assigns)
114
-
115
- begin
116
- # Notify start
117
- Nanoc3::NotificationCenter.post(:processing_started, layout)
118
-
119
- # Layout
120
- result = filter.run(layout.raw_content, filter_args)
121
-
122
- # Append to erbout if we have a block
123
- if block_given?
124
- # Append result and return nothing
125
- erbout = eval('_erbout', block.binding)
126
- erbout << result
127
- ''
128
- else
129
- # Return result
130
- result
131
- end
132
- ensure
133
- # Notify end
134
- Nanoc3::NotificationCenter.post(:processing_ended, layout)
135
- end
136
- end
137
-
138
- end
139
-
140
- end