canvas_cc 0.0.36 → 0.0.37

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2feb0091945201639c9ac6979145ac654621232d
4
- data.tar.gz: 1201761ccbf06821771f2960cd5cf456cffbab8a
3
+ metadata.gz: be03da1087647bda88d651eb4c5864b6cd079081
4
+ data.tar.gz: 7f65e6d609b7693980c656728f9f6873d4aa6620
5
5
  SHA512:
6
- metadata.gz: dbf6e6cc521afc31f27aa4f49641f17794dfc063b3080d45b80901eb7651363ee532f20001ff6806d54f302dacd3e78194bc3087619642319f06429e879022ac
7
- data.tar.gz: c81cf9ac0a83029ec4602cb9281fe607cb23ad7fafce95e15182dac7a1b25a7a27c0c25eb13eda7db5597f5fb3fa077152a00e10c235467d799141b48ca82617
6
+ metadata.gz: 62e6a1aabede03fb93939edd46d76ad246a95a33860f9423ac80d1748361a0df13e9eac80b0f95ef995ad01792d445f6634dad9ea7ed0e9eb785fe636836badd
7
+ data.tar.gz: 51919500c772c0914fad0b1be6679ad949214650e22f360e99f6bfc8967c121649aade8fcaa65e6c2193860e240892dad06624b6ed3925734ba7c5148f27e751
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- canvas_cc (0.0.36)
4
+ canvas_cc (0.0.37)
5
5
  builder
6
6
  happymapper
7
7
  nokogiri
@@ -31,12 +31,126 @@ module CanvasCc::CanvasCC::Models
31
31
  end
32
32
 
33
33
  def self.convert_name_to_url(name)
34
- url = CGI::escape(name.downcase.gsub(/\s/, '-').gsub('.', 'dot'))
34
+ url = urlify(name)
35
35
  if url.length > MAX_URL_LENGTH
36
36
  url = url[0,MAX_URL_LENGTH][/.{0,#{MAX_URL_LENGTH}}/mu]
37
37
  end
38
38
  url
39
39
  end
40
40
 
41
+ def self.urlify(name)
42
+ name = name.downcase.gsub(/\s/, '-').gsub('.', '-dot-')
43
+ name.gsub!('(', '-')
44
+ name.gsub!(')', '-')
45
+ name.gsub!('_', '-')
46
+ name.gsub!('--', '-')
47
+ name.gsub!('"', '')
48
+ name.gsub!('$', ' dollars ')
49
+ name.gsub!(/[äöüß]/) do |match|
50
+ case match
51
+ when "ä" then 'a'
52
+ when "ö" then 'o'
53
+ when "ü" then 'u'
54
+ when "ß" then 'ss'
55
+ end
56
+ end
57
+ name = to_url(name)
58
+ CGI::escape(name)
59
+ end
60
+
61
+ def self.to_url(title)
62
+ title = remove_formatting(title).downcase
63
+ title = replace_whitespace(title, "-")
64
+ title = collapse(title, "-")
65
+ end
66
+
67
+ def self.remove_formatting(title)
68
+ title = strip_html_tags(title)
69
+ title = convert_accented_entities(title)
70
+ title = convert_misc_entities(title)
71
+ title = convert_misc_characters(title)
72
+ collapse(title)
73
+ end
74
+
75
+ def self.strip_html_tags(title, leave_whitespace = false)
76
+ name = /[\w:_-]+/
77
+ value = /([A-Za-z0-9]+|('[^']*?'|"[^"]*?"))/
78
+ attr = /(#{name}(\s*=\s*#{value})?)/
79
+ rx = /<[!\/?\[]?(#{name}|--)(\s+(#{attr}(\s+#{attr})*))?\s*([!\/?\]]+|--)?>/
80
+ (leave_whitespace) ? title.gsub(rx, "").strip : title.gsub(rx, "").gsub(/\s+/, " ").strip
81
+ end
82
+
83
+ def self.convert_accented_entities(title)
84
+ title.gsub(/&([A-Za-z])(grave|acute|circ|tilde|uml|ring|cedil|slash);/, '\1')
85
+ end
86
+
87
+ def self.convert_misc_entities(title)
88
+ {
89
+ "#822[01]" => "\"",
90
+ "#821[67]" => "'",
91
+ "#8230" => "...",
92
+ "#8211" => "-",
93
+ "#8212" => "--",
94
+ "#215" => "x",
95
+ "gt" => ">",
96
+ "lt" => "<",
97
+ "(#8482|trade)" => "(tm)",
98
+ "(#174|reg)" => "(r)",
99
+ "(#169|copy)" => "(c)",
100
+ "(#38|amp)" => "and",
101
+ "nbsp" => " ",
102
+ "(#162|cent)" => " cent",
103
+ "(#163|pound)" => " pound",
104
+ "(#188|frac14)" => "one fourth",
105
+ "(#189|frac12)" => "half",
106
+ "(#190|frac34)" => "three fourths",
107
+ "(#176|deg)" => " degrees"
108
+ }.each do |textiled, normal|
109
+ title.gsub!(/&#{textiled};/, normal)
110
+ end
111
+ title.gsub(/&[^;]+;/, "")
112
+ end
113
+
114
+ def self.convert_misc_characters(title)
115
+ title = title.gsub(/\.{3,}/, " dot dot dot ")
116
+ # Special rules for money
117
+ {
118
+ /(\s|^)\$(\d+)\.(\d+)(\s|$)/ => '\2 dollars \3 cents',
119
+ /(\s|^)£(\d+)\.(\d+)(\s|$)/u => '\2 pounds \3 pence',
120
+ }.each do |found, replaced|
121
+ replaced = " #{replaced} " unless replaced =~ /\\1/
122
+ title.gsub!(found, replaced)
123
+ end
124
+ # Back to normal rules
125
+ {
126
+ /\s*&\s*/ => "and",
127
+ /\s*#/ => "number",
128
+ /\s*@\s*/ => "at",
129
+ /(\S|^)\.(\S)/ => '\1 dot \2',
130
+ /(\s|^)\$(\d*)(\s|$)/ => '\2 dollars',
131
+ /(\s|^)£(\d*)(\s|$)/u => '\2 pounds',
132
+ /(\s|^)¥(\d*)(\s|$)/u => '\2 yen',
133
+ /\s*\*\s*/ => "star",
134
+ /\s*%\s*/ => "percent",
135
+ /\s*(\\|\/)\s*/ => "slash",
136
+ }.each do |found, replaced|
137
+ replaced = " #{replaced} " unless replaced =~ /\\1/
138
+ title.gsub!(found, replaced)
139
+ end
140
+ title.gsub(/(^|\w)'(\w|$)/, '\1\2').gsub(/[\.,:;()\[\]\/\?!\^'"_]/, " ")
141
+ end
142
+
143
+ def self.replace_whitespace(title, replace = " ")
144
+ title.gsub(/\s+/, replace)
145
+ end
146
+
147
+ def self.collapse(title, character = " ")
148
+ title.sub(/^#{character}*/, "").sub(/#{character}*$/, "").squeeze(character)
149
+ end
150
+
151
+ def self.path_safe
152
+ gsub(/[^a-zA-Z0-9\-_]+/, '-')
153
+ end
154
+
41
155
  end
42
156
  end
@@ -1,3 +1,3 @@
1
1
  module CanvasCc
2
- VERSION = "0.0.36"
2
+ VERSION = "0.0.37"
3
3
  end
@@ -28,5 +28,11 @@ module CanvasCc::CanvasCC::Models
28
28
  expect(page.href).to eq expected
29
29
  end
30
30
 
31
+ it "generates urls from page name" do
32
+ name = '2.1_nutrition(mythbustercarbohydrates).html'
33
+ url = Page.convert_name_to_url(name)
34
+ expect(url).to eq '2-dot-1-nutrition-mythbustercarbohydrates-dot-html'
35
+ end
36
+
31
37
  end
32
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas_cc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.36
4
+ version: 0.0.37
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-10 00:00:00.000000000 Z
11
+ date: 2017-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip