ruby-slugify 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/language-support.rb +94 -0
- data/lib/ruby-slugify.rb +149 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5354609d5f05b94f8ad516d552b55640505751562e3aac60c43af274d823dacb
|
4
|
+
data.tar.gz: 56e4f89879eff6d902d5a469bdafde8382fc4e52a722c07ca96bfe788b080275
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eccd017ef1bca3fbc0845d7d7f8b71e0451d8d0bc169a8e22366d4d8e8fa371081e257862dfe6c1d6e4810785f5a8db411d26974f43eee0afd8b0a8f2c02b4e8
|
7
|
+
data.tar.gz: 8fbcb453f631e5498b71c2b94b4efc5bdad1973c9c95b814a2642d8c2f18811cb1461c5d092a7240660cb94754dbd30664745e4038571ce9c9bea262f8763c10
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$defaultMap = {
|
4
|
+
'"' => "",
|
5
|
+
'\'' => "",
|
6
|
+
'’' => "",
|
7
|
+
'‒' => "-",
|
8
|
+
'–' => "-",
|
9
|
+
'—' => "-",
|
10
|
+
'―' => "-",
|
11
|
+
}
|
12
|
+
|
13
|
+
$deutscheMap = {
|
14
|
+
'&' => "und",
|
15
|
+
'@' => "an",
|
16
|
+
'ä' => "ae",
|
17
|
+
'Ä' => "Ae",
|
18
|
+
'ö' => "oe",
|
19
|
+
'Ö' => "Oe",
|
20
|
+
'ü' => "ue",
|
21
|
+
'Ü' => "Ue",
|
22
|
+
}
|
23
|
+
|
24
|
+
$englishMap = {
|
25
|
+
'&' => "and",
|
26
|
+
'@' => "at",
|
27
|
+
}
|
28
|
+
|
29
|
+
$spanishMap = {
|
30
|
+
'&' => "y",
|
31
|
+
'@' => "en",
|
32
|
+
}
|
33
|
+
|
34
|
+
$finnishMap = {
|
35
|
+
'&' => "ja",
|
36
|
+
'@' => "at",
|
37
|
+
}
|
38
|
+
|
39
|
+
$greekMap = {
|
40
|
+
'&' => "kai",
|
41
|
+
'η' => "i",
|
42
|
+
'ή' => "i",
|
43
|
+
'Η' => "i",
|
44
|
+
'ι' => "i",
|
45
|
+
'ί' => "i",
|
46
|
+
'ϊ' => "i",
|
47
|
+
'Ι' => "i",
|
48
|
+
'χ' => "x",
|
49
|
+
'Χ' => "x",
|
50
|
+
'ω' => "w",
|
51
|
+
'ώ' => "w",
|
52
|
+
'Ω' => "w",
|
53
|
+
'ϋ' => "u",
|
54
|
+
}
|
55
|
+
|
56
|
+
$dutchMap = {
|
57
|
+
'&' => "en",
|
58
|
+
'@' => "at",
|
59
|
+
}
|
60
|
+
|
61
|
+
$polishMap = {
|
62
|
+
'&' => "i",
|
63
|
+
'@' => "na",
|
64
|
+
}
|
65
|
+
|
66
|
+
$turkishMap = {
|
67
|
+
'&' => "ve",
|
68
|
+
'@' => "et",
|
69
|
+
'ş' => "s",
|
70
|
+
'Ş' => "S",
|
71
|
+
'ü' => "u",
|
72
|
+
'Ü' => "U",
|
73
|
+
'ö' => "o",
|
74
|
+
'Ö' => "O",
|
75
|
+
'İ' => "I",
|
76
|
+
'ı' => "i",
|
77
|
+
'ğ' => "g",
|
78
|
+
'Ğ' => "G",
|
79
|
+
'ç' => "c",
|
80
|
+
'Ç' => "C",
|
81
|
+
}
|
82
|
+
|
83
|
+
$referenceTable = {
|
84
|
+
"en" => $englishMap,
|
85
|
+
"es" => $spanishMap,
|
86
|
+
"de" => $deutscheMap,
|
87
|
+
"fi" => $finnishMap,
|
88
|
+
"nl" => $dutchMap,
|
89
|
+
"po" => $polishMap,
|
90
|
+
"tr" => $turkishMap,
|
91
|
+
"gr" => $greekMap,
|
92
|
+
"el" => $greekMap,
|
93
|
+
"ell" => $greekMap
|
94
|
+
}
|
data/lib/ruby-slugify.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/language-support"
|
4
|
+
require 'stringex/unidecoder'
|
5
|
+
|
6
|
+
class RubySlugify
|
7
|
+
|
8
|
+
@inputString = nil
|
9
|
+
@language = "en"
|
10
|
+
@maxLength = 100
|
11
|
+
@toLower = true
|
12
|
+
@customMap = nil
|
13
|
+
@slugString = nil
|
14
|
+
|
15
|
+
# Initializes the object with all necessary instance variables
|
16
|
+
# Parameters :
|
17
|
+
# 1. inputString - The string to be slugified
|
18
|
+
# 2. language - If any language translations are required. Available options : ["en", "es", "de", "nl", "gr", "el", "ell", "po", "fi"]. Default is 'en' or english
|
19
|
+
# 3, customMap - If any custom mappings are required i.e custom substituions for words in the slugString
|
20
|
+
# 4. maxLength - Limits the size of the slugified string. Default is 100 characters
|
21
|
+
# 5. toLower - Whether the slugified string needs to be lower cased. Default is true, i.e it is lower cased.
|
22
|
+
def initialize(inputString, language = "en", customMap = nil, maxLength = 100, toLower = true)
|
23
|
+
# Initialise all the instance variables
|
24
|
+
@inputString = inputString
|
25
|
+
@maxLength = maxLength
|
26
|
+
@toLower = toLower
|
27
|
+
@customMap = customMap
|
28
|
+
|
29
|
+
# If the language is not supported use default as english
|
30
|
+
if $referenceTable.key?(language)
|
31
|
+
@language = language
|
32
|
+
else
|
33
|
+
@language = "en"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Creates the slugified string from the given input string
|
38
|
+
# Returns : slugified string
|
39
|
+
def createSlug()
|
40
|
+
# Strip leading and trailing spaces
|
41
|
+
@slugString = @inputString.strip()
|
42
|
+
|
43
|
+
# If custom mapping is given, first substitute these key, value pairs
|
44
|
+
unless @customMap.nil?
|
45
|
+
substituteCustom(@customMap)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Substitute all the common characters present in the default map
|
49
|
+
substituteChars($defaultMap)
|
50
|
+
|
51
|
+
# Substitute all the characters present in the given language
|
52
|
+
substituteChars($referenceTable[@language])
|
53
|
+
|
54
|
+
# Process all non ASCII characters and convert them to nearest ASCII
|
55
|
+
@slugString = Stringex::Unidecoder.decode(@slugString)
|
56
|
+
|
57
|
+
# If required in lowercase, convert it. Always coverts to lowercase unless specified otherwise
|
58
|
+
unless @toLower == false
|
59
|
+
@slugString = @slugString.downcase
|
60
|
+
end
|
61
|
+
|
62
|
+
# Any character other than a-z A-Z 0-9 _ and - will be replaced with -
|
63
|
+
@slugString = @slugString.gsub(/[^a-zA-Z0-9\-\_]/, '-')
|
64
|
+
|
65
|
+
# Replace multiple '-'s with a single '-' and multiple '_'s with a single '_'
|
66
|
+
@slugString = @slugString.gsub(/-+/, '-')
|
67
|
+
@slugString = @slugString.gsub(/_+/, '_')
|
68
|
+
|
69
|
+
# Remove any leading and trailing '-'s and '_'s
|
70
|
+
@slugString = @slugString.delete_prefix('-')
|
71
|
+
@slugString = @slugString.delete_prefix('_')
|
72
|
+
@slugString = @slugString.delete_suffix('-')
|
73
|
+
@slugString = @slugString.delete_suffix('_')
|
74
|
+
|
75
|
+
# If the size of slug string is greater than the maxLength, trim it
|
76
|
+
if @slugString.length > @maxLength
|
77
|
+
@slugString = trimString(@slugString, @maxLength)
|
78
|
+
end
|
79
|
+
|
80
|
+
@slugString
|
81
|
+
end
|
82
|
+
|
83
|
+
# Substitutes the characters in slugString with their mapped values
|
84
|
+
# Parameters :
|
85
|
+
# 1. mapping - The hashmap that contains the one to one mapping of characters to be replaced
|
86
|
+
def substituteChars(mapping)
|
87
|
+
len = @slugString.length - 1
|
88
|
+
for i in 0..len
|
89
|
+
if mapping.key?(@slugString[i])
|
90
|
+
@slugString[i] = mapping[@slugString[i]]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Substitutes the patterns in slugString with their mapped values given by the user
|
96
|
+
# Parameters :
|
97
|
+
# 1. mapping - The hashmap that contains the one to one mapping of character runs to be replaced
|
98
|
+
def substituteCustom(mapping)
|
99
|
+
mapping.each do |key, value|
|
100
|
+
find = key.to_s
|
101
|
+
replace = value.to_s
|
102
|
+
@slugString = @slugString.gsub(find, replace)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Truncates a string if it is longer than a given length
|
107
|
+
# Parameters :
|
108
|
+
# 1. longString - the string that is to be truncated
|
109
|
+
# 2. mlen - maximum length of the string
|
110
|
+
# Returns :
|
111
|
+
# 1. Truncated string
|
112
|
+
def trimString(longString, mlen)
|
113
|
+
|
114
|
+
# Split at '-' to obtain all the words in the slug
|
115
|
+
splitString = longString.split('-')
|
116
|
+
|
117
|
+
# If the first word is longer than maxLength, return the slice as the trimmed string
|
118
|
+
if splitString[0].length > mlen
|
119
|
+
return splitString[0][0..mlen-1]
|
120
|
+
end
|
121
|
+
|
122
|
+
# Ensure the truncated version is below maxLength but has whole words in the slug
|
123
|
+
trimmedString = ''
|
124
|
+
for string in splitString
|
125
|
+
if string.length + trimmedString.length + 1 <= mlen
|
126
|
+
trimmedString = trimmedString + '-' + string
|
127
|
+
else
|
128
|
+
break
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Remove leading '-' due to concatenation
|
133
|
+
trimmedString = trimmedString.delete_prefix('-')
|
134
|
+
return trimmedString
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns true if the given string is a slug. Can be invoked without an object.
|
138
|
+
# Parameters :
|
139
|
+
# 1. inputString - The string that is to be checked
|
140
|
+
# Returns :
|
141
|
+
# 1. Boolean value (true / false) - If the string is a slug or not
|
142
|
+
def self.isSlug(inputString)
|
143
|
+
if inputString == "" || inputString.length > @maxLength || inputString[0] == '-' || inputString[0] == '_' || inputString[inputString.length - 1] == '-' || inputString[inputString.length - 1] == '_'
|
144
|
+
return false
|
145
|
+
else
|
146
|
+
return inputString.match(/[^a-zA-Z0-9\-\_]/).nil?
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-slugify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aditi Srinivas
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: stringex
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- aditisrinivas97@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/language-support.rb
|
35
|
+
- lib/ruby-slugify.rb
|
36
|
+
homepage:
|
37
|
+
licenses: []
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.0.3
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: URL-friendly slugify in Ruby
|
58
|
+
test_files: []
|