diff options
author | murphy <murphy@rubychan.de> | 2008-08-11 12:29:56 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2008-08-11 12:29:56 +0000 |
commit | aaa083a84614e229021a4f75e5707077816dd5f9 (patch) | |
tree | a7a3eea4a688a4cc4ed157daa503843aaae64a11 | |
parent | 13fba921998464920d06fc7f014a7e6589d83d6c (diff) | |
download | coderay-aaa083a84614e229021a4f75e5707077816dd5f9.tar.gz |
Added diff task and a Redmine TODO.
-rw-r--r-- | etc/coderay-lib.tmproj | 18 | ||||
-rw-r--r-- | etc/todo/redmine.todo | 573 | ||||
-rw-r--r-- | rake_tasks/diff.rake | 86 |
3 files changed, 669 insertions, 8 deletions
diff --git a/etc/coderay-lib.tmproj b/etc/coderay-lib.tmproj index e030f32..b787e8c 100644 --- a/etc/coderay-lib.tmproj +++ b/etc/coderay-lib.tmproj @@ -75,17 +75,19 @@ <string>../Rakefile</string> <key>lastUsed</key> <date>2008-08-06T18:57:10Z</date> + </dict> + <dict> + <key>filename</key> + <string>../README</string> + </dict> + <dict> + <key>filename</key> + <string>../diff</string> + <key>lastUsed</key> + <date>2008-08-11T12:12:11Z</date> <key>selected</key> <true/> </dict> - <dict> - <key>filename</key> - <string>../README</string> - </dict> - <dict> - <key>filename</key> - <string>../diff</string> - </dict> <dict> <key>filename</key> <string>../ROADMAP</string> diff --git a/etc/todo/redmine.todo b/etc/todo/redmine.todo new file mode 100644 index 0000000..1979a80 --- /dev/null +++ b/etc/todo/redmine.todo @@ -0,0 +1,573 @@ +Index: lib/coderay/encoders/html.rb +=================================================================== +--- lib/coderay/encoders/html.rb (revision 644) ++++ lib/coderay/encoders/html.rb (revision 1729) +@@ -25,6 +25,10 @@ + # + # == Options + # ++ # === :escape ++ # Escape html entities ++ # Default: true ++ # + # === :tab_width + # Convert \t characters to +n+ spaces (a number.) + # Default: 8 +@@ -70,6 +74,7 @@ + FILE_EXTENSION = 'html' + + DEFAULT_OPTIONS = { ++ :escape => true, + :tab_width => 8, + + :level => :xhtml, +@@ -145,6 +150,7 @@ + @HTML_ESCAPE = HTML_ESCAPE.dup + @HTML_ESCAPE["\t"] = ' ' * options[:tab_width] + ++ @escape = options[:escape] + @opened = [nil] + @css = CSS.new options[:style] + +@@ -222,7 +228,7 @@ + + def token text, type + if text.is_a? ::String +- if text =~ /#{HTML_ESCAPE_PATTERN}/o ++ if @escape && (text =~ /#{HTML_ESCAPE_PATTERN}/o) + text = text.gsub(/#{HTML_ESCAPE_PATTERN}/o) { |m| @HTML_ESCAPE[m] } + end + @opened[0] = type +Index: lib/coderay/helpers/file_type.rb +=================================================================== +--- lib/coderay/helpers/file_type.rb (revision 644) ++++ lib/coderay/helpers/file_type.rb (revision 1729) +@@ -84,9 +84,15 @@ + 'cpp' => :c, + 'c' => :c, + 'h' => :c, ++ 'java' => :java, ++ 'js' => :javascript, + 'xml' => :xml, + 'htm' => :html, + 'html' => :html, ++ 'php' => :php, ++ 'php3' => :php, ++ 'php4' => :php, ++ 'php5' => :php, + 'xhtml' => :xhtml, + 'raydebug' => :debug, + 'rhtml' => :rhtml, +Index: lib/coderay/scanners/java.rb +=================================================================== +--- lib/coderay/scanners/java.rb (revision 0) ++++ lib/coderay/scanners/java.rb (revision 1729) +@@ -0,0 +1,130 @@ ++module CodeRay ++ module Scanners ++ class Java < Scanner ++ ++ register_for :java ++ ++ RESERVED_WORDS = %w(abstract assert break case catch class ++ const continue default do else enum extends final finally for ++ goto if implements import instanceof interface native new ++ package private protected public return static strictfp super switch ++ synchronized this throw throws transient try void volatile while) ++ ++ PREDEFINED_TYPES = %w(boolean byte char double float int long short) ++ ++ PREDEFINED_CONSTANTS = %w(true false null) ++ ++ IDENT_KIND = WordList.new(:ident). ++ add(RESERVED_WORDS, :reserved). ++ add(PREDEFINED_TYPES, :pre_type). ++ add(PREDEFINED_CONSTANTS, :pre_constant) ++ ++ ESCAPE = / [rbfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x ++ UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x ++ ++ def scan_tokens tokens, options ++ state = :initial ++ ++ until eos? ++ kind = nil ++ match = nil ++ ++ case state ++ when :initial ++ ++ if scan(/ \s+ | \\\n /x) ++ kind = :space ++ ++ elsif scan(%r! // [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) !mx) ++ kind = :comment ++ ++ elsif match = scan(/ \# \s* if \s* 0 /x) ++ match << scan_until(/ ^\# (?:elif|else|endif) .*? $ | \z /xm) unless eos? ++ kind = :comment ++ ++ elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) /x) ++ kind = :operator ++ ++ elsif match = scan(/ [A-Za-z_][A-Za-z_0-9]* /x) ++ kind = IDENT_KIND[match] ++ if kind == :ident and check(/:(?!:)/) ++ match << scan(/:/) ++ kind = :label ++ end ++ ++ elsif match = scan(/L?"/) ++ tokens << [:open, :string] ++ if match[0] == ?L ++ tokens << ['L', :modifier] ++ match = '"' ++ end ++ state = :string ++ kind = :delimiter ++ ++ elsif scan(%r! \@ .* !x) ++ kind = :preprocessor ++ ++ elsif scan(/ L?' (?: [^\'\n\\] | \\ #{ESCAPE} )? '? /ox) ++ kind = :char ++ ++ elsif scan(/0[xX][0-9A-Fa-f]+/) ++ kind = :hex ++ ++ elsif scan(/(?:0[0-7]+)(?![89.eEfF])/) ++ kind = :oct ++ ++ elsif scan(/(?:\d+)(?![.eEfF])/) ++ kind = :integer ++ ++ elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/) ++ kind = :float ++ ++ else ++ getch ++ kind = :error ++ ++ end ++ ++ when :string ++ if scan(/[^\\\n"]+/) ++ kind = :content ++ elsif scan(/"/) ++ tokens << ['"', :delimiter] ++ tokens << [:close, :string] ++ state = :initial ++ next ++ elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox) ++ kind = :char ++ elsif scan(/ \\ | $ /x) ++ tokens << [:close, :string] ++ kind = :error ++ state = :initial ++ else ++ raise_inspect "else case \" reached; %p not handled." % peek(1), tokens ++ end ++ ++ else ++ raise_inspect 'Unknown state', tokens ++ ++ end ++ ++ match ||= matched ++ if $DEBUG and not kind ++ raise_inspect 'Error token %p in line %d' % ++ [[match, kind], line], tokens ++ end ++ raise_inspect 'Empty token', tokens unless match ++ ++ tokens << [match, kind] ++ ++ end ++ ++ if state == :string ++ tokens << [:close, :string] ++ end ++ ++ tokens ++ end ++ end ++ end ++end + +Property changes on: lib/coderay/scanners/java.rb +___________________________________________________________________ +Name: svn:eol-style + + native + +Index: lib/coderay/scanners/c.rb +=================================================================== +--- lib/coderay/scanners/c.rb (revision 644) ++++ lib/coderay/scanners/c.rb (revision 1729) +@@ -122,7 +122,7 @@ + end + + when :include_expected +- if scan(/<[^>\n]+>?|"[^"\n\\]*(?:\\.[^"\n\\]*)*"?/) ++ if scan(/[^\n]+/) + kind = :include + state = :initial + +Index: lib/coderay/scanners/javascript.rb +=================================================================== +--- lib/coderay/scanners/javascript.rb (revision 0) ++++ lib/coderay/scanners/javascript.rb (revision 1729) +@@ -0,0 +1,176 @@ ++# http://pastie.textmate.org/50774/
++module CodeRay module Scanners
++
++ class JavaScript < Scanner
++
++ register_for :javascript
++
++ RESERVED_WORDS = [
++ 'asm', 'break', 'case', 'continue', 'default', 'do', 'else',
++ 'for', 'goto', 'if', 'return', 'switch', 'while',
++# 'struct', 'union', 'enum', 'typedef',
++# 'static', 'register', 'auto', 'extern',
++# 'sizeof',
++ 'typeof',
++# 'volatile', 'const', # C89
++# 'inline', 'restrict', # C99
++ 'var', 'function','try','new','in',
++ 'instanceof','throw','catch'
++ ]
++
++ PREDEFINED_CONSTANTS = [
++ 'void', 'null', 'this',
++ 'true', 'false','undefined',
++ ]
++
++ IDENT_KIND = WordList.new(:ident).
++ add(RESERVED_WORDS, :reserved).
++ add(PREDEFINED_CONSTANTS, :pre_constant)
++
++ ESCAPE = / [rbfnrtv\n\\\/'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x
++ UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x
++
++ def scan_tokens tokens, options
++
++ state = :initial
++ string_type = nil
++ regexp_allowed = true
++
++ until eos?
++
++ kind = :error
++ match = nil
++
++ if state == :initial
++
++ if scan(/ \s+ | \\\n /x)
++ kind = :space
++
++ elsif scan(%r! // [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) !mx)
++ kind = :comment
++ regexp_allowed = false
++
++ elsif match = scan(/ \# \s* if \s* 0 /x)
++ match << scan_until(/ ^\# (?:elif|else|endif) .*? $ | \z /xm) unless eos?
++ kind = :comment
++ regexp_allowed = false
++
++ elsif regexp_allowed and scan(/\//)
++ tokens << [:open, :regexp]
++ state = :regex
++ kind = :delimiter
++
++ elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%] | \.(?!\d) /x)
++ kind = :operator
++ regexp_allowed=true
++
++ elsif match = scan(/ [$A-Za-z_][A-Za-z_0-9]* /x)
++ kind = IDENT_KIND[match]
++# if kind == :ident and check(/:(?!:)/)
++# match << scan(/:/)
++# kind = :label
++# end
++ regexp_allowed=false
++
++ elsif match = scan(/["']/)
++ tokens << [:open, :string]
++ string_type = matched
++ state = :string
++ kind = :delimiter
++
++# elsif scan(/#\s*(\w*)/)
++# kind = :preprocessor # FIXME multiline preprocs
++# state = :include_expected if self[1] == 'include'
++#
++# elsif scan(/ L?' (?: [^\'\n\\] | \\ #{ESCAPE} )? '? /ox)
++# kind = :char
++
++ elsif scan(/0[xX][0-9A-Fa-f]+/)
++ kind = :hex
++ regexp_allowed=false
++
++ elsif scan(/(?:0[0-7]+)(?![89.eEfF])/)
++ kind = :oct
++ regexp_allowed=false
++
++ elsif scan(/(?:\d+)(?![.eEfF])/)
++ kind = :integer
++ regexp_allowed=false
++
++ elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/)
++ kind = :float
++ regexp_allowed=false
++
++ else
++ getch
++ end
++
++ elsif state == :regex
++ if scan(/[^\\\/]+/)
++ kind = :content
++ elsif scan(/\\\/|\\\\/)
++ kind = :content
++ elsif scan(/\//)
++ tokens << [matched, :delimiter]
++ tokens << [:close, :regexp]
++ state = :initial
++ next
++ else
++ getch
++ kind = :content
++ end
++
++ elsif state == :string
++ if scan(/[^\\"']+/)
++ kind = :content
++ elsif scan(/["']/)
++ if string_type==matched
++ tokens << [matched, :delimiter]
++ tokens << [:close, :string]
++ state = :initial
++ string_type=nil
++ next
++ else
++ kind = :content
++ end
++ elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox)
++ kind = :char
++ elsif scan(/ \\ | $ /x)
++ kind = :error
++ state = :initial
++ else
++ raise "else case \" reached; %p not handled." % peek(1), tokens
++ end
++
++# elsif state == :include_expected
++# if scan(/<[^>\n]+>?|"[^"\n\\]*(?:\\.[^"\n\\]*)*"?/)
++# kind = :include
++# state = :initial
++#
++# elsif match = scan(/\s+/)
++# kind = :space
++# state = :initial if match.index ?\n
++#
++# else
++# getch
++#
++# end
++#
++ else
++ raise 'else-case reached', tokens
++
++ end
++
++ match ||= matched
++# raise [match, kind], tokens if kind == :error
++
++ tokens << [match, kind]
++
++ end
++ tokens
++
++ end
++
++ end
++
++end end +\ No newline at end of file +Index: lib/coderay/scanners/php.rb +=================================================================== +--- lib/coderay/scanners/php.rb (revision 0) ++++ lib/coderay/scanners/php.rb (revision 1729) +@@ -0,0 +1,165 @@ ++module CodeRay module Scanners ++ ++ class PHP < Scanner ++ ++ register_for :php ++ ++ RESERVED_WORDS = [ ++ 'and', 'or', 'xor', '__FILE__', 'exception', '__LINE__', 'array', 'as', 'break', 'case', ++ 'class', 'const', 'continue', 'declare', 'default', ++ 'die', 'do', 'echo', 'else', 'elseif', ++ 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', ++ 'endswitch', 'endwhile', 'eval', 'exit', 'extends', ++ 'for', 'foreach', 'function', 'global', 'if', ++ 'include', 'include_once', 'isset', 'list', 'new', ++ 'print', 'require', 'require_once', 'return', 'static', ++ 'switch', 'unset', 'use', 'var', 'while', ++ '__FUNCTION__', '__CLASS__', '__METHOD__', 'final', 'php_user_filter', ++ 'interface', 'implements', 'extends', 'public', 'private', ++ 'protected', 'abstract', 'clone', 'try', 'catch', ++ 'throw', 'cfunction', 'old_function' ++ ] ++ ++ PREDEFINED_CONSTANTS = [ ++ 'null', '$this', 'true', 'false' ++ ] ++ ++ IDENT_KIND = WordList.new(:ident). ++ add(RESERVED_WORDS, :reserved). ++ add(PREDEFINED_CONSTANTS, :pre_constant) ++ ++ ESCAPE = / [\$\wrbfnrtv\n\\\/'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x ++ UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x ++ ++ def scan_tokens tokens, options ++ ++ state = :waiting_php ++ string_type = nil ++ regexp_allowed = true ++ ++ until eos? ++ ++ kind = :error ++ match = nil ++ ++ if state == :initial ++ ++ if scan(/ \s+ | \\\n /x) ++ kind = :space ++ ++ elsif scan(/\?>/) ++ kind = :char ++ state = :waiting_php ++ ++ elsif scan(%r{ (//|\#) [^\n\\]* (?: \\. [^\n\\]* )* | /\* (?: .*? \*/ | .* ) }mx) ++ kind = :comment ++ regexp_allowed = false ++ ++ elsif match = scan(/ \# \s* if \s* 0 /x) ++ match << scan_until(/ ^\# (?:elif|else|endif) .*? $ | \z /xm) unless eos? ++ kind = :comment ++ regexp_allowed = false ++ ++ elsif regexp_allowed and scan(/\//) ++ tokens << [:open, :regexp] ++ state = :regex ++ kind = :delimiter ++ ++ elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%] | \.(?!\d) /x) ++ kind = :operator ++ regexp_allowed=true ++ ++ elsif match = scan(/ [$@A-Za-z_][A-Za-z_0-9]* /x) ++ kind = IDENT_KIND[match] ++ regexp_allowed=false ++ ++ elsif match = scan(/["']/) ++ tokens << [:open, :string] ++ string_type = matched ++ state = :string ++ kind = :delimiter ++ ++ elsif scan(/0[xX][0-9A-Fa-f]+/) ++ kind = :hex ++ regexp_allowed=false ++ ++ elsif scan(/(?:0[0-7]+)(?![89.eEfF])/) ++ kind = :oct ++ regexp_allowed=false ++ ++ elsif scan(/(?:\d+)(?![.eEfF])/) ++ kind = :integer ++ regexp_allowed=false ++ ++ elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/) ++ kind = :float ++ regexp_allowed=false ++ ++ else ++ getch ++ end ++ ++ elsif state == :regex ++ if scan(/[^\\\/]+/) ++ kind = :content ++ elsif scan(/\\\/|\\/) ++ kind = :content ++ elsif scan(/\//) ++ tokens << [matched, :delimiter] ++ tokens << [:close, :regexp] ++ state = :initial ++ next ++ else ++ getch ++ kind = :content ++ end ++ ++ elsif state == :string ++ if scan(/[^\\"']+/) ++ kind = :content ++ elsif scan(/["']/) ++ if string_type==matched ++ tokens << [matched, :delimiter] ++ tokens << [:close, :string] ++ state = :initial ++ string_type=nil ++ next ++ else ++ kind = :content ++ end ++ elsif scan(/ \\ (?: \S ) /mox) ++ kind = :char ++ elsif scan(/ \\ | $ /x) ++ kind = :error ++ state = :initial ++ else ++ raise "else case \" reached; %p not handled." % peek(1), tokens ++ end ++ ++ elsif state == :waiting_php ++ if scan(/<\?php/m) ++ kind = :char ++ state = :initial ++ elsif scan(/[^<]+/) ++ kind = :comment ++ else ++ kind = :comment ++ getch ++ end ++ else ++ raise 'else-case reached', tokens ++ ++ end ++ ++ match ||= matched ++ ++ tokens << [match, kind] ++ ++ end ++ tokens ++ ++ end ++ ++ end ++ ++end end +\ No newline at end of file + +Property changes on: lib/coderay/scanners/php.rb +___________________________________________________________________ +Name: svn:eol-style + + native + diff --git a/rake_tasks/diff.rake b/rake_tasks/diff.rake new file mode 100644 index 0000000..9cd67b9 --- /dev/null +++ b/rake_tasks/diff.rake @@ -0,0 +1,86 @@ +# A simple differ using svn. Handles externals. +class Differ < Hash + + def initialize path + @path = path + super 0 + end + + def count key, value + self[key] += value + value + end + + FORMAT = ' %-30s %8d lines, %3d changes in %2d files' + + def scan(path = @path) + Dir.chdir path do + system 'svn diff > diff' + if File.size? 'diff' + puts FORMAT % + [ + path, + count(:LOC, `wc -l diff`.to_i), + count(:changes, `grep ^@@ diff | wc -l`.to_i), + count(:files, `grep ^Index diff | wc -l`.to_i), + ] + else + rm 'diff' + end + end + end + + def scan_with_externals(path = @path) + scan path + `svn status`.scan(/^X\s*(.*)/) do |external,| + scan external + end + end + + def clean(path = @path) + Dir.chdir path do + rm 'diff' if File.exist? 'diff' + end + end + + def clean_with_externals(path = @path) + clean path + `svn status`.scan(/^X\s*(.*)/) do |external,| + clean external + end + end + + def differences? + self[:LOC] > 0 + end + + def inspect + FORMAT % + [ 'Total', self[:LOC], self[:changes], self[:files] ] + end + +end + +namespace :diff do + + desc 'Make a diff and print a summary' + task :summary do + differ = Differ.new '.' + differ.scan_with_externals + if differ.empty? + puts 'No differences found.' + else + p differ + end + end + + desc 'Remove all diffs' + task :clean do + differ = Differ.new '.' + differ.clean_with_externals + end + +end + +desc 'Make a diff and print a summary' +task :diff => 'diff:summary' |