spinto 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,275 @@
1
+ # https://github.com/kinnetica/jekyll-plugins/blob/master/sitemap_generator.rb
2
+ #
3
+ # Sitemap.xml Generator is a Jekyll plugin that generates a sitemap.xml file by
4
+ # traversing all of the available posts and pages.
5
+ # pke: modified to use site.config['sitemap']['url'] instead of MY_URL
6
+ #
7
+ # How To Use:
8
+ # 1.) Copy source file into your _plugins folder within your Jekyll project.
9
+ # 2.) Set url or sitemap: url to reflect your domain name.
10
+ # 3.) Set sitemap: filename if you want your sitemap to be called something
11
+ # other than sitemap.xml.
12
+ # 4.) Change the PAGES_INCLUDE_POSTS list to include any pages that are looping
13
+ # through your posts (e.g. "index.html", "archive.html", etc.). This will
14
+ # ensure that right after you make a new post, the last modified date will
15
+ # be updated to reflect the new post.
16
+ # 5.) Run Jekyll: jekyll --server to re-generate your site.
17
+ # 6.) A sitemap.xml should be included in your _site folder.
18
+ #
19
+ # Customizations:
20
+ # 1.) If there are any files you don't want included in the sitemap, add them
21
+ # to the EXCLUDED_FILES list. The name should match the name of the source
22
+ # file.
23
+ # 2.) If you want to include the optional changefreq and priority attributes,
24
+ # simply include custom variables in the YAML Front Matter of that file.
25
+ # The names of these custom variables are defined below in the
26
+ # CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME and PRIORITY_CUSTOM_VARIABLE_NAME
27
+ # constants.
28
+ #
29
+ # Notes:
30
+ # 1.) The last modified date is determined by the latest from the following:
31
+ # system modified date of the page or post, system modified date of
32
+ # included layout, system modified date of included layout within that
33
+ # layout, ...
34
+ #
35
+ # Author: Michael Levin
36
+ # Site: http://www.kinnetica.com
37
+ # Distributed Under A Creative Commons License
38
+ # - http://creativecommons.org/licenses/by/3.0/
39
+
40
+ require 'rexml/document'
41
+
42
+ module Jekyll
43
+
44
+ # Change SITEMAP_FILE_NAME if you would like your sitemap file
45
+ # to be called something else
46
+ SITEMAP_FILE_NAME = "sitemap.xml"
47
+
48
+ # Any files to exclude from being included in the sitemap.xml
49
+ EXCLUDED_FILES = []
50
+
51
+ # Custom variable names for changefreq and priority elements
52
+ # These names are used within the YAML Front Matter of pages or posts
53
+ # for which you want to include these properties
54
+ CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME = "change_frequency"
55
+ PRIORITY_CUSTOM_VARIABLE_NAME = "priority"
56
+
57
+ # Recover from strange exception when starting server without --auto
58
+ class SitemapFile < StaticFile
59
+ def write(dest)
60
+ begin
61
+ super(dest)
62
+ rescue
63
+ end
64
+
65
+ true
66
+ end
67
+ end
68
+
69
+ class SitemapGenerator < Generator
70
+
71
+ # Valid values allowed by sitemap.xml spec for change frequencies
72
+ VALID_CHANGE_FREQUENCY_VALUES = ["always", "hourly", "daily", "weekly",
73
+ "monthly", "yearly", "never"]
74
+
75
+ # Goes through pages and posts and generates sitemap.xml file
76
+ #
77
+ # Returns nothing
78
+ def generate(site)
79
+ sitemap = REXML::Document.new << REXML::XMLDecl.new("1.0", "UTF-8")
80
+
81
+ urlset = REXML::Element.new "urlset"
82
+ urlset.add_attribute("xmlns",
83
+ "http://www.sitemaps.org/schemas/sitemap/0.9")
84
+
85
+ @last_modified_post_date = fill_posts(site, urlset)
86
+ fill_pages(site, urlset)
87
+
88
+ sitemap.add_element(urlset)
89
+
90
+ # Create destination directory if it doesn't exist yet. Otherwise, we cannot write our file there.
91
+ Dir::mkdir(site.dest) if !File.directory? site.dest
92
+
93
+ # File I/O: create sitemap.xml file and write out pretty-printed XML
94
+ filename = site.config['sitemap']['filename'] if site.config['sitemap']
95
+ filename ||= SITEMAP_FILE_NAME
96
+ file = File.new(File.join(site.dest, filename), "w")
97
+ formatter = REXML::Formatters::Pretty.new(4)
98
+ formatter.compact = true
99
+ formatter.write(sitemap, file)
100
+ file.close
101
+
102
+ # Keep the sitemap.xml file from being cleaned by Jekyll
103
+ site.static_files << Jekyll::SitemapFile.new(site, site.dest, "/", filename)
104
+ end
105
+
106
+ # Create url elements for all the posts and find the date of the latest one
107
+ #
108
+ # Returns last_modified_date of latest post
109
+ def fill_posts(site, urlset)
110
+ last_modified_date = nil
111
+ site.posts.each do |post|
112
+ if !excluded?(post.name)
113
+ url = fill_url(site, post)
114
+ urlset.add_element(url)
115
+ end
116
+
117
+ path = ".#{post.path_to_source}"
118
+ date = File.mtime(path)
119
+ last_modified_date = date if last_modified_date == nil or date > last_modified_date
120
+ end
121
+
122
+ last_modified_date
123
+ end
124
+
125
+ # Create url elements for all the normal pages and find the date of the
126
+ # index to use with the pagination pages
127
+ #
128
+ # Returns last_modified_date of index page
129
+ def fill_pages(site, urlset)
130
+ site.pages.each do |page|
131
+ if !excluded?(page.name)
132
+ path = ".#{page.path_to_source}"
133
+ if File.exists?(path)
134
+ url = fill_url(site, page)
135
+ urlset.add_element(url)
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ # Fill data of each URL element: location, last modified,
142
+ # change frequency (optional), and priority.
143
+ #
144
+ # Returns url REXML::Element
145
+ def fill_url(site, page_or_post)
146
+ url = REXML::Element.new "url"
147
+
148
+ loc = fill_location(site, page_or_post)
149
+ url.add_element(loc)
150
+
151
+ lastmod = fill_last_modified(site, page_or_post)
152
+ url.add_element(lastmod) if lastmod
153
+
154
+ if (page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME])
155
+ change_frequency =
156
+ page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME].downcase
157
+
158
+ if (valid_change_frequency?(change_frequency))
159
+ changefreq = REXML::Element.new "changefreq"
160
+ changefreq.text = change_frequency
161
+ url.add_element(changefreq)
162
+ else
163
+ puts "ERROR: Invalid Change Frequency In #{page_or_post.name}"
164
+ end
165
+ end
166
+
167
+ if (page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME])
168
+ priority_value = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME]
169
+ if valid_priority?(priority_value)
170
+ priority = REXML::Element.new "priority"
171
+ priority.text = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME]
172
+ url.add_element(priority)
173
+ else
174
+ puts "ERROR: Invalid Priority In #{page_or_post.name}"
175
+ end
176
+ end
177
+
178
+ url
179
+ end
180
+
181
+ # Get URL location of page or post
182
+ #
183
+ # Returns the location of the page or post
184
+ def fill_location(site, page_or_post)
185
+ loc = REXML::Element.new "loc"
186
+ url = site.config['sitemap']['url'] if site.config['sitemap']
187
+ url ||= site.config['url']
188
+ loc.text = "#{url[-1..-1] == '/' ? url[0..-2] : url}#{page_or_post.location_on_server}"
189
+
190
+ loc
191
+ end
192
+
193
+ # Fill lastmod XML element with the last modified date for the page or post.
194
+ #
195
+ # Returns lastmod REXML::Element or nil
196
+ def fill_last_modified(site, page_or_post)
197
+ path = ".#{page_or_post.path_to_source}"
198
+
199
+ lastmod = REXML::Element.new "lastmod"
200
+ date = File.mtime(path)
201
+ latest_date = find_latest_date(date, site, page_or_post)
202
+
203
+ case page_or_post
204
+ when Jekyll::Page
205
+ final_date = greater_date(latest_date, @last_modified_post_date)
206
+ lastmod.text = final_date.iso8601
207
+ else
208
+ lastmod.text = latest_date.iso8601
209
+ end
210
+ lastmod
211
+ end
212
+
213
+ # Go through the page/post and any implemented layouts and get the latest
214
+ # modified date
215
+ #
216
+ # Returns formatted output of latest date of page/post and any used layouts
217
+ def find_latest_date(latest_date, site, page_or_post)
218
+ layouts = site.layouts
219
+ layout = layouts[page_or_post.data["layout"]]
220
+ while layout
221
+ path = ".#{layout.path_to_source}"
222
+ date = File.mtime(path)
223
+
224
+ latest_date = date if (date > latest_date)
225
+
226
+ layout = layouts[layout.data["layout"]]
227
+ end
228
+
229
+ latest_date
230
+ end
231
+
232
+ # Which of the two dates is later
233
+ #
234
+ # Returns latest of two dates
235
+ def greater_date(date1, date2)
236
+ if (date1 >= date2)
237
+ date1
238
+ else
239
+ date2
240
+ end
241
+ end
242
+
243
+ # Is the page or post listed as something we want to exclude?
244
+ #
245
+ # Returns boolean
246
+ def excluded?(name)
247
+ name_frags = name.split('.')
248
+ EXCLUDED_FILES.include?(name) || !(name_frags.last == name || %q{html markdown textile}.include?(name_frags.last))
249
+ end
250
+
251
+ def posts_included?(name)
252
+ PAGES_INCLUDE_POSTS.include? name
253
+ end
254
+
255
+ # Is the change frequency value provided valid according to the spec
256
+ #
257
+ # Returns boolean
258
+ def valid_change_frequency?(change_frequency)
259
+ VALID_CHANGE_FREQUENCY_VALUES.include? change_frequency
260
+ end
261
+
262
+ # Is the priority value provided valid according to the spec
263
+ #
264
+ # Returns boolean
265
+ def valid_priority?(priority)
266
+ begin
267
+ priority_val = Float(priority)
268
+ return true if priority_val >= 0.0 and priority_val <= 1.0
269
+ rescue ArgumentError
270
+ end
271
+
272
+ false
273
+ end
274
+ end
275
+ end
@@ -44,6 +44,10 @@ opts = OptionParser.new do |opts|
44
44
  options['url'] = url
45
45
  end
46
46
 
47
+ opts.on("--[no-]pygments", "Use pygments to highlight code (true at Spinto)") do |pygments|
48
+ options['pygments'] = pygments
49
+ end
50
+
47
51
  opts.on("--version", "Display current version") do
48
52
  puts "Spinto " + Spinto::VERSION
49
53
  exit 0
@@ -69,7 +73,6 @@ end
69
73
 
70
74
  options['safe'] = false
71
75
  options['plugins'] = Spinto::PLUGINS_PATH
72
- options['pygments'] = true
73
76
 
74
77
  options = Jekyll.configuration(options)
75
78
 
@@ -1,5 +1,5 @@
1
1
  module Spinto
2
- VERSION = '0.2.10'
2
+ VERSION = '0.2.11'
3
3
  PLUGINS_PATH = File.join(File.dirname(__FILE__), '..', '_plugins')
4
4
 
5
5
  end
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
4
4
  s.rubygems_version = '1.3.5'
5
5
 
6
6
  s.name = 'spinto'
7
- s.version = '0.2.10'
8
- s.date = '2012-04-03'
7
+ s.version = '0.2.11'
8
+ s.date = '2012-04-24'
9
9
 
10
10
  s.summary = "The site generator used at spintoapp.com"
11
11
  s.description = "Spinto uses Jekyll and plugins to build static sites, this gem provides the spinto-site builder."
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
42
42
  _plugins/less_converter.rb
43
43
  _plugins/sass_converter.rb
44
44
  _plugins/scss_converter.rb
45
+ _plugins/sitemap_generator.rb
45
46
  bin/spinto-site
46
47
  lib/spinto.rb
47
48
  spinto.gemspec
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spinto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-03 00:00:00.000000000Z
12
+ date: 2012-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: spinto-jekyll
16
- requirement: &2154469380 !ruby/object:Gem::Requirement
16
+ requirement: &2180915740 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.11.2.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2154469380
24
+ version_requirements: *2180915740
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: coffee-script
27
- requirement: &2154468920 !ruby/object:Gem::Requirement
27
+ requirement: &2180915280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2154468920
35
+ version_requirements: *2180915280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sass
38
- requirement: &2154468460 !ruby/object:Gem::Requirement
38
+ requirement: &2180914820 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 3.1.15
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2154468460
46
+ version_requirements: *2180914820
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: less
49
- requirement: &2154468000 !ruby/object:Gem::Requirement
49
+ requirement: &2180914360 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.1.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2154468000
57
+ version_requirements: *2180914360
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: RedCloth
60
- requirement: &2154467540 !ruby/object:Gem::Requirement
60
+ requirement: &2180913900 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 4.2.9
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2154467540
68
+ version_requirements: *2180913900
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
- requirement: &2154467080 !ruby/object:Gem::Requirement
71
+ requirement: &2180913440 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0.9'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2154467080
79
+ version_requirements: *2180913440
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rdoc
82
- requirement: &2154466620 !ruby/object:Gem::Requirement
82
+ requirement: &2180912980 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '3.11'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2154466620
90
+ version_requirements: *2180912980
91
91
  description: Spinto uses Jekyll and plugins to build static sites, this gem provides
92
92
  the spinto-site builder.
93
93
  email: matt.beale@madhatted.com
@@ -106,6 +106,7 @@ files:
106
106
  - _plugins/less_converter.rb
107
107
  - _plugins/sass_converter.rb
108
108
  - _plugins/scss_converter.rb
109
+ - _plugins/sitemap_generator.rb
109
110
  - bin/spinto-site
110
111
  - lib/spinto.rb
111
112
  - spinto.gemspec
@@ -124,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
125
  version: '0'
125
126
  segments:
126
127
  - 0
127
- hash: -4425238121308963726
128
+ hash: -1798746641388548046
128
129
  required_rubygems_version: !ruby/object:Gem::Requirement
129
130
  none: false
130
131
  requirements: