Class: SitemapGenerator::Builder::SitemapFile

Inherits:
Object
  • Object
show all
Includes:
Helpers::NumberHelper
Defined in:
lib/sitemap_generator/builder/sitemap_file.rb

Overview

General Usage:

sitemap = SitemapFile.new(:location => SitemapLocation.new(...))
sitemap.add('/', { ... })    <- add a link to the sitemap
sitemap.finalize!            <- write the sitemap file and freeze the object to protect it from further modification

Direct Known Subclasses

SitemapIndexFile

Constant Summary

Constants included from Helpers::NumberHelper

Helpers::NumberHelper::DECIMAL_UNITS, Helpers::NumberHelper::STORAGE_UNITS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers::NumberHelper

#number_to_human_size, #number_with_delimiter, #number_with_precision

Constructor Details

#initialize(opts = {}) ⇒ SitemapFile

Options

  • location - a SitemapGenerator::SitemapLocation instance or a Hash of options from which a SitemapLocation will be created for you.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 22

def initialize(opts={})
  @location = opts.is_a?(Hash) ? SitemapGenerator::SitemapLocation.new(opts) : opts
  @link_count = 0
  @news_count = 0
  @xml_content = '' # XML urlset content
  @xml_wrapper_start = <<-HTML
    <?xml version="1.0" encoding="UTF-8"?>
      <urlset
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
          http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="#{SitemapGenerator::SCHEMAS['image']}"              
        xmlns:video="#{SitemapGenerator::SCHEMAS['video']}"
        xmlns:geo="#{SitemapGenerator::SCHEMAS['geo']}"
        xmlns:news="#{SitemapGenerator::SCHEMAS['news']}"
        xmlns:mobile="#{SitemapGenerator::SCHEMAS['mobile']}"
        xmlns:pagemap="#{SitemapGenerator::SCHEMAS['pagemap']}"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
      >
  HTML
  @xml_wrapper_start.gsub!(/\s+/, ' ').gsub!(/ *> */, '>').strip!
  @xml_wrapper_end   = %q[</urlset>]
  @filesize = bytesize(@xml_wrapper_start) + bytesize(@xml_wrapper_end)
  @written = false
  @reserved_name = nil # holds the name reserved from the namer
  @frozen = false      # rather than actually freeze, use this boolean
end

Instance Attribute Details

#filesizeObject (readonly)

Returns the value of attribute filesize.



16
17
18
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16

def filesize
  @filesize
end

Returns the value of attribute link_count.



16
17
18
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16

def link_count
  @link_count
end

#locationObject (readonly)

Returns the value of attribute location.



16
17
18
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16

def location
  @location
end

#news_countObject (readonly)

Returns the value of attribute news_count.



16
17
18
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16

def news_count
  @news_count
end

Instance Method Details

#add(link, options = {}) ⇒ Object

Add a link to the sitemap file.

If a link cannot be added, for example if the file is too large or the link limit has been reached, a SitemapGenerator::SitemapFullError exception is raised and the sitemap is finalized.

If the Sitemap has already been finalized a SitemapGenerator::SitemapFinalizedError exception is raised.

Return the new link count.

Call with:

sitemap_url - a SitemapUrl instance
sitemap, options - a Sitemap instance and options hash
path, options - a path for the URL and options hash.  For supported options
                see the SitemapGenerator::Builder::SitemapUrl class.

The link added to the sitemap will use the host from its location object if no host has been specified.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 92

def add(link, options={})
  raise SitemapGenerator::SitemapFinalizedError if finalized?

  sitemap_url = if link.is_a?(SitemapUrl)
    link
  else
    options[:host] ||= @location.host
    SitemapUrl.new(link, options)
  end

  xml = sitemap_url.to_xml
  raise SitemapGenerator::SitemapFullError if !file_can_fit?(xml)

  if sitemap_url.news?
    @news_count += 1
  end

  # Add the XML to the sitemap
  @xml_content << xml
  @filesize += bytesize(xml)
  @link_count += 1
end

#empty?Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 61

def empty?
  @link_count == 0
end

#file_can_fit?(bytes) ⇒ Boolean

Return a boolean indicating whether the sitemap file can fit another link of bytes bytes in size. You can also pass a string and the bytesize will be calculated for you.

Returns:

  • (Boolean)


68
69
70
71
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 68

def file_can_fit?(bytes)
  bytes = bytes.is_a?(String) ? bytesize(bytes) : bytes
  (@filesize + bytes) < SitemapGenerator::MAX_SITEMAP_FILESIZE && @link_count < SitemapGenerator::MAX_SITEMAP_LINKS && @news_count < SitemapGenerator::MAX_SITEMAP_NEWS
end

#finalize!Object

“Freeze” this object. Actually just flags it as frozen.

A SitemapGenerator::SitemapFinalizedError exception is raised if the Sitemap has already been finalized.



119
120
121
122
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 119

def finalize!
  raise SitemapGenerator::SitemapFinalizedError if finalized?
  @frozen = true
end

#finalized?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 124

def finalized?
  @frozen
end

#lastmodObject

If a name has been reserved, use the last modified time from the file. Otherwise return nil. We don’t want to prematurely assign a name for this sitemap if one has not yet been reserved, because we may mess up the name-assignment sequence.



55
56
57
58
59
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 55

def lastmod
  File.mtime(location.path) if location.reserved_name?
rescue
  nil
end

#newObject

Return a new instance of the sitemap file with the same options, and the next name in the sequence.



163
164
165
166
167
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 163

def new
  location = @location.dup
  location.delete(:filename) if location.namer
  self.class.new(location)
end

#reserve_nameObject

Reserve a name from the namer unless one has already been reserved. Safe to call more than once.



152
153
154
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 152

def reserve_name
  @reserved_name ||= @location.reserve_name
end

#reserved_name?Boolean

Return a boolean indicating whether a name has been reserved

Returns:

  • (Boolean)


157
158
159
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 157

def reserved_name?
  !!@reserved_name
end

#summary(opts = {}) ⇒ Object

Return a summary string



170
171
172
173
174
175
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 170

def summary(opts={})
  uncompressed_size = number_to_human_size(@filesize)
  compressed_size   = number_to_human_size(@location.filesize)
  path = ellipsis(@location.path_in_public, 47)
  "+ #{'%-47s' % path} #{'%10s' % @link_count} links / #{'%10s' % compressed_size}"
end

#writeObject

Write out the sitemap and free up memory.

All the xml content in the instance is cleared, but attributes like filesize are still available.

A SitemapGenerator::SitemapError exception is raised if the file has already been written.



135
136
137
138
139
140
141
142
143
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 135

def write
  raise SitemapGenerator::SitemapError.new("Sitemap already written!") if written?
  finalize! unless finalized?
  reserve_name
  @location.write(@xml_wrapper_start + @xml_content + @xml_wrapper_end)
  @xml_content = @xml_wrapper_start = @xml_wrapper_end = ''
  puts summary if @location.verbose?
  @written = true
end

#written?Boolean

Return true if this file has been written out to disk

Returns:

  • (Boolean)


146
147
148
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 146

def written?
  @written
end