gryphon_nest 1.0.0 → 1.1.0
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 +4 -4
- data/bin/nest +0 -0
- data/lib/gryphon_nest/renderer.rb +55 -0
- data/lib/gryphon_nest/version.rb +1 -1
- data/lib/gryphon_nest.rb +112 -109
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2aeebe3d25d9b2d60ea272fc36fec298100385b07ba99b04baa16a775bda72b
|
4
|
+
data.tar.gz: 326e9baee31c24ebde9a77560222c27570727475124acf9b692f814b350d1fa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d370fe1f376ca822086a5f95ab0da0e1aee9b22ba60212a9d461ebdb34bda84c8ccc24b1445c7d7e06c4548eaf7099f73ac3022419b9188d092a92b464983e8f
|
7
|
+
data.tar.gz: ab4796fd7bc4f3e2be4f86714dc2dbc57b1962d30ce63caa03f49bee99add7104c25e7631c14a72cbdfc2c0c280b08ee0e1118e8cfdb614ee1ff41c01963dcb5
|
data/bin/nest
CHANGED
File without changes
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'htmlbeautifier'
|
4
|
+
require 'mustache'
|
5
|
+
|
6
|
+
module GryphonNest
|
7
|
+
# Renders mustache templates to html
|
8
|
+
class Renderer
|
9
|
+
# @param layouts [Array]
|
10
|
+
def initialize
|
11
|
+
@layouts = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param template [String]
|
15
|
+
# @param layout [String]
|
16
|
+
# @param context [Hash]
|
17
|
+
# @return [String]
|
18
|
+
def render(template, layout, context)
|
19
|
+
File.open(template) do |f|
|
20
|
+
content = render_template(f.read, context)
|
21
|
+
layout = get_template_layout(layout)
|
22
|
+
|
23
|
+
unless layout.nil?
|
24
|
+
context[:yield] = content
|
25
|
+
content = render_template(layout, context)
|
26
|
+
end
|
27
|
+
|
28
|
+
HtmlBeautifier.beautify(content)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# @param content [String]
|
35
|
+
# @param context [Hash]
|
36
|
+
# @return [String]
|
37
|
+
def render_template(content, context)
|
38
|
+
Mustache.render(content, context)
|
39
|
+
end
|
40
|
+
|
41
|
+
# @param path [String]
|
42
|
+
# @return [String|null]
|
43
|
+
def get_template_layout(path)
|
44
|
+
return @layouts[path] if @layouts.key?(path)
|
45
|
+
|
46
|
+
return unless File.exist?(path)
|
47
|
+
|
48
|
+
File.open(path) do |file|
|
49
|
+
content = file.read
|
50
|
+
@layouts[path] = content
|
51
|
+
return content
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/gryphon_nest/version.rb
CHANGED
data/lib/gryphon_nest.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
|
-
require 'htmlbeautifier'
|
5
|
-
require 'mustache'
|
6
4
|
require 'pathname'
|
7
5
|
require 'webrick'
|
8
6
|
require 'yaml'
|
9
7
|
|
10
8
|
module GryphonNest
|
9
|
+
autoload :Renderer, 'gryphon_nest/renderer'
|
11
10
|
autoload :VERSION, 'gryphon_nest/version'
|
12
11
|
|
13
12
|
class << self
|
@@ -18,6 +17,32 @@ module GryphonNest
|
|
18
17
|
LAYOUT_DIR = 'layouts'
|
19
18
|
TEMPLATE_EXT = '.mustache'
|
20
19
|
|
20
|
+
def build_website
|
21
|
+
raise "Content directory doesn't exist" unless Dir.exist?(CONTENT_DIR)
|
22
|
+
|
23
|
+
existing_files = []
|
24
|
+
if Dir.exist?(BUILD_DIR)
|
25
|
+
existing_files = filter_glob("#{BUILD_DIR}/**/*")
|
26
|
+
else
|
27
|
+
Dir.mkdir(BUILD_DIR)
|
28
|
+
end
|
29
|
+
|
30
|
+
existing_files = existing_files.difference(process_content)
|
31
|
+
existing_files = existing_files.difference(copy_assets)
|
32
|
+
cleanup(existing_files)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param port [Integer]
|
36
|
+
def serve_website(port)
|
37
|
+
puts "Running local server on #{port}"
|
38
|
+
server = WEBrick::HTTPServer.new(Port: port, DocumentRoot: BUILD_DIR)
|
39
|
+
# Trap ctrl c so we don't get the horrible stack trace
|
40
|
+
trap('INT') { server.shutdown }
|
41
|
+
server.start
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
21
46
|
# @param template_name [String]
|
22
47
|
# @return [String]
|
23
48
|
def get_output_name(template_name)
|
@@ -33,51 +58,98 @@ module GryphonNest
|
|
33
58
|
path.to_s
|
34
59
|
end
|
35
60
|
|
36
|
-
# @
|
37
|
-
# @
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
61
|
+
# @params path [String]
|
62
|
+
# @return [Array]
|
63
|
+
def filter_glob(path)
|
64
|
+
Dir.glob(path).reject do |p|
|
65
|
+
File.directory?(p)
|
66
|
+
end
|
67
|
+
end
|
43
68
|
|
44
|
-
|
69
|
+
# @param path [String]
|
70
|
+
# @param content [String]
|
71
|
+
def save_html_file(path, content)
|
72
|
+
dir = File.dirname(path)
|
45
73
|
|
46
|
-
|
47
|
-
|
48
|
-
|
74
|
+
unless Dir.exist?(dir)
|
75
|
+
puts "Creating #{dir}"
|
76
|
+
Dir.mkdir(dir)
|
77
|
+
end
|
78
|
+
|
79
|
+
puts "Creating #{path}"
|
80
|
+
File.write(path, content)
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param src [String]
|
84
|
+
# @param dest [String]
|
85
|
+
# @param layout_file [String]
|
86
|
+
# @param context_file [String]
|
87
|
+
# @return [Boolean]
|
88
|
+
def can_create_html_file?(src, dest, layout_file, context_file)
|
89
|
+
return true unless File.exist?(dest)
|
90
|
+
|
91
|
+
src_mtime = File.mtime(src)
|
92
|
+
dest_mtime = File.mtime(dest)
|
93
|
+
|
94
|
+
return true if src_mtime > dest_mtime
|
95
|
+
|
96
|
+
if File.exist?(layout_file)
|
97
|
+
layout_mtime = File.mtime(layout_file)
|
98
|
+
return true if layout_mtime > dest_mtime
|
49
99
|
end
|
100
|
+
|
101
|
+
if File.exist?(context_file)
|
102
|
+
context_mtime = File.mtime(context_file)
|
103
|
+
return true if context_mtime > dest_mtime
|
104
|
+
end
|
105
|
+
|
106
|
+
false
|
50
107
|
end
|
51
108
|
|
52
109
|
# @param name [String]
|
53
|
-
# @param
|
54
|
-
# @param layouts [Hash]
|
55
|
-
# @param data [Hash]
|
110
|
+
# @param context [Hash]
|
56
111
|
# @return [String]
|
57
|
-
def
|
58
|
-
|
59
|
-
template_data = data.fetch(key, {})
|
112
|
+
def get_layout_file(name, context)
|
113
|
+
path = Pathname.new(LAYOUT_DIR)
|
60
114
|
|
61
|
-
|
115
|
+
if context.key?('layout')
|
116
|
+
layout = context['layout']
|
117
|
+
path = path.join(layout)
|
62
118
|
|
63
|
-
|
64
|
-
|
65
|
-
|
119
|
+
raise "#{name} requires layout file #{layout} but it doesn't exist or can't be read" unless File.exist?(path)
|
120
|
+
|
121
|
+
return path.to_s
|
122
|
+
end
|
123
|
+
|
124
|
+
path.join('main.mustache').to_s
|
66
125
|
end
|
67
126
|
|
68
|
-
# @
|
69
|
-
# @return [
|
70
|
-
def
|
71
|
-
|
72
|
-
|
127
|
+
# @param path [String]
|
128
|
+
# @return [Hash]
|
129
|
+
def read_context_file(path)
|
130
|
+
return {} if path == ''
|
131
|
+
|
132
|
+
return {} unless File.exist?(path)
|
133
|
+
|
134
|
+
YAML.safe_load_file(path)
|
135
|
+
end
|
136
|
+
|
137
|
+
# @param name [String]
|
138
|
+
# @return [String]
|
139
|
+
def get_context_file(name)
|
140
|
+
basename = File.basename(name, TEMPLATE_EXT)
|
141
|
+
|
142
|
+
Dir.glob("#{DATA_DIR}/#{basename}.{yaml,yml}") do |f|
|
143
|
+
return f
|
73
144
|
end
|
145
|
+
|
146
|
+
''
|
74
147
|
end
|
75
148
|
|
76
|
-
# @param layouts [Hash]
|
77
|
-
# @param data [Hash]
|
78
149
|
# @return [Array]
|
79
|
-
def process_content
|
150
|
+
def process_content
|
80
151
|
created_files = []
|
152
|
+
renderer = Renderer.new
|
81
153
|
|
82
154
|
filter_glob("#{CONTENT_DIR}/**/*").each do |template|
|
83
155
|
if File.extname(template) != TEMPLATE_EXT
|
@@ -85,23 +157,16 @@ module GryphonNest
|
|
85
157
|
next
|
86
158
|
end
|
87
159
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
dir = File.dirname(html_file)
|
160
|
+
dest_file = get_output_name(template)
|
161
|
+
context_file = get_context_file(template)
|
162
|
+
context = read_context_file(context_file)
|
163
|
+
layout_file = get_layout_file(template, context)
|
94
164
|
|
95
|
-
|
96
|
-
|
97
|
-
Dir.mkdir(dir)
|
98
|
-
end
|
165
|
+
created_files << dest_file
|
166
|
+
next unless can_create_html_file?(template, dest_file, layout_file, context_file)
|
99
167
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
created_files << html_file
|
104
|
-
end
|
168
|
+
content = renderer.render(template, layout_file, context)
|
169
|
+
save_html_file(dest_file, content)
|
105
170
|
end
|
106
171
|
|
107
172
|
created_files
|
@@ -128,51 +193,15 @@ module GryphonNest
|
|
128
193
|
|
129
194
|
next unless can_copy_asset?(asset, dest)
|
130
195
|
|
196
|
+
puts "Copying #{asset} to #{dest}"
|
131
197
|
dest_dir = File.dirname(dest)
|
132
198
|
FileUtils.makedirs(dest_dir)
|
133
199
|
FileUtils.copy_file(asset, dest)
|
134
|
-
puts "Copying #{asset} to #{dest}"
|
135
200
|
end
|
136
201
|
|
137
202
|
copied_files
|
138
203
|
end
|
139
204
|
|
140
|
-
# @return [Hash]
|
141
|
-
def read_layout_files
|
142
|
-
return {} unless Dir.exist?(LAYOUT_DIR)
|
143
|
-
|
144
|
-
layouts = {}
|
145
|
-
|
146
|
-
Dir.glob("#{LAYOUT_DIR}/*#{TEMPLATE_EXT}") do |f|
|
147
|
-
key = File.basename(f, TEMPLATE_EXT)
|
148
|
-
layouts[key] = File.read(f)
|
149
|
-
end
|
150
|
-
|
151
|
-
layouts
|
152
|
-
end
|
153
|
-
|
154
|
-
# @param file [String]
|
155
|
-
# @return [Hash]
|
156
|
-
def read_yaml(file)
|
157
|
-
File.open(file) do |yaml|
|
158
|
-
YAML.safe_load(yaml)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
# @return [Hash]
|
163
|
-
def read_data_files
|
164
|
-
return {} unless Dir.exist?(DATA_DIR)
|
165
|
-
|
166
|
-
data = {}
|
167
|
-
|
168
|
-
Dir.glob("#{DATA_DIR}/*.{yaml,yml}") do |f|
|
169
|
-
key = File.basename(f, '.*')
|
170
|
-
data[key] = read_yaml(f)
|
171
|
-
end
|
172
|
-
|
173
|
-
data
|
174
|
-
end
|
175
|
-
|
176
205
|
# @param junk_files [Array]
|
177
206
|
def cleanup(junk_files)
|
178
207
|
junk_files.each do |f|
|
@@ -180,31 +209,5 @@ module GryphonNest
|
|
180
209
|
FileUtils.remove_file(f)
|
181
210
|
end
|
182
211
|
end
|
183
|
-
|
184
|
-
def build_website
|
185
|
-
raise "Content directory doesn't exist" unless Dir.exist?(CONTENT_DIR)
|
186
|
-
|
187
|
-
existing_files = []
|
188
|
-
if Dir.exist?(BUILD_DIR)
|
189
|
-
existing_files = filter_glob("#{BUILD_DIR}/**/*")
|
190
|
-
else
|
191
|
-
Dir.mkdir(BUILD_DIR)
|
192
|
-
end
|
193
|
-
|
194
|
-
data = read_data_files
|
195
|
-
layouts = read_layout_files
|
196
|
-
existing_files = existing_files.difference(process_content(layouts, data))
|
197
|
-
existing_files = existing_files.difference(copy_assets)
|
198
|
-
cleanup(existing_files)
|
199
|
-
end
|
200
|
-
|
201
|
-
# @param port [Integer]
|
202
|
-
def serve_website(port)
|
203
|
-
put "Running local server on #{port}"
|
204
|
-
server = WEBrick::HTTPServer.new(Port: port, DocumentRoot: BUILD_DIR)
|
205
|
-
# Trap ctrl c so we don't get the horrible stack trace
|
206
|
-
trap('INT') { server.shutdown }
|
207
|
-
server.start
|
208
|
-
end
|
209
212
|
end
|
210
213
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gryphon_nest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Birmingham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: htmlbeautifier
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- LICENSE
|
93
93
|
- bin/nest
|
94
94
|
- lib/gryphon_nest.rb
|
95
|
+
- lib/gryphon_nest/renderer.rb
|
95
96
|
- lib/gryphon_nest/version.rb
|
96
97
|
homepage: https://github.com/chrisBirmingham/gryphon_nest
|
97
98
|
licenses:
|