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 = '</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
116
# 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.



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

def finalize!
  raise SitemapGenerator::SitemapFinalizedError if finalized?

  @frozen = true
end

#finalized?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 128

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


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

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.



167
168
169
170
171
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 167

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.



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

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

#reserved_name?Boolean

Return a boolean indicating whether a name has been reserved

Returns:

  • (Boolean)


161
162
163
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 161

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.



139
140
141
142
143
144
145
146
147
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 139

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)


150
151
152
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 150

def written?
  @written
end