Class: SitemapGenerator::Builder::SitemapFile
- Inherits:
-
Object
- Object
- SitemapGenerator::Builder::SitemapFile
- 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
Constant Summary
Constant Summary
Constants included from Helpers::NumberHelper
Helpers::NumberHelper::DECIMAL_UNITS, Helpers::NumberHelper::STORAGE_UNITS
Instance Attribute Summary (collapse)
-
- (Object) filesize
readonly
Returns the value of attribute filesize.
-
- (Object) link_count
readonly
Returns the value of attribute link_count.
-
- (Object) location
readonly
Returns the value of attribute location.
-
- (Object) news_count
readonly
Returns the value of attribute news_count.
Instance Method Summary (collapse)
-
- (Object) add(link, options = {})
Add a link to the sitemap file.
- - (Boolean) empty?
-
- (Boolean) file_can_fit?(bytes)
Return a boolean indicating whether the sitemap file can fit another link of bytes bytes in size.
-
- (Object) finalize!
“Freeze” this object.
- - (Boolean) finalized?
-
- (SitemapFile) initialize(opts = {})
constructor
Options.
-
- (Object) lastmod
If a name has been reserved, use the last modified time from the file.
-
- (Object) new
Return a new instance of the sitemap file with the same options, and the next name in the sequence.
-
- (Object) reserve_name
Reserve a name from the namer unless one has already been reserved.
-
- (Boolean) reserved_name?
Return a boolean indicating whether a name has been reserved.
-
- (Object) summary(opts = {})
Return a summary string.
-
- (Object) write
Write out the sitemap and free up memory.
-
- (Boolean) written?
Return true if this file has been written out to disk.
Methods included from Helpers::NumberHelper
#number_to_human_size, #number_with_delimiter, #number_with_precision
Constructor Details
- (SitemapFile) initialize(opts = {})
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 |
# 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" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" 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:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:geo="http://www.google.com/geo/schemas/sitemap/1.0" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" 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
- (Object) filesize (readonly)
Returns the value of attribute filesize
16 17 18 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16 def filesize @filesize end |
- (Object) link_count (readonly)
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 |
- (Object) location (readonly)
Returns the value of attribute location
16 17 18 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 16 def location @location end |
- (Object) news_count (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
- (Object) add(link, options = {})
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.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 91 def add(link, ={}) raise SitemapGenerator::SitemapFinalizedError if finalized? sitemap_url = if link.is_a?(SitemapUrl) link else [:host] ||= @location.host SitemapUrl.new(link, ) 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 |
- (Boolean) empty?
60 61 62 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 60 def empty? @link_count == 0 end |
- (Boolean) file_can_fit?(bytes)
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.
67 68 69 70 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 67 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 |
- (Object) finalize!
“Freeze” this object. Actually just flags it as frozen.
A SitemapGenerator::SitemapFinalizedError exception is raised if the Sitemap has already been finalized.
118 119 120 121 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 118 def finalize! raise SitemapGenerator::SitemapFinalizedError if finalized? @frozen = true end |
- (Boolean) finalized?
123 124 125 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 123 def finalized? @frozen end |
- (Object) lastmod
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.
54 55 56 57 58 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 54 def lastmod File.mtime(location.path) if location.reserved_name? rescue nil end |
- (Object) new
Return a new instance of the sitemap file with the same options, and the next name in the sequence.
162 163 164 165 166 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 162 def new location = @location.dup location.delete(:filename) if location.namer self.class.new(location) end |
- (Object) reserve_name
Reserve a name from the namer unless one has already been reserved. Safe to call more than once.
151 152 153 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 151 def reserve_name @reserved_name ||= @location.reserve_name end |
- (Boolean) reserved_name?
Return a boolean indicating whether a name has been reserved
156 157 158 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 156 def reserved_name? !!@reserved_name end |
- (Object) summary(opts = {})
Return a summary string
169 170 171 172 173 174 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 169 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 |
- (Object) write
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.
134 135 136 137 138 139 140 141 142 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 134 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 |
- (Boolean) written?
Return true if this file has been written out to disk
145 146 147 |
# File 'lib/sitemap_generator/builder/sitemap_file.rb', line 145 def written? @written end |