rbhex-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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