@@ -177,14 +177,14 @@ def extract_window(original_lines, corrected_lines, target_line)
177177 ( start_idx ..end_idx ) . each do |i |
178178 change = diffs [ i ]
179179 if change . unchanged?
180- result << " #{ change . old_element } "
180+ result << visualize_trailing_whitespace ( " #{ change . old_element } " )
181181 elsif change . changed?
182- result << "-#{ change . old_element } "
183- result << "+#{ change . new_element } "
182+ result << visualize_trailing_whitespace ( "-#{ change . old_element } " )
183+ result << visualize_trailing_whitespace ( "+#{ change . new_element } " )
184184 elsif change . deleting?
185- result << "-#{ change . old_element } "
185+ result << visualize_trailing_whitespace ( "-#{ change . old_element } " )
186186 elsif change . adding?
187- result << "+#{ change . new_element } "
187+ result << visualize_trailing_whitespace ( "+#{ change . new_element } " )
188188 end
189189 end
190190
@@ -233,18 +233,39 @@ def generate_diff(original_lines, corrected_lines)
233233 result = [ ]
234234 diffs . each do |change |
235235 if change . unchanged?
236- result << " #{ change . old_element } "
236+ result << visualize_trailing_whitespace ( " #{ change . old_element } " )
237237 elsif change . changed?
238- result << "-#{ change . old_element } "
239- result << "+#{ change . new_element } "
238+ result << visualize_trailing_whitespace ( "-#{ change . old_element } " )
239+ result << visualize_trailing_whitespace ( "+#{ change . new_element } " )
240240 elsif change . deleting?
241- result << "-#{ change . old_element } "
241+ result << visualize_trailing_whitespace ( "-#{ change . old_element } " )
242242 elsif change . adding?
243- result << "+#{ change . new_element } "
243+ result << visualize_trailing_whitespace ( "+#{ change . new_element } " )
244244 end
245245 end
246246
247247 result
248248 end
249+
250+ def visualize_trailing_whitespace ( line )
251+ # Check if line (without newline) has trailing whitespace
252+ # Match: <diff prefix><content><trailing whitespace>
253+ pattern = /
254+ ^([-+\ ]) # Diff prefix: -, +, or space
255+ (.*?) # Content (non-greedy)
256+ ([ \t ]+) # Trailing whitespace (spaces or tabs)
257+ $ # End of line
258+ /x
259+
260+ if line . chomp =~ pattern
261+ prefix = $1
262+ content = $2
263+ trailing = $3
264+ markers = trailing . gsub ( ' ' , '·' ) . gsub ( "\t " , '→' )
265+ "#{ prefix } #{ content } #{ markers } \n "
266+ else
267+ line
268+ end
269+ end
249270 end
250271end
0 commit comments