rouge 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/rouge.rb +7 -2
- data/lib/rouge/formatters/html.rb +4 -3
- data/lib/rouge/lexer.rb +259 -122
- data/lib/rouge/lexers/css.rb +165 -0
- data/lib/rouge/lexers/diff.rb +28 -0
- data/lib/rouge/lexers/html.rb +65 -0
- data/lib/rouge/lexers/javascript.rb +22 -18
- data/lib/rouge/lexers/shell.rb +40 -24
- data/lib/rouge/lexers/text.rb +11 -0
- data/lib/rouge/theme.rb +36 -47
- data/lib/rouge/themes/colorful.rb +63 -0
- data/lib/rouge/themes/thankful_eyes.rb +11 -9
- data/lib/rouge/token.rb +14 -2
- data/lib/rouge/version.rb +1 -1
- metadata +7 -2
data/lib/rouge/theme.rb
CHANGED
@@ -1,24 +1,37 @@
|
|
1
1
|
module Rouge
|
2
2
|
class Theme
|
3
|
+
class Style < Hash
|
4
|
+
def render(selector, &b)
|
5
|
+
return enum_for(:render, selector).to_a.join("\n") unless b
|
6
|
+
|
7
|
+
return if empty?
|
8
|
+
|
9
|
+
yield "#{selector} {"
|
10
|
+
yield " color: #{self[:fg]};" if self[:fg]
|
11
|
+
yield " background-color: #{self[:bg]};" if self[:bg]
|
12
|
+
yield " font-weight: bold;" if self[:bold]
|
13
|
+
yield " font-style: italic;" if self[:italic]
|
14
|
+
yield " text-decoration: underline;" if self[:underline]
|
15
|
+
|
16
|
+
(self[:rules] || []).each do |rule|
|
17
|
+
yield " #{rule};"
|
18
|
+
end
|
19
|
+
|
20
|
+
yield "}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
3
24
|
class << self
|
4
25
|
def styles
|
5
26
|
@styles ||= {}
|
6
27
|
end
|
7
28
|
|
8
|
-
def main_style
|
9
|
-
@main_style ||= {}
|
10
|
-
end
|
11
|
-
|
12
29
|
def style(*tokens)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if tokens.empty?
|
17
|
-
@main_style = opts
|
18
|
-
end
|
30
|
+
style = Style.new
|
31
|
+
style.merge!(tokens.pop) if tokens.last.is_a? Hash
|
19
32
|
|
20
33
|
tokens.each do |tok|
|
21
|
-
styles[tok.to_s] =
|
34
|
+
styles[tok.to_s] = style
|
22
35
|
end
|
23
36
|
end
|
24
37
|
|
@@ -41,59 +54,35 @@ module Rouge
|
|
41
54
|
|
42
55
|
class CSSTheme < Theme
|
43
56
|
def initialize(opts={})
|
44
|
-
@
|
45
|
-
end
|
46
|
-
|
47
|
-
def render
|
48
|
-
out = []
|
49
|
-
stream { |line| out << line }
|
50
|
-
out.join("\n")
|
57
|
+
@scope = opts[:scope] || '.highlight'
|
51
58
|
end
|
52
59
|
|
53
|
-
def
|
54
|
-
return enum_for(:
|
60
|
+
def render(&b)
|
61
|
+
return enum_for(:render).to_a.join("\n") unless b
|
55
62
|
|
56
63
|
self.class.styles.each do |tokname, style|
|
57
|
-
|
64
|
+
style.render(css_selector(Token[tokname]), &b)
|
58
65
|
end
|
59
|
-
|
60
|
-
render_stanza('.highlight', self.class.main_style, &b)
|
61
66
|
end
|
62
67
|
|
63
68
|
private
|
64
|
-
def stream_single(tok, style, &b)
|
65
|
-
render_stanza(css_selector(tok), style, &b)
|
66
|
-
end
|
67
|
-
|
68
|
-
def render_stanza(selector, style, &b)
|
69
|
-
return if style.empty?
|
70
|
-
|
71
|
-
yield "#{selector} {"
|
72
|
-
yield " color: #{style[:fg]};" if style[:fg]
|
73
|
-
yield " background-color: #{style[:bg]};" if style[:bg]
|
74
|
-
yield " font-weight: bold;" if style[:bold]
|
75
|
-
yield " font-style: italic;" if style[:italic]
|
76
|
-
yield " text-decoration: underline;" if style[:underline]
|
77
|
-
|
78
|
-
(style[:rules] || []).each do |rule|
|
79
|
-
yield " #{rule};"
|
80
|
-
end
|
81
|
-
|
82
|
-
yield "}"
|
83
|
-
end
|
84
|
-
|
85
69
|
def css_selector(token)
|
86
70
|
tokens = [token]
|
87
71
|
parent = token.parent
|
88
72
|
|
89
73
|
inflate_token(token).map do |tok|
|
90
|
-
|
91
|
-
base << " .#{tok.shortname}" unless tok.shortname.empty?
|
74
|
+
raise "unknown token: #{tok.inspect}" if tok.shortname.nil?
|
92
75
|
|
93
|
-
|
76
|
+
single_css_selector(tok)
|
94
77
|
end.join(', ')
|
95
78
|
end
|
96
79
|
|
80
|
+
def single_css_selector(token)
|
81
|
+
return @scope if token == Token['Text']
|
82
|
+
|
83
|
+
"#{@scope} .#{token.shortname}"
|
84
|
+
end
|
85
|
+
|
97
86
|
# yield all of the tokens that should be styled the same
|
98
87
|
# as the given token. Essentially this recursively all of
|
99
88
|
# the subtokens, except those which are more specifically
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Rouge
|
2
|
+
module Themes
|
3
|
+
# stolen from pygments
|
4
|
+
class Colorful < CSSTheme
|
5
|
+
style 'Text', :fg => "#bbbbbb", :bg => 'black'
|
6
|
+
|
7
|
+
style 'Comment', :fg => "#888"
|
8
|
+
style 'Comment.Preproc', :fg => "#579"
|
9
|
+
style 'Comment.Special', :fg => "#cc0000", :bold => true
|
10
|
+
|
11
|
+
style 'Keyword', :fg => "#080", :bold => true
|
12
|
+
style 'Keyword.Pseudo', :fg => "#038"
|
13
|
+
style 'Keyword.Type', :fg => "#339"
|
14
|
+
|
15
|
+
style 'Operator', :fg => "#333"
|
16
|
+
style 'Operator.Word', :fg => "#000", :bold => true
|
17
|
+
|
18
|
+
style 'Name.Builtin', :fg => "#007020"
|
19
|
+
style 'Name.Function', :fg => "#06B", :bold => true
|
20
|
+
style 'Name.Class', :fg => "#B06", :bold => true
|
21
|
+
style 'Name.Namespace', :fg => "#0e84b5", :bold => true
|
22
|
+
style 'Name.Exception', :fg => "#F00", :bold => true
|
23
|
+
style 'Name.Variable', :fg => "#963"
|
24
|
+
style 'Name.Variable.Instance', :fg => "#33B"
|
25
|
+
style 'Name.Variable.Class', :fg => "#369"
|
26
|
+
style 'Name.Variable.Global', :fg => "#d70", :bold => true
|
27
|
+
style 'Name.Constant', :fg => "#036", :bold => true
|
28
|
+
style 'Name.Label', :fg => "#970", :bold => true
|
29
|
+
style 'Name.Entity', :fg => "#800", :bold => true
|
30
|
+
style 'Name.Attribute', :fg => "#00C"
|
31
|
+
style 'Name.Tag', :fg => "#070"
|
32
|
+
style 'Name.Decorator', :fg => "#555", :bold => true
|
33
|
+
|
34
|
+
style 'Literal.String', :bg => "#fff0f0"
|
35
|
+
style 'Literal.String.Char', :fg => "#04D"
|
36
|
+
style 'Literal.String.Doc', :fg => "#D42"
|
37
|
+
style 'Literal.String.Interpol', :bg => "#eee"
|
38
|
+
style 'Literal.String.Escape', :fg => "#666", :bold => true
|
39
|
+
style 'Literal.String.Regex', :fg => "#000", :bg => "#fff0ff"
|
40
|
+
style 'Literal.String.Symbol', :fg => "#A60"
|
41
|
+
style 'Literal.String.Other', :fg => "#D20"
|
42
|
+
|
43
|
+
style 'Literal.Number', :fg => "#60E", :bold => true
|
44
|
+
style 'Literal.Number.Integer', :fg => "#00D", :bold => true
|
45
|
+
style 'Literal.Number.Float', :fg => "#60E", :bold => true
|
46
|
+
style 'Literal.Number.Hex', :fg => "#058", :bold => true
|
47
|
+
style 'Literal.Number.Oct', :fg => "#40E", :bold => true
|
48
|
+
|
49
|
+
style 'Generic.Heading', :fg => "#000080", :bold => true
|
50
|
+
style 'Generic.Subheading', :fg => "#800080", :bold => true
|
51
|
+
style 'Generic.Deleted', :fg => "#A00000"
|
52
|
+
style 'Generic.Inserted', :fg => "#00A000"
|
53
|
+
style 'Generic.Error', :fg => "#FF0000"
|
54
|
+
style 'Generic.Emph', :italic => true
|
55
|
+
style 'Generic.Strong', :bold => true
|
56
|
+
style 'Generic.Prompt', :fg => "#c65d09", :bold => true
|
57
|
+
style 'Generic.Output', :fg => "#888"
|
58
|
+
style 'Generic.Traceback', :fg => "#04D"
|
59
|
+
|
60
|
+
style 'Error', :fg => "#F00", :bg => "#FAA"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -18,32 +18,36 @@ module Rouge
|
|
18
18
|
backlit = '#4df4ff'
|
19
19
|
schrill = '#ffb000'
|
20
20
|
|
21
|
-
style :fg => unicorn, :bg => krasna
|
21
|
+
style 'Text', :fg => unicorn, :bg => krasna
|
22
22
|
|
23
23
|
style 'Comment', :fg => cool_as_ice
|
24
24
|
style 'Error',
|
25
25
|
'Generic.Error', :fg => aluminum1, :bg => scarletred2
|
26
26
|
style 'Keyword', :fg => sandy, :bold => true
|
27
|
-
style 'Operator',
|
27
|
+
style 'Operator',
|
28
|
+
'Punctuation', :fg => backlit, :bold => true
|
28
29
|
style 'Comment.Preproc',
|
29
30
|
'Comment.Multiline',
|
30
31
|
'Comment.Single',
|
31
32
|
'Comment.Special', :fg => cool_as_ice, :italic => true
|
32
33
|
style 'Generic.Deleted', :fg => scarletred2
|
34
|
+
style 'Generic.Inserted', :fg => go_get_it
|
33
35
|
style 'Generic.Emph', :italic => true
|
34
36
|
style 'Generic.Subheading', :fg => '#800080', :bold => true
|
35
37
|
style 'Generic.Traceback', :fg => '#0040D0'
|
36
38
|
style 'Keyword.Constant', :fg => pink_merengue, :bold => true
|
37
39
|
style 'Keyword.Namespace',
|
38
40
|
'Keyword.Pseudo',
|
39
|
-
'Keyword.Reserved',
|
41
|
+
'Keyword.Reserved',
|
42
|
+
'Generic.Heading', :fg => schrill, :bold => true
|
40
43
|
style 'Keyword.Type',
|
41
44
|
'Name.Constant',
|
42
45
|
'Name.Class',
|
43
46
|
'Name.Decorator',
|
44
47
|
'Name.Namespace',
|
45
48
|
'Name.Builtin.Pseudo',
|
46
|
-
'Name.Exception',
|
49
|
+
'Name.Exception',
|
50
|
+
'Name.Tag', :fg => go_get_it, :bold => true
|
47
51
|
style 'Literal.Number', :fg => pink_merengue, :bold => true
|
48
52
|
style 'Literal.String', :fg => dune, :bold => true
|
49
53
|
style 'Literal.String.Escape',
|
@@ -51,15 +55,13 @@ module Rouge
|
|
51
55
|
'Literal.String.Interpol',
|
52
56
|
'Literal.String.Other',
|
53
57
|
'Literal.String.Symbol', :fg => backlit, :bold => true
|
54
|
-
style 'Name.Attribute', :fg => '#7D9029'
|
55
58
|
style 'Name.Builtin', :fg => sandy
|
56
59
|
style 'Name.Entity', :fg => '#999999', :bold => true
|
57
|
-
style 'Name.Label', :fg => '#A0A000'
|
58
|
-
style 'Name.Tag', :fg => '#008000', :bold => true
|
59
60
|
style 'Text.Whitespace', :fg => '#BBBBBB'
|
60
61
|
style 'Name.Variable',
|
61
|
-
'Name.Function',
|
62
|
-
|
62
|
+
'Name.Function',
|
63
|
+
'Name.Label',
|
64
|
+
'Name.Attribute', :fg => chilly
|
63
65
|
end
|
64
66
|
end
|
65
67
|
end
|
data/lib/rouge/token.rb
CHANGED
@@ -3,6 +3,7 @@ module Rouge
|
|
3
3
|
attr_reader :name
|
4
4
|
attr_reader :parent
|
5
5
|
attr_accessor :shortname
|
6
|
+
alias to_s name
|
6
7
|
|
7
8
|
def make_single(name)
|
8
9
|
name = name.to_s
|
@@ -40,6 +41,15 @@ module Rouge
|
|
40
41
|
@sub_tokens ||= {}
|
41
42
|
end
|
42
43
|
|
44
|
+
def ancestors(&b)
|
45
|
+
return enum_for(:ancestors) unless block_given?
|
46
|
+
|
47
|
+
if parent
|
48
|
+
yield self
|
49
|
+
parent.ancestors(&b)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
43
53
|
def ===(other)
|
44
54
|
immediate = if self.class == other.class
|
45
55
|
self == other
|
@@ -62,17 +72,19 @@ module Rouge
|
|
62
72
|
end
|
63
73
|
|
64
74
|
def get(name)
|
75
|
+
return name if name.is_a? Token
|
76
|
+
|
65
77
|
base[name]
|
66
78
|
end
|
67
79
|
|
80
|
+
alias [] get
|
81
|
+
|
68
82
|
def token(name, shortname)
|
69
83
|
tok = get(name)
|
70
84
|
tok.shortname = shortname
|
71
85
|
tok
|
72
86
|
end
|
73
87
|
|
74
|
-
alias [] get
|
75
|
-
|
76
88
|
def each_token(&b)
|
77
89
|
recurse = proc do |token|
|
78
90
|
b.call(token)
|
data/lib/rouge/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rouge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: see the description for now
|
15
15
|
email:
|
@@ -21,7 +21,12 @@ files:
|
|
21
21
|
- Gemfile
|
22
22
|
- lib/rouge/lexers/shell.rb
|
23
23
|
- lib/rouge/lexers/javascript.rb
|
24
|
+
- lib/rouge/lexers/diff.rb
|
25
|
+
- lib/rouge/lexers/text.rb
|
26
|
+
- lib/rouge/lexers/html.rb
|
27
|
+
- lib/rouge/lexers/css.rb
|
24
28
|
- lib/rouge/themes/thankful_eyes.rb
|
29
|
+
- lib/rouge/themes/colorful.rb
|
25
30
|
- lib/rouge/token.rb
|
26
31
|
- lib/rouge/formatters/html.rb
|
27
32
|
- lib/rouge/version.rb
|