From a4bd413ca4e835fd3d1fdc24eebce67cd54231ca Mon Sep 17 00:00:00 2001 From: murphy Date: Tue, 30 Sep 2008 16:42:53 +0000 Subject: New: *Simple Diff Scanner* (closes #22). * Highlights unified diffs, especially like the ones svn diff outputs. * Changes to make highlighting of whole lines were necessary. * I added two example files. More changes: * Added token classes :head, :delete, :insert, and :change along with styles. * Added two new special token types: :begin_line and :end_line. They mark token groups that explicitly span whole lines and should be highlighted as such. * The HTML encoder converts these new tokens to DIVs. May need more work. * The Debug Encoder uses square brackets for line tokens. * Some cleanups. --- lib/coderay/encoders/debug.rb | 8 ++++++++ lib/coderay/encoders/html.rb | 27 ++++++++++++++++++++++++++- lib/coderay/encoders/html/numerization.rb | 4 +++- lib/coderay/encoders/html/output.rb | 4 +++- 4 files changed, 40 insertions(+), 3 deletions(-) (limited to 'lib/coderay/encoders') diff --git a/lib/coderay/encoders/debug.rb b/lib/coderay/encoders/debug.rb index 8e1c0f0..a4b0648 100644 --- a/lib/coderay/encoders/debug.rb +++ b/lib/coderay/encoders/debug.rb @@ -35,6 +35,14 @@ module Encoders ">" end + def begin_line kind + "#{kind}[" + end + + def end_line kind + "]" + end + end end diff --git a/lib/coderay/encoders/html.rb b/lib/coderay/encoders/html.rb index 2edcf1d..8d13cf5 100644 --- a/lib/coderay/encoders/html.rb +++ b/lib/coderay/encoders/html.rb @@ -226,13 +226,16 @@ module Encoders text = text.gsub(/#{HTML_ESCAPE_PATTERN}/o) { |m| @HTML_ESCAPE[m] } end @opened[0] = type - if style = @css_style[@opened] + if text != "\n" && style = @css_style[@opened] @out << style << text << '' else @out << text end else + case text + + # token groups, eg. strings when :open @opened[0] = type @out << (@css_style[@opened] || '') @@ -248,6 +251,28 @@ module Encoders @out << '' @opened.pop end + + # whole lines to be highlighted, eg. a deleted line in a diff + when :begin_line + @opened[0] = type + if style = @css_style[@opened] + @out << style.sub('' + end + @opened << type + when :end_line + if @opened.empty? + # nothing to close + else + if $DEBUG and (@opened.size == 1 or @opened.last != type) + raise 'Malformed token stream: Trying to close a line (%p) \ + that is not open. Open are: %p.' % [type, @opened[1..-1]] + end + @out << '' + @opened.pop + end + when nil raise 'Token with nil as text was given: %p' % [[text, type]] else diff --git a/lib/coderay/encoders/html/numerization.rb b/lib/coderay/encoders/html/numerization.rb index d784bbe..9f1667f 100644 --- a/lib/coderay/encoders/html/numerization.rb +++ b/lib/coderay/encoders/html/numerization.rb @@ -71,6 +71,7 @@ module Encoders line_numbers.gsub!(/\n/) { "\n" } line_numbers_table_tpl = TABLE.apply('LINE_NUMBERS', line_numbers) + gsub!(/<\/div>\n/) { '' } gsub!(/\n/) { "\n" } wrap_in! line_numbers_table_tpl @wrapped_in = :div @@ -90,8 +91,9 @@ module Encoders end close = '' * opened_tags.size - "
  • #{open}#{line}#{close}
  • " + "
  • #{open}#{line}#{close}
  • \n" end + chomp!("\n") wrap_in! LIST @wrapped_in = :div diff --git a/lib/coderay/encoders/html/output.rb b/lib/coderay/encoders/html/output.rb index e74e55e..8def95e 100644 --- a/lib/coderay/encoders/html/output.rb +++ b/lib/coderay/encoders/html/output.rb @@ -166,7 +166,9 @@ module Encoders # title="double click to expand" LIST = <<-`LIST` -
      <%CONTENT%>
    +
      +<%CONTENT%> +
    LIST PAGE = <<-`PAGE` -- cgit v1.2.1