canis 0.0.4
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.
- checksums.yaml +7 -0
- data/.gitignore +45 -0
- data/CHANGES +52 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +2 -0
- data/canis.gemspec +25 -0
- data/examples/alpmenu.rb +46 -0
- data/examples/app.sample +19 -0
- data/examples/appemail.rb +191 -0
- data/examples/atree.rb +105 -0
- data/examples/bline.rb +181 -0
- data/examples/common/devel.rb +319 -0
- data/examples/common/file.rb +93 -0
- data/examples/data/README.markdown +9 -0
- data/examples/data/brew.txt +38 -0
- data/examples/data/color.2 +37 -0
- data/examples/data/gemlist.txt +59 -0
- data/examples/data/lotr.txt +12 -0
- data/examples/data/ports.txt +136 -0
- data/examples/data/table.txt +37 -0
- data/examples/data/tasks.csv +88 -0
- data/examples/data/tasks.txt +27 -0
- data/examples/data/todo.txt +16 -0
- data/examples/data/todocsv.csv +28 -0
- data/examples/data/unix1.txt +21 -0
- data/examples/data/unix2.txt +11 -0
- data/examples/dbdemo.rb +506 -0
- data/examples/dirtree.rb +177 -0
- data/examples/newtabbedwindow.rb +100 -0
- data/examples/newtesttabp.rb +92 -0
- data/examples/tabular.rb +212 -0
- data/examples/tasks.rb +179 -0
- data/examples/term2.rb +88 -0
- data/examples/testbuttons.rb +307 -0
- data/examples/testcombo.rb +102 -0
- data/examples/testdb.rb +182 -0
- data/examples/testfields.rb +208 -0
- data/examples/testflowlayout.rb +43 -0
- data/examples/testkeypress.rb +98 -0
- data/examples/testlistbox.rb +187 -0
- data/examples/testlistbox1.rb +199 -0
- data/examples/testmessagebox.rb +144 -0
- data/examples/testprogress.rb +116 -0
- data/examples/testree.rb +107 -0
- data/examples/testsplitlayout.rb +53 -0
- data/examples/testsplitlayout1.rb +49 -0
- data/examples/teststacklayout.rb +48 -0
- data/examples/testwsshortcuts.rb +68 -0
- data/examples/testwsshortcuts2.rb +129 -0
- data/lib/canis.rb +16 -0
- data/lib/canis/core/docs/index.txt +104 -0
- data/lib/canis/core/docs/list.txt +16 -0
- data/lib/canis/core/docs/style_help.yml +34 -0
- data/lib/canis/core/docs/tabbedpane.txt +15 -0
- data/lib/canis/core/docs/table.txt +31 -0
- data/lib/canis/core/docs/textpad.txt +48 -0
- data/lib/canis/core/docs/tree.txt +23 -0
- data/lib/canis/core/include/.DS_Store +0 -0
- data/lib/canis/core/include/action.rb +83 -0
- data/lib/canis/core/include/actionmanager.rb +49 -0
- data/lib/canis/core/include/appmethods.rb +179 -0
- data/lib/canis/core/include/bordertitle.rb +49 -0
- data/lib/canis/core/include/canisparser.rb +100 -0
- data/lib/canis/core/include/colorparser.rb +437 -0
- data/lib/canis/core/include/defaultfilerenderer.rb +64 -0
- data/lib/canis/core/include/io.rb +320 -0
- data/lib/canis/core/include/layouts/SplitLayout.rb +161 -0
- data/lib/canis/core/include/layouts/abstractlayout.rb +213 -0
- data/lib/canis/core/include/layouts/flowlayout.rb +104 -0
- data/lib/canis/core/include/layouts/stacklayout.rb +109 -0
- data/lib/canis/core/include/listbindings.rb +89 -0
- data/lib/canis/core/include/listeditable.rb +319 -0
- data/lib/canis/core/include/listoperations.rb +61 -0
- data/lib/canis/core/include/listselectionmodel.rb +388 -0
- data/lib/canis/core/include/multibuffer.rb +173 -0
- data/lib/canis/core/include/ractionevent.rb +73 -0
- data/lib/canis/core/include/rchangeevent.rb +27 -0
- data/lib/canis/core/include/rhistory.rb +95 -0
- data/lib/canis/core/include/rinputdataevent.rb +47 -0
- data/lib/canis/core/include/textdocument.rb +111 -0
- data/lib/canis/core/include/vieditable.rb +175 -0
- data/lib/canis/core/include/widgetmenu.rb +66 -0
- data/lib/canis/core/system/colormap.rb +165 -0
- data/lib/canis/core/system/keydefs.rb +32 -0
- data/lib/canis/core/system/ncurses.rb +237 -0
- data/lib/canis/core/system/panel.rb +129 -0
- data/lib/canis/core/system/window.rb +1081 -0
- data/lib/canis/core/util/ansiparser.rb +119 -0
- data/lib/canis/core/util/app.rb +696 -0
- data/lib/canis/core/util/basestack.rb +412 -0
- data/lib/canis/core/util/defaultcolorparser.rb +84 -0
- data/lib/canis/core/util/extras/README +5 -0
- data/lib/canis/core/util/extras/bottomline.rb +1815 -0
- data/lib/canis/core/util/extras/padreader.rb +192 -0
- data/lib/canis/core/util/focusmanager.rb +31 -0
- data/lib/canis/core/util/helpmanager.rb +160 -0
- data/lib/canis/core/util/oldwidgetshortcuts.rb +304 -0
- data/lib/canis/core/util/promptmenu.rb +235 -0
- data/lib/canis/core/util/rcommandwindow.rb +933 -0
- data/lib/canis/core/util/rdialogs.rb +520 -0
- data/lib/canis/core/util/textutils.rb +74 -0
- data/lib/canis/core/util/viewer.rb +238 -0
- data/lib/canis/core/util/widgetshortcuts.rb +508 -0
- data/lib/canis/core/widgets/applicationheader.rb +103 -0
- data/lib/canis/core/widgets/box.rb +58 -0
- data/lib/canis/core/widgets/divider.rb +310 -0
- data/lib/canis/core/widgets/extras/README.md +12 -0
- data/lib/canis/core/widgets/extras/rtextarea.rb +960 -0
- data/lib/canis/core/widgets/extras/stackflow.rb +474 -0
- data/lib/canis/core/widgets/keylabelprinter.rb +194 -0
- data/lib/canis/core/widgets/listbox.rb +326 -0
- data/lib/canis/core/widgets/listfooter.rb +86 -0
- data/lib/canis/core/widgets/rcombo.rb +210 -0
- data/lib/canis/core/widgets/rcontainer.rb +415 -0
- data/lib/canis/core/widgets/rlink.rb +30 -0
- data/lib/canis/core/widgets/rmenu.rb +970 -0
- data/lib/canis/core/widgets/rmenulink.rb +30 -0
- data/lib/canis/core/widgets/rmessagebox.rb +400 -0
- data/lib/canis/core/widgets/rprogress.rb +118 -0
- data/lib/canis/core/widgets/rtabbedpane.rb +631 -0
- data/lib/canis/core/widgets/rtabbedwindow.rb +70 -0
- data/lib/canis/core/widgets/rwidget.rb +3634 -0
- data/lib/canis/core/widgets/scrollbar.rb +147 -0
- data/lib/canis/core/widgets/statusline.rb +113 -0
- data/lib/canis/core/widgets/table.rb +1072 -0
- data/lib/canis/core/widgets/tabular.rb +264 -0
- data/lib/canis/core/widgets/textpad.rb +1674 -0
- data/lib/canis/core/widgets/tree.rb +690 -0
- data/lib/canis/core/widgets/tree/treecellrenderer.rb +150 -0
- data/lib/canis/core/widgets/tree/treemodel.rb +432 -0
- data/lib/canis/version.rb +3 -0
- metadata +229 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
# ------------------------------------------------------------ #
|
|
2
|
+
# File: chunk.rb
|
|
3
|
+
# Description: Contains classes that implement the default native format
|
|
4
|
+
# we use for colored lines display.
|
|
5
|
+
# Author: jkepler http://github.com/mare-imbrium/canis/
|
|
6
|
+
# Date: 07.11.11 - 12:31
|
|
7
|
+
# Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
|
|
8
|
+
# Last update: 2014-06-23 01:43
|
|
9
|
+
# ------------------------------------------------------------ #
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
module Canis
|
|
13
|
+
module Chunks
|
|
14
|
+
extend self
|
|
15
|
+
|
|
16
|
+
# A chunk is a piece of text with associated color and attr.
|
|
17
|
+
# Several such chunks make a ChunkLine.
|
|
18
|
+
# 2014-05-24 - 11:52 adding parent, and trying to resolve at time of render
|
|
19
|
+
# so changes in form;s color can take effect without parsing the tree again.
|
|
20
|
+
#
|
|
21
|
+
# +color+ is a color pair which is already resolved with parent's color at time of
|
|
22
|
+
# parsing. We need to store bgcolor and color so we can resolve at render time if nil.
|
|
23
|
+
#
|
|
24
|
+
class Chunk
|
|
25
|
+
|
|
26
|
+
# color_pair of associated text
|
|
27
|
+
# text to print
|
|
28
|
+
# attribute of associated text
|
|
29
|
+
#attr_accessor :color, :text, :attr
|
|
30
|
+
# hope no one is accessing chunk since format can change to a hash
|
|
31
|
+
attr_reader :chunk
|
|
32
|
+
attr_accessor :parent
|
|
33
|
+
attr_writer :color, :bgcolor
|
|
34
|
+
|
|
35
|
+
# earlier color was being resolved at parse time. Now with chunk change 2014-05-24 - 12:41
|
|
36
|
+
# color should be nil if not specified. Do not use parent's color.
|
|
37
|
+
# Please set fgcolor and bgcolor if present, so we can resolve later.
|
|
38
|
+
def initialize color_pair, text, attr
|
|
39
|
+
@chunk = [ color_pair, text, attr ]
|
|
40
|
+
#@color = color
|
|
41
|
+
#@text = text
|
|
42
|
+
#@attr = attr
|
|
43
|
+
end
|
|
44
|
+
#
|
|
45
|
+
# This is to be called at runtime by render_all or render to resolve
|
|
46
|
+
# the color.
|
|
47
|
+
# @return [color_pair, nil] color pair for chunk, if nil then substitute with
|
|
48
|
+
# the default which will be form's color. If the form has set fg and bg, then nil
|
|
49
|
+
# should not be returned ever.
|
|
50
|
+
def color_pair
|
|
51
|
+
#@chunk[0]
|
|
52
|
+
# if the color was set, use return it.
|
|
53
|
+
return @chunk[0] if @chunk[0]
|
|
54
|
+
if @color && @bgcolor
|
|
55
|
+
# color was not set, but fg and bg both were
|
|
56
|
+
@chunk[0] = get_color(nil, @color, @bgcolor)
|
|
57
|
+
return @chunk[0] if @chunk[0]
|
|
58
|
+
end
|
|
59
|
+
# return a resolved color_pair if we can, but do not store it in tree.
|
|
60
|
+
# This will be resolved each time render is called from parent.
|
|
61
|
+
return get_color(nil, self.color(), self.bgcolor())
|
|
62
|
+
end
|
|
63
|
+
def text
|
|
64
|
+
@chunk[1]
|
|
65
|
+
end
|
|
66
|
+
def attr
|
|
67
|
+
@chunk[2] || @parent.attr || NORMAL
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# this returns the color of this chunk, else goes up the parents, and finally
|
|
71
|
+
# if none, then returns the default fg color
|
|
72
|
+
# NOTE: this is used at the time of rendering, not parsing
|
|
73
|
+
# This is to ensure that any changes in widgets colors are reflected in renderings
|
|
74
|
+
# without requiring the parse to be done again.
|
|
75
|
+
# Idiealy, the widget would return the form's color if its own was not set, however,
|
|
76
|
+
# i see that color has been removed from form. It should be there, so it reflects
|
|
77
|
+
# in all widgets.
|
|
78
|
+
def color
|
|
79
|
+
@color || @parent.color || $def_fg_color
|
|
80
|
+
end
|
|
81
|
+
# this returns the bgcolor of this chunk, else goes up the parents, and finally
|
|
82
|
+
# if none, then returns the default bg color (global) set in colormap.rb
|
|
83
|
+
# NOTE: this is used at the time of rendering, not parsing
|
|
84
|
+
def bgcolor
|
|
85
|
+
@bgcolor || @parent.bgcolor || $def_bg_color
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# consists of an array of chunks and corresponds to a line
|
|
90
|
+
# to be printed.
|
|
91
|
+
class ChunkLine < AbstractChunkLine
|
|
92
|
+
|
|
93
|
+
# an array of chunks
|
|
94
|
+
attr_reader :chunks
|
|
95
|
+
|
|
96
|
+
def initialize arr=nil
|
|
97
|
+
@chunks = arr.nil? ? Array.new : arr
|
|
98
|
+
end
|
|
99
|
+
def <<(chunk)
|
|
100
|
+
raise ArgumentError, "Chunk object expected. Received #{chunk.class} " unless chunk.is_a? Chunk
|
|
101
|
+
@chunks << chunk
|
|
102
|
+
end
|
|
103
|
+
alias :add :<<
|
|
104
|
+
def each &block
|
|
105
|
+
@chunks.each &block
|
|
106
|
+
end
|
|
107
|
+
#
|
|
108
|
+
# Splits a chunk line giving text, color and attr
|
|
109
|
+
# The purpose of this is to free callers such as window or pad from having to know the internals
|
|
110
|
+
# of this implementation. Any substituing class should have a similar interface.
|
|
111
|
+
# @yield text, color and attr to the block
|
|
112
|
+
def each_with_color &block
|
|
113
|
+
@chunks.each do |chunk|
|
|
114
|
+
case chunk
|
|
115
|
+
when Chunks::Chunk
|
|
116
|
+
color = chunk.color_pair
|
|
117
|
+
attr = chunk.attr
|
|
118
|
+
text = chunk.text
|
|
119
|
+
when Array
|
|
120
|
+
# for earlier demos that used an array
|
|
121
|
+
color = chunk[0]
|
|
122
|
+
attr = chunk[2]
|
|
123
|
+
text = chunk[1]
|
|
124
|
+
end
|
|
125
|
+
yield text, color, attr
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# returns length of text in chunks
|
|
130
|
+
def row_length
|
|
131
|
+
result = 0
|
|
132
|
+
@chunks.each { |e| result += e.text.length }
|
|
133
|
+
return result
|
|
134
|
+
end
|
|
135
|
+
# returns match for str in this chunk
|
|
136
|
+
# added 2013-03-07 - 23:59
|
|
137
|
+
# adding index on 2014-05-26 for multiple matches on one line.
|
|
138
|
+
# 2014-05-28 - 12:02 may no longer be used since i have added to_s in next_match in textpad.
|
|
139
|
+
def index str, offset = 0
|
|
140
|
+
result = 0
|
|
141
|
+
_end = 0
|
|
142
|
+
@chunks.each { |e| txt = e.text;
|
|
143
|
+
_end += txt.length
|
|
144
|
+
if _end < offset
|
|
145
|
+
result += e.text.length
|
|
146
|
+
next
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
ix = txt.index(str)
|
|
150
|
+
if ix
|
|
151
|
+
_off = result + ix
|
|
152
|
+
return _off if _off > offset
|
|
153
|
+
end
|
|
154
|
+
result += e.text.length
|
|
155
|
+
}
|
|
156
|
+
return nil
|
|
157
|
+
end
|
|
158
|
+
alias :length :row_length
|
|
159
|
+
alias :size :row_length
|
|
160
|
+
|
|
161
|
+
# return a Chunkline containing only the text for the range requested
|
|
162
|
+
def substring start, size
|
|
163
|
+
raise "substring not implemented yet"
|
|
164
|
+
end
|
|
165
|
+
def to_s
|
|
166
|
+
result = ""
|
|
167
|
+
@chunks.each { |e| result << e.text }
|
|
168
|
+
result
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# added to take care of many string methods that are called.
|
|
172
|
+
# Callers really don't know this is a chunkline, they assume its a string
|
|
173
|
+
# 2013-03-21 - 19:01
|
|
174
|
+
def method_missing(sym, *args, &block)
|
|
175
|
+
self.to_s.send sym, *args, &block
|
|
176
|
+
end
|
|
177
|
+
# print a chunkline
|
|
178
|
+
# NOTE: tested with pad only. Not with window.
|
|
179
|
+
# Moved from textpad, this is the one method textpad is to call.
|
|
180
|
+
# @param [Pad] pad on which to print
|
|
181
|
+
# @param [Fixnum] lineno to print (zero-based)
|
|
182
|
+
# @param [Fixnum] column to start printing on, usually 0
|
|
183
|
+
# @param [Fixnum] width of pad, usually @content_cols
|
|
184
|
+
# @param [color_pair] colorpair of textpad or widget
|
|
185
|
+
# @param [attr] attr of textpad or widget
|
|
186
|
+
def print pad, lineno, col, width, color_pair, attr
|
|
187
|
+
FFI::NCurses.wmove pad, lineno, col
|
|
188
|
+
a = get_attrib attr
|
|
189
|
+
|
|
190
|
+
show_colored_chunks pad, width, color_pair, a
|
|
191
|
+
end
|
|
192
|
+
# moved from textpad.rb. Note that this does printing for a pad not window
|
|
193
|
+
# so not yet tested if window is passed. Called by +print+.
|
|
194
|
+
def show_colored_chunks(pad, width, defcolor = nil, defattr = nil)
|
|
195
|
+
|
|
196
|
+
self.each_with_color do |text, color, attrib|
|
|
197
|
+
|
|
198
|
+
color ||= defcolor
|
|
199
|
+
attrib ||= defattr || NORMAL
|
|
200
|
+
|
|
201
|
+
#$log.debug "XXX: CHUNK textpad #{text}, cp #{color} , attrib #{attrib}. "
|
|
202
|
+
FFI::NCurses.wcolor_set(pad, color,nil) if color
|
|
203
|
+
FFI::NCurses.wattron(pad, attrib) if attrib
|
|
204
|
+
_print(pad, text, width)
|
|
205
|
+
FFI::NCurses.wattroff(pad, attrib) if attrib
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
# called only by show_colored_chunks
|
|
209
|
+
def _print(pad, string, _width )
|
|
210
|
+
w = _width == 0? Ncurses.COLS : _width
|
|
211
|
+
FFI::NCurses.waddnstr(pad,string.to_s, w) # changed 2011 dts
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# This class does not do the actual parsing which must be done by a class
|
|
216
|
+
# based on the actual format of the marked up document.
|
|
217
|
+
# However, this class converts the parsed fragments to a Chunkline
|
|
218
|
+
# which is an array of Chunks,
|
|
219
|
+
class ColorParser
|
|
220
|
+
attr_reader :stylesheet
|
|
221
|
+
# hash containing color, bgcolor and attr for a given style
|
|
222
|
+
attr_writer :style_map
|
|
223
|
+
def initialize cp
|
|
224
|
+
# in some cases like statusline where it requests window to do some parsing, we will never know who
|
|
225
|
+
# the parent is. We could somehow get the window, and from there the form ???
|
|
226
|
+
@parents = nil
|
|
227
|
+
|
|
228
|
+
chunk_parser cp
|
|
229
|
+
|
|
230
|
+
if cp.is_a? Hash
|
|
231
|
+
@color = cp[:color]
|
|
232
|
+
@bgcolor = cp[:bgcolor]
|
|
233
|
+
@attr = cp[:attr]
|
|
234
|
+
end
|
|
235
|
+
if cp.is_a? TextPad
|
|
236
|
+
self.form = cp
|
|
237
|
+
end
|
|
238
|
+
@attr ||= FFI::NCurses::A_NORMAL
|
|
239
|
+
@color ||= :white
|
|
240
|
+
@bgcolor ||= :black
|
|
241
|
+
@color_pair = get_color($datacolor, @color, @bgcolor)
|
|
242
|
+
@color_array = [@color]
|
|
243
|
+
@bgcolor_array = [@bgcolor]
|
|
244
|
+
@attrib_array = [@attr]
|
|
245
|
+
@color_pair_array = [@color_pair]
|
|
246
|
+
end
|
|
247
|
+
# this is the widget actually that created the parser
|
|
248
|
+
def form=(f)
|
|
249
|
+
@parents = [f]
|
|
250
|
+
end
|
|
251
|
+
public
|
|
252
|
+
# set a stylesheet -- this is a file path containing yaml
|
|
253
|
+
# a style_map is loaded from the stylesheet
|
|
254
|
+
# Sending a symbol such as :help will load style_help.yml
|
|
255
|
+
# @param [String, Symbol] s is a pathname for stylesheet or symbol pointing to a stylesheet
|
|
256
|
+
def stylesheet=(s)
|
|
257
|
+
return unless s
|
|
258
|
+
if s.is_a? Symbol
|
|
259
|
+
s = CANIS_DOCPATH + "style_#{s}.yml"
|
|
260
|
+
end
|
|
261
|
+
@stylesheet = s
|
|
262
|
+
if File.exist? s
|
|
263
|
+
require 'yaml'
|
|
264
|
+
@style_map = YAML::load( File.open( File.expand_path(s) ))
|
|
265
|
+
else
|
|
266
|
+
raise "Could not find stylesheet file #{s}"
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
# what if a text pad changes it's content type, should be not allow it to just
|
|
270
|
+
# use the same parser with a changed internal parser
|
|
271
|
+
# UNUSED as yet
|
|
272
|
+
def content_type ct
|
|
273
|
+
return if ct == @content_type
|
|
274
|
+
@content_type = ct
|
|
275
|
+
self.chunk_parser ct
|
|
276
|
+
end
|
|
277
|
+
# supply with a color parser, if you supplied formatted text
|
|
278
|
+
def chunk_parser f
|
|
279
|
+
if f.is_a? Hash
|
|
280
|
+
self.stylesheet = f[:stylesheet]
|
|
281
|
+
content_type = f[:content_type]
|
|
282
|
+
elsif f.is_a? TextPad
|
|
283
|
+
ff = f.document
|
|
284
|
+
self.stylesheet = ff.stylesheet
|
|
285
|
+
content_type = ff.content_type
|
|
286
|
+
elsif f.is_a? Symbol
|
|
287
|
+
content_type = f
|
|
288
|
+
else
|
|
289
|
+
@chunk_parser = f
|
|
290
|
+
return
|
|
291
|
+
end
|
|
292
|
+
@content_type = content_type
|
|
293
|
+
$log.debug "XXX: chunk_parser setting in CP to #{f}, content+type is #{content_type} "
|
|
294
|
+
require 'canis/core/include/canisparser'
|
|
295
|
+
@chunk_parser ||= CanisParser[content_type]
|
|
296
|
+
raise "colorparser could not find a parser for #{content_type} " unless @chunk_parser
|
|
297
|
+
=begin
|
|
298
|
+
if content_type == :tmux
|
|
299
|
+
@chunk_parser = get_default_color_parser()
|
|
300
|
+
elsif content_type == :ansi
|
|
301
|
+
require 'canis/core/util/ansiparser'
|
|
302
|
+
@chunk_parser = AnsiParser.new
|
|
303
|
+
else
|
|
304
|
+
@chunk_parser = f
|
|
305
|
+
end
|
|
306
|
+
=end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# since 2014-05-19 - 13:14
|
|
310
|
+
# converts a style name given in a document to color, bg, and attr from a stylesheet
|
|
311
|
+
def resolve_style style
|
|
312
|
+
if @style_map
|
|
313
|
+
# style_map contains a map for each style
|
|
314
|
+
retval = @style_map[style]
|
|
315
|
+
raise "Invalid style #{style} in document" unless retval
|
|
316
|
+
return retval
|
|
317
|
+
end
|
|
318
|
+
raise "Style given in document, but no stylesheet provided"
|
|
319
|
+
end
|
|
320
|
+
# parse array of Strings into array of Chunks (Chunklines)
|
|
321
|
+
# @param [Array<String>] formatted text to be parsed into chunks
|
|
322
|
+
# @return [Array<Abstractchunkline>] array of text in our native format (chunklines)
|
|
323
|
+
def parse_text formatted_text
|
|
324
|
+
l = []
|
|
325
|
+
formatted_text.each { |e|
|
|
326
|
+
l << convert_to_chunk(e)
|
|
327
|
+
}
|
|
328
|
+
return l
|
|
329
|
+
end
|
|
330
|
+
#
|
|
331
|
+
# Takes a formatted string and converts the parsed parts to chunks.
|
|
332
|
+
#
|
|
333
|
+
# @param [String] takes the entire line or string and breaks into an array of chunks
|
|
334
|
+
# @yield chunk if block
|
|
335
|
+
# @return [ChunkLine] # [Array] array of chunks
|
|
336
|
+
# @since 1.4.1 2011-11-3 experimental, can change
|
|
337
|
+
# 2014-05-24 - 12:54 NEW As of now since this is called at parse time
|
|
338
|
+
# colors must not be hardcoded, unless both fg and bg are given for a chunk.
|
|
339
|
+
# The color_pair should be resolved at render time using parent.
|
|
340
|
+
public
|
|
341
|
+
def convert_to_chunk s, colorp=$datacolor, att=FFI::NCurses::A_NORMAL
|
|
342
|
+
|
|
343
|
+
raise "You have not set parent of this using form(). Try setting window.form " unless @parents
|
|
344
|
+
@chunk_parser ||= get_default_color_parser()
|
|
345
|
+
res = ChunkLine.new
|
|
346
|
+
# stack the values, so when user issues "/end" we can pop earlier ones
|
|
347
|
+
|
|
348
|
+
newblockflag = false
|
|
349
|
+
@chunk_parser.parse_format(s) do |p|
|
|
350
|
+
case p
|
|
351
|
+
when Array
|
|
352
|
+
newblockflag = true
|
|
353
|
+
## got color / attr info, this starts a new span
|
|
354
|
+
|
|
355
|
+
# added style 2014-05-19 - 12:57 maybe should be a hash
|
|
356
|
+
#color, bgcolor, attr , style = *p
|
|
357
|
+
lc, lb, la, ls = *p
|
|
358
|
+
if ls
|
|
359
|
+
#sc, sb, sa = resolve_style ls
|
|
360
|
+
map = resolve_style ls
|
|
361
|
+
$log.debug " STYLLE #{ls} : #{map} "
|
|
362
|
+
lc ||= map[:color]
|
|
363
|
+
lb ||= map[:bgcolor]
|
|
364
|
+
la ||= map[:attr]
|
|
365
|
+
end
|
|
366
|
+
@_bgcolor = lb
|
|
367
|
+
@_color = lc
|
|
368
|
+
if la
|
|
369
|
+
@attr = get_attrib la
|
|
370
|
+
end
|
|
371
|
+
@_color_pair = nil
|
|
372
|
+
if lc && lb
|
|
373
|
+
# we know only store color_pair if both are mentioned in style or tag
|
|
374
|
+
@_color_pair = get_color(nil, lc, lb)
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
#@color_pair_array << @color_pair
|
|
378
|
+
#@attrib_array << @attr
|
|
379
|
+
#$log.debug "XXX: CHUNK start cp=#{@color_pair} , a=#{@attr} :: c:#{lc} b:#{lb} : @c:#{@color} @bg: #{@bgcolor} "
|
|
380
|
+
#$log.debug "XXX: CHUNK start arr #{@color_pair_array} :: #{@attrib_array} ::#{@color_array} ::: #{@bgcolor_array} "
|
|
381
|
+
|
|
382
|
+
when :endcolor
|
|
383
|
+
|
|
384
|
+
# end the current (last) span
|
|
385
|
+
@parents.pop unless @parents.count == 1
|
|
386
|
+
@_bgcolor = @_color = nil
|
|
387
|
+
@_color_pair = nil
|
|
388
|
+
@attr = nil
|
|
389
|
+
|
|
390
|
+
#$log.debug "XXX: CHUNK end parents:#{@parents.count}, last: #{@parents.last} "
|
|
391
|
+
when :reset # ansi has this
|
|
392
|
+
# end all previous colors
|
|
393
|
+
# end the current (last) span
|
|
394
|
+
# maybe we need to remove all parents except for first
|
|
395
|
+
@parents.pop unless @parents.count == 1
|
|
396
|
+
@_bgcolor = @_color = nil
|
|
397
|
+
@_color_pair = nil
|
|
398
|
+
@attr = nil
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
when String
|
|
402
|
+
|
|
403
|
+
## create the chunk
|
|
404
|
+
#$log.debug "XXX: CHUNK using on #{p} : #{@_color_pair} , #{@attr}, fg: #{@_color}, #{@_bgcolor}, parent: #{@parents.last} " # 2011-12-10 12:38:51
|
|
405
|
+
|
|
406
|
+
#chunk = [color_pair, p, attr]
|
|
407
|
+
chunk = Chunk.new @_color_pair, p, @attr
|
|
408
|
+
chunk.color = @_color
|
|
409
|
+
chunk.bgcolor = @_bgcolor
|
|
410
|
+
chunk.parent = @parents.last
|
|
411
|
+
if newblockflag
|
|
412
|
+
@parents << chunk
|
|
413
|
+
#$log.debug "XXX: CHUNK start parents:#{@parents.count}, #{@parents.last} "
|
|
414
|
+
newblockflag = true
|
|
415
|
+
end
|
|
416
|
+
if block_given?
|
|
417
|
+
yield chunk
|
|
418
|
+
else
|
|
419
|
+
res << chunk
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
end # parse
|
|
423
|
+
return res unless block_given?
|
|
424
|
+
end
|
|
425
|
+
alias :parse_line :convert_to_chunk
|
|
426
|
+
|
|
427
|
+
# returns an instance of the default color parser (tmux parser)
|
|
428
|
+
def get_default_color_parser
|
|
429
|
+
#require 'canis/core/util/defaultcolorparser'
|
|
430
|
+
#@chunk_parser || DefaultColorParser.new
|
|
431
|
+
|
|
432
|
+
require 'canis/core/include/canisparser'
|
|
433
|
+
@chunk_parser ||= CanisParser[:tmux]
|
|
434
|
+
end
|
|
435
|
+
end # class
|
|
436
|
+
end
|
|
437
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# ----------------------------------------------------------------------------- #
|
|
2
|
+
# File: defaultfilerenderer.rb
|
|
3
|
+
# Description: Simple file renderer, colors an entire line based on some keyword.
|
|
4
|
+
# Author: j kepler http://github.com/mare-imbrium/canis/
|
|
5
|
+
# Date: 2014-06-25 - 12:57
|
|
6
|
+
# License: MIT
|
|
7
|
+
# Last update: 2014-06-25 12:58
|
|
8
|
+
# ----------------------------------------------------------------------------- #
|
|
9
|
+
# defaultfilerenderer.rb Copyright (C) 2012-2014 j kepler
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# a simple file renderer that allows setting of colors per line based on
|
|
13
|
+
# regexps passed to +insert_mapping+. See +tasks.rb+ for example usage.
|
|
14
|
+
#
|
|
15
|
+
class DefaultFileRenderer < AbstractTextPadRenderer
|
|
16
|
+
attr_accessor :default_colors
|
|
17
|
+
attr_reader :hash
|
|
18
|
+
|
|
19
|
+
def initialize source=nil
|
|
20
|
+
@default_colors = [:white, :black, NORMAL]
|
|
21
|
+
@pair = get_color($datacolor, @default_colors.first, @default_colors[1])
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def color_mappings hash
|
|
25
|
+
@hash = hash
|
|
26
|
+
end
|
|
27
|
+
# takes a regexp, and an array of color, bgcolor and attr
|
|
28
|
+
def insert_mapping regex, dim
|
|
29
|
+
@hash ||= {}
|
|
30
|
+
@hash[regex] = dim
|
|
31
|
+
end
|
|
32
|
+
# matches given line with each regexp to determine color use
|
|
33
|
+
# Internally used by render.
|
|
34
|
+
def match_line line
|
|
35
|
+
@hash.each_pair {| k , p|
|
|
36
|
+
if line =~ k
|
|
37
|
+
return p
|
|
38
|
+
end
|
|
39
|
+
}
|
|
40
|
+
return @default_colors
|
|
41
|
+
end
|
|
42
|
+
# render given line in color configured using +insert_mapping+
|
|
43
|
+
def render pad, lineno, text
|
|
44
|
+
if @hash
|
|
45
|
+
dim = match_line text
|
|
46
|
+
fg = dim.first
|
|
47
|
+
bg = dim[1] || @default_colors[1]
|
|
48
|
+
if dim.size == 3
|
|
49
|
+
att = dim.last
|
|
50
|
+
else
|
|
51
|
+
att = @default_colors.last
|
|
52
|
+
end
|
|
53
|
+
cp = get_color($datacolor, fg, bg)
|
|
54
|
+
else
|
|
55
|
+
cp = @pair
|
|
56
|
+
att = @default_colors[2]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
FFI::NCurses.wattron(pad,FFI::NCurses.COLOR_PAIR(cp) | att)
|
|
60
|
+
FFI::NCurses.mvwaddstr(pad, lineno, 0, text)
|
|
61
|
+
FFI::NCurses.wattroff(pad,FFI::NCurses.COLOR_PAIR(cp) | att)
|
|
62
|
+
end
|
|
63
|
+
#
|
|
64
|
+
end
|