Module: Bridgetown::Routes::Manifest

Defined in:
lib/bridgetown-routes/manifest.rb

Class Method Summary collapse

Class Method Details

.generate_manifest(site) ⇒ Object

rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/bridgetown-routes/manifest.rb', line 7

def generate_manifest(site) # rubocop:todo Metrics/AbcSize, Metrics/CyclomaticComplexity
  return @route_manifest[site.label] if @route_manifest && Bridgetown.env.production?

  new_manifest = []
  routable_extensions = site.config.routes.extensions.join(",")

  site.config.routes.source_paths.each do |routes_dir|
    routes_dir = File.expand_path(routes_dir, site.config.source)

    # @type [Array]
    routes = Dir.glob(
      routes_dir + "/**/*.{#{routable_extensions}}"
    ).filter_map do |file|
      if File.basename(file).start_with?("_", ".") ||
          File.basename(file, ".*").end_with?(".test")
        next
      end

      file_slug, segment_keys = file_slug_and_segments(site, routes_dir, file)

      # generate localized file slugs
      localized_file_slugs = generate_localized_file_slugs(site, file_slug)

      [file, localized_file_slugs, segment_keys]
    end

    new_manifest += sort_routes!(routes)
  end

  @route_manifest ||= {}
  @route_manifest[site.label] = new_manifest
end

.locale_for(slug, site) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/bridgetown-routes/manifest.rb', line 57

def locale_for(slug, site)
  possible_locale_segment = slug.split("/").first.to_sym

  if site.config.available_locales.include? possible_locale_segment
    possible_locale_segment
  else
    site.config.default_locale
  end
end

.sort_routes!(routes) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/bridgetown-routes/manifest.rb', line 40

def sort_routes!(routes)
  routes.sort! do |route_a, route_b|
    # @type [String]
    slug_a = route_a[1][0]
    # @type [String]
    slug_b = route_b[1][0]

    # @type [Integer]
    weight1 = slug_a.count("/") <=> slug_b.count("/")
    if weight1.zero?
      slug_b.count("/:") <=> slug_a.count("/:")
    else
      weight1
    end
  end.reverse!
end