ansi_stream 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 381fa7ea723333fd9446734b183ad2f128a1b77d
4
- data.tar.gz: d7e1e56e2bb6a2a2fe4cc79e5073e3874b86b3f4
3
+ metadata.gz: 6b4720f95b21296654c6a78831eeb147ce974e9d
4
+ data.tar.gz: 70c57a31f3941699d388ffa946da543dbf23041c
5
5
  SHA512:
6
- metadata.gz: b1e565dd4991086124164b09e18abe0da764557f4c6b2fd6c74e122f3df4d183ee2d3654dbc7e944d134a33609cc7eeb094bbf5fb311ac5e69fe16b04ab59341
7
- data.tar.gz: a6ffffa607bf712a8858f9d12fda0c43efe5483fc3ad754922499f3d640a91d54791cb0ce7b05ba4648a09b3e4696ef3924284acaa4adf6bc7470e9d699d1738
6
+ metadata.gz: 14c84a8c76714cbef8887e2499a2ae26dbe943106d90132ecd39392d8f641daeed5021f5a5918c66fdc3c03684f435c19daa610a3fb4c4cd11ac271c5fe49bdc
7
+ data.tar.gz: 1b6d377aba05ba03bd74e6dd3315b5070b8af4ab49103a8e799536e16081977a2ea22cf6bd28c05ba16bd8b33ac0251c38ced218387c4ab107bd1d62d43c9513
data/Rakefile CHANGED
@@ -1,25 +1,28 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'jasmine'
3
3
  require 'coffee-script'
4
+ require 'fileutils'
4
5
  load 'jasmine/tasks/jasmine.rake'
5
6
 
6
- task :vendorize do
7
+ task :compile do
7
8
  def compile(file, target)
8
9
  File.new(target, "w").write(CoffeeScript.compile(File.read(file), bare: true))
9
10
  end
10
11
 
11
- Dir['src/**/*.coffee'].each do |file|
12
- target = file.gsub(/^src/, "vendor/assets").gsub(/.coffee$/, ".js")
13
- compile(file, target)
14
- end
12
+ def compile_dir(source_dir, target_dir)
13
+ FileUtils.mkdir_p target_dir
15
14
 
16
- Dir['spec/**/*.coffee'].each do |file|
17
- target = file.gsub(/.coffee$/, ".js")
18
- compile(file, target)
15
+ Dir["#{source_dir}/**/*.coffee"].each do |file|
16
+ target = "#{target_dir}/#{File.basename(file, ".coffee")}.js"
17
+ compile(file, target)
18
+ end
19
19
  end
20
+
21
+ compile_dir('vendor', 'tmp/assets')
22
+ compile_dir('spec', 'tmp/spec')
20
23
  end
21
24
 
22
25
  task :test do
23
26
  end
24
27
 
25
- task default: [:vendorize, 'jasmine:ci']
28
+ task default: [:compile, 'jasmine:ci']
@@ -1,3 +1,3 @@
1
1
  module AnsiStream
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -4,33 +4,35 @@ describe "AnsiStream", ->
4
4
  stream = new AnsiStream()
5
5
 
6
6
  expectClass = (span, color) ->
7
- expect(span).toMatch(new RegExp("class='[^']*#{color}.*'"))
7
+ expect(span.className.indexOf(color)).toBeGreaterThan(-1)
8
8
 
9
9
  it 'returns uncolorized spans if there are no escape codes', ->
10
- expect(stream.process("toto")[0]).toBe("toto")
10
+ span = stream.process("toto").childNodes[0]
11
+ expectClass(span, 'ansi-background-default')
12
+ expectClass(span, 'ansi-foreground-default')
11
13
 
12
14
  it 'returns colorized spans if there is an foreground color code', ->
13
- expectClass(stream.process('\u001B[31mtoto')[0], 'ansi-foreground-red')
15
+ expectClass(stream.process('\u001B[31mtoto').childNodes[0], 'ansi-foreground-red')
14
16
 
15
17
  it 'returns colorized spans if there is an background color code', ->
16
- expectClass(stream.process("\u001B[41mtoto")[0], 'ansi-background-red')
18
+ expectClass(stream.process("\u001B[41mtoto").childNodes[0], 'ansi-background-red')
17
19
 
18
20
  it 'keeps modifying the style', ->
19
- stream.process("\u001B[41mtoto")[0]
20
- span = stream.process('\u001B[31mtoto')[0]
21
+ stream.process("\u001B[41mtoto")
22
+ span = stream.process('\u001B[31mtoto').childNodes[0]
21
23
  expectClass(span, 'ansi-background-red')
22
24
  expectClass(span, 'ansi-foreground-red')
23
25
 
24
26
  it 'resets the style when encountering a marker', ->
25
27
  spans = stream.process("\u001B[41;31mtoto\u001B[0mtiti")
26
- expectClass(spans[0], 'ansi-background-red')
27
- expectClass(spans[1], 'ansi-background-default')
28
+ expectClass(spans.childNodes[0], 'ansi-background-red')
29
+ expectClass(spans.childNodes[1], 'ansi-background-default')
28
30
 
29
31
  it 'makes the text bright', ->
30
- expectClass(stream.process("\u001B[1mtoto")[0], 'ansi-bright')
32
+ expectClass(stream.process("\u001B[1mtoto").childNodes[0], 'ansi-bright')
31
33
 
32
34
  it 'handles underline', ->
33
35
  spans = stream.process("\u001B[4mtoto\u001B[24mtiti")
34
- expectClass(spans[0], 'ansi-underline')
35
- expect(spans[1].indexOf('ansi-underline')).toBe(-1)
36
+ expectClass(spans.childNodes[0], 'ansi-underline')
37
+ expect(spans.childNodes[1].className.indexOf('ansi-underline')).toBe(-1)
36
38
 
@@ -11,7 +11,7 @@
11
11
  # - dist/**/*.js
12
12
  #
13
13
  src_files:
14
- - vendor/**/*.js
14
+ - '*.js'
15
15
 
16
16
  # stylesheets
17
17
  #
@@ -62,7 +62,7 @@ spec_files:
62
62
  #
63
63
  # src_dir: public
64
64
  #
65
- src_dir:
65
+ src_dir: tmp/assets
66
66
 
67
67
  # spec_dir
68
68
  #
@@ -73,7 +73,7 @@ src_dir:
73
73
  #
74
74
  # spec_dir: spec/javascripts
75
75
  #
76
- spec_dir:
76
+ spec_dir: tmp/spec
77
77
 
78
78
  # spec_helper
79
79
  #
@@ -1,4 +1,4 @@
1
- class AnsiStream
1
+ class @AnsiStream
2
2
  constructor: ->
3
3
  @style = new AnsiStyle()
4
4
  @span = new AnsiSpan()
@@ -7,13 +7,12 @@ class AnsiStream
7
7
  parts = text.split(/\033\[/)
8
8
  parts = parts.filter (part) -> part
9
9
 
10
- spans = for part in parts
10
+ spans = document.createDocumentFragment()
11
+ for part in parts
11
12
  [partText, styles] = @_extractTextAndStyles(part)
12
- if styles
13
- @style.apply(styles)
14
- @span.create(partText, @style)
15
- else
16
- partText
13
+ @style.apply(styles)
14
+ span = @span.create(partText, @style)
15
+ spans.appendChild(span)
17
16
 
18
17
  spans
19
18
 
@@ -79,17 +78,8 @@ class AnsiStyle
79
78
  this[layer] = COLORS[number % 10]
80
79
 
81
80
  class AnsiSpan
82
- ENTITIES =
83
- '&': '&'
84
- '<': '&lt;'
85
- '>': '&gt;'
86
- "'": '&#x27;'
87
-
88
- ESCAPE_PATTERN = new RegExp("[#{(Object.keys(ENTITIES).join(''))}]", 'g');
89
-
90
81
  create: (text, style) ->
91
- "<span class='#{style.toClass()}'>#{@_escapeHTML(text)}</span>"
92
-
93
- _escapeHTML: (text) ->
94
- text.replace ESCAPE_PATTERN, (char) ->
95
- ENTITIES[char]
82
+ span = document.createElement('span')
83
+ span.innerHTML = text
84
+ span.className = style.toClass()
85
+ span
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ansi_stream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guillaume Malette
@@ -100,8 +100,7 @@ files:
100
100
  - spec/javascripts/helpers/.gitkeep
101
101
  - spec/javascripts/support/jasmine.yml
102
102
  - spec/javascripts/support/jasmine_helper.rb
103
- - src/javascripts/ansi_stream.coffee
104
- - vendor/assets/javascripts/ansi_stream.js
103
+ - vendor/assets/javascripts/ansi_stream.coffee
105
104
  - vendor/assets/stylesheets/ansi_stream.css
106
105
  homepage: ''
107
106
  licenses:
@@ -1,152 +0,0 @@
1
- var AnsiSpan, AnsiStream, AnsiStyle;
2
-
3
- AnsiStream = (function() {
4
- function AnsiStream() {
5
- this.style = new AnsiStyle();
6
- this.span = new AnsiSpan();
7
- }
8
-
9
- AnsiStream.prototype.process = function(text) {
10
- var part, partText, parts, spans, styles;
11
- parts = text.split(/\033\[/);
12
- parts = parts.filter(function(part) {
13
- return part;
14
- });
15
- spans = (function() {
16
- var _i, _len, _ref, _results;
17
- _results = [];
18
- for (_i = 0, _len = parts.length; _i < _len; _i++) {
19
- part = parts[_i];
20
- _ref = this._extractTextAndStyles(part), partText = _ref[0], styles = _ref[1];
21
- if (styles) {
22
- this.style.apply(styles);
23
- _results.push(this.span.create(partText, this.style));
24
- } else {
25
- _results.push(partText);
26
- }
27
- }
28
- return _results;
29
- }).call(this);
30
- return spans;
31
- };
32
-
33
- AnsiStream.prototype._extractTextAndStyles = function(originalText) {
34
- var matches, numbers, text, _ref;
35
- matches = originalText.match(/^([\d;]*)m([^]*)$/m);
36
- if (!matches) {
37
- return [originalText, null];
38
- }
39
- _ref = matches, matches = _ref[0], numbers = _ref[1], text = _ref[2];
40
- return [text, numbers.split(";")];
41
- };
42
-
43
- return AnsiStream;
44
-
45
- })();
46
-
47
- AnsiStyle = (function() {
48
- var COLORS;
49
-
50
- COLORS = {
51
- 0: 'black',
52
- 1: 'red',
53
- 2: 'green',
54
- 3: 'yellow',
55
- 4: 'blue',
56
- 5: 'magenta',
57
- 6: 'cyan',
58
- 7: 'white',
59
- 8: null,
60
- 9: 'default'
61
- };
62
-
63
- function AnsiStyle() {
64
- this.reset();
65
- }
66
-
67
- AnsiStyle.prototype.apply = function(newStyles) {
68
- var style, _i, _len, _results;
69
- if (!newStyles) {
70
- return;
71
- }
72
- _results = [];
73
- for (_i = 0, _len = newStyles.length; _i < _len; _i++) {
74
- style = newStyles[_i];
75
- style = parseInt(style);
76
- if (style === 0) {
77
- _results.push(this.reset());
78
- } else if (style === 1) {
79
- _results.push(this.bright = true);
80
- } else if ((30 <= style && style <= 39) && style !== 38) {
81
- _results.push(this._applyStyle('foreground', style));
82
- } else if ((40 <= style && style <= 49) && style !== 48) {
83
- _results.push(this._applyStyle('background', style));
84
- } else if (style === 4) {
85
- _results.push(this.underline = true);
86
- } else if (style === 24) {
87
- _results.push(this.underline = false);
88
- } else {
89
- _results.push(void 0);
90
- }
91
- }
92
- return _results;
93
- };
94
-
95
- AnsiStyle.prototype.reset = function() {
96
- this.background = this.foreground = 'default';
97
- return this.underline = this.bright = false;
98
- };
99
-
100
- AnsiStyle.prototype.toClass = function() {
101
- var classes;
102
- classes = [];
103
- if (this.background) {
104
- classes.push("ansi-background-" + this.background);
105
- }
106
- if (this.foreground) {
107
- classes.push("ansi-foreground-" + this.foreground);
108
- }
109
- if (this.bright) {
110
- classes.push("ansi-bright");
111
- }
112
- if (this.underline) {
113
- classes.push("ansi-underline");
114
- }
115
- return classes.join(" ");
116
- };
117
-
118
- AnsiStyle.prototype._applyStyle = function(layer, number) {
119
- return this[layer] = COLORS[number % 10];
120
- };
121
-
122
- return AnsiStyle;
123
-
124
- })();
125
-
126
- AnsiSpan = (function() {
127
- var ENTITIES, ESCAPE_PATTERN;
128
-
129
- function AnsiSpan() {}
130
-
131
- ENTITIES = {
132
- '&': '&amp;',
133
- '<': '&lt;',
134
- '>': '&gt;',
135
- "'": '&#x27;'
136
- };
137
-
138
- ESCAPE_PATTERN = new RegExp("[" + (Object.keys(ENTITIES).join('')) + "]", 'g');
139
-
140
- AnsiSpan.prototype.create = function(text, style) {
141
- return "<span class='" + (style.toClass()) + "'>" + (this._escapeHTML(text)) + "</span>";
142
- };
143
-
144
- AnsiSpan.prototype._escapeHTML = function(text) {
145
- return text.replace(ESCAPE_PATTERN, function(char) {
146
- return ENTITIES[char];
147
- });
148
- };
149
-
150
- return AnsiSpan;
151
-
152
- })();