ansiterm 0.3.1 → 0.3.2

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
- SHA1:
3
- metadata.gz: c7ee1afd97de8627d4106e6d2506c6afeeed80bd
4
- data.tar.gz: 902a4d04c8b376286e9da45bc03219e46e6f33c8
2
+ SHA256:
3
+ metadata.gz: d38217a9590237a3e098e5cf097fc03bc055dbab158c7eaab8b730a9c51e28d8
4
+ data.tar.gz: fa2661f67e062ad9e8a12f930bb80e93aff47d41641da140ec8bc51a293b98ba
5
5
  SHA512:
6
- metadata.gz: 4f0aedde0e2ec57c2ea17cb53c8749d1c144bb78d9f230e98ce215ff7e9daab83e1cf8998a1c2283f53c3ce5f7ea31bf39e5d606e76b600ea859bb518a268ede
7
- data.tar.gz: c790e5974e11c75df1216c8966119cf346878b4de6c7accce636729af3b2206e9b9eef028379dcf9b6e003921d0361312834b32f02942774c69b10f275b556ba
6
+ metadata.gz: 84474fe763a85f88560157e7bf70d047e1bbf1efb72407b64b6f4cd9cac57be295f99d9720c5a28d7531873c8ac192c1c3ab63b37fa6d44d877729f96442d1bc
7
+ data.tar.gz: 809ec57358492a2b71a9ae095907248b1ff2e681f679ab3139d5cd7bede8198cb42408ece26e109859f3a0862702a37be9bb75de0b04ca1d9227abc1644a450d
@@ -1,6 +1,8 @@
1
1
 
2
2
  module AnsiTerm
3
3
 
4
+ # # Attr #
5
+ #
4
6
  # Attr represents the attributes of a given character.
5
7
  # It is intended to follow the "Flyweight" GOF pattern
6
8
  # in that any object representing a given combination
@@ -20,7 +22,7 @@ module AnsiTerm
20
22
  ITALICS = 2
21
23
  UNDERLINE = 4
22
24
  CROSSED_OUT = 8
23
-
25
+
24
26
  attr_reader :fgcol, :bgcol, :flags
25
27
 
26
28
  def initialize(fgcol: nil, bgcol: nil, flags: 0)
@@ -31,11 +33,18 @@ module AnsiTerm
31
33
  end
32
34
 
33
35
  def merge(attrs)
36
+ if attrs.kind_of?(self.class)
37
+ old = attrs
38
+ attrs = {}
39
+ attrs[:bgcol] = old.bgcol if old.bgcol
40
+ attrs[:fgcol] = old.fgcol if old.fgcol
41
+ attrs[:flags] = old.flags if old.flags
42
+ end
34
43
  self.class.new({bgcol: @bgcol, fgcol: @fgcol, flags: @flags}.merge(attrs))
35
44
  end
36
-
45
+
37
46
  def add_flag(flags); merge({flags: @flags | flags}); end
38
- def clear_flag(flags); merge({flags: @flags & ~BOLD}); end
47
+ def clear_flag(flags); merge({flags: @flags & ~flags}); end
39
48
 
40
49
  def reset; self.class.new; end
41
50
  def normal; clear_flag(BOLD); end
@@ -55,23 +64,23 @@ module AnsiTerm
55
64
 
56
65
  def transition_to(other)
57
66
  t = []
58
- t << [other.fgcol] if other.fgcol != self.fgcol
59
- t << [other.bgcol] if other.bgcol != self.bgcol
60
-
67
+ t << [other.fgcol] if other.fgcol && other.fgcol != self.fgcol
68
+ t << [other.bgcol] if other.bgcol && other.bgcol != self.bgcol
69
+
61
70
  if other.bold? != self.bold?
62
71
  t << [other.bold? ? 1 : 22]
63
72
  end
64
-
73
+
65
74
  if other.underline? != self.underline?
66
75
  t << [other.underline? ? 4 : 24]
67
76
  end
68
-
77
+
69
78
  if other.crossed_out? != self.crossed_out?
70
79
  t << [other.crossed_out? ? 9 : 29]
71
80
  end
72
81
 
73
82
  return "\e[0m" if other.normal? && !self.normal? && t.length != 1
74
-
83
+
75
84
  if t.empty?
76
85
  ""
77
86
  else
@@ -1,4 +1,5 @@
1
-
1
+
2
+ # This is a test
2
3
  module AnsiTerm
3
4
 
4
5
  class String
@@ -6,6 +7,10 @@ module AnsiTerm
6
7
  parse(str)
7
8
  end
8
9
 
10
+ def to_plain_str
11
+ @str.dup
12
+ end
13
+
9
14
  def to_str
10
15
  out = ""
11
16
  a = Attr.new
@@ -40,6 +45,25 @@ module AnsiTerm
40
45
  @str, @attrs = str,Array(attrs)
41
46
  end
42
47
 
48
+ def set_attr(range, attr)
49
+ min = range.first - 1
50
+ fattr = @attrs[min]
51
+ attr = fattr.merge(attr) if fattr
52
+ r = Array(@attrs[range]).count # Inefficient, but saves dealing with negative offsets etc. "manually"
53
+ last = nil
54
+ @attrs[range] = @attrs[range].map do |a|
55
+ a == last ? a : last = attr.merge(a)
56
+ end
57
+ end
58
+
59
+ def[]= range, str
60
+ s = @str
61
+ a = @attrs
62
+ parse(str)
63
+ @str = s[0..(range.min-1)].to_s + @str + s[(range.max)..-1].to_s
64
+ @attrs = a[0..(range.min-1)].to_a + @attrs + a[(range.max)..-1].to_a
65
+ end
66
+
43
67
  def[] i
44
68
  str = @str[i]
45
69
  if str
@@ -51,6 +75,10 @@ module AnsiTerm
51
75
  end
52
76
  end
53
77
 
78
+ def attr_at(index)
79
+ @attrs[index]
80
+ end
81
+
54
82
  def << str
55
83
  parse(self.to_str + "\e[0m" + str.to_str)
56
84
  end
@@ -64,7 +92,8 @@ module AnsiTerm
64
92
  if par == "5"
65
93
  col = [col,5,params.shift].join(";")
66
94
  elsif par == "2"
67
- col = [col,5,params.shift,params.shift, params.shift].join(";")
95
+ col = ([col,2] << params.slice!(0..2)).join(";")
96
+ # ,params.shift,params.shift, params.shift].join(";")
68
97
  end
69
98
  end
70
99
  a.merge(attr_name => col)
@@ -81,16 +110,22 @@ module AnsiTerm
81
110
  while i < max
82
111
  c = str[i]
83
112
  if c == "\e" && str[i+1] == "[" # CSI
84
- params = ""
113
+ params = []
85
114
  i += 2
115
+ par = ""
86
116
  while i < max && str[i].ord < 0x40
87
- params << str[i]
117
+ if str[i] == ";"
118
+ params << par
119
+ par = ""
120
+ else
121
+ par << str[i]
122
+ end
88
123
  i+=1
89
124
  end
125
+ params << par if !par.empty?
90
126
  final = str[i]
91
127
 
92
128
  if final == "m"
93
- params = params.split(";")
94
129
  while par = params.shift
95
130
  par = par.to_i
96
131
  case par
@@ -105,12 +140,13 @@ module AnsiTerm
105
140
  when 22
106
141
  a = a.normal
107
142
  when 24
143
+ old = a
108
144
  a = a.clear_flag(Attr::UNDERLINE)
109
145
  when 29
110
146
  a = a.clear_flag(Attr::CROSSED_OUT)
111
- when 30..39
147
+ when 30..39, 90..98
112
148
  a = parse_color(par, params, a, :fgcol)
113
- when 40..49
149
+ when 40..49, 100..107
114
150
  a = parse_color(par, params, a, :bgcol)
115
151
  else
116
152
  @str << "[unknown escape: #{par}]"
@@ -1,3 +1,3 @@
1
1
  module AnsiTerm
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ansiterm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vidar Hokstad
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-30 00:00:00.000000000 Z
11
+ date: 2018-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -92,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  version: '0'
93
93
  requirements: []
94
94
  rubyforge_project:
95
- rubygems_version: 2.5.2
95
+ rubygems_version: 2.7.6
96
96
  signing_key:
97
97
  specification_version: 4
98
98
  summary: ANSI/VT102 terminal output with windowing