lib/jekyll/converters/markdown.rb in jekyll-3.0.5 vs lib/jekyll/converters/markdown.rb in jekyll-3.1.0.pre.beta1

- old
+ new

@@ -1,56 +1,61 @@ module Jekyll module Converters class Markdown < Converter - safe true - highlighter_prefix "\n" highlighter_suffix "\n" + safe true def setup return if @setup - @parser = - case @config['markdown'].downcase - when 'redcarpet' then RedcarpetParser.new(@config) - when 'kramdown' then KramdownParser.new(@config) - when 'rdiscount' then RDiscountParser.new(@config) - else - # So they can't try some tricky bullshit or go down the ancestor chain, I hope. - if allowed_custom_class?(@config['markdown']) - self.class.const_get(@config['markdown']).new(@config) - else - Jekyll.logger.error "Invalid Markdown Processor:", "#{@config['markdown']}" - Jekyll.logger.error "", "Valid options are [ #{valid_processors.join(" | ")} ]" - raise Errors::FatalException, "Invalid Markdown Processor: #{@config['markdown']}" - end - end + if (!@parser = get_processor) + Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] + Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"] + Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}" + raise Errors::FatalException, "Bailing out; invalid Markdown processor." + end + @setup = true end + def get_processor + case @config["markdown"].downcase + when "redcarpet" then return RedcarpetParser.new(@config) + when "kramdown" then return KramdownParser.new(@config) + when "rdiscount" then return RDiscountParser.new(@config) + else + get_custom_processor + end + end + + # Public: Provides you with a list of processors, the ones we + # support internally and the ones that you have provided to us (if you + # are not in safe mode.) + def valid_processors - %w[ - rdiscount - kramdown - redcarpet - ] + third_party_processors + %W(rdiscount kramdown redcarpet) + third_party_processors end + # Public: A list of processors that you provide via plugins. + # This is really only available if you are not in safe mode, if you are + # in safe mode (re: Github) then there will be none. + def third_party_processors - self.class.constants - %w[ - KramdownParser - RDiscountParser - RedcarpetParser - PRIORITIES - ].map(&:to_sym) + self.class.constants - \ + %w[KramdownParser RDiscountParser RedcarpetParser PRIORITIES].map( + &:to_sym + ) end def extname_list - @extname_list ||= @config['markdown_ext'].split(',').map { |e| ".#{e.downcase}" } + @extname_list ||= @config['markdown_ext'].split(',').map do |e| + ".#{e.downcase}" + end end def matches(ext) - extname_list.include? ext.downcase + extname_list.include?(ext.downcase) end def output_ext(ext) ".html" end @@ -59,19 +64,29 @@ setup @parser.convert(content) end private + def get_custom_processor + converter_name = @config["markdown"] + if custom_class_allowed?(converter_name) + self.class.const_get(converter_name).new(@config) + end + end - # Private: Determine whether a class name is an allowed custom markdown - # class name + # Private: Determine whether a class name is an allowed custom + # markdown class name. # # parser_name - the name of the parser class # - # Returns true if the parser name contains only alphanumeric characters - # and is defined within Jekyll::Converters::Markdown - def allowed_custom_class?(parser_name) - parser_name !~ /[^A-Za-z0-9]/ && self.class.constants.include?(parser_name.to_sym) + # Returns true if the parser name contains only alphanumeric + # characters and is defined within Jekyll::Converters::Markdown + + private + def custom_class_allowed?(parser_name) + parser_name !~ /[^A-Za-z0-9_]/ && self.class.constants.include?( + parser_name.to_sym + ) end end end end