inkjet 0.0.2 → 0.0.3

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: a4af8afe6467c85adc6846dad80f5358ae21af5a
4
- data.tar.gz: c85db1efd92d913881477a74f08bea7e4afaca06
3
+ metadata.gz: 834476aeabcd5ab348125c5fb525db4859ee4dfa
4
+ data.tar.gz: a6f6b0b36d1a46213858d02febd83774bfd7b14c
5
5
  SHA512:
6
- metadata.gz: 2e04395528ab2ac80135d801afb883c9d2df2d950d8dd99716bce72c816bc17b4cdc412fc1157dc75c20521695a4bcaa79a60179b127cda9cdaf80e2ee45a234
7
- data.tar.gz: 3e65522f8da9e88f79cad5d568ea9ba061d6b36e01e9b8cddab01f739717b16c0751fbaacc7d35e314c4962bc967f8fd9a664f55f14cf7cbd68e028ebc126745
6
+ metadata.gz: daf70655f31d52f49a3f29d7d0487d4824ab8eede474c7044a80b38ab58d61fc8ae589850e9584d0a36de9ee1326be9f4c747de134a2d1e42186c6dc17636e72
7
+ data.tar.gz: 6024564d3bea03575d45bd7e00aeb1de9d172453385c775357c31cfcb8500e1128236e6dd4bb7a4e709a518c2fba462699df62d37bc2f9a98d0a21d0ab6c84fd
@@ -1,17 +1,13 @@
1
1
  require 'active_support/inflector'
2
2
  require 'inkjet/string'
3
3
  require 'inkjet/colors'
4
+ require 'inkjet/styles'
4
5
  require 'inkjet/indent'
5
6
 
6
7
  module Inkjet
7
8
  Close = 0
8
- Bold = 1
9
- Dim = 2
10
- Underline = 4
11
- Blink = 5
12
- Invert = 7
13
- Hidden = 8
14
9
  include Colors::Formatters
10
+ include Styles::Formatters
15
11
 
16
12
  def self.escape(code)
17
13
  "\e[#{code.to_s.chomp('m')}m"
@@ -1,29 +1,59 @@
1
1
  module Inkjet
2
2
  module Indent
3
3
  TABSTOP = 2 # TODO set based on config
4
+
5
+ class Formatter
6
+ def call_on(str)
7
+ str.send @meth, *@args
8
+ end
9
+
10
+ protected
11
+
12
+ def initialize(meth, *args)
13
+ @meth = meth.to_sym
14
+ @args = args
15
+ end
16
+ end
4
17
 
5
18
  def self.indent(*args, &block)
6
- @spaces ||= 0
19
+ @@spaces ||= 0
7
20
  if block_given?
8
- @spaces += args[0] || TABSTOP
21
+ @@spaces += args[0] || TABSTOP
22
+ scoped_formatters = formatters.clone
23
+
9
24
  class_eval &block
10
- @spaces -= args[0] || TABSTOP
25
+
26
+ @@formatters = scoped_formatters
27
+ @@spaces -= args[0] || TABSTOP
11
28
  else
12
29
  spaces = args[1] || TABSTOP
13
- "#{padding(@spaces + spaces.to_i)}#{args[0].to_s.split("\n").join("\n#{padding(@spaces + spaces.to_i)}")}"
30
+ "#{padding(@@spaces + spaces.to_i)}#{args[0].to_s.split("\n").join("\n#{padding(@@spaces + spaces.to_i)}")}"
14
31
  end
15
32
  end
16
33
 
34
+ def self.formatters
35
+ @@formatters ||= []
36
+ end
37
+
38
+ def self.format_with(fmeth, *fargs)
39
+ formatters.push(Formatter.new(fmeth, *fargs))
40
+ end
41
+
42
+ def self.apply_formatters(output)
43
+ formatters.each { |f| output = f.call_on(output) }
44
+ output
45
+ end
46
+
17
47
  def self.padding(spaces)
18
48
  spaces.times.map {" "}.join
19
49
  end
20
50
 
21
51
  def self.puts(output)
22
- STDOUT.puts indent(output, 0)
52
+ STDOUT.puts apply_formatters(indent(output))#indent(output, 0)
23
53
  end
24
54
 
25
55
  def self.print(output)
26
- STDOUT.print indent(output, 0)
56
+ STDOUT.print apply_formatters(indent(output))#indent(output, 0)
27
57
  end
28
58
 
29
59
  module String
@@ -1,52 +1,94 @@
1
1
  module Inkjet
2
- module String
3
-
4
- def method_missing(meth, *args)
5
- if meth.match(/(#{%w(bold dim underline blink invert hidden).join('|')})(!?)/)
6
- send "apply_inkjet_code#{$2}", "Inkjet::#{meth.capitalize}".constantize, *args
7
- else
8
- super
9
- end
2
+ class Substring
3
+ attr_accessor :pre, :codes, :string, :post
4
+
5
+ def push(code)
6
+ codes.push(code)
7
+ self
10
8
  end
11
9
 
12
- def clean
13
- clone.clean!
10
+ def unshift(code)
11
+ codes.unshift(code)
12
+ self
14
13
  end
15
14
 
15
+ def formattable?(chunk)
16
+ !chunk.nil? && !chunk.empty? #&& !chunk.match(/\A[\r\n]+\Z/)
17
+ end
18
+
19
+ # Formats a chunk of the substring
20
+ #
21
+ # If no codes are provided, or the chunk is empty, it si not formatted
22
+ def format_chunk(chunk, codes)
23
+ codes = [codes].flatten
24
+ return chunk if !formattable?(chunk) || (codes.nil? || codes.empty?)
25
+ "\e[#{codes.join(";")}m#{chunk}\e[#{Inkjet::Close}m"
26
+ end
27
+
28
+ # Format the string by applying the proper codes to various chunks of the string.
29
+ #
30
+ # The primary string is formatted with this object's @codes
31
+ #
32
+ # If a super_code is provided, it is used to format the superstring (pre/post) chunks,
33
+ # otherwise they are left unformatted.
34
+ def format(super_code=nil)
35
+ format_chunk(pre, super_code) +
36
+ format_chunk(string, codes) +
37
+ format_chunk(post, super_code)
38
+ end
39
+
40
+ private
41
+
42
+ def initialize(pre, codes, string, post)
43
+ @pre = pre
44
+ @codes = codes
45
+ @string = string
46
+ @post = post
47
+ end
48
+ end
49
+
50
+ module String
51
+
52
+ # Clean out all escape codes from the formatted string
16
53
  def clean!
17
54
  gsub!(/\e\[[\d;]+m/, '')
18
55
  end
19
-
20
- def apply_inkjet_code(code, wrap=false)
21
- clone.apply_inkjet_code!(code, wrap)
56
+
57
+ def clean
58
+ clone.clean!
22
59
  end
23
60
 
61
+ # Apply a formatting code to the appropriate chunks in the string.
62
+ #
63
+ # If forcing a wrap, all chunks within the string get formatted with the new code, regardless of whether they were previously formatted
64
+ #
65
+ # If there are codes applied to the first chunk of the string, apply the new code to all previously formatted chunks with matching codes
66
+ #
67
+ # If the first chunk of the string is unformatted, apply the new code to all unformatted chunks
68
+ #
69
+ # If the string is completely unformatted, enclose self within the provided code
24
70
  def apply_inkjet_code!(code, wrap=false)
25
- if inkjet_strings.length > 0
26
- replace(inkjet_strings.map do |istr|
71
+ if inkjet_substrings.length > 0
72
+
73
+ replace(inkjet_substrings.map do |substr|
27
74
  if wrap # apply the code to every chunk within the string, formatted or unformatted
28
-
29
- (istr[0].empty? ? "" : apply_inkjet_codes_to_substring([code], istr[0])) +
30
- apply_inkjet_codes_to_substring(istr[1].push(code), istr[2]) +
31
- (istr[3].empty? ? "" : apply_inkjet_codes_to_substring([code], istr[3]))
32
-
33
- elsif !inkjet_codes.empty? && istr[1] == inkjet_codes # apply the code only to the formatted chunks of the 'primary string'
34
-
35
- istr[0] + apply_inkjet_codes_to_substring(istr[1].push(code), istr[2]) + istr[3]
36
-
37
- else # apply the code only to the unformatted chunks of the 'primary string' leaving any formatted substrings untouched
38
-
39
- (istr[0].empty? ? "" : apply_inkjet_codes_to_substring([code], istr[0])) +
40
- apply_inkjet_codes_to_substring(istr[1], istr[2]) +
41
- (istr[3].empty? ? "" : apply_inkjet_codes_to_substring([code], istr[3]))
42
-
75
+ substr.push(code).format(code)
76
+ elsif !inkjet_codes.empty? && substr.codes == inkjet_codes # apply the code only to formatted chunks with matching codes
77
+ substr.push(code).format
78
+ else # apply the code only to the unformatted chunks
79
+ substr.format(code)
43
80
  end
44
- end.join(""))
45
- else # wrap the entire unformatted string w/ the code
81
+ end.join)
82
+
83
+ else # enclose the entire unformatted string w/ the code
46
84
  replace("\e[#{code}m#{self}\e[#{Inkjet::Close}m")
47
85
  end
48
86
  end
49
87
 
88
+ def apply_inkjet_code(code, wrap=false)
89
+ clone.apply_inkjet_code!(code, wrap)
90
+ end
91
+
50
92
  def apply_inkjet_codes(codes, wrap=false)
51
93
  cloned = clone
52
94
  codes.each { |code| cloned.apply_inkjet_code!(code, wrap) }
@@ -60,19 +102,21 @@ module Inkjet
60
102
 
61
103
  protected
62
104
 
63
- # return the first set of escape codes found in the string if no pre-string
105
+ # Return the first set of escape codes found in the string if no pre-string.
106
+ #
107
+ # This determines whether the main chunks of the string are already formatted or not,
108
+ # and helps decide whether multiple chunks of a string should be formatted when not
109
+ # forcing everything to be wrapped.
64
110
  def inkjet_codes
65
- inkjet_strings.first[0].empty? ? inkjet_strings.first[1] : []
111
+ inkjet_substrings.first.pre.empty? ? inkjet_substrings.first.codes : []
66
112
  rescue
67
113
  []
68
114
  end
69
115
 
70
- def inkjet_strings
71
- scan(/([^\e]*)\e\[([\d;]+)m([^\e]*)\e\[#{Inkjet::Close}m([^\e]*)/).map { |pre,codes,str,post| [pre, codes.split(";"), str, post] } # TODO make a class for these
72
- end
73
-
74
- def apply_inkjet_codes_to_substring(codes, substr)
75
- "\e[#{codes.join(";")}m#{substr}\e[#{Inkjet::Close}m"
116
+ # Scan the string for formatted chunks and their surrounding unformatted chunks and
117
+ # return an array of Inkjet::Substring objects.
118
+ def inkjet_substrings
119
+ scan(/([^\e]*)\e\[([\d;]+)m([^\e]*)\e\[#{Inkjet::Close}m([^\e]*)/).map { |pre,codes,str,post| Inkjet::Substring.new(pre, codes.split(";"), str, post) }
76
120
  end
77
121
 
78
122
  end
@@ -0,0 +1,50 @@
1
+ module Inkjet
2
+ module Styles
3
+ Styles = %w(bold dim underline blink invert hidden)
4
+ Bold = 1
5
+ Dim = 2
6
+ Underline = 4
7
+ Blink = 5
8
+ Invert = 7
9
+ Hidden = 8
10
+
11
+ def self.style(style)
12
+ "Inkjet::Styles::#{style.capitalize}".constantize rescue raise("Style does not exist: '#{style}'")
13
+ end
14
+
15
+ module Formatters
16
+ def self.included(base)
17
+ base.send :extend, self
18
+ end
19
+
20
+ def stylize(style, str, wrap=false)
21
+ stylize!(style, str.clone, wrap)
22
+ end
23
+
24
+ def stylize!(style, str, wrap=false)
25
+ str.apply_inkjet_code!(Inkjet::Styles.style(style), wrap)
26
+ end
27
+
28
+ def method_missing(meth, *args)
29
+ if meth.match(/\A(#{Inkjet::Styles::Styles.join("|")})(!?)\Z/)
30
+ stylize($1, *args)
31
+ else
32
+ super(meth, *args)
33
+ end
34
+ end
35
+ end
36
+
37
+ module String
38
+ def method_missing(meth, *args)
39
+ if meth.match(/\A(#{Inkjet::Styles::Styles.join("|")})(!?)\Z/)
40
+ Inkjet.send("stylize#{$2}", $1, self, *args)
41
+ else
42
+ super(meth, *args)
43
+ end
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+
50
+ String.send :include, Inkjet::Styles::String
@@ -1,3 +1,3 @@
1
1
  module Inkjet
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inkjet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rebec
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-09 00:00:00.000000000 Z
11
+ date: 2013-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -46,6 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - lib/inkjet/string.rb
49
+ - lib/inkjet/styles.rb
49
50
  - lib/inkjet/indent.rb
50
51
  - lib/inkjet/configuration.rb
51
52
  - lib/inkjet/colors.rb