@@ -197,7 +197,7 @@ def offsets(line_left, line_right)
197197 starting += 1
198198 end
199199 ending = -1
200- while ending >= -( max - starting ) && line_left [ ending ] == line_right [ ending ]
200+ while ending >= -( max - starting ) && ( line_left [ ending ] == line_right [ ending ] )
201201 ending -= 1
202202 end
203203 unless starting == 0 && ending == -1
@@ -209,6 +209,8 @@ def offsets(line_left, line_right)
209209
210210 # A line of diff
211211 class Diff
212+ include ActionView ::Helpers ::TagHelper
213+
212214 attr_accessor :nb_line_left
213215 attr_accessor :line_left
214216 attr_accessor :nb_line_right
@@ -235,27 +237,15 @@ def line
235237 end
236238
237239 def html_line_left
238- if offsets
239- line_left . dup . insert ( offsets . first , '<span>' ) . insert ( offsets . last , '</span>' ) . html_safe
240- else
241- line_left
242- end
240+ line_to_html ( line_left , offsets )
243241 end
244242
245243 def html_line_right
246- if offsets
247- line_right . dup . insert ( offsets . first , '<span>' ) . insert ( offsets . last , '</span>' ) . html_safe
248- else
249- line_right
250- end
244+ line_to_html ( line_right , offsets )
251245 end
252246
253247 def html_line
254- if offsets
255- line . dup . insert ( offsets . first , '<span>' ) . insert ( offsets . last , '</span>' ) . html_safe
256- else
257- line
258- end
248+ line_to_html ( line , offsets )
259249 end
260250
261251 def inspect
@@ -265,5 +255,29 @@ def inspect
265255 puts nb_line_right
266256 puts line_right
267257 end
258+
259+ private
260+
261+ def line_to_html ( line , offsets )
262+ line_to_html_raw ( line , offsets ) . tap do |html_str |
263+ html_str . force_encoding ( 'UTF-8' )
264+ end
265+ end
266+
267+ def line_to_html_raw ( line , offsets )
268+ return line unless offsets
269+
270+ ActiveSupport ::SafeBuffer . new . tap do |output |
271+ if offsets . first != 0
272+ output << line [ 0 ..offsets . first -1 ]
273+ end
274+
275+ output << content_tag ( :span , line [ offsets . first ..offsets . last ] )
276+
277+ unless offsets . last == -1
278+ output << line [ offsets . last +1 ..-1 ]
279+ end
280+ end . to_s
281+ end
268282 end
269283end
0 commit comments