module Middleman::Blog::UriTemplates

Handy methods for dealing with URI templates. Mix into whatever class.

Public Instance Methods

apply_uri_template(template, data) click to toggle source

Apply a URI template with the given data, producing a normalized Middleman path.

@param [Addressable::Template] template @param [Hash] data @return [String] normalized path

# File lib/middleman-blog/uri_templates.rb, line 35
def apply_uri_template(template, data)
  ::Middleman::Util.normalize_path Addressable::URI.unencode(template.expand(data)).to_s
end
date_to_params(date) click to toggle source

Convert a date into a hash of components to strings suitable for using in a URL template.

@param [DateTime] date @return [Hash] parameters

# File lib/middleman-blog/uri_templates.rb, line 90
def date_to_params(date)
  {
    year: date.year.to_s,
    month: date.month.to_s.rjust(2, '0'),
    day: date.day.to_s.rjust(2, '0')
  }
end
extract_directory_path(article_path) click to toggle source
# File lib/middleman-blog/uri_templates.rb, line 101
def extract_directory_path(article_path)
  uri = Addressable::URI.parse article_path

  # Remove file extension from the article path
  uri.path.gsub(uri.extname, '')
end
extract_params(template, path) click to toggle source

Use a template to extract parameters from a path, and validate some special (date) keys. Returns nil if the special keys don't match.

@param [Addressable::Template] template @param [String] path

# File lib/middleman-blog/uri_templates.rb, line 46
def extract_params(template, path)
  template.extract(path, BlogTemplateProcessor)
end
safe_parameterize(str, sep = '-') click to toggle source

Parametrize a string preserving any multi-byte characters Reimplementation of this, preserves un-transliterate-able multibyte chars.

@see api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

# File lib/middleman-blog/uri_templates.rb, line 54
def safe_parameterize(str, sep = '-')
  # Remove ending ?
  str = str.to_s.gsub(/\?$/, '')

  # Reimplementation of http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize that preserves un-transliterate-able multibyte chars.
  parameterized_string = ::ActiveSupport::Inflector.transliterate(str.to_s).downcase
  parameterized_string.gsub!(/[^a-z0-9\-_\?]+/, sep)

  # Check for multibytes and sub back in
  parameterized_string.chars.to_a.each_with_index do |char, i|
    next unless char == '?' && str[i].bytes.count != 1

    parameterized_string[i] = str[i]
  end

  re_sep = ::Regexp.escape(sep)

  # No more than one of the separator in a row.
  parameterized_string.gsub!(/#{re_sep}{2,}/, sep)

  # Remove leading/trailing separator.
  parameterized_string.gsub!(/^#{re_sep}|#{re_sep}$/, '')
  parameterized_string.tr!('_', '-')
  parameterized_string.delete!('?')

  # Replace all ?
  parameterized_string
end
uri_template(tmpl_src) click to toggle source

Given a URI template string, make an Addressable::Template This supports the legacy middleman-blog/Sinatra style :colon URI templates as well as RFC6570 templates.

@param [String] tmpl_src URI template source @return [Addressable::Template] a URI template

# File lib/middleman-blog/uri_templates.rb, line 20
def uri_template(tmpl_src)
  # Support the RFC6470 templates directly if people use them
  tmpl_src = tmpl_src.gsub(/:([A-Za-z0-9]+)/, '{\1}') if tmpl_src.include?(':')

  Addressable::Template.new ::Middleman::Util.normalize_path(tmpl_src)
end