rubytext 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe02a727ad28e192c4578215c9135f418f1c0e88
4
+ data.tar.gz: fa7091c1920092f1d449499ee1cf969977d2963a
5
+ SHA512:
6
+ metadata.gz: 2ba3f8c5d824a60039d9d982dce8709f914ec47136fe2c38b449df58deec73c16777fee6a8a8143fb2d8e28003eb1bc7a191b369849ddc772873f6acc564c1be
7
+ data.tar.gz: b7df132242683378422ec75c576cbf8e8fd2880fcac97496a2806770c5adcb8464b0426bddbaf535e82ade9ca0e6291a0dc72d9a1c6c6e9183a47695e142b042
data/README.md ADDED
@@ -0,0 +1,14 @@
1
+ RubyText
2
+ --------
3
+
4
+ RubyText is a curses wrapper that is in the early experimental
5
+ stages. The code has bugs. Running it may cause general bad luck
6
+ as well as demon infestation.
7
+
8
+ For now, just run the `examples/demo.rb` program.
9
+
10
+ There is also `examples/ide.rb` ("world's simplest Ruby IDE").
11
+ It is _very_ dumb. :)
12
+
13
+ *More later...*
14
+
data/lib/rubytext.rb ADDED
@@ -0,0 +1,267 @@
1
+ $LOAD_PATH << "lib"
2
+
3
+ require 'curses'
4
+
5
+ require 'version' # skeleton + version
6
+
7
+ X = Curses # shorthand
8
+
9
+ def debug(*args)
10
+ return unless $debug
11
+ $debug.puts *args
12
+ end
13
+
14
+ module RubyText
15
+
16
+ module Keys
17
+ Down = 258
18
+ Up = 259
19
+ Left = 260
20
+ Right = 261
21
+ Enter = 10
22
+ F1 = 265
23
+ F2 = 266
24
+ F3 = 267
25
+ F4 = 268
26
+ F5 = 269
27
+ F6 = 270
28
+ F7 = 271
29
+ F8 = 272
30
+ F9 = 273
31
+ F10 = 274
32
+ F11 = 275
33
+ F12 = 276
34
+ end
35
+
36
+ Colors = %w[black blue cyan green
37
+ magenta red white yellow]
38
+
39
+ class Window
40
+ def self.main
41
+ debug "Entering Window.main"
42
+ @main_win = X.init_screen
43
+ X.start_color
44
+ X.init_pair(1, X::COLOR_BLACK, X::COLOR_WHITE)
45
+ X.stdscr.bkgd(X.color_pair(1)|X::A_NORMAL)
46
+ rows, cols = @main_win.maxy, @main_win.maxx
47
+ debug "About to call .make"
48
+ @screen = self.make(@main_win, rows, cols, 0, 0, false)
49
+ @screen
50
+ end
51
+
52
+ def self.make(cwin, high, wide, r0, c0, border)
53
+ debug "make: #{[cwin, high, wide, r0, c0, border]}"
54
+ obj = self.allocate
55
+ debug "Allocate returned a #{obj.class}"
56
+ obj.instance_eval do
57
+ debug " Inside instance_eval..."
58
+ @outer = @win = cwin
59
+ @wide, @high, @r0, @c0 = wide, high, r0, c0
60
+ @border = border
61
+ @rows, @cols = high, wide
62
+ @width, @height = @cols + 2, @rows + 2 if @border
63
+ end
64
+ obj
65
+ end
66
+ end
67
+ end
68
+
69
+ # debug "Setting STDSCR to Window.main"
70
+
71
+ STDSCR = RubyText::Window.main
72
+ $stdscr = STDSCR
73
+
74
+ ###
75
+
76
+ module RubyText
77
+
78
+ # For passing through arbitrary method calls
79
+ # to the lower level...
80
+
81
+ def self.method_missing(name, *args)
82
+ debug "method_missing: #{name} #{args.inspect}"
83
+ if name[0] == '_'
84
+ X.send(name[1..-1], *args)
85
+ else
86
+ raise "#{name} #{args.inspect}" # NoMethodError
87
+ end
88
+ end
89
+
90
+ def RubyText.window(high, wide, r0, c0, border=false)
91
+ RubyText::Window.new(high, wide, r0, c0, border)
92
+ end
93
+
94
+ def self.start(*args, log: nil, fg: nil, bg: nil)
95
+ $debug = File.new(log, "w") if log
96
+ fg ||= :white
97
+ bg ||= :black
98
+ debug "fg = #{fg} is not a valid color" unless Colors.include?(fg.to_s)
99
+ debug "bg = #{bg} is not a valid color" unless Colors.include?(bg.to_s)
100
+ fg = X.const_get("COLOR_#{fg.upcase}")
101
+ bg = X.const_get("COLOR_#{bg.upcase}")
102
+ X.init_pair(1, bg, fg)
103
+ X.stdscr.bkgd(X.color_pair(1)|X::A_NORMAL)
104
+ X.noecho
105
+ X.stdscr.keypad(true)
106
+ X.cbreak # by default
107
+
108
+ args.each do |arg|
109
+ case arg
110
+ when :raw
111
+ X.raw
112
+ when :echo
113
+ X.echo
114
+ when :noecho
115
+ X.noecho
116
+ when :color
117
+ X.start_color
118
+ end
119
+ end
120
+ end
121
+
122
+ def self.hide_cursor
123
+ X.curs_set(0)
124
+ end
125
+
126
+ def self.show_cursor
127
+ X.curs_set(1)
128
+ end
129
+
130
+ def self.show_cursor!
131
+ X.curs_set(2) # Doesn't work?
132
+ end
133
+
134
+ end
135
+
136
+ class RubyText::Window
137
+ Vert, Horiz = X::A_VERTICAL, X::A_HORIZONTAL # ?|, ?- # "\u2502", "\u2500"
138
+
139
+ attr_reader :win, :rows, :cols, :width, :height
140
+
141
+ def initialize(high=nil, wide=nil, r0=1, c0=1, border=false)
142
+ debug "RT::Win.init: #{[high, wide, r0, c0, border]}"
143
+ @wide, @high, @r0, @c0 = wide, high, r0, c0
144
+ @border = border
145
+ @win = X::Window.new(high, wide, r0, c0)
146
+ debug "outer = #{@win.inspect}"
147
+ debug "@border = #@border"
148
+ if @border
149
+ @win.box(Vert, Horiz)
150
+ @outer = @win
151
+ @outer.refresh
152
+ debug "About to call again: params = #{[high-2, wide-2, r0+1, c0+1]}"
153
+ @win = X::Window.new(high-2, wide-2, r0+1, c0+1) # relative now??
154
+ else
155
+ @outer = @win
156
+ end
157
+ @rows, @cols = @win.maxy, @win.maxx # unnecessary really...
158
+ @width, @height = @cols + 2, @rows + 2 if @border
159
+ @win.refresh
160
+ end
161
+
162
+ def delegate_output(sym, *args)
163
+ args = [""] if args.empty?
164
+ debug "#{sym}: args = #{args.inspect}"
165
+ args.map!(&:inspect) if sym == :p
166
+ str = sprintf(*args)
167
+ str << "\n" if sym != :print && str[-1] != "\n"
168
+ @win.addstr(str)
169
+ @win.refresh
170
+ end
171
+
172
+ def puts(*args)
173
+ delegate_output(:puts, *args)
174
+ end
175
+
176
+ def print(*args)
177
+ delegate_output(:print, *args)
178
+ end
179
+
180
+ def p(*args)
181
+ delegate_output(:p, *args)
182
+ end
183
+
184
+ def rcprint(r, c, *args)
185
+ self.go(r, c) { self.print *args }
186
+ end
187
+
188
+ def rcprint!(r, c, *args)
189
+ @win.setpos(r, c) # Cursor isn't restored
190
+ self.print *args
191
+ end
192
+
193
+ def go(r, c)
194
+ save = self.rc
195
+ @win.setpos(r, c)
196
+ if block_given?
197
+ yield
198
+ go(*save) # No block here!
199
+ end
200
+ end
201
+
202
+ def rc
203
+ [@win.cury, @win.curx]
204
+ end
205
+
206
+ def clear
207
+ @win.clear
208
+ end
209
+
210
+ def output(&block)
211
+ $stdscr = self
212
+ block.call
213
+ $stdscr = STDSCR
214
+ end
215
+
216
+ def [](r, c)
217
+ save = self.rc
218
+ @win.setpos r, c
219
+ ch = @win.inch
220
+ @win.setpos *save
221
+ ch
222
+ # go(r, c) { ch = @win.inch }
223
+ end
224
+
225
+ def []=(r, c, char)
226
+ @win.setpos(r, c)
227
+ @win.addstr(char[0])
228
+ end
229
+
230
+ def boxme
231
+ @outer.box(Vert, Horiz)
232
+ @outer.refresh
233
+ end
234
+
235
+ def refresh
236
+ @win.refresh
237
+ end
238
+ end
239
+
240
+
241
+ ####
242
+
243
+ ### Stick stuff into Kernel for top level
244
+
245
+ module Kernel
246
+ private
247
+ def puts(*args) # Doesn't affect STDOUT.puts, etc.
248
+ $stdscr.puts(*args)
249
+ end
250
+
251
+ def print(*args)
252
+ $stdscr.print(*args)
253
+ end
254
+
255
+ def p(*args)
256
+ $stdscr.p(*args)
257
+ end
258
+
259
+ def rcprint(r, c, *args)
260
+ $stdscr.rcprint r, c, *args
261
+ end
262
+
263
+ def getch
264
+ X.getch
265
+ end
266
+ end
267
+
data/lib/version.rb ADDED
@@ -0,0 +1,6 @@
1
+
2
+ class RubyText
3
+ VERSION = "0.0.15"
4
+
5
+ Path = File.expand_path(File.join(File.dirname(__FILE__)))
6
+ end
data/rubytext.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ require 'date'
2
+ require 'find'
3
+
4
+ $LOAD_PATH << "lib"
5
+
6
+ require "version"
7
+
8
+ Gem::Specification.new do |s|
9
+ system("rm -f *.gem")
10
+ s.name = 'rubytext'
11
+ s.version = RubyText::VERSION
12
+ s.date = Date.today.strftime("%Y-%m-%d")
13
+ s.summary = "A thick wrapper for Curses"
14
+ s.description = "Uses the curses gem and extends functionality and ease of use in Ruby."
15
+ s.authors = ["Hal Fulton"]
16
+ s.email = 'rubyhacker@gmail.com'
17
+ # s.executables << "rubytext-demo"
18
+ s.add_runtime_dependency 'curses'
19
+
20
+ # Files...
21
+ main = Find.find("lib").to_a
22
+
23
+ misc = %w[./README.md ./rubytext.gemspec]
24
+ # test = Find.find("test").to_a
25
+
26
+ s.files = main + misc # + test
27
+ s.homepage = 'https://github.com/Hal9000/rubytext'
28
+ s.license = "Ruby License"
29
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubytext
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.15
5
+ platform: ruby
6
+ authors:
7
+ - Hal Fulton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: curses
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Uses the curses gem and extends functionality and ease of use in Ruby.
28
+ email: rubyhacker@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - "./README.md"
34
+ - "./rubytext.gemspec"
35
+ - lib/rubytext.rb
36
+ - lib/version.rb
37
+ homepage: https://github.com/Hal9000/rubytext
38
+ licenses:
39
+ - Ruby License
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 2.2.2
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: A thick wrapper for Curses
61
+ test_files: []