verse 0.2.1 → 0.3.0

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: 8bcfae40dd0a5d6e2cfe144f7ea30d7e7ee9519b
4
- data.tar.gz: 0b661d9f8b3850dae81afbd029eb0cd9082ab369
3
+ metadata.gz: 7531f5a29482d44a943c00b361f49e6673bdd9c7
4
+ data.tar.gz: 1bc1d1680d157e66faf7a44ba9c3ed0a804e7828
5
5
  SHA512:
6
- metadata.gz: c48ef20fbcc3013a71f92059007022d1c37a7be054710af812540e2fbb3ed5bb73b05b966eb96cf9d58fa8473ff7bc1cf3467b3b8d2aabf0df230b2dcdd3162d
7
- data.tar.gz: 077b69e6bad26f16c461ae1f9b903cec2789f5c6f0c15c9005b2854f24c017cf3aa637c1055729d1cc2c0b570796f17ca9316cefcb7977ef1d9797af5e1fde7b
6
+ metadata.gz: 5348385613bff73636e6b5993ebcafbba3ce1093a0b15e01c7c089248b61c09175c1793c0af5e8fdf482b2c149a0e9d6ea5b3d190c4246c689d5deba220b0d8a
7
+ data.tar.gz: f1605d77c8ffaf24695739ca4df6bb646834b0ccfd3c2b3a51641cd0a48ab1729fafb57a079bc08a86522ace2f3c419991f1ee44c9826fbbcb1a2ea7899ce4f7
@@ -1,3 +1,10 @@
1
+ 0.3.0 (Feb 28, 2015)
2
+
3
+ * Add Sanitizer#replace for substitutiong linebreaks
4
+ * Add Padder for parsing padding values
5
+ * Add Padding for padding content around
6
+ * Change Wrapping#wrap to preserve whitespace characters
7
+
1
8
  0.2.1 (Feb 15, 2015)
2
9
 
3
10
  * Fix empty string alignment
data/README.md CHANGED
@@ -16,6 +16,7 @@
16
16
  ## Features
17
17
 
18
18
  * No monkey-patching String class
19
+ * Simple API that can be easily wrapped by other objects
19
20
  * Supports multibyte character encodings such as UTF-8, EUC-JP
20
21
  * Handles languages without whitespaces between words (like Chinese and Japanese)
21
22
 
@@ -43,8 +44,10 @@ $ gem install verse
43
44
 
44
45
  * [1. Usage](#1-usage)
45
46
  * [1.1 Align](#11-align)
46
- * [1.2 Truncate](#12-truncate)
47
- * [1.3 Wrap](#13-wrap)
47
+ * [1.2 Pad](#12-pad)
48
+ * [1.3 Replace](#13-replace)
49
+ * [1.4 Truncate](#14-truncate)
50
+ * [1.5 Wrap](#15-wrap)
48
51
 
49
52
  ## 1 Usage
50
53
 
@@ -84,7 +87,68 @@ alignment.center(20) # =>
84
87
  " 場にも含み "
85
88
  ```
86
89
 
87
- ### 1.2 Truncate
90
+ ### 1.2 Pad
91
+
92
+ **Verse::Padding** provides facility to pad around text with a given padding.
93
+
94
+ The padding value needs to be one of the following values corresponding with CSS padding property:
95
+
96
+ ```ruby
97
+ [1,1,1,1] # => pad text left & right with 1 character and add 1 line above & below
98
+ [1,1] # => as above
99
+ 1 # => as above
100
+ ```
101
+
102
+ You can pad around a single line of text with `pad` method like so:
103
+
104
+ ```ruby
105
+ padding = Verse::Padding.new("Ignorance is the parent of fear.")
106
+
107
+ padding.pad([1,1,1,1]) # =>
108
+ " \n" +
109
+ " Ignorance is the parent of fear. \n" +
110
+ " "
111
+ ```
112
+
113
+ In addition, you can `pad` multiline content:
114
+
115
+ ```ruby
116
+ padding = Verse::Padding.new "It is the easiest thing\n" +
117
+ "in the world for a man\n" +
118
+ "to look as if he had \n" +
119
+ "a great secret in him."
120
+
121
+ padding.pad([1,1,1,1]) # =>
122
+ " \n" +
123
+ " It is the easiest thing \n" +
124
+ " in the world for a man \n" +
125
+ " to look as if he had \n" +
126
+ " a great secret in him. \n" +
127
+ " "
128
+ ```
129
+
130
+ You can also specify `UTF-8` text as well:
131
+
132
+ ```ruby
133
+ padding = Verse::Padding.new "ラドクリフ、マラソン"
134
+
135
+ padding.pad([1,1,1,1]) # =>
136
+ " \n" +
137
+ " ラドクリフ、マラソン \n" +
138
+ " "
139
+ ```
140
+
141
+ ### 1.3 Replace
142
+
143
+ **Verse::Sanitizer** provides ability to sanitize text with unwanted characters. Given a text with line break characters, `replace` will remove or substitute all occurances of line breaks depending on surrounding context.
144
+
145
+ ```ruby
146
+ sanitizer = Verse::Sanitizer.new
147
+ sanitizer.replace("It is not down on any map;\r\n true places never are.")
148
+ # => "It is not down on any map; true places never are."
149
+ ```
150
+
151
+ ### 1.4 Truncate
88
152
 
89
153
  Using **Verse::Truncation** you can truncate a given text after a given length.
90
154
 
@@ -114,7 +178,7 @@ truncation = Verse::Truncation.new 'ラドクリフ、マラソン五輪代表
114
178
  truncation.truncate(12) # => "ラドクリフ…"
115
179
  ```
116
180
 
117
- ### 1.3 Wrap
181
+ ### 1.5 Wrap
118
182
 
119
183
  **Verse::Wrapping** allows you to wrap text into lines no longer than `wrap_at` argument length. The `wrap` method will break either on whitespace character or in case of east Asian characters on character boundaries.
120
184
 
@@ -4,6 +4,8 @@ require 'unicode_utils/display_width'
4
4
  require 'unicode_utils/each_grapheme'
5
5
 
6
6
  require 'verse/alignment'
7
+ require 'verse/padder'
8
+ require 'verse/padding'
7
9
  require 'verse/sanitizer'
8
10
  require 'verse/truncation'
9
11
  require 'verse/wrapping'
@@ -26,6 +28,15 @@ module Verse
26
28
  Alignment.align(text, width, direction, options)
27
29
  end
28
30
 
31
+ # Pad a text around with a given padding
32
+ #
33
+ # @see Verse::Padding#pad
34
+ #
35
+ # @api public
36
+ def self.pad(text, padding, options = {})
37
+ Padding.pad(text, padding, options)
38
+ end
39
+
29
40
  # Truncate a text at a given length
30
41
  #
31
42
  # @see Verse::Truncation#truncate
@@ -0,0 +1,176 @@
1
+ # coding: utf-8
2
+
3
+ module Verse
4
+ # A class responsible for parsing padding value
5
+ #
6
+ # Used internally by {Verse::Padding}
7
+ #
8
+ # @api private
9
+ class Padder
10
+ # Padding
11
+ #
12
+ # @return [Array[Integer]]
13
+ attr_reader :padding
14
+
15
+ # Initialize a Padder
16
+ #
17
+ # @api public
18
+ def initialize(padding)
19
+ @padding = padding
20
+ end
21
+
22
+ # Parse padding options
23
+ #
24
+ # Turn possible values into 4 element array
25
+ #
26
+ # @example
27
+ # padder = TTY::Table::Padder.parse(5)
28
+ # padder.padding # => [5, 5, 5, 5]
29
+ #
30
+ # @param [Object] value
31
+ #
32
+ # @return [TTY::Padder]
33
+ # the new padder with padding values
34
+ #
35
+ # @api public
36
+ def self.parse(value = nil)
37
+ return value if value.is_a?(self)
38
+
39
+ new(convert_to_ary(value))
40
+ end
41
+
42
+ # Convert value to 4 element array
43
+ #
44
+ # @return [Array[Integer]]
45
+ # the 4 element padding array
46
+ #
47
+ # @api private
48
+ def self.convert_to_ary(value)
49
+ if value.class <= Numeric
50
+ [value, value, value, value]
51
+ elsif value.nil?
52
+ []
53
+ elsif value.size == 2
54
+ [value[0], value[1], value[0], value[1]]
55
+ elsif value.size == 4
56
+ value
57
+ else
58
+ fail ArgumentError, 'Wrong :padding parameter, must be an array'
59
+ end
60
+ end
61
+
62
+ # Top padding
63
+ #
64
+ # @return [Integer]
65
+ #
66
+ # @api public
67
+ def top
68
+ @padding[0].to_i
69
+ end
70
+
71
+ # Set top padding
72
+ #
73
+ # @param [Integer] val
74
+ #
75
+ # @return [nil]
76
+ #
77
+ # @api public
78
+ def top=(value)
79
+ @padding[0] = value
80
+ end
81
+
82
+ # Right padding
83
+ #
84
+ # @return [Integer]
85
+ #
86
+ # @api public
87
+ def right
88
+ @padding[1].to_i
89
+ end
90
+
91
+ # Set right padding
92
+ #
93
+ # @param [Integer] val
94
+ #
95
+ # @api public
96
+ def right=(value)
97
+ @padding[1] = value
98
+ end
99
+
100
+ # Bottom padding
101
+ #
102
+ # @return [Integer]
103
+ #
104
+ # @api public
105
+ def bottom
106
+ @padding[2].to_i
107
+ end
108
+
109
+ # Set bottom padding
110
+ #
111
+ # @param [Integer] value
112
+ #
113
+ # @return [nil]
114
+ #
115
+ # @api public
116
+ def bottom=(value)
117
+ @padding[2] = value
118
+ end
119
+
120
+ # Left padding
121
+ #
122
+ # @return [Integer]
123
+ #
124
+ # @api public
125
+ def left
126
+ @padding[3].to_i
127
+ end
128
+
129
+ # Set left padding
130
+ #
131
+ # @param [Integer] value
132
+ #
133
+ # @return [nil]
134
+ #
135
+ # @api public
136
+ def left=(value)
137
+ @padding[3] = value
138
+ end
139
+
140
+ # Check if padding is set
141
+ #
142
+ # @return [Boolean]
143
+ #
144
+ # @api public
145
+ def empty?
146
+ padding.empty?
147
+ end
148
+
149
+ # Check if vertical padding is applied
150
+ #
151
+ # @return [Boolean]
152
+ #
153
+ # @api public
154
+ def vertical?
155
+ top.nonzero? || bottom.nonzero?
156
+ end
157
+
158
+ # Check if horizontal padding is applied
159
+ #
160
+ # @return [Boolean]
161
+ #
162
+ # @api public
163
+ def horizontal?
164
+ left.nonzero? || right.nonzero?
165
+ end
166
+
167
+ # String represenation of this padder with padding values
168
+ #
169
+ # @return [String]
170
+ #
171
+ # @api public
172
+ def to_s
173
+ inspect
174
+ end
175
+ end # Padder
176
+ end # Verse
@@ -0,0 +1,94 @@
1
+ # coding: utf-8
2
+
3
+ module Verse
4
+ # A class responsible for text indentation
5
+ class Padding
6
+ # Initialize a Padding
7
+ #
8
+ # @api public
9
+ def initialize(text, options = {})
10
+ @text = text
11
+ @padding = Padder.parse(options[:padding])
12
+ end
13
+
14
+ # Pad content out
15
+ #
16
+ # @see Verse::Padding#pad
17
+ #
18
+ # @api public
19
+ def self.pad(text, padding, options)
20
+ new(text, options).pad(padding, options)
21
+ end
22
+
23
+ # Apply padding to text
24
+ #
25
+ # @param [String] text
26
+ #
27
+ # @return [String]
28
+ #
29
+ # @api private
30
+ def pad(padding = (not_set = true), options = {})
31
+ return text if @padding.empty? && not_set
32
+ if !not_set
33
+ @padding = Padder.parse(padding)
34
+ end
35
+ text_copy = text.dup
36
+ column_width = maximum_length(text)
37
+ elements = []
38
+ if @padding.top > 0
39
+ elements << (SPACE * column_width + NEWLINE) * @padding.top
40
+ end
41
+ elements << text_copy
42
+ if @padding.bottom > 0
43
+ elements << (SPACE * column_width + NEWLINE) * @padding.bottom
44
+ end
45
+ elements.map { |el| pad_multi_line(el) }.join(NEWLINE)
46
+ end
47
+
48
+ protected
49
+
50
+ # The text to pad
51
+ #
52
+ # @api private
53
+ attr_reader :text
54
+
55
+ # Apply padding to multi line text
56
+ #
57
+ # @param [String] text
58
+ #
59
+ # @return [String]
60
+ #
61
+ # @api private
62
+ def pad_multi_line(text)
63
+ text.split(NEWLINE).map { |part| pad_around(part) }
64
+ end
65
+
66
+ # Apply padding to left and right side of string
67
+ #
68
+ # @param [String] text
69
+ #
70
+ # @return [String]
71
+ #
72
+ # @api private
73
+ def pad_around(text)
74
+ text.insert(0, SPACE * @padding.left).
75
+ insert(-1, SPACE * @padding.right)
76
+ end
77
+
78
+ # Determine maximum length for all multiline content
79
+ #
80
+ # @params [String] text
81
+ #
82
+ # @return [Integer]
83
+ #
84
+ # @api private
85
+ def maximum_length(text)
86
+ lines = text.split(/\n/, -1)
87
+ display_width(lines.max_by { |line| display_width(line) } || '')
88
+ end
89
+
90
+ def display_width(string)
91
+ UnicodeUtils.display_width(string)
92
+ end
93
+ end # Padding
94
+ end # Verse
@@ -4,15 +4,36 @@ module Verse
4
4
  class Sanitizer
5
5
  ANSI_MATCHER = /(\[)?\033(\[)?[;?\d]*[\dA-Za-z](\])?/.freeze
6
6
 
7
+ LINE_BREAK = "(\r\n+|\r+|\n+|\t+)".freeze
8
+
7
9
  # Strip ANSI characters from the text
8
10
  #
9
11
  # @param [String] text
10
12
  #
11
13
  # @return [String]
12
14
  #
13
- # @api private
15
+ # @api public
14
16
  def sanitize(text)
15
17
  text.gsub(ANSI_MATCHER, '')
16
18
  end
19
+
20
+ # Replace separator with whitespace
21
+ #
22
+ # @example
23
+ # replace(" \n ") # => " "
24
+ # replace("\n") # => " "
25
+ #
26
+ # @param [String] text
27
+ #
28
+ # @param [String] separator
29
+ #
30
+ # @return [String]
31
+ #
32
+ # @api public
33
+ def replace(text, separator = LINE_BREAK)
34
+ text.gsub(/([ ]+)#{separator}/, "\\1").
35
+ gsub(/#{separator}(?<space>[ ]+)/, "\\k<space>").
36
+ gsub(/#{separator}/, ' ')
37
+ end
17
38
  end # Sanitizer
18
39
  end # Verse
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Verse
4
- VERSION = '0.2.1'
4
+ VERSION = '0.3.0'
5
5
  end # Verse
@@ -60,7 +60,7 @@ module Verse
60
60
  #
61
61
  # @api private
62
62
  def format_paragraph(paragraph, wrap_at)
63
- cleared_para = paragraph.strip.gsub(NEWLINE_RE, SPACE).squeeze(SPACE)
63
+ cleared_para = @sanitizer.replace(paragraph)
64
64
  lines = []
65
65
  line = ''
66
66
  word = ''
@@ -73,7 +73,7 @@ module Verse
73
73
  char_length = display_width(char)
74
74
  total_length += char_length
75
75
  if line_length + word_length + char_length <= wrap_at
76
- if SPACE_RE =~ char || total_length == text_length
76
+ if char == SPACE || total_length == text_length
77
77
  line << word + char
78
78
  line_length += word_length + char_length
79
79
  word = ''
@@ -85,26 +85,26 @@ module Verse
85
85
  next
86
86
  end
87
87
 
88
- if SPACE_RE =~ char # ends with space
89
- lines << line.strip
88
+ if char == SPACE # ends with space
89
+ lines << line
90
90
  line = ''
91
91
  line_length = 0
92
- word = ''
93
- word_length = 0
92
+ word = word + char
93
+ word_length = word_length + char_length
94
94
  elsif word_length + char_length <= wrap_at
95
- lines << line.strip
95
+ lines << line
96
96
  line = word + char
97
97
  line_length = word_length + char_length
98
98
  word = ''
99
99
  word_length = 0
100
100
  else # hyphenate word - too long to fit a line
101
- lines << word.strip
101
+ lines << word
102
102
  line_length = 0
103
103
  word = char
104
104
  word_length = char_length
105
105
  end
106
106
  end
107
- lines << line.strip unless line.empty?
107
+ lines << line unless line.empty?
108
108
  lines << word unless word.empty?
109
109
  lines
110
110
  end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Verse, '#pad' do
6
+ it "pads text" do
7
+ text = 'ラドクリフ、マラソン五輪代表に1万m出場にも含み'
8
+ expect(Verse.pad(text, [1,1,1,1])).to eql([
9
+ ' ',
10
+ ' ラドクリフ、マラソン五輪代表に1万m出場にも含み ',
11
+ ' '
12
+ ].join("\n"))
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Verse::Padder, 'accessors' do
6
+ subject(:padder) { described_class }
7
+
8
+ it "allows to set padding through accessors" do
9
+ instance = padder.parse([1,2,3,4])
10
+ instance.top = 5
11
+ expect(instance.padding).to eq([5,2,3,4])
12
+ end
13
+ end
14
+
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Verse::Padder, '#parse' do
6
+ subject(:padder) { described_class }
7
+
8
+ it "parses nil" do
9
+ instance = padder.parse(nil)
10
+ expect(instance.padding).to eq([])
11
+ end
12
+
13
+ it 'parses self' do
14
+ value = described_class.new([])
15
+ instance = padder.parse(value)
16
+ expect(instance.padding).to eq([])
17
+ end
18
+
19
+ it "parses digit" do
20
+ instance = padder.parse(5)
21
+ expect(instance.padding).to eq([5,5,5,5])
22
+ end
23
+
24
+ it "parses 2-element array" do
25
+ instance = padder.parse([2,3])
26
+ expect(instance.padding).to eq([2,3,2,3])
27
+ end
28
+
29
+ it "parses 4-element array" do
30
+ instance = padder.parse([1,2,3,4])
31
+ expect(instance.padding).to eq([1,2,3,4])
32
+ end
33
+
34
+ it "fails to parse unknown value" do
35
+ expect {
36
+ padder.parse(:unknown)
37
+ }.to raise_error
38
+ end
39
+ end
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Verse::Padding, '.pad' do
6
+ it "doesn't pad without padding option" do
7
+ text = "Ignorance is the parent of fear."
8
+ padding = Verse::Padding.new(text)
9
+ expect(padding.pad).to eq(text)
10
+ end
11
+
12
+ it "pads content with specific padding" do
13
+ text = "Ignorance is the parent of fear."
14
+ padding = Verse::Padding.new(text)
15
+ expect(padding.pad([1,1,1,1])).to eq([
16
+ " ",
17
+ " Ignorance is the parent of fear. ",
18
+ " ",
19
+ ].join("\n"))
20
+ end
21
+
22
+ it "pads content with global padding" do
23
+ text = "Ignorance is the parent of fear."
24
+ padding = Verse::Padding.new(text, padding: [1,1,1,1])
25
+ expect(padding.pad).to eq([
26
+ " ",
27
+ " Ignorance is the parent of fear. ",
28
+ " ",
29
+ ].join("\n"))
30
+ end
31
+
32
+ it "pads unicode content" do
33
+ text = "ラドクリフ、マラソン"
34
+ padding = Verse::Padding.new(text)
35
+ expect(padding.pad([1,1,1,1])).to eq([
36
+ " ",
37
+ " ラドクリフ、マラソン ",
38
+ " "
39
+ ].join("\n"))
40
+ end
41
+
42
+ it "pads multiline content" do
43
+ text = "It is the easiest thing\nin the world for a man\nto look as if he had \na great secret in him."
44
+ padding = Verse::Padding.new(text, padding: [1,1,1,1])
45
+ expect(padding.pad()).to eq([
46
+ " ",
47
+ " It is the easiest thing ",
48
+ " in the world for a man ",
49
+ " to look as if he had ",
50
+ " a great secret in him. ",
51
+ " ",
52
+ ].join("\n"))
53
+ end
54
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Verse::Sanitizer, '.replace' do
6
+ subject(:sanitizer) { described_class.new }
7
+
8
+ {
9
+ " \n" => ' ',
10
+ "\n " => ' ',
11
+ "\n" => ' ',
12
+ "\n\n\n" => ' ',
13
+ " \n " => ' ',
14
+ " \n \n \n" => ' '
15
+ }.each do |string, expected|
16
+ it "replaces '#{string.gsub(/\n/, '\\n')}' with whitespace" do
17
+ expect(sanitizer.replace(string)).to eq(expected)
18
+ end
19
+ end
20
+
21
+ {
22
+ " \r\n" => ' ',
23
+ "\r\n " => ' ',
24
+ "\r\n" => ' ',
25
+ " \r\n " => ' ',
26
+ }.each do |string, expected|
27
+ it "replaces '#{string.gsub(/\r\n/, '\\r\\n')}' with whitespace" do
28
+ expect(sanitizer.replace(string, "\r\n")).to eq(expected)
29
+ end
30
+ end
31
+ end
@@ -34,13 +34,13 @@ RSpec.describe Verse::Wrapping, '.wrap' do
34
34
  text = "for there is no folly of the beast of the earth which is not infinitely outdone by the madness of men "
35
35
  wrapping = Verse::Wrapping.new(text)
36
36
  expect(wrapping.wrap(16)).to eq([
37
- "for there is no",
38
- "folly of the",
39
- "beast of the",
40
- "earth which is",
41
- "not infinitely",
42
- "outdone by the",
43
- "madness of men"
37
+ "for there is no ",
38
+ "folly of the ",
39
+ "beast of the ",
40
+ "earth which is ",
41
+ "not infinitely ",
42
+ "outdone by the ",
43
+ "madness of men "
44
44
  ].join("\n"))
45
45
  end
46
46
 
@@ -55,30 +55,34 @@ RSpec.describe Verse::Wrapping, '.wrap' do
55
55
  "にも含み"
56
56
  ].join("\n"))
57
57
  end
58
+
59
+ it 'preserves whitespace' do
60
+ # text = " As for me, I am tormented"
61
+ text = " As for me, I am tormented with an everlasting itch for things remote. "
62
+ wrapping = Verse::Wrapping.new(text)
63
+ expect(wrapping.wrap(10)).to eq([
64
+ " As for ",
65
+ "me, I ",
66
+ "am ",
67
+ "tormented ",
68
+ "with an ",
69
+ "e",
70
+ "verlasting",
71
+ " itch ",
72
+ "for ",
73
+ "things ",
74
+ "remote. "
75
+ ].join("\n"))
76
+ end
58
77
  end
59
78
 
60
79
  context 'when long text' do
61
80
  it "wraps long text at 45 characters" do
62
81
  text =
63
- "What of it, if some old hunks of a sea-captain orders me to get a broom
64
- and sweep down the decks? What does that indignity amount to, weighed,
65
- I mean, in the scales of the New Testament? Do you think the archangel
66
- Gabriel thinks anything the less of me, because I promptly and
67
- respectfully obey that old hunks in that particular instance? Who ain't
68
- a slave? Tell me that. Well, then, however the old sea-captains may
69
- order me about--however they may thump and punch me about, I have the
70
- satisfaction of knowing that it is all right;
71
- "
82
+ "What of it, if some old hunks of a sea-captain orders me to get a broom and sweep down the decks? What does that indignity amount to, weighed, I mean, in the scales of the New Testament? Do you think the archangel Gabriel thinks anything the less of me, because I promptly and respectfully obey that old hunks in that particular instance? Who ain't a slave? Tell me that. Well, then, however the old sea-captains may order me about--however they may thump and punch me about, I have the satisfaction of knowing that it is all right;"
72
83
  wrapping = Verse::Wrapping.new(text)
73
84
  expect(wrapping.wrap(45)).to eq unindent <<-EOS
74
- What of it, if some old hunks of a\n sea-captain orders me to get a broom
75
- and sweep down the decks? What does that\n indignity amount to, weighed,
76
- I mean, in the scales of the New Testament?\n Do you think the archangel
77
- Gabriel thinks anything the less of me,\n because I promptly and
78
- respectfully obey that old hunks in that\nparticular instance? Who ain't
79
- a slave? Tell me that. Well, then, however\n the old sea-captains may
80
- order me about--however they may thump and\n punch me about, I have the
81
- satisfaction of knowing that it is all right;\n
85
+ What of it, if some old hunks of a \nsea-captain orders me to get a broom and \n sweep down the decks? What does that \nindignity amount to, weighed, I mean, in the \n scales of the New Testament? Do you think \nthe archangel Gabriel thinks anything the \nless of me, because I promptly and \nrespectfully obey that old hunks in that \nparticular instance? Who ain't a slave? Tell \nme that. Well, then, however the old \nsea-captains may order me about--however \nthey may thump and punch me about, I have \nthe satisfaction of knowing that it is all \nright;
82
86
  EOS
83
87
  end
84
88
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: verse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-15 00:00:00.000000000 Z
11
+ date: 2015-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: unicode_utils
@@ -57,6 +57,8 @@ files:
57
57
  - Rakefile
58
58
  - lib/verse.rb
59
59
  - lib/verse/alignment.rb
60
+ - lib/verse/padder.rb
61
+ - lib/verse/padding.rb
60
62
  - lib/verse/sanitizer.rb
61
63
  - lib/verse/truncation.rb
62
64
  - lib/verse/version.rb
@@ -66,6 +68,11 @@ files:
66
68
  - spec/unit/alignment/align_spec.rb
67
69
  - spec/unit/alignment/left_spec.rb
68
70
  - spec/unit/alignment/right_spec.rb
71
+ - spec/unit/pad_spec.rb
72
+ - spec/unit/padder/accessors_spec.rb
73
+ - spec/unit/padder/parse_spec.rb
74
+ - spec/unit/padding/pad_spec.rb
75
+ - spec/unit/sanitizer/replace_spec.rb
69
76
  - spec/unit/sanitizer/sanitize_spec.rb
70
77
  - spec/unit/truncate_spec.rb
71
78
  - spec/unit/truncation/new_spec.rb
@@ -107,6 +114,11 @@ test_files:
107
114
  - spec/unit/alignment/align_spec.rb
108
115
  - spec/unit/alignment/left_spec.rb
109
116
  - spec/unit/alignment/right_spec.rb
117
+ - spec/unit/pad_spec.rb
118
+ - spec/unit/padder/accessors_spec.rb
119
+ - spec/unit/padder/parse_spec.rb
120
+ - spec/unit/padding/pad_spec.rb
121
+ - spec/unit/sanitizer/replace_spec.rb
110
122
  - spec/unit/sanitizer/sanitize_spec.rb
111
123
  - spec/unit/truncate_spec.rb
112
124
  - spec/unit/truncation/new_spec.rb