File: app.rb

package info (click to toggle)
ruby-rouge 4.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,836 kB
  • sloc: ruby: 38,168; sed: 2,071; perl: 152; makefile: 8
file content (102 lines) | stat: -rw-r--r-- 2,623 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

require 'rubygems'
require 'bundler'
Bundler.require(:default, :development)

# stdlib
require 'pathname'

class VisualTestApp < Sinatra::Application
  BASE = Pathname.new(__FILE__).dirname
  SAMPLES = BASE.join('samples')
  ROOT = BASE.parent.parent

  ROUGE_LIB = ROOT.join('lib/rouge.rb')

  DEMOS = ROOT.join('lib/rouge/demos')

  def reload_source!
    Rouge.reload!
  end

  def query_string
    env['rack.request.query_string']
  end

  # Invoke a specific formatter based on what one intends to test
  def setup_formatter(params)
    # parameters disabled by default
    inline       = as_boolean params.fetch(:inline, false)
    line_numbers = as_boolean params.fetch(:line_numbers, false)

    # parameters enabled by default
    wrapped    = as_boolean params.fetch(:wrap, true)
    line_table = as_boolean params.fetch(:line_table, true)

    # base HTML formatter
    formatter = inline ?
                  Rouge::Formatters::HTMLInline.new(@theme) :
                  Rouge::Formatters::HTML.new

    if line_numbers
      formatter = line_table ?
                    Rouge::Formatters::HTMLLineTable.new(formatter) :
                    Rouge::Formatters::HTMLTable.new(formatter)
    end

    return Rouge::Formatters::HTMLPygments.new(formatter) if wrapped

    formatter
  end

  def as_boolean(value)
    case value
    when nil, false, 0, '0', 'false', 'off', 'disabled', ''
      false
    else
      true
    end
  end

  configure do
    set :root, BASE
    set :views, BASE.join('templates')
  end

  before do
    reload_source!

    Rouge::Lexer.enable_debug!
    Rouge::Formatter.enable_escape! if params[:escape]

    theme_class = Rouge::Theme.find(params[:theme] || 'thankful_eyes')
    halt 404 unless theme_class

    @theme         = theme_class.new(scope: '.codehilite')
    @comment_color = theme_class.get_style(Rouge::Token::Tokens::Comment).fg
    @formatter     = setup_formatter(params)
  end

  get '/:lexer' do |lexer_name|
    @lexer = Rouge::Lexer.find_fancy("#{lexer_name}?#{query_string}")
    halt 404 unless @lexer
    @sample = File.read(SAMPLES.join(@lexer.class.tag), encoding: 'utf-8')

    @title = "#{@lexer.class.tag} | Visual Test"
    @raw = Rouge.highlight(@sample, 'plaintext', @formatter)
    @highlighted = Rouge.highlight(@sample, @lexer, @formatter)

    template = params[:juxtaposed] ? :lexer_juxtaposed : :lexer
    erb template
  end


  get '/' do
    @samples = DEMOS.entries.sort.reject { |s| s.basename.to_s =~ /^\.|~$/ }
    @samples.map!(&Rouge::Lexer.method(:find))

    erb :index
  end
end