Class: Jekyll::URL
- Inherits:
- 
      Object
      
        - Object
- Jekyll::URL
 
- Defined in:
- lib/jekyll/url.rb
Class Method Summary collapse
- 
  
    
      .escape_path(path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Escapes a path to be a valid URL path segment. 
- 
  
    
      .unescape_path(path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Unescapes a URL path segment. 
Instance Method Summary collapse
- 
  
    
      #generate_url(template)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Internal: Generate the URL by replacing all placeholders with their respective values in the given template. 
- #generate_url_from_drop(template) ⇒ Object
- #generate_url_from_hash(template) ⇒ Object
- 
  
    
      #generated_permalink  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Generates a URL from the permalink. 
- 
  
    
      #generated_url  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Generates a URL from the template. 
- 
  
    
      #initialize(options)  ⇒ URL 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    options - One of :permalink or :template must be supplied. 
- 
  
    
      #possible_keys(key)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    We include underscores in keys to allow for ‘i_month’ and so forth. 
- 
  
    
      #sanitize_url(str)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a sanitized String URL, stripping “../../” and multiples of “/”, as well as the beginning “/” so we can enforce and ensure it. 
- 
  
    
      #to_s  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    The generated relative URL of the resource. 
Constructor Details
#initialize(options) ⇒ URL
options - One of :permalink or :template must be supplied.
:template     - The String used as template for URL generation,
                for example "/:path/:basename:output_ext", where
                a placeholder is prefixed with a colon.
:placeholders - A hash containing the placeholders which will be
                replaced when used inside the template. E.g.
                { "year" => Time.now.strftime("%Y") } would replace
                the placeholder ":year" with the current year.
:permalink    - If supplied, no URL will be generated from the
                template. Instead, the given permalink will be
                used as URL.
| 25 26 27 28 29 30 31 32 33 | # File 'lib/jekyll/url.rb', line 25 def initialize() @template = [:template] @placeholders = [:placeholders] || {} @permalink = [:permalink] if (@template || @permalink).nil? raise ArgumentError, "One of :template or :permalink must be supplied." end end | 
Class Method Details
.escape_path(path) ⇒ Object
Escapes a path to be a valid URL path segment
path - The path to be escaped.
Examples:
URL.escape_path("/a b")
# => "/a%20b"
Returns the escaped path.
| 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | # File 'lib/jekyll/url.rb', line 131 def self.escape_path(path) return path if path.empty? || %r!^[a-zA-Z0-9./-]+$!.match?(path) # Because URI.escape doesn't escape "?", "[" and "]" by default, # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/"). # # URI path segment is defined in RFC 3986 as follows: # segment = *pchar # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" # pct-encoded = "%" HEXDIG HEXDIG # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" # / "*" / "+" / "," / ";" / "=" Addressable::URI.encode(path).encode("utf-8").sub("#", "%23") end | 
.unescape_path(path) ⇒ Object
Unescapes a URL path segment
path - The path to be unescaped.
Examples:
URL.unescape_path("/a%20b")
# => "/a b"
Returns the unescaped path.
| 157 158 159 160 161 162 | # File 'lib/jekyll/url.rb', line 157 def self.unescape_path(path) path = path.encode("utf-8") return path unless path.include?("%") Addressable::URI.unencode(path) end | 
Instance Method Details
#generate_url(template) ⇒ Object
Internal: Generate the URL by replacing all placeholders with their respective values in the given template
Returns the unsanitized String URL
| 60 61 62 63 64 65 66 | # File 'lib/jekyll/url.rb', line 60 def generate_url(template) if @placeholders.is_a? Drops::UrlDrop generate_url_from_drop(template) else generate_url_from_hash(template) end end | 
#generate_url_from_drop(template) ⇒ Object
| 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | # File 'lib/jekyll/url.rb', line 95 def generate_url_from_drop(template) template.gsub(%r!:([a-z_]+)!) do |match| pool = possible_keys(match.sub(":", "")) winner = pool.find { |key| @placeholders.key?(key) } if winner.nil? raise NoMethodError, "The URL template doesn't have #{pool.join(" or ")} keys. "\ "Check your permalink template!" end value = @placeholders[winner] value = "" if value.nil? replacement = self.class.escape_path(value) match.sub(":#{winner}", replacement) end.squeeze("/") end | 
#generate_url_from_hash(template) ⇒ Object
| 68 69 70 71 72 73 74 75 76 77 78 79 | # File 'lib/jekyll/url.rb', line 68 def generate_url_from_hash(template) @placeholders.inject(template) do |result, token| break result if result.index(":").nil? if token.last.nil? # Remove leading "/" to avoid generating urls with `//` result.gsub("/:#{token.first}", "") else result.gsub(":#{token.first}", self.class.escape_path(token.last)) end end end | 
#generated_permalink ⇒ Object
Generates a URL from the permalink
Returns the _unsanitized String URL
| 45 46 47 | # File 'lib/jekyll/url.rb', line 45 def generated_permalink (@generated_permalink ||= generate_url(@permalink)) if @permalink end | 
#generated_url ⇒ Object
Generates a URL from the template
Returns the unsanitized String URL
| 52 53 54 | # File 'lib/jekyll/url.rb', line 52 def generated_url @generated_url ||= generate_url(@template) end | 
#possible_keys(key) ⇒ Object
We include underscores in keys to allow for ‘i_month’ and so forth. This poses a problem for keys which are followed by an underscore but the underscore is not part of the key, e.g. ‘/:month_:day’. That should be :month and :day, but our key extraction regexp isn’t smart enough to know that so we have to make it an explicit possibility.
| 87 88 89 90 91 92 93 | # File 'lib/jekyll/url.rb', line 87 def possible_keys(key) if key.end_with?("_") [key, key.chomp("_")] else [key] end end | 
#sanitize_url(str) ⇒ Object
Returns a sanitized String URL, stripping “../../” and multiples of “/”, as well as the beginning “/” so we can enforce and ensure it.
| 117 118 119 | # File 'lib/jekyll/url.rb', line 117 def sanitize_url(str) "/#{str}".gsub("..", "/").gsub("./", "").squeeze("/") end | 
#to_s ⇒ Object
The generated relative URL of the resource
Returns the String URL
| 38 39 40 | # File 'lib/jekyll/url.rb', line 38 def to_s sanitize_url(generated_permalink || generated_url) end |