ansiterm 0.3.3 → 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 +4 -4
- data/ansiterm.gemspec +1 -1
- data/lib/ansiterm/attr.rb +28 -21
- data/lib/ansiterm/buffer.rb +108 -0
- data/lib/ansiterm/string.rb +17 -13
- data/lib/ansiterm/version.rb +1 -1
- data/lib/ansiterm.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92d53d94db9dcd9ed7d7369d4b7df040c5da231bfb2985399b783716f12c7fa0
|
4
|
+
data.tar.gz: 7a50dcdbadfe4cf828de6b98ac674f36052525e0fc5c390a4d018167ccffb4cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0c1b315496296dd0a9c6015c5907a0d08eb6d4c4a17756d8ce22f4929b6ff571e448bf9b83a902949be6b625706e9d796d9c59d742f90fb5b0f7b2ffec3c1a9
|
7
|
+
data.tar.gz: c595e0ca1516a21f033317f997f31981bc6899263ce8407065244d76f8bb41bfe339a5435df048be64a149da36e692bcfc04e695e95cc9664e379a5ed8e7e4e6
|
data/ansiterm.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler"
|
24
|
+
spec.add_development_dependency "bundler"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
27
|
end
|
data/lib/ansiterm/attr.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module AnsiTerm
|
3
2
|
|
4
3
|
# # Attr #
|
@@ -25,10 +24,10 @@ module AnsiTerm
|
|
25
24
|
|
26
25
|
attr_reader :fgcol, :bgcol, :flags
|
27
26
|
|
28
|
-
def initialize(fgcol: nil, bgcol: nil, flags:
|
27
|
+
def initialize(fgcol: nil, bgcol: nil, flags: nil)
|
29
28
|
@fgcol = fgcol
|
30
29
|
@bgcol = bgcol
|
31
|
-
@flags = flags
|
30
|
+
@flags = flags
|
32
31
|
freeze
|
33
32
|
end
|
34
33
|
|
@@ -39,20 +38,28 @@ module AnsiTerm
|
|
39
38
|
flags == other.flags
|
40
39
|
end
|
41
40
|
|
42
|
-
def
|
41
|
+
def to_h
|
42
|
+
attrs = {}
|
43
|
+
attrs[:bgcol] = @bgcol if @bgcol
|
44
|
+
attrs[:fgcol] = @fgcol if @fgcol
|
45
|
+
attrs[:flags] = @flags if @flags
|
46
|
+
attrs
|
47
|
+
end
|
48
|
+
|
49
|
+
def merge(attrs, ignore: nil)
|
43
50
|
return self if self == attrs
|
44
|
-
if attrs.
|
45
|
-
|
46
|
-
attrs = {}
|
47
|
-
attrs[:bgcol] = old.bgcol if old.bgcol
|
48
|
-
attrs[:fgcol] = old.fgcol if old.fgcol
|
49
|
-
attrs[:flags] = old.flags if old.flags
|
51
|
+
if attrs.respond_to?(:to_h)
|
52
|
+
attrs = attrs.to_h
|
50
53
|
end
|
51
|
-
|
52
|
-
|
54
|
+
if ignore
|
55
|
+
attrs.delete(ignore)
|
56
|
+
end
|
57
|
+
attrs = to_h.merge(attrs)
|
58
|
+
self.class.new(attrs)
|
59
|
+
end
|
53
60
|
|
54
|
-
def add_flag(flags);
|
55
|
-
def clear_flag(flags); merge({flags: @flags & ~flags}); end
|
61
|
+
def add_flag(flags); merge({flags: @flags.to_i | flags.to_i}); end
|
62
|
+
def clear_flag(flags); merge({flags: @flags.to_i & ~flags.to_i}); end
|
56
63
|
|
57
64
|
def reset; self.class.new; end
|
58
65
|
def normal; clear_flag(BOLD); end
|
@@ -60,14 +67,14 @@ module AnsiTerm
|
|
60
67
|
def underline; add_flag(UNDERLINE); end
|
61
68
|
def crossed_out; add_flag(CROSSED_OUT); end
|
62
69
|
|
63
|
-
def bold?; (@flags & BOLD) != 0; end
|
64
|
-
def underline?; (@flags & UNDERLINE) != 0; end
|
65
|
-
def crossed_out?; (@flags & CROSSED_OUT) != 0; end
|
70
|
+
def bold?; (@flags.to_i & BOLD) != 0; end
|
71
|
+
def underline?; (@flags.to_i & UNDERLINE) != 0; end
|
72
|
+
def crossed_out?; (@flags.to_i & CROSSED_OUT) != 0; end
|
66
73
|
|
67
74
|
def normal?
|
68
|
-
@flags == NORMAL &&
|
69
|
-
@fgcol.nil? &&
|
70
|
-
@bgcol.nil?
|
75
|
+
(@flags == NORMAL || @flags.nil?) &&
|
76
|
+
(@fgcol.nil? || @fgcol == 39) &&
|
77
|
+
(@bgcol.nil? || @bgcol == 49)
|
71
78
|
end
|
72
79
|
|
73
80
|
def transition_to(other)
|
@@ -92,7 +99,7 @@ module AnsiTerm
|
|
92
99
|
if t.empty?
|
93
100
|
""
|
94
101
|
else
|
95
|
-
"\e[#{t.join(";")}m"
|
102
|
+
"\e[#{t.flatten.join(";")}m"
|
96
103
|
end
|
97
104
|
end
|
98
105
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
|
2
|
+
module AnsiTerm
|
3
|
+
|
4
|
+
# # AnsiTerm::Buffer #
|
5
|
+
#
|
6
|
+
# A terminal buffer that will eventually handle ANSI style strings
|
7
|
+
# fully. For now it will handle the sequences AnsiTerm::String handles
|
8
|
+
# but e.g. cursor movement etc. needs to be explicitly handled.
|
9
|
+
#
|
10
|
+
# Extracted out of https://github.com/vidarh/re
|
11
|
+
#
|
12
|
+
# FIXME: Provide method of setting default background color
|
13
|
+
#
|
14
|
+
class Buffer
|
15
|
+
attr_reader :w,:h, :lines
|
16
|
+
|
17
|
+
def initialize(w=80, h=25)
|
18
|
+
@lines = []
|
19
|
+
@x = 0
|
20
|
+
@y = 0
|
21
|
+
@w = w
|
22
|
+
@h = h
|
23
|
+
@cache = []
|
24
|
+
end
|
25
|
+
|
26
|
+
def cls
|
27
|
+
@lines = (1..@h).map { nil } #AnsiTerm::String.new } #AnsiTerm::String.new("\e[37;40;0m"+(" "*@w)) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset
|
31
|
+
cls
|
32
|
+
@cache=[]
|
33
|
+
end
|
34
|
+
|
35
|
+
def move_cursor(x,y)
|
36
|
+
@x = x
|
37
|
+
@y = y
|
38
|
+
@x = @w-1 if @x >= @w
|
39
|
+
@y = @y-1 if @y >= @h
|
40
|
+
end
|
41
|
+
|
42
|
+
def resize(w,h)
|
43
|
+
if @w != w || @h != h
|
44
|
+
@w, @h = w,h
|
45
|
+
@cache = []
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def scroll
|
50
|
+
while @y >= @h
|
51
|
+
@lines.shift
|
52
|
+
@lines << nil #AnsiTerm::String.new #"" #AnsiTerm::String.new("\e[37;40;0m"+(" "*@w))
|
53
|
+
@y -= 1
|
54
|
+
end
|
55
|
+
true
|
56
|
+
end
|
57
|
+
|
58
|
+
def print *args
|
59
|
+
args.each do |str|
|
60
|
+
@lines[@y] ||= AnsiTerm::String.new("\e[0m")
|
61
|
+
@dirty << @y
|
62
|
+
l = @lines[@y]
|
63
|
+
|
64
|
+
if l.length < @x
|
65
|
+
l << (" "*(@x - l.length))
|
66
|
+
end
|
67
|
+
l[@x..@x+str.length] = str
|
68
|
+
# l[@x] << str
|
69
|
+
# if @x + s.length > @w
|
70
|
+
# l[@x .. @w-1] = s[0 .. @w - @x]
|
71
|
+
# @x = 0
|
72
|
+
# @y += 1
|
73
|
+
# scroll if @y >= @h
|
74
|
+
# end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_s
|
79
|
+
out = ""
|
80
|
+
cachehit=0
|
81
|
+
cachemiss=0
|
82
|
+
@lines.each_with_index do |line,y|
|
83
|
+
line ||= ""
|
84
|
+
line = line[0..(@w-1)]
|
85
|
+
l = line.length
|
86
|
+
#if l > @w
|
87
|
+
# $editor&.log("WARNING: #{l} > @w #{@w}")
|
88
|
+
#end
|
89
|
+
s = line.to_str
|
90
|
+
if @cache[y] != s
|
91
|
+
out << ANSI.cup(y,0) << s << ANSI.sgr(:reset) << ANSI.el #<< X\n"
|
92
|
+
cachemiss += s.length
|
93
|
+
old = @cache[y]
|
94
|
+
@cache[y] = s
|
95
|
+
#$editor.pry([y,old, s])
|
96
|
+
else
|
97
|
+
cachehit += @cache[y].length
|
98
|
+
end
|
99
|
+
# FIXME: This is only worthwhile if a background colour is set
|
100
|
+
#if l < @w
|
101
|
+
# out << ANSI.csi("m",0,38,48,2,48,48,64) << "-"*(@w-l)
|
102
|
+
#end
|
103
|
+
end
|
104
|
+
@dirty = Set[]
|
105
|
+
out
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/ansiterm/string.rb
CHANGED
@@ -56,16 +56,19 @@ module AnsiTerm
|
|
56
56
|
def set_attr(range, attr)
|
57
57
|
min = [range.first - 1,0].max
|
58
58
|
fattr = @attrs[min]
|
59
|
-
attr = fattr.merge(attr)
|
59
|
+
#attr = fattr.merge(attr)
|
60
60
|
r = Array(@attrs[range]).count # Inefficient, but saves dealing with negative offsets etc. "manually"
|
61
61
|
last = nil
|
62
|
-
@attrs[range] = @attrs[range]
|
63
|
-
n = a.merge(attr)
|
62
|
+
@attrs[range] = @attrs[range]&.map do |a|
|
63
|
+
n = a ? a.merge(attr) : attr
|
64
64
|
last == n ? last : n
|
65
|
-
end
|
66
|
-
rm = range.last
|
65
|
+
end || []
|
66
|
+
rm = range.last+1
|
67
67
|
if a = @attrs[rm]
|
68
|
-
@attrs[rm] = Attr.new
|
68
|
+
@attrs[rm] = Attr.new.merge(fattr).merge(a)
|
69
|
+
if !a.bgcol
|
70
|
+
@attrs[rm] = @attrs[rm].merge({bgcol: 49})
|
71
|
+
end
|
69
72
|
end
|
70
73
|
end
|
71
74
|
|
@@ -76,10 +79,11 @@ module AnsiTerm
|
|
76
79
|
last = nil
|
77
80
|
@attrs[range] = @attrs[range].map do |a|
|
78
81
|
if a.bgcol == 49
|
79
|
-
|
82
|
+
n = attr.merge(a, ignore: :bgcol)
|
80
83
|
else
|
81
|
-
|
84
|
+
n = attr.merge(a)
|
82
85
|
end
|
86
|
+
last == n ? last : n
|
83
87
|
end
|
84
88
|
#fattr #@attrs[min+r].merge(fattr)
|
85
89
|
end
|
@@ -91,7 +95,7 @@ module AnsiTerm
|
|
91
95
|
@str = s[0..(range.min-1)].to_s + @str + s[(range.max)..-1].to_s
|
92
96
|
@attrs = a[0..(range.min-1)].to_a + @attrs + a[(range.max)..-1].to_a
|
93
97
|
end
|
94
|
-
|
98
|
+
|
95
99
|
def[] i
|
96
100
|
str = @str[i]
|
97
101
|
if str
|
@@ -106,7 +110,7 @@ module AnsiTerm
|
|
106
110
|
def char_at(index)
|
107
111
|
@str[index]
|
108
112
|
end
|
109
|
-
|
113
|
+
|
110
114
|
def attr_at(index)
|
111
115
|
@attrs[index]
|
112
116
|
end
|
@@ -133,13 +137,13 @@ module AnsiTerm
|
|
133
137
|
if par == "5"
|
134
138
|
col = [col,5,params.shift].join(";")
|
135
139
|
elsif par == "2"
|
136
|
-
col =
|
140
|
+
col = [col,2,*params.slice!(0..2)].join(";")
|
137
141
|
# ,params.shift,params.shift, params.shift].join(";")
|
138
142
|
end
|
139
143
|
end
|
140
144
|
a.merge(attr_name => col)
|
141
145
|
end
|
142
|
-
|
146
|
+
|
143
147
|
def parse(str)
|
144
148
|
@str = ""
|
145
149
|
@attrs = []
|
@@ -147,7 +151,7 @@ module AnsiTerm
|
|
147
151
|
|
148
152
|
max = str.length
|
149
153
|
i = 0
|
150
|
-
|
154
|
+
|
151
155
|
while i < max
|
152
156
|
c = str[i]
|
153
157
|
if c == "\e" && str[i+1] == "[" # CSI
|
data/lib/ansiterm/version.rb
CHANGED
data/lib/ansiterm.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ansiterm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vidar Hokstad
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11
|
11
|
+
date: 2021-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- bin/setup
|
71
71
|
- lib/ansiterm.rb
|
72
72
|
- lib/ansiterm/attr.rb
|
73
|
+
- lib/ansiterm/buffer.rb
|
73
74
|
- lib/ansiterm/string.rb
|
74
75
|
- lib/ansiterm/version.rb
|
75
76
|
homepage: https://github.com/vidarh/ansiterm
|