diff options
Diffstat (limited to 'src/_plugins/highlight.rb')
-rw-r--r-- | src/_plugins/highlight.rb | 127 |
1 files changed, 0 insertions, 127 deletions
diff --git a/src/_plugins/highlight.rb b/src/_plugins/highlight.rb deleted file mode 100644 index d59140c..0000000 --- a/src/_plugins/highlight.rb +++ /dev/null @@ -1,127 +0,0 @@ -# frozen_string_literal: true - -module Jekyll - module Tags - class HighlightBlock < Liquid::Block - include Liquid::StandardFilters - - def initialize(tag_name, markup, tokens) - super - - opts = markup.split - @opts = Hash.new - @lang = opts.shift.downcase - - opts.each do |opt| - if opt.include?("=") - parts = opt.split("=", 2) - - @opts[parts[0]] = parts[1] - end - - @opts[opt] = true - end - end - - def render(context) - prefix = context["highlighter_prefix"] || "" - suffix = context["highlighter_suffix"] || "" - code = super.to_s.gsub(%r!\A(\n|\r)+|(\n|\r)+\z!, "") - - is_safe = !!context.registers[:site].safe - - output = - case context.registers[:site].highlighter - when "pygments" - render_pygments(code, is_safe) - when "rouge" - render_rouge(code) - else - render_codehighlighter(code) - end - - rendered_output = add_code_tag(output) - prefix + rendered_output + suffix - end - - def sanitized_opts(opts, is_safe) - if is_safe - Hash[[ - [:startinline, opts.fetch(:startinline, nil)], - [:hl_lines, opts.fetch(:hl_lines, nil)], - [:linenos, opts.fetch(:linenos, nil)], - [:encoding, opts.fetch(:encoding, "utf-8")], - [:cssclass, opts.fetch(:cssclass, nil)], - ].reject { |f| f.last.nil? }] - else - opts - end - end - - private - - def render_pygments(code, is_safe) - Jekyll::External.require_with_graceful_fail("pygments") unless defined?(Pygments) - - highlighted_code = Pygments.highlight( - code, - :lexer => @lang, - :options => sanitized_opts(@highlight_options, is_safe) - ) - - if highlighted_code.nil? - Jekyll.logger.error <<~MSG - 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. - MSG - 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>", "") - end - - def render_rouge(code) - require "rouge" - formatter = ::Rouge::Formatters::HTMLLegacy.new( - :line_numbers => @highlight_options[:linenos], - :wrap => false, - :css_class => "highlight", - :gutter_class => "gutter", - :code_class => "code" - ) - lexer = ::Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText - formatter.format(lexer.lex(code)) - end - - def render_codehighlighter(code) - h(code).strip - end - - def add_code_tag(code) - code_attributes = [ - "class=\"language-#{@lang.to_s.tr("+", "-")}\"", - "data-lang=\"#{@lang}\"", - ].join(" ") - - output = "<figure class=\"highlight\"><pre><code #{code_attributes}>" - output += code.chomp - output += "</code></pre>" - - if @opts["tio"] - output += "<div class=\"code-link\"><a href=\"#{@opts["tio"]}\" target=\"_blank\">Run this code</a></div>" - end - - output += "</figure>" - - output - end - end - end -end - -Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock) |