11require "redcarpet"
2+ require "byebug"
23require "coderay"
4+ require "nokogiri"
5+
6+ class EmberEncoder < CodeRay ::Encoders ::Div
7+ FILE_EXTENSION = 'ember.html'
8+ register_for :ember
9+
10+ end
311
412module Highlighter
513 class MissingLanguageError < StandardError ; end
@@ -17,47 +25,75 @@ def _highlight(string, language, class_name=nil)
1725
1826 raise MissingLanguageError , error_message if language . nil?
1927
20- language , file_name = _detect_language_and_filename ( language )
28+ language , file_name , changes = _detect_language_filename_and_changes ( language )
2129
2230 result = %Q{<div class="highlight #{ language } #{ class_name } ">}
2331 result += '<div class="ribbon"></div>'
2432 result += '<div class="scroller">'
25- result += _code_table ( string , language , file_name )
33+ result += _code_table ( string , language , file_name , changes )
2634 result += '</div>'
2735 result += %Q{</div>}
2836 result
2937 end
3038
31- def _detect_language_and_filename ( language )
32-
39+ def _detect_language_filename_and_changes ( language )
3340 file_name = nil
41+ changes = [ ]
42+ changes_regex = /\{ (.+)\} $/
3443 bare_language_regex = /\A \w +\z /
3544
45+ if change_numbers = changes_regex . match ( language )
46+ language = language . sub ( changes_regex , '' )
47+
48+ changes = _parse_changes ( change_numbers [ 1 ] )
49+ end
50+
3651 unless language =~ bare_language_regex
3752 file_name = language
3853
39- language = case /\. (\w +)$/ . match ( language ) [ 1 ]
40- when 'hbs'
41- 'handlebars'
42- when 'js'
43- 'javascript'
44- when 'html'
45- 'html'
46- when 'css'
47- 'css'
48- when 'json'
49- 'json'
50- end
54+ language = _determine_language ( language )
55+ end
56+ [ language , file_name , changes ]
57+ end
58+
59+ def _determine_language ( language )
60+ case /\. (\w +)$/ . match ( language ) [ 1 ]
61+ when 'hbs'
62+ 'handlebars'
63+ when 'js'
64+ 'javascript'
65+ when 'html'
66+ 'html'
67+ when 'css'
68+ 'css'
69+ when 'json'
70+ 'json'
71+ end
72+ end
73+
74+ def _parse_changes ( change_numbers )
75+ changes = change_numbers . split ( ',' ) . map do |change |
76+ state = case change . slice ( 0 )
77+ when '+'
78+ 'added'
79+ when '-'
80+ 'removed'
81+ else
82+ nil
83+ end
84+
85+ [ change . to_i . abs , state ]
5186 end
52- [ language , file_name ]
5387 end
5488
55- def _code_table ( string , language , file_name )
89+ def _code_table ( string , language , file_name , changes )
5690 code = CodeRay . scan ( string , language )
5791
58- table = code . div css : :class ,
92+ # debugger
93+ table = code . ember css : :class ,
5994 line_numbers : :table ,
60- line_number_anchors : false
95+ line_number_anchors : false ,
96+ highlight_lines : [ 1 , 3 ]
6197
6298 if file_name . present?
6399
@@ -71,7 +107,30 @@ def _code_table(string, language, file_name)
71107HEADER
72108 end
73109
74- table
110+ _highlight_lines ( table , changes )
111+ end
112+
113+ def _highlight_lines ( table , highlights )
114+ return table if highlights . empty?
115+
116+ table_xml = Nokogiri . XML ( table )
117+
118+ numbers_node = table_xml . at_xpath ( '//td[@class="line-numbers"]/pre' )
119+ code_node = table_xml . at_xpath ( '//td[@class="code"]/pre' )
120+
121+ numbers_contents = numbers_node . inner_html . split ( "\n " )
122+ code_contents = code_node . inner_html . split ( "\n " )
123+
124+ highlights . each do |line_number , state |
125+ index = line_number - 1
126+ numbers_contents [ index ] = "<span class=\" highlight-line #{ state } \" >#{ numbers_contents [ index ] } </span>"
127+ code_contents [ index ] = "<span class=\" highlight-line #{ state } \" >#{ code_contents [ index ] } </span>"
128+ end
129+
130+ numbers_node . inner_html = numbers_contents . join ( "\n " )
131+ code_node . inner_html = code_contents . join ( "\n " )
132+
133+ table_xml . to_xml
75134 end
76135
77136 def highlight ( language , class_name , &block )
0 commit comments