jekyll-url-backport 0.1.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: 8d97875a3dc2368ab30c46aab75ac650a688bf94
4
+ data.tar.gz: a99e835f69dad425d25aa2af736a3b8fa23399f5
5
+ SHA512:
6
+ metadata.gz: 896d96cb2f48541f556b64ee9d129fe966a3c2806734bad1821a89c21752e6a7fbfd6cf59b096fc1f188baa85b585f8f50ac7ce716360c9ce9e3bbd8116d328f
7
+ data.tar.gz: 0d10dd33f42d17e5edec4485c20821d84b5ea442b3b6f3321f649064a10a0c230065bce070e1078c17e64117b4b9361eb9f684c018a0594be1449388f6e8929c
@@ -0,0 +1,18 @@
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
18
+ spec/fixtures/_site
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,5 @@
1
+ # jekyll-url-backport
2
+
3
+ Backports Jekyll 2.5.3's `Url` class for use in 2.4.0 (and GitHub Pages).
4
+
5
+ See https://github.com/jekyll/jekyll/issues/3334 for more background.
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,23 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = 'jekyll-url-backport'
6
+ spec.version = '0.1.0'
7
+ spec.authors = ['Garen Torikian']
8
+ spec.email = ['gjtorikian@gmail.com']
9
+ spec.summary = "A backport of Jekyll 2.5.3's url.rb class (for use in GitHub Pages)"
10
+ spec.description = ''
11
+ spec.homepage = 'https://github.com/gjtorikian/jekyll-url-backport'
12
+ spec.license = 'MIT'
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test)/})
17
+ spec.require_paths = ['lib']
18
+
19
+ spec.add_runtime_dependency 'jekyll', '~> 2.0'
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.3'
22
+ spec.add_development_dependency 'rake'
23
+ end
@@ -0,0 +1,122 @@
1
+ require 'uri'
2
+
3
+ # Public: Methods that generate a URL for a resource such as a Post or a Page.
4
+ #
5
+ # Examples
6
+ #
7
+ # URL.new({
8
+ # :template => /:categories/:title.html",
9
+ # :placeholders => {:categories => "ruby", :title => "something"}
10
+ # }).to_s
11
+ #
12
+ module Jekyll
13
+ class URL
14
+
15
+ # options - One of :permalink or :template must be supplied.
16
+ # :template - The String used as template for URL generation,
17
+ # for example "/:path/:basename:output_ext", where
18
+ # a placeholder is prefixed with a colon.
19
+ # :placeholders - A hash containing the placeholders which will be
20
+ # replaced when used inside the template. E.g.
21
+ # { "year" => Time.now.strftime("%Y") } would replace
22
+ # the placeholder ":year" with the current year.
23
+ # :permalink - If supplied, no URL will be generated from the
24
+ # template. Instead, the given permalink will be
25
+ # used as URL.
26
+ def initialize(options)
27
+ @template = options[:template]
28
+ @placeholders = options[:placeholders] || {}
29
+ @permalink = options[:permalink]
30
+
31
+ if (@template || @permalink).nil?
32
+ raise ArgumentError, "One of :template or :permalink must be supplied."
33
+ end
34
+ end
35
+
36
+ # The generated relative URL of the resource
37
+ #
38
+ # Returns the String URL
39
+ def to_s
40
+ sanitize_url(generated_permalink || generated_url)
41
+ end
42
+
43
+ # Generates a URL from the permalink
44
+ #
45
+ # Returns the _unsanitized String URL
46
+ def generated_permalink
47
+ (@generated_permlink ||= generate_url(@permalink)) if @permalink
48
+ end
49
+
50
+ # Generates a URL from the template
51
+ #
52
+ # Returns the _unsanitized String URL
53
+ def generated_url
54
+ @generated_url ||= generate_url(@template)
55
+ end
56
+
57
+ # Internal: Generate the URL by replacing all placeholders with their
58
+ # respective values in the given template
59
+ #
60
+ # Returns the _unsanitizied_ String URL
61
+ def generate_url(template)
62
+ @placeholders.inject(template) do |result, token|
63
+ break result if result.index(':').nil?
64
+ result.gsub(/:#{token.first}/, self.class.escape_path(token.last))
65
+ end
66
+ end
67
+
68
+ # Returns a sanitized String URL
69
+ def sanitize_url(in_url)
70
+ url = in_url \
71
+ # Remove all double slashes
72
+ .gsub(/\/\//, '/') \
73
+ # Remove every URL segment that consists solely of dots
74
+ .split('/').reject{ |part| part =~ /^\.+$/ }.join('/') \
75
+ # Always add a leading slash
76
+ .gsub(/\A([^\/])/, '/\1')
77
+
78
+ # Append a trailing slash to the URL if the unsanitized URL had one
79
+ url << "/" if in_url[-1].eql?('/')
80
+
81
+ url
82
+ end
83
+
84
+ # Escapes a path to be a valid URL path segment
85
+ #
86
+ # path - The path to be escaped.
87
+ #
88
+ # Examples:
89
+ #
90
+ # URL.escape_path("/a b")
91
+ # # => "/a%20b"
92
+ #
93
+ # Returns the escaped path.
94
+ def self.escape_path(path)
95
+ # Because URI.escape doesn't escape '?', '[' and ']' by default,
96
+ # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
97
+ #
98
+ # URI path segment is defined in RFC 3986 as follows:
99
+ # segment = *pchar
100
+ # pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
101
+ # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
102
+ # pct-encoded = "%" HEXDIG HEXDIG
103
+ # sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
104
+ # / "*" / "+" / "," / ";" / "="
105
+ URI.escape(path, /[^a-zA-Z\d\-._~!$&\'()*+,;=:@\/]/).encode('utf-8')
106
+ end
107
+
108
+ # Unescapes a URL path segment
109
+ #
110
+ # path - The path to be unescaped.
111
+ #
112
+ # Examples:
113
+ #
114
+ # URL.unescape_path("/a%20b")
115
+ # # => "/a b"
116
+ #
117
+ # Returns the unescaped path.
118
+ def self.unescape_path(path)
119
+ URI.unescape(path.encode('utf-8'))
120
+ end
121
+ end
122
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-url-backport
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Garen Torikian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: ''
56
+ email:
57
+ - gjtorikian@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - Gemfile.lock
65
+ - README.md
66
+ - Rakefile
67
+ - jekyll-url-backport.gemspec
68
+ - jekyll-url-backport.rb
69
+ homepage: https://github.com/gjtorikian/jekyll-url-backport
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.2.2
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: A backport of Jekyll 2.5.3's url.rb class (for use in GitHub Pages)
93
+ test_files: []