elipsa 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6601d104f56f3358b82a1c5b5065bebbb26d64c7
4
+ data.tar.gz: f87478c90746393a7ac5db65e0107afbf1eee2bc
5
+ SHA512:
6
+ metadata.gz: c2b58bd5d80a23fc94f17109e123dc258f249b4b15d730b14e94f7bdb54da8ddf951502d625408b283ef8bd57557b0ef234ec27c26cf73ade09c5d43fd83a2b6
7
+ data.tar.gz: 3fb2bd550af5215f251da8496f40faa92c38fcd3de31c08729dbec43612730bb7cd8fd16a1faad25be6e62135341ce20f4765e89636c07f696c3e2d75ce7ead5
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,9 @@
1
+ ---
2
+ language: ruby
3
+ script: "bundle exec rake spec"
4
+
5
+ rvm:
6
+ - 1.9.3
7
+ - 2.0.0
8
+ - jruby-19mode
9
+ - rbx
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ source 'https://rubygems.org'
3
+
4
+ platforms :rbx do
5
+ # These are the transitive
6
+ # ruby standard library dependencies
7
+ gem 'rubysl-singleton'
8
+
9
+ # This gem has no direct rubysl dependencies
10
+ end
11
+
12
+ # Specify your gem's dependencies in elipsa.gemspec
13
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ryan Biesemeyer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,99 @@
1
+ # Elipsa
2
+
3
+ Elipsa is a tool for conditionally and smartly truncating a string to a
4
+ specific length. It pays attention to word-boundaries, and tries to give
5
+ you as much of the string as it can, while still fitting your parameters.
6
+
7
+ The name of this gem is derived from the Serbo-Croatian [`елипса`][elipsa],
8
+ which can be translated directly to English `ellipsis`.
9
+
10
+ [elipsa]: http://en.wiktionary.org/wiki/elipsa
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'elipsa'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install elipsa
25
+
26
+ ## Usage
27
+
28
+ ~~~ ruby
29
+ require 'elipsa'
30
+ extend Elipsa # (note: `self` is `main`)
31
+
32
+ # it leaves short strings alone
33
+ elipsa("a short string", length: 20)
34
+ # => "a short string"
35
+
36
+ # and breaks at word-boundaries when it can
37
+ elipsa("a longer string that goes over the limit", length: 20)
38
+ # => "a longer string..."
39
+
40
+ # but never truncates too much
41
+ elipsa("supercalifragilisticexpialidocious", length: 20)
42
+ # => "supercalifragilis..."
43
+
44
+ # and it never chops when it doesn't need to.
45
+ elipsa("nineteen characters", length: 20)
46
+ # => "nineteen characters"
47
+ ~~~
48
+
49
+ ## Advanced Usage
50
+
51
+ ### Length
52
+
53
+ The `:length` parameter is optional and defaults to 80 characters.
54
+
55
+ ~~~ ruby
56
+ elipsa(lorem_ipsum)
57
+ # => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mattis semper..."
58
+
59
+ elipsa(lorem_ipsum, length: 25)
60
+ # => "Lorem ipsum dolor sit..."
61
+ ~~~
62
+
63
+ ### Symbol
64
+
65
+ The `:symbol` parameter is optional and defaults to the three-character
66
+ sequence `...`.
67
+
68
+ ~~~ ruby
69
+ elipsa(lorem_ipsum, length: 20)
70
+ # => "Lorem ipsum..."
71
+
72
+ elipsa(lorem_ipsum, symbol: '…', length: 20)
73
+ # => "Lorem ipsum dolor…"
74
+ ~~~
75
+
76
+ ### Ratio
77
+
78
+ The `:ratio` parameter is option and defaults to the rational `7/8`. This
79
+ parameter helps elipsa know when to abandon word-boundary splitting and just
80
+ show as much as possible. If `word-split-length`:`desired-length` ratio
81
+ falls below the `:ratio`, word-split is not used.
82
+
83
+ ~~~ ruby
84
+ # without ratio support, too much could get truncated when there is no
85
+ # word boundary near the desired length.
86
+ elipsa("the word is supercalifragilisticexpialidocious", length: 40, ratio: 0)
87
+ # => "the word is..."
88
+
89
+ elipsa("merge branch feature/ISSUE-12345/fix-important-issue", length: 40)
90
+ # => "the word is supercalifragilisticexpia..."
91
+ ~~~
92
+
93
+ ## Contributing
94
+
95
+ 1. Fork it
96
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
97
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
98
+ 4. Push to the branch (`git push origin my-new-feature`)
99
+ 5. Create new Pull Request
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.pattern = FileList['spec/**/*_spec.rb']
7
+ spec.verbose = true
8
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'elipsa/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'elipsa'
8
+ spec.version = Elipsa::VERSION
9
+ spec.authors = ['Ryan Biesemeyer']
10
+ spec.email = ['ryan@yaauie.com']
11
+ spec.summary = 'Smart string truncation'
12
+ spec.description = <<-EODESC
13
+ Elipsa is a tool for conditionally and smartly truncating a string to a
14
+ specific length. It pays attention to word-boundaries, and tries to give
15
+ you as much of the string as it can, while still fitting your parameters.
16
+ EODESC
17
+ spec.homepage = 'https://github.com/yaauie/elipsa'
18
+ spec.license = 'MIT'
19
+
20
+ spec.files = `git ls-files`.split($/)
21
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.3'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec', '~> 2.14'
28
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'elipsa/version'
4
+
5
+ module Elipsa
6
+ extend self
7
+
8
+ # @param str [String]
9
+ # @param options [Hash{Symbol=>Object}]
10
+ # @option options [Integer] :length (80)
11
+ # The maximum length of the result string,
12
+ # including an ellipsis if present.
13
+ # @option options [String] :symbol ('...')
14
+ # The string to use as an ellipsis symbol
15
+ # @option options [Numeric] :ratio (7/8)
16
+ # The ratio of available space that the
17
+ # resulting string must fill, if truncated.
18
+ # This ensures that if a word-boundary is
19
+ # not found close enough to your length
20
+ # to make the result meaningful, the string
21
+ # is broken mid-word instead.
22
+ def elipsa(str, options = {})
23
+ max_length = options.fetch(:length) { 80 }
24
+ return str if str.length <= max_length
25
+
26
+ symbol = options.fetch(:symbol) { '...' }
27
+ available = max_length - symbol.length
28
+ ratio = options.fetch(:ratio) { Rational(7, 8) }
29
+
30
+ substr = str[/\A(.{0,#{available}})(?=\b\W+)/mu] || ''
31
+
32
+ if Rational(substr.length, available) < ratio
33
+ substr = str[0...available]
34
+ end
35
+
36
+ "#{substr}#{symbol}"
37
+ end
38
+
39
+ # Extend into a String, or
40
+ # if you're feeling ambitious,
41
+ # include globally into String
42
+ module String
43
+ # Passes self as first argument to Elipsa::elipsa
44
+ # @see Elipsa::elipsa
45
+ def elipsa(options = {})
46
+ Elipsa::elipsa(self, options)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module Elipsa
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+
3
+ require 'elipsa'
4
+
5
+ shared_examples_for :elipsa do
6
+ subject { return_value }
7
+ its(:length) { should be <= length }
8
+ it { should eq expected }
9
+ end
10
+
11
+ describe Elipsa do
12
+ context '#elipsa' do
13
+ let(:length) { 20 }
14
+ let(:params) { {length: length} }
15
+ let(:return_value) { Elipsa::elipsa(input, params)}
16
+
17
+ context 'a short string' do
18
+ let(:input) { 'a short string' }
19
+ let(:expected) { input }
20
+
21
+ it_should_behave_like :elipsa
22
+ end
23
+
24
+ context 'word-boundary' do
25
+ let(:input) { 'a longer string that goes over the limit' }
26
+ let(:expected) { 'a longer string...' }
27
+
28
+ it_should_behave_like :elipsa
29
+ end
30
+
31
+ context 'mid-large-word' do
32
+ let(:input) { 'supercalifragilisticexpialidocious' }
33
+ let(:expected) { 'supercalifragilis...' }
34
+
35
+ it_should_behave_like :elipsa
36
+ end
37
+
38
+ context 'exact length' do
39
+ let(:input) { 'at twenty characters' }
40
+ let(:expected) { input }
41
+
42
+ it_should_behave_like :elipsa
43
+ end
44
+
45
+ context 'one less' do
46
+ let(:input) { 'nineteen characters' }
47
+ let(:expected) { input }
48
+
49
+ it_should_behave_like :elipsa
50
+ end
51
+
52
+ context 'trim punctuation' do
53
+ let(:input) { 'Let\'s go fly a kite, up to the highest height' }
54
+ # ^ this comma should not be included
55
+ let(:length) { 24 }
56
+ let(:expected) { 'Let\'s go fly a kite...' }
57
+
58
+ it_should_behave_like :elipsa
59
+ end
60
+
61
+ context 'alternate symbol' do
62
+ before(:each) { params.merge!(symbol: '…') }
63
+
64
+ let(:input) { 'lorem ipsum dolor sit' }
65
+ # with default symbol '...', this would be 'lorem ipsum...'
66
+ let(:expected) { 'lorem ipsum dolor…' }
67
+
68
+ it_should_behave_like :elipsa
69
+ end
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elipsa
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Biesemeyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2013-12-20 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ prerelease: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: "1.3"
22
+ type: :development
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: rake
26
+ prerelease: false
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - &id004
30
+ - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id002
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec
37
+ prerelease: false
38
+ requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: "2.14"
43
+ type: :development
44
+ version_requirements: *id003
45
+ description: " Elipsa is a tool for conditionally and smartly truncating a string to a\n specific length. It pays attention to word-boundaries, and tries to give\n you as much of the string as it can, while still fitting your parameters.\n"
46
+ email:
47
+ - ryan@yaauie.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files: []
53
+
54
+ files:
55
+ - .gitignore
56
+ - .travis.yml
57
+ - Gemfile
58
+ - LICENSE.txt
59
+ - README.md
60
+ - Rakefile
61
+ - elipsa.gemspec
62
+ - lib/elipsa.rb
63
+ - lib/elipsa/version.rb
64
+ - spec/elipsa_spec.rb
65
+ homepage: https://github.com/yaauie/elipsa
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+
70
+ post_install_message:
71
+ rdoc_options: []
72
+
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - *id004
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - *id004
81
+ requirements: []
82
+
83
+ rubyforge_project:
84
+ rubygems_version: 2.1.10
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: Smart string truncation
88
+ test_files:
89
+ - spec/elipsa_spec.rb