Module: Middleman::Blog::UriTemplates

Included in:
BlogData, CalendarPages, CustomPages, Paginator, TagPages, Cli::Article
Defined in:
lib/middleman-blog/uri_templates.rb

Overview

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

Class Method Summary collapse

Class Method Details

.apply_uri_template(template, data) ⇒ String

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

Parameters:

  • template (Addressable::Template)
  • data (Hash)

Returns:

  • (String)

    normalized path


38
39
40
# File 'lib/middleman-blog/uri_templates.rb', line 38

def apply_uri_template(template, data)
  ::Middleman::Util.normalize_path Addressable::URI.unencode(template.expand(data)).to_s
end

.date_to_params(date) ⇒ Hash

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

Parameters:

  • date (DateTime)

Returns:

  • (Hash)

    parameters


93
94
95
96
97
98
99
# File 'lib/middleman-blog/uri_templates.rb', line 93

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) ⇒ Object


104
105
106
107
108
109
# File 'lib/middleman-blog/uri_templates.rb', line 104

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) ⇒ Object

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

Parameters:

  • template (Addressable::Template)
  • path (String)

49
50
51
# File 'lib/middleman-blog/uri_templates.rb', line 49

def extract_params(template, path)
  template.extract(path, BlogTemplateProcessor)
end

.safe_parameterize(str, sep = '-') ⇒ Object

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


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/middleman-blog/uri_templates.rb', line 57

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) ⇒ Addressable::Template

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.

Parameters:

  • tmpl_src (String)

    URI template source

Returns:

  • (Addressable::Template)

    a URI template


23
24
25
26
27
28
# File 'lib/middleman-blog/uri_templates.rb', line 23

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