diff --git a/.rubocop.yml b/.rubocop.yml index 0cac2ded..61ef85ef 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -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 diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index a7dbd519..af2a1e10 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -14,22 +14,9 @@ module Jekyll 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="", 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} @@ -42,15 +29,15 @@ eos 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) @@ -66,7 +53,7 @@ eos [: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 @@ -74,8 +61,30 @@ eos end end + private + + def parse_options(input) + options = {} + unless input.empty? + # Split along 3 possible forms -- key="", 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, @@ -84,22 +93,27 @@ eos ) 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 <
', '').sub('
', '') + highlighted_code.sub('
', "").sub("
", "") 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 @@ -110,13 +124,14 @@ eos def add_code_tag(code) code_attributes = [ - "class=\"language-#{@lang.to_s.tr('+', '-')}\"", + "class=\"language-#{@lang.to_s.tr("+", "-")}\"", "data-lang=\"#{@lang}\"" ].join(" ") - "
#{code.chomp}
" + "
"\
+        "#{code.chomp}
" end end end end -Liquid::Template.register_tag('highlight', Jekyll::Tags::HighlightBlock) +Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock) diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index d4f31f2a..b1b02981 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -12,17 +12,23 @@ module Jekyll end class IncludeTag < Liquid::Tag - VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ - VARIABLE_SYNTAX = /(?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)(?.*)/ + VALID_SYNTAX = / + ([\w-]+)\s*=\s* + (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+)) + /x + VARIABLE_SYNTAX = / + (?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+) + (?.*) + /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 @@ -36,7 +42,7 @@ module Jekyll 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] @@ -53,8 +59,8 @@ module Jekyll 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} @@ -68,9 +74,9 @@ eos 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} @@ -91,7 +97,10 @@ eos # 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 @@ -106,9 +115,9 @@ eos 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) @@ -120,24 +129,23 @@ eos 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) @@ -147,7 +155,10 @@ eos 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 @@ -188,5 +199,5 @@ eos 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) diff --git a/lib/jekyll/tags/link.rb b/lib/jekyll/tags/link.rb index f81e43b4..e6dcde61 100644 --- a/lib/jekyll/tags/link.rb +++ b/lib/jekyll/tags/link.rb @@ -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 @@ -16,11 +16,14 @@ module Jekyll 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, <