summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/CodeRay.tmproj94
-rw-r--r--lib/coderay/encoders/html.rb12
-rw-r--r--lib/coderay/scanner.rb15
-rw-r--r--lib/coderay/scanners/diff.rb32
-rw-r--r--lib/coderay/scanners/ruby.rb15
-rw-r--r--lib/coderay/scanners/ruby/string_state.rb2
-rw-r--r--lib/coderay/styles/alpha.rb4
-rw-r--r--lib/coderay/tokens.rb9
-rw-r--r--test/unit/tokens.rb11
9 files changed, 145 insertions, 49 deletions
diff --git a/etc/CodeRay.tmproj b/etc/CodeRay.tmproj
index 1bbbc22..b53014e 100644
--- a/etc/CodeRay.tmproj
+++ b/etc/CodeRay.tmproj
@@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>currentDocument</key>
- <string>../lib/coderay/scanners/ruby.rb</string>
+ <string>../lib/coderay/tokens.rb</string>
<key>documents</key>
<array>
<dict>
@@ -17,6 +17,8 @@
<string>../lib</string>
</dict>
<dict>
+ <key>expanded</key>
+ <true/>
<key>name</key>
<string>bin</string>
<key>regexFolderFilter</key>
@@ -109,6 +111,8 @@
<date>2011-05-23T23:35:00Z</date>
</dict>
<dict>
+ <key>expanded</key>
+ <true/>
<key>name</key>
<string>executable</string>
<key>regexFolderFilter</key>
@@ -176,54 +180,116 @@
<key>firstVisibleLine</key>
<integer>3</integer>
</dict>
- <key>../lib/coderay/scanners/ruby.rb</key>
+ <key>../lib/coderay/encoders/html.rb</key>
<dict>
<key>caret</key>
<dict>
<key>column</key>
- <integer>39</integer>
+ <integer>22</integer>
<key>line</key>
- <integer>83</integer>
+ <integer>99</integer>
</dict>
<key>firstVisibleColumn</key>
<integer>0</integer>
<key>firstVisibleLine</key>
- <integer>71</integer>
+ <integer>78</integer>
</dict>
- <key>../lib/coderay/scanners/ruby/patterns.rb</key>
+ <key>../lib/coderay/scanner.rb</key>
<dict>
<key>caret</key>
<dict>
<key>column</key>
- <integer>28</integer>
+ <integer>31</integer>
<key>line</key>
- <integer>28</integer>
+ <integer>204</integer>
</dict>
+ <key>columnSelection</key>
+ <false/>
<key>firstVisibleColumn</key>
<integer>0</integer>
<key>firstVisibleLine</key>
+ <integer>177</integer>
+ <key>selectFrom</key>
+ <dict>
+ <key>column</key>
+ <integer>18</integer>
+ <key>line</key>
+ <integer>204</integer>
+ </dict>
+ <key>selectTo</key>
+ <dict>
+ <key>column</key>
+ <integer>34</integer>
+ <key>line</key>
+ <integer>204</integer>
+ </dict>
+ </dict>
+ <key>../lib/coderay/scanners/diff.rb</key>
+ <dict>
+ <key>caret</key>
+ <dict>
+ <key>column</key>
+ <integer>52</integer>
+ <key>line</key>
+ <integer>110</integer>
+ </dict>
+ <key>columnSelection</key>
+ <false/>
+ <key>firstVisibleColumn</key>
<integer>0</integer>
+ <key>firstVisibleLine</key>
+ <integer>86</integer>
+ <key>selectFrom</key>
+ <dict>
+ <key>column</key>
+ <integer>48</integer>
+ <key>line</key>
+ <integer>110</integer>
+ </dict>
+ <key>selectTo</key>
+ <dict>
+ <key>column</key>
+ <integer>52</integer>
+ <key>line</key>
+ <integer>110</integer>
+ </dict>
</dict>
- <key>../lib/coderay/scanners/scheme.rb</key>
+ <key>../lib/coderay/tokens.rb</key>
<dict>
<key>caret</key>
<dict>
<key>column</key>
- <integer>32</integer>
+ <integer>36</integer>
<key>line</key>
- <integer>21</integer>
+ <integer>244</integer>
</dict>
<key>firstVisibleColumn</key>
<integer>0</integer>
<key>firstVisibleLine</key>
+ <integer>206</integer>
+ </dict>
+ <key>../test/unit/tokens.rb</key>
+ <dict>
+ <key>caret</key>
+ <dict>
+ <key>column</key>
+ <integer>26</integer>
+ <key>line</key>
+ <integer>72</integer>
+ </dict>
+ <key>firstVisibleColumn</key>
<integer>0</integer>
+ <key>firstVisibleLine</key>
+ <integer>63</integer>
</dict>
</dict>
<key>openDocuments</key>
<array>
- <string>../lib/coderay/scanners/scheme.rb</string>
- <string>../lib/coderay/scanners/ruby/patterns.rb</string>
- <string>../lib/coderay/scanners/ruby.rb</string>
+ <string>../lib/coderay/encoders/html.rb</string>
+ <string>../lib/coderay/scanners/diff.rb</string>
+ <string>../lib/coderay/scanner.rb</string>
+ <string>../lib/coderay/tokens.rb</string>
+ <string>../test/unit/tokens.rb</string>
</array>
<key>showFileHierarchyDrawer</key>
<true/>
diff --git a/lib/coderay/encoders/html.rb b/lib/coderay/encoders/html.rb
index 67d487c..724f3eb 100644
--- a/lib/coderay/encoders/html.rb
+++ b/lib/coderay/encoders/html.rb
@@ -96,16 +96,16 @@ module Encoders
DEFAULT_OPTIONS = {
:tab_width => 8,
- :css => :class,
+ :css => :class,
:style => :alpha,
- :wrap => nil,
+ :wrap => nil,
:title => 'CodeRay output',
- :line_numbers => nil,
+ :line_numbers => nil,
:line_number_anchors => 'n',
- :line_number_start => 1,
- :bold_every => 10,
- :highlight_lines => nil,
+ :line_number_start => 1,
+ :bold_every => 10,
+ :highlight_lines => nil,
:hint => false,
}
diff --git a/lib/coderay/scanner.rb b/lib/coderay/scanner.rb
index 925acf7..ec2b3aa 100644
--- a/lib/coderay/scanner.rb
+++ b/lib/coderay/scanner.rb
@@ -61,6 +61,8 @@ module CodeRay
KINDS_NOT_LOC = [:comment, :doctype, :docstring]
+ attr_accessor :state
+
class << self
# Normalizes the given code into a string with UNIX newlines, in the
@@ -190,7 +192,14 @@ module CodeRay
else
raise ArgumentError, 'expected String, Array, or nil'
end
- scan_tokens @tokens, options
+
+ begin
+ scan_tokens @tokens, options
+ rescue => e
+ message = "Error in %s#scan_tokens, initial state was: %p" % [self.class, defined?(state) && state]
+ raise_inspect e.message, @tokens, message, 30, e.backtrace
+ end
+
@cached_tokens = @tokens
if source.is_a? Array
@tokens.split_into_parts(*source.map { |part| part.size })
@@ -260,7 +269,7 @@ module CodeRay
end
# Scanner error with additional status information
- def raise_inspect msg, tokens, state = 'No state given!', ambit = 30
+ def raise_inspect msg, tokens, state = self.state || 'No state given!', ambit = 30, backtrace = caller
raise ScanError, <<-EOE % [
@@ -288,7 +297,7 @@ surrounding code:
matched, state, bol?, eos?,
string[pos - ambit, ambit],
string[pos, ambit],
- ]
+ ], backtrace
end
# Shorthand for scan_until(/\z/).
diff --git a/lib/coderay/scanners/diff.rb b/lib/coderay/scanners/diff.rb
index a8a63e9..fd12922 100644
--- a/lib/coderay/scanners/diff.rb
+++ b/lib/coderay/scanners/diff.rb
@@ -11,7 +11,7 @@ module Scanners
DEFAULT_OPTIONS = {
:highlight_code => true,
- :inline_diff => true,
+ :inline_diff => true,
}
protected
@@ -73,7 +73,7 @@ module Scanners
next unless match = scan(/.+/)
encoder.text_token match, :plain
elsif match = scan(/@@(?>[^@\n]*)@@/)
- content_scanner.instance_variable_set(:@state, :initial) unless match?(/\n\+/)
+ content_scanner.state = :initial unless match?(/\n\+/)
content_scanner_entry_state = nil
if check(/\n|$/)
encoder.begin_line line_kind = :change
@@ -106,37 +106,39 @@ module Scanners
encoder.begin_line line_kind = :delete
encoder.text_token match, :delete
if options[:inline_diff] && deleted_lines == 1 && check(/(?>.*)\n\+(?>.*)$(?!\n\+)/)
- if content_scanner.instance_variable_defined?(:@state)
- content_scanner_entry_state = content_scanner.instance_variable_get(:@state)
- end
+ content_scanner_entry_state = content_scanner.state
skip(/(.*)\n\+(.*)$/)
head, deletion, insertion, tail = diff self[1], self[2]
pre, deleted, post = content_scanner.tokenize [head, deletion, tail], :tokens => Tokens.new
encoder.tokens pre
- encoder.begin_group :eyecatcher
- encoder.tokens deleted
- encoder.end_group :eyecatcher
+ unless deleted.empty?
+ encoder.begin_group :eyecatcher
+ encoder.tokens deleted
+ encoder.end_group :eyecatcher
+ end
encoder.tokens post
encoder.end_line line_kind
encoder.text_token "\n", :space
encoder.begin_line line_kind = :insert
encoder.text_token '+', :insert
- content_scanner.instance_variable_set(:@state, content_scanner_entry_state || :initial)
+ content_scanner.state = content_scanner_entry_state || :initial
pre, inserted, post = content_scanner.tokenize [head, insertion, tail], :tokens => Tokens.new
encoder.tokens pre
- encoder.begin_group :eyecatcher
- encoder.tokens inserted
- encoder.end_group :eyecatcher
+ unless inserted.empty?
+ encoder.begin_group :eyecatcher
+ encoder.tokens inserted
+ encoder.end_group :eyecatcher
+ end
encoder.tokens post
elsif match = scan(/.*/)
if options[:highlight_code]
- if deleted_lines == 1 && content_scanner.instance_variable_defined?(:@state)
- content_scanner_entry_state = content_scanner.instance_variable_get(:@state)
+ if deleted_lines == 1
+ content_scanner_entry_state = content_scanner.state
end
content_scanner.tokenize match, :tokens => encoder unless match.empty?
if !match?(/\n-/)
if match?(/\n\+/)
- content_scanner.instance_variable_set(:@state, content_scanner_entry_state || :initial)
+ content_scanner.state = content_scanner_entry_state || :initial
end
content_scanner_entry_state = nil
end
diff --git a/lib/coderay/scanners/ruby.rb b/lib/coderay/scanners/ruby.rb
index 299accc..b3c7de1 100644
--- a/lib/coderay/scanners/ruby.rb
+++ b/lib/coderay/scanners/ruby.rb
@@ -23,8 +23,9 @@ module Scanners
end
def scan_tokens encoder, options
+ state, heredocs = @state
+ heredocs = heredocs.dup if heredocs.is_a?(Array)
- state = @state
if state && state.instance_of?(self.class::StringState)
encoder.begin_group state.type
end
@@ -34,10 +35,15 @@ module Scanners
method_call_expected = false
value_expected = true
- heredocs = nil
inline_block_stack = nil
inline_block_curly_depth = 0
+ if heredocs
+ state = heredocs.shift
+ encoder.begin_group state.type
+ heredocs = nil if heredocs.empty?
+ end
+
# def_object_stack = nil
# def_object_paren_depth = 0
@@ -421,11 +427,14 @@ module Scanners
# cleaning up
if options[:keep_state]
- @state = state
+ heredocs = nil if heredocs && heredocs.empty?
+ @state = state, heredocs
end
+
if state.is_a? self.class::StringState
encoder.end_group state.type
end
+
if inline_block_stack
until inline_block_stack.empty?
state, = *inline_block_stack.pop
diff --git a/lib/coderay/scanners/ruby/string_state.rb b/lib/coderay/scanners/ruby/string_state.rb
index 14127c6..2f398d1 100644
--- a/lib/coderay/scanners/ruby/string_state.rb
+++ b/lib/coderay/scanners/ruby/string_state.rb
@@ -55,7 +55,7 @@ module Scanners
def heredoc_pattern delim, interpreted, indented
# delim = delim.dup # workaround for old Ruby
delim_pattern = Regexp.escape(delim)
- delim_pattern = / \n #{ '(?>[ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x
+ delim_pattern = / (?:\A|\n) #{ '(?>[ \t]*)' if indented } #{ Regexp.new delim_pattern } $ /x
if interpreted
/ (?= #{delim_pattern}() | \\ | \# [{$@] ) /mx # $1 set == end of heredoc
else
diff --git a/lib/coderay/styles/alpha.rb b/lib/coderay/styles/alpha.rb
index 5747abb..6399d7d 100644
--- a/lib/coderay/styles/alpha.rb
+++ b/lib/coderay/styles/alpha.rb
@@ -141,8 +141,8 @@ table.CodeRay td { padding: 2px 4px; vertical-align: top; }
.head { color: #f8f; background: #505 }
.head .filename { color: white; }
-.ins .eye { background-color: hsla(120,100%,50%,0.2) }
-.del .eye { background-color: hsla(0,100%,50%,0.2) }
+.del .eye { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; }
+.ins .eye { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }
.ins .ins { color: #080; background:transparent; font-weight:bold }
.del .del { color: #800; background:transparent; font-weight:bold }
diff --git a/lib/coderay/tokens.rb b/lib/coderay/tokens.rb
index e7da7e8..f6f8845 100644
--- a/lib/coderay/tokens.rb
+++ b/lib/coderay/tokens.rb
@@ -223,12 +223,15 @@ module CodeRay
content_or_kind
end
end
- parts << part.concat(closing)
- part = Tokens.new
+ part.concat closing
+ begin
+ parts << part
+ part = Tokens.new
+ size = sizes[i += 1]
+ end until size.nil? || size > 0
# ...and open them again.
part.concat opened.flatten
part_size = 0
- size = sizes[i += 1]
redo unless content.empty?
else
part << content << item
diff --git a/test/unit/tokens.rb b/test/unit/tokens.rb
index 51d286e..4fc9833 100644
--- a/test/unit/tokens.rb
+++ b/test/unit/tokens.rb
@@ -65,14 +65,21 @@ class TokensTest < Test::Unit::TestCase
end
def test_split_into_parts
- parts = [
+ parts_4_3 = [
["stri", :type],
["ng", :type, :begin_group, :operator, "(", :content, :end_group, :operator],
[:begin_group, :operator, ")", :content, :end_group, :operator]
]
- assert_equal parts, make_tokens.split_into_parts(4, 3)
+ assert_equal parts_4_3, make_tokens.split_into_parts(4, 3)
assert_equal [make_tokens.to_a], make_tokens.split_into_parts
+ parts_7_0_1 = [
+ ["string", :type, :begin_group, :operator, "(", :content, :end_group, :operator],
+ [],
+ [:begin_group, :operator, ")", :content, :end_group, :operator]
+ ]
+ assert_equal parts_7_0_1, make_tokens.split_into_parts(7, 0, 1)
+
line = CodeRay::Tokens[:begin_line, :head, '...', :plain]
line_parts = [
[:begin_line, :head, ".", :plain, :end_line, :head],