middleman-core 3.1.6 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/features/asciidoc.feature +155 -0
  3. data/features/helpers_page_classes.feature +16 -1
  4. data/features/markdown_kramdown.feature +3 -1
  5. data/features/markdown_redcarpet.feature +2 -1
  6. data/features/queryable.feature +5 -1
  7. data/features/step_definitions/queryable_steps.rb +13 -1
  8. data/fixtures/asciidoc-app/config.rb +0 -0
  9. data/fixtures/asciidoc-app/source/_include.adoc +1 -0
  10. data/fixtures/asciidoc-app/source/code.adoc +3 -0
  11. data/fixtures/asciidoc-app/source/custom-attribute.adoc +3 -0
  12. data/fixtures/asciidoc-app/source/gallery.adoc +1 -0
  13. data/fixtures/asciidoc-app/source/hello-no-layout.adoc +2 -0
  14. data/fixtures/asciidoc-app/source/hello-with-front-matter.adoc +5 -0
  15. data/fixtures/asciidoc-app/source/hello-with-layout.adoc +2 -0
  16. data/fixtures/asciidoc-app/source/hello-with-title.adoc +4 -0
  17. data/fixtures/asciidoc-app/source/hello.adoc +4 -0
  18. data/fixtures/asciidoc-app/source/images/tiger.gif +0 -0
  19. data/fixtures/asciidoc-app/source/layouts/default.erb +10 -0
  20. data/fixtures/asciidoc-app/source/master.adoc +3 -0
  21. data/fixtures/markdown-app/source/mailto.html.markdown +1 -0
  22. data/fixtures/padrino-helpers-app/config.rb +7 -0
  23. data/fixtures/page-classes-app/source/1-folder/1-inside-with-numeric.html.erb +1 -0
  24. data/fixtures/page-classes-app/source/1-starts-with-numeric.html.erb +1 -0
  25. data/fixtures/page-classes-app/source/2-starts-with-numeric-custom.html.erb +1 -0
  26. data/lib/middleman-core/cli/build.rb +95 -118
  27. data/lib/middleman-core/core_extensions/rendering.rb +7 -0
  28. data/lib/middleman-core/core_extensions/request.rb +2 -0
  29. data/lib/middleman-core/logger.rb +5 -6
  30. data/lib/middleman-core/preview_server.rb +25 -11
  31. data/lib/middleman-core/renderers/asciidoc.rb +59 -0
  32. data/lib/middleman-core/renderers/kramdown.rb +7 -4
  33. data/lib/middleman-core/sitemap/queryable.rb +18 -11
  34. data/lib/middleman-core/sitemap/resource.rb +4 -5
  35. data/lib/middleman-core/templates/empty/Gemfile.tt +1 -6
  36. data/lib/middleman-core/templates/shared/Gemfile.tt +1 -6
  37. data/lib/middleman-core/util.rb +3 -0
  38. data/lib/middleman-core/version.rb +1 -1
  39. data/lib/middleman-more/core_extensions/default_helpers.rb +10 -13
  40. data/middleman-core.gemspec +2 -0
  41. metadata +42 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef753f5b00f4988ae300a75042c40b029cdec327
4
- data.tar.gz: 79cbd2f81eded854ad3a5556064a4ef4426b86d3
3
+ metadata.gz: 8e72ec7118c675ea751825737b7d382670144035
4
+ data.tar.gz: 035a9102b513a809495a687a6cf11154a29d8842
5
5
  SHA512:
6
- metadata.gz: 5673c38132a41e5b75f473e9a6ceedc8ae9edf291fa07290fd9fbc24bfd63ab91206c3267e45424cdfa6290b8a58fb1a8b3019cc15eff8debf2fd06e705baba0
7
- data.tar.gz: fa31465e107a5d86bdd26b280da9001b2c5736bbceb96a69556a937b19bf1cf5d1a60566d93861d8c166692d5a96d7538b70e5db90234b666e12c0b81fdfc976
6
+ metadata.gz: 246c43b8e6372afe90cbd427d80135e8d72b1d5686f15b9fca2d773e023b6f54ebd20b53fd61374beea8d87951e6dd7a103384454c27f06b610ef4a5dc7acb06
7
+ data.tar.gz: 396268eda2f27bbf32d83b46dd87f2add1c26225f9af60df2b968359de40375487dd3fa8a405d0ace99b869233d00bec46f44f89cc546bb87ab1691f43e77667
@@ -0,0 +1,155 @@
1
+ Feature: AsciiDoc Support
2
+ In order to test included AsciiDoc support
3
+
4
+ Scenario: Rendering html
5
+ Given the Server is running at "asciidoc-app"
6
+ When I go to "/hello.html"
7
+ Then I should see:
8
+ """
9
+ <div class="paragraph">
10
+ <p>Hello, AsciiDoc!
11
+ Middleman, I am in you.</p>
12
+ </div>
13
+ """
14
+
15
+ Scenario: Rendering html with default layout
16
+ Given a fixture app "asciidoc-app"
17
+ And a file named "config.rb" with:
18
+ """
19
+ set :layout, :default
20
+ """
21
+ Given the Server is running at "asciidoc-app"
22
+ When I go to "/hello.html"
23
+ Then I should see:
24
+ """
25
+ <!DOCTYPE html>
26
+ <html>
27
+ <head>
28
+ <title>Fallback</title>
29
+ </head>
30
+ <body>
31
+ <div class="paragraph">
32
+ <p>Hello, AsciiDoc!
33
+ Middleman, I am in you.</p>
34
+ </div>
35
+ </body>
36
+ </html>
37
+ """
38
+
39
+ Scenario: Rendering html with explicit layout
40
+ Given the Server is running at "asciidoc-app"
41
+ When I go to "/hello-with-layout.html"
42
+ Then I should see:
43
+ """
44
+ <!DOCTYPE html>
45
+ <html>
46
+ <head>
47
+ <title>Fallback</title>
48
+ </head>
49
+ <body>
50
+ <div class="paragraph">
51
+ <p>Hello, AsciiDoc!</p>
52
+ </div>
53
+ </body>
54
+ </html>
55
+ """
56
+
57
+ Scenario: Rendering html with no layout
58
+ Given the Server is running at "asciidoc-app"
59
+ When I go to "/hello-no-layout.html"
60
+ Then I should see:
61
+ """
62
+ <div class="paragraph">
63
+ <p>Hello, AsciiDoc!</p>
64
+ </div>
65
+ """
66
+
67
+ Scenario: Rendering html using title from document
68
+ Given the Server is running at "asciidoc-app"
69
+ When I go to "/hello-with-title.html"
70
+ Then I should see:
71
+ """
72
+ <!DOCTYPE html>
73
+ <html>
74
+ <head>
75
+ <title>Page Title</title>
76
+ </head>
77
+ <body>
78
+ <h1>Page Title</h1>
79
+ <div id="preamble">
80
+ <div class="sectionbody">
81
+ <div class="paragraph">
82
+ <p>Hello, AsciiDoc!</p>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </body>
87
+ </html>
88
+ """
89
+
90
+ Scenario: Rendering html with title and layout from front matter
91
+ Given the Server is running at "asciidoc-app"
92
+ When I go to "/hello-with-front-matter.html"
93
+ Then I should see:
94
+ """
95
+ <!DOCTYPE html>
96
+ <html>
97
+ <head>
98
+ <title>Page Title</title>
99
+ </head>
100
+ <body>
101
+ <div class="paragraph">
102
+ <p>Hello, AsciiDoc!</p>
103
+ </div>
104
+ </body>
105
+ </html>
106
+ """
107
+
108
+ Scenario: Including a file relative to source root
109
+ Given the Server is running at "asciidoc-app"
110
+ When I go to "/master.html"
111
+ Then I should see:
112
+ """
113
+ <div class="literalblock">
114
+ <div class="content">
115
+ <pre>I'm included content.</pre>
116
+ </div>
117
+ """
118
+
119
+ Scenario: Linking to an image
120
+ Given the Server is running at "asciidoc-app"
121
+ When I go to "/gallery.html"
122
+ Then I should see:
123
+ """
124
+ <div class="imageblock">
125
+ <div class="content">
126
+ <img src="/images/tiger.gif" alt="tiger">
127
+ </div>
128
+ """
129
+
130
+ Scenario: Configuring custom AsciiDoc attributes
131
+ Given a fixture app "asciidoc-app"
132
+ And a file named "config.rb" with:
133
+ """
134
+ set :asciidoc_attributes, %w(foo=bar)
135
+ """
136
+ Given the Server is running at "asciidoc-app"
137
+ When I go to "/custom-attribute.html"
138
+ Then I should see "bar"
139
+
140
+ Scenario: Highlighting source code
141
+ Given a fixture app "asciidoc-app"
142
+ And a file named "config.rb" with:
143
+ """
144
+ set :asciidoc_attributes, %w(source-highlighter=html-pipeline)
145
+ """
146
+ Given the Server is running at "asciidoc-app"
147
+ When I go to "/code.html"
148
+ Then I should see:
149
+ """
150
+ <div class="listingblock">
151
+ <div class="content">
152
+ <pre lang="ruby"><code>puts "Is this mic on?"</code></pre>
153
+ </div>
154
+ </div>
155
+ """
@@ -14,4 +14,19 @@ Feature: Built-in page_classes view helper
14
14
  Scenario: Viewing a tier-2 path
15
15
  Given the Server is running at "page-classes-app"
16
16
  When I go to "/sub1/sub2/page-classes.html"
17
- Then I should see "sub1 sub1_sub2 sub1_sub2_page-classes"
17
+ Then I should see "sub1 sub1_sub2 sub1_sub2_page-classes"
18
+
19
+ Scenario: The page starts with a number
20
+ Given the Server is running at "page-classes-app"
21
+ When I go to "/1-starts-with-numeric.html"
22
+ Then I should see "x1-starts-with-numeric"
23
+
24
+ Scenario: The folder starts with a number
25
+ Given the Server is running at "page-classes-app"
26
+ When I go to "/1-folder/1-inside-with-numeric.html"
27
+ Then I should see "x1-folder x1-folder_1-inside-with-numeric"
28
+
29
+ Scenario: Custom prefix for numeric
30
+ Given the Server is running at "page-classes-app"
31
+ When I go to "/2-starts-with-numeric-custom.html"
32
+ Then I should see "haaaaay2-starts-with-numeric-custom"
@@ -26,7 +26,7 @@ Feature: Markdown (Kramdown) support
26
26
 
27
27
  ![image](blank.gif)
28
28
 
29
- [Mail me](mailto:ben@benhollis.net)
29
+ (mailto:mail@mail.com)
30
30
  """
31
31
  Given the Server is running at "markdown-app"
32
32
  When I go to "/link_and_image/"
@@ -34,3 +34,5 @@ Feature: Markdown (Kramdown) support
34
34
  Then I should see 'width="1"'
35
35
  And I should see 'height="1"'
36
36
  And I should see 'src="/images/blank.gif"'
37
+ And I should see 'src="/images/blank.gif"'
38
+ And I should see "&#109;&#097;&#105;&#108;&#064;&#109;&#097;&#105;&#108;&#046;&#099;&#111;&#109;"
@@ -34,8 +34,9 @@ Feature: Markdown (Redcarpet) support
34
34
  Then I should see "<sup>"
35
35
  When I go to "/lax_spacing.html"
36
36
  Then I should see "<p>hello</p>"
37
+ When I go to "/mailto.html"
38
+ Then I should see '<h1>✉ <a href="mailto:mail@mail.com">Mail</a></h1>'
37
39
 
38
- @no18
39
40
  Scenario: Redcarpet 3 extensions
40
41
  Given a fixture app "markdown-app"
41
42
  And a file named "config.rb" with:
@@ -28,4 +28,8 @@ Feature: Queryable Selector
28
28
  Then should support ordering by attribute ascending
29
29
  Then should support ordering by attribute descending
30
30
  Then should order by attribute ascending by default
31
- Then should exclude documents that do not own the attribute
31
+ Then should exclude documents that do not own the attribute
32
+ Scenario: Passing queries around
33
+ Given a simple 'where' query
34
+ When I chain a where clause onto that query
35
+ Then the original query should remain unchanged
@@ -1,3 +1,15 @@
1
+ Given /^a simple 'where' query$/ do
2
+ @query = Middleman::Sitemap::Queryable::Query.new({}).where(:foo => 'bar')
3
+ end
4
+
5
+ When /^I chain a where clause onto that query$/ do
6
+ @new_query = @query.where(:baz => 'foo')
7
+ end
8
+
9
+ Then /^the original query should remain unchanged$/ do
10
+ @query.opts({}).should_not eql @new_query.opts({})
11
+ end
12
+
1
13
  Then /^should initialize with an attribute and an operator$/ do
2
14
  selector = ::Middleman::Sitemap::Queryable::Selector.new :attribute => :author, :operator => 'equal'
3
15
  :author.should == selector.attribute
@@ -120,4 +132,4 @@ end
120
132
  Then /^should exclude documents that do not own the attribute$/ do
121
133
  found_documents = @server_inst.sitemap.order_by(:status).all
122
134
  found_documents.map { |r| r.raw_data[:id] }.to_set.should == [1,2].to_set
123
- end
135
+ end
File without changes
@@ -0,0 +1 @@
1
+ I'm included content.
@@ -0,0 +1,3 @@
1
+ ```ruby
2
+ puts "Is this mic on?"
3
+ ```
@@ -0,0 +1,3 @@
1
+ ++++
2
+ {foo}
3
+ ++++
@@ -0,0 +1 @@
1
+ image::tiger.gif[]
@@ -0,0 +1,2 @@
1
+ :page-layout: false
2
+ Hello, AsciiDoc!
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: Page Title
3
+ layout: default
4
+ ---
5
+ Hello, AsciiDoc!
@@ -0,0 +1,2 @@
1
+ :page-layout: default
2
+ Hello, AsciiDoc!
@@ -0,0 +1,4 @@
1
+ = Page Title
2
+ :page-layout: default
3
+
4
+ Hello, AsciiDoc!
@@ -0,0 +1,4 @@
1
+ Hello, AsciiDoc!
2
+ ifdef::env-middleman[]
3
+ Middleman, I am in you.
4
+ endif::env-middleman[]
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= data.page.title || 'Fallback' %></title>
5
+ </head>
6
+ <body>
7
+ <%= yield %>
8
+
9
+ </body>
10
+ </html>
@@ -0,0 +1,3 @@
1
+ ....
2
+ include::_include.adoc[]
3
+ ....
@@ -0,0 +1 @@
1
+ # ✉ [Mail](mailto:mail@mail.com)
@@ -0,0 +1,7 @@
1
+ helpers do
2
+ def title
3
+ content_tag :h1 do
4
+ "Title"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ <%= page_classes %>
@@ -0,0 +1 @@
1
+ <%= page_classes :numeric_prefix => "haaaaay" %>
@@ -1,14 +1,18 @@
1
1
  require "middleman-core"
2
2
  require "fileutils"
3
+ require 'set'
3
4
 
4
5
  # CLI Module
5
6
  module Middleman::Cli
7
+ # Alias "b" to "build"
8
+ Base.map({ "b" => "build" })
6
9
 
7
10
  # The CLI Build class
8
11
  class Build < Thor
9
12
  include Thor::Actions
10
13
 
11
14
  attr_reader :debugging
15
+ attr_accessor :had_errors
12
16
 
13
17
  check_unknown_options!
14
18
 
@@ -51,21 +55,19 @@ module Middleman::Cli
51
55
  require 'find'
52
56
 
53
57
  @debugging = Middleman::Cli::Base.respond_to?(:debugging) && Middleman::Cli::Base.debugging
54
- @had_errors = false
58
+ self.had_errors = false
55
59
 
56
60
  self.class.shared_instance(options["verbose"], options["instrument"])
57
61
 
58
- self.class.shared_rack
59
-
60
62
  opts = {}
61
- opts[:glob] = options["glob"] if options.has_key?("glob")
62
- opts[:clean] = options["clean"] if options.has_key?("clean")
63
+ opts[:glob] = options["glob"] if options.has_key?("glob")
64
+ opts[:clean] = options["clean"]
63
65
 
64
- action GlobAction.new(self, opts)
66
+ action BuildAction.new(self, opts)
65
67
 
66
68
  self.class.shared_instance.run_hook :after_build, self
67
69
 
68
- if @had_errors && !@debugging
70
+ if self.had_errors && !self.debugging
69
71
  msg = "There were errors during this build"
70
72
  unless options["verbose"]
71
73
  msg << ", re-run with `middleman build --verbose` to see the full exception."
@@ -73,7 +75,7 @@ module Middleman::Cli
73
75
  self.shell.say msg, :red
74
76
  end
75
77
 
76
- exit(1) if @had_errors
78
+ exit(1) if self.had_errors
77
79
  end
78
80
 
79
81
  # Static methods
@@ -91,88 +93,11 @@ module Middleman::Cli
91
93
  logger(verbose ? 0 : 1, instrument)
92
94
  end
93
95
  end
94
-
95
- # Middleman::Application class singleton
96
- #
97
- # @return [Middleman::Application]
98
- def shared_server
99
- @_shared_server ||= shared_instance.class
100
- end
101
-
102
- # Rack::Test::Session singleton
103
- #
104
- # @return [Rack::Test::Session]
105
- def shared_rack
106
- @_shared_rack ||= ::Rack::Test::Session.new(shared_server.to_rack_app)
107
- end
108
-
109
- # Set the root path to the Middleman::Application's root
110
- def source_root
111
- shared_instance.root
112
- end
113
96
  end
114
-
115
- no_tasks {
116
- # Render a resource to a file.
117
- #
118
- # @param [Middleman::Sitemap::Resource] resource
119
- # @return [String] The full path of the file that was written
120
- def render_to_file(resource)
121
- build_dir = self.class.shared_instance.config[:build_dir]
122
- output_file = File.join(build_dir, resource.destination_path.gsub('%20', ' '))
123
-
124
- if resource.binary?
125
- if !File.exists?(output_file)
126
- say_status :create, output_file, :green
127
- elsif FileUtils.compare_file(resource.source_file, output_file)
128
- say_status :identical, output_file, :blue
129
- return output_file
130
- else
131
- say_status :update, output_file, :yellow
132
- end
133
-
134
- FileUtils.mkdir_p(File.dirname(output_file))
135
- FileUtils.cp(resource.source_file, output_file)
136
- else
137
- begin
138
- response = self.class.shared_rack.get(URI.escape(resource.request_path))
139
-
140
- if response.status == 200
141
- create_file(output_file, binary_encode(response.body))
142
- else
143
- handle_error(output_file, response.body)
144
- end
145
- rescue => e
146
- handle_error(output_file, "#{e}\n#{e.backtrace.join("\n")}", e)
147
- end
148
- end
149
-
150
- output_file
151
- end
152
-
153
- def handle_error(file_name, response, e=Thor::Error.new(response))
154
- @had_errors = true
155
-
156
- say_status :error, file_name, :red
157
- if self.debugging
158
- raise e
159
- exit(1)
160
- elsif options["verbose"]
161
- self.shell.say response, :red
162
- end
163
- end
164
-
165
- def binary_encode(string)
166
- if string.respond_to?(:force_encoding)
167
- string.force_encoding("ascii-8bit")
168
- end
169
- string
170
- end
171
- }
172
97
  end
173
98
 
174
99
  # A Thor Action, modular code, which does the majority of the work.
175
- class GlobAction < ::Thor::Actions::EmptyDirectory
100
+ class BuildAction < ::Thor::Actions::EmptyDirectory
176
101
  attr_reader :source
177
102
  attr_reader :logger
178
103
 
@@ -181,23 +106,23 @@ module Middleman::Cli
181
106
  # @param [Middleman::Cli::Build] base
182
107
  # @param [Hash] config
183
108
  def initialize(base, config={})
184
- @app = base.class.shared_instance
185
- source = @app.source
186
- @destination = @app.build_dir
109
+ @app = base.class.shared_instance
110
+ @source_dir = Pathname(@app.source_dir)
111
+ @build_dir = Pathname(@app.build_dir)
112
+ @to_clean = Set.new
187
113
 
188
- @source = File.expand_path(base.find_in_source_paths(source.to_s))
114
+ @logger = @app.logger
115
+ @rack = ::Rack::Test::Session.new(@app.class.to_rack_app)
189
116
 
190
- @logger = Middleman::Cli::Build.shared_instance.logger
191
-
192
- super(base, @destination, config)
117
+ super(base, @build_dir, config)
193
118
  end
194
119
 
195
120
  # Execute the action
196
121
  # @return [void]
197
122
  def invoke!
198
- queue_current_paths if cleaning?
123
+ queue_current_paths if should_clean?
199
124
  execute!
200
- clean! if cleaning?
125
+ clean! if should_clean?
201
126
  end
202
127
 
203
128
  protected
@@ -205,39 +130,36 @@ module Middleman::Cli
205
130
  # Remove files which were not built in this cycle
206
131
  # @return [void]
207
132
  def clean!
208
- @cleaning_queue.select { |q| q.file? }.each do |f|
133
+ @to_clean.each do |f|
209
134
  base.remove_file f, :force => true
210
135
  end
211
136
 
212
- Dir[File.join(@destination, "**", "*")].select { |d|
213
- File.directory?(d)
214
- }.each do |d|
215
- base.remove_file d, :force => true if directory_empty? Pathname(d)
137
+ Dir[@build_dir.join("**", "*")].select {|d| File.directory?(d) }.each do |d|
138
+ base.remove_file d, :force => true if directory_empty? d
216
139
  end
217
140
  end
218
141
 
219
142
  # Whether we should clean the build
220
143
  # @return [Boolean]
221
- def cleaning?
222
- @config.has_key?(:clean) && @config[:clean]
144
+ def should_clean?
145
+ @config[:clean]
223
146
  end
224
147
 
225
148
  # Whether the given directory is empty
226
- # @param [String] directory
149
+ # @param [String, Pathname] directory
227
150
  # @return [Boolean]
228
151
  def directory_empty?(directory)
229
- directory.children.empty?
152
+ Pathname(directory).children.empty?
230
153
  end
231
154
 
232
- # Get a list of all the paths in the destination folder and save them
155
+ # Get a list of all the file paths in the destination folder and save them
233
156
  # for comparison against the files we build in this cycle
234
157
  # @return [void]
235
158
  def queue_current_paths
236
- @cleaning_queue = []
237
- return unless File.exist?(@destination)
159
+ return unless File.exist?(@build_dir)
238
160
 
239
- paths = ::Middleman::Util.all_files_under(@destination).map(&:realpath)
240
- @cleaning_queue += paths.select do |path|
161
+ paths = ::Middleman::Util.all_files_under(@build_dir).map(&:realpath).select(&:file?)
162
+ @to_clean += paths.select do |path|
241
163
  path.to_s !~ /\/\./ || path.to_s =~ /\.(htaccess|htpasswd)/
242
164
  end
243
165
  end
@@ -254,13 +176,13 @@ module Middleman::Cli
254
176
  @app.sitemap.resources.select do |resource|
255
177
  resource.ext == ".css"
256
178
  end.each do |resource|
257
- Middleman::Cli::Build.shared_rack.get(URI.escape(resource.destination_path))
179
+ @rack.get(URI.escape(resource.destination_path))
258
180
  end
259
181
 
260
182
  logger.debug "== Checking for Compass sprites"
261
183
 
262
184
  # Double-check for compass sprites
263
- @app.files.find_new_files((Pathname(@app.source_dir) + @app.images_dir).relative_path_from(@app.root_path))
185
+ @app.files.find_new_files((@source_dir + @app.images_dir).relative_path_from(@app.root_path))
264
186
  @app.sitemap.ensure_resource_list_updated!
265
187
 
266
188
  # Sort paths to be built by the above order. This is primarily so Compass can
@@ -273,24 +195,79 @@ module Middleman::Cli
273
195
  sort_order.index(r.ext) || 100
274
196
  end
275
197
 
198
+ if @build_dir.expand_path.relative_path_from(@source_dir).to_s =~ /\A[.\/]+\Z/
199
+ raise ":build_dir (#{@build_dir}) cannot be a parent of :source_dir (#{@source_dir})"
200
+ end
201
+
276
202
  # Loop over all the paths and build them.
277
203
  resources.each do |resource|
278
204
  next if @config[:glob] && !File.fnmatch(@config[:glob], resource.destination_path)
279
205
 
280
- output_path = base.render_to_file(resource)
206
+ output_path = render_to_file(resource)
281
207
 
282
- if cleaning?
283
- pn = Pathname(output_path)
284
- @cleaning_queue.delete(pn.realpath) if pn.exist?
208
+ if should_clean?
209
+ @to_clean.delete(output_path.realpath) if output_path.exist?
285
210
  end
286
211
  end
287
212
 
288
213
  ::Middleman::Profiling.report("build")
289
214
  end
290
- end
291
215
 
292
- # Alias "b" to "build"
293
- Base.map({ "b" => "build" })
216
+ # Render a resource to a file.
217
+ #
218
+ # @param [Middleman::Sitemap::Resource] resource
219
+ # @return [Pathname] The full path of the file that was written
220
+ def render_to_file(resource)
221
+ output_file = @build_dir + resource.destination_path.gsub('%20', ' ')
222
+
223
+ if resource.binary?
224
+ if !output_file.exist?
225
+ base.say_status :create, output_file, :green
226
+ elsif FileUtils.compare_file(resource.source_file, output_file)
227
+ base.say_status :identical, output_file, :blue
228
+ return output_file
229
+ else
230
+ base.say_status :update, output_file, :yellow
231
+ end
232
+
233
+ output_file.dirname.mkpath
234
+ FileUtils.cp(resource.source_file, output_file)
235
+ else
236
+ begin
237
+ response = @rack.get(URI.escape(resource.request_path))
238
+
239
+ if response.status == 200
240
+ base.create_file(output_file, binary_encode(response.body))
241
+ else
242
+ handle_error(output_file, response.body)
243
+ end
244
+ rescue => e
245
+ handle_error(output_file, "#{e}\n#{e.backtrace.join("\n")}", e)
246
+ end
247
+ end
248
+
249
+ output_file
250
+ end
251
+
252
+ def handle_error(file_name, response, e=Thor::Error.new(response))
253
+ base.had_errors = true
254
+
255
+ base.say_status :error, file_name, :red
256
+ if base.debugging
257
+ raise e
258
+ exit(1)
259
+ elsif base.options["verbose"]
260
+ base.shell.say response, :red
261
+ end
262
+ end
263
+
264
+ def binary_encode(string)
265
+ if string.respond_to?(:force_encoding)
266
+ string.force_encoding("ascii-8bit")
267
+ end
268
+ string
269
+ end
270
+ end
294
271
  end
295
272
 
296
273
  # Quiet down create file
@@ -56,6 +56,13 @@ module Middleman
56
56
  require "middleman-core/renderers/markdown"
57
57
  app.register Middleman::Renderers::Markdown
58
58
 
59
+ # AsciiDoc Support
60
+ begin
61
+ require "middleman-core/renderers/asciidoc"
62
+ app.register Middleman::Renderers::AsciiDoc
63
+ rescue LoadError
64
+ end
65
+
59
66
  # Liquid Support
60
67
  begin
61
68
  require "middleman-core/renderers/liquid"
@@ -2,6 +2,7 @@
2
2
  require "rack"
3
3
  require "rack/file"
4
4
  require "rack/lint"
5
+ require "rack/head"
5
6
 
6
7
  module Middleman
7
8
  module CoreExtensions
@@ -69,6 +70,7 @@ module Middleman
69
70
  @rack_app ||= begin
70
71
  app = ::Rack::Builder.new
71
72
  app.use Rack::Lint
73
+ app.use Rack::Head
72
74
 
73
75
  Array(@middleware).each do |klass, options, block|
74
76
  app.use(klass, *options, &block)
@@ -1,15 +1,14 @@
1
1
  # Use the Ruby/Rails logger
2
- require 'active_support/core_ext/logger'
2
+ require 'active_support/notifications'
3
+ require 'active_support/buffered_logger'
3
4
  require 'thread'
4
5
 
5
6
  module Middleman
6
7
 
7
8
  # The Middleman Logger
8
- class Logger < ::Logger
9
-
10
- # Force output to STDOUT
11
- def initialize(log_level=1, is_instrumenting=false, target=STDOUT)
12
- super(STDOUT)
9
+ class Logger < ActiveSupport::BufferedLogger
10
+ def initialize(log_level=1, is_instrumenting=false, target=$stdout)
11
+ super(target)
13
12
 
14
13
  self.level = log_level
15
14
  @instrumenting = is_instrumenting
@@ -17,7 +17,7 @@ module Middleman
17
17
  @host = @options[:host] || Socket.gethostname
18
18
  @port = @options[:port] || DEFAULT_PORT
19
19
 
20
- mount_instance
20
+ mount_instance(new_app)
21
21
  logger.info "== The Middleman is standing watch at http://#{host}:#{port}"
22
22
  logger.info "== Inspect your site configuration at http://#{host}:#{port}/__middleman/"
23
23
 
@@ -31,12 +31,17 @@ module Middleman
31
31
  # reloading later on.
32
32
  ::Middleman::Profiling.report("server_start")
33
33
 
34
- @webrick.start
34
+ loop do
35
+ @webrick.start
35
36
 
36
- # $mm_shutdown is set by the signal handler
37
- if $mm_shutdown
38
- shutdown
39
- exit
37
+ # $mm_shutdown is set by the signal handler
38
+ if $mm_shutdown
39
+ shutdown
40
+ exit
41
+ elsif $mm_reload
42
+ $mm_reload = false
43
+ reload
44
+ end
40
45
  end
41
46
  end
42
47
  end
@@ -62,10 +67,18 @@ module Middleman
62
67
  def reload
63
68
  logger.info "== The Middleman is reloading"
64
69
 
70
+ begin
71
+ app = new_app
72
+ rescue Exception => e
73
+ logger.error "Error reloading Middleman: #{e}\n#{e.backtrace.join("\n")}"
74
+ logger.info "== The Middleman is still running the application from before the error"
75
+ return
76
+ end
77
+
65
78
  unmount_instance
66
- mount_instance
79
+ mount_instance(app)
67
80
 
68
- logger.info "== The Middleman is standing watch at http://#{host}:#{port}"
81
+ logger.info "== The Middleman has reloaded"
69
82
  end
70
83
 
71
84
  # Stop the current instance, exit Webrick
@@ -112,7 +125,8 @@ module Middleman
112
125
 
113
126
  # See if the changed file is config.rb or lib/*.rb
114
127
  if needs_to_reload?(added_and_modified + removed)
115
- reload
128
+ $mm_reload = true
129
+ @webrick.stop
116
130
  else
117
131
  added_and_modified.each do |path|
118
132
  app.files.did_change(path)
@@ -168,8 +182,8 @@ module Middleman
168
182
  # Attach a new Middleman::Application instance
169
183
  # @param [Middleman::Application] app
170
184
  # @return [void]
171
- def mount_instance
172
- @app = new_app
185
+ def mount_instance(app)
186
+ @app = app
173
187
 
174
188
  @webrick ||= setup_webrick(@options[:debug] || false)
175
189
 
@@ -0,0 +1,59 @@
1
+ require 'asciidoctor'
2
+
3
+ module Middleman
4
+ module Renderers
5
+ module AsciiDoc
6
+ class << self
7
+
8
+ def registered(app)
9
+ app.config.define_setting :asciidoc, {
10
+ :safe => :safe,
11
+ :backend => :html5,
12
+ :attributes => %W(showtitle env=middleman env-middleman middleman-version=#{::Middleman::VERSION})
13
+ }, 'AsciiDoc engine options (Hash)'
14
+ app.config.define_setting :asciidoc_attributes, [], 'AsciiDoc custom attributes (Array)'
15
+ app.before_configuration do
16
+ template_extensions :adoc => :html
17
+ end
18
+
19
+ app.after_configuration do
20
+ # QUESTION should base_dir be equal to docdir instead?
21
+ config[:asciidoc][:base_dir] = source_dir
22
+ config[:asciidoc][:attributes].concat(config[:asciidoc_attributes] || [])
23
+ config[:asciidoc][:attributes] << %(imagesdir=#{File.join((config[:http_prefix] || '/').chomp('/'), config[:images_dir])})
24
+ sitemap.provides_metadata(/\.adoc$/) do |path|
25
+ # read the AsciiDoc header only to set page options and data
26
+ # header values can be accessed via app.data.page.<name> in the layout
27
+ doc = Asciidoctor.load_file path, :safe => :safe, :parse_header_only => true
28
+
29
+ opts = {}
30
+ if doc.attr? 'page-layout'
31
+ case (layout = (doc.attr 'page-layout'))
32
+ when '', 'false'
33
+ opts[:layout] = false
34
+ else
35
+ opts[:layout] = layout
36
+ end
37
+ end
38
+ opts[:layout_engine] = (doc.attr 'page-layout-engine') if (doc.attr? 'page-layout-engine')
39
+ # TODO override attributes to set docfile, docdir, docname, etc
40
+ # alternative is to set :renderer_options, which get merged into options by the rendering extension
41
+ #opts[:attributes] = config[:asciidoc][:attributes].dup
42
+ #opts[:attributes].concat %W(docfile=#{path} docdir=#{File.dirname path} docname=#{(File.basename path).sub(/\.adoc$/, '')})
43
+
44
+ page = {}
45
+ page[:title] = doc.doctitle
46
+ page[:date] = (doc.attr 'date') unless (doc.attr 'date').nil?
47
+ # TODO grab all the author information
48
+ page[:author] = (doc.attr 'author') unless (doc.attr 'author').nil?
49
+
50
+ {:options => opts, :page => ::Middleman::Util.recursively_enhance(page)}
51
+ end
52
+ end
53
+ end
54
+
55
+ alias :included :registered
56
+ end
57
+ end
58
+ end
59
+ end
@@ -20,19 +20,22 @@ module Middleman
20
20
 
21
21
  def convert_img(el, indent)
22
22
  attrs = el.attr.dup
23
+
23
24
  link = attrs.delete('src')
24
25
  middleman_app.image_tag(link, attrs)
25
26
  end
26
27
 
27
28
  def convert_a(el, indent)
28
29
  content = inner(el, indent)
29
- attr = el.attr.dup
30
- if attr['href'] =~ /\Amailto:/
31
- mail_addr = attr['href'].sub(/\Amailto:/, '')
32
- attr['href'] = obfuscate('mailto') << ":" << obfuscate(mail_addr)
30
+
31
+ if el.attr['href'] =~ /\Amailto:/
32
+ mail_addr = el.attr['href'].sub(/\Amailto:/, '')
33
+ href = obfuscate('mailto') << ":" << obfuscate(mail_addr)
33
34
  content = obfuscate(content) if content == mail_addr
35
+ return %Q{<a href="#{href}">#{content}</a>}
34
36
  end
35
37
 
38
+ attr = el.attr.dup
36
39
  link = attr.delete('href')
37
40
  middleman_app.link_to(content, link, attr)
38
41
  end
@@ -65,9 +65,12 @@ module Middleman
65
65
  end
66
66
 
67
67
  class Query
68
- def initialize(model)
68
+ def initialize(model, opts={})
69
69
  @model = model
70
- @where = {}
70
+ @where = opts[:where] || {}
71
+ @order_by = opts[:order_by]
72
+ @offset = opts[:offset]
73
+ @limit = opts[:limit]
71
74
  end
72
75
 
73
76
  def where(constraints_hash)
@@ -77,23 +80,27 @@ module Middleman
77
80
  selector = Selector.new(:attribute => attribute, :operator => 'equal')
78
81
  selector_hash.update({ selector => value })
79
82
  end
80
- @where.merge! selector_hash
81
- self
83
+ Query.new @model, opts(:where => @where.merge(selector_hash))
84
+ end
85
+
86
+ def opts new_opts
87
+ { :where => {}.merge(@where),
88
+ :order_by => @order_by,
89
+ :offset => @offset,
90
+ :limit => @limit
91
+ }.merge(new_opts)
82
92
  end
83
93
 
84
94
  def order_by(field)
85
- @order_by = field.is_a?(Symbol) ? {field => :asc} : field
86
- self
95
+ Query.new @model, opts(:order_by => field.is_a?(Symbol) ? {field => :asc} : field)
87
96
  end
88
97
 
89
98
  def offset(number)
90
- @offset = number
91
- self
99
+ Query.new @model, opts(:offset => number)
92
100
  end
93
101
 
94
102
  def limit(number)
95
- @limit = number
96
- self
103
+ Query.new @model, opts(:limit => number)
97
104
  end
98
105
 
99
106
  def first
@@ -145,4 +152,4 @@ class Symbol
145
152
  self.to_s <=> other.to_s
146
153
  end
147
154
  end
148
- end
155
+ end
@@ -60,18 +60,17 @@ module Middleman
60
60
 
61
61
  file_meta = store.metadata_for_file(source_file).dup
62
62
  if file_meta.has_key?(:blocks)
63
- result[:blocks] << file_meta.delete(:blocks)
63
+ result[:blocks] += file_meta.delete(:blocks)
64
64
  end
65
65
  result.deep_merge!(file_meta)
66
66
 
67
67
  local_meta = @local_metadata.dup
68
68
  if local_meta.has_key?(:blocks)
69
- result[:blocks] << local_meta.delete(:blocks)
69
+ result[:blocks] += local_meta.delete(:blocks)
70
70
  end
71
71
  result.deep_merge!(local_meta)
72
72
 
73
73
  result[:blocks] = result[:blocks].flatten.compact
74
-
75
74
  result
76
75
  end
77
76
 
@@ -80,10 +79,10 @@ module Middleman
80
79
  def add_metadata(metadata={}, &block)
81
80
  metadata = metadata.dup
82
81
  if metadata.has_key?(:blocks)
83
- @local_metadata[:blocks] << metadata.delete(:blocks)
82
+ @local_metadata[:blocks] += metadata.delete(:blocks)
84
83
  end
85
84
  @local_metadata.deep_merge!(metadata)
86
- @local_metadata[:blocks] << block if block_given?
85
+ @local_metadata[:blocks] += [ block ] if block_given?
87
86
  end
88
87
 
89
88
  # Get the output/preview URL for this resource
@@ -3,9 +3,4 @@ source 'https://rubygems.org'
3
3
  gem "middleman", "~><%= Middleman::VERSION %>"
4
4
 
5
5
  # For faster file watcher updates on Windows:
6
- gem "wdm", "~> 0.1.0", :platforms => [:mswin, :mingw]
7
-
8
- # Cross-templating language block fix for Ruby 1.8
9
- platforms :mri_18 do
10
- gem "ruby18_source_location"
11
- end
6
+ gem "wdm", "~> 0.1.0", :platforms => [:mswin, :mingw]
@@ -8,9 +8,4 @@ gem "middleman", "~><%= Middleman::VERSION %>"
8
8
  gem "middleman-livereload", "~> 3.1.0"
9
9
 
10
10
  # For faster file watcher updates on Windows:
11
- gem "wdm", "~> 0.1.0", :platforms => [:mswin, :mingw]
12
-
13
- # Cross-templating language block fix for Ruby 1.8
14
- platforms :mri_18 do
15
- gem "ruby18_source_location"
16
- end
11
+ gem "wdm", "~> 0.1.0", :platforms => [:mswin, :mingw]
@@ -48,6 +48,9 @@ module Middleman
48
48
  # @return [Middleman::Logger] The logger
49
49
  def self.logger(*args)
50
50
  if !@_logger || args.length > 0
51
+ if args.length == 1 && (args.first.is_a?(::String) || args.first.respond_to?(:write))
52
+ args = [0, false, args.first]
53
+ end
51
54
  @_logger = ::Middleman::Logger.new(*args)
52
55
  end
53
56
 
@@ -1,5 +1,5 @@
1
1
  module Middleman
2
2
  # Current Version
3
3
  # @return [String]
4
- VERSION = '3.1.6' unless const_defined?(:VERSION)
4
+ VERSION = '3.2.0' unless const_defined?(:VERSION)
5
5
  end
@@ -1,14 +1,3 @@
1
- # Required to hack around Padrino blocks within different template types.
2
- require 'rbconfig'
3
- if RUBY_VERSION =~ /1.8/ && RbConfig::CONFIG['ruby_install_name'] == 'ruby'
4
- begin
5
- require 'ruby18_source_location'
6
- rescue LoadError
7
- $stderr.puts "Ruby 1.8 requires the 'ruby18_source_location' gem be added to your Gemfile"
8
- exit(1)
9
- end
10
- end
11
-
12
1
  if !defined?(::Padrino::Helpers)
13
2
  require 'vendored-middleman-deps/padrino-core-0.11.2/lib/padrino-core/support_lite'
14
3
  require 'vendored-middleman-deps/padrino-helpers-0.11.2/lib/padrino-helpers'
@@ -132,7 +121,7 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
132
121
  # Generate body css classes based on the current path
133
122
  #
134
123
  # @return [String]
135
- def page_classes
124
+ def page_classes(options={})
136
125
  path = current_path.dup
137
126
  path << index_file if path.end_with?('/')
138
127
  path = ::Middleman::Util.strip_leading_slash(path)
@@ -141,7 +130,15 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
141
130
  parts = path.split('.').first.split('/')
142
131
  parts.each_with_index { |path, i| classes << parts.first(i+1).join('_') }
143
132
 
144
- classes.join(' ')
133
+ prefix = options[:numeric_prefix] || "x"
134
+ classes.map do |c|
135
+ # Replace weird class name characters
136
+ c = c.gsub(/[^a-zA-Z0-9\-_]/, '-')
137
+
138
+ # Class names can't start with a digit
139
+ c = "#{prefix}#{c}" if c =~ /\A\d/
140
+ c
141
+ end.join(' ')
145
142
  end
146
143
 
147
144
  # Get the path of a file of a given type
@@ -36,4 +36,6 @@ Gem::Specification.new do |s|
36
36
 
37
37
  # i18n
38
38
  s.add_dependency("i18n", ["~> 0.6.1"])
39
+
40
+ s.post_install_message = "NOTICE: Middleman v3.2.x and greater no longer support Ruby 1.8"
39
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: middleman-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.6
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Reynolds
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-15 00:00:00.000000000 Z
12
+ date: 2013-11-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -145,6 +145,7 @@ files:
145
145
  - Rakefile
146
146
  - bin/middleman
147
147
  - features/3rd_party_cli.feature
148
+ - features/asciidoc.feature
148
149
  - features/asset_hash.feature
149
150
  - features/asset_host.feature
150
151
  - features/auto_layout.feature
@@ -239,6 +240,19 @@ files:
239
240
  - features/v3_extensions.feature
240
241
  - features/v4_extension_callbacks.feature
241
242
  - features/wildcard_page_helper.feature
243
+ - fixtures/asciidoc-app/config.rb
244
+ - fixtures/asciidoc-app/source/_include.adoc
245
+ - fixtures/asciidoc-app/source/code.adoc
246
+ - fixtures/asciidoc-app/source/custom-attribute.adoc
247
+ - fixtures/asciidoc-app/source/gallery.adoc
248
+ - fixtures/asciidoc-app/source/hello-no-layout.adoc
249
+ - fixtures/asciidoc-app/source/hello-with-front-matter.adoc
250
+ - fixtures/asciidoc-app/source/hello-with-layout.adoc
251
+ - fixtures/asciidoc-app/source/hello-with-title.adoc
252
+ - fixtures/asciidoc-app/source/hello.adoc
253
+ - fixtures/asciidoc-app/source/images/tiger.gif
254
+ - fixtures/asciidoc-app/source/layouts/default.erb
255
+ - fixtures/asciidoc-app/source/master.adoc
242
256
  - fixtures/asset-hash-app/config.rb
243
257
  - fixtures/asset-hash-app/lib/middleware.rb
244
258
  - fixtures/asset-hash-app/source/apple-touch-icon.png
@@ -592,6 +606,7 @@ files:
592
606
  - fixtures/markdown-app/source/index.html.markdown
593
607
  - fixtures/markdown-app/source/lax_spacing.html.markdown
594
608
  - fixtures/markdown-app/source/link.html.markdown
609
+ - fixtures/markdown-app/source/mailto.html.markdown
595
610
  - fixtures/markdown-app/source/no_intra_emphasis.html.markdown
596
611
  - fixtures/markdown-app/source/prettify.html.markdown
597
612
  - fixtures/markdown-app/source/quote.html.markdown
@@ -717,6 +732,9 @@ files:
717
732
  - fixtures/padrino-helpers-app/config.rb
718
733
  - fixtures/padrino-helpers-app/source/former_padrino_test.html.erb
719
734
  - fixtures/page-classes-app/config.rb
735
+ - fixtures/page-classes-app/source/1-folder/1-inside-with-numeric.html.erb
736
+ - fixtures/page-classes-app/source/1-starts-with-numeric.html.erb
737
+ - fixtures/page-classes-app/source/2-starts-with-numeric-custom.html.erb
720
738
  - fixtures/page-classes-app/source/page-classes.html.erb
721
739
  - fixtures/page-classes-app/source/sub1/page-classes.html.erb
722
740
  - fixtures/page-classes-app/source/sub1/sub2/page-classes.html.erb
@@ -956,6 +974,7 @@ files:
956
974
  - lib/middleman-core/meta_pages/templates/sitemap.html.erb
957
975
  - lib/middleman-core/preview_server.rb
958
976
  - lib/middleman-core/profiling.rb
977
+ - lib/middleman-core/renderers/asciidoc.rb
959
978
  - lib/middleman-core/renderers/coffee_script.rb
960
979
  - lib/middleman-core/renderers/erb.rb
961
980
  - lib/middleman-core/renderers/haml.rb
@@ -1348,7 +1367,8 @@ homepage: http://middlemanapp.com
1348
1367
  licenses:
1349
1368
  - MIT
1350
1369
  metadata: {}
1351
- post_install_message:
1370
+ post_install_message: 'NOTICE: Middleman v3.2.x and greater no longer support Ruby
1371
+ 1.8'
1352
1372
  rdoc_options: []
1353
1373
  require_paths:
1354
1374
  - lib
@@ -1364,12 +1384,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1364
1384
  version: '0'
1365
1385
  requirements: []
1366
1386
  rubyforge_project:
1367
- rubygems_version: 2.0.2
1387
+ rubygems_version: 2.0.3
1368
1388
  signing_key:
1369
1389
  specification_version: 4
1370
1390
  summary: Hand-crafted frontend development
1371
1391
  test_files:
1372
1392
  - features/3rd_party_cli.feature
1393
+ - features/asciidoc.feature
1373
1394
  - features/asset_hash.feature
1374
1395
  - features/asset_host.feature
1375
1396
  - features/auto_layout.feature
@@ -1464,6 +1485,19 @@ test_files:
1464
1485
  - features/v3_extensions.feature
1465
1486
  - features/v4_extension_callbacks.feature
1466
1487
  - features/wildcard_page_helper.feature
1488
+ - fixtures/asciidoc-app/config.rb
1489
+ - fixtures/asciidoc-app/source/_include.adoc
1490
+ - fixtures/asciidoc-app/source/code.adoc
1491
+ - fixtures/asciidoc-app/source/custom-attribute.adoc
1492
+ - fixtures/asciidoc-app/source/gallery.adoc
1493
+ - fixtures/asciidoc-app/source/hello-no-layout.adoc
1494
+ - fixtures/asciidoc-app/source/hello-with-front-matter.adoc
1495
+ - fixtures/asciidoc-app/source/hello-with-layout.adoc
1496
+ - fixtures/asciidoc-app/source/hello-with-title.adoc
1497
+ - fixtures/asciidoc-app/source/hello.adoc
1498
+ - fixtures/asciidoc-app/source/images/tiger.gif
1499
+ - fixtures/asciidoc-app/source/layouts/default.erb
1500
+ - fixtures/asciidoc-app/source/master.adoc
1467
1501
  - fixtures/asset-hash-app/config.rb
1468
1502
  - fixtures/asset-hash-app/lib/middleware.rb
1469
1503
  - fixtures/asset-hash-app/source/apple-touch-icon.png
@@ -1817,6 +1851,7 @@ test_files:
1817
1851
  - fixtures/markdown-app/source/index.html.markdown
1818
1852
  - fixtures/markdown-app/source/lax_spacing.html.markdown
1819
1853
  - fixtures/markdown-app/source/link.html.markdown
1854
+ - fixtures/markdown-app/source/mailto.html.markdown
1820
1855
  - fixtures/markdown-app/source/no_intra_emphasis.html.markdown
1821
1856
  - fixtures/markdown-app/source/prettify.html.markdown
1822
1857
  - fixtures/markdown-app/source/quote.html.markdown
@@ -1942,6 +1977,9 @@ test_files:
1942
1977
  - fixtures/padrino-helpers-app/config.rb
1943
1978
  - fixtures/padrino-helpers-app/source/former_padrino_test.html.erb
1944
1979
  - fixtures/page-classes-app/config.rb
1980
+ - fixtures/page-classes-app/source/1-folder/1-inside-with-numeric.html.erb
1981
+ - fixtures/page-classes-app/source/1-starts-with-numeric.html.erb
1982
+ - fixtures/page-classes-app/source/2-starts-with-numeric-custom.html.erb
1945
1983
  - fixtures/page-classes-app/source/page-classes.html.erb
1946
1984
  - fixtures/page-classes-app/source/sub1/page-classes.html.erb
1947
1985
  - fixtures/page-classes-app/source/sub1/sub2/page-classes.html.erb