mill 0.1 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mill/site.rb ADDED
@@ -0,0 +1,304 @@
1
+ module Mill
2
+
3
+ class Site
4
+
5
+ attr_accessor :input_dir
6
+ attr_accessor :output_dir
7
+ attr_accessor :site_title
8
+ attr_accessor :site_uri
9
+ attr_accessor :site_email
10
+ attr_accessor :site_control_date
11
+ attr_accessor :html_version
12
+ attr_accessor :feed_resource
13
+ attr_accessor :sitemap_resource
14
+ attr_accessor :robots_resource
15
+ attr_accessor :shorten_uris
16
+ attr_accessor :make_feed
17
+ attr_accessor :make_sitemap
18
+ attr_accessor :make_robots
19
+ attr_accessor :allow_robots
20
+ attr_accessor :htpasswd_file
21
+ attr_accessor :navigator
22
+ attr_accessor :resource_classes
23
+ attr_accessor :redirects
24
+ attr_accessor :resources
25
+
26
+ DefaultResourceClasses = ObjectSpace.each_object(Class).select { |c| c < Resource }
27
+
28
+ def initialize(input_dir: 'content',
29
+ output_dir: 'public_html',
30
+ site_title: nil,
31
+ site_uri: 'http://localhost',
32
+ site_email: nil,
33
+ site_control_date: Date.today.to_s,
34
+ html_version: :html4_transitional,
35
+ shorten_uris: true,
36
+ make_feed: true,
37
+ make_sitemap: true,
38
+ make_robots: true,
39
+ allow_robots: true,
40
+ htpasswd_file: nil,
41
+ navigator: nil,
42
+ google_site_verification: nil,
43
+ resource_classes: [],
44
+ redirects: {})
45
+
46
+ @input_dir = Path.new(input_dir)
47
+ @output_dir = Path.new(output_dir)
48
+ @site_title = site_title
49
+ @site_uri = Addressable::URI.parse(site_uri)
50
+ @site_email = Addressable::URI.parse(site_email) if site_email
51
+ @site_control_date = Date.parse(site_control_date)
52
+ @html_version = html_version
53
+ @shorten_uris = shorten_uris
54
+ @make_feed = make_feed
55
+ @make_sitemap = make_sitemap
56
+ @make_robots = make_robots
57
+ @allow_robots = allow_robots
58
+ @htpasswd_file = htpasswd_file ? Path.new(htpasswd_file) : nil
59
+ @resource_classes = resource_classes
60
+ @navigator = navigator
61
+ @google_site_verification = google_site_verification
62
+ @redirects = redirects
63
+
64
+ @resources = []
65
+ @resources_by_uri = {}
66
+ build_file_types
67
+ end
68
+
69
+ def build_file_types
70
+ @file_types = {}
71
+ (DefaultResourceClasses + @resource_classes).each do |resource_class|
72
+ resource_class.const_get(:FileTypes).each do |type|
73
+ @file_types[type] = resource_class
74
+ end
75
+ end
76
+ end
77
+
78
+ def add_resource(resource)
79
+ resource.site = self
80
+ @resources << resource
81
+ @resources_by_uri[resource.uri] = resource
82
+ # ;;warn "added #{resource} as #{resource.uri}"
83
+ end
84
+
85
+ def delete_resource(resource)
86
+ @resources.delete(resource)
87
+ @resources_by_uri.delete(resource.uri)
88
+ end
89
+
90
+ def find_resource(uri)
91
+ uri = Addressable::URI.parse(uri.to_s) unless uri.kind_of?(Addressable::URI)
92
+ resource = @resources_by_uri[uri]
93
+ if resource.nil? && @shorten_uris
94
+ uri.path = uri.path.sub(%r{\.html$}, '')
95
+ resource = @resources_by_uri[uri]
96
+ end
97
+ resource
98
+ end
99
+
100
+ def resource_for_file(path)
101
+ find_resource(
102
+ URI.parse(
103
+ '/' + URI.encode(
104
+ path.relative_to(@output_dir).to_s
105
+ )
106
+ )
107
+ )
108
+ end
109
+
110
+ def home_resource
111
+ find_resource('/')
112
+ end
113
+
114
+ def tag_uri
115
+ 'tag:%s:' % [
116
+ [
117
+ @site_uri.host.downcase,
118
+ @site_control_date
119
+ ].join(','),
120
+ ]
121
+ end
122
+
123
+ def feed_generator
124
+ [
125
+ 'Mill',
126
+ {
127
+ uri: Addressable::URI.parse('http://github.com/jslabovitz/mill'),
128
+ version: Mill::VERSION,
129
+ }
130
+ ]
131
+ end
132
+
133
+ def feed_author_name
134
+ @site_title
135
+ end
136
+
137
+ def feed_author_uri
138
+ @site_uri
139
+ end
140
+
141
+ def feed_author_email
142
+ @site_email
143
+ end
144
+
145
+ def feed_resources
146
+ public_resources.sort_by(&:date)
147
+ end
148
+
149
+ def public_resources
150
+ @resources.select(&:public)
151
+ end
152
+
153
+ def private_resources
154
+ @resources.select { |r| r.kind_of?(Resource::Text) && !r.public }
155
+ end
156
+
157
+ def redirect_resources
158
+ @resources.select { |r| r.kind_of?(Resource::Redirect) }
159
+ end
160
+
161
+ def make
162
+ build
163
+ save
164
+ end
165
+
166
+ def list
167
+ build
168
+ on_each_resource do |resource|
169
+ puts resource.inspect
170
+ end
171
+ end
172
+
173
+ def build
174
+ import_resources
175
+ load_resources
176
+ build_resources
177
+ end
178
+
179
+ def import_resources
180
+ add_files
181
+ add_redirects
182
+ add_google_site_verification if @google_site_verification
183
+ add_feed if @make_feed
184
+ add_sitemap if @make_sitemap
185
+ add_robots if @make_robots
186
+ add_htpasswd if @htpasswd_file
187
+ end
188
+
189
+ def load_resources
190
+ on_each_resource do |resource|
191
+ # ;;warn "#{resource.uri}: loading"
192
+ resource.load
193
+ end
194
+ end
195
+
196
+ def build_resources
197
+ on_each_resource do |resource|
198
+ # ;;warn "#{resource.uri}: building"
199
+ resource.build
200
+ end
201
+ end
202
+
203
+ def save
204
+ @output_dir.rmtree if @output_dir.exist?
205
+ @output_dir.mkpath
206
+ on_each_resource do |resource|
207
+ # ;;warn "#{resource.uri}: saving"
208
+ resource.save
209
+ end
210
+ end
211
+
212
+ def on_each_resource(&block)
213
+ @resources.each do |resource|
214
+ old_uri = resource.uri.dup
215
+ begin
216
+ yield(resource)
217
+ rescue Error => e
218
+ raise e, "#{resource.input_file || '-'} (#{old_uri}): #{e}"
219
+ end
220
+ if resource.uri != old_uri
221
+ # ;;warn "URI changed: #{old_uri} => #{resource.uri}"
222
+ @resources_by_uri.delete(old_uri)
223
+ @resources_by_uri[resource.uri] = resource
224
+ end
225
+ end
226
+ end
227
+
228
+ private
229
+
230
+ def resource_class_for_file(file)
231
+ MIME::Types.of(file.to_s).each do |type|
232
+ if (klass = @file_types[type.content_type])
233
+ return [klass, type]
234
+ end
235
+ end
236
+ nil
237
+ end
238
+
239
+ def add_files
240
+ raise Error, "Input path not found: #{@input_dir}" unless @input_dir.exist?
241
+ @input_dir.find do |input_file|
242
+ if input_file.basename.to_s[0] == '.'
243
+ Find.prune
244
+ elsif input_file.directory?
245
+ # skip
246
+ elsif (klass, type = resource_class_for_file(input_file))
247
+ resource = klass.new(
248
+ input_file: input_file,
249
+ output_file: @output_dir / input_file.relative_to(@input_dir),
250
+ type: type)
251
+ add_resource(resource)
252
+ else
253
+ warn "Warning: can't determine resource of file: #{input_file} (#{MIME::Types.of(input_file.to_s).join(', ').inspect})"
254
+ end
255
+ end
256
+ end
257
+
258
+ def add_feed
259
+ @feed_resource = Resource::Feed.new(
260
+ output_file: @output_dir / 'feed.xml')
261
+ add_resource(@feed_resource)
262
+ end
263
+
264
+ def add_sitemap
265
+ @sitemap_resource = Resource::Sitemap.new(
266
+ output_file: @output_dir / 'sitemap.xml')
267
+ add_resource(@sitemap_resource)
268
+ end
269
+
270
+ def add_robots
271
+ @robots_resource = Resource::Robots.new(
272
+ output_file: @output_dir / 'robots.txt')
273
+ add_resource(@robots_resource)
274
+ end
275
+
276
+ def add_redirects
277
+ if @redirects
278
+ @redirects.each do |from, to|
279
+ output_file = @output_dir / Path.new(from).relative_to('/')
280
+ resource = Resource::Redirect.new(
281
+ output_file: output_file,
282
+ redirect_uri: to)
283
+ add_resource(resource)
284
+ end
285
+ end
286
+ end
287
+
288
+ def add_google_site_verification
289
+ resource = Resource::GoogleSiteVerification.new(
290
+ output_file: (@output_dir / @google_site_verification).add_extension('.html'),
291
+ key: @google_site_verification)
292
+ add_resource(resource)
293
+ end
294
+
295
+ def add_htpasswd
296
+ resource = Resource::Other.new(
297
+ input_file: @htpasswd_file,
298
+ output_file: @output_dir / '.htpasswd')
299
+ add_resource(resource)
300
+ end
301
+
302
+ end
303
+
304
+ end
data/lib/mill/version.rb CHANGED
@@ -1,5 +1,5 @@
1
- class Mill
1
+ module Mill
2
2
 
3
- VERSION = '0.1'
3
+ VERSION = '0.3'
4
4
 
5
5
  end
data/mill.gemspec CHANGED
@@ -28,9 +28,7 @@ Gem::Specification.new do |s|
28
28
  s.add_dependency 'path'
29
29
  s.add_dependency 'RedCloth'
30
30
  s.add_dependency 'rubypants'
31
- s.add_dependency 'simple-server'
32
- s.add_dependency 'term-ansicolor'
33
- s.add_dependency 'tidy_ffi'
31
+ s.add_dependency 'sass'
34
32
 
35
33
  s.add_development_dependency 'bundler'
36
34
  s.add_development_dependency 'rake'
data/test/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'bundler'
4
+ gem 'rake'
5
+ gem 'path'
6
+
7
+ gem 'mill', path: '~/Projects/mill'
data/test/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH.unshift '../lib'
2
+
3
+ require 'mill'
4
+
5
+ $site = Mill::Site.new
6
+
7
+ load 'mill/tasks.rake'
data/test/content/a.md ADDED
@@ -0,0 +1,3 @@
1
+ # A
2
+
3
+ [home](/) or [b](/b)
@@ -0,0 +1,3 @@
1
+ # B
2
+
3
+ [a](/a)
@@ -0,0 +1,3 @@
1
+ # Hello
2
+
3
+ [a](/a) or [b](/b/)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mill
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Labovitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-23 00:00:00.000000000 Z
11
+ date: 2017-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -123,35 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: simple-server
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: term-ansicolor
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :runtime
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: tidy_ffi
126
+ name: sass
155
127
  requirement: !ruby/object:Gem::Requirement
156
128
  requirements:
157
129
  - - ">="
@@ -194,7 +166,8 @@ dependencies:
194
166
  version: '0'
195
167
  description: "\n Mill provides a simple but useful static site generator.\n "
196
168
  email: johnl@johnlabovitz.com
197
- executables: []
169
+ executables:
170
+ - mill
198
171
  extensions: []
199
172
  extra_rdoc_files: []
200
173
  files:
@@ -204,23 +177,32 @@ files:
204
177
  - README.md
205
178
  - Rakefile
206
179
  - TODO.txt
180
+ - bin/mill
207
181
  - lib/mill.rb
208
- - lib/mill/file_types.rb
182
+ - lib/mill/error.rb
209
183
  - lib/mill/html_helpers.rb
210
184
  - lib/mill/navigator.rb
211
185
  - lib/mill/resource.rb
186
+ - lib/mill/resources/dir.rb
212
187
  - lib/mill/resources/feed.rb
213
- - lib/mill/resources/generic.rb
188
+ - lib/mill/resources/google_site_verification.rb
214
189
  - lib/mill/resources/image.rb
190
+ - lib/mill/resources/other.rb
215
191
  - lib/mill/resources/redirect.rb
216
192
  - lib/mill/resources/robots.rb
217
193
  - lib/mill/resources/sitemap.rb
194
+ - lib/mill/resources/stylesheet.rb
218
195
  - lib/mill/resources/text.rb
219
196
  - lib/mill/schemas/atom.xsd
220
197
  - lib/mill/schemas/sitemap.xsd
221
- - lib/mill/tasks.rake
198
+ - lib/mill/site.rb
222
199
  - lib/mill/version.rb
223
200
  - mill.gemspec
201
+ - test/Gemfile
202
+ - test/Rakefile
203
+ - test/content/a.md
204
+ - test/content/b/index.md
205
+ - test/content/index.md
224
206
  homepage: http://github.com/jslabovitz/mill
225
207
  licenses: []
226
208
  metadata: {}
@@ -240,8 +222,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
222
  version: '0'
241
223
  requirements: []
242
224
  rubyforge_project:
243
- rubygems_version: 2.5.2
225
+ rubygems_version: 2.7.3
244
226
  signing_key:
245
227
  specification_version: 4
246
228
  summary: A simple but useful static site generator.
247
- test_files: []
229
+ test_files:
230
+ - test/Gemfile
231
+ - test/Rakefile
232
+ - test/content/a.md
233
+ - test/content/b/index.md
234
+ - test/content/index.md