jekyll-url-backport 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []