nanoc3 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 (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