middleman-core 3.4.1 → 4.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (507) hide show
  1. checksums.yaml +4 -4
  2. data/{fixtures/asciidoc-app/config.rb → .gemtest} +0 -0
  3. data/.yardopts +2 -6
  4. data/Rakefile +5 -1
  5. data/features/asset_hash.feature +32 -61
  6. data/features/asset_host.feature +11 -23
  7. data/features/builder.feature +2 -0
  8. data/features/cache_buster.feature +1 -1
  9. data/features/chained_templates.feature +2 -92
  10. data/features/clean_build.feature +0 -18
  11. data/features/cli_init.feature +17 -111
  12. data/features/content_type.feature +2 -5
  13. data/features/custom_layouts.feature +24 -20
  14. data/features/data.feature +0 -28
  15. data/features/directory_index.feature +9 -9
  16. data/features/front-matter-neighbor.feature +0 -32
  17. data/features/front-matter.feature +0 -17
  18. data/features/helpers_content_tag.feature +2 -2
  19. data/features/helpers_form_tag.feature +4 -4
  20. data/features/helpers_link_to.feature +11 -29
  21. data/features/helpers_url_for.feature +11 -11
  22. data/features/i18n_builder.feature +5 -5
  23. data/features/i18n_preview.feature +8 -8
  24. data/features/markdown_kramdown.feature +1 -1
  25. data/features/markdown_kramdown_in_haml.feature +1 -2
  26. data/features/markdown_redcarpet.feature +23 -23
  27. data/features/minify_css.feature +9 -75
  28. data/features/minify_javascript.feature +12 -65
  29. data/features/mount_rack.feature +2 -4
  30. data/features/multiple-sources.feature +27 -0
  31. data/features/proxy_pages.feature +0 -10
  32. data/features/redirects.feature +6 -7
  33. data/features/relative_assets.feature +21 -66
  34. data/features/slim.feature +11 -7
  35. data/features/stylus.feature +1 -1
  36. data/features/support/env.rb +4 -4
  37. data/fixtures/asset-hash-app/config.rb +0 -2
  38. data/fixtures/asset-hash-app/source/index.html.erb +1 -1
  39. data/fixtures/asset-hash-host-app/config.rb +1 -3
  40. data/fixtures/asset-host-app/source/asset_host.html.erb +20 -1
  41. data/fixtures/asset-host-app/source/stylesheets/asset_host.css.sass +47 -2
  42. data/fixtures/auto-css-app/config.rb +8 -10
  43. data/fixtures/auto-js-app/config.rb +8 -10
  44. data/fixtures/basic-data-app/config.rb +2 -4
  45. data/fixtures/cache-buster-app/source/stylesheets/relative_assets.css.sass +0 -1
  46. data/fixtures/cache-buster-app/source/stylesheets/site.css.sass +3 -1
  47. data/fixtures/capture-html-app/config.rb +3 -5
  48. data/fixtures/clean-app/config-complications.rb +4 -6
  49. data/fixtures/clean-app/config.rb +4 -6
  50. data/fixtures/content-for-app/config.rb +3 -5
  51. data/fixtures/custom-layout-app/config.rb +1 -1
  52. data/fixtures/data-app/config.rb +1 -1
  53. data/fixtures/dynamic-pages-app/config.rb +20 -42
  54. data/fixtures/dynamic-pages-app/source/real/index.html.erb +3 -3
  55. data/fixtures/ember-cli-app/config.rb +5 -0
  56. data/fixtures/{compass-sprites-app/config.rb → ember-cli-app/source/javascripts/file.js} +0 -0
  57. data/fixtures/ember-cli-app/test-app/.bowerrc +3 -0
  58. data/fixtures/ember-cli-app/test-app/.gitignore +17 -0
  59. data/fixtures/ember-cli-app/test-app/.jshintrc +32 -0
  60. data/fixtures/ember-cli-app/test-app/Brocfile.js +20 -0
  61. data/fixtures/ember-cli-app/test-app/README.md +25 -0
  62. data/fixtures/ember-cli-app/test-app/app/app.js +14 -0
  63. data/fixtures/{implied-extensions-app/config.rb → ember-cli-app/test-app/app/components/.gitkeep} +0 -0
  64. data/fixtures/{javascript-app/config.rb → ember-cli-app/test-app/app/controllers/.gitkeep} +0 -0
  65. data/fixtures/{more-implied-extensions-app/config.rb → ember-cli-app/test-app/app/helpers/.gitkeep} +0 -0
  66. data/fixtures/ember-cli-app/test-app/app/index.html +26 -0
  67. data/fixtures/{partial-chained_templates-app/config.rb → ember-cli-app/test-app/app/models/.gitkeep} +0 -0
  68. data/fixtures/ember-cli-app/test-app/app/router.js +10 -0
  69. data/fixtures/{preview-server-app/config-empty.rb → ember-cli-app/test-app/app/routes/.gitkeep} +0 -0
  70. data/fixtures/{request-app/config.rb → ember-cli-app/test-app/app/styles/.gitkeep} +0 -0
  71. data/fixtures/ember-cli-app/test-app/app/styles/app.css +3 -0
  72. data/fixtures/{traversal-app/source/.htaccess → ember-cli-app/test-app/app/templates/.gitkeep} +0 -0
  73. data/fixtures/ember-cli-app/test-app/app/templates/application.hbs +3 -0
  74. data/{lib/middleman-core/templates/html5/source/img/.gitignore → fixtures/ember-cli-app/test-app/app/templates/components/.gitkeep} +0 -0
  75. data/{lib/middleman-core/templates/mobile/source/js/script.js → fixtures/ember-cli-app/test-app/app/views/.gitkeep} +0 -0
  76. data/fixtures/ember-cli-app/test-app/bower.json +16 -0
  77. data/fixtures/ember-cli-app/test-app/config/environment.js +38 -0
  78. data/fixtures/ember-cli-app/test-app/package.json +31 -0
  79. data/fixtures/ember-cli-app/test-app/public/.gitkeep +0 -0
  80. data/fixtures/ember-cli-app/test-app/testem.json +6 -0
  81. data/fixtures/ember-cli-app/test-app/tests/.jshintrc +73 -0
  82. data/fixtures/ember-cli-app/test-app/tests/helpers/resolver.js +9 -0
  83. data/fixtures/ember-cli-app/test-app/tests/helpers/start-app.js +30 -0
  84. data/fixtures/ember-cli-app/test-app/tests/index.html +50 -0
  85. data/fixtures/ember-cli-app/test-app/tests/test-helper.js +6 -0
  86. data/fixtures/ember-cli-app/test-app/tests/unit/.gitkeep +0 -0
  87. data/fixtures/env-app/config.rb +0 -0
  88. data/fixtures/env-app/environments/development.rb +1 -0
  89. data/fixtures/env-app/environments/production.rb +2 -0
  90. data/fixtures/env-app/source/index.html.erb +3 -0
  91. data/fixtures/env-app/source/stylesheets/site.css.scss +3 -0
  92. data/fixtures/external-helpers/config.rb +1 -1
  93. data/fixtures/feature-params-app/config.rb +10 -6
  94. data/fixtures/feature-params-app/source/index.html.erb +2 -3
  95. data/fixtures/fonts-app/source/stylesheets/fonts.css.scss +6 -0
  96. data/fixtures/frontmatter-neighbor-app/config.rb +30 -0
  97. data/fixtures/frontmatter-settings-app/config.rb +2 -2
  98. data/fixtures/frontmatter-settings-neighbor-app/config.rb +33 -3
  99. data/fixtures/generator-test/config.rb +5 -10
  100. data/fixtures/glob-app/config.rb +1 -1
  101. data/fixtures/i18n-force-locale/config.rb +2 -4
  102. data/fixtures/i18n-force-locale/source/{index.haml → index.html.haml} +0 -0
  103. data/fixtures/i18n-test-app/source/localizable/{one.en.md → one.en.html.md} +0 -0
  104. data/fixtures/i18n-test-app/source/localizable/{one.es.md → one.es.html.md} +0 -0
  105. data/fixtures/indexable-app/config.rb +2 -2
  106. data/fixtures/indexable-app/source/evil spaces.html +1 -1
  107. data/fixtures/large-build-app/config.rb +1 -5
  108. data/fixtures/large-build-app/source/spaces in file.html.erb +1 -1
  109. data/fixtures/manual-layout-override/config.rb +1 -1
  110. data/fixtures/markdown-app/config.rb +1 -1
  111. data/fixtures/markdown-frontmatter-options-app/config.rb +1 -1
  112. data/fixtures/minify-css-app/source/stylesheets/site.css.sass +3 -1
  113. data/fixtures/more-frontmatter-settings-app/config.rb +1 -1
  114. data/fixtures/more-markdown-app/source/{with_layout.markdown → with_layout.html.markdown} +0 -0
  115. data/fixtures/more-markdown-app/source/{with_layout_erb.markdown.erb → with_layout_erb.html.markdown.erb} +0 -0
  116. data/fixtures/more-traversal-app/config.rb +4 -4
  117. data/fixtures/more-traversal-app/source/layout.erb +1 -1
  118. data/fixtures/multiple-data-sources-app/config.rb +3 -0
  119. data/fixtures/multiple-data-sources-app/data/data.yml +1 -0
  120. data/fixtures/multiple-data-sources-app/data/two.yml +1 -0
  121. data/fixtures/multiple-data-sources-app/data0/one.yml +1 -0
  122. data/fixtures/multiple-data-sources-app/data1/data1.yml +1 -0
  123. data/fixtures/multiple-data-sources-app/data1/one.yml +1 -0
  124. data/fixtures/multiple-data-sources-app/data2/data2.yml +1 -0
  125. data/fixtures/multiple-data-sources-app/data2/two.yml +1 -0
  126. data/fixtures/multiple-data-sources-app/source/index.html.erb +10 -0
  127. data/fixtures/multiple-sources-app/config.rb +3 -0
  128. data/fixtures/multiple-sources-app/source/index.html.erb +1 -0
  129. data/fixtures/multiple-sources-app/source/override-in-two.html.erb +1 -0
  130. data/fixtures/multiple-sources-app/source0/override-in-one.html.erb +1 -0
  131. data/fixtures/multiple-sources-app/source1/index1.html.erb +1 -0
  132. data/fixtures/multiple-sources-app/source1/override-in-one.html.erb +1 -0
  133. data/fixtures/multiple-sources-app/source2/index2.html.erb +1 -0
  134. data/fixtures/multiple-sources-app/source2/override-in-two.html.erb +1 -0
  135. data/fixtures/padrino-helpers-app/source/former_padrino_test.html.erb +3 -3
  136. data/fixtures/page-classes-app/config.rb +2 -4
  137. data/fixtures/page-classes-app/source/2-starts-with-numeric-custom.html.erb +1 -1
  138. data/fixtures/page-helper-layout-block-app/config.rb +1 -1
  139. data/fixtures/partials-app/source/locals.html.erb +1 -1
  140. data/fixtures/partials-app/source/shared/{snippet.erb → _snippet.html.erb} +0 -0
  141. data/fixtures/partials-app/source/sub/index.html.erb +1 -1
  142. data/fixtures/passthrough-app/source/stylesheets/site.css.sass +5 -1
  143. data/fixtures/proxy-pages-app/config.rb +12 -15
  144. data/fixtures/relative-app/source/stylesheets/relative_assets.css.sass +1 -2
  145. data/fixtures/relative-assets-app/source/javascripts/application.js +8 -0
  146. data/fixtures/relative-assets-app/source/relative_image.html.erb +0 -1
  147. data/fixtures/relative-assets-app/source/stylesheets/relative_assets.css.sass +1 -2
  148. data/fixtures/scss-app/source/stylesheets/site_scss.css.scss +3 -1
  149. data/fixtures/stylus-preview-app/source/content.html.erb +4 -0
  150. data/fixtures/traversal-app/config.rb +4 -4
  151. data/fixtures/traversal-app/source/layout.erb +1 -1
  152. data/fixtures/v4-extension-callbacks/config.rb +21 -5
  153. data/fixtures/wildcard-app/config.rb +1 -1
  154. data/fixtures/wildcard-directory-index-app/config.rb +1 -1
  155. data/lib/middleman-core.rb +5 -2
  156. data/lib/middleman-core/application.rb +212 -131
  157. data/lib/middleman-core/builder.rb +255 -0
  158. data/lib/middleman-core/config_context.rb +103 -0
  159. data/lib/middleman-core/configuration.rb +15 -92
  160. data/lib/middleman-core/contracts.rb +149 -0
  161. data/lib/middleman-core/core_extensions.rb +86 -45
  162. data/lib/middleman-core/core_extensions/data.rb +82 -72
  163. data/lib/{middleman-more → middleman-core}/core_extensions/default_helpers.rb +34 -140
  164. data/lib/middleman-core/core_extensions/external_helpers.rb +23 -27
  165. data/lib/middleman-core/core_extensions/file_watcher.rb +59 -169
  166. data/lib/middleman-core/core_extensions/front_matter.rb +72 -131
  167. data/lib/middleman-core/core_extensions/i18n.rb +186 -0
  168. data/lib/middleman-core/core_extensions/rendering.rb +45 -533
  169. data/lib/middleman-core/core_extensions/routing.rb +53 -51
  170. data/lib/middleman-core/core_extensions/show_exceptions.rb +11 -18
  171. data/lib/middleman-core/extension.rb +183 -56
  172. data/lib/middleman-core/extension_manager.rb +80 -0
  173. data/lib/middleman-core/extensions.rb +96 -67
  174. data/lib/middleman-core/extensions/asset_hash.rb +92 -0
  175. data/lib/middleman-core/extensions/asset_host.rb +37 -0
  176. data/lib/{middleman-more → middleman-core}/extensions/automatic_alt_tags.rb +6 -5
  177. data/lib/{middleman-more → middleman-core}/extensions/automatic_image_sizes.rb +9 -13
  178. data/lib/middleman-core/extensions/cache_buster.rb +27 -0
  179. data/lib/{middleman-more → middleman-core}/extensions/directory_indexes.rb +9 -7
  180. data/lib/middleman-core/extensions/external_pipeline.rb +37 -0
  181. data/lib/{middleman-more → middleman-core}/extensions/gzip.rb +10 -3
  182. data/lib/{middleman-more → middleman-core}/extensions/lorem.rb +2 -2
  183. data/lib/middleman-core/extensions/minify_css.rb +86 -0
  184. data/lib/middleman-core/extensions/minify_javascript.rb +93 -0
  185. data/lib/middleman-core/extensions/relative_assets.rb +38 -0
  186. data/lib/middleman-core/file_renderer.rb +139 -0
  187. data/lib/middleman-core/load_paths.rb +21 -28
  188. data/lib/middleman-core/meta_pages.rb +9 -9
  189. data/lib/middleman-core/meta_pages/sitemap_resource.rb +3 -6
  190. data/lib/middleman-core/meta_pages/sitemap_tree.rb +1 -1
  191. data/lib/middleman-core/middleware/inline_url_rewriter.rb +96 -0
  192. data/lib/middleman-core/preview_server.rb +65 -196
  193. data/lib/middleman-core/profiling.rb +14 -15
  194. data/lib/middleman-core/rack.rb +138 -0
  195. data/lib/middleman-core/renderers/coffee_script.rb +10 -13
  196. data/lib/middleman-core/renderers/erb.rb +3 -15
  197. data/lib/middleman-core/renderers/haml.rb +33 -18
  198. data/lib/middleman-core/renderers/kramdown.rb +6 -4
  199. data/lib/middleman-core/renderers/less.rb +12 -18
  200. data/lib/middleman-core/renderers/liquid.rb +22 -18
  201. data/lib/middleman-core/renderers/markdown.rb +36 -49
  202. data/lib/middleman-core/renderers/redcarpet.rb +11 -4
  203. data/lib/middleman-core/renderers/sass.rb +36 -27
  204. data/lib/middleman-core/renderers/sass_functions.rb +116 -0
  205. data/lib/middleman-core/renderers/slim.rb +19 -26
  206. data/lib/middleman-core/renderers/stylus.rb +4 -14
  207. data/lib/middleman-core/sitemap/extensions/ignores.rb +35 -73
  208. data/lib/middleman-core/sitemap/extensions/on_disk.rb +29 -48
  209. data/lib/middleman-core/sitemap/extensions/proxies.rb +111 -133
  210. data/lib/middleman-core/sitemap/extensions/redirects.rb +68 -102
  211. data/lib/middleman-core/sitemap/extensions/request_endpoints.rb +59 -83
  212. data/lib/middleman-core/sitemap/extensions/traversal.rb +14 -15
  213. data/lib/middleman-core/sitemap/resource.rb +99 -71
  214. data/lib/middleman-core/sitemap/store.rb +79 -132
  215. data/lib/middleman-core/sources.rb +310 -0
  216. data/lib/middleman-core/sources/source_watcher.rb +268 -0
  217. data/lib/middleman-core/step_definitions.rb +2 -3
  218. data/lib/middleman-core/step_definitions/builder_steps.rb +15 -13
  219. data/lib/middleman-core/step_definitions/middleman_steps.rb +2 -18
  220. data/lib/middleman-core/step_definitions/server_steps.rb +43 -77
  221. data/lib/middleman-core/template_context.rb +181 -0
  222. data/lib/middleman-core/template_renderer.rb +213 -0
  223. data/lib/middleman-core/util.rb +319 -241
  224. data/lib/middleman-core/util/hash_with_indifferent_access.rb +103 -0
  225. data/lib/middleman-core/version.rb +1 -1
  226. data/lib/middleman/rack.rb +0 -1
  227. data/middleman-core.gemspec +36 -28
  228. data/spec/middleman-core/path_match_spec.rb +37 -0
  229. data/spec/spec_helper.rb +2 -25
  230. metadata +237 -454
  231. data/bin/middleman +0 -18
  232. data/cucumber.yml +0 -2
  233. data/features/asciidoc.feature +0 -155
  234. data/features/cli/preview_server-hook.feature +0 -17
  235. data/features/cli/preview_server.feature +0 -532
  236. data/features/compass-sprites.feature +0 -6
  237. data/features/console.feature +0 -10
  238. data/features/current_page_request_path_backwards.feature +0 -6
  239. data/features/fonts.feature +0 -15
  240. data/features/i18n_link_to.feature +0 -209
  241. data/features/image_srcset_paths.feature +0 -7
  242. data/features/implied_extensions.feature +0 -69
  243. data/features/instance_vars.feature +0 -9
  244. data/features/javascript-testing.feature +0 -18
  245. data/features/more-implied_extensions.feature +0 -44
  246. data/features/partials_dir.feature +0 -30
  247. data/features/queryable.feature +0 -35
  248. data/features/request_params.feature +0 -6
  249. data/features/static_server.feature +0 -6
  250. data/features/step_definitions/page_layout_steps.rb +0 -15
  251. data/features/step_definitions/queryable_steps.rb +0 -212
  252. data/features/support/preserve_mime_types.rb +0 -7
  253. data/features/v3_extensions.feature +0 -20
  254. data/features/working_directory.feature +0 -33
  255. data/fixtures/asciidoc-app/source/_include.adoc +0 -1
  256. data/fixtures/asciidoc-app/source/code.adoc +0 -3
  257. data/fixtures/asciidoc-app/source/custom-attribute.adoc +0 -3
  258. data/fixtures/asciidoc-app/source/gallery.adoc +0 -1
  259. data/fixtures/asciidoc-app/source/hello-no-layout.adoc +0 -2
  260. data/fixtures/asciidoc-app/source/hello-with-front-matter.adoc +0 -5
  261. data/fixtures/asciidoc-app/source/hello-with-layout.adoc +0 -2
  262. data/fixtures/asciidoc-app/source/hello-with-title.adoc +0 -5
  263. data/fixtures/asciidoc-app/source/hello.adoc +0 -4
  264. data/fixtures/asciidoc-app/source/images/tiger.gif +0 -0
  265. data/fixtures/asciidoc-app/source/layouts/default.erb +0 -9
  266. data/fixtures/asciidoc-app/source/master.adoc +0 -3
  267. data/fixtures/asset-hash-app/source/api.json.erb +0 -1
  268. data/fixtures/asset-hash-app/source/fonts/fontawesome-webfont.woff +0 -0
  269. data/fixtures/asset-hash-app/source/fonts/fontawesome-webfont.woff2 +0 -0
  270. data/fixtures/asset-hash-app/source/images/200px.jpg +0 -0
  271. data/fixtures/asset-hash-app/source/images/300px.jpg +0 -0
  272. data/fixtures/asset-hash-app/source/slim.html.slim +0 -8
  273. data/fixtures/asset-hash-app/source/stylesheets/uses_fonts.css +0 -4
  274. data/fixtures/asset-hash-app/source/subdir/api.json.erb +0 -1
  275. data/fixtures/chained-app/source/test.erb.combobreaker.str.erb +0 -8
  276. data/fixtures/clean-app/config-hidden-dir-after.rb +0 -5
  277. data/fixtures/clean-app/config-hidden-dir-before.rb +0 -1
  278. data/fixtures/compass-sprites-app/source/images/icon/arrow_down.png +0 -0
  279. data/fixtures/compass-sprites-app/source/images/icon/arrow_left.png +0 -0
  280. data/fixtures/compass-sprites-app/source/images/icon/arrow_right.png +0 -0
  281. data/fixtures/compass-sprites-app/source/images/icon/arrow_up.png +0 -0
  282. data/fixtures/compass-sprites-app/source/stylesheets/site.css.scss +0 -3
  283. data/fixtures/content-type-app/source/index.php +0 -1
  284. data/fixtures/current-page-app/config.rb +0 -3
  285. data/fixtures/current-page-app/source/request-path.html.erb +0 -1
  286. data/fixtures/default-partials-dir-app/source/_partial.html.erb +0 -1
  287. data/fixtures/default-partials-dir-app/source/index.html.erb +0 -2
  288. data/fixtures/fonts-app/source/stylesheets/fonts.css.sass +0 -5
  289. data/fixtures/frontmatter-app/source/front-matter-auto.erb +0 -6
  290. data/fixtures/frontmatter-app/source/front-matter-pandoc.html.md.erb +0 -13
  291. data/fixtures/frontmatter-app/source/json-front-matter-auto.erb +0 -6
  292. data/fixtures/frontmatter-neighbor-app/source/front-matter-auto.erb +0 -1
  293. data/fixtures/frontmatter-neighbor-app/source/front-matter-auto.erb.frontmatter +0 -4
  294. data/fixtures/frontmatter-neighbor-app/source/json-front-matter-auto.erb +0 -1
  295. data/fixtures/frontmatter-neighbor-app/source/json-front-matter-auto.erb.frontmatter +0 -4
  296. data/fixtures/image-srcset-paths-app/image-srcset-paths.html.erb +0 -1
  297. data/fixtures/image-srcset-paths-app/images/blank.gif +0 -0
  298. data/fixtures/implied-extensions-app/source/index.erb +0 -1
  299. data/fixtures/instance-vars-app/config.rb +0 -7
  300. data/fixtures/instance-vars-app/source/content.html.erb +0 -2
  301. data/fixtures/instance-vars-app/source/layout.erb +0 -1
  302. data/fixtures/javascript-app/source/index.html +0 -17
  303. data/fixtures/minify-css-app/source/inline-css.php +0 -8
  304. data/fixtures/minify-css-app/source/stylesheets/site.xcss.sass +0 -5
  305. data/fixtures/minify-js-app/source/inline-js.php +0 -22
  306. data/fixtures/minify-js-app/source/javascripts/js_test.xjs +0 -8
  307. data/fixtures/more-implied-extensions-app/source/javascripts/app.coffee +0 -1
  308. data/fixtures/more-implied-extensions-app/source/layouts/layout.erb +0 -3
  309. data/fixtures/more-implied-extensions-app/source/stylesheets/style.scss +0 -3
  310. data/fixtures/more-implied-extensions-app/source/stylesheets/style2.sass +0 -3
  311. data/fixtures/more-implied-extensions-app/source/test.haml +0 -4
  312. data/fixtures/more-implied-extensions-app/source/test2.markdown +0 -3
  313. data/fixtures/more-implied-extensions-app/source/test3.slim +0 -3
  314. data/fixtures/more-implied-extensions-app/source/test4.liquid +0 -1
  315. data/fixtures/partials-dir-app/source/index.html.erb +0 -2
  316. data/fixtures/partials-dir-app/source/nested/partials/_partial.html.erb +0 -1
  317. data/fixtures/partials-dir-app/source/partials/_partial.html.erb +0 -1
  318. data/fixtures/plain-app/index.html +0 -1
  319. data/fixtures/preview-server-app/bin/dns_server.rb +0 -33
  320. data/fixtures/preview-server-app/config-complications.rb +0 -11
  321. data/fixtures/preview-server-app/config.rb +0 -11
  322. data/fixtures/preview-server-app/source/index.html.erb +0 -1
  323. data/fixtures/preview-server-app/source/layout.erb +0 -9
  324. data/fixtures/preview-server-app/source/layouts/custom.erb +0 -8
  325. data/fixtures/preview-server-app/source/real.html +0 -1
  326. data/fixtures/preview-server-app/source/real/index.html.erb +0 -5
  327. data/fixtures/preview-server-app/source/should_be_ignored.html +0 -1
  328. data/fixtures/preview-server-app/source/should_be_ignored2.html +0 -1
  329. data/fixtures/preview-server-app/source/should_be_ignored3.html +0 -1
  330. data/fixtures/preview-server-app/source/static.html +0 -1
  331. data/fixtures/preview-server-hook-app/config.rb +0 -19
  332. data/fixtures/preview-server-hook-app/source/index.html.erb +0 -9
  333. data/fixtures/proxy-pages-app/source/real/index-ivars.html.erb +0 -6
  334. data/fixtures/relative-assets-app/source/absolute_image_relative_css.html.erb +0 -9
  335. data/fixtures/relative-assets-app/source/javascripts/app.js +0 -3
  336. data/fixtures/relative-assets-app/source/relative_image_absolute_css.html.erb +0 -9
  337. data/fixtures/request-app/source/index.html.erb +0 -3
  338. data/fixtures/stylus-preview-app/source/layout.erb +0 -1
  339. data/lib/middleman-core/cli.rb +0 -88
  340. data/lib/middleman-core/cli/build.rb +0 -300
  341. data/lib/middleman-core/cli/bundler.rb +0 -39
  342. data/lib/middleman-core/cli/console.rb +0 -52
  343. data/lib/middleman-core/cli/extension.rb +0 -47
  344. data/lib/middleman-core/cli/init.rb +0 -71
  345. data/lib/middleman-core/cli/server.rb +0 -99
  346. data/lib/middleman-core/core_extensions/data/file_loader.rb +0 -71
  347. data/lib/middleman-core/core_extensions/extensions.rb +0 -197
  348. data/lib/middleman-core/core_extensions/request.rb +0 -312
  349. data/lib/middleman-core/dns_resolver.rb +0 -73
  350. data/lib/middleman-core/dns_resolver/basic_network_resolver.rb +0 -52
  351. data/lib/middleman-core/dns_resolver/hosts_resolver.rb +0 -63
  352. data/lib/middleman-core/dns_resolver/local_link_resolver.rb +0 -44
  353. data/lib/middleman-core/dns_resolver/network_resolver.rb +0 -42
  354. data/lib/middleman-core/preview_server/checks.rb +0 -81
  355. data/lib/middleman-core/preview_server/information.rb +0 -273
  356. data/lib/middleman-core/preview_server/network_interface_inventory.rb +0 -65
  357. data/lib/middleman-core/preview_server/server_hostname.rb +0 -39
  358. data/lib/middleman-core/preview_server/server_information.rb +0 -153
  359. data/lib/middleman-core/preview_server/server_information_callback_proxy.rb +0 -35
  360. data/lib/middleman-core/preview_server/server_information_validator.rb +0 -18
  361. data/lib/middleman-core/preview_server/server_ip_address.rb +0 -55
  362. data/lib/middleman-core/preview_server/server_url.rb +0 -63
  363. data/lib/middleman-core/preview_server/tcp_port_prober.rb +0 -29
  364. data/lib/middleman-core/renderers/asciidoc.rb +0 -58
  365. data/lib/middleman-core/sitemap.rb +0 -76
  366. data/lib/middleman-core/sitemap/extensions/content_type.rb +0 -16
  367. data/lib/middleman-core/sitemap/queryable.rb +0 -151
  368. data/lib/middleman-core/step_definitions/commandline_steps.rb +0 -88
  369. data/lib/middleman-core/templates.rb +0 -101
  370. data/lib/middleman-core/templates/default.rb +0 -37
  371. data/lib/middleman-core/templates/default/source/images/background.png +0 -0
  372. data/lib/middleman-core/templates/default/source/images/middleman.png +0 -0
  373. data/lib/middleman-core/templates/default/source/index.html.erb +0 -10
  374. data/lib/middleman-core/templates/default/source/javascripts/all.js +0 -1
  375. data/lib/middleman-core/templates/default/source/layouts/layout.erb +0 -19
  376. data/lib/middleman-core/templates/default/source/stylesheets/all.css +0 -55
  377. data/lib/middleman-core/templates/default/source/stylesheets/normalize.css +0 -375
  378. data/lib/middleman-core/templates/empty.rb +0 -22
  379. data/lib/middleman-core/templates/empty/Gemfile.tt +0 -6
  380. data/lib/middleman-core/templates/extension/Gemfile +0 -18
  381. data/lib/middleman-core/templates/extension/Rakefile +0 -14
  382. data/lib/middleman-core/templates/extension/features/support/env.rb +0 -4
  383. data/lib/middleman-core/templates/extension/gemspec +0 -24
  384. data/lib/middleman-core/templates/extension/gitignore +0 -5
  385. data/lib/middleman-core/templates/extension/lib/lib.rb +0 -38
  386. data/lib/middleman-core/templates/extension/lib/middleman_extension.rb +0 -1
  387. data/lib/middleman-core/templates/html5.rb +0 -29
  388. data/lib/middleman-core/templates/html5/source/.htaccess +0 -542
  389. data/lib/middleman-core/templates/html5/source/404.html +0 -157
  390. data/lib/middleman-core/templates/html5/source/LICENSE.md +0 -19
  391. data/lib/middleman-core/templates/html5/source/README.md +0 -63
  392. data/lib/middleman-core/templates/html5/source/apple-touch-icon-114x114-precomposed.png +0 -0
  393. data/lib/middleman-core/templates/html5/source/apple-touch-icon-144x144-precomposed.png +0 -0
  394. data/lib/middleman-core/templates/html5/source/apple-touch-icon-57x57-precomposed.png +0 -0
  395. data/lib/middleman-core/templates/html5/source/apple-touch-icon-72x72-precomposed.png +0 -0
  396. data/lib/middleman-core/templates/html5/source/apple-touch-icon-precomposed.png +0 -0
  397. data/lib/middleman-core/templates/html5/source/apple-touch-icon.png +0 -0
  398. data/lib/middleman-core/templates/html5/source/crossdomain.xml +0 -15
  399. data/lib/middleman-core/templates/html5/source/css/main.css +0 -298
  400. data/lib/middleman-core/templates/html5/source/css/normalize.css +0 -504
  401. data/lib/middleman-core/templates/html5/source/favicon.ico +0 -0
  402. data/lib/middleman-core/templates/html5/source/humans.txt +0 -15
  403. data/lib/middleman-core/templates/html5/source/index.html.erb +0 -6
  404. data/lib/middleman-core/templates/html5/source/js/main.js +0 -1
  405. data/lib/middleman-core/templates/html5/source/js/plugins.js +0 -14
  406. data/lib/middleman-core/templates/html5/source/js/vendor/jquery-1.8.0.min.js +0 -2
  407. data/lib/middleman-core/templates/html5/source/js/vendor/modernizr-2.6.1.min.js +0 -4
  408. data/lib/middleman-core/templates/html5/source/layouts/layout.erb +0 -40
  409. data/lib/middleman-core/templates/html5/source/robots.txt +0 -3
  410. data/lib/middleman-core/templates/local.rb +0 -27
  411. data/lib/middleman-core/templates/mobile.rb +0 -24
  412. data/lib/middleman-core/templates/mobile/source/404.html +0 -37
  413. data/lib/middleman-core/templates/mobile/source/README.markdown +0 -21
  414. data/lib/middleman-core/templates/mobile/source/crossdomain.xml +0 -25
  415. data/lib/middleman-core/templates/mobile/source/css/style.css +0 -315
  416. data/lib/middleman-core/templates/mobile/source/humans.txt +0 -43
  417. data/lib/middleman-core/templates/mobile/source/img/h/apple-touch-icon.png +0 -0
  418. data/lib/middleman-core/templates/mobile/source/img/h/splash.png +0 -0
  419. data/lib/middleman-core/templates/mobile/source/img/l/apple-touch-icon-precomposed.png +0 -0
  420. data/lib/middleman-core/templates/mobile/source/img/l/apple-touch-icon.png +0 -0
  421. data/lib/middleman-core/templates/mobile/source/img/l/splash.png +0 -0
  422. data/lib/middleman-core/templates/mobile/source/img/m/apple-touch-icon.png +0 -0
  423. data/lib/middleman-core/templates/mobile/source/index.html +0 -92
  424. data/lib/middleman-core/templates/mobile/source/js/libs/modernizr-custom.js +0 -14
  425. data/lib/middleman-core/templates/mobile/source/js/libs/respond.min.js +0 -7
  426. data/lib/middleman-core/templates/mobile/source/js/mylibs/helper.js +0 -171
  427. data/lib/middleman-core/templates/mobile/source/js/plugins.js +0 -20
  428. data/lib/middleman-core/templates/mobile/source/robots.txt +0 -4
  429. data/lib/middleman-core/templates/mobile/source/sitemap.xml +0 -9
  430. data/lib/middleman-core/templates/mobile/source/test/index.html +0 -31
  431. data/lib/middleman-core/templates/mobile/source/test/qunit/qunit.css +0 -148
  432. data/lib/middleman-core/templates/mobile/source/test/qunit/qunit.js +0 -1265
  433. data/lib/middleman-core/templates/mobile/source/test/tests.js +0 -21
  434. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/Readme.PDF +0 -0
  435. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/aspx/aspx1.snippet +0 -31
  436. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/aspx/aspx2.snippet +0 -2
  437. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/aspx/ga.aspx +0 -195
  438. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/aspx/sample.aspx +0 -44
  439. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/jsp/ga.jsp +0 -225
  440. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/jsp/jsp1.snippet +0 -35
  441. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/jsp/jsp2.snippet +0 -2
  442. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/jsp/sample.jsp +0 -51
  443. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/php/ga.php +0 -176
  444. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/php/php1.snippet +0 -30
  445. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/php/php2.snippet +0 -4
  446. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/php/sample.php +0 -44
  447. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/pl/ga.pl +0 -195
  448. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/pl/perl1.snippet +0 -27
  449. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/pl/perl2.snippet +0 -1
  450. data/lib/middleman-core/templates/mobile/source/tools/googleanalyticsformobile/pl/sample.pl +0 -38
  451. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/COPYING +0 -202
  452. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/bookmark_bubble.js +0 -559
  453. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/example/example.html +0 -43
  454. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/example/example.js +0 -57
  455. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/images/arrow.png +0 -0
  456. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/images/close.png +0 -0
  457. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/images/generate_base64_images +0 -33
  458. data/lib/middleman-core/templates/mobile/source/tools/mobile-bookmark-bubble/images/icon_calendar.png +0 -0
  459. data/lib/middleman-core/templates/mobile/source/tools/wspl/README +0 -27
  460. data/lib/middleman-core/templates/mobile/source/tools/wspl/databasefactory.js +0 -45
  461. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbworker.js +0 -324
  462. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbworker_test.html +0 -393
  463. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbworkerstarter.js +0 -32
  464. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapper_gears.js +0 -595
  465. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapper_gears_test.html +0 -404
  466. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapper_html5.js +0 -203
  467. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapper_html5_test.html +0 -468
  468. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapperapi.js +0 -202
  469. data/lib/middleman-core/templates/mobile/source/tools/wspl/dbwrapperapi_test.html +0 -51
  470. data/lib/middleman-core/templates/mobile/source/tools/wspl/gears_resultset.js +0 -71
  471. data/lib/middleman-core/templates/mobile/source/tools/wspl/gears_resultset_test.html +0 -86
  472. data/lib/middleman-core/templates/mobile/source/tools/wspl/gears_transaction.js +0 -196
  473. data/lib/middleman-core/templates/mobile/source/tools/wspl/gears_transaction_test.html +0 -221
  474. data/lib/middleman-core/templates/mobile/source/tools/wspl/gearsutils.js +0 -94
  475. data/lib/middleman-core/templates/mobile/source/tools/wspl/gearsutils_test.html +0 -84
  476. data/lib/middleman-core/templates/mobile/source/tools/wspl/global_functions.js +0 -72
  477. data/lib/middleman-core/templates/mobile/source/tools/wspl/simplenotes/index.html +0 -347
  478. data/lib/middleman-core/templates/mobile/source/tools/wspl/simplenotes/simplenotes.js +0 -503
  479. data/lib/middleman-core/templates/mobile/source/tools/wspl/simplenotes/styles.css +0 -66
  480. data/lib/middleman-core/templates/mobile/source/tools/wspl/simplenotes/template.js +0 -75
  481. data/lib/middleman-core/templates/shared/Gemfile.tt +0 -14
  482. data/lib/middleman-core/templates/shared/config.ru +0 -3
  483. data/lib/middleman-core/templates/shared/config.tt +0 -87
  484. data/lib/middleman-core/templates/shared/gitignore +0 -21
  485. data/lib/middleman-more/core_extensions/compass.rb +0 -75
  486. data/lib/middleman-more/core_extensions/i18n.rb +0 -312
  487. data/lib/middleman-more/extensions/asset_hash.rb +0 -128
  488. data/lib/middleman-more/extensions/asset_host.rb +0 -50
  489. data/lib/middleman-more/extensions/cache_buster.rb +0 -55
  490. data/lib/middleman-more/extensions/minify_css.rb +0 -112
  491. data/lib/middleman-more/extensions/minify_javascript.rb +0 -120
  492. data/lib/middleman-more/extensions/relative_assets.rb +0 -24
  493. data/lib/middleman-more/templates/smacss.rb +0 -29
  494. data/lib/middleman-more/templates/smacss/source/_footer.haml +0 -1
  495. data/lib/middleman-more/templates/smacss/source/index.html.haml +0 -1
  496. data/lib/middleman-more/templates/smacss/source/layouts/layout.haml +0 -13
  497. data/lib/middleman-more/templates/smacss/source/stylesheets/base/README.markdown +0 -11
  498. data/lib/middleman-more/templates/smacss/source/stylesheets/base/base.scss +0 -1
  499. data/lib/middleman-more/templates/smacss/source/stylesheets/base/normalize.scss +0 -375
  500. data/lib/middleman-more/templates/smacss/source/stylesheets/layout/README.markdown +0 -9
  501. data/lib/middleman-more/templates/smacss/source/stylesheets/modules/README.markdown +0 -9
  502. data/lib/middleman-more/templates/smacss/source/stylesheets/states/README.markdown +0 -12
  503. data/lib/middleman-more/templates/smacss/source/stylesheets/style.css.scss +0 -12
  504. data/lib/vendored-middleman-deps/fastimage.rb +0 -287
  505. data/spec/middleman-core/dns_resolver_spec.rb +0 -118
  506. data/spec/middleman-core/preview_server/server_hostname_spec.rb +0 -39
  507. data/spec/middleman-core/preview_server/server_ip_address_spec.rb +0 -43
@@ -1,70 +1,72 @@
1
1
  # Routing extension
2
2
  module Middleman
3
3
  module CoreExtensions
4
- module Routing
5
- # Takes a block which allows many pages to have the same layout
6
- #
7
- # with_layout :admin do
8
- # page "/admin/"
9
- # page "/admin/login.html"
10
- # end
11
- #
12
- # @param [String, Symbol] layout_name
13
- # @return [void]
14
- def with_layout(layout_name, &block)
15
- old_layout = config[:layout]
4
+ class Routing < Extension
5
+ # This should always run late, but not as late as :directory_indexes,
6
+ # so it can add metadata to any pages generated by other extensions
7
+ self.resource_list_manipulator_priority = 80
16
8
 
17
- config[:layout] = layout_name
18
- instance_exec(&block) if block_given?
19
- ensure
20
- config[:layout] = old_layout
9
+ def initialize(app, options_hash={}, &block)
10
+ super
11
+
12
+ @page_configs = Set.new
21
13
  end
22
14
 
23
- # The page method allows the layout to be set on a specific path
15
+ def before_configuration
16
+ app.add_to_config_context(:page, &method(:page))
17
+ end
18
+
19
+ # @return Array<Middleman::Sitemap::Resource>
20
+ Contract ResourceList => ResourceList
21
+ def manipulate_resource_list(resources)
22
+ resources.each do |resource|
23
+ @page_configs.each do |p|
24
+ resource.add_metadata(p[:metadata]) if Middleman::Util.path_match(p[:path], "/#{resource.path}")
25
+ end
26
+ end
27
+ end
28
+
29
+ PageDescriptor = Struct.new(:path, :metadata)
30
+
31
+ # The page method allows options to be set for a given source path, regex, or glob.
32
+ # Options that may be set include layout, locals, proxy, andx ignore.
24
33
  #
25
- # page "/about.html", :layout => false
26
- # page "/", :layout => :homepage_layout
34
+ # @example
35
+ # page '/about.html', layout: false
36
+ # @example
37
+ # page '/index.html', layout: :homepage_layout
38
+ # @example
39
+ # page '/foo.html', locals: { foo: 'bar' }
27
40
  #
28
- # @param [String] url
29
- # @param [Hash] opts
41
+ # @param [String, Regexp] path A source path, or a Regexp/glob that can match multiple resources.
42
+ # @params [Hash] opts Options to apply to all matching resources. Undocumented options are passed on as page metadata to be used by extensions.
43
+ # @option opts [Symbol, Boolean, String] layout The layout name to use (e.g. `:article`) or `false` to disable layout.
44
+ # @option opts [Boolean] directory_indexes Whether or not the `:directory_indexes` extension applies to these paths.
45
+ # @option opts [Hash] locals Local variables for the template. These will be available when the template renders.
46
+ # @option opts [Hash] data Extra metadata to add to the page. This is the same as frontmatter, though frontmatter will take precedence over metadata defined here. Available via {Resource#data}.
30
47
  # @return [void]
31
- def page(url, opts={}, &block)
32
- blocks = Array(block)
48
+ Contract String, Hash => Any
49
+ def page(path, opts={})
50
+ options = opts.dup
33
51
 
34
52
  # Default layout
35
- opts[:layout] = config[:layout] if opts[:layout].nil?
53
+ metadata = {
54
+ options: options,
55
+ locals: options.delete(:locals) || {},
56
+ page: options.delete(:data) || {}
57
+ }
36
58
 
37
- # If the url is a regexp
38
- if url.is_a?(Regexp) || url.include?('*')
39
-
40
- # Use the metadata loop for matching against paths at runtime
41
- sitemap.provides_metadata_for_path(url) do |_|
42
- { options: opts, blocks: blocks }
59
+ if path.is_a?(String) && !path.include?('*')
60
+ # Normalize path
61
+ path = Middleman::Util.normalize_path(path)
62
+ if path.end_with?('/') || app.files.by_type(:source).watchers.any? { |w| (w.directory + Pathname(path)).directory? }
63
+ path = File.join(path, @app.config[:index_file])
43
64
  end
44
-
45
- return
46
65
  end
47
66
 
48
- # Normalized path
49
- url = '/' + Middleman::Util.normalize_path(url)
50
- if url.end_with?('/') || File.directory?(File.join(source_dir, url))
51
- url = File.join(url, config[:index_file])
52
- end
53
-
54
- # Setup proxy
55
- if target = opts.delete(:proxy)
56
- # TODO: deprecate proxy through page?
57
- proxy(url, target, opts, &block)
58
- return
59
- elsif opts.delete(:ignore)
60
- # TODO: deprecate ignore through page?
61
- ignore(url)
62
- end
67
+ path = '/' + Util.strip_leading_slash(path) if path.is_a?(String)
63
68
 
64
- # Setup a metadata matcher for rendering those options
65
- sitemap.provides_metadata_for_path(url) do |_|
66
- { options: opts, blocks: blocks }
67
- end
69
+ @page_configs << PageDescriptor.new(path, metadata)
68
70
  end
69
71
  end
70
72
  end
@@ -1,25 +1,18 @@
1
- # Require lib
2
1
  require 'rack/showexceptions'
3
2
 
4
3
  # Support rack/showexceptions during development
5
- module Middleman
6
- module CoreExtensions
7
- module ShowExceptions
8
- # Setup extension
9
- class << self
10
- # Once registered
11
- def registered(app)
12
- # Whether to catch and display exceptions
13
- # @return [Boolean]
14
- app.config.define_setting :show_exceptions, true, 'Whether to catch and display exceptions'
4
+ module Middleman::CoreExtensions
5
+ class ShowExceptions < ::Middleman::Extension
6
+ def initialize(app, options_hash={}, &block)
7
+ super
15
8
 
16
- # When in dev
17
- app.configure :development do
18
- # Include middleware
19
- use ::Rack::ShowExceptions if config[:show_exceptions]
20
- end
21
- end
22
- end
9
+ return if app.config.defines_setting? :show_exceptions
10
+
11
+ app.config.define_setting :show_exceptions, !!ENV['TEST'], 'Whether to catch and display exceptions'
12
+ end
13
+
14
+ def after_configuration
15
+ app.use ::Rack::ShowExceptions if app.config[:show_exceptions]
23
16
  end
24
17
  end
25
18
  end
@@ -1,80 +1,196 @@
1
- require 'active_support/core_ext/module/delegation'
2
1
  require 'active_support/core_ext/class/attribute'
3
2
  require 'middleman-core/configuration'
3
+ require 'middleman-core/contracts'
4
4
 
5
5
  module Middleman
6
+ # Middleman's Extension API provides the ability to add functionality to Middleman
7
+ # and to customize existing features. Internally, most features in Middleman are
8
+ # implemented as extensions. A good way to figure out how to write your own extension
9
+ # is to look at the source of the built-in extensions or popular extension gems like
10
+ # `middleman-blog` or `middleman-syntax`.
11
+ #
12
+ # The most basic extension looks like:
13
+ #
14
+ # class MyFeature < Middleman::Extension
15
+ # def initialize(app, options_hash={}, &block)
16
+ # super
17
+ # end
18
+ # end
19
+ # ::Middleman::Extensions.register(:my_feature, MyFeature)
20
+ #
21
+ # A more complicated example might look like:
22
+ #
23
+ # class MyFeature < Middleman::Extension
24
+ # option :my_option, 'cool', 'A very cool option'
25
+ #
26
+ # def initialize(app, options_hash={}, &block)
27
+ # super
28
+ # puts "My option is #{options.my_option}"
29
+ # end
30
+ #
31
+ # def after_configuration
32
+ # puts "The project has been configured"
33
+ # end
34
+ #
35
+ # def manipulate_resource_list(resources)
36
+ # resources.each do |resource|
37
+ # # Make all .jpg's get built or served with a .jpeg extension.
38
+ # if resource.ext == '.jpg'
39
+ # resource.destination_path = resource.destination_path.sub('.jpg', '.jpeg')
40
+ # end
41
+ # end
42
+ # end
43
+ # end
44
+ #
45
+ # ::Middleman::Extensions.register :my_feature do
46
+ # MyFeature
47
+ # end
48
+ #
49
+ # Extensions can add helpers (via {Extension.helpers}), add to the sitemap or change it (via {#manipulate_resource_list}), or run
50
+ # arbitrary code at different parts of the Middleman application's lifecycle. They can have options (defined via {Extension.option} and accessed via {#options}).
51
+ #
52
+ # Common lifecycle events can be handled by extensions simply by implementing an appropriately-named method:
53
+ #
54
+ # * {#after_configuration}
55
+ # * {#after_build}
56
+ # * {#before_build}
57
+ #
58
+ # There are also some less common hooks that can be listened to from within an extension's `initialize` method:
59
+ #
60
+ # * `app.before_render {|body, path, locs, template_class| ... }` - Manipulate template sources before they are rendered.
61
+ # * `app.after_render {|content, path, locs, template_class| ... }` - Manipulate output text after a template has been rendered. It is also common to install a Rack middleware to do this instead.
62
+ # * `app.ready { ... }` - Run code once Middleman is ready to serve or build files (after `after_configuration`).
63
+ # * `app.compass_config { |compass_config| ... }` - Manipulate the Compass configuration after it has been set up.
64
+ #
65
+ # @see http://middlemanapp.com/advanced/custom/ Middleman Custom Extensions Documentation
6
66
  class Extension
67
+ extend Forwardable
68
+ include Contracts
69
+
70
+ def_delegator :@app, :logger
71
+
72
+ # @!attribute supports_multiple_instances
73
+ # @!scope class
74
+ # @return [Boolean] whether or not an extension can be activated multiple times, generating multiple instances of the extension.
75
+ # By default extensions can only be activated once in a project. This is an advanced option.
7
76
  class_attribute :supports_multiple_instances, instance_reader: false, instance_writer: false
77
+
78
+ # @!attribute defined_helpers
79
+ # @!scope class
80
+ # @api private
81
+ # @return [Array<Module>] a list of all the helper modules this extension provides. Set these using {#helpers}.
8
82
  class_attribute :defined_helpers, instance_reader: false, instance_writer: false
83
+
84
+ # @!attribute ext_name
85
+ # @!scope class
86
+ # @return [Symbol] the name this extension is registered under. This is the symbol used to activate the extension.
9
87
  class_attribute :ext_name, instance_reader: false, instance_writer: false
10
88
 
89
+ # @!attribute resource_list_manipulator_priority
90
+ # @!scope class
91
+ # @return [Numeric] the priority for this extension's `manipulate_resource_list` method, if it has one.
92
+ # @see Middleman::Sitemap::Store#register_resource_list_manipulator
93
+ class_attribute :resource_list_manipulator_priority, instance_reader: false, instance_writer: false
94
+
11
95
  class << self
96
+ # @api private
97
+ # @return [Middleman::Configuration::ConfigurationManager] The defined options for this extension.
12
98
  def config
13
99
  @_config ||= ::Middleman::Configuration::ConfigurationManager.new
14
100
  end
15
101
 
16
- def option(key, default=nil, description=nil)
17
- config.define_setting(key, default, description)
102
+ # Add an option to this extension.
103
+ # @see Middleman::Configuration::ConfigurationManager#define_setting
104
+ # @example
105
+ # option :compress, false, 'Whether to compress the output'
106
+ # @param [Symbol] key The name of the option
107
+ # @param [Object] default The default value for the option
108
+ # @param [String] description A human-readable description of what the option does
109
+ def option(key, default=nil, description=nil, options={})
110
+ config.define_setting(key, default, description, options)
18
111
  end
19
112
 
20
- # Add helpers to the global Middleman application.
113
+ # Declare helpers to be added the global Middleman application.
21
114
  # This accepts either a list of modules to add on behalf
22
115
  # of this extension, or a block whose contents will all
23
116
  # be used as helpers in a new module.
24
- def helpers(*m, &block)
117
+ # @example With a block:
118
+ # helpers do
119
+ # def my_helper
120
+ # "I helped!"
121
+ # end
122
+ # end
123
+ # @example With modules:
124
+ # helpers FancyHelpers, PlainHelpers
125
+ # @param [Array<Module>] modules An optional list of modules to add as helpers
126
+ # @param [Proc] block A block which will be evaluated to create a new helper module
127
+ # @return [void]
128
+ def helpers(*modules, &block)
25
129
  self.defined_helpers ||= []
26
130
 
27
131
  if block_given?
28
132
  mod = Module.new
29
133
  mod.module_eval(&block)
30
- m = [mod]
134
+ modules = [mod]
31
135
  end
32
136
 
33
- self.defined_helpers += m
34
- end
35
-
36
- def extension_name
37
- ext_name || name.underscore.split('/').last.to_sym
38
- end
39
-
40
- def register(n=extension_name)
41
- ::Middleman::Extensions.register(n, self)
42
- end
43
-
44
- def activate
45
- new(::Middleman::Application)
137
+ self.defined_helpers += modules
46
138
  end
47
139
 
140
+ # Reset all {Extension.after_extension_activated} callbacks.
141
+ # @api private
142
+ # @return [void]
48
143
  def clear_after_extension_callbacks
49
144
  @_extension_activation_callbacks = {}
50
145
  end
51
146
 
147
+ # Register to run a block after a named extension is activated.
148
+ # @param [Symbol] name The name the extension was registered under
149
+ # @param [Proc] block A callback to run when the named extension is activated
150
+ # @return [void]
52
151
  def after_extension_activated(name, &block)
53
152
  @_extension_activation_callbacks ||= {}
54
153
  @_extension_activation_callbacks[name] ||= []
55
154
  @_extension_activation_callbacks[name] << block if block_given?
56
155
  end
57
156
 
157
+ # Notify that a particular extension has been activated and run all
158
+ # registered {Extension.after_extension_activated} callbacks.
159
+ # @api private
160
+ # @param [Middleman::Extension] instance Activated extension instance
161
+ # @return [void]
58
162
  def activated_extension(instance)
59
- name = instance.class.extension_name
60
- return unless @_extension_activation_callbacks && @_extension_activation_callbacks[name]
163
+ name = instance.class.ext_name
164
+ return unless @_extension_activation_callbacks && @_extension_activation_callbacks.key?(name)
61
165
  @_extension_activation_callbacks[name].each do |block|
62
166
  block.arity == 1 ? block.call(instance) : block.call
63
167
  end
64
168
  end
65
169
  end
66
170
 
67
- attr_accessor :options
68
- attr_reader :app
171
+ # @return [Middleman::Configuration::ConfigurationManager] options for this extension instance.
172
+ attr_reader :options
69
173
 
70
- delegate :after_extension_activated, to: :"::Middleman::Extension"
174
+ # @return [Middleman::Application] the Middleman application instance.
175
+ attr_reader :app
71
176
 
72
- def initialize(klass, options_hash={}, &block)
177
+ # @!method after_extension_activated(name, &block)
178
+ # Register to run a block after a named extension is activated.
179
+ # @param [Symbol] name The name the extension was registered under
180
+ # @param [Proc] block A callback to run when the named extension is activated
181
+ # @return [void]
182
+ def_delegator :"::Middleman::Extension", :after_extension_activated
183
+
184
+ # Extensions are instantiated when they are activated.
185
+ # @param [Middleman::Application] app The Middleman::Application instance
186
+ # @param [Hash] options_hash The raw options hash. Subclasses should not manipulate this directly - it will be turned into {#options}.
187
+ # @yield An optional block that can be used to customize options before the extension is activated.
188
+ # @yieldparam [Middleman::Configuration::ConfigurationManager] options Extension options
189
+ def initialize(app, options_hash={}, &block)
73
190
  @_helpers = []
74
- @klass = klass
191
+ @app = app
75
192
 
76
193
  setup_options(options_hash, &block)
77
- setup_app_reference_when_available
78
194
 
79
195
  # Bind app hooks to local methods
80
196
  bind_before_configuration
@@ -83,16 +199,37 @@ module Middleman
83
199
  bind_after_build
84
200
  end
85
201
 
86
- def app=(app)
87
- @app = app
88
-
89
- (self.class.defined_helpers || []).each do |m|
90
- app.class.send(:include, m)
91
- end
92
- end
93
-
94
- protected
95
-
202
+ # @!method before_configuration
203
+ # Respond to the `before_configuration` event.
204
+ # If a `before_configuration` method is implemented, that method will be run before `config.rb` is run.
205
+ # @note Because most extensions are activated from within `config.rb`, they *will not run* any `before_configuration` hook.
206
+
207
+ # @!method after_configuration
208
+ # Respond to the `after_configuration` event.
209
+ # If an `after_configuration` method is implemented, that method will be run before `config.rb` is run.
210
+
211
+ # @!method before_build
212
+ # Respond to the `before_build` event.
213
+ # If an `before_build` method is implemented, that method will be run before the builder runs.
214
+
215
+ # @!method after_build
216
+ # Respond to the `after_build` event.
217
+ # If an `after_build` method is implemented, that method will be run after the builder runs.
218
+
219
+ # @!method manipulate_resource_list(resources)
220
+ # Manipulate the resource list by transforming or adding {Sitemap::Resource}s.
221
+ # Sitemap manipulation is a powerful way of interacting with a project, since it can modify each {Sitemap::Resource} or generate new {Sitemap::Resources}. This method is used in a pipeline where each sitemap manipulator is run in turn, with each one being fed the output of the previous manipulator. See the source of built-in Middleman extensions like {Middleman::Extensions::DirectoryIndexes} and {Middleman::Extensions::AssetHash} for examples of how to use this.
222
+ # @note This method *must* return the full set of resources, because its return value will be used as the new sitemap.
223
+ # @see http://middlemanapp.com/advanced/sitemap/ Sitemap Documentation
224
+ # @see Sitemap::Store
225
+ # @see Sitemap::Resource
226
+ # @param [Array<Sitemap::Resource>] resources A list of all the resources known to the sitemap.
227
+ # @return [Array<Sitemap::Resource>] The transformed list of resources.
228
+
229
+ private
230
+
231
+ # @yield An optional block that can be used to customize options before the extension is activated.
232
+ # @yieldparam Middleman::Configuration::ConfigurationManager] options Extension options
96
233
  def setup_options(options_hash)
97
234
  @options = self.class.config.dup
98
235
  @options.finalize!
@@ -102,36 +239,26 @@ module Middleman
102
239
  end
103
240
 
104
241
  yield @options if block_given?
105
- end
106
242
 
107
- def setup_app_reference_when_available
108
- ext = self
109
-
110
- @klass.initialized do
111
- ext.app = self
112
- end
243
+ @options.all_settings.each do |o|
244
+ next unless o.options[:required] && !o.value_set?
113
245
 
114
- @klass.instance_available do
115
- ext.app ||= self
246
+ logger.error "The `:#{o.key}` option of the `#{self.class.ext_name}` extension is required."
247
+ exit(1)
116
248
  end
117
249
  end
118
250
 
119
251
  def bind_before_configuration
120
- ext = self
121
- return unless ext.respond_to?(:before_configuration)
122
-
123
- @klass.before_configuration do
124
- ext.before_configuration
125
- end
252
+ @app.before_configuration(&method(:before_configuration)) if respond_to?(:before_configuration)
126
253
  end
127
254
 
128
255
  def bind_after_configuration
129
256
  ext = self
130
- @klass.after_configuration do
257
+ @app.after_configuration do
131
258
  ext.after_configuration if ext.respond_to?(:after_configuration)
132
259
 
133
260
  if ext.respond_to?(:manipulate_resource_list)
134
- ext.app.sitemap.register_resource_list_manipulator(ext.class.extension_name, ext)
261
+ ext.app.sitemap.register_resource_list_manipulator(ext.class.ext_name, ext, ext.class.resource_list_manipulator_priority)
135
262
  end
136
263
  end
137
264
  end
@@ -140,7 +267,7 @@ module Middleman
140
267
  ext = self
141
268
  return unless ext.respond_to?(:before_build)
142
269
 
143
- @klass.before_build do |builder|
270
+ @app.before_build do |builder|
144
271
  if ext.method(:before_build).arity == 1
145
272
  ext.before_build(builder)
146
273
  else
@@ -153,7 +280,7 @@ module Middleman
153
280
  ext = self
154
281
  return unless ext.respond_to?(:after_build)
155
282
 
156
- @klass.after_build do |builder|
283
+ @app.after_build do |builder|
157
284
  if ext.method(:after_build).arity == 1
158
285
  ext.after_build(builder)
159
286
  else