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. See ‘SitemapGenerator::SitemapLocation` for the supported list of options.



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
50
51
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 25

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: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 = SitemapGenerator::Utilities.bytesize(@xml_wrapper_start) + SitemapGenerator::Utilities.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.



18
19
20
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 18

def filesize
  @filesize
end

Returns the value of attribute link_count.



18
19
20
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 18

def link_count
  @link_count
end

#locationObject (readonly)

Returns the value of attribute location.



18
19
20
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 18

def location
  @location
end

#news_countObject (readonly)

Returns the value of attribute news_count.



18
19
20
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 18

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.



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

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 += SitemapGenerator::Utilities.bytesize(xml)
  @link_count += 1
end

#empty?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 63

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)


70
71
72
73
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 70

def file_can_fit?(bytes)
  bytes = bytes.is_a?(String) ? SitemapGenerator::Utilities.bytesize(bytes) : bytes
  (@filesize + bytes) < SitemapGenerator::MAX_SITEMAP_FILESIZE && @link_count < 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.



121
122
123
124
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 121

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

#finalized?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 126

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.



57
58
59
60
61
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 57

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


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

def max_sitemap_links
  @location[:max_sitemap_links] || SitemapGenerator::MAX_SITEMAP_LINKS
end

#newObject

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



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

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.



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

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

#reserved_name?Boolean

Return a boolean indicating whether a name has been reserved

Returns:

  • (Boolean)


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

def reserved_name?
  !!@reserved_name
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.



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

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, link_count)
  @xml_content = @xml_wrapper_start = @xml_wrapper_end = ''
  @written = true
end

#written?Boolean

Return true if this file has been written out to disk

Returns:

  • (Boolean)


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

def written?
  @written
end