terminal_rb 1.0.4 → 1.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cafc2d55ed2812b89586adb37fbe22d9c1a46bec4c7ab87f7ba326792254ff5f
4
- data.tar.gz: 1cf7e56b768478dbafa982fe555693cb110c1825476f155af52214853527b9c5
3
+ metadata.gz: dd88e0e1f5665c57303b6540930bb88bc7fc7ba37341161593c47641d83aee5a
4
+ data.tar.gz: adde7fd25392299f1bc967d6537fd25fb94016fcfed76812a99c07ef45604765
5
5
  SHA512:
6
- metadata.gz: 80820ee91b7ae9db787cdbeb0d28fc0bfeafae944ea5106008286b693e13dfed8fa718794cc5c2f656d47d0a1a84918b0708b92206e6e00ec180a75b4ab406d3
7
- data.tar.gz: 1fe8c92a73d3469cb356c924919dc2d4639e74706606f13b6cf7d06c299637ab193e4d6722d061dcfd59b854231d55c23c538dc4593ca21a5cfd600620bebc55
6
+ metadata.gz: 3f487a373e5c05c61ef3c8433db0be643ac2cbd590859d67c2cdecbf62f6c91002d8c2ce19f6895f20e78531e2608ddb2a43491f87fea58c519f133df62070bf
7
+ data.tar.gz: 6db6da10522f8d94e5e1ff964529b0e2a022618c7edae701ffc89ce9bbdfb4ba5942d288b276112dff718e521d43d4f37736acf1be67049821a3abeabf18e39b
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # Terminal.rb v1.0.4
1
+ # Terminal.rb v1.0.5
2
2
 
3
3
  Terminal.rb supports you with input and output on your terminal. Simple [BBCode](https://en.wikipedia.org/wiki/BBCode)-like markup for attributes and coloring, word-wise line breaks, correct special key recognition and mouse event reporting enable you to implement your CLI app quickly and easily.
4
4
 
5
5
  - Gem: [rubygems.org](https://rubygems.org/gems/terminal_rb)
6
6
  - Source: [codeberg.org](https://codeberg.org/mblumtritt/Terminal.rb)
7
- - Help: [rubydoc.info](https://rubydoc.info/gems/terminal_rb/1.0.4/Terminal)
7
+ - Help: [rubydoc.info](https://rubydoc.info/gems/terminal_rb/1.0.5/Terminal)
8
8
 
9
9
  ## Features
10
10
 
@@ -0,0 +1,39 @@
1
+ [b red]Lorem ipsum[/] dolor sit amet, [yellow]consectetur[/] adipiscing elit. Praesent odio orci, [black on_bright_yellow]congue[/] sit amet turpis a, posuere [inv]congue[/] purus. Proin et lectus eget mi vehicula [i green uu]pellentesque[/] nec eu sem. Quisque nunc lectus, [uu]pharetra[/] non justo nec, porttitor mollis enim. Aenean dapibus massa tortor. Curabitur iaculis consequat sapien, eget [i green uu]pellentesque[/] turpis tempor bibendum. Nam cursus at quam vel [yellow]sollicitudin[/]. Etiam luctus nisl nisl, at eleifend tortor blandit non. Duis non suscipit quam. Vestibulum commodo molestie [u]fermentum[/]. Vivamus gravida dui sed nisl ornare, in eleifend leo tristique. Pellentesque eget eleifend [i]augue[/].
2
+
3
+ Vestibulum ultrices, ipsum ut volutpat aliquet, lectus mauris varius ante, non faucibus massa nisi et magna. Nullam id lacus sit amet nisi luctus gravida ut ac odio. Suspendisse ligula erat, vehicula sit amet nulla eget, porta semper neque. Fusce eget ultrices massa. Sed quis mauris tempor, [black on_bright_yellow]congue[/] nibh sed, lacinia mauris. Pellentesque convallis viverra ultrices. Ut sit amet massa [yellow]sollicitudin[/] lectus [uu]pharetra[/] vehicula. Ut hendrerit risus sit amet consequat maximus. Aliquam at ligula at nulla bibendum laoreet ac vitae [i]augue[/]. Sed ullamcorper, orci vel fringilla imperdiet, nisl leo [yellow]consectetur[/] nunc, sit amet pulvinar tortor nulla quis ex.
4
+
5
+ Morbi vitae [i]augue[/] eu neque laoreet [black on_bright_yellow]congue[/]. Integer eu est libero. Quisque consequat felis ipsum, quis consequat dui eleifend eu. Quisque malesuada ipsum vel arcu [yellow]consectetur[/] fringilla. Integer eu eleifend enim. Nam feugiat rutrum justo, consequat ornare massa molestie quis. Aenean eget malesuada ex. Morbi [yellow]sollicitudin[/] commodo nisi, nec auctor ante porta vitae. Aenean tristique ligula sit amet purus ultricies auctor. Nam [cu]finibus[/], libero at vestibulum mattis, diam ipsum placerat massa, sit amet porta ligula libero et lorem. Nullam est tellus, elementum venenatis justo aliquam, pulvinar rutrum nulla. Phasellus nec nisl sem. Sed [i green uu]sagittis[/] nulla sed aliquet auctor. Quisque sit amet [yellow]sollicitudin[/] massa, ut porttitor lacus. Aliquam at sem nec lacus varius pretium rhoncus vel mi. Praesent et lacus sed nunc lacinia porttitor.
6
+
7
+ Nulla mauris [i]augue[/], lacinia sit amet porta et, efficitur in ex. Fusce a fringilla ex. Phasellus ut sem justo. Sed nec sapien orci. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas lectus dui, pretium quis massa vel, gravida commodo mi. Proin feugiat, felis eget bibendum dictum, urna velit cursus odio, ut accumsan ligula orci eu nibh. Donec cursus placerat est ac euismod.
8
+
9
+ Aliquam erat volutpat. Suspendisse iaculis leo porttitor quam pretium lacinia. Morbi euismod sit amet enim in condimentum. Morbi sed [uu]pharetra[/] purus. Vivamus quis libero sed neque [inv]congue[/] egestas. Mauris ullamcorper ipsum vel justo eleifend fringilla. Mauris facilisis quam convallis mauris [inv]congue[/] tempor. Fusce tortor purus, ultrices ut molestie sit amet, [u]fermentum[/] vel quam.
10
+
11
+ Duis placerat ultricies [i green uu]pellentesque[/]. Nam nec efficitur orci, in [yellow]sollicitudin[/] sapien. Nunc condimentum aliquet enim id efficitur. Nulla tempus urna ex. Ut sed dolor eget sapien faucibus imperdiet et tincidunt ex. Vestibulum feugiat vel quam id eleifend. Sed tristique a mauris eget [white on_red]lobortis[/]. Nulla mollis est ipsum, in [black on_bright_yellow]congue[/] nisi maximus eget. Phasellus laoreet rutrum facilisis. In suscipit elementum lorem, a blandit turpis.
12
+
13
+ Suspendisse suscipit in odio quis facilisis. Aliquam nec eros ultrices, hendrerit lacus sit amet, bibendum turpis. Duis ligula ligula, efficitur non tortor quis, ornare dictum urna. Nam blandit lorem blandit turpis laoreet malesuada. Duis et magna ut lorem tempus dignissim. Phasellus dui turpis, ultrices et aliquam nec, pulvinar sed [i]augue[/]. Morbi [uu]pharetra[/] laoreet ipsum non laoreet. Pellentesque a felis vitae sapien condimentum [yellow]sollicitudin[/]. Etiam in nisl eget odio luctus gravida. Donec [yellow]sollicitudin[/] risus porta, scelerisque est ut, pulvinar odio. Nulla at suscipit tortor. Curabitur euismod [inv]congue[/] rhoncus. Cras imperdiet enim arcu, non vehicula tortor tincidunt non. Vivamus tincidunt [u]fermentum[/] quam et dignissim. In lacinia venenatis nunc, non [inv]congue[/] ipsum [inv]congue[/] ut.
14
+
15
+ Donec vitae nulla id elit efficitur facilisis ut sit amet enim. Nam sed magna lorem. Sed scelerisque vel urna sed porta. Donec a orci vel est interdum ultricies ac eu mi. Quisque condimentum luctus venenatis. Proin laoreet [yellow]sollicitudin[/] magna. Proin at nisl a sem condimentum vehicula. Fusce interdum ipsum ac lectus [u]fermentum[/] rutrum. Fusce aliquam, eros at interdum semper, purus urna vulputate lacus, eu [u]fermentum[/] felis sem ut nisl. Pellentesque at viverra libero. Integer [u]fermentum[/] vestibulum tortor, eu aliquam tortor [black on_bright_yellow]congue[/] at. Vestibulum vel fringilla velit. Proin ultricies magna ac ipsum bibendum porttitor. Duis nec leo urna. Morbi rhoncus fringilla [cu]finibus[/].
16
+
17
+ Praesent metus mi, laoreet vel enim in, luctus aliquam odio. Maecenas ultrices metus quam, eget auctor ante [cu]finibus[/] ac. Etiam venenatis et tellus nec suscipit. Sed a nunc libero. In hac habitasse platea dictumst. Ut cursus efficitur dolor, at fringilla risus. Etiam id placerat tellus. Cras sit amet [white on_red]lobortis[/] turpis. Sed bibendum dolor tortor, a elementum nunc molestie cursus. Nullam nec lectus in [i]augue[/] commodo [i green uu]sagittis[/] sed eu tellus. Nam vitae mollis eros. Vivamus ut rhoncus risus. Phasellus [i]augue[/] risus, ultrices ac aliquet quis, suscipit at ipsum. Ut eu odio in felis facilisis [uu]pharetra[/] vitae ut neque. Nunc eget risus [white on_red]lobortis[/], placerat neque id, aliquet arcu. Etiam est tortor, ultricies sit amet eleifend eget, maximus nec ipsum.
18
+
19
+ Proin ex turpis, viverra a convallis at, tincidunt et mi. Ut venenatis tincidunt nisl ac rhoncus. Sed dapibus, metus sit amet [yellow]consectetur[/] mattis, nunc lectus [black on_bright_yellow]congue[/] metus, vitae ornare [i]augue[/] diam eu [i]augue[/]. Proin eget sapien a lorem laoreet [yellow]consectetur[/]. Morbi [i green uu]sagittis[/], dui at egestas malesuada, felis lectus aliquet ante, nec euismod tellus elit semper ante. Nulla vehicula non nibh a aliquet. Donec a massa eget justo tincidunt ullamcorper. Praesent elementum dictum orci et convallis. Sed non dui a [i]augue[/] accumsan vestibulum. Vestibulum id lacus [black on_bright_yellow]congue[/], hendrerit justo sit amet, suscipit magna. Mauris ultrices mattis diam a [white on_red]lobortis[/]. Ut interdum et sapien in [white on_red]lobortis[/].
20
+
21
+ Suspendisse placerat in ex et auctor. Nunc maximus metus quis [black on_bright_yellow]congue[/] suscipit. Vivamus lectus mi, efficitur vel turpis id, suscipit fringilla nunc. Fusce malesuada massa turpis. Aliquam dolor orci, facilisis eu lorem id, elementum placerat ipsum. Proin ac sem sem. Cras [cu]finibus[/] varius fringilla. Fusce non feugiat risus, ut egestas massa. Suspendisse vestibulum [i]augue[/] eu dapibus egestas. Nulla facilisi. Sed ut nulla eu massa fringilla commodo nec vitae neque.
22
+
23
+ Curabitur gravida posuere nunc ut placerat. Phasellus aliquam interdum [u]fermentum[/]. Ut ac mi erat. Morbi [yellow]consectetur[/] odio non nibh ultricies [u]fermentum[/]. Nam dolor enim, mollis at purus a, euismod facilisis ex. Pellentesque dui massa, [yellow]sollicitudin[/] vitae [white on_red]lobortis[/] nec, malesuada a eros. Donec [yellow]sollicitudin[/] tempor volutpat. Cras ac dignissim velit. Cras nec blandit lorem.
24
+
25
+ Phasellus [black on_bright_yellow]congue[/] eu urna non mollis. Suspendisse magna turpis, maximus eget ornare vel, [inv]congue[/] id nisl. Proin feugiat molestie odio quis semper. Pellentesque convallis viverra euismod. Mauris porttitor rhoncus eros, at egestas urna. Nam eget condimentum mi. Fusce ut purus metus. Sed sed ipsum nibh. Vestibulum vehicula tempor turpis, at rhoncus tellus porttitor sed.
26
+
27
+ Donec id dictum sem, ut vulputate nisl. Donec [black on_bright_yellow]congue[/] eleifend purus, eu pretium eros laoreet non. Duis commodo justo a quam laoreet egestas. Donec eu mauris ac metus pulvinar venenatis. Praesent dictum urna ac iaculis vehicula. Ut non felis viverra, semper odio ornare, [yellow]sollicitudin[/] purus. Sed nec metus vehicula, elementum sapien eu, ultrices massa. Quisque tristique semper luctus. Vestibulum sit amet diam sed purus [black on_bright_yellow]congue[/] efficitur et non justo. In massa magna, accumsan at condimentum sit amet, pretium ut orci. Nulla [uu]pharetra[/] magna a metus vehicula varius. Integer et lacus semper, suscipit [i]augue[/] non, [yellow]consectetur[/] nisi. In id tellus vel turpis tristique dignissim nec vel lectus. Sed interdum diam felis, at bibendum arcu feugiat sed.
28
+
29
+ Morbi tortor urna, suscipit non nulla nec, cursus interdum nisl. Nam ante nisi, suscipit a felis eu, faucibus tincidunt metus. Mauris gravida tellus in ipsum porttitor lacinia eu et ante. Maecenas blandit eleifend dui, eu viverra leo. Ut eu [i green uu]pellentesque[/] est. Cras id [cu]finibus[/] ipsum. Vestibulum eget mi ac ante dictum dictum scelerisque at nibh. Ut accumsan aliquam eros eget tincidunt. Nunc sit amet dignissim mauris. Praesent id [i]augue[/] consequat lectus [u]fermentum[/] accumsan quis ut elit. Proin venenatis eros lacus, non ullamcorper purus [u]fermentum[/] vitae. Fusce dolor libero, pretium ac mi nec, porta elementum mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed viverra cursus ultricies.
30
+
31
+ Nam egestas ante a dui mollis rutrum. Phasellus a dapibus arcu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ac tortor in urna tristique bibendum. Aliquam ultrices, sem sit amet semper vehicula, [i]augue[/] erat porttitor [i]augue[/], a pretium nisi magna [i green uu]pellentesque[/] enim. Vestibulum nec nibh vitae nulla interdum [cu]finibus[/] ut viverra dolor. Pellentesque quis lacus enim. Donec et auctor mi. Curabitur eu [i green uu]pellentesque[/] risus. Aliquam [cu]finibus[/] dolor nec velit placerat [inv]congue[/]. Duis eget porttitor dolor. Vestibulum turpis nisi, porttitor ac pulvinar ac, vehicula viverra quam. In mollis, ante sit amet dictum [inv]congue[/], turpis dui luctus sem, eget convallis risus velit eget lorem.
32
+
33
+ Nam quis accumsan tellus, vitae dictum lectus. Donec varius porta metus et iaculis. Ut et consequat est, nec tincidunt neque. Sed ullamcorper lectus eu enim suscipit, sed tincidunt massa dictum. Sed venenatis elit metus, [inv]congue[/] aliquam lectus [i green uu]sagittis[/] at. Pellentesque ante arcu, pulvinar ut commodo at, consequat id sapien. Nunc mollis dolor eu ultricies mattis.
34
+
35
+ Phasellus et elementum lectus, vitae convallis nunc. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed dictum arcu [white on_red]lobortis[/] erat vulputate rhoncus. Ut id imperdiet justo. Donec vehicula in eros at lacinia. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam iaculis [black on_bright_yellow]congue[/] dignissim. Duis vel quam feugiat, gravida quam non, volutpat nisi. Integer eget auctor mauris, consequat dignissim nunc. Ut scelerisque [i]augue[/] aliquam erat rutrum, vitae aliquet est semper. Etiam nec velit lorem. Ut malesuada auctor metus sit amet posuere. Vivamus quis ipsum magna. Vivamus libero erat, dictum ut lorem auctor, tincidunt ultricies tortor. Suspendisse faucibus, ligula id auctor tincidunt, odio ligula tristique [i]augue[/], ac interdum ligula justo dictum magna.
36
+
37
+ Aliquam eros sapien, [inv]congue[/] ut metus eget, blandit iaculis ex. Donec id condimentum leo. Nunc [white on_red]lobortis[/] [yellow]consectetur[/] nunc nec posuere. Curabitur id iaculis diam. Nullam elementum luctus odio, et vehicula velit scelerisque at. Sed lorem nisl, malesuada quis massa sed, hendrerit [uu]pharetra[/] eros. Pellentesque leo mi, placerat id maximus ut, consequat sed turpis. Nulla nunc mi, convallis at iaculis non, ultricies vel tortor. Donec purus velit, molestie in [u]fermentum[/] ut, [black on_bright_yellow]congue[/] in dui. Morbi molestie, enim tempus malesuada consequat, orci lacus bibendum velit, non porta nisi ante a ipsum. Donec vitae nulla nulla.
38
+
39
+ Nulla varius dignissim turpis ac consequat. Fusce ut varius sapien. Cras [yellow]consectetur[/] est eleifend, imperdiet nibh a, dapibus justo. Etiam vehicula, est ac aliquam consequat, ante nibh porta ex, dictum suscipit diam justo et sapien. Sed porttitor ipsum nec diam [u]fermentum[/], vitae mattis diam gravida. Vivamus ac elementum ex, vitae maximus est. Maecenas tempor elementum pretium. Cras aliquam magna sit amet ipsum rutrum commodo. Aliquam cursus tincidunt sapien, et imperdiet sem [black on_bright_yellow]congue[/].
@@ -56,8 +56,8 @@ module Terminal
56
56
 
57
57
  def print(*objects, bbcode: true)
58
58
  return if objects.empty?
59
- return @out.print(*objects) unless bbcode
60
- @out.print(*objects.map! { Ansi.bbcode(it) })
59
+ objects.map! { Ansi.bbcode(it) } if bbcode
60
+ @out.print(*objects)
61
61
  rescue IOError, SystemCallError
62
62
  __output_error(nil)
63
63
  end
@@ -65,8 +65,8 @@ module Terminal
65
65
  def puts(*objects, bbcode: true)
66
66
  objects.flatten!
67
67
  return @out.puts if objects.empty?
68
- return @out.puts(objects) unless bbcode
69
- @out.puts(objects.map! { Ansi.bbcode(it) })
68
+ objects.map! { Ansi.bbcode(it) } if bbcode
69
+ @out.puts(*objects)
70
70
  rescue IOError, SystemCallError
71
71
  __output_error(nil)
72
72
  end
@@ -145,6 +145,7 @@ module Terminal
145
145
  private_class_method def self.extended(mod)
146
146
  mod.instance_variable_set(:@cc, 0)
147
147
  mod.instance_variable_set(:@as, 0)
148
+ # at_exit { raw_write("#{Ansi::CURSOR_SHOW}#{Ansi::SCREEN_ALTERNATE_OFF}") }
148
149
  end
149
150
  end
150
151
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'stringio'
4
+
3
5
  # RSpec shared context for testing code that uses Terminal.rb.
4
6
  #
5
7
  # Stubs all Terminal I/O methods and provides +stdout+, +stdin+, and
@@ -30,9 +32,9 @@
30
32
  # @param pos [Array<Integer, Integer>] mock cursor position as
31
33
  # +[row, column]+ (default: +[1, 1]+)
32
34
  RSpec.shared_context 'with Terminal.rb' do |ansi: true, application: :kitty, colors: 256, size: [25, 80], pos: [1, 1]|
33
- let(:stdout) { [] }
35
+ let(:stdout) { StringIO.new }
36
+ let(:stdout_lines) { stdout.string.lines(chomp: true) }
34
37
  let(:stdin) { [] }
35
- let(:stdoutstr) { stdout.join }
36
38
 
37
39
  before do
38
40
  allow(Terminal).to receive(:ansi?).with(no_args).and_return(ansi)
@@ -48,46 +50,48 @@ RSpec.shared_context 'with Terminal.rb' do |ansi: true, application: :kitty, col
48
50
  allow(Terminal).to receive(:size).with(no_args).and_return(size)
49
51
  allow(Terminal).to receive(:pos).with(no_args).and_return(pos)
50
52
 
51
- bbcode_ = {
52
- true =>
53
- ansi ?
54
- ->(s) { Terminal::Ansi.bbcode(s) } :
55
- ->(s) { Terminal::Ansi.plain(s) },
56
- false => ansi ? lambda(&:to_s) : ->(s) { Terminal::Ansi.undecorate(s) }
57
- }.compare_by_identity
53
+ if ansi
54
+ bbcode_ = ->(s) { Terminal::Ansi.bbcode(s) }
58
55
 
59
- allow(Terminal).to receive(:<<) do |object|
60
- stdout.push(bbcode[object]) unless object.nil?
61
- Terminal
62
- end
56
+ allow(Terminal).to receive(:<<) do |object|
57
+ stdout.write(bbcode_[object]) if object != nil
58
+ Terminal
59
+ end
63
60
 
64
- allow(Terminal).to receive(:print) do |*objects, bbcode: true|
65
- bbcode = bbcode_[bbcode]
66
- objects.flatten.each { stdout.push(bbcode[it]) unless it.nil? }
67
- nil
68
- end
61
+ allow(Terminal).to receive(:print) do |*objects, bbcode: true|
62
+ next if objects.empty?
63
+ objects.map! { Ansi.bbcode(it) } if bbcode
64
+ stdout.print(*objects)
65
+ end
69
66
 
70
- allow(Terminal).to receive(:puts) do |*objects, bbcode: true|
71
- objects.flatten!
72
- if objects.empty?
73
- stdout.push("\n")
74
- next
67
+ allow(Terminal).to receive(:puts) do |*objects, bbcode: true|
68
+ objects.flatten!
69
+ next @out.puts if objects.empty?
70
+ objects.map! { Ansi.bbcode(it) } if bbcode
71
+ stdout.puts(*objects)
75
72
  end
76
- bbcode = bbcode_[bbcode]
77
- objects.each do |s|
78
- next stdout.push("\n") if s.nil?
79
- stdout.push(s = bbcode[s])
80
- stdout.push("\n") if s[-1] != "\n"
73
+
74
+ allow(Terminal).to receive(:raw_write) { stdout.syswrite(it) }
75
+ else
76
+ plain_ = ->(s) { Terminal::Ansi.plain(s) }
77
+ undecorate_ = ->(s) { Terminal::Ansi.undecorate(s) }
78
+
79
+ allow(Terminal).to receive(:<<) do |object|
80
+ stdout.write(Terminal::Ansi.plain(object)) if object != nil
81
+ Terminal
81
82
  end
82
- nil
83
- end
84
83
 
85
- if ansi
86
- allow(Terminal).to receive(:raw_write) do |object|
87
- stdout.push(object = object.to_s)
88
- object.bytesize
84
+ allow(Terminal).to receive(:print) do |*objects, bbcode: true|
85
+ next if objects.empty?
86
+ stdout.print(*objects.map!(&(bbcode ? plain_ : undecorate_)))
89
87
  end
90
- else
88
+
89
+ allow(Terminal).to receive(:puts) do |*objects, bbcode: true|
90
+ objects.flatten!
91
+ next stdout.puts if objects.empty?
92
+ stdout.puts(*objects.map!(&(bbcode ? plain_ : undecorate_)))
93
+ end
94
+
91
95
  allow(Terminal).to receive(:raw_write).and_return(nil)
92
96
  end
93
97
 
@@ -172,27 +172,29 @@ module Terminal
172
172
  return [] if height < 1
173
173
  end
174
174
 
175
+ space = SPACE_CACHE.dup
176
+
175
177
  if width
176
178
  w = (width = width.to_i) - left - right
177
179
  raise(ArgumentError, "invalid width - #{width.inspect}") if w < 1
178
180
  lws = _limited(w)
179
181
  lws = tail ? lws.last(height) : lws.take(height) if height
180
- empty = "#{prefix}#{' ' * width}#{suffix}" if top + bottom > 0
182
+ empty = "#{prefix}#{space[width]}#{suffix}" if top + bottom > 0
181
183
  else
182
184
  lws = @unlimited || _unlimited
183
185
  lws = tail ? lws.last(height) : lws.take(height) if height
184
186
  w = lws.empty? ? 0 : lws.max_by(&:last)[-1]
185
187
  if top + bottom > 0
186
- empty = "#{prefix}#{' ' * (w + left + right)}#{suffix}"
188
+ empty = "#{prefix}#{space[w + left + right]}#{suffix}"
187
189
  end
188
190
  end
189
191
 
190
192
  ret = []
191
193
  ret.fill(empty, 0, top) if top > 0
192
- left = left < 1 ? prefix.to_s : "#{prefix}#{' ' * left}"
193
- right = right < 1 ? suffix.to_s : "#{' ' * right}#{suffix}"
194
+ left = left < 1 ? prefix.to_s : "#{prefix}#{space[left]}"
195
+ right = right < 1 ? suffix.to_s : "#{space[right]}#{suffix}"
194
196
 
195
- space = SPACE_CACHE.dup
197
+ # TODO: styling
196
198
 
197
199
  case align
198
200
  when :left
@@ -201,9 +203,9 @@ module Terminal
201
203
  lws.each { |l, s| ret << "#{left}#{space[w - s]}#{l}#{right}" }
202
204
  when :center
203
205
  lws.each do |l, s|
204
- ls = (s = w - s) / 2
205
- next ret << "#{left}#{l}#{right}" if ls < 1
206
- ret << "#{left}#{space[ls]}#{l}#{space[s - ls]}#{right}"
206
+ rs = ((s = w - s) / 2.0).round
207
+ next ret << "#{left}#{l}#{right}" if rs < 1
208
+ ret << "#{left}#{space[s - rs]}#{l}#{space[rs]}#{right}"
207
209
  end
208
210
  else
209
211
  lws.each { |l, _| ret << "#{left}#{l}#{right}" }
@@ -294,8 +296,9 @@ module Terminal
294
296
  if (last = line[-1]).is_a?(Space) # ignore trailing space
295
297
  line.pop
296
298
  size -= last.size
299
+ next add_line.call
297
300
  end
298
- add_line.call # if size > 0
301
+ add_line.call if size > 0
299
302
  next
300
303
  end
301
304
 
@@ -583,7 +586,7 @@ module Terminal
583
586
 
584
587
  SPACE_CACHE =
585
588
  Hash
586
- .new { |h, s| h[s] = s < 1 ? '' : ' ' * s }
589
+ .new { |h, s| h[s] = s < 1 ? '' : ' ' * s }
587
590
  .compare_by_identity
588
591
  .freeze
589
592
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Terminal
4
4
  # The version number of the gem.
5
- VERSION = '1.0.4'
5
+ VERSION = '1.0.5'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terminal_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Blumtritt
@@ -29,6 +29,7 @@ files:
29
29
  - examples/bbcode.rb
30
30
  - examples/info.rb
31
31
  - examples/key-codes.rb
32
+ - examples/lorem_ipsum.ansi
32
33
  - examples/screen_viewer.rb
33
34
  - examples/text.rb
34
35
  - lib/terminal.rb
@@ -59,7 +60,7 @@ metadata:
59
60
  yard.run: yard
60
61
  source_code_uri: https://codeberg.org/mblumtritt/Terminal.rb
61
62
  bug_tracker_uri: https://codeberg.org/mblumtritt/Terminal.rb/issues
62
- documentation_uri: https://rubydoc.info/gems/terminal_rb/1.0.4
63
+ documentation_uri: https://rubydoc.info/gems/terminal_rb/1.0.5
63
64
  rdoc_options: []
64
65
  require_paths:
65
66
  - lib
@@ -74,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
75
  - !ruby/object:Gem::Version
75
76
  version: '0'
76
77
  requirements: []
77
- rubygems_version: 4.0.11
78
+ rubygems_version: 4.0.13
78
79
  specification_version: 4
79
80
  summary: Fast terminal access with ANSI, CSIu, mouse events, BBCode, word-wise line
80
81
  break support and much more.