class Silly::UrlSlug

Attributes

convertable_extensions[R]

Public Class Methods

add_extensions(ext) click to toggle source
# File lib/silly/url_slug.rb, line 7
def add_extensions(ext)
  if ext.is_a?(Array)
    @convertable_extensions += ext
  else
    @convertable_extensions << ext
  end
end
new(opts) click to toggle source
# File lib/silly/url_slug.rb, line 16
def initialize(opts)
  @item = opts[:item]
  @scope =  @item.id.split('/').first
  @data = opts[:data]
  @format = opts[:format]

  parts = @item.id.split('/')
  parts.shift
  @scoped_id = parts.join('/')
end

Public Instance Methods

category() click to toggle source

Category is only the first one if multiple categories exist.

# File lib/silly/url_slug.rb, line 106
def category
  string = Array(@data['categories'])[0]
  return '' if string.to_s.empty?

  string.split('/').map { |c|
    Silly::StringFormat.clean_slug_and_escape(c)
  }.join('/')
end
data() click to toggle source
# File lib/silly/url_slug.rb, line 66
def data
  result = @data
  result = result.merge(date_data) if uses_date?

  result.merge({
    "filename"          => filename,
    "path"              => path,
    "relative_path"     => relative_path,
    "categories"        => category,
  })
end
date_data() click to toggle source
# File lib/silly/url_slug.rb, line 78
def date_data
  date = Time.parse(@data['date'].to_s)

  {
    "year"       => date.strftime("%Y"),
    "month"      => date.strftime("%m"),
    "day"        => date.strftime("%d"),
    "i_day"      => date.strftime("%d").to_i.to_s,
    "i_month"    => date.strftime("%m").to_i.to_s,
  }
rescue ArgumentError, TypeError
  raise(
    "ArgumentError:" +
    " The file '#{ @item.realpath }' has a permalink '#{ @format }'" +
    " which is date dependant but the date '#{ @data['date'] }' could not be parsed." +
    " Ensure the date's format is: 'YYYY-MM-DD'"
  )
end
dynamic() click to toggle source

@return the dynamic URL with token substitution.

# File lib/silly/url_slug.rb, line 42
def dynamic
  cache = data
  result = @format
            .gsub(/:[^\/\.]+/) { |a| cache[$&.gsub(':', '')] }
            .gsub('//', '/')
            .split('/')

  # this is ugly but I'm out of ideas. Help!
  last = result.pop
  if uses_extension?
    last = last
            .split('.')
            .map{ |a| Silly::StringFormat.clean_slug_and_escape(a) }
            .join('.')
  else
    last = Silly::StringFormat.clean_slug_and_escape(last)
  end

  result
    .map{ |a| Silly::StringFormat.clean_slug_and_escape(a) }
    .join('/') +
    "/#{ last }"
end
ext() click to toggle source
# File lib/silly/url_slug.rb, line 101
def ext
  @item.ext
end
filename() click to toggle source
# File lib/silly/url_slug.rb, line 97
def filename
  File.basename(@scoped_id, ext)
end
generate() click to toggle source

@return URL Slug based on the given data and format. The url should always have a preceeding slash “/some-url”

# File lib/silly/url_slug.rb, line 29
def generate
  url = @format.include?(':') ? dynamic : literal
  url = process_url_extension(url)

  url.to_s.start_with?('/') ? url : "/#{ url }"
end
literal() click to toggle source

@return the literal URL without token substitution.

# File lib/silly/url_slug.rb, line 37
def literal
  @format.gsub(/^\//, '').split('/').map {|p| CGI::escape(p) }.join('/')
end
path() click to toggle source
# File lib/silly/url_slug.rb, line 120
def path
  File.join(@scope, relative_path)
end
relative_path() click to toggle source
# File lib/silly/url_slug.rb, line 115
def relative_path
  string = File.dirname(@scoped_id)
  (string == ".") ? "" : string
end

Private Instance Methods

process_url_extension(url) click to toggle source

The url extension depends on multiple factors: user-config : preserve any extension set by the user in the format. converters : Automatically change convertable extensions to .html

Non-convertable file-extensions should 'pass-through'

@return

# File lib/silly/url_slug.rb, line 149
def process_url_extension(url)
  return url if uses_extension?

  url += self.class.convertable_extensions.include?(ext) ? '.html' : ext

  url.gsub(/index|index.html$/, '').gsub(/\.html$/, '')
end
uses_date?() click to toggle source
# File lib/silly/url_slug.rb, line 126
def uses_date?
  result = false
  %w{ :year :month :day :i_day :i_month }.each do |token|
    if @format.include?(token)
      result = true
      break
    end
  end

  result
end
uses_extension?() click to toggle source

Is an extension explicitly defined?

# File lib/silly/url_slug.rb, line 139
def uses_extension?
  @format =~ /\.[^\.]+$/
end