Class: SitemapGenerator::Builder::SitemapIndexFile

Inherits:
SitemapFile
  • Object
show all
Defined in:
lib/sitemap_generator/builder/sitemap_index_file.rb

Constant Summary

Constants included from Helpers::NumberHelper

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

Instance Attribute Summary

Attributes inherited from SitemapFile

#filesize, #link_count, #location, #news_count

Instance Method Summary collapse

Methods inherited from SitemapFile

#empty?, #finalized?, #lastmod, #max_sitemap_links, #new, #reserve_name, #reserved_name?, #written?

Methods included from Helpers::NumberHelper

#number_to_human_size, #number_with_delimiter, #number_with_precision

Constructor Details

#initialize(opts = {}) ⇒ SitemapIndexFile

Options

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



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
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 11

def initialize(opts={})
  @location = opts.is_a?(Hash) ? SitemapGenerator::SitemapIndexLocation.new(opts) : opts
  @link_count = 0
  @sitemaps_link_count = 0
  @xml_content = +'' # XML urlset content
  @xml_wrapper_start = +<<-HTML
    <?xml version="1.0" encoding="UTF-8"?>
      <sitemapindex
        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/siteindex.xsd"
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      >
  HTML
  @xml_wrapper_start.gsub!(/\s+/, ' ').gsub!(/ *> */, '>').strip!
  @xml_wrapper_end   = %q[</sitemapindex>]
  @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
  @first_sitemap = nil # reference to the first thing added to this index
  # Store the URL of the first sitemap added because if create_index is
  # false this is the "index" URL
  @first_sitemap_url = nil
  @create_index = nil
end

Instance Method Details

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



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 50

def add(link, options={})
  if file = link.is_a?(SitemapFile) && link
    @sitemaps_link_count += file.link_count
    file.finalize! unless file.finalized?

    # First link.  If it's a SitemapFile store a reference to it and the options
    # so that we can create a URL from it later.  We can't create the URL yet
    # because doing so fixes the sitemap file's name, and we have to wait to see
    # if we have more than one link in the index before we can know who gets the
    # first name (the index, or the sitemap).  If the item is not a SitemapFile,
    # then it has been manually added and we can be sure that the user intends
    # for there to be an index.
    if @link_count == 0
      @first_sitemap = SitemapGenerator::Builder::LinkHolder.new(file, options)
      @link_count += 1     # pretend it's added, but don't add it yet
    else
      # need an index so make sure name is reserved and first sitemap is written out
      reserve_name unless @location.create_index == false
      write_first_sitemap
      file.write
      super(SitemapGenerator::Builder::SitemapIndexUrl.new(file, options))
    end
  else
    # A link is being added manually.  Obviously the user wants an index.
    # This overrides the create_index setting.
    unless @location.create_index == false
      @create_index = true
      reserve_name
    end

    # Use the host from the location if none provided
    options[:host] ||= @location.host
    super(SitemapGenerator::Builder::SitemapIndexUrl.new(link, options))
  end
end

#create_index?Boolean

Whether or not we need to create an index file. True if create_index is true or if create_index is :auto and we have more than one link in the index. If a link is added manually and create_index is not false, we force index creation because they obviously intend for there to be an index. False otherwise.

Returns:

  • (Boolean)


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

def create_index?
  @create_index || @location.create_index == true || @location.create_index == :auto && @link_count > 1
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)


89
90
91
92
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 89

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

#finalize!Object



104
105
106
107
108
109
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 104

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

#index_urlObject

Return the index file URL. If create_index is true, this is the URL of the actual index file. If create_index is false, this is the URL of the first sitemap that was written out. Only call this method after the files have been finalized.



128
129
130
131
132
133
134
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 128

def index_url
  if create_index? || !@first_sitemap_url
    @location.url
  else
    @first_sitemap_url
  end
end

#stats_summary(opts = {}) ⇒ Object



99
100
101
102
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 99

def stats_summary(opts={})
  str = "Sitemap stats: #{number_with_delimiter(@sitemaps_link_count)} links / #{@link_count} sitemaps"
  str += " / %dm%02ds" % opts[:time_taken].divmod(60) if opts[:time_taken]
end

#super_addObject

Finalize sitemaps as they are added to the index. If it’s the first sitemap, finalize it but don’t write it out, because we don’t yet know if we need an index. If it’s the second sitemap, we know we need an index, so reserve a name for the index, and go and write out the first sitemap. If it’s the third or greater sitemap, just finalize and write it out as usual, nothing more needs to be done.

If a link is being added to the index manually as a string, then we can assume that the index is required (unless create_index is false of course). This seems like the logical thing to do.



49
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 49

alias_method :super_add, :add

Return the total number of links in all sitemaps reference by this index file



95
96
97
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 95

def total_link_count
  @sitemaps_link_count
end

#writeObject

Write out the index if an index is needed



112
113
114
# File 'lib/sitemap_generator/builder/sitemap_index_file.rb', line 112

def write
  super if create_index?
end