rbhex-core 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/CHANGELOG +2000 -0
  4. data/LICENSE +56 -0
  5. data/README.md +44 -0
  6. data/examples/abasiclist.rb +179 -0
  7. data/examples/alpmenu.rb +50 -0
  8. data/examples/app.sample +19 -0
  9. data/examples/atree.rb +100 -0
  10. data/examples/bline.rb +136 -0
  11. data/examples/common/file.rb +45 -0
  12. data/examples/data/README.markdown +9 -0
  13. data/examples/data/brew.txt +38 -0
  14. data/examples/data/color.2 +37 -0
  15. data/examples/data/gemlist.txt +60 -0
  16. data/examples/data/lotr.txt +12 -0
  17. data/examples/data/ports.txt +136 -0
  18. data/examples/data/table.txt +37 -0
  19. data/examples/data/tasks.csv +88 -0
  20. data/examples/data/tasks.txt +27 -0
  21. data/examples/data/todo.txt +10 -0
  22. data/examples/data/todo.txt.bak +10 -0
  23. data/examples/data/todocsv.csv +28 -0
  24. data/examples/data/unix1.txt +21 -0
  25. data/examples/data/unix2.txt +11 -0
  26. data/examples/dbdemo.rb +502 -0
  27. data/examples/dirtree.rb +94 -0
  28. data/examples/newtabbedwindow.rb +100 -0
  29. data/examples/newtesttabp.rb +92 -0
  30. data/examples/tabular.rb +146 -0
  31. data/examples/tasks.rb +178 -0
  32. data/examples/term2.rb +84 -0
  33. data/examples/testbuttons.rb +296 -0
  34. data/examples/testcombo.rb +102 -0
  35. data/examples/testfields.rb +195 -0
  36. data/examples/testkeypress.rb +72 -0
  37. data/examples/testlistbox.rb +170 -0
  38. data/examples/testmessagebox.rb +140 -0
  39. data/examples/testprogress.rb +116 -0
  40. data/examples/testree.rb +106 -0
  41. data/examples/testwsshortcuts.rb +66 -0
  42. data/examples/testwsshortcuts2.rb +128 -0
  43. data/lib/rbhex.rb +6 -0
  44. data/lib/rbhex/core/docs/index.txt +73 -0
  45. data/lib/rbhex/core/include/action.rb +80 -0
  46. data/lib/rbhex/core/include/actionmanager.rb +49 -0
  47. data/lib/rbhex/core/include/appmethods.rb +214 -0
  48. data/lib/rbhex/core/include/bordertitle.rb +48 -0
  49. data/lib/rbhex/core/include/chunk.rb +203 -0
  50. data/lib/rbhex/core/include/io.rb +553 -0
  51. data/lib/rbhex/core/include/listbindings.rb +74 -0
  52. data/lib/rbhex/core/include/listcellrenderer.rb +140 -0
  53. data/lib/rbhex/core/include/listeditable.rb +317 -0
  54. data/lib/rbhex/core/include/listscrollable.rb +663 -0
  55. data/lib/rbhex/core/include/listselectable.rb +271 -0
  56. data/lib/rbhex/core/include/multibuffer.rb +83 -0
  57. data/lib/rbhex/core/include/orderedhash.rb +77 -0
  58. data/lib/rbhex/core/include/ractionevent.rb +73 -0
  59. data/lib/rbhex/core/include/rchangeevent.rb +27 -0
  60. data/lib/rbhex/core/include/rhistory.rb +95 -0
  61. data/lib/rbhex/core/include/rinputdataevent.rb +47 -0
  62. data/lib/rbhex/core/include/vieditable.rb +172 -0
  63. data/lib/rbhex/core/include/widgetmenu.rb +66 -0
  64. data/lib/rbhex/core/system/colormap.rb +165 -0
  65. data/lib/rbhex/core/system/keyboard.rb +150 -0
  66. data/lib/rbhex/core/system/keydefs.rb +30 -0
  67. data/lib/rbhex/core/system/ncurses.rb +236 -0
  68. data/lib/rbhex/core/system/panel.rb +162 -0
  69. data/lib/rbhex/core/system/window.rb +913 -0
  70. data/lib/rbhex/core/util/ansiparser.rb +119 -0
  71. data/lib/rbhex/core/util/app.rb +1228 -0
  72. data/lib/rbhex/core/util/basestack.rb +410 -0
  73. data/lib/rbhex/core/util/bottomline.rb +1859 -0
  74. data/lib/rbhex/core/util/colorparser.rb +77 -0
  75. data/lib/rbhex/core/util/focusmanager.rb +31 -0
  76. data/lib/rbhex/core/util/padreader.rb +192 -0
  77. data/lib/rbhex/core/util/rcommandwindow.rb +604 -0
  78. data/lib/rbhex/core/util/rdialogs.rb +574 -0
  79. data/lib/rbhex/core/util/viewer.rb +149 -0
  80. data/lib/rbhex/core/util/widgetshortcuts.rb +506 -0
  81. data/lib/rbhex/core/version.rb +5 -0
  82. data/lib/rbhex/core/widgets/applicationheader.rb +103 -0
  83. data/lib/rbhex/core/widgets/box.rb +58 -0
  84. data/lib/rbhex/core/widgets/divider.rb +310 -0
  85. data/lib/rbhex/core/widgets/keylabelprinter.rb +194 -0
  86. data/lib/rbhex/core/widgets/rcombo.rb +253 -0
  87. data/lib/rbhex/core/widgets/rcontainer.rb +415 -0
  88. data/lib/rbhex/core/widgets/rlink.rb +30 -0
  89. data/lib/rbhex/core/widgets/rlist.rb +696 -0
  90. data/lib/rbhex/core/widgets/rmenu.rb +958 -0
  91. data/lib/rbhex/core/widgets/rmenulink.rb +22 -0
  92. data/lib/rbhex/core/widgets/rmessagebox.rb +387 -0
  93. data/lib/rbhex/core/widgets/rprogress.rb +118 -0
  94. data/lib/rbhex/core/widgets/rtabbedpane.rb +634 -0
  95. data/lib/rbhex/core/widgets/rtabbedwindow.rb +70 -0
  96. data/lib/rbhex/core/widgets/rtextarea.rb +960 -0
  97. data/lib/rbhex/core/widgets/rtextview.rb +739 -0
  98. data/lib/rbhex/core/widgets/rtree.rb +768 -0
  99. data/lib/rbhex/core/widgets/rwidget.rb +3277 -0
  100. data/lib/rbhex/core/widgets/scrollbar.rb +143 -0
  101. data/lib/rbhex/core/widgets/statusline.rb +113 -0
  102. data/lib/rbhex/core/widgets/tabular.rb +264 -0
  103. data/lib/rbhex/core/widgets/tabularwidget.rb +1142 -0
  104. data/lib/rbhex/core/widgets/textpad.rb +995 -0
  105. data/lib/rbhex/core/widgets/tree/treecellrenderer.rb +150 -0
  106. data/lib/rbhex/core/widgets/tree/treemodel.rb +428 -0
  107. data/rbhex-core.gemspec +32 -0
  108. metadata +172 -0
@@ -0,0 +1,80 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: action.rb
3
+ # Description: A common action class which can be used with buttons, popupmenu
4
+ # and anythign else that takes an action or command
5
+ # Author: rkumar http://github.com/rkumar/rbcurse/
6
+ # Date: been around since the beginning
7
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
8
+ # Last update: use ,,L
9
+ # NOTE: I don't like the dependence on rwidget and EventHandler. Seems it needs
10
+ # that only for fire_handler and not sure if that's used. I've not bound :FIRE
11
+ # ever.
12
+ #
13
+ # Darn, do i really need to have dsl_accessors and property This is not a
14
+ # widget and there's no repaint. Do button's and popups really repaint
15
+ # themselves when a dsl_property is modified ?
16
+ # ----------------------------------------------------------------------------- #
17
+ #
18
+ require 'rbhex/core/widgets/rwidget'
19
+ include RubyCurses
20
+ module RubyCurses
21
+ ## encapsulates behaviour allowing centralization
22
+ # == Example
23
+ # a = Action.new("&New Row") { commands }
24
+ # a.accelerator "Alt N"
25
+ # menu.add(a)
26
+ # b = Button.new form do
27
+ # action a
28
+ # ...
29
+ # end
30
+ class Action < Proc
31
+ include EventHandler # removed 2012-01-3 maybe you can bind FIRE
32
+ #include ConfigSetup # removed 2012-01-3
33
+ # name used on button or menu
34
+ dsl_property :name
35
+ dsl_property :enabled
36
+ dsl_accessor :tooltip_text
37
+ dsl_accessor :help_text
38
+ dsl_accessor :mnemonic
39
+ dsl_accessor :accelerator
40
+
41
+ def initialize name, config={}, &block
42
+ super &block
43
+ @name = name
44
+ @name.freeze
45
+ @enabled = true
46
+ # removing dependency from config
47
+ #config_setup config # @config.each_pair { |k,v| variable_set(k,v) }
48
+ @config = config
49
+ keys = @config.keys
50
+ keys.each do |e|
51
+ variable_set(e, @config[e])
52
+ end
53
+ @_events = [:FIRE]
54
+ end
55
+ def call
56
+ return unless @enabled
57
+ # seems to be here, if you've bound :FIRE no this, not on any widget
58
+ fire_handler :FIRE, self
59
+ super
60
+ end
61
+ # the next 3 are to adapt this to CMenuitems
62
+ def hotkey
63
+ return @mnemonic if @mnemonic
64
+ ix = @name.index('&')
65
+ if ix
66
+ return @name[ix+1, 1].downcase
67
+ end
68
+ end
69
+ # to adapt this to CMenuitems
70
+ def label
71
+ @name.sub('&','')
72
+ end
73
+ # to adapt this to CMenuitems
74
+ def action
75
+ self
76
+ end
77
+
78
+ end # class
79
+ end # module
80
+
@@ -0,0 +1,49 @@
1
+ # ----------------------------------------------------------------------------- #
2
+ # File: actionmanager.rb
3
+ # Description: a class that manages actions for a widget
4
+ #
5
+ # Author: rkumar http://github.com/rkumar/rbcurse/
6
+ # Date: 2012-01-4
7
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
8
+ # Last update: ,,L
9
+ # ----------------------------------------------------------------------------- #
10
+ #
11
+ # Maintains actions for a widget
12
+ module RubyCurses
13
+ class ActionManager
14
+ include Io
15
+ attr_reader :actions
16
+
17
+ def initialize #form, config={}, &block
18
+ @actions = []
19
+ #instance_eval &block if block_given?
20
+ end
21
+ def add_action act
22
+ @actions << act
23
+ end
24
+ def remove_action act
25
+ @actions.remove act
26
+ end
27
+ #
28
+ # insert an item at given position (index)
29
+ def insert_action pos, *val
30
+ @actions[pos] = val
31
+ end
32
+ #def create_menuitem *args
33
+ #PromptMenu.create_menuitem *args
34
+ #end
35
+
36
+ # popup the hist
37
+ #
38
+ def show_actions
39
+ return if @actions.empty?
40
+ list = @actions
41
+ menu = PromptMenu.new self do |m|
42
+ list.each { |e|
43
+ m.add *e
44
+ }
45
+ end
46
+ menu.display_new :title => 'Widget Menu (Press letter)'
47
+ end
48
+ end # class
49
+ end # mod RubyC
@@ -0,0 +1,214 @@
1
+ module RubyCurses
2
+ module Utils
3
+ private
4
+ def _suspend clear=true
5
+ return unless block_given?
6
+ Ncurses.def_prog_mode
7
+ if clear
8
+ Ncurses.endwin
9
+ # NOTE: avoid false since screen remains half off
10
+ # too many issues
11
+ else
12
+ system "/bin/stty sane"
13
+ end
14
+ yield if block_given?
15
+ Ncurses.reset_prog_mode
16
+ if !clear
17
+ # Hope we don't screw your terminal up with this constantly.
18
+ VER::stop_ncurses
19
+ VER::start_ncurses
20
+ #@form.reset_all # not required
21
+ end
22
+ @form.repaint if @form
23
+ @window.wrefresh if @window
24
+ Ncurses::Panel.update_panels
25
+ end
26
+ #
27
+ # Suspends to shell so user can execute commands.
28
+ # Maybe not be able to get your prompt correctly.
29
+ #
30
+ public
31
+ def suspend
32
+ _suspend(false) do
33
+ system("tput cup 26 0")
34
+ system("tput ed")
35
+ system("echo Enter C-d to return to application")
36
+ system (ENV['PS1']='\s-\v\$ ') if ENV['SHELL']== '/bin/bash'
37
+ system(ENV['SHELL']);
38
+ end
39
+ end
40
+
41
+ #
42
+ # Displays application help using either array provided
43
+ # or checking for :help_text method
44
+ # @param [Array] help text
45
+ def display_app_help help_array= nil
46
+ if help_array
47
+ arr = help_array
48
+ elsif respond_to? :help_text
49
+ arr = help_text
50
+ else
51
+ arr = []
52
+ arr << " NO HELP SPECIFIED FOR APP #{self} "
53
+ arr << " "
54
+ arr << " --- General help --- "
55
+ arr << " F10 - exit application "
56
+ arr << " Alt-x - select commands "
57
+ arr << " : - select commands "
58
+ arr << " "
59
+ end
60
+ case arr
61
+ when String
62
+ arr = arr.split("\n")
63
+ when Array
64
+ end
65
+ w = arr.max_by(&:length).length
66
+
67
+ require 'rbhex/core/util/viewer'
68
+ RubyCurses::Viewer.view(arr, :layout => [2, 10, [4+arr.size, 24].min, w+2],:close_key => KEY_ENTER, :title => "<Enter> to close", :print_footer => true) do |t|
69
+ # you may configure textview further here.
70
+ #t.suppress_borders true
71
+ #t.color = :black
72
+ #t.bgcolor = :white
73
+ # or
74
+ t.attr = :reverse
75
+ end
76
+ end
77
+ #
78
+ # prompts user for unix command and displays output in viewer
79
+ #
80
+ def shell_output
81
+ $shell_history ||= []
82
+ cmd = get_string("Enter shell command:", :maxlen => 50) do |f|
83
+ require 'rbhex/core/include/rhistory'
84
+ f.extend(FieldHistory)
85
+ f.history($shell_history)
86
+ end
87
+ if cmd && !cmd.empty?
88
+ run_command cmd
89
+ $shell_history.push(cmd) unless $shell_history.include? cmd
90
+ end
91
+ end
92
+
93
+ #
94
+ # executes given command and displays in viewer
95
+ # @param [String] unix command, e.g., git -st
96
+ def run_command cmd
97
+ # http://whynotwiki.com/Ruby_/_Process_management#What_happens_to_standard_error_.28stderr.29.3F
98
+ require 'rbhex/core/util/viewer'
99
+ begin
100
+ res = `#{cmd} 2>&1`
101
+ rescue => ex
102
+ res = ex.to_s
103
+ res << ex.backtrace.join("\n")
104
+ end
105
+ res.gsub!("\t"," ")
106
+ RubyCurses::Viewer.view(res.split("\n"), :close_key => KEY_ENTER, :title => "<Enter> to close, M-l M-h to scroll")
107
+ end
108
+ def shell_out command
109
+ w = @window || @form.window
110
+ w.hide
111
+ Ncurses.endwin
112
+ ret = system command
113
+ Ncurses.refresh
114
+ #Ncurses.curs_set 0 # why ?
115
+ w.show
116
+ return ret
117
+ end
118
+ end # utils
119
+ class PrefixCommand
120
+ attr_accessor :object
121
+ def initialize _symbol, calling, config={}, &block
122
+ @object = calling
123
+ @symbol = _symbol
124
+ @descriptions = {}
125
+ define_prefix_command _symbol
126
+ yield self if block_given?
127
+ end
128
+ def define_prefix_command _name, config={}
129
+ $rb_prefix_map ||= {}
130
+ #h = {}
131
+ #@map = h
132
+ _name = _name.to_sym unless _name.is_a? Symbol
133
+ # TODO it may already exist, so retrieve it
134
+ $rb_prefix_map[_name] ||= {}
135
+ @map = $rb_prefix_map[_name]
136
+ # create a variable by name _name
137
+ # create a method by same name to use
138
+ @object.instance_eval %{
139
+ def #{_name.to_s} *args
140
+ h = $rb_prefix_map["#{_name}".to_sym]
141
+ raise "No prefix_map named #{_name}, #{$rb_prefix_map.keys} " unless h
142
+ ch = @window.getchar
143
+ if ch
144
+ res = h[ch]
145
+ if res.is_a? Proc
146
+ res.call
147
+ else
148
+ send(res) if res
149
+ end
150
+ else
151
+ 0
152
+ end
153
+ end
154
+ }
155
+ return _name
156
+ end
157
+ def call
158
+ h = @map
159
+ ch = @object.window.getch # dicey.
160
+ $log.debug "XXX: CALLED #{ch} "
161
+ if ch
162
+ if ch == KEY_F1
163
+ text = ["Options are: "]
164
+ h.keys.each { |e| c = keycode_tos(e); text << " #{c} #{@descriptions[e]} " }
165
+ textdialog text, :title => " #{@symbol} key bindings "
166
+ return
167
+ end
168
+ res = h[ch]
169
+ if res.is_a? Proc
170
+ res.call
171
+ elsif res.is_a? Symbol
172
+ @object.send(res) if res
173
+ else
174
+ Ncurses.beep
175
+ @object.window.ungetch(ch)
176
+
177
+ :UNHANDLED
178
+ end
179
+ else
180
+ raise "got nothing"
181
+ end
182
+ end
183
+
184
+ # define a key within a prefix key map such as C-x
185
+ # Now that i am moving this from global, how will describe bindings get hold of the bindings
186
+ # and descriptions
187
+ def define_key _keycode, *args, &blk
188
+ _symbol = @symbol
189
+ h = $rb_prefix_map[_symbol]
190
+ raise ArgumentError, "No such keymap #{_symbol} defined. Use define_prefix_command." unless h
191
+ _keycode = _keycode[0].getbyte(0) if _keycode[0].class == String
192
+ arg = args.shift
193
+ if arg.is_a? String
194
+ desc = arg
195
+ arg = args.shift
196
+ elsif arg.is_a? Symbol
197
+ # its a symbol
198
+ desc = arg.to_s
199
+ elsif arg.nil?
200
+ desc = "unknown"
201
+ else
202
+ raise ArgumentError, "Don't know how to handle #{arg.class} in PrefixManager"
203
+ end
204
+ @descriptions[_keycode] = desc
205
+
206
+ if !block_given?
207
+ blk = arg
208
+ end
209
+ h[_keycode] = blk
210
+ end
211
+ alias :key :define_key
212
+ end
213
+ end # module RubyC
214
+ include RubyCurses::Utils
@@ -0,0 +1,48 @@
1
+ # I am moving the common title and border printing stuff into
2
+ # a separate module.
3
+ module RubyCurses
4
+ module BorderTitle
5
+ dsl_accessor :suppress_borders #to_print_borders
6
+ dsl_accessor :border_attrib, :border_color
7
+ dsl_accessor :title #set this on top
8
+ dsl_accessor :title_attrib #bold, reverse, normal
9
+
10
+ def bordertitle_init
11
+ @_bordertitle_init_called = true
12
+ @row_offset = @col_offset = 0 if @suppress_borders
13
+ @internal_width = 1 if @suppress_borders # the other programs have zero not 1 NOTE
14
+ end
15
+ # why the dash does it reduce height by one.
16
+ def print_borders
17
+ bordertitle_init unless @_bordertitle_init_called
18
+ raise ArgumentError, "Graphic not set" unless @graphic
19
+ raise "#{self} needs width" unless @width
20
+ raise "#{self} needs height" unless @height
21
+ width = @width
22
+ height = @height-1
23
+ window = @graphic
24
+ startcol = @col
25
+ startrow = @row
26
+ @color_pair = get_color($datacolor)
27
+ bordercolor = @border_color || @color_pair
28
+ borderatt = @border_attrib || Ncurses::A_NORMAL
29
+ window.print_border startrow, startcol, height, width, bordercolor, borderatt
30
+ print_title
31
+ end
32
+ def print_title
33
+ bordertitle_init unless @_bordertitle_init_called
34
+ return unless @title
35
+ raise "#{self} needs width" unless @width
36
+ @color_pair ||= get_color($datacolor) # should we not use this ??? XXX
37
+ #$log.debug " print_title #{@row}, #{@col}, #{@width} "
38
+ # check title.length and truncate if exceeds width
39
+ _title = @title
40
+ if @title.length > @width - 2
41
+ _title = @title[0..@width-2]
42
+ end
43
+ @graphic.printstring( @row, @col+(@width-_title.length)/2, _title, @color_pair, @title_attrib) unless @title.nil?
44
+ end
45
+
46
+ end
47
+ end
48
+ include BorderTitle
@@ -0,0 +1,203 @@
1
+ # ------------------------------------------------------------ #
2
+ # File: chunk.rb
3
+ # Description:
4
+ # Author: rkumar http://github.com/rkumar/rbcurse/
5
+ # Date: 07.11.11 - 12:31
6
+ # Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
7
+ # Last update: 2013-04-01 13:38
8
+ # ------------------------------------------------------------ #
9
+ #
10
+
11
+ module RubyCurses
12
+ module Chunks
13
+ extend self
14
+ class Chunk
15
+
16
+ # color_pair of associated text
17
+ # text to print
18
+ # attribute of associated text
19
+ #attr_accessor :color, :text, :attrib
20
+ attr_reader :chunk
21
+
22
+ def initialize color, text, attrib
23
+ @chunk = [ color, text, attrib ]
24
+ #@color = color
25
+ #@text = text
26
+ #@attrib = attrib
27
+ end
28
+ def color
29
+ @chunk[0]
30
+ end
31
+ def text
32
+ @chunk[1]
33
+ end
34
+ def attrib
35
+ @chunk[2]
36
+ end
37
+ end
38
+
39
+ # consists of an array of chunks and corresponds to a line
40
+ # to be printed.
41
+ class ChunkLine
42
+
43
+ # an array of chunks
44
+ attr_reader :chunks
45
+
46
+ def initialize arr=nil
47
+ @chunks = arr.nil? ? Array.new : arr
48
+ end
49
+ def <<(chunk)
50
+ raise ArgumentError, "Chunk object expected. Received #{chunk.class} " unless chunk.is_a? Chunk
51
+ @chunks << chunk
52
+ end
53
+ alias :add :<<
54
+ def each &block
55
+ @chunks.each &block
56
+ end
57
+
58
+ # returns length of text in chunks
59
+ def row_length
60
+ result = 0
61
+ @chunks.each { |e| result += e.text.length }
62
+ return result
63
+ end
64
+ # returns match for str in this chunk
65
+ # added 2013-03-07 - 23:59
66
+ def index str
67
+ result = 0
68
+ @chunks.each { |e| txt = e.text;
69
+ ix = txt.index(str)
70
+ return result + ix if ix
71
+ result += e.text.length
72
+ }
73
+ return nil
74
+ end
75
+ alias :length :row_length
76
+ alias :size :row_length
77
+
78
+ # return a Chunkline containing only the text for the range requested
79
+ def substring start, size
80
+ raise "substring not implemented yet"
81
+ end
82
+ def to_s
83
+ result = ""
84
+ @chunks.each { |e| result << e.text }
85
+ result
86
+ end
87
+
88
+ # added to take care of many string methods that are called.
89
+ # Callers really don't know this is a chunkline, they assume its a string
90
+ # 2013-03-21 - 19:01
91
+ def method_missing(sym, *args, &block)
92
+ self.to_s.send sym, *args, &block
93
+ end
94
+ end
95
+ class ColorParser
96
+ def initialize cp
97
+ color_parser cp
98
+ @color_pair = $datacolor
99
+ @attrib = FFI::NCurses::A_NORMAL
100
+ @color_array = [:white]
101
+ @bgcolor_array = [:black]
102
+ @attrib_array = [@attrib]
103
+ @color_pair_array = [@color_pair]
104
+ @color = :white
105
+ @bgcolor = :black
106
+ end
107
+ #
108
+ # Takes a formatted string and converts the parsed parts to chunks.
109
+ #
110
+ # @param [String] takes the entire line or string and breaks into an array of chunks
111
+ # @yield chunk if block
112
+ # @return [ChunkLine] # [Array] array of chunks
113
+ # @since 1.4.1 2011-11-3 experimental, can change
114
+ public
115
+ def convert_to_chunk s, colorp=$datacolor, att=FFI::NCurses::A_NORMAL
116
+ #require 'rbhex/core/include/chunk'
117
+
118
+ @color_parser ||= get_default_color_parser()
119
+ ## defaults
120
+ color_pair = @color_pair
121
+ attrib = @attrib
122
+ #res = []
123
+ res = ChunkLine.new
124
+ color = @color
125
+ bgcolor = @bgcolor
126
+ # stack the values, so when user issues "/end" we can pop earlier ones
127
+
128
+ @color_parser.parse_format(s) do |p|
129
+ case p
130
+ when Array
131
+ ## got color / attrib info, this starts a new span
132
+
133
+ #color, bgcolor, attrib = *p
134
+ lc, lb, la = *p
135
+ if la
136
+ @attrib = get_attrib la
137
+ end
138
+ if lc || lb
139
+ @color = lc ? lc : @color_array.last
140
+ @bgcolor = lb ? lb : @bgcolor_array.last
141
+ @color_array << @color
142
+ @bgcolor_array << @bgcolor
143
+ @color_pair = get_color($datacolor, @color, @bgcolor)
144
+ end
145
+ @color_pair_array << @color_pair
146
+ @attrib_array << @attrib
147
+ #$log.debug "XXX: CHUNK start #{color_pair} , #{attrib} :: c:#{lc} b:#{lb} "
148
+ #$log.debug "XXX: CHUNK start arr #{@color_pair_array} :: #{@attrib_array} "
149
+
150
+ when :endcolor
151
+
152
+ # end the current (last) span
153
+ @color_pair_array.pop
154
+ @color_pair = @color_pair_array.last
155
+ @attrib_array.pop
156
+ @attrib = @attrib_array.last
157
+ #$log.debug "XXX: CHUNK end #{color_pair} , #{attrib} "
158
+ #$log.debug "XXX: CHUNK end arr #{@color_pair_array} :: #{@attrib_array} "
159
+ when :reset # ansi has this
160
+ # end all previous colors
161
+ @color_pair = $datacolor # @color_pair_array.first
162
+ @color_pair_array = [@color_pair]
163
+ @attrib = FFI::NCurses::A_NORMAL #@attrib_array.first
164
+ @attrib_array = [@attrib]
165
+ @bgcolor_array = [@bgcolor_array.first]
166
+ @color_array = [@color_array.first]
167
+
168
+ when String
169
+
170
+ ## create the chunk
171
+ #$log.debug "XXX: CHUNK using on #{p} : #{@color_pair} , #{@attrib} " # 2011-12-10 12:38:51
172
+
173
+ #chunk = [color_pair, p, attrib]
174
+ chunk = Chunk.new @color_pair, p, @attrib
175
+ if block_given?
176
+ yield chunk
177
+ else
178
+ res << chunk
179
+ end
180
+ end
181
+ end # parse
182
+ return res unless block_given?
183
+ end
184
+ def get_default_color_parser
185
+ require 'rbhex/core/util/colorparser'
186
+ @color_parser || DefaultColorParser.new
187
+ end
188
+ # supply with a color parser, if you supplied formatted text
189
+ public
190
+ def color_parser f
191
+ $log.debug "XXX: color_parser setting in CP to #{f} "
192
+ if f == :tmux
193
+ @color_parser = get_default_color_parser()
194
+ elsif f == :ansi
195
+ require 'rbhex/core/util/ansiparser'
196
+ @color_parser = AnsiParser.new
197
+ else
198
+ @color_parser = f
199
+ end
200
+ end
201
+ end # class
202
+ end
203
+ end