monocle-print 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/monocle-print/output-device.rb +51 -40
- data/lib/monocle-print/presentation.rb +28 -28
- data/lib/monocle-print.rb +17 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTJhOTg2ZGRkZTUzMDYxOTAxMmNhMWI2ZTJjM2ViM2E0NTk4YzBmMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmMyYWJmNzEyZDc1ZWZlODE5NDgwY2RiNjI1NDAzYjdjYzdhNWY1OA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDE0ZDQwOTk5MTk1ZDVkYjM5NjJjZjg3OGFmZWVlMmRhMTFkOTcxMWNkNDgz
|
10
|
+
ODExMTQ5ODFmMzkxZTgxMTNlYmExODUzY2M1MWZlODE4MTlmNWY2NTViYzY5
|
11
|
+
ZmM3ZjZjNGZiZTU3YzI4ZmYwNTQzNDc0ODEwNGQ2ZDE5OTkyZjE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MGUyN2Q0NzkyN2I5ZWY0NjUzNzE2NWRlNDc3MTg4NGE2NDRiMDZjMjAzZDlm
|
14
|
+
YWZjM2Q2YzkyNWMzNWJiZDcyZmNjYzUyNTliMmJlY2U0ZmFiNzRjNDUwNjNk
|
15
|
+
YzRlNmJmMWQ0MGE5MjQ0NjM0ODk3MjRjODg0MzQ2ZWNkNzFmOGI=
|
@@ -40,6 +40,11 @@ class OutputDevice < DelegateClass( IO )
|
|
40
40
|
block_given? ? yield( device ) : device
|
41
41
|
end
|
42
42
|
|
43
|
+
def self.stderr( options = {} )
|
44
|
+
device = new( $stderr, options )
|
45
|
+
block_given? ? yield( device ) : device
|
46
|
+
end
|
47
|
+
|
43
48
|
DEFAULT_SIZE = Pair.new( 80, 22 ).freeze
|
44
49
|
IO_PRINT_METHODS = %w( puts print printf putc )
|
45
50
|
SIZE_IOCTL = 0x5413
|
@@ -62,18 +67,20 @@ class OutputDevice < DelegateClass( IO )
|
|
62
67
|
raise( ArgumentError, msg )
|
63
68
|
end
|
64
69
|
end
|
70
|
+
|
65
71
|
super( @device )
|
66
72
|
|
67
|
-
@cursor = Pair.new( 0, 0 )
|
68
73
|
@background_stack = []
|
69
74
|
@foreground_stack = []
|
70
|
-
@background
|
71
|
-
@
|
75
|
+
@background = @foreground = nil
|
76
|
+
@use_color = options.fetch( :use_color, tty? )
|
72
77
|
|
73
|
-
@
|
74
|
-
@
|
78
|
+
@cursor = Pair.new( 0, 0 )
|
79
|
+
@tab_width = options.fetch( :tab_width, 8 )
|
80
|
+
@margin = Pair.new( 0, 0 )
|
81
|
+
|
82
|
+
@newline = options.fetch( :newline, $/ )
|
75
83
|
|
76
|
-
@margin = Pair.new( 0, 0 )
|
77
84
|
case margin = options.fetch( :margin, 0 )
|
78
85
|
when Numeric then @margin.left = @margin.right = margin.to_i
|
79
86
|
else
|
@@ -81,12 +88,12 @@ class OutputDevice < DelegateClass( IO )
|
|
81
88
|
@margin.right = margin[ :right ].to_i
|
82
89
|
end
|
83
90
|
|
84
|
-
@tabs
|
85
|
-
@screen_size
|
91
|
+
@tabs = {}
|
92
|
+
@screen_size = nil
|
86
93
|
@forced_width = options[ :width ]
|
87
94
|
@forced_height = options[ :height ]
|
88
|
-
@alignment
|
89
|
-
@style
|
95
|
+
@alignment = options.fetch( :alignment, :left )
|
96
|
+
@style = Style( options[ :style ] )
|
90
97
|
end
|
91
98
|
|
92
99
|
def foreground( color = nil )
|
@@ -137,22 +144,22 @@ class OutputDevice < DelegateClass( IO )
|
|
137
144
|
end
|
138
145
|
|
139
146
|
def use_color= v
|
140
|
-
@use_color =
|
147
|
+
@use_color = !!v
|
141
148
|
end
|
142
149
|
|
143
150
|
def margin= n
|
144
|
-
left_margin = right_margin = Utils.at_least( n.to_i, 0 )
|
151
|
+
self.left_margin = self.right_margin = Utils.at_least( n.to_i, 0 )
|
145
152
|
end
|
146
153
|
|
147
154
|
def indent( n = 0, m = 0 )
|
148
155
|
n, m = n.to_i, m.to_i
|
149
|
-
self.left_margin
|
156
|
+
self.left_margin += n
|
150
157
|
self.right_margin += m
|
151
158
|
if block_given?
|
152
159
|
begin
|
153
160
|
yield
|
154
161
|
ensure
|
155
|
-
self.left_margin
|
162
|
+
self.left_margin -= n
|
156
163
|
self.right_margin -= m
|
157
164
|
end
|
158
165
|
else
|
@@ -297,7 +304,7 @@ class OutputDevice < DelegateClass( IO )
|
|
297
304
|
@device.print( str )
|
298
305
|
@cursor + str.width
|
299
306
|
@device.print( clear_attr )
|
300
|
-
fill(
|
307
|
+
fill( screen_size.width - @cursor.column )
|
301
308
|
self
|
302
309
|
end
|
303
310
|
|
@@ -406,34 +413,35 @@ private
|
|
406
413
|
end
|
407
414
|
|
408
415
|
def screen_size
|
409
|
-
@screen_size ||=
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
416
|
+
@screen_size ||=
|
417
|
+
begin
|
418
|
+
if device.respond_to?( :winsize )
|
419
|
+
detected_height, detected_width = device.winsize
|
420
|
+
elsif data = SIZE_STRUCT.dup and device.ioctl( SIZE_IOCTL, data ) >= 0
|
421
|
+
detected_height, detected_width = data.unpack( "SS" )
|
422
|
+
else
|
423
|
+
size = default_size
|
424
|
+
detected_height, detected_width = size.height, size.width
|
425
|
+
end
|
415
426
|
Pair.new(
|
416
|
-
|
417
|
-
|
427
|
+
@forced_height || detected_height,
|
428
|
+
@forced_width || detected_width
|
418
429
|
)
|
419
|
-
|
430
|
+
rescue Exception
|
420
431
|
default_size
|
421
432
|
end
|
422
|
-
rescue Exception
|
423
|
-
default_size
|
424
|
-
end
|
425
433
|
end
|
426
434
|
|
427
435
|
def default_size
|
428
|
-
Pair.new(
|
436
|
+
Pair.new( default_width, default_height )
|
429
437
|
end
|
430
438
|
|
431
439
|
def default_height
|
432
|
-
( ENV[ 'LINES' ] || DEFAULT_SIZE.height ).to_i
|
440
|
+
( @forced_height || ENV[ 'LINES' ] || DEFAULT_SIZE.height ).to_i
|
433
441
|
end
|
434
442
|
|
435
443
|
def default_width
|
436
|
-
( ENV[ 'COLUMNS' ] || DEFAULT_SIZE.width ).to_i
|
444
|
+
( @forced_width || ENV[ 'COLUMNS' ] || DEFAULT_SIZE.width ).to_i
|
437
445
|
end
|
438
446
|
end
|
439
447
|
|
@@ -471,20 +479,23 @@ class Pager < OutputDevice
|
|
471
479
|
private
|
472
480
|
|
473
481
|
def screen_size
|
474
|
-
@screen_size ||=
|
475
|
-
|
476
|
-
|
477
|
-
|
482
|
+
@screen_size ||=
|
483
|
+
begin
|
484
|
+
if STDOUT.respond_to?( :winsize )
|
485
|
+
detected_height, detected_width = STDOUT.winsize
|
486
|
+
elsif data = SIZE_STRUCT.dup and STDOUT.ioctl( SIZE_IOCTL, data ) >= 0
|
487
|
+
detected_height, detected_width = data.unpack( "SS" )
|
488
|
+
else
|
489
|
+
size = default_size
|
490
|
+
detected_height, detected_width = size.height, size.width
|
491
|
+
end
|
478
492
|
Pair.new(
|
479
|
-
|
480
|
-
|
493
|
+
@forced_height || detected_height,
|
494
|
+
@forced_width || detected_width
|
481
495
|
)
|
482
|
-
|
496
|
+
rescue Exception
|
483
497
|
default_size
|
484
498
|
end
|
485
|
-
rescue Exception
|
486
|
-
default_size
|
487
|
-
end
|
488
499
|
end
|
489
500
|
end
|
490
501
|
|
@@ -5,7 +5,7 @@ module MonoclePrint
|
|
5
5
|
module Presentation
|
6
6
|
include MonoclePrint
|
7
7
|
ALIGNMENTS = [ :left, :right, :center ]
|
8
|
-
|
8
|
+
|
9
9
|
def self.included( klass )
|
10
10
|
super
|
11
11
|
klass.extend( ClassMethods )
|
@@ -13,7 +13,7 @@ module Presentation
|
|
13
13
|
|
14
14
|
attr_accessor :owner
|
15
15
|
protected :owner=
|
16
|
-
|
16
|
+
|
17
17
|
for attr in %w( margin padding border )
|
18
18
|
class_eval( <<-END, __FILE__, __LINE__ + 1 )
|
19
19
|
def #{ attr }( value = nil )
|
@@ -21,33 +21,33 @@ module Presentation
|
|
21
21
|
@#{ attr } ||= default_#{ attr }
|
22
22
|
block_given? ? yield( @#{ attr } ) : @#{ attr }
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def #{ attr }= value
|
26
26
|
@#{ attr } = Rectangle( value )
|
27
27
|
end
|
28
28
|
END
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def alignment( value = nil )
|
32
32
|
value and self.alignment = value
|
33
33
|
@alignment or @owner ? @owner.alignment : :left
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def alignment= value
|
37
37
|
ALIGNMENTS.member?( value = value.to_sym ) or
|
38
38
|
raise( ArgumentError, "unkown alignment: %p" % value )
|
39
39
|
@alignment = value
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def style( value = nil )
|
43
43
|
value and self.style = value
|
44
44
|
@style or @owner ? @owner.style : Graphics::NAMED_STYLES[ 'ascii' ]
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def style= value
|
48
48
|
@style = Style( value )
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
def render( output = @output )
|
52
52
|
if output
|
53
53
|
render_content( output )
|
@@ -58,66 +58,66 @@ module Presentation
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def to_s
|
63
63
|
OutputDevice.buffer do | out |
|
64
64
|
render_content( out )
|
65
65
|
end
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def height
|
69
69
|
@height or calculate_height
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def width
|
73
73
|
@width or calculate_width
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
attr_writer :max_width
|
77
|
-
|
77
|
+
|
78
78
|
def max_width
|
79
79
|
@max_width or @owner && @owner.max_width or output.width
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
def output
|
83
83
|
@output ||= ( @owner and @owner.output or OutputDevice.stdout )
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
def output=( io )
|
87
87
|
@output = io.nil? ? io : Output( io )
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
private
|
91
|
-
|
91
|
+
|
92
92
|
def initialize_view( options = nil, owner = nil )
|
93
93
|
@max_width = @width = @height = nil
|
94
94
|
@margin = @padding = @alignment = @style = nil
|
95
95
|
@output = @foreground = @background = nil
|
96
|
-
|
96
|
+
|
97
97
|
if options
|
98
|
-
val = options[ :width ] and self.width
|
98
|
+
val = options[ :width ] and self.width = val
|
99
99
|
val = options[ :align ] and self.alignment = val
|
100
|
-
val = options[ :style ] and self.style
|
101
|
-
val = options[ :padding ] and self.padding
|
102
|
-
val = options[ :margin ] and self.margin
|
103
|
-
val = options[ :output ] and self.output
|
100
|
+
val = options[ :style ] and self.style = val
|
101
|
+
val = options[ :padding ] and self.padding = val
|
102
|
+
val = options[ :margin ] and self.margin = val
|
103
|
+
val = options[ :output ] and self.output = val
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
@owner = owner
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
def default_margin
|
110
110
|
Rectangle.new( 0, 0, 0, 0 )
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def default_padding
|
114
114
|
Rectangle.new( 0, 0, 0, 0 )
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
def default_border
|
118
118
|
Rectangle.new( false, false, false, false )
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
end
|
122
122
|
|
123
123
|
module Presentation::ClassMethods
|
data/lib/monocle-print.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
+
begin
|
5
|
+
require 'io/console'
|
6
|
+
rescue LoadError
|
7
|
+
# ignore
|
8
|
+
end
|
9
|
+
|
4
10
|
module MonoclePrint
|
5
|
-
VERSION = '1.0.
|
11
|
+
VERSION = '1.0.2'
|
6
12
|
|
7
13
|
def self.version
|
8
14
|
VERSION
|
@@ -17,8 +23,16 @@ module MonoclePrint
|
|
17
23
|
File.join( File.dirname( __FILE__ ), *args )
|
18
24
|
end
|
19
25
|
|
20
|
-
def self.stdout
|
21
|
-
|
26
|
+
def self.stdout( options = {}, &block )
|
27
|
+
OutputDevice.stdout( options, &block )
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.stderr( options = {}, &block )
|
31
|
+
OutputDevice.stderr( options, &block )
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.buffer( options = {}, &block )
|
35
|
+
OutputDevice.buffer( options, &block )
|
22
36
|
end
|
23
37
|
|
24
38
|
module_function
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monocle-print
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- monocle-print
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|