Skip to content

Commit

Permalink
Merge branch 'ayastreb-tags'
Browse files Browse the repository at this point in the history
* ayastreb-tags:
  rubocop: fix code style
  rubocop: fix spacing in code style
  rubocop: fix code style
  rubocop: fix include tag code style
  rubocop: fix post URL tag code style
  rubocop: fix link tag code style
  rubocop: fix highlight tag code style
  • Loading branch information
parkr committed May 26, 2016
2 parents 8c231ed + 001cbf2 commit 5e46a02
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 77 deletions.
4 changes: 0 additions & 4 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ AllCops:
- lib/jekyll/renderer.rb
- lib/jekyll/site.rb
- lib/jekyll/static_file.rb
- lib/jekyll/tags/highlight.rb
- lib/jekyll/tags/include.rb
- lib/jekyll/tags/link.rb
- lib/jekyll/tags/post_url.rb
- lib/jekyll/theme.rb
- lib/jekyll/url.rb
- lib/jekyll/utils.rb
Expand Down
83 changes: 49 additions & 34 deletions lib/jekyll/tags/highlight.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,9 @@ def initialize(tag_name, markup, tokens)
super
if markup.strip =~ SYNTAX
@lang = Regexp.last_match(1).downcase
@highlight_options = {}
if defined?(Regexp.last_match(2)) && Regexp.last_match(2) != ''
# Split along 3 possible forms -- key="<quoted list>", key=value, or key
Regexp.last_match(2).scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt|
key, value = opt.split('=')
# If a quoted list, convert to array
if value && value.include?("\"")
value.delete!('"')
value = value.split
end
@highlight_options[key.to_sym] = value || true
end
end
@highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) && @highlight_options[:linenos] == true
@highlight_options = parse_options(Regexp.last_match(2))
else
raise SyntaxError.new <<-eos
raise SyntaxError, <<-eos
Syntax Error in tag 'highlight' while parsing the following markup:
#{markup}
Expand All @@ -42,15 +29,15 @@ def initialize(tag_name, markup, tokens)
def render(context)
prefix = context["highlighter_prefix"] || ""
suffix = context["highlighter_suffix"] || ""
code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, '')
code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, "")

is_safe = !!context.registers[:site].safe

output =
case context.registers[:site].highlighter
when 'pygments'
when "pygments"
render_pygments(code, is_safe)
when 'rouge'
when "rouge"
render_rouge(code)
else
render_codehighlighter(code)
Expand All @@ -66,16 +53,38 @@ def sanitized_opts(opts, is_safe)
[:startinline, opts.fetch(:startinline, nil)],
[:hl_lines, opts.fetch(:hl_lines, nil)],
[:linenos, opts.fetch(:linenos, nil)],
[:encoding, opts.fetch(:encoding, 'utf-8')],
[:encoding, opts.fetch(:encoding, "utf-8")],
[:cssclass, opts.fetch(:cssclass, nil)]
].reject { |f| f.last.nil? }]
else
opts
end
end

private

def parse_options(input)
options = {}
unless input.empty?
# Split along 3 possible forms -- key="<quoted list>", key=value, or key
input.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt|
key, value = opt.split("=")
# If a quoted list, convert to array
if value && value.include?("\"")
value.delete!('"')
value = value.split
end
options[key.to_sym] = value || true
end
end
if options.key?(:linenos) && options[:linenos] == true
options[:linenos] = "inline"
end
options
end

def render_pygments(code, is_safe)
Jekyll::External.require_with_graceful_fail('pygments')
Jekyll::External.require_with_graceful_fail("pygments")

highlighted_code = Pygments.highlight(
code,
Expand All @@ -84,22 +93,27 @@ def render_pygments(code, is_safe)
)

if highlighted_code.nil?
Jekyll.logger.error "There was an error highlighting your code:"
puts
Jekyll.logger.error code
puts
Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" \
" returned an unacceptable value."
Jekyll.logger.error "This is usually a timeout problem solved by running `jekyll build` again."
raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.")
Jekyll.logger.error <<eos
There was an error highlighting your code:
#{code}
While attempting to convert the above code, Pygments.rb returned an unacceptable value.
This is usually a timeout problem solved by running `jekyll build` again.
eos
raise ArgumentError, "Pygments.rb returned an unacceptable value "\
"when attempting to highlight some code."
end

highlighted_code.sub('<div class="highlight"><pre>', '').sub('</pre></div>', '')
highlighted_code.sub('<div class="highlight"><pre>', "").sub("</pre></div>", "")
end

def render_rouge(code)
Jekyll::External.require_with_graceful_fail('rouge')
formatter = Rouge::Formatters::HTML.new(:line_numbers => @highlight_options[:linenos], :wrap => false)
Jekyll::External.require_with_graceful_fail("rouge")
formatter = Rouge::Formatters::HTML.new(
:line_numbers => @highlight_options[:linenos],
:wrap => false
)
lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText
formatter.format(lexer.lex(code))
end
Expand All @@ -110,13 +124,14 @@ def render_codehighlighter(code)

def add_code_tag(code)
code_attributes = [
"class=\"language-#{@lang.to_s.tr('+', '-')}\"",
"class=\"language-#{@lang.to_s.tr("+", "-")}\"",
"data-lang=\"#{@lang}\""
].join(" ")
"<figure class=\"highlight\"><pre><code #{code_attributes}>#{code.chomp}</code></pre></figure>"
"<figure class=\"highlight\"><pre><code #{code_attributes}>"\
"#{code.chomp}</code></pre></figure>"
end
end
end
end

Liquid::Template.register_tag('highlight', Jekyll::Tags::HighlightBlock)
Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock)
69 changes: 40 additions & 29 deletions lib/jekyll/tags/include.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,23 @@ def initialize(msg, path)
end

class IncludeTag < Liquid::Tag
VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/
VARIABLE_SYNTAX = /(?<variable>[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)(?<params>.*)/
VALID_SYNTAX = /
([\w-]+)\s*=\s*
(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))
/x
VARIABLE_SYNTAX = /
(?<variable>[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)
(?<params>.*)
/x

def initialize(tag_name, markup, tokens)
super
matched = markup.strip.match(VARIABLE_SYNTAX)
if matched
@file = matched['variable'].strip
@params = matched['params'].strip
@file = matched["variable"].strip
@params = matched["params"].strip
else
@file, @params = markup.strip.split(' ', 2)
@file, @params = markup.strip.split(/\s+/, 2)
end
validate_params if @params
@tag_name = tag_name
Expand All @@ -36,7 +42,7 @@ def parse_params(context)
params = {}
markup = @params

while match = VALID_SYNTAX.match(markup) do
while (match = VALID_SYNTAX.match(markup))
markup = markup[match.end(0)..-1]

value = if match[2]
Expand All @@ -53,8 +59,8 @@ def parse_params(context)
end

def validate_file_name(file)
if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./
raise ArgumentError.new <<-eos
if file !~ %r!^[a-zA-Z0-9_/\.-]+$! || file =~ %r!\./! || file =~ %r!/\.!
raise ArgumentError, <<-eos
Invalid syntax for include tag. File contains invalid characters or sequences:
#{file}
Expand All @@ -68,9 +74,9 @@ def validate_file_name(file)
end

def validate_params
full_valid_syntax = Regexp.compile('\A\s*(?:' + VALID_SYNTAX.to_s + '(?=\s|\z)\s*)*\z')
full_valid_syntax = /\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z/
unless @params =~ full_valid_syntax
raise ArgumentError.new <<-eos
raise ArgumentError, <<-eos
Invalid syntax for include tag:
#{@params}
Expand All @@ -91,7 +97,10 @@ def file_read_opts(context)
# Render the variable if required
def render_variable(context)
if @file.match(VARIABLE_SYNTAX)
partial = context.registers[:site].liquid_renderer.file("(variable)").parse(@file)
partial = context.registers[:site]
.liquid_renderer
.file("(variable)")
.parse(@file)
partial.render!(context)
end
end
Expand All @@ -106,9 +115,9 @@ def locate_include_file(context, file, safe)
path = File.join(dir, file)
return path if valid_include_file?(path, dir, safe)
end
raise IOError, "Could not locate the included file '#{file}' in any of #{includes_dirs}." \
" Ensure it exists in one of those directories and, if it is a symlink, " \
"does not point outside your site source."
raise IOError, "Could not locate the included file '#{file}' in any of "\
"#{includes_dirs}. Ensure it exists in one of those directories and, "\
"if it is a symlink, does not point outside your site source."
end

def render(context)
Expand All @@ -120,24 +129,23 @@ def render(context)
path = locate_include_file(context, file, site.safe)
return unless path

# Add include to dependency tree
add_include_to_dependency(site, path, context)

partial = load_cached_partial(path, context)

context.stack do
context["include"] = parse_params(context) if @params
partial.render!(context)
end
end

def add_include_to_dependency(site, path, context)
if context.registers[:page] && context.registers[:page].key?("path")
site.regenerator.add_dependency(
site.in_source_dir(context.registers[:page]["path"]),
path
)
end

#begin
partial = load_cached_partial(path, context)

context.stack do
context['include'] = parse_params(context) if @params
partial.render!(context)
end
#rescue => e
#raise IncludeTagError.new e.message, path
#end
end

def load_cached_partial(path, context)
Expand All @@ -147,7 +155,10 @@ def load_cached_partial(path, context)
if cached_partial.key?(path)
cached_partial[path]
else
cached_partial[path] = context.registers[:site].liquid_renderer.file(path).parse(read_file(path, context))
cached_partial[path] = context.registers[:site]
.liquid_renderer
.file(path)
.parse(read_file(path, context))
end
end

Expand Down Expand Up @@ -188,5 +199,5 @@ def page_path(context)
end
end

Liquid::Template.register_tag('include', Jekyll::Tags::IncludeTag)
Liquid::Template.register_tag('include_relative', Jekyll::Tags::IncludeRelativeTag)
Liquid::Template.register_tag("include", Jekyll::Tags::IncludeTag)
Liquid::Template.register_tag("include_relative", Jekyll::Tags::IncludeRelativeTag)
11 changes: 7 additions & 4 deletions lib/jekyll/tags/link.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Jekyll
module Tags
class Link < Liquid::Tag
TagName = 'link'
TAG_NAME = "link".freeze

def initialize(tag_name, relative_path, tokens)
super
Expand All @@ -16,11 +16,14 @@ def render(context)
return document.url if document.relative_path == @relative_path
end

raise ArgumentError, "Could not find document '#{@relative_path}' in tag '#{TagName}'.\n\n" \
"Make sure the document exists and the path is correct."
raise ArgumentError, <<eos
Could not find document '#{@relative_path}' in tag '#{TAG_NAME}'.
Make sure the document exists and the path is correct.
eos
end
end
end
end

Liquid::Template.register_tag(Jekyll::Tags::Link::TagName, Jekyll::Tags::Link)
Liquid::Template.register_tag(Jekyll::Tags::Link::TAG_NAME, Jekyll::Tags::Link)
13 changes: 7 additions & 6 deletions lib/jekyll/tags/post_url.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
module Jekyll
module Tags
class PostComparer
MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)$/
MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$!

attr_reader :path, :date, :slug, :name

def initialize(name)
@name = name

all, @path, @date, @slug = *name.sub(/^\//, "").match(MATCHER)
all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER)
unless all
raise Jekyll::Errors::InvalidPostNameError,
"'#{name}' does not contain valid date and/or title."
Expand Down Expand Up @@ -42,9 +42,9 @@ def deprecated_equality(other)
def post_slug(other)
path = other.basename.split("/")[0...-1].join("/")
if path.nil? || path == ""
other.data['slug']
other.data["slug"]
else
path + '/' + other.data['slug']
path + "/" + other.data["slug"]
end
end
end
Expand Down Expand Up @@ -78,7 +78,8 @@ def render(context)

site.posts.docs.each do |p|
next unless @post.deprecated_equality p
Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " \
Jekyll::Deprecator.deprecation_message "A call to "\
"'{{ post_url #{@post.name} }}' did not match " \
"a post using the new matching method of checking name " \
"(path-date-slug) equality. Please make sure that you " \
"change this tag to match the post's name exactly."
Expand All @@ -95,4 +96,4 @@ def render(context)
end
end

Liquid::Template.register_tag('post_url', Jekyll::Tags::PostUrl)
Liquid::Template.register_tag("post_url", Jekyll::Tags::PostUrl)

0 comments on commit 5e46a02

Please sign in to comment.