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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +3 -0
- data/README.md +5 -0
- data/Rakefile +1 -0
- data/jekyll-url-backport.gemspec +23 -0
- data/jekyll-url-backport.rb +122 -0
- metadata +93 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
@@ -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: []
|