lib/solargraph/page.rb



require 'ostruct'
require 'tilt'
require 'kramdown'
require 'htmlentities'
require 'coderay'

module Solargraph
  class Page
    class Binder < OpenStruct
      def initialize locals, render_method
        super(locals)
        define_singleton_method :render do |template, layout: false, locals: {}|
          render_method.call(template, layout: layout, locals: locals)
        end
        define_singleton_method :erb do |template, layout: false, locals: {}|
          render_method.call(template, layout: layout, locals: locals)
        end
      end

      def htmlify text
        helper = Solargraph::Pin::Helper.new
        html = helper.html_markup_rdoc(text)
        conv = ReverseMarkdown.convert(html, github_flavored: true)
        Kramdown::Document.new(
          conv,
          input: 'GFM',
          entity_output: :symbolic,
          syntax_highlighter_opts: {
            block: {
              line_numbers: false,
            },
            default_lang: :ruby
          },
        ).to_html
      end

      def ruby_to_html code
        code
      end
    end
    private_constant :Binder

    def initialize directory = VIEWS_PATH
      directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
      @render_method = proc { |template, layout: false, locals: {}|
        binder = Binder.new(locals, @render_method)
        if layout
          Tilt::ERBTemplate.new(File.join(directory, 'layout.erb')).render(binder) do
            Tilt::ERBTemplate.new(File.join(directory, "#{template}.erb")).render(binder)
          end
        else
          Tilt::ERBTemplate.new(File.join(directory, "#{template}.erb")).render(binder)
        end
      }
    end

    def render template, layout: true, locals: {}
      @render_method.call(template, layout: layout, locals: locals)
    end
  end
end