riel 1.1.12 → 1.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/README.md +41 -0
  2. data/lib/riel/array.rb +0 -2
  3. data/lib/riel/command.rb +0 -3
  4. data/lib/riel/date.rb +0 -4
  5. data/lib/riel/file.rb +0 -1
  6. data/lib/riel/pathname.rb +0 -2
  7. data/lib/riel/setdiff.rb +5 -3
  8. data/lib/riel/string.rb +4 -20
  9. data/lib/riel/text/ansi/ansi_color.rb +31 -0
  10. data/lib/riel/text/ansi/ansi_colors.rb +16 -0
  11. data/lib/riel/text/ansi/ansi_highlight.rb +111 -0
  12. data/lib/riel/text/ansi/ansi_list.rb +17 -0
  13. data/lib/riel/text/ansi/ansi_palette.rb +48 -0
  14. data/lib/riel/text/ansi/attributes.rb +21 -0
  15. data/lib/riel/text/ansi/backgrounds.rb +13 -0
  16. data/lib/riel/text/ansi/color.rb +62 -0
  17. data/lib/riel/text/ansi/foregrounds.rb +12 -0
  18. data/lib/riel/text/ansi/grey.rb +30 -0
  19. data/lib/riel/text/ansi/grey_palette.rb +36 -0
  20. data/lib/riel/text/ansi/palette.rb +18 -0
  21. data/lib/riel/text/ansi/rgb_color.rb +28 -0
  22. data/lib/riel/text/ansi/rgb_palette.rb +49 -0
  23. data/lib/riel/text/highlight.rb +130 -0
  24. data/lib/riel/text/highlightable.rb +85 -0
  25. data/lib/riel/text/html_highlight.rb +98 -0
  26. data/lib/riel/text/non_highlight.rb +17 -0
  27. data/lib/riel/text/string.rb +10 -0
  28. data/lib/riel/text.rb +1 -412
  29. data/lib/riel.rb +1 -1
  30. data/test/riel/command_test.rb +11 -10
  31. data/test/riel/date_test.rb +23 -6
  32. data/test/riel/file_test.rb +15 -4
  33. data/test/riel/io_test.rb +2 -2
  34. data/test/riel/setdiff_test.rb +31 -10
  35. data/test/riel/string_test.rb +0 -5
  36. data/test/riel/text/ansi/ansi_highlight_test.rb +125 -0
  37. data/test/riel/text/ansi/ansi_palette_test.rb +65 -0
  38. data/test/riel/text/ansi/grey_palette_test.rb +39 -0
  39. data/test/riel/text/ansi/rgb_palette_test.rb +122 -0
  40. data/test/riel/text/highlightable_test.rb +27 -0
  41. data/test/riel/text/string_test.rb +48 -0
  42. data/test/riel/text_test.rb +1 -1
  43. metadata +37 -6
  44. data/README +0 -0
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ module Text
5
+ # Highlights text using either ANSI terminal codes, or HTML.
6
+
7
+ # Note that the foreground and background sections can have modifiers
8
+ # (attributes).
9
+ #
10
+ # Examples:
11
+ # black
12
+ # blue on white
13
+ # bold green on yellow
14
+ # underscore bold magenta on cyan
15
+ # underscore red on cyan
16
+
17
+ class Highlighter
18
+ VERSION = "1.0.4"
19
+
20
+ COLORS = %w{ black red green yellow blue magenta cyan white }
21
+ DECORATIONS = %w{ none reset bold underscore underline blink negative concealed }
22
+
23
+ BACKGROUND_COLORS = COLORS.collect { |color| "on_#{color}" }
24
+ FOREGROUND_COLORS = COLORS
25
+
26
+ COLORS_RE = Regexp.new('(?: ' +
27
+ # background will be in capture 0
28
+ 'on(?:\s+|_) ( ' + COLORS.join(' | ') + ' ) | ' +
29
+ # foreground will be in capture 1
30
+ '( ' + (COLORS + DECORATIONS).join(' | ') + ' ) ' +
31
+ ')', Regexp::EXTENDED);
32
+
33
+ DEFAULT_COLORS = [
34
+ "black on yellow",
35
+ "black on green",
36
+ "black on magenta",
37
+ "yellow on black",
38
+ "magenta on black",
39
+ "green on black",
40
+ "cyan on black",
41
+ "blue on yellow",
42
+ "blue on magenta",
43
+ "blue on green",
44
+ "blue on cyan",
45
+ "yellow on blue",
46
+ "magenta on blue",
47
+ "green on blue",
48
+ "cyan on blue",
49
+ ]
50
+
51
+ attr_reader :colors
52
+
53
+ def parse_colors str
54
+ str.scan(Regexp.new(COLORS_RE)).collect do |color|
55
+ color[0] ? "on_" + color[0] : color[1]
56
+ end
57
+ end
58
+
59
+ # returns a list of all color combinations.
60
+ def self.all_colors
61
+ all_colors = Array.new
62
+ ([ nil ] + DECORATIONS).each do |dec|
63
+ ([ nil ] + FOREGROUND_COLORS).each do |fg|
64
+ ([ nil ] + BACKGROUND_COLORS).each do |bg|
65
+ name = [ dec, fg, bg ].compact.join("_")
66
+ all_colors << name if name && name.length > 0
67
+ end
68
+ end
69
+ end
70
+ all_colors
71
+ end
72
+
73
+ def highlight str
74
+ # implemented by subclasses
75
+ end
76
+
77
+ # Colorizes the given object. If a block is passed, its return value is used
78
+ # and the stream is reset. If a String is provided as the object, it is
79
+ # colorized and the stream is reset. Otherwise, only the code for the given
80
+ # color name is returned.
81
+
82
+ def color colorstr, obj = nil, &blk
83
+ colornames = parse_colors colorstr
84
+ result = names_to_code colornames
85
+
86
+ if blk
87
+ result << blk.call
88
+ elsif obj.respond_to? :to_s
89
+ result << obj.to_s
90
+ end
91
+ result << names_to_code("reset")
92
+ result
93
+ end
94
+
95
+ # returns the code for the given color string, which is in the format:
96
+ # foreground* [on background]?
97
+ #
98
+ # Note that the foreground and background sections can have modifiers
99
+ # (attributes).
100
+ #
101
+ # Examples:
102
+ # black
103
+ # blue on white
104
+ # bold green on yellow
105
+ # underscore bold magenta on cyan
106
+ # underscore red on cyan
107
+ def code str
108
+ fg, bg = str.split(/\s*\bon_?\s*/)
109
+ (fg ? foreground(fg) : "") + (bg ? background(bg) : "")
110
+ end
111
+
112
+ # Returns the code for the given background color(s).
113
+ def background bgcolor
114
+ names_to_code "on_" + bgcolor
115
+ end
116
+
117
+ # Returns the code for the given foreground color(s).
118
+ def foreground fgcolor
119
+ fgcolor.split(/\s+/).collect { |fg| names_to_code fg }.join("")
120
+ end
121
+
122
+ # Returns a highlighted (colored) version of the string, applying the regular
123
+ # expressions in the array, which are paired with the desired color.
124
+ def gsub str, re, color
125
+ str.gsub(re) do |match|
126
+ self.color color, match
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'riel/text/highlight'
5
+ require 'riel/text/ansi/ansi_highlight'
6
+ require 'riel/text/html_highlight'
7
+ require 'riel/text/non_highlight'
8
+
9
+ module Text
10
+ # An object that can be highlighted. This is used by the String class.
11
+ module Highlightable
12
+ # The highlighter for the class in which this module is included.
13
+ @@highlighter = ANSIHighlighter.instance
14
+
15
+ # this dynamically adds methods for individual colors.
16
+ def method_missing(meth, *args, &blk)
17
+ if has_color? meth.to_s
18
+ methdecl = Array.new
19
+ methdecl << "def #{meth}(&blk);"
20
+ methdecl << " @@highlighter.color(\"#{meth}\", self, &blk);"
21
+ methdecl << "end"
22
+ self.class.class_eval methdecl.join("\n")
23
+ send meth, *args, &blk
24
+ elsif Text::ANSIHighlighter.instance.has_alias? meth
25
+ methdecl = Array.new
26
+ methdecl << "def #{meth}(&blk);"
27
+ methdecl << " @@highlighter.#{meth}(self, &blk);"
28
+ methdecl << "end"
29
+ self.class.class_eval methdecl.join("\n")
30
+ send meth, *args, &blk
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ def respond_to? meth
37
+ has_color?(meth.to_s) || Text::ANSIHighlighter.instance.has_alias?(meth) || super
38
+ end
39
+
40
+ def has_color? color
41
+ Text::Highlighter::all_colors.include? color
42
+ end
43
+
44
+ # Sets the highlighter for this class. This can be either by type or by
45
+ # String.
46
+ def highlighter= hl
47
+ @@highlighter = case hl
48
+ when Text::Highlighter
49
+ hl
50
+ when :none, "NONE", nil
51
+ Text::NonHighlighter.new
52
+ when :html, "HTML"
53
+ Text::HTMLHighlighter.new
54
+ when :ansi, "ANSI"
55
+ Text::ANSIHighlighter.instance
56
+ else
57
+ Text::NonHighlighter.new
58
+ end
59
+
60
+ end
61
+
62
+ def rgb red, green, blue
63
+ @@highlighter.rgb self, red, green, blue
64
+ end
65
+
66
+ def on_rgb red, green, blue
67
+ @@highlighter.on_rgb self, red, green, blue
68
+ end
69
+
70
+ def grey value
71
+ @@highlighter.grey self, value
72
+ end
73
+
74
+ def on_grey value
75
+ @@highlighter.on_grey self, value
76
+ end
77
+
78
+ alias_method :gray, :grey
79
+ alias_method :on_gray, :on_grey
80
+
81
+ def self.add_to cls
82
+ cls.send :include, Text::Highlightable
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'riel/text/highlight'
5
+
6
+ module Text
7
+ # Highlights using HTML. Fonts are highlighted using <span> tags, not <font>.
8
+ # Also note that negative is translated to white on black.
9
+ # According to http://www.w3.org/TR/REC-CSS2/syndata.html#value-def-color,
10
+ # valid color keywords are: aqua, black, blue, fuchsia, gray, green, lime,
11
+ # maroon, navy, olive, purple, red, silver, teal, white, and yellow.
12
+ # Thus, no magenta or cyan.
13
+
14
+ class HTMLHighlighter < Highlighter
15
+ def initialize
16
+ # we need to know what we're resetting from (bold, font, underlined ...)
17
+ @stack = []
18
+ end
19
+
20
+ # Returns the start tag for the given name.
21
+
22
+ def start_style name
23
+ case name
24
+ when "negative"
25
+ "<span style=\"color: white; background-color: black\">"
26
+ when /on_(\w+)/
27
+ colval = color_value $1
28
+ "<span style=\"background-color: #{colval}\">"
29
+ else
30
+ colval = color_value name
31
+ "<span style=\"color: #{colval}\">"
32
+ end
33
+ end
34
+
35
+ # Returns the end tag ("</span>").
36
+
37
+ def end_style
38
+ "</span>"
39
+ end
40
+
41
+ def color_value cname
42
+ case cname
43
+ when "cyan"
44
+ "#00FFFF"
45
+ when "magenta"
46
+ "#FF00FF"
47
+ else
48
+ cname
49
+ end
50
+ end
51
+
52
+ # Returns the code for the given name.
53
+ def names_to_code names
54
+ str = ""
55
+
56
+ names = [ names ] unless names.kind_of? Array
57
+
58
+ names.each do |name|
59
+ @stack << name
60
+
61
+ case name
62
+ when "none", "reset"
63
+ @stack.pop
64
+ if @stack.length > 0
65
+ begin
66
+ prev = @stack.pop
67
+ case prev
68
+ when "bold"
69
+ str << "</b>"
70
+ when "underscore", "underline"
71
+ str << "</u>"
72
+ when "blink"
73
+ str << "</blink>"
74
+ when "concealed"
75
+ str << " -->"
76
+ else
77
+ str << end_style
78
+ end
79
+ end while @stack.length > 0
80
+ end
81
+ str
82
+ when "bold"
83
+ str << "<b>"
84
+ when "underscore", "underline"
85
+ str << "<u>"
86
+ when "blink"
87
+ str << "<blink>"
88
+ when "concealed"
89
+ str << "<!-- "
90
+ else
91
+ str << start_style(name)
92
+ end
93
+ end
94
+
95
+ str
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'riel/text/highlight'
5
+
6
+ module Text
7
+ # Does no highlighting.
8
+ class NonHighlighter < Highlighter
9
+ def initialize
10
+ super nil
11
+ end
12
+
13
+ def names_to_code colorname
14
+ ""
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/ruby -w
2
+ # -*- ruby -*-
3
+
4
+ require 'riel/text/highlightable'
5
+
6
+ # String is extended to support highlighting.
7
+ class String
8
+ include Text::Highlightable
9
+ extend Text::Highlightable
10
+ end