flutterby 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92409201cdf6f744cf869271e0361b75b771dc6c
4
- data.tar.gz: 274684a4a805f04b6b8f3739a5c8fcaf5f148f97
3
+ metadata.gz: aa91b42f64b52a8f3a568cd3a95ac7d366d997ea
4
+ data.tar.gz: 6ee2175701e8b15dae84f1a8665f0473678851fa
5
5
  SHA512:
6
- metadata.gz: b6b3cf80130ea4afdb07faa75e04ba6e680883a7c5f3f6ada5cd2b426a73c5ee23fa9e413dbd3587614e7c78a54c6cef7041f240360f446698102570d06bf806
7
- data.tar.gz: 28596862f6dce075e164ef713c38497e494d2b7e132b75fe1930e9710c116ffcde346c234c19f94c1e53e971b2962c01704d680b65b25bdd604ed4c2ddab55cf
6
+ metadata.gz: e4b993b640531755f04c6115ee949c26d7cb1d0f4ff2adaac173397cf1b94b688ef3e051369880f369ab9dd9e779ac4d11dabb9924d843ad71bb5be0277eb912
7
+ data.tar.gz: ca707746919b8e08c0563506d67ecc9a32fa9d32c8c373164b9f2ae18102abfef51680c3506fd3e7a1c3106325f0a342e6a8caa4e93701ddfafb4d522c7d86dd
data/lib/flutterby/cli.rb CHANGED
@@ -17,7 +17,7 @@ Commander.configure do
17
17
  options.default in: "./site/", out: "./_build/"
18
18
 
19
19
  root = Flutterby.from(options.in, name: "/")
20
- root.export(options.out)
20
+ root.export(into: options.out)
21
21
  end
22
22
  end
23
23
  alias_command :b, :build
@@ -1,13 +1,11 @@
1
1
  module Flutterby
2
- class Entity
3
- attr_accessor :parent, :ext
2
+ class Node
3
+ attr_accessor :parent, :ext, :source, :body
4
4
  attr_reader :name, :filters, :fs_path, :data, :children
5
- alias_method :folder, :parent
6
5
 
7
6
  def initialize(name, parent: nil, fs_path: nil)
8
7
  @parent = parent
9
8
  @data = {}
10
- reset_children!
11
9
 
12
10
  # Extract name, extension, and filters from given name
13
11
  parts = name.split(".")
@@ -23,8 +21,9 @@ module Flutterby
23
21
  # If a filesystem path was given, read the entity from disk
24
22
  if fs_path
25
23
  @fs_path = ::File.expand_path(fs_path)
26
- read
27
24
  end
25
+
26
+ reload!
28
27
  end
29
28
 
30
29
  #
@@ -127,27 +126,95 @@ module Flutterby
127
126
  #
128
127
 
129
128
  def reload!
129
+ @body = nil
130
130
  reset_children!
131
- read
131
+
132
+ if @fs_path
133
+ if ::File.directory?(fs_path)
134
+ Dir[::File.join(fs_path, "*")].each do |entry|
135
+ if entity = Flutterby.from(entry)
136
+ children << entity
137
+ end
138
+ end
139
+ else
140
+ @source = ::File.read(fs_path)
141
+
142
+ # Extract date from name
143
+ if name =~ %r{^(\d\d\d\d\-\d\d?\-\d\d?)\-}
144
+ @data['date'] = Time.parse($1)
145
+ end
146
+
147
+ # Read remaining data from frontmatter. Data in frontmatter
148
+ # will always have precedence!
149
+ @data.merge! parse_frontmatter
150
+
151
+ # Do some extra processing depending on extension
152
+ meth = "read_#{ext}"
153
+ send(meth) if respond_to?(meth)
154
+ end
155
+ end
132
156
  end
133
157
 
134
- def read
158
+
159
+ #
160
+ # Rendering
161
+ #
162
+
163
+ def view
164
+ @view ||= View.for(self)
165
+ end
166
+
167
+ def body
168
+ Filters.apply!(self) if @body.nil?
169
+ @body
135
170
  end
136
171
 
172
+ def render(layout: true)
173
+ (layout && apply_layout?) ? apply_layout(body) : body
174
+ end
175
+
176
+ def apply_layout(input)
177
+ walk_up(input) do |e, current|
178
+ if layout = e.sibling("_layout")
179
+ tilt = Tilt[layout.ext].new { layout.source }
180
+ tilt.render(view) { current }
181
+ else
182
+ current
183
+ end
184
+ end
185
+ end
186
+
187
+ def apply_layout?
188
+ page?
189
+ end
190
+
191
+
137
192
 
138
193
  #
139
194
  # Exporting
140
195
  #
141
196
 
142
- def export(out_path)
197
+ def export(into:)
143
198
  if should_publish?
144
- out_path = full_fs_path(base: out_path)
145
- puts "* #{@name}: #{out_path}"
146
- write_static(out_path)
199
+ puts "* #{url}"
200
+ write_static(into: into)
147
201
  end
148
202
  end
149
203
 
150
- def write_static(path)
204
+ def write_static(into:)
205
+ if folder?
206
+ # write children, acting as a directory
207
+
208
+ path = full_fs_path(base: into)
209
+ Dir.mkdir(path) unless ::File.exists?(path)
210
+
211
+ children.each do |child|
212
+ child.export(into: path)
213
+ end
214
+ else
215
+ # write a file
216
+ ::File.write(full_fs_path(base: into), render)
217
+ end
151
218
  end
152
219
 
153
220
  def should_publish?
@@ -155,6 +222,34 @@ module Flutterby
155
222
  end
156
223
 
157
224
 
225
+ #
226
+ # Front Matter Parsing
227
+ #
228
+
229
+ def parse_frontmatter
230
+ data = {}
231
+
232
+ # YAML Front Matter
233
+ if @source.sub!(/\A\-\-\-\n(.+)\n\-\-\-\n/m, "")
234
+ data.merge! YAML.load($1)
235
+ end
236
+
237
+ # TOML Front Matter
238
+ if @source.sub!(/\A\+\+\+\n(.+)\n\+\+\+\n/m, "")
239
+ data.merge! TOML.parse($1)
240
+ end
241
+
242
+ data
243
+ end
244
+
245
+ def read_json
246
+ data.merge!(JSON.parse(@source))
247
+ end
248
+
249
+ def read_yaml
250
+ data.merge!(YAML.load(@source))
251
+ end
252
+
158
253
 
159
254
  #
160
255
  # Misc
@@ -168,8 +263,12 @@ module Flutterby
168
263
  [name, ext].compact.join(".")
169
264
  end
170
265
 
266
+ def folder?
267
+ children.any?
268
+ end
269
+
171
270
  def page?
172
- false
271
+ !folder? && ext == "html"
173
272
  end
174
273
  end
175
274
  end
@@ -46,8 +46,7 @@ module Flutterby
46
46
  # halt if we're not supposed to serve current entity
47
47
  throw :halt, :error_404 unless current.should_publish?
48
48
 
49
- case current
50
- when Flutterby::Folder then
49
+ if current.folder? then
51
50
  # If no further parts are requested, let's look for an index
52
51
  # document and serve that instead.
53
52
  if child = current.find(parts.empty? ? "index" : parts.shift)
@@ -55,7 +54,7 @@ module Flutterby
55
54
  else
56
55
  throw :halt, :error_404
57
56
  end
58
- when Flutterby::File then
57
+ else
59
58
  # Determine MIME type
60
59
  mime_type = MIME::Types.type_for(current.ext) || "text/plain"
61
60
 
@@ -1,3 +1,3 @@
1
1
  module Flutterby
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -25,7 +25,7 @@ module Flutterby
25
25
  view = new(file)
26
26
 
27
27
  # walk the tree up to dynamically extend the view
28
- file.folder.walk_down do |e|
28
+ file.parent.walk_down do |e|
29
29
  if view_entity = e.find("_view.rb")
30
30
  case view_entity.ext
31
31
  when "rb" then
data/lib/flutterby.rb CHANGED
@@ -1,7 +1,13 @@
1
+ require 'slodown'
2
+ require 'sass'
3
+ require 'tilt'
4
+ require 'slim'
5
+ require 'toml'
6
+ require 'mime-types'
7
+ require 'json'
8
+
1
9
  require "flutterby/version"
2
- require "flutterby/entity"
3
- require "flutterby/file"
4
- require "flutterby/folder"
10
+ require "flutterby/node"
5
11
  require "flutterby/filters"
6
12
  require "flutterby/view"
7
13
  require "flutterby/server"
@@ -11,10 +17,8 @@ module Flutterby
11
17
  def Flutterby.from(fs_path, name: nil, parent: nil)
12
18
  name ||= ::File.basename(fs_path)
13
19
 
14
- if ::File.directory?(fs_path)
15
- Folder.new(name, fs_path: fs_path, parent: parent)
16
- elsif ::File.file?(fs_path)
17
- File.new(name, fs_path: fs_path, parent: parent)
20
+ if ::File.exist?(fs_path)
21
+ Node.new(name, fs_path: fs_path, parent: parent)
18
22
  else
19
23
  raise "Path #{fs_path} could not be found."
20
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flutterby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik Mans
@@ -243,10 +243,8 @@ files:
243
243
  - flutterby.gemspec
244
244
  - lib/flutterby.rb
245
245
  - lib/flutterby/cli.rb
246
- - lib/flutterby/entity.rb
247
- - lib/flutterby/file.rb
248
246
  - lib/flutterby/filters.rb
249
- - lib/flutterby/folder.rb
247
+ - lib/flutterby/node.rb
250
248
  - lib/flutterby/server.rb
251
249
  - lib/flutterby/version.rb
252
250
  - lib/flutterby/view.rb
@@ -1,95 +0,0 @@
1
- require 'slodown'
2
- require 'sass'
3
- require 'tilt'
4
- require 'slim'
5
- require 'toml'
6
- require 'mime-types'
7
- require 'json'
8
-
9
- module Flutterby
10
- class File < Entity
11
- attr_accessor :source, :body
12
-
13
- def reload!
14
- @body = nil
15
- super
16
- end
17
-
18
- def read
19
- @source = ::File.read(fs_path)
20
-
21
- # Extract date from name
22
- if name =~ %r{^(\d\d\d\d\-\d\d?\-\d\d?)\-}
23
- @data['date'] = Time.parse($1)
24
- end
25
-
26
- # Read remaining data from frontmatter. Data in frontmatter
27
- # will always have precedence!
28
- @data.merge! parse_frontmatter
29
-
30
- # Do some extra processing depending on extension
31
- meth = "read_#{ext}"
32
- send(meth) if respond_to?(meth)
33
- end
34
-
35
- def parse_frontmatter
36
- data = {}
37
-
38
- # YAML Front Matter
39
- if @source.sub!(/\A\-\-\-\n(.+)\n\-\-\-\n/m, "")
40
- data.merge! YAML.load($1)
41
- end
42
-
43
- # TOML Front Matter
44
- if @source.sub!(/\A\+\+\+\n(.+)\n\+\+\+\n/m, "")
45
- data.merge! TOML.parse($1)
46
- end
47
-
48
- data
49
- end
50
-
51
- def body
52
- Filters.apply!(self) if @body.nil?
53
- @body
54
- end
55
-
56
- def page?
57
- ext == "html"
58
- end
59
-
60
- def view
61
- @view ||= View.for(self)
62
- end
63
-
64
- def read_json
65
- data.merge!(JSON.parse(@source))
66
- end
67
-
68
- def read_yaml
69
- data.merge!(YAML.load(@source))
70
- end
71
-
72
- def apply_layout(input)
73
- walk_up(input) do |e, current|
74
- if layout = e.sibling("_layout")
75
- tilt = Tilt[layout.ext].new { layout.source }
76
- tilt.render(view) { current }
77
- else
78
- current
79
- end
80
- end
81
- end
82
-
83
- def apply_layout?
84
- page?
85
- end
86
-
87
- def render(layout: true)
88
- (layout && apply_layout?) ? apply_layout(body) : body
89
- end
90
-
91
- def write_static(path)
92
- ::File.write(path, render)
93
- end
94
- end
95
- end
@@ -1,19 +0,0 @@
1
- module Flutterby
2
- class Folder < Entity
3
- def read
4
- Dir[::File.join(fs_path, "*")].each do |entry|
5
- if entity = Flutterby.from(entry)
6
- children << entity
7
- end
8
- end
9
- end
10
-
11
- def write_static(path)
12
- Dir.mkdir(path) unless ::File.exists?(path)
13
-
14
- children.each do |child|
15
- child.export(path)
16
- end
17
- end
18
- end
19
- end