Merge pull request #2994 from jekyll/fixes-from-benchmarking

This commit is contained in:
Parker Moore 2014-10-12 15:49:20 -07:00
commit 00d29e7e77
8 changed files with 55 additions and 33 deletions

1
.gitignore vendored
View File

@ -13,3 +13,4 @@ site/_site/
coverage
.ruby-version
.sass-cache
tmp/stackprof-*

View File

@ -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.

View File

@ -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)

View File

@ -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)

View File

@ -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,6 +63,7 @@ module Jekyll
#
# Returns the cleaned relative path of the document.
def cleaned_relative_path
@cleaned_relative_path ||=
relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "")
end
@ -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

View File

@ -13,11 +13,14 @@ module Jekyll
class IncludeTag < Liquid::Tag
attr_reader :includes_dir
VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/
VARIABLE_SYNTAX = /(?<variable>[^{]*\{\{\s*(?<name>[\w\-\.]+)\s*(\|.*)?\}\}[^\s}]*)(?<params>.*)/
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

View File

@ -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 $@

View File

@ -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