Sha256: adda8b72cf5ae5829e32575e48f2732443d78e9591007e9376f3d1e4013bf9f7

Contents?: true

Size: 1.81 KB

Versions: 17

Compression:

Stored size: 1.81 KB

Contents

require "rouge"
require "htmlbeautifier"
require "htmlentities"

module Lookbook
  module CodeFormatter
    class << self
      def highlight(source, **opts)
        coder = HTMLEntities.new
        source = coder.decode source
        language = opts[:language] || "ruby"
        formatter = Formatter.new(**opts)
        lexer = Rouge::Lexer.find(language.to_s) || Rouge::Lexer.find("plaintext")
        formatter.format(lexer.lex(source)).html_safe
      end

      def beautify(source, **opts)
        language = opts[:language] || "html"
        source = source.strip
        result = language.downcase == "html" ? HtmlBeautifier.beautify(source) : source
        result.strip.html_safe
      end
    end
  end

  class Formatter < Rouge::Formatters::HTML
    def initialize(**opts)
      @opts = opts
      @highlight_lines = opts[:highlight_lines].to_a || []
      @start_line = opts[:start_line] || 1
      @language = opts[:language]
    end

    def stream(tokens, &block)
      lines = token_lines(tokens)

      yield "<div class='wrapper'>"

      if @opts[:line_numbers]
        yield "<div class='line-numbers'>"
        lines.each.with_index do |line, i|
          yield "<div class='line #{"highlighted" if highlighted?(i)}'><span class='line-number'>#{line_number(i)}</span></div>"
        end
        yield "</div>"
      end

      yield "<pre class='code highlight' data-lang='#{@language}'><code>"
      lines.each.with_index do |line_tokens, i|
        yield "<div class='line#{" highlighted" if highlighted?(i)}'>"
        line_tokens.each do |token, value|
          yield span(token, value)
        end
        yield "</div>"
      end
      yield "</code></pre>"

      yield "</div>"
    end

    def highlighted?(i)
      @highlight_lines.include?(i + 1)
    end

    def line_number(i)
      @start_line + i
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
lookbook-1.2.1 lib/lookbook/code_formatter.rb
lookbook-1.2.0 lib/lookbook/code_formatter.rb
lookbook-1.1.1 lib/lookbook/code_formatter.rb
lookbook-1.1.0 lib/lookbook/code_formatter.rb
lookbook-1.0.8 lib/lookbook/code_formatter.rb
lookbook-1.0.7 lib/lookbook/code_formatter.rb
lookbook-1.0.6 lib/lookbook/code_formatter.rb
lookbook-1.0.5 lib/lookbook/code_formatter.rb
lookbook-1.0.4 lib/lookbook/code_formatter.rb
lookbook-1.0.3 lib/lookbook/code_formatter.rb
lookbook-1.0.2 lib/lookbook/code_formatter.rb
lookbook-1.0.1 lib/lookbook/code_formatter.rb
lookbook-1.0.0 lib/lookbook/code_formatter.rb
lookbook-1.0.0.rc.3 lib/lookbook/code_formatter.rb
lookbook-1.0.0.rc.2 lib/lookbook/code_formatter.rb
lookbook-1.0.0.rc.1 lib/lookbook/code_formatter.rb
lookbook-1.0.0.beta.8 lib/lookbook/code_formatter.rb