diff --git a/.gitignore b/.gitignore index 42bba817..aa6c14f8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ site/_site/ coverage .ruby-version .sass-cache +tmp/stackprof-* diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 5fc3994f..33654f45 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -75,7 +75,7 @@ module Jekyll # Returns a String containing the directory name where the collection # is stored on the filesystem. def relative_directory - "_#{label}" + @relative_directory ||= "_#{label}" end # The full path to the directory containing the @@ -83,7 +83,7 @@ module Jekyll # Returns a String containing th directory name where the collection # is stored on the filesystem. def directory - Jekyll.sanitized_path(site.source, relative_directory) + @directory ||= Jekyll.sanitized_path(site.source, relative_directory) end # Checks whether the directory "exists" for this collection. diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 687b0eca..0dcc90a8 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -46,9 +46,15 @@ module Jekyll ].map(&:to_sym) end + def extname_matches_regexp + @extname_matches_regexp ||= Regexp.new( + '(' + @config['markdown_ext'].gsub(',','|') +')$', + Regexp::IGNORECASE + ) + end + def matches(ext) - rgx = '^\.(' + @config['markdown_ext'].gsub(',','|') +')$' - ext =~ Regexp.new(rgx, Regexp::IGNORECASE) + ext =~ extname_matches_regexp end def output_ext(ext) diff --git a/lib/jekyll/converters/textile.rb b/lib/jekyll/converters/textile.rb index 366aa0ce..c8137a3a 100644 --- a/lib/jekyll/converters/textile.rb +++ b/lib/jekyll/converters/textile.rb @@ -16,9 +16,15 @@ module Jekyll raise Errors::FatalException.new("Missing dependency: RedCloth") end + def extname_matches_regexp + @extname_matches_regexp ||= Regexp.new( + '(' + @config['textile_ext'].gsub(',','|') +')$', + Regexp::IGNORECASE + ) + end + def matches(ext) - rgx = '(' + @config['textile_ext'].gsub(',','|') +')' - ext =~ Regexp.new(rgx, Regexp::IGNORECASE) + ext =~ extname_matches_regexp end def output_ext(ext) diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index f4761ef8..95a2bdcd 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -4,7 +4,7 @@ module Jekyll class Document include Comparable - attr_reader :path, :site + attr_reader :path, :site, :extname attr_accessor :content, :collection, :output # Create a new Document. @@ -16,6 +16,7 @@ module Jekyll def initialize(path, relations) @site = relations[:site] @path = path + @extname = File.extname(path) @collection = relations[:collection] @has_yaml_header = nil end @@ -33,23 +34,21 @@ module Jekyll # Returns a String path which represents the relative path # from the site source to this document def relative_path - Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s + @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s + end + + # The base filename of the document, without the file extname. + # + # Returns the basename without the file extname. + def basename_without_ext + @basename_without_ext ||= File.basename(path, '.*') end # The base filename of the document. # - # suffix - (optional) the suffix to be removed from the end of the filename - # # Returns the base filename of the document. - def basename(suffix = "") - File.basename(path, suffix) - end - - # The extension name of the document. - # - # Returns the extension name of the document. - def extname - File.extname(path) + def basename + @basename ||= File.basename(path) end # Produces a "cleaned" relative path. @@ -64,7 +63,8 @@ module Jekyll # # Returns the cleaned relative path of the document. def cleaned_relative_path - relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "") + @cleaned_relative_path ||= + relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "") end # Determine whether the document is a YAML file. @@ -129,8 +129,8 @@ module Jekyll collection: collection.label, path: cleaned_relative_path, output_ext: Jekyll::Renderer.new(site, self).output_ext, - name: Utils.slugify(basename(".*")), - title: Utils.slugify(data['title']) || Utils.slugify(basename(".*")) + name: Utils.slugify(basename_without_ext), + title: Utils.slugify(data['title']) || Utils.slugify(basename_without_ext) } end diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index 87583e95..c6b1ed9c 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -13,11 +13,14 @@ module Jekyll class IncludeTag < Liquid::Tag + attr_reader :includes_dir + VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ VARIABLE_SYNTAX = /(?[^{]*\{\{\s*(?[\w\-\.]+)\s*(\|.*)?\}\}[^\s}]*)(?.*)/ def initialize(tag_name, markup, tokens) super + @includes_dir = tag_includes_dir matched = markup.strip.match(VARIABLE_SYNTAX) if matched @file = matched['variable'].strip @@ -97,7 +100,7 @@ eos end end - def includes_dir + def tag_includes_dir '_includes' end @@ -118,12 +121,12 @@ eos partial.render!(context) end rescue => e - raise IncludeTagError.new e.message, File.join(includes_dir, @file) + raise IncludeTagError.new e.message, File.join(@includes_dir, @file) end end def resolved_includes_dir(context) - File.join(File.realpath(context.registers[:site].source), includes_dir) + File.join(File.realpath(context.registers[:site].source), @includes_dir) end def validate_path(path, dir, safe) @@ -135,7 +138,7 @@ eos end def path_relative_to_source(dir, path) - File.join(includes_dir, path.sub(Regexp.new("^#{dir}"), "")) + File.join(@includes_dir, path.sub(Regexp.new("^#{dir}"), "")) end def realpath_prefixed_with?(path, dir) @@ -149,13 +152,16 @@ eos end class IncludeRelativeTag < IncludeTag - def includes_dir + def tag_includes_dir '.' end + def page_path(context) + context.registers[:page].nil? ? includes_dir : File.dirname(context.registers[:page]["path"]) + end + def resolved_includes_dir(context) - page_path = context.registers[:page].nil? ? includes_dir : File.dirname(context.registers[:page]["path"]) - Jekyll.sanitized_path(context.registers[:site].source, page_path) + Jekyll.sanitized_path(context.registers[:site].source, page_path(context)) end end end diff --git a/script/stackprof b/script/stackprof index 32c89ac3..e0e2d4db 100755 --- a/script/stackprof +++ b/script/stackprof @@ -3,11 +3,14 @@ set -e export BENCHMARK=true -script/bootstrap +command -v stackprof > /dev/null || script/bootstrap TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d).dump -bundle exec ruby -r./lib/jekyll -rstackprof -e "StackProf.run(mode: :cpu, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" +test -f "$PROF_OUTPUT_FILE" || { + bundle exec ruby -r./lib/jekyll -rstackprof \ + -e "StackProf.run(mode: :cpu, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" +} bundle exec stackprof $PROF_OUTPUT_FILE $@ diff --git a/test/test_document.rb b/test/test_document.rb index 5e26173f..3464cd2b 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -25,8 +25,8 @@ class TestDocument < Test::Unit::TestCase assert_equal "configuration.md", @document.basename end - should "allow the suffix to be specified for the basename" do - assert_equal "configuration", @document.basename(".*") + should "know its basename without extname" do + assert_equal "configuration", @document.basename_without_ext end should "know whether its a yaml file" do