Class: Bridgetown::Resource::PermalinkProcessor

Inherits:
Object
  • Object
show all
Defined in:
lib/bridgetown-core/resource/permalink_processor.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource) ⇒ PermalinkProcessor

Returns a new instance of PermalinkProcessor.



20
21
22
23
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 20

def initialize(resource)
  @resource = resource
  @slugify_mode = @resource.site.config.slugify_mode
end

Instance Attribute Details

#resourceBridgetown::Resource::Base



7
8
9
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 7

def resource
  @resource
end

#slugify_modeObject

Returns the value of attribute slugify_mode.



9
10
11
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 9

def slugify_mode
  @slugify_mode
end

Class Method Details

.placeholder_processorsObject



11
12
13
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 11

def self.placeholder_processors
  @placeholder_processors || {}
end

.register_placeholder(key, block) ⇒ Object



15
16
17
18
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 15

def self.register_placeholder(key, block)
  @placeholder_processors ||= {}
  @placeholder_processors[key] = block
end

Instance Method Details

#ensure_base_path(permalink) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 99

def ensure_base_path(permalink)
  if resource.site.base_path.present?
    return "#{resource.site.base_path(strip_slash_only: true)}#{permalink}"
  end

  permalink
end

#final_extObject



25
26
27
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 25

def final_ext
  resource.method(:destination).arity == 1 ? resource.extname : resource.destination.final_ext
end

Parameters:

  • new_url (String)
  • permalink (String)


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 83

def finalize_permalink(new_url, permalink)
  # Handle .* style permalinks or files not ending in .html
  if permalink.ends_with?(".*") || !%r{\.html?$}.match?(final_ext)
    "/#{new_url}#{final_ext}"
  # If permalink includes the file extension, add it back in to the URL
  elsif permalink =~ %r{\.[^/]*$}
    "/#{new_url}#{Regexp.last_match[0]}"
  # Ensure index-style URLs get output correctly
  elsif permalink.ends_with?("/")
    "/#{new_url}/".sub(%r{^/index/$}, "/")
  # We good :)
  else
    "/#{new_url}"
  end
end


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 64

def permalink_for_permalink_style(permalink_style)
  collection_prefix = ("/:collection" unless resource.collection.builtin?)

  case permalink_style.to_sym
  when :pretty
    "/:locale/#{collection_prefix}/:categories/:year/:month/:day/:slug/"
  when :pretty_ext, :date
    "/:locale/#{collection_prefix}/:categories/:year/:month/:day/:slug.*"
  when :simple
    "/:locale/#{collection_prefix}/:categories/:slug/"
  when :simple_ext
    "/:locale/#{collection_prefix}/:categories/:slug.*"
  else
    permalink_style.to_s
  end
end

#process_segment(segment) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 45

def process_segment(segment)
  segment = segment.to_sym
  if self.class.placeholder_processors[segment]
    segment_value = self.class.placeholder_processors[segment].(resource)
    case segment_value
    when Hash
      segment_value[:raw_value]
    when Array
      segment_value.map do |subsegment|
        Utils.slugify(subsegment, mode: slugify_mode)
      end.join("/")
    else
      Utils.slugify(segment_value, mode: slugify_mode)
    end
  else
    segment
  end
end

#transformObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/bridgetown-core/resource/permalink_processor.rb', line 29

def transform
  permalink = resource.data.permalink ||
    permalink_for_permalink_style(resource.collection.default_permalink)

  # Strip out file extension and process each segment of a URL to swap out
  # placeholders such as :categories or :title
  url_segments = Bridgetown::Filters::URLFilters.strip_extname(permalink).split("/")
  new_url = url_segments.map do |segment|
    segment.starts_with?(":") ? process_segment(segment.sub(%r{^:}, "")) : segment
  end.select(&:present?).join("/")
  # No relative URLs should ever end in /index.html
  new_url.sub!(%r{/index$}, "") if final_ext == ".html"

  ensure_base_path finalize_permalink(new_url, permalink)
end