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
-
.apply_uri_template(template, data) ⇒ String
Apply a URI template with the given data, producing a normalized Middleman path.
-
.date_to_params(date) ⇒ Hash
Convert a date into a hash of components to strings suitable for using in a URL template.
- .extract_directory_path(article_path) ⇒ Object
-
.extract_params(template, path) ⇒ Object
Use a template to extract parameters from a path, and validate some special (date) keys.
-
.safe_parameterize(str, sep = '-') ⇒ Object
Parametrize a string preserving any multi-byte characters Reimplementation of this, preserves un-transliterate-able multibyte chars.
-
.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.
Class Method Details
.apply_uri_template(template, data) ⇒ String
Apply a URI template with the given data, producing a normalized Middleman 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.(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.
96 97 98 99 100 101 102 |
# File 'lib/middleman-blog/uri_templates.rb', line 96 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
107 108 109 110 111 112 |
# File 'lib/middleman-blog/uri_templates.rb', line 107 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.
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 85 86 87 |
# 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}$/, '') # Replace all _ with - parameterized_string.tr!('_', '-') # Delete all ? parameterized_string.delete!('?') 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.
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 |