sitemap_generator 5.3.1 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/CHANGES.md +31 -0
- data/MIT-LICENSE +1 -1
- data/README.md +204 -223
- data/VERSION +1 -1
- data/lib/capistrano/tasks/sitemap_generator.cap +3 -3
- data/lib/sitemap_generator.rb +12 -10
- data/lib/sitemap_generator/adapters/aws_sdk_adapter.rb +44 -29
- data/lib/sitemap_generator/adapters/file_adapter.rb +1 -2
- data/lib/sitemap_generator/adapters/fog_adapter.rb +9 -5
- data/lib/sitemap_generator/adapters/google_storage_adapter.rb +37 -0
- data/lib/sitemap_generator/adapters/s3_adapter.rb +14 -11
- data/lib/sitemap_generator/adapters/wave_adapter.rb +4 -4
- data/lib/sitemap_generator/application.rb +6 -9
- data/lib/sitemap_generator/builder/sitemap_index_file.rb +1 -0
- data/lib/sitemap_generator/core_ext/big_decimal.rb +17 -7
- data/lib/sitemap_generator/interpreter.rb +6 -4
- data/lib/sitemap_generator/link_set.rb +8 -4
- data/lib/sitemap_generator/templates.rb +2 -2
- metadata +70 -28
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
6.1.1
|
@@ -1,7 +1,7 @@
|
|
1
1
|
namespace :sitemap do
|
2
2
|
desc 'Create sitemap and ping search engines'
|
3
3
|
task :refresh do
|
4
|
-
on roles :web do
|
4
|
+
on roles fetch(:sitemap_roles, :web) do
|
5
5
|
within release_path do
|
6
6
|
with rails_env: (fetch(:rails_env) || fetch(:stage)) do
|
7
7
|
execute :rake, "sitemap:refresh"
|
@@ -12,7 +12,7 @@ namespace :sitemap do
|
|
12
12
|
|
13
13
|
desc 'Create sitemap without pinging search engines'
|
14
14
|
task :create do
|
15
|
-
on roles :web do
|
15
|
+
on roles fetch(:sitemap_roles, :web) do
|
16
16
|
within release_path do
|
17
17
|
with rails_env: (fetch(:rails_env) || fetch(:stage)) do
|
18
18
|
execute :rake, "sitemap:create"
|
@@ -23,7 +23,7 @@ namespace :sitemap do
|
|
23
23
|
|
24
24
|
desc 'Clean up sitemaps in sitemap_generator path'
|
25
25
|
task :clean do
|
26
|
-
on roles :web do
|
26
|
+
on roles fetch(:sitemap_roles, :web) do
|
27
27
|
within release_path do
|
28
28
|
with rails_env: (fetch(:rails_env) || fetch(:stage)) do
|
29
29
|
execute :rake, "sitemap:clean"
|
data/lib/sitemap_generator.rb
CHANGED
@@ -7,14 +7,15 @@ require 'sitemap_generator/application'
|
|
7
7
|
require 'sitemap_generator/sitemap_location'
|
8
8
|
|
9
9
|
module SitemapGenerator
|
10
|
-
autoload(:Interpreter,
|
11
|
-
autoload(:FileAdapter,
|
12
|
-
autoload(:S3Adapter,
|
13
|
-
autoload(:AwsSdkAdapter,
|
14
|
-
autoload(:WaveAdapter,
|
15
|
-
autoload(:FogAdapter,
|
16
|
-
autoload(:
|
17
|
-
autoload(:
|
10
|
+
autoload(:Interpreter, 'sitemap_generator/interpreter')
|
11
|
+
autoload(:FileAdapter, 'sitemap_generator/adapters/file_adapter')
|
12
|
+
autoload(:S3Adapter, 'sitemap_generator/adapters/s3_adapter')
|
13
|
+
autoload(:AwsSdkAdapter, 'sitemap_generator/adapters/aws_sdk_adapter')
|
14
|
+
autoload(:WaveAdapter, 'sitemap_generator/adapters/wave_adapter')
|
15
|
+
autoload(:FogAdapter, 'sitemap_generator/adapters/fog_adapter')
|
16
|
+
autoload(:GoogleStorageAdapter, 'sitemap_generator/adapters/google_storage_adapter')
|
17
|
+
autoload(:BigDecimal, 'sitemap_generator/core_ext/big_decimal')
|
18
|
+
autoload(:Numeric, 'sitemap_generator/core_ext/numeric')
|
18
19
|
|
19
20
|
SitemapError = Class.new(StandardError)
|
20
21
|
SitemapFullError = Class.new(SitemapError)
|
@@ -26,7 +27,7 @@ module SitemapGenerator
|
|
26
27
|
MAX_SITEMAP_LINKS = 50_000 # max links per sitemap
|
27
28
|
MAX_SITEMAP_IMAGES = 1_000 # max images per url
|
28
29
|
MAX_SITEMAP_NEWS = 1_000 # max news sitemap per index_file
|
29
|
-
MAX_SITEMAP_FILESIZE =
|
30
|
+
MAX_SITEMAP_FILESIZE = 50_000_000 # bytes
|
30
31
|
SCHEMAS = {
|
31
32
|
'image' => 'http://www.google.com/schemas/sitemap-image/1.1',
|
32
33
|
'mobile' => 'http://www.google.com/schemas/sitemap-mobile/1.0',
|
@@ -56,6 +57,7 @@ module SitemapGenerator
|
|
56
57
|
attr_accessor :root, :app, :templates
|
57
58
|
attr_writer :yield_sitemap, :verbose
|
58
59
|
end
|
60
|
+
@yield_sitemap = nil
|
59
61
|
|
60
62
|
# Global default for the verbose setting.
|
61
63
|
def self.verbose
|
@@ -82,4 +84,4 @@ module SitemapGenerator
|
|
82
84
|
self.app = SitemapGenerator::Application.new
|
83
85
|
end
|
84
86
|
|
85
|
-
require 'sitemap_generator/railtie' if SitemapGenerator.app.
|
87
|
+
require 'sitemap_generator/railtie' if SitemapGenerator.app.is_at_least_rails3?
|
@@ -1,45 +1,60 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
raise LoadError.new("Missing required 'aws-sdk'. Please 'gem install "\
|
5
|
-
"aws-sdk' and require it in your application, or "\
|
6
|
-
"add: gem 'aws-sdk' to your Gemfile.")
|
1
|
+
if !defined?(Aws::S3::Resource) or !defined?(Aws::Credentials)
|
2
|
+
raise "Error: `Aws::S3::Resource` and/or `Aws::Credentials` are not defined.\n\n"\
|
3
|
+
"Please `require 'aws-sdk'` - or another library that defines these classes."
|
7
4
|
end
|
8
5
|
|
9
6
|
module SitemapGenerator
|
10
|
-
# Class for uploading
|
7
|
+
# Class for uploading sitemaps to an S3 bucket using the AWS SDK gem.
|
11
8
|
class AwsSdkAdapter
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
9
|
+
# Specify your AWS bucket name, credentials, and/or region. By default
|
10
|
+
# the AWS SDK will auto-detect your credentials and region, but you can use
|
11
|
+
# the following options to configure - or override - them manually:
|
12
|
+
#
|
13
|
+
# Options:
|
14
|
+
# :aws_access_key_id [String] Your AWS access key id
|
15
|
+
# :aws_secret_access_key [String] Your AWS secret access key
|
16
|
+
# :aws_region [String] Your AWS region
|
17
|
+
#
|
18
|
+
# Requires Aws::S3::Resource and Aws::Credentials to be defined.
|
19
|
+
#
|
20
|
+
# @param [String] bucket Name of the S3 bucket
|
21
|
+
# @param [Hash] options AWS credential overrides, see above
|
22
|
+
def initialize(bucket, options = {})
|
19
23
|
@bucket = bucket
|
20
|
-
|
21
|
-
@
|
22
|
-
@aws_region =
|
23
|
-
@
|
24
|
-
|
25
|
-
@path = opts[:path] || 'sitemaps/'
|
24
|
+
@aws_access_key_id = options[:aws_access_key_id]
|
25
|
+
@aws_secret_access_key = options[:aws_secret_access_key]
|
26
|
+
@aws_region = options[:aws_region]
|
27
|
+
@aws_endpoint = options[:aws_endpoint]
|
26
28
|
end
|
27
29
|
|
28
30
|
# Call with a SitemapLocation and string data
|
29
31
|
def write(location, raw_data)
|
30
32
|
SitemapGenerator::FileAdapter.new.write(location, raw_data)
|
33
|
+
s3_object = s3_resource.bucket(@bucket).object(location.path_in_public)
|
34
|
+
s3_object.upload_file(location.path,
|
35
|
+
acl: 'public-read',
|
36
|
+
cache_control: 'private, max-age=0, no-cache',
|
37
|
+
content_type: location[:compress] ? 'application/x-gzip' : 'application/xml'
|
38
|
+
)
|
39
|
+
end
|
31
40
|
|
32
|
-
|
33
|
-
s3 = Aws::S3::Resource.new(credentials: credentials, region: @aws_region)
|
41
|
+
private
|
34
42
|
|
35
|
-
|
36
|
-
|
43
|
+
def s3_resource
|
44
|
+
@s3_resource ||= Aws::S3::Resource.new(s3_resource_options)
|
45
|
+
end
|
37
46
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
47
|
+
def s3_resource_options
|
48
|
+
options = {}
|
49
|
+
options[:region] = @aws_region if !@aws_region.nil?
|
50
|
+
options[:endpoint] = @aws_endpoint if !@aws_endpoint.nil?
|
51
|
+
if !@aws_access_key_id.nil? && !@aws_secret_access_key.nil?
|
52
|
+
options[:credentials] = Aws::Credentials.new(
|
53
|
+
@aws_access_key_id,
|
54
|
+
@aws_secret_access_key
|
55
|
+
)
|
56
|
+
end
|
57
|
+
options
|
43
58
|
end
|
44
59
|
end
|
45
60
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module SitemapGenerator
|
2
2
|
# Class for writing out data to a file.
|
3
3
|
class FileAdapter
|
4
|
-
|
5
4
|
# Write data to a file.
|
6
5
|
# @param location - File object giving the full path and file name of the file.
|
7
6
|
# If the location specifies a directory(ies) which does not exist, the directory(ies)
|
@@ -12,7 +11,7 @@ module SitemapGenerator
|
|
12
11
|
def write(location, raw_data)
|
13
12
|
# Ensure that the directory exists
|
14
13
|
dir = location.directory
|
15
|
-
if !File.
|
14
|
+
if !File.exist?(dir)
|
16
15
|
FileUtils.mkdir_p(dir)
|
17
16
|
elsif !File.directory?(dir)
|
18
17
|
raise SitemapError.new("#{dir} should be a directory!")
|
@@ -1,12 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
raise LoadError.new("Missing required 'fog'. Please 'gem install fog' and require it in your application.")
|
1
|
+
if !defined?(Fog::Storage)
|
2
|
+
raise "Error: `Fog::Storage` is not defined.\n\n"\
|
3
|
+
"Please `require 'fog'` - or another library that defines this class."
|
5
4
|
end
|
6
5
|
|
7
6
|
module SitemapGenerator
|
7
|
+
# Class for uploading sitemaps to a Fog supported endpoint.
|
8
8
|
class FogAdapter
|
9
|
-
|
9
|
+
# Requires Fog::Storage to be defined.
|
10
|
+
#
|
11
|
+
# @param [Hash] opts Fog configuration options
|
12
|
+
# @option :fog_credentials [Hash] Credentials for connecting to the remote server
|
13
|
+
# @option :fog_directory [String] Your AWS S3 bucket or similar directory name
|
10
14
|
def initialize(opts = {})
|
11
15
|
@fog_credentials = opts[:fog_credentials]
|
12
16
|
@fog_directory = opts[:fog_directory]
|
@@ -0,0 +1,37 @@
|
|
1
|
+
if !defined?(Google::Cloud::Storage)
|
2
|
+
raise "Error: `Google::Cloud::Storage` is not defined.\n\n"\
|
3
|
+
"Please `require 'google/cloud/storage'` - or another library that defines this class."
|
4
|
+
end
|
5
|
+
|
6
|
+
module SitemapGenerator
|
7
|
+
# Class for uploading sitemaps to a Google Storage using `google-cloud-storage` gem.
|
8
|
+
class GoogleStorageAdapter
|
9
|
+
# Requires Google::Cloud::Storage to be defined.
|
10
|
+
#
|
11
|
+
# @param [Hash] opts Google::Cloud::Storage configuration options.
|
12
|
+
# @option :bucket [String] Required. Name of Google Storage Bucket where the file is to be uploaded.
|
13
|
+
#
|
14
|
+
# All options other than the `:bucket` option are passed to the `Google::Cloud::Storage.new`
|
15
|
+
# initializer. See https://googleapis.dev/ruby/google-cloud-storage/latest/file.AUTHENTICATION.html
|
16
|
+
# for all the supported environment variables and https://github.com/googleapis/google-cloud-ruby/blob/master/google-cloud-storage/lib/google/cloud/storage.rb
|
17
|
+
# for supported options.
|
18
|
+
#
|
19
|
+
# Suggested Options:
|
20
|
+
# @option :credentials [String] Path to Google service account JSON file, or JSON contents.
|
21
|
+
# @option :project_id [String] Google Accounts project id where the storage bucket resides.
|
22
|
+
def initialize(opts = {})
|
23
|
+
opts = opts.clone
|
24
|
+
@bucket = opts.delete(:bucket)
|
25
|
+
@storage_options = opts
|
26
|
+
end
|
27
|
+
|
28
|
+
# Call with a SitemapLocation and string data
|
29
|
+
def write(location, raw_data)
|
30
|
+
SitemapGenerator::FileAdapter.new.write(location, raw_data)
|
31
|
+
|
32
|
+
storage = Google::Cloud::Storage.new(@storage_options)
|
33
|
+
bucket = storage.bucket(@bucket)
|
34
|
+
bucket.create_file(location.path, location.path_in_public, acl: 'public')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,17 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'fog/core/services_mixin' rescue nil
|
5
|
-
|
6
|
-
begin
|
7
|
-
require 'fog/storage'
|
8
|
-
rescue LoadError
|
9
|
-
raise LoadError.new("Missing required 'fog-aws'. Please 'gem install fog-aws' and require it in your application.")
|
1
|
+
if !defined?(Fog::Storage)
|
2
|
+
raise "Error: `Fog::Storage` is not defined.\n\n"\
|
3
|
+
"Please `require 'fog-aws'` - or another library that defines this class."
|
10
4
|
end
|
11
5
|
|
12
6
|
module SitemapGenerator
|
7
|
+
# Class for uploading sitemaps to an S3 bucket using the Fog gem.
|
13
8
|
class S3Adapter
|
14
|
-
|
9
|
+
# Requires Fog::Storage to be defined.
|
10
|
+
#
|
11
|
+
# @param [Hash] opts Fog configuration options
|
12
|
+
# @option :aws_access_key_id [String] Your AWS access key id
|
13
|
+
# @option :aws_secret_access_key [String] Your AWS secret access key
|
14
|
+
# @option :fog_provider [String]
|
15
|
+
# @option :fog_directory [String]
|
16
|
+
# @option :fog_region [String]
|
17
|
+
# @option :fog_path_style [String]
|
18
|
+
# @option :fog_storage_options [Hash] Other options to pass to `Fog::Storage`
|
15
19
|
def initialize(opts = {})
|
16
20
|
@aws_access_key_id = opts[:aws_access_key_id] || ENV['AWS_ACCESS_KEY_ID']
|
17
21
|
@aws_secret_access_key = opts[:aws_secret_access_key] || ENV['AWS_SECRET_ACCESS_KEY']
|
@@ -46,6 +50,5 @@ module SitemapGenerator
|
|
46
50
|
:public => true
|
47
51
|
)
|
48
52
|
end
|
49
|
-
|
50
53
|
end
|
51
54
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
raise LoadError.new("Missing required 'carrierwave'. Please 'gem install carrierwave' and require it in your application.")
|
1
|
+
if !defined?(::CarrierWave::Uploader::Base)
|
2
|
+
raise "Error: `CarrierWave::Uploader::Base` is not defined.\n\n"\
|
3
|
+
"Please `require 'carrierwave'` - or another library that defines this class."
|
5
4
|
end
|
6
5
|
|
7
6
|
module SitemapGenerator
|
7
|
+
# Class for uploading sitemaps to a remote server using the CarrierWave gem.
|
8
8
|
class WaveAdapter < ::CarrierWave::Uploader::Base
|
9
9
|
attr_accessor :store_dir
|
10
10
|
|
@@ -2,15 +2,15 @@ require 'pathname'
|
|
2
2
|
|
3
3
|
module SitemapGenerator
|
4
4
|
class Application
|
5
|
-
def
|
5
|
+
def is_rails?
|
6
6
|
!!defined?(Rails::VERSION)
|
7
7
|
end
|
8
8
|
|
9
9
|
# Returns a boolean indicating whether this environment is Rails 3
|
10
10
|
#
|
11
11
|
# @return [Boolean]
|
12
|
-
def
|
13
|
-
|
12
|
+
def is_at_least_rails3?
|
13
|
+
is_rails? && Rails.version.to_f >= 3
|
14
14
|
rescue
|
15
15
|
false # Rails.version defined in 2.1.0
|
16
16
|
end
|
@@ -27,12 +27,9 @@ module SitemapGenerator
|
|
27
27
|
#
|
28
28
|
# @return [String, nil]
|
29
29
|
def rails_root
|
30
|
-
if defined?(::Rails.root)
|
31
|
-
return ::Rails.root.to_s if ::Rails.root
|
32
|
-
raise "ERROR: Rails.root is nil!"
|
33
|
-
end
|
30
|
+
return ::Rails.root.to_s if defined?(::Rails.root) && ::Rails.root
|
34
31
|
return RAILS_ROOT.to_s if defined?(RAILS_ROOT)
|
35
|
-
|
32
|
+
nil
|
36
33
|
end
|
37
34
|
|
38
35
|
# Returns the environment of the Rails application,
|
@@ -43,7 +40,7 @@ module SitemapGenerator
|
|
43
40
|
def rails_env
|
44
41
|
return ::Rails.env.to_s if defined?(::Rails.env)
|
45
42
|
return RAILS_ENV.to_s if defined?(RAILS_ENV)
|
46
|
-
|
43
|
+
nil
|
47
44
|
end
|
48
45
|
end
|
49
46
|
end
|
@@ -8,18 +8,30 @@ end
|
|
8
8
|
require 'yaml'
|
9
9
|
|
10
10
|
# Define our own class rather than modify the global class
|
11
|
-
class SitemapGenerator::BigDecimal
|
11
|
+
class SitemapGenerator::BigDecimal
|
12
12
|
YAML_TAG = 'tag:yaml.org,2002:float'
|
13
13
|
YAML_MAPPING = { 'Infinity' => '.Inf', '-Infinity' => '-.Inf', 'NaN' => '.NaN' }
|
14
14
|
|
15
|
-
|
15
|
+
yaml_tag YAML_TAG
|
16
|
+
|
17
|
+
def initialize(num)
|
18
|
+
@value = BigDecimal(num)
|
19
|
+
end
|
20
|
+
|
21
|
+
def *(other)
|
22
|
+
other * @value
|
23
|
+
end
|
24
|
+
|
25
|
+
def /(other)
|
26
|
+
SitemapGenerator::BigDecimal === other ? @value / other.instance_variable_get(:@value) : @value / other
|
27
|
+
end
|
16
28
|
|
17
29
|
# This emits the number without any scientific notation.
|
18
30
|
# This is better than self.to_f.to_s since it doesn't lose precision.
|
19
31
|
#
|
20
32
|
# Note that reconstituting YAML floats to native floats may lose precision.
|
21
33
|
def to_yaml(opts = {})
|
22
|
-
return super
|
34
|
+
return super unless defined?(YAML::ENGINE) && YAML::ENGINE.syck?
|
23
35
|
|
24
36
|
YAML.quick_emit(nil, opts) do |out|
|
25
37
|
string = to_s
|
@@ -37,9 +49,7 @@ class SitemapGenerator::BigDecimal < BigDecimal
|
|
37
49
|
end
|
38
50
|
|
39
51
|
DEFAULT_STRING_FORMAT = 'F'
|
40
|
-
def
|
41
|
-
|
52
|
+
def to_s(format = DEFAULT_STRING_FORMAT)
|
53
|
+
@value.to_s(format)
|
42
54
|
end
|
43
|
-
alias_method :_original_to_s, :to_s
|
44
|
-
alias_method :to_s, :to_formatted_s
|
45
55
|
end
|
@@ -6,9 +6,11 @@ module SitemapGenerator
|
|
6
6
|
# and API methods available to it.
|
7
7
|
class Interpreter
|
8
8
|
|
9
|
-
if SitemapGenerator.app.
|
10
|
-
|
11
|
-
|
9
|
+
if SitemapGenerator.app.is_at_least_rails3?
|
10
|
+
if !::Rails.application.nil?
|
11
|
+
include ::Rails.application.routes.url_helpers
|
12
|
+
end
|
13
|
+
elsif SitemapGenerator.app.is_rails?
|
12
14
|
require 'action_controller'
|
13
15
|
include ActionController::UrlWriter
|
14
16
|
end
|
@@ -34,7 +36,7 @@ module SitemapGenerator
|
|
34
36
|
def add_to_index(*args)
|
35
37
|
@linkset.add_to_index(*args)
|
36
38
|
end
|
37
|
-
|
39
|
+
|
38
40
|
# Start a new group of sitemaps. Any of the options to SitemapGenerator.new may
|
39
41
|
# be passed. Pass a block with calls to +add+ to add links to the sitemaps.
|
40
42
|
#
|
@@ -118,6 +118,8 @@ module SitemapGenerator
|
|
118
118
|
# Note: When adding a new option be sure to include it in `options_for_group()` if
|
119
119
|
# the option should be inherited by groups.
|
120
120
|
def initialize(options={})
|
121
|
+
@default_host, @sitemaps_host, @yield_sitemap, @sitemaps_path, @adapter, @verbose, @protect_index, @sitemap_index, @added_default_links, @created_group, @sitemap = nil
|
122
|
+
|
121
123
|
options = SitemapGenerator::Utilities.reverse_merge(options,
|
122
124
|
:include_root => true,
|
123
125
|
:include_index => false,
|
@@ -217,6 +219,7 @@ module SitemapGenerator
|
|
217
219
|
@sitemap.location.merge!(@group.sitemap_location)
|
218
220
|
if block_given?
|
219
221
|
@group.interpreter.eval(:yield_sitemap => @yield_sitemap || SitemapGenerator.yield_sitemap?, &block)
|
222
|
+
@group.finalize_sitemap!
|
220
223
|
@sitemap.location.merge!(@original_location)
|
221
224
|
end
|
222
225
|
else
|
@@ -292,7 +295,7 @@ module SitemapGenerator
|
|
292
295
|
name = Utilities.titleize(engine.to_s)
|
293
296
|
begin
|
294
297
|
Timeout::timeout(10) {
|
295
|
-
open(link)
|
298
|
+
URI.open(link)
|
296
299
|
}
|
297
300
|
output(" Successful ping of #{name}")
|
298
301
|
rescue Timeout::Error, StandardError => e
|
@@ -430,13 +433,14 @@ module SitemapGenerator
|
|
430
433
|
# Add default links if those options are turned on. Record the fact that we have done so
|
431
434
|
# in an instance variable.
|
432
435
|
def add_default_links
|
436
|
+
@added_default_links = true
|
437
|
+
link_options = { :lastmod => Time.now, :changefreq => 'always', :priority => 1.0 }
|
433
438
|
if include_root?
|
434
|
-
|
439
|
+
add('/', link_options)
|
435
440
|
end
|
436
441
|
if include_index?
|
437
|
-
|
442
|
+
add(sitemap_index, link_options)
|
438
443
|
end
|
439
|
-
@added_default_links = true
|
440
444
|
end
|
441
445
|
|
442
446
|
# Finalize a sitemap by including it in the index and outputting a summary line.
|