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,299 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::DataSources
4
-
5
- # Provides functionality common across all filesystem data sources.
6
- module Filesystem
7
-
8
- # The VCS that will be called when adding, deleting and moving files. If
9
- # no VCS has been set, or if the VCS has been set to `nil`, a dummy VCS
10
- # will be returned.
11
- #
12
- # @return [Nanoc3::Extra::VCS, nil] The VCS that will be used.
13
- def vcs
14
- @vcs ||= Nanoc3::Extra::VCSes::Dummy.new
15
- end
16
- attr_writer :vcs
17
-
18
- # See {Nanoc3::DataSource#up}.
19
- def up
20
- end
21
-
22
- # See {Nanoc3::DataSource#down}.
23
- def down
24
- end
25
-
26
- # See {Nanoc3::DataSource#setup}.
27
- def setup
28
- # Create directories
29
- %w( content layouts ).each do |dir|
30
- FileUtils.mkdir_p(dir)
31
- vcs.add(dir)
32
- end
33
- end
34
-
35
- # See {Nanoc3::DataSource#items}.
36
- def items
37
- load_objects('content', 'item', Nanoc3::Item)
38
- end
39
-
40
- # See {Nanoc3::DataSource#layouts}.
41
- def layouts
42
- load_objects('layouts', 'layout', Nanoc3::Layout)
43
- end
44
-
45
- # See {Nanoc3::DataSource#create_item}.
46
- def create_item(content, attributes, identifier, params={})
47
- create_object('content', content, attributes, identifier, params)
48
- end
49
-
50
- # See {Nanoc3::DataSource#create_layout}.
51
- def create_layout(content, attributes, identifier, params={})
52
- create_object('layouts', content, attributes, identifier, params)
53
- end
54
-
55
- private
56
-
57
- # Creates a new object (item or layout) on disk in dir_name according to
58
- # the given identifier. The file will have its attributes taken from the
59
- # attributes hash argument and its content from the content argument.
60
- def create_object(dir_name, content, attributes, identifier, params={})
61
- raise NotImplementedError.new(
62
- "#{self.class} does not implement ##{name}"
63
- )
64
- end
65
-
66
- # Creates instances of klass corresponding to the files in dir_name. The
67
- # kind attribute indicates the kind of object that is being loaded and is
68
- # used solely for debugging purposes.
69
- #
70
- # This particular implementation loads objects from a filesystem-based
71
- # data source where content and attributes can be spread over two separate
72
- # files. The content and meta-file are optional (but at least one of them
73
- # needs to be present, obviously) and the content file can start with a
74
- # metadata section.
75
- #
76
- # @see Nanoc3::DataSources::Filesystem#load_objects
77
- def load_objects(dir_name, kind, klass)
78
- all_split_files_in(dir_name).map do |base_filename, (meta_ext, content_ext)|
79
- # Get filenames
80
- meta_filename = filename_for(base_filename, meta_ext)
81
- content_filename = filename_for(base_filename, content_ext)
82
-
83
- # Read content and metadata
84
- is_binary = !!(content_filename && !@site.config[:text_extensions].include?(File.extname(content_filename)[1..-1]))
85
- if is_binary && klass == Nanoc3::Item
86
- meta = (meta_filename && YAML.load_file(meta_filename)) || {}
87
- content_or_filename = content_filename
88
- else
89
- meta, content_or_filename = parse(content_filename, meta_filename, kind)
90
- end
91
-
92
- # Get attributes
93
- attributes = {
94
- :filename => content_filename,
95
- :content_filename => content_filename,
96
- :meta_filename => meta_filename,
97
- :extension => content_filename ? ext_of(content_filename)[1..-1] : nil,
98
- # WARNING :file is deprecated; please create a File object manually
99
- # using the :content_filename or :meta_filename attributes.
100
- # TODO [in nanoc 4.0] remove me
101
- :file => content_filename ? Nanoc3::Extra::FileProxy.new(content_filename) : nil
102
- }.merge(meta)
103
-
104
- # Get identifier
105
- if meta_filename
106
- identifier = identifier_for_filename(meta_filename[(dir_name.length+1)..-1])
107
- elsif content_filename
108
- identifier = identifier_for_filename(content_filename[(dir_name.length+1)..-1])
109
- else
110
- raise RuntimeError, "meta_filename and content_filename are both nil"
111
- end
112
-
113
- # Get modification times
114
- meta_mtime = meta_filename ? File.stat(meta_filename).mtime : nil
115
- content_mtime = content_filename ? File.stat(content_filename).mtime : nil
116
- if meta_mtime && content_mtime
117
- mtime = meta_mtime > content_mtime ? meta_mtime : content_mtime
118
- elsif meta_mtime
119
- mtime = meta_mtime
120
- elsif content_mtime
121
- mtime = content_mtime
122
- else
123
- raise RuntimeError, "meta_mtime and content_mtime are both nil"
124
- end
125
-
126
- # Create layout object
127
- klass.new(
128
- content_or_filename, attributes, identifier,
129
- :binary => is_binary, :mtime => mtime
130
- )
131
- end
132
- end
133
-
134
- # Finds all items/layouts/... in the given base directory. Returns a hash
135
- # in which the keys are the file's dirname + basenames, and the values a
136
- # pair consisting of the metafile extension and the content file
137
- # extension. The meta file extension or the content file extension can be
138
- # nil, but not both. Backup files are ignored. For example:
139
- #
140
- # {
141
- # 'content/foo' => [ 'yaml', 'html' ],
142
- # 'content/bar' => [ 'yaml', nil ],
143
- # 'content/qux' => [ nil, 'html' ]
144
- # }
145
- def all_split_files_in(dir_name)
146
- # Get all good file names
147
- filenames = Dir[dir_name + '/**/*'].select { |i| File.file?(i) }
148
- filenames.reject! { |fn| fn =~ /(~|\.orig|\.rej|\.bak)$/ }
149
-
150
- # Group by identifier
151
- grouped_filenames = filenames.group_by { |fn| basename_of(fn) }
152
-
153
- # Convert values into metafile/content file extension tuple
154
- grouped_filenames.each_pair do |key, filenames|
155
- # Divide
156
- meta_filenames = filenames.select { |fn| ext_of(fn) == '.yaml' }
157
- content_filenames = filenames.select { |fn| ext_of(fn) != '.yaml' }
158
-
159
- # Check number of files per type
160
- if ![ 0, 1 ].include?(meta_filenames.size)
161
- raise RuntimeError, "Found #{meta_filenames.size} meta files for #{key}; expected 0 or 1"
162
- end
163
- if ![ 0, 1 ].include?(content_filenames.size)
164
- raise RuntimeError, "Found #{content_filenames.size} content files for #{key}; expected 0 or 1"
165
- end
166
-
167
- # Reorder elements and convert to extnames
168
- filenames[0] = meta_filenames[0] ? 'yaml' : nil
169
- filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '': nil
170
- end
171
-
172
- # Done
173
- grouped_filenames
174
- end
175
-
176
- # Returns the filename for the given base filename and the extension.
177
- #
178
- # If the extension is nil, this function should return nil as well.
179
- #
180
- # A simple implementation would simply concatenate the base filename, a
181
- # period and an extension (which is what the
182
- # {Nanoc3::DataSources::FilesystemCompact} data source does), but other
183
- # data sources may prefer to implement this differently (for example,
184
- # {Nanoc3::DataSources::FilesystemVerbose} doubles the last part of the
185
- # basename before concatenating it with a period and the extension).
186
- def filename_for(base_filename, ext)
187
- raise NotImplementedError.new(
188
- "#{self.class} does not implement #filename_for"
189
- )
190
- end
191
-
192
- # Returns the identifier that corresponds with the given filename, which
193
- # can be the content filename or the meta filename.
194
- def identifier_for_filename(filename)
195
- raise NotImplementedError.new(
196
- "#{self.class} does not implement #identifier_for_filename"
197
- )
198
- end
199
-
200
- # Returns the base name of filename, i.e. filename with the first or all
201
- # extensions stripped off. By default, all extensions are stripped off,
202
- # but when allow_periods_in_identifiers is set to true in the site
203
- # configuration, only the last extension will be stripped .
204
- def basename_of(filename)
205
- filename.sub(extension_regex, '')
206
- end
207
-
208
- # Returns the extension(s) of filename. Supports multiple extensions.
209
- # Includes the leading period.
210
- def ext_of(filename)
211
- filename =~ extension_regex ? $1 : ''
212
- end
213
-
214
- # Returns a regex that is used for determining the extension of a file
215
- # name. The first match group will be the entire extension, including the
216
- # leading period.
217
- def extension_regex
218
- if @config && @config[:allow_periods_in_identifiers]
219
- /(\.[^\/\.]+$)/
220
- else
221
- /(\.[^\/]+$)/
222
- end
223
- end
224
-
225
- # Parses the file named `filename` and returns an array with its first
226
- # element a hash with the file's metadata, and with its second element the
227
- # file content itself.
228
- def parse(content_filename, meta_filename, kind)
229
- # Read content and metadata from separate files
230
- if meta_filename
231
- content = content_filename ? read(content_filename) : ''
232
- meta = YAML.load(read(meta_filename)) || {}
233
-
234
- return [ meta, content ]
235
- end
236
-
237
- # Read data
238
- data = read(content_filename)
239
-
240
- # Check presence of metadata section
241
- if data !~ /\A-{3,5}\s*$/
242
- return [ {}, data ]
243
- end
244
-
245
- # Split data
246
- pieces = data.split(/^(-{5}|-{3})\s*$/)
247
- if pieces.size < 4
248
- raise RuntimeError.new(
249
- "The file '#{content_filename}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format."
250
- )
251
- end
252
-
253
- # Parse
254
- meta = YAML.load(pieces[2]) || {}
255
- content = pieces[4..-1].join.strip
256
-
257
- # Done
258
- [ meta, content ]
259
- end
260
-
261
- # Reads the content of the file with the given name and returns a string
262
- # in UTF-8 encoding. The original encoding of the string is derived from
263
- # the default external encoding, but this can be overridden by the
264
- # “encoding” configuration attribute in the data source configuration.
265
- def read(filename)
266
- # Read
267
- begin
268
- data = File.read(filename)
269
- rescue => e
270
- raise RuntimeError.new("Could not read #{filename}: #{e.inspect}")
271
- end
272
-
273
- # Fix
274
- if data.respond_to?(:encode!)
275
- if @config && @config[:encoding]
276
- original_encoding = Encoding.find(@config[:encoding])
277
- data.force_encoding(@config[:encoding])
278
- else
279
- original_encoding = data.encoding
280
- end
281
-
282
- data.encode!('UTF-8') rescue raise_encoding_error(filename, original_encoding)
283
- raise_encoding_error(filename, original_encoding) if !data.valid_encoding?
284
- end
285
-
286
- # Remove UTF-8 BOM (ugly)
287
- data.gsub!("\xEF\xBB\xBF", '')
288
-
289
- data
290
- end
291
-
292
- # Raises an invalid encoding error for the given filename and encoding.
293
- def raise_encoding_error(filename, encoding)
294
- raise RuntimeError.new("Could not read #{filename} because the file is not valid #{encoding}.")
295
- end
296
-
297
- end
298
-
299
- end
@@ -1,116 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::DataSources
4
-
5
- # The filesystem_unified data source stores its items and layouts in nested
6
- # directories. Items and layouts are represented by one or two files; if it
7
- # is represented using one file, the metadata can be contained in this file.
8
- # The root directory for items is the `content` directory; for layouts, this
9
- # is the `layouts` directory.
10
- #
11
- # The metadata for items and layouts can be stored in a separate file with
12
- # the same base name but with the `.yaml` extension. If such a file is
13
- # found, metadata is read from that file. Alternatively, the content file
14
- # itself can start with a metadata section: it can be stored at the top of
15
- # the file, between `---` (three dashes) separators. For example:
16
- #
17
- # ---
18
- # title: "Moo!"
19
- # ---
20
- # h1. Hello!
21
- #
22
- # The metadata section can be omitted. If the file does not start with
23
- # three or five dashes, the entire file will be considered as content.
24
- #
25
- # The identifier of items and layouts is determined as follows. A file with
26
- # an `index.*` filename, such as `index.txt`, will have the filesystem path
27
- # with the `index.*` part stripped as a identifier. For example:
28
- #
29
- # foo/bar/index.html → /foo/bar/
30
- #
31
- # In other cases, the identifier is calculated by stripping the extension.
32
- # If the `allow_periods_in_identifiers` attribute in the configuration is
33
- # true, only the last extension will be stripped if the file has multiple
34
- # extensions; if it is false or unset, all extensions will be stripped.
35
- # For example:
36
- #
37
- # (`allow_periods_in_identifiers` set to true)
38
- # foo.entry.html → /foo.entry/
39
- #
40
- # (`allow_periods_in_identifiers` set to false)
41
- # foo.html.erb → /foo/
42
- #
43
- # Note that each item must have an unique identifier. nanoc will display an
44
- # error if two items with the same identifier are found.
45
- #
46
- # Some more examples:
47
- #
48
- # content/index.html → /
49
- # content/foo.html → /foo/
50
- # content/foo/index.html → /foo/
51
- # content/foo/bar.html → /foo/bar/
52
- # content/foo/bar.baz.html → /foo/bar/ OR /foo/bar.baz/
53
- # content/foo/bar/index.html → /foo/bar/
54
- # content/foo.bar/index.html → /foo.bar/
55
- #
56
- # The file extension does not determine the filters to run on items; the
57
- # Rules file is used to specify processing instructors for each item.
58
- class FilesystemUnified < Nanoc3::DataSource
59
-
60
- include Nanoc3::DataSources::Filesystem
61
-
62
- private
63
-
64
- # See {Nanoc3::DataSources::Filesystem#create_object}.
65
- def create_object(dir_name, content, attributes, identifier, params={})
66
- # Check for periods
67
- if (@config.nil? || !@config[:allow_periods_in_identifiers]) && identifier.include?('.')
68
- raise RuntimeError,
69
- "Attempted to create an object in #{dir_name} with identifier #{identifier} containing a period, but allow_periods_in_identifiers is not enabled in the site configuration. (Enabling allow_periods_in_identifiers may cause the site to break, though.)"
70
- end
71
-
72
- # Determine path
73
- ext = params[:extension] || '.html'
74
- path = dir_name + (identifier == '/' ? '/index.html' : identifier[0..-2] + ext)
75
- parent_path = File.dirname(path)
76
-
77
- # Notify
78
- Nanoc3::NotificationCenter.post(:file_created, path)
79
-
80
- # Write item
81
- FileUtils.mkdir_p(parent_path)
82
- File.open(path, 'w') do |io|
83
- meta = attributes.stringify_keys
84
- unless meta == {}
85
- io.write(YAML.dump(meta).strip + "\n")
86
- io.write("---\n\n")
87
- end
88
- io.write(content)
89
- end
90
- end
91
-
92
- # See {Nanoc3::DataSources::Filesystem#filename_for}.
93
- def filename_for(base_filename, ext)
94
- if ext.nil?
95
- nil
96
- elsif ext.empty?
97
- base_filename
98
- else
99
- base_filename + '.' + ext
100
- end
101
- end
102
-
103
- # Returns the identifier derived from the given filename, first stripping
104
- # the given directory name off the filename.
105
- def identifier_for_filename(filename)
106
- if filename =~ /(^|\/)index\.[^\/]+$/
107
- regex = ((@config && @config[:allow_periods_in_identifiers]) ? /\/?index\.[^\/\.]+$/ : /\/?index\.[^\/]+$/)
108
- else
109
- regex = ((@config && @config[:allow_periods_in_identifiers]) ? /\.[^\/\.]+$/ : /\.[^\/]+$/)
110
- end
111
- filename.sub(regex, '').cleaned_identifier
112
- end
113
-
114
- end
115
-
116
- end
@@ -1,86 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Nanoc3::DataSources
4
-
5
- # The filesystem_verbose data source is the old data source for a new nanoc
6
- # site. It stores all data as files on the hard disk.
7
- #
8
- # None of the methods are documented in this file. See {Nanoc3::DataSource}
9
- # for documentation on the overridden methods instead.
10
- #
11
- # The filesystem_verbose data source stores its items and layouts in nested
12
- # directories. Each directory represents a single item or layout. The root
13
- # directory for items is the `content` directory; for layouts it is the
14
- # `layouts` directory.
15
- #
16
- # Every directory has a content file and a meta file. The content file
17
- # contains the actual item content, while the meta file contains the item’s
18
- # or the layout’s metadata, formatted as YAML.
19
- #
20
- # Both content files and meta files are named after its parent directory
21
- # (i.e. item). For example, an item/layout named `foo` will have a directory
22
- # named `foo`, with e.g. a `foo.markdown` content file and a `foo.yaml` meta
23
- # file.
24
- #
25
- # Content file extensions are not used for determining the filter that
26
- # should be run; the meta file defines the list of filters. The meta file
27
- # extension must always be `.yaml`, though.
28
- #
29
- # For backwards compatibility, content files can also have the `index`
30
- # basename. Similarly, meta files can have the `meta` basename. For example,
31
- # a parent directory named `foo` can have an `index.txt` content file and a
32
- # `meta.yaml` meta file.
33
- #
34
- # The identifier is calculated by stripping the extension; if there is more
35
- # than one extension, only the last extension is stripped and the previous
36
- # extensions will be part of the identifier.
37
- class FilesystemVerbose < Nanoc3::DataSource
38
-
39
- include Nanoc3::DataSources::Filesystem
40
-
41
- private
42
-
43
- # See {Nanoc3::DataSources::Filesystem#create_object}.
44
- def create_object(dir_name, content, attributes, identifier, params={})
45
- # Determine base path
46
- last_component = identifier.split('/')[-1] || dir_name
47
- base_path = dir_name + identifier + last_component
48
-
49
- # Get filenames
50
- ext = params[:extension] || '.html'
51
- dir_path = dir_name + identifier
52
- meta_filename = dir_name + identifier + last_component + '.yaml'
53
- content_filename = dir_name + identifier + last_component + ext
54
-
55
- # Notify
56
- Nanoc3::NotificationCenter.post(:file_created, meta_filename)
57
- Nanoc3::NotificationCenter.post(:file_created, content_filename)
58
-
59
- # Create files
60
- FileUtils.mkdir_p(dir_path)
61
- File.open(meta_filename, 'w') { |io| io.write(YAML.dump(attributes.stringify_keys)) }
62
- File.open(content_filename, 'w') { |io| io.write(content) }
63
- end
64
-
65
- # See {Nanoc3::DataSources::Filesystem#filename_for}.
66
- def filename_for(base_filename, ext)
67
- return nil if ext.nil?
68
-
69
- last_component = base_filename[%r{[^/]+$}]
70
- possibilities = [
71
- base_filename + (ext.empty? ? '' : '.' + ext), # foo/bar.html
72
- base_filename + '/' + last_component + (ext.empty? ? '' : '.' + ext), # foo/bar/bar.html
73
- base_filename + '/' + 'index' + (ext.empty? ? '' : '.' + ext) # foo/bar/index.html
74
- ]
75
-
76
- possibilities.find { |p| File.file?(p) }
77
- end
78
-
79
- # See {Nanoc3::DataSources::Filesystem#identifier_for_filename}.
80
- def identifier_for_filename(filename)
81
- filename.sub(/[^\/]+\.yaml$/, '')
82
- end
83
-
84
- end
85
-
86
- end