Class: Sitemap

Inherits:
Middleman::Extension
  • Object
show all
Defined in:
lib/middleman-sitemap/extension.rb

Overview

Extension namespace

Instance Method Summary collapse

Constructor Details

#initialize(app, options_hash = {}, &block) ⇒ Sitemap

Returns a new instance of Sitemap.



6
7
8
9
10
11
12
13
14
15
# File 'lib/middleman-sitemap/extension.rb', line 6

def initialize(app, options_hash={}, &block)
  # Call super to build options from the options_hash
  super

  # Require libraries only when activated
  require 'erb'

  # set up your extension
  # puts options.my_option
end

Instance Method Details

#after_build(builder) ⇒ Object



17
18
19
20
# File 'lib/middleman-sitemap/extension.rb', line 17

def after_build(builder)
  @builder = builder
  generate_sitemap
end

#build_multiple_sitemaps(pages) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/middleman-sitemap/extension.rb', line 69

def build_multiple_sitemaps(pages)
  built_sitemaps = []
  total_sitemaps = (pages.count / 50000.0).ceil
  pages_per_sitemap = (50000.0 / total_sitemaps).ceil
  built_sitemaps << build_sitemap_index(total_sitemaps)
  1.upto(total_sitemaps) do |i|
    sitemap_pages = pages[((i - 1) * pages_per_sitemap)...(i * pages_per_sitemap)]
    built_sitemaps << build_sitemap("sitemap#{i}.xml", sitemap_pages)
  end

  return built_sitemaps
end

#build_sitemap(name, pages) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/middleman-sitemap/extension.rb', line 54

def build_sitemap(name, pages)
  @pages = pages
  @hostname = options.hostname
  templates_path = File.expand_path(File.join("#{File.dirname(__FILE__)}", "../../templates/sitemap.xml.erb"))
  template = Tilt::ERBTemplate.new(templates_path, 0, :trim => '>')
  sitemap = template.render(self)

  outfile = File.join(app.build_dir, name)
  File.open(outfile, 'w') {|f| f.write(sitemap) }

  @builder.say_status :create, "build/#{name}"

  return "build/#{name}"
end

#build_sitemap_index(number_of_sitemaps) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/middleman-sitemap/extension.rb', line 39

def build_sitemap_index(number_of_sitemaps)
  @hostname = options.hostname
  @sitemaps = number_of_sitemaps
  @ext = options.gzip ? ".xml.gz" : ".xml"
  template = Tilt::ERBTemplate.new(File.expand_path(File.join("#{File.dirname(__FILE__)}", "../../templates/sitemapindex.xml.erb")))
  sitemap = template.render(self)

  outfile = File.join(app.build_dir, "sitemap.xml")
  File.open(outfile, 'w') {|f| f.write(sitemap) }

  @builder.say_status :create, "build/sitemap.xml"

  return "build/sitemap.xml"
end

#encode(path) ⇒ Object

Returns a URL with proper HTML entities



93
94
95
96
# File 'lib/middleman-sitemap/extension.rb', line 93

def encode(path)
  str = path.split("/").map { |f| app.escape_html(f) }.join("/")
  return str
end

#generate_sitemapObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/middleman-sitemap/extension.rb', line 22

def generate_sitemap
  pages = app.sitemap.resources.find_all{ |p| p.ext == ".html" }

  if pages.count > 50000
    sitemaps = build_multiple_sitemaps(pages)
  else
    sitemaps = [build_sitemap("sitemap.xml", pages)]
  end

  if options.gzip
    sitemaps.each do |sitemap|
      gzip_file(sitemap)
      @builder.say_status :create, "#{sitemap}.gz" if @builder
    end
  end
end

#gzip_file(sitemap) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/middleman-sitemap/extension.rb', line 82

def gzip_file(sitemap)
  require 'zlib'
  content = File.read(sitemap)
  File.open("#{sitemap}.gz", 'wb') do |f|
    gz = Zlib::GzipWriter.new(f, Zlib::BEST_COMPRESSION)
    gz.write content
    gz.close
  end
end