nid_utils 1.6.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.
- data/Gemfile +4 -0
- data/README.markdown +1 -0
- data/lib/nid_utils.rb +123 -0
- data/lib/nid_utils/version.rb +3 -0
- data/nid_utils.gemspec +24 -0
- data/spec/nid_utils_spec.rb +89 -0
- data/spec/spec_helper.rb +13 -0
- metadata +140 -0
data/Gemfile
ADDED
data/README.markdown
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Nid utils is used for creating common name for tags
|
data/lib/nid_utils.rb
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module NidUtils
|
|
3
|
+
##########
|
|
4
|
+
# taken from i18n gem and patch with:
|
|
5
|
+
#
|
|
6
|
+
# å: "å",
|
|
7
|
+
# ä: "ä",
|
|
8
|
+
# ö: "ö",
|
|
9
|
+
# Å: "Å",
|
|
10
|
+
# Ä: "Ä",
|
|
11
|
+
# Ö: "Ö",
|
|
12
|
+
# æ: "ä",
|
|
13
|
+
# ø: "ö",
|
|
14
|
+
# Æ: "Ä",
|
|
15
|
+
# Ø: "Ö"
|
|
16
|
+
#
|
|
17
|
+
##########
|
|
18
|
+
|
|
19
|
+
DEFAULT_REPLACEMENT_CHAR = "?"
|
|
20
|
+
|
|
21
|
+
# A transliterator which accepts a Hash of characters as its translation
|
|
22
|
+
# rule.
|
|
23
|
+
DEFAULT_APPROXIMATIONS = {
|
|
24
|
+
"À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"Ä", "Å"=>"Å", "Æ"=>"Ä",
|
|
25
|
+
"Ç"=>"C", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "Ì"=>"I", "Í"=>"I",
|
|
26
|
+
"Î"=>"I", "Ï"=>"I", "Ð"=>"D", "Ñ"=>"N", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O",
|
|
27
|
+
"Õ"=>"O", "Ö"=>"Ö", "×"=>"x", "Ø"=>"Ö", "Ù"=>"U", "Ú"=>"U", "Û"=>"U",
|
|
28
|
+
"Ü"=>"U", "Ý"=>"Y", "Þ"=>"Th", "ß"=>"ss", "à"=>"a", "á"=>"a", "â"=>"a",
|
|
29
|
+
"ã"=>"a", "ä"=>"ä", "å"=>"å", "æ"=>"ä", "ç"=>"c", "è"=>"e", "é"=>"e",
|
|
30
|
+
"ê"=>"e", "ë"=>"e", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "ð"=>"d",
|
|
31
|
+
"ñ"=>"n", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"ö", "ø"=>"ö",
|
|
32
|
+
"ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "ý"=>"y", "þ"=>"th", "ÿ"=>"y",
|
|
33
|
+
"Ā"=>"A", "ā"=>"a", "Ă"=>"A", "ă"=>"a", "Ą"=>"A", "ą"=>"a", "Ć"=>"C",
|
|
34
|
+
"ć"=>"c", "Ĉ"=>"C", "ĉ"=>"c", "Ċ"=>"C", "ċ"=>"c", "Č"=>"C", "č"=>"c",
|
|
35
|
+
"Ď"=>"D", "ď"=>"d", "Đ"=>"D", "đ"=>"d", "Ē"=>"E", "ē"=>"e", "Ĕ"=>"E",
|
|
36
|
+
"ĕ"=>"e", "Ė"=>"E", "ė"=>"e", "Ę"=>"E", "ę"=>"e", "Ě"=>"E", "ě"=>"e",
|
|
37
|
+
"Ĝ"=>"G", "ĝ"=>"g", "Ğ"=>"G", "ğ"=>"g", "Ġ"=>"G", "ġ"=>"g", "Ģ"=>"G",
|
|
38
|
+
"ģ"=>"g", "Ĥ"=>"H", "ĥ"=>"h", "Ħ"=>"H", "ħ"=>"h", "Ĩ"=>"I", "ĩ"=>"i",
|
|
39
|
+
"Ī"=>"I", "ī"=>"i", "Ĭ"=>"I", "ĭ"=>"i", "Į"=>"I", "į"=>"i", "İ"=>"I",
|
|
40
|
+
"ı"=>"i", "IJ"=>"IJ", "ij"=>"ij", "Ĵ"=>"J", "ĵ"=>"j", "Ķ"=>"K", "ķ"=>"k",
|
|
41
|
+
"ĸ"=>"k", "Ĺ"=>"L", "ĺ"=>"l", "Ļ"=>"L", "ļ"=>"l", "Ľ"=>"L", "ľ"=>"l",
|
|
42
|
+
"Ŀ"=>"L", "ŀ"=>"l", "Ł"=>"L", "ł"=>"l", "Ń"=>"N", "ń"=>"n", "Ņ"=>"N",
|
|
43
|
+
"ņ"=>"n", "Ň"=>"N", "ň"=>"n", "ʼn"=>"'n", "Ŋ"=>"NG", "ŋ"=>"ng",
|
|
44
|
+
"Ō"=>"O", "ō"=>"o", "Ŏ"=>"O", "ŏ"=>"o", "Ő"=>"O", "ő"=>"o", "Œ"=>"OE",
|
|
45
|
+
"œ"=>"oe", "Ŕ"=>"R", "ŕ"=>"r", "Ŗ"=>"R", "ŗ"=>"r", "Ř"=>"R", "ř"=>"r",
|
|
46
|
+
"Ś"=>"S", "ś"=>"s", "Ŝ"=>"S", "ŝ"=>"s", "Ş"=>"S", "ş"=>"s", "Š"=>"S",
|
|
47
|
+
"š"=>"s", "Ţ"=>"T", "ţ"=>"t", "Ť"=>"T", "ť"=>"t", "Ŧ"=>"T", "ŧ"=>"t",
|
|
48
|
+
"Ũ"=>"U", "ũ"=>"u", "Ū"=>"U", "ū"=>"u", "Ŭ"=>"U", "ŭ"=>"u", "Ů"=>"U",
|
|
49
|
+
"ů"=>"u", "Ű"=>"U", "ű"=>"u", "Ų"=>"U", "ų"=>"u", "Ŵ"=>"W", "ŵ"=>"w",
|
|
50
|
+
"Ŷ"=>"Y", "ŷ"=>"y", "Ÿ"=>"Y", "Ź"=>"Z", "ź"=>"z", "Ż"=>"Z", "ż"=>"z",
|
|
51
|
+
"Ž"=>"Z", "ž"=>"z"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
UNWANTED_CHARACTERS_PATTERN = /[^0-9a-zåäö-]/
|
|
55
|
+
|
|
56
|
+
def self.included(base)
|
|
57
|
+
base.extend(ClassMethods)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def nid_case(text)
|
|
61
|
+
self.class.nid_case(text)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def possible_nid?(candidate)
|
|
65
|
+
self.class.possible_nid?(candidate)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
module ClassMethods
|
|
69
|
+
|
|
70
|
+
def nid_case(text)
|
|
71
|
+
return text unless present?(text)
|
|
72
|
+
text = normalize_chars(text)
|
|
73
|
+
squish(lower_case(text).gsub('_','-').gsub(' ','-').gsub(UNWANTED_CHARACTERS_PATTERN, '').gsub(/-/, ' ')).gsub(/ /, '-')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def possible_nid?(candidate)
|
|
77
|
+
return true if candidate.nil?
|
|
78
|
+
!(candidate =~ UNWANTED_CHARACTERS_PATTERN)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def lower_case(text)
|
|
82
|
+
return text unless present?(text)
|
|
83
|
+
text.tr('ÅÄÖ', 'åäö').downcase
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def normalize_chars(text)
|
|
89
|
+
return text unless present?(text)
|
|
90
|
+
transliterate(text)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def transliterate(string)
|
|
94
|
+
string.gsub(/[^\x00-\x7f]/u) do |char|
|
|
95
|
+
DEFAULT_APPROXIMATIONS[char] || DEFAULT_REPLACEMENT_CHAR
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#let's take some more methods from rails!
|
|
100
|
+
# from activesupport/core_ext/boject/blank.rb
|
|
101
|
+
def blank?(text)
|
|
102
|
+
text.respond_to?(:empty?) ? text.empty? : !text
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# An object is present if it's not <tt>blank?</tt>.
|
|
106
|
+
def present?(text)
|
|
107
|
+
!blank?(text)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#and from activesupport/core_ext/string/filter.rb
|
|
111
|
+
def squish(text)
|
|
112
|
+
squish!(text.dup)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Performs a destructive squish. See String#squish.
|
|
116
|
+
def squish!(text)
|
|
117
|
+
text.strip!
|
|
118
|
+
text.gsub!(/\s+/, ' ')
|
|
119
|
+
text
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
data/nid_utils.gemspec
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require 'nid_utils/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = 'nid_utils'
|
|
7
|
+
s.version = NidUtils::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ['TV4']
|
|
10
|
+
s.email = ['per.astrom@tv4.se']
|
|
11
|
+
|
|
12
|
+
s.homepage = 'https://github.com/TV4/nid_utils'
|
|
13
|
+
s.summary = %q{Nid utils is used for creating common name for tags}
|
|
14
|
+
s.description = %q{Nid utils is used for creating common name for tags}
|
|
15
|
+
|
|
16
|
+
s.files = Dir.glob("lib/**/*") + %w(Gemfile nid_utils.gemspec README.markdown)
|
|
17
|
+
s.test_files = Dir.glob('spec/*')
|
|
18
|
+
|
|
19
|
+
s.add_development_dependency 'rake'
|
|
20
|
+
s.add_development_dependency 'rspec'
|
|
21
|
+
s.add_development_dependency 'ci_reporter', '~> 1.6.5'
|
|
22
|
+
s.add_development_dependency 'simplecov'
|
|
23
|
+
s.add_development_dependency 'simplecov-rcov'
|
|
24
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require "spec_helper"
|
|
3
|
+
include NidUtils
|
|
4
|
+
|
|
5
|
+
class NidCaser
|
|
6
|
+
include NidUtils
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "nid" do
|
|
10
|
+
|
|
11
|
+
context "nid should be created with lower case and space replaced with dash" do
|
|
12
|
+
|
|
13
|
+
it "should change space to dash" do
|
|
14
|
+
NidCaser.nid_case('foo bar bee').should == 'foo-bar-bee'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should nid_case nil to nil" do
|
|
18
|
+
nid_case(nil).should be_nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should nid_case '' to ''" do
|
|
22
|
+
nid_case("").should == ""
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should downcase all chars" do
|
|
26
|
+
nid_case('ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ').should == 'abcdefghijklmnopqrstuvwxyzåäö'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should all all chars not of the type a-z, åäö, -, 0-9" do
|
|
30
|
+
nid_case("kale8^79'0-").should == 'kale8790'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should convert diacritical characters" do
|
|
34
|
+
nid_case("Dürén Ibrahimović").should == 'duren-ibrahimovic'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'preserves åäö ÅÄÖ' do
|
|
38
|
+
nid_case("ÅÄÖåäö").should == 'åäöåäö'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'converts `¨´^' do
|
|
42
|
+
nid_case("ÈÉËÊèéëê").should == 'eeeeeeee'
|
|
43
|
+
nid_case("ÀÁÂàáâ").should == 'aaaaaa'
|
|
44
|
+
nid_case("Üü").should == 'uu'
|
|
45
|
+
nid_case("ČĆÇčćç").should == 'cccccc'
|
|
46
|
+
nid_case("Ññ").should == 'nn'
|
|
47
|
+
nid_case("Ïï").should == 'ii'
|
|
48
|
+
nid_case("ÆØæø").should == 'äöäö'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "converts _ to -" do
|
|
52
|
+
nid_case("Let's_Dance").should == 'lets-dance'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'removes -- from name' do
|
|
56
|
+
nid_case("Let's -- da-da-dance").should == 'lets-da-da-dance'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'removes surrounding and double space from name and tag' do
|
|
60
|
+
nid_case(" Fångarna på fortet ").should == 'fångarna-på-fortet'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "can determine that some things aren't nids" do
|
|
66
|
+
it "accepts nothingness" do
|
|
67
|
+
possible_nid?('').should be_true
|
|
68
|
+
possible_nid?(nil).should be_true
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "accepts åäö" do
|
|
72
|
+
possible_nid?('räksmörgås').should be_true
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "rejects strange letters" do
|
|
76
|
+
possible_nid?('dürén-ibrahimović').should be_false
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "rejects non-letters" do
|
|
80
|
+
possible_nid?('foo bar').should be_false
|
|
81
|
+
possible_nid?('foo/bar').should be_false
|
|
82
|
+
possible_nid?('foo\n').should be_false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "rejects upper-case letters" do
|
|
86
|
+
possible_nid?('FOO').should be_false
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: nid_utils
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.6.0
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- TV4
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2013-07-09 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: rake
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '0'
|
|
22
|
+
type: :development
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0'
|
|
30
|
+
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: rspec
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
33
|
+
none: false
|
|
34
|
+
requirements:
|
|
35
|
+
- - ! '>='
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: '0'
|
|
38
|
+
type: :development
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '0'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: ci_reporter
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
none: false
|
|
50
|
+
requirements:
|
|
51
|
+
- - ~>
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 1.6.5
|
|
54
|
+
type: :development
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ~>
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 1.6.5
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: simplecov
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
none: false
|
|
66
|
+
requirements:
|
|
67
|
+
- - ! '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
type: :development
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: simplecov-rcov
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ! '>='
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '0'
|
|
86
|
+
type: :development
|
|
87
|
+
prerelease: false
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
94
|
+
description: Nid utils is used for creating common name for tags
|
|
95
|
+
email:
|
|
96
|
+
- per.astrom@tv4.se
|
|
97
|
+
executables: []
|
|
98
|
+
extensions: []
|
|
99
|
+
extra_rdoc_files: []
|
|
100
|
+
files:
|
|
101
|
+
- lib/nid_utils/version.rb
|
|
102
|
+
- lib/nid_utils.rb
|
|
103
|
+
- Gemfile
|
|
104
|
+
- nid_utils.gemspec
|
|
105
|
+
- README.markdown
|
|
106
|
+
- spec/nid_utils_spec.rb
|
|
107
|
+
- spec/spec_helper.rb
|
|
108
|
+
homepage: https://github.com/TV4/nid_utils
|
|
109
|
+
licenses: []
|
|
110
|
+
post_install_message:
|
|
111
|
+
rdoc_options: []
|
|
112
|
+
require_paths:
|
|
113
|
+
- lib
|
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
|
+
none: false
|
|
116
|
+
requirements:
|
|
117
|
+
- - ! '>='
|
|
118
|
+
- !ruby/object:Gem::Version
|
|
119
|
+
version: '0'
|
|
120
|
+
segments:
|
|
121
|
+
- 0
|
|
122
|
+
hash: -1892790732466087363
|
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
|
+
none: false
|
|
125
|
+
requirements:
|
|
126
|
+
- - ! '>='
|
|
127
|
+
- !ruby/object:Gem::Version
|
|
128
|
+
version: '0'
|
|
129
|
+
segments:
|
|
130
|
+
- 0
|
|
131
|
+
hash: -1892790732466087363
|
|
132
|
+
requirements: []
|
|
133
|
+
rubyforge_project:
|
|
134
|
+
rubygems_version: 1.8.25
|
|
135
|
+
signing_key:
|
|
136
|
+
specification_version: 3
|
|
137
|
+
summary: Nid utils is used for creating common name for tags
|
|
138
|
+
test_files:
|
|
139
|
+
- spec/nid_utils_spec.rb
|
|
140
|
+
- spec/spec_helper.rb
|