flutterby 0.0.5 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 871ef039693c35c6a70dbc86544957d084f247a7
4
- data.tar.gz: e7d491e74f143bf9a407113a1a24f74a34c7011f
3
+ metadata.gz: 46ebc1c85a56b410c6147dd87503c8fd59cd0d74
4
+ data.tar.gz: 5d65a75d308e436afed08be445828ab94c02396e
5
5
  SHA512:
6
- metadata.gz: bf3054184d1c4601fa3c936356269289ce99cd3f0fc03dac4c4c6400f719505dfb6c48e0e832ef5899455e54a40bb232c0a7cc91defa53d7b5987654d84173cb
7
- data.tar.gz: 4743c753fd558f18beae2982b166ef349c5072a207ab4ae5ff01711783b197fd1f8a91f8a7517fb34e617bf40ea383df961d3555006e710a7b91842e9cc4b950
6
+ metadata.gz: e4a6a0aee56906711254d63a905a6c95e5cd098cbc76bb8936e522f6eaea97af49f2c8e3bc8f749857090ff40556c77e033cc5aabb86c832ef97f3aec1ce6c1f
7
+ data.tar.gz: f1918f98a08abb87bfd9e0298abb739dc76f74a3ee01bef2f926f696a8378c2b4b89f589c74b213141877e09a902c2b7f89197935956f4e8ed48208ada0641a0
data/lib/flutterby.rb CHANGED
@@ -5,6 +5,7 @@ require "flutterby/folder"
5
5
  require "flutterby/view"
6
6
  require "flutterby/server"
7
7
 
8
+
8
9
  module Flutterby
9
10
  def Flutterby.from(fs_path, name: nil, parent: nil)
10
11
  name ||= ::File.basename(fs_path)
data/lib/flutterby/cli.rb CHANGED
@@ -35,15 +35,4 @@ Commander.configure do
35
35
  server.run!
36
36
  end
37
37
  end
38
-
39
-
40
- command :test do |c|
41
- c.syntax = 'flutterby test'
42
- c.description = 'TEST. Yo.'
43
- c.action do |args, options|
44
- root = Flutterby.from("./in", name: "/")
45
- root.list
46
- root.export("./out/")
47
- end
48
- end
49
38
  end
@@ -1,10 +1,11 @@
1
1
  module Flutterby
2
2
  class Entity
3
- attr_reader :name, :ext, :filters, :parent, :fs_path, :path, :data
3
+ attr_accessor :parent
4
+ attr_reader :name, :ext, :filters, :fs_path, :data, :children
4
5
 
5
6
  def initialize(name, parent: nil, fs_path: nil)
6
- @parent = parent
7
7
  @data = {}
8
+ reset_children!
8
9
 
9
10
  # Extract name, extension, and filters from given name
10
11
  parts = name.split(".")
@@ -12,8 +13,7 @@ module Flutterby
12
13
  @ext = parts.shift
13
14
  @filters = parts.reverse
14
15
 
15
- # Calculate full path
16
- @path = parent ? ::File.join(parent.path, full_name) : full_name
16
+ self.parent = parent
17
17
 
18
18
  # If a filesystem path was given, read the entity from disk
19
19
  if fs_path
@@ -22,30 +22,53 @@ module Flutterby
22
22
  end
23
23
  end
24
24
 
25
- def reload!
26
- read
25
+ #
26
+ # Children
27
+ #
28
+
29
+ def reset_children!
30
+ @children = []
31
+ me = self
32
+
33
+ # Inject some extra methods into this array because this is dirty old Ruby
34
+ @children.define_singleton_method(:<<) do |c|
35
+ c.parent = me
36
+ super(c)
37
+ end
38
+
39
+ @children.define_singleton_method(:find_by_name) do |name|
40
+ name = name.split('.').first
41
+ find { |c| c.name == name }
42
+ end
27
43
  end
28
44
 
29
- def list(indent: 0)
30
- puts "#{" " * indent}[#{self.class}] #{path}"
45
+ # Returns all children that will compile to a HTML page.
46
+ #
47
+ def pages
48
+ children.select { |c| c.ext == "html" }
31
49
  end
32
50
 
33
- def export(out_path)
34
- if should_publish?
35
- out_path = full_path(out_path)
36
- puts "* #{@name}: #{out_path}"
37
- write_static(out_path)
38
- end
51
+ #
52
+ # Path Algebra
53
+ #
54
+
55
+ def path
56
+ parent ? ::File.join(parent.path, full_name) : full_name
39
57
  end
40
58
 
41
59
  def url
42
60
  @url ||= ::File.join(parent ? parent.url : "/", full_name)
43
61
  end
44
62
 
45
- def full_path(base)
63
+ def full_fs_path(base:)
46
64
  ::File.expand_path(::File.join(base, full_name))
47
65
  end
48
66
 
67
+
68
+ #
69
+ # Tree Walking
70
+ #
71
+
49
72
  def root
50
73
  parent ? parent.root : self
51
74
  end
@@ -54,13 +77,51 @@ module Flutterby
54
77
  parent && parent.find(name)
55
78
  end
56
79
 
57
- def full_name
58
- @full_name ||= [name, ext].compact.join(".")
80
+ def find(path)
81
+ return self if path.nil? || path.empty?
82
+
83
+ # remove duplicate slashes
84
+ path.gsub!(%r{//}, "/")
85
+
86
+ case path
87
+ when %r{^\.\./?} then
88
+ parent ? parent.find($') : nil
89
+ when %r{^\.} then
90
+ self
91
+ when %r{^/} then
92
+ root.find($')
93
+ when %r{^([^/]+)/?} then
94
+ child = @children.find_by_name($1)
95
+ $'.empty? ? child : child.find($')
96
+ end
97
+ end
98
+
99
+
100
+ #
101
+ # Reading from filesystem
102
+ #
103
+
104
+ def reload!
105
+ reset_children!
106
+ read
59
107
  end
60
108
 
61
109
  def read
62
110
  end
63
111
 
112
+
113
+ #
114
+ # Exporting
115
+ #
116
+
117
+ def export(out_path)
118
+ if should_publish?
119
+ out_path = full_fs_path(base: out_path)
120
+ puts "* #{@name}: #{out_path}"
121
+ write_static(out_path)
122
+ end
123
+ end
124
+
64
125
  def write_static(path)
65
126
  end
66
127
 
@@ -68,6 +129,20 @@ module Flutterby
68
129
  !name.start_with?("_")
69
130
  end
70
131
 
132
+
133
+
134
+ #
135
+ # Misc
136
+ #
137
+
138
+ def to_s
139
+ "<#{self.class} #{self.path}>"
140
+ end
141
+
142
+ def full_name
143
+ @full_name ||= [name, ext].compact.join(".")
144
+ end
145
+
71
146
  def page?
72
147
  false
73
148
  end
@@ -29,14 +29,15 @@ module Flutterby
29
29
 
30
30
  def parse_frontmatter
31
31
  data = {}
32
- @contents.sub!(/\A\-\-\-\n(.+)\n\-\-\-\n/m) do
32
+
33
+ # YAML Front Matter
34
+ if @contents.sub!(/\A\-\-\-\n(.+)\n\-\-\-\n/m, "")
33
35
  data.merge! YAML.load($1)
34
- ""
35
36
  end
36
37
 
37
- @contents.sub!(/\A\+\+\+\n(.+)\n\+\+\+\n/m) do
38
+ # TOML Front Matter
39
+ if @contents.sub!(/\A\+\+\+\n(.+)\n\+\+\+\n/m, "")
38
40
  data.merge! TOML.parse($1)
39
- ""
40
41
  end
41
42
 
42
43
  data
@@ -1,38 +1,19 @@
1
1
  module Flutterby
2
2
  class Folder < Entity
3
- attr_reader :children
4
-
5
- def list(indent: 0)
6
- super
7
- children.each { |c| c.list(indent: indent + 1) }
8
- end
9
-
10
3
  def read
11
- @children = Dir[::File.join(fs_path, "*")].map do |entry|
12
- Flutterby.from(entry, parent: self)
13
- end.compact
4
+ Dir[::File.join(fs_path, "*")].each do |entry|
5
+ if entity = Flutterby.from(entry)
6
+ children << entity
7
+ end
8
+ end
14
9
  end
15
10
 
16
11
  def write_static(path)
17
12
  Dir.mkdir(path) unless ::File.exists?(path)
18
13
 
19
- @children.each do |child|
14
+ children.each do |child|
20
15
  child.export(path)
21
16
  end
22
17
  end
23
-
24
- def find(path)
25
- (name, slash, rest) = path.partition("/")
26
-
27
- name = name.split('.').first
28
- child = @children.find { |c| c.name == name }
29
- rest.empty? ? child : child.find(rest)
30
- end
31
-
32
- # Returns all children that will compile to a HTML page.
33
- #
34
- def pages
35
- children.select { |c| c.ext == "html" }
36
- end
37
18
  end
38
19
  end
@@ -1,3 +1,3 @@
1
1
  module Flutterby
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  module Flutterby
2
2
  class View
3
3
  attr_reader :entity
4
+ alias_method :page, :entity
4
5
 
5
6
  def initialize(entity)
6
7
  @entity = entity
@@ -9,5 +10,13 @@ module Flutterby
9
10
  def date_format(date, fmt)
10
11
  date.strftime(fmt)
11
12
  end
13
+
14
+ def render(expr, *args)
15
+ find(expr).render(*args)
16
+ end
17
+
18
+ def find(expr)
19
+ entity.find(expr) or raise "No entity found for #{expr}"
20
+ end
12
21
  end
13
22
  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.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik Mans