scms 3.2.0 → 4.0.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 +8 -8
- data/bin/scms +6 -4
- data/lib/scms.rb +300 -244
- data/lib/scms/scms-pageoptions.rb +87 -0
- data/lib/scms/scms-utils.rb +1 -10
- data/lib/scms/scms-watcher.rb +49 -13
- data/lib/scms/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDRkYmE3ODg1NzQzMDQ3NjcwYjJlNTAxNTk4YWJiYzg4MzQ5MmI0MA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjliNjY2YzNhNTFmYzg1NjI2Y2I1ZjE3NTg0NmExMDY4ODA2ZWJkZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODdlZWEzZGM0MDQ2NTA5MzczOTQzZDMwYzY2Y2Q2NTA5Nzg0NzExYjE3NzA3
|
10
|
+
NGU5OGQzYjEyNmZhMWY4NTA1NWVkNmFhNDUwYjJjYzZiYjA3NTI5ZTM3N2Q2
|
11
|
+
MDA3NmRmYjE3NDViNTY4OWE3ZjdlNTkwODY4M2M1NTg3N2IxZWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NTMyYTMwMGVlMzNiODZjZDg2MmUzOTk4MTMxZTRjMDFkMWZmZjRmMGUyOWIw
|
14
|
+
M2YyY2RiZmQzYWUyNjRiYzczOTI1YWQ4OTVmN2Q2ZmU2MzQ2Y2Y1NzM2MjMw
|
15
|
+
M2E4OTRjNGQyZWM2NGFlYTA3OWRmZjI2YmMxZjczZTAxYzhhY2Q=
|
data/bin/scms
CHANGED
@@ -118,18 +118,20 @@ if options[:create] != nil
|
|
118
118
|
exit
|
119
119
|
end
|
120
120
|
|
121
|
-
|
121
|
+
monkeyhookDir = File.join(Folders[:website], "scripts")
|
122
|
+
monkeyhook = File.join(monkeyhookDir, "air-monkey-hook.js")
|
122
123
|
if options[:mode] == "cms"
|
124
|
+
Dir.mkdir(monkeyhookDir, 755) unless File::directory?(monkeyhookDir)
|
123
125
|
FileUtils.cp(File.join(Folders[:assets], "air-monkey-hook.js"), monkeyhook)
|
124
126
|
else
|
125
127
|
FileUtils.rm(monkeyhook) if File.exist?(monkeyhook) && options[:publish]
|
126
128
|
end
|
127
129
|
|
128
|
-
settings = Scms.
|
130
|
+
settings = Scms.getSettings(Folders[:config])
|
129
131
|
Scms.sassall(Folders[:website])
|
130
132
|
Scms.bundle(settings, Folders[:website])
|
131
|
-
Scms.build(Folders[:website], settings, options
|
132
|
-
Scms.
|
133
|
+
Scms.build(Folders[:website], settings, options)
|
134
|
+
Scms.copyWebsite(Folders[:website], Folders[:destination]) if Folders[:destination] != ''
|
133
135
|
|
134
136
|
if options[:watch]
|
135
137
|
ScmsWatcher.watch(settings, options, Folders[:config])
|
data/lib/scms.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
require "scms/version"
|
2
|
-
|
3
1
|
module Scms
|
2
|
+
require "scms/version"
|
3
|
+
require 'scms/scms-pageoptions.rb'
|
4
4
|
require 'scms/scms-helpers.rb'
|
5
5
|
require 'scms/scms-utils.rb'
|
6
6
|
require 'scms/scms-xmlhandler.rb'
|
7
7
|
require 'scms/s3deploy.rb'
|
8
8
|
|
9
|
+
require 'fileutils'
|
10
|
+
require 'pathname'
|
9
11
|
require 'erb'
|
10
12
|
require 'ostruct'
|
11
13
|
require 'yaml'
|
@@ -15,7 +17,7 @@ module Scms
|
|
15
17
|
|
16
18
|
include YAML
|
17
19
|
|
18
|
-
def Scms.
|
20
|
+
def Scms.getSettings(configdir)
|
19
21
|
yamlpath=File.join(configdir, "_config.yml")
|
20
22
|
settings = ScmsUtils.readyaml(yamlpath)
|
21
23
|
if settings
|
@@ -25,9 +27,8 @@ module Scms
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
|
-
def Scms.build(website, settings,
|
29
|
-
|
30
|
-
#ScmsUtils.log("Mode: #{mode}")
|
30
|
+
def Scms.build(website, settings, options)
|
31
|
+
|
31
32
|
|
32
33
|
ScmsUtils.boldlog("Compiling #{website}")
|
33
34
|
|
@@ -49,7 +50,7 @@ module Scms
|
|
49
50
|
ScmsUtils.writelog("type NUL > #{bootstrap}", website)
|
50
51
|
end
|
51
52
|
end
|
52
|
-
Scms.
|
53
|
+
Scms.parsePages(website, settings, options)
|
53
54
|
else
|
54
55
|
ScmsUtils.errLog("Config is empty")
|
55
56
|
end
|
@@ -58,232 +59,179 @@ module Scms
|
|
58
59
|
ScmsUtils.log(ScmsUtils.uriEncode("file:///#{website}"))
|
59
60
|
end
|
60
61
|
|
61
|
-
def Scms.
|
62
|
-
# build
|
63
|
-
|
64
|
-
|
62
|
+
def Scms.parsePages(website, settings, options)
|
63
|
+
# build pages defined in config file
|
64
|
+
Scms.parseSettingsPages(website, settings, options)
|
65
|
+
# build pages pased on _pages folder
|
66
|
+
Scms.parseFolderPages(website, settings, options)
|
67
|
+
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
# Build navigation model
|
69
|
-
navmodel = Scms.navmodel(settings)
|
70
|
-
#puts "navmodel: #{navmodel}"
|
69
|
+
def Scms.parseSettingsPages(website, settings, options)
|
70
|
+
if settings["pages"] != nil
|
71
71
|
|
72
72
|
ScmsUtils.log("Compiling Pages:")
|
73
73
|
settings["pages"].each do |pagedata|
|
74
74
|
#puts "pagedata: #{pagedata}"
|
75
75
|
if pagedata != nil
|
76
|
-
pagedata.each do |
|
77
|
-
pagename =
|
78
|
-
pageconfig =
|
79
|
-
pageurl = pageconfig["generate"]
|
80
|
-
title = pagename
|
81
|
-
title = pageconfig["title"] unless pageconfig["title"] == nil
|
82
|
-
description = ""
|
83
|
-
description = pageconfig["description"] if pageconfig["description"] != nil
|
84
|
-
keywords = ""
|
85
|
-
keywords = pageconfig["keywords"] if pageconfig["keywords"] != nil
|
86
|
-
skin = settings["template"]
|
87
|
-
skin = pageconfig["template"] unless pageconfig["template"] == nil
|
88
|
-
|
89
|
-
resource = Hash.new
|
90
|
-
if pageconfig["resource"] != nil
|
91
|
-
resourcepath = File.join(website, pageconfig["resource"])
|
92
|
-
if File.exists?(resourcepath)
|
93
|
-
#ScmsUtils.log( "_Resource found: #{pageconfig["resource"]}_" )
|
94
|
-
begin
|
95
|
-
resource = YAML.load_file(resourcepath)
|
96
|
-
rescue Exception=>e
|
97
|
-
ScmsUtils.errLog(e.message)
|
98
|
-
ScmsUtils.log(e.backtrace.inspect)
|
99
|
-
end
|
100
|
-
else
|
101
|
-
ScmsUtils.errLog("Resource not found: #{pageconfig["resource"]}")
|
102
|
-
ScmsUtils.writelog("::Resource not found #{pageconfig["resource"]}", website)
|
103
|
-
ScmsUtils.writelog("type NUL > #{resourcepath}", website)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
hasHandler = false
|
108
|
-
if pageconfig["handler"] != nil
|
109
|
-
handlerpath = File.join(website, pageconfig["handler"])
|
110
|
-
if File.exists?(handlerpath)
|
111
|
-
ScmsUtils.log( "Handler found: #{pageconfig["handler"]}" )
|
112
|
-
hasHandler = true
|
113
|
-
begin
|
114
|
-
require handlerpath
|
115
|
-
# #hasHandler = ScmsHandler.instance_methods(false).include? :render
|
116
|
-
# hasHandler = ScmsHandler.method_defined?(:render)
|
117
|
-
# puts "has render method: #{hasHandler}"
|
118
|
-
# if !hasHandler
|
119
|
-
# ScmsUtils.errLog( "Handler doesnt have a render method" )
|
120
|
-
# end
|
121
|
-
rescue Exception => e
|
122
|
-
ScmsUtils.errLog( "Problem running: ScmsHandler: #{e.message}" )
|
123
|
-
end
|
124
|
-
else
|
125
|
-
ScmsUtils.errLog("Handler not found: #{pageconfig["handler"]}")
|
126
|
-
ScmsUtils.writelog("::Handler not found #{pageconfig["handler"]}", website)
|
127
|
-
ScmsUtils.writelog("type NUL > #{handlerpath}", website)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
views = Hash.new
|
132
|
-
if pageconfig["views"] != nil
|
133
|
-
pageconfig["views"].each do |view|
|
134
|
-
views[view[0]] = ""
|
135
|
-
viewparts = view[1].split("?") # This allows views to have a query string in the config
|
136
|
-
viewname = viewparts[0]
|
137
|
-
viewqs = viewparts[1]
|
138
|
-
|
139
|
-
#puts "viewname: #{viewname}, viewqs: #{viewqs}"
|
140
|
-
|
141
|
-
viewpath = File.join(website, viewname)
|
142
|
-
|
143
|
-
|
144
|
-
if File.exists?(viewpath)
|
145
|
-
begin
|
146
|
-
htmlsnipet = File.read(viewpath)
|
147
|
-
rescue Exception=>e
|
148
|
-
ScmsUtils.errLog(e.message)
|
149
|
-
ScmsUtils.log(e.backtrace.inspect)
|
150
|
-
end
|
151
|
-
|
152
|
-
if htmlsnipet.empty?
|
153
|
-
ScmsUtils.log("Empty view: #{view[1]}")
|
154
|
-
end
|
155
|
-
|
156
|
-
model = Hash.new
|
157
|
-
model = Hash[viewqs.split('&').map{ |q| q.split('=') }] if viewqs != nil
|
158
|
-
|
159
|
-
viewmodel = Hash.new
|
160
|
-
viewmodel = {
|
161
|
-
:name => pagename,
|
162
|
-
:title => title,
|
163
|
-
:url => pageurl,
|
164
|
-
:data => pagedata,
|
165
|
-
:rootdir => website,
|
166
|
-
:resource => resource,
|
167
|
-
:view => {
|
168
|
-
:name => viewname,
|
169
|
-
:model => model
|
170
|
-
}
|
171
|
-
}
|
172
|
-
|
173
|
-
if hasHandler
|
174
|
-
ScmsUtils.log("Rendering with handler")
|
175
|
-
begin
|
176
|
-
viewSnippet = ScmsHandler.render(viewpath)
|
177
|
-
rescue Exception=>e
|
178
|
-
ScmsUtils.errLog(e.message)
|
179
|
-
ScmsUtils.log(e.backtrace.inspect)
|
180
|
-
end
|
181
|
-
|
182
|
-
else
|
183
|
-
#todo: why not use htmlsnipet
|
184
|
-
snnipetCode = File.read(viewpath)
|
185
|
-
|
186
|
-
case File.extname(view[1])
|
187
|
-
when ".xml"
|
188
|
-
viewSnippet = ScmsXmlHandler.transform(snnipetCode)
|
189
|
-
when ".md"
|
190
|
-
begin
|
191
|
-
snnipetCode = snnipetCode.encode('UTF-8', :invalid => :replace, :undef => :replace)
|
192
|
-
doc = Maruku.new(snnipetCode)
|
193
|
-
viewSnippet = doc.to_html
|
194
|
-
rescue Exception => e
|
195
|
-
viewSnippet = snnipetCode
|
196
|
-
ScmsUtils.errLog(e.message)
|
197
|
-
ScmsUtils.log(e.backtrace.inspect)
|
198
|
-
end
|
199
|
-
else
|
200
|
-
viewSnippet = snnipetCode
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
if @mode == "cms"
|
205
|
-
views[view[0]] = "<div class='cms' data-view='#{view[1]}' data-page='#{pageurl}'>#{Scms.parsetemplate(viewSnippet, viewmodel)}</div>"
|
206
|
-
else
|
207
|
-
views[view[0]] = Scms.parsetemplate(viewSnippet, viewmodel)
|
208
|
-
end
|
209
|
-
else
|
210
|
-
ScmsUtils.errLog("View not found: #{view[0]} - #{view[1]} [#{viewpath}]")
|
211
|
-
ScmsUtils.writelog("::View not found: #{view[0]} - #{view[1]} [#{viewpath}]", website)
|
212
|
-
ScmsUtils.writelog("type NUL > #{viewpath}", website)
|
213
|
-
end
|
214
|
-
#ScmsUtils.log( "view = #{view[0]} - #{view[1]}" )
|
215
|
-
end
|
216
|
-
end
|
76
|
+
pagedata.each do |pageOptions|
|
77
|
+
pagename = pageOptions[0]
|
78
|
+
pageconfig = pageOptions[1]
|
217
79
|
|
218
|
-
|
219
|
-
|
80
|
+
pageOptions = PageOptions.new(pagename, website, pageconfig, settings)
|
81
|
+
views = Scms.getSettingsViews(pageconfig["views"], website, pageOptions, options)
|
220
82
|
|
221
|
-
|
222
|
-
if
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
:description => description,
|
231
|
-
:keywords => keywords,
|
232
|
-
:url => pageurl,
|
233
|
-
:views => views,
|
234
|
-
:resource => resource,
|
235
|
-
:config => pageconfig,
|
236
|
-
:bundles => bundlemodel,
|
237
|
-
:navigation => navmodel,
|
238
|
-
:data => pagedata,
|
239
|
-
:rootdir => website,
|
240
|
-
:monkeyhook => monkeyhook,
|
241
|
-
:livereload => livereload
|
242
|
-
}
|
243
|
-
|
244
|
-
break if pageconfig["generate"] == nil
|
245
|
-
|
246
|
-
erb = File.join(website, skin)
|
247
|
-
out = File.join(website, File.join(pageconfig["generate"].sub('~/','')))
|
248
|
-
|
249
|
-
#ScmsUtils.log("Generating: #{pageurl} with #{skin}")
|
83
|
+
# Dont save a page if no views have been defined (so the config han have pages for nav building)
|
84
|
+
break if views.length < 1
|
85
|
+
Scms.save(settings, website, pageOptions, views, options)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
#ScmsUtils.log( out )
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
250
92
|
|
251
|
-
|
252
|
-
|
253
|
-
|
93
|
+
def Scms.getSettingsViews(settingsViews, website, pageOptions, options)
|
94
|
+
views = Hash.new
|
95
|
+
if settingsViews != nil
|
96
|
+
settingsViews.each do |view|
|
97
|
+
viewname = view[0]
|
98
|
+
viewparts = view[1].split("?") # This allows views to have a query string in the config
|
99
|
+
viewpath = viewparts[0]
|
100
|
+
viewqs = viewparts[1]
|
101
|
+
|
102
|
+
viewModel = Hash.new
|
103
|
+
viewModel = Hash[viewqs.split('&').map{ |q| q.split('=') }] if viewqs != nil
|
104
|
+
views[viewname] = Scms.parseView(viewname, viewpath, website, pageOptions, options, viewModel)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
return views
|
108
|
+
end
|
254
109
|
|
255
|
-
|
110
|
+
def Scms.parseFolderPages(website, settings, options)
|
111
|
+
pagesFolder = File.join(website, "_pages")
|
112
|
+
Dir.glob("#{pagesFolder}/**/*/").each do |pageFolder|
|
113
|
+
pagename = File.basename(pageFolder, ".*")
|
114
|
+
#puts "pagename: #{pagename}"
|
115
|
+
|
116
|
+
pageconfig = nil
|
117
|
+
pageconfig = Scms.getSettings(pageFolder) if File.exists?(File.join(pageFolder, "_config.yml"))
|
118
|
+
pageOptions = PageOptions.new(pagename, website, pageconfig, settings)
|
119
|
+
views = Hash.new
|
120
|
+
if pageconfig != nil
|
121
|
+
views = Scms.getSettingsViews(pageconfig["views"], website, pageOptions, options) if pageconfig["views"] != nil
|
122
|
+
end
|
123
|
+
|
124
|
+
Dir.glob(File.join(pageFolder, "*")).reject { |f| f =~ /\.yml$/ || File.directory?(f) }.each do |view|
|
125
|
+
viewname = File.basename(view, ".*")
|
126
|
+
viewpath = Pathname.new(view).relative_path_from(Pathname.new(website)).to_s
|
127
|
+
views[viewname] = Scms.parseView(viewname, viewpath, website, pageOptions, options)
|
128
|
+
end
|
129
|
+
Scms.save(settings, website, pageOptions, views, options)
|
130
|
+
end
|
131
|
+
end
|
256
132
|
|
257
|
-
|
258
|
-
|
259
|
-
html = Scms.parsetemplate(erbtemplate, pagemodel)
|
133
|
+
def Scms.parseView(viewname, viewpath, website, pageOptions, options, viewModel = nil)
|
134
|
+
#puts "parsing view: #{viewname}"
|
260
135
|
|
261
|
-
|
262
|
-
|
263
|
-
websiteroot = settings["url"] unless settings["rooturl"] == nil
|
136
|
+
viewhtml = ""
|
137
|
+
viewfullpath = File.join(website, viewpath)
|
264
138
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
end
|
139
|
+
if File.exists?(viewfullpath)
|
140
|
+
begin
|
141
|
+
htmlsnipet = File.read(viewfullpath)
|
142
|
+
rescue Exception=>e
|
143
|
+
ScmsUtils.errLog(e.message)
|
144
|
+
ScmsUtils.log(e.backtrace.inspect)
|
145
|
+
end
|
146
|
+
|
147
|
+
if htmlsnipet.empty?
|
148
|
+
ScmsUtils.log("Empty view: #{viewpath}")
|
149
|
+
end
|
277
150
|
|
278
|
-
|
151
|
+
hasHandler = false
|
152
|
+
if pageOptions.handler != nil
|
153
|
+
handlerpath = File.join(website, pageOptions.handler)
|
154
|
+
if File.exists?(handlerpath)
|
155
|
+
ScmsUtils.log( "Handler found: #{pageOptions.handler}" )
|
156
|
+
hasHandler = true
|
157
|
+
begin
|
158
|
+
require handlerpath
|
159
|
+
# #hasHandler = ScmsHandler.instance_methods(false).include? :render
|
160
|
+
# hasHandler = ScmsHandler.method_defined?(:render)
|
161
|
+
# puts "has render method: #{hasHandler}"
|
162
|
+
# if !hasHandler
|
163
|
+
# ScmsUtils.errLog( "Handler doesnt have a render method" )
|
164
|
+
# end
|
165
|
+
rescue Exception => e
|
166
|
+
ScmsUtils.errLog( "Problem running: ScmsHandler: #{e.message}" )
|
279
167
|
end
|
168
|
+
else
|
169
|
+
ScmsUtils.errLog("Handler not found: #{pageOptions.handler}")
|
170
|
+
ScmsUtils.writelog("::Handler not found #{pageOptions.handler}", website)
|
171
|
+
ScmsUtils.writelog("type NUL > #{handlerpath}", website)
|
280
172
|
end
|
281
|
-
#ScmsUtils.log( out )
|
282
173
|
end
|
174
|
+
|
175
|
+
if hasHandler
|
176
|
+
ScmsUtils.log("Rendering with handler")
|
177
|
+
begin
|
178
|
+
viewSnippet = ScmsHandler.render(viewpath)
|
179
|
+
rescue Exception=>e
|
180
|
+
ScmsUtils.errLog(e.message)
|
181
|
+
ScmsUtils.log(e.backtrace.inspect)
|
182
|
+
end
|
183
|
+
else
|
184
|
+
case File.extname(viewpath)
|
185
|
+
when ".xml"
|
186
|
+
viewSnippet = ScmsXmlHandler.transform(htmlsnipet)
|
187
|
+
when ".md"
|
188
|
+
begin
|
189
|
+
htmlsnipet = htmlsnipet.encode('UTF-8', :invalid => :replace, :undef => :replace)
|
190
|
+
doc = Maruku.new(htmlsnipet)
|
191
|
+
viewSnippet = doc.to_html
|
192
|
+
rescue Exception => e
|
193
|
+
viewSnippet = htmlsnipet
|
194
|
+
ScmsUtils.errLog(e.message)
|
195
|
+
ScmsUtils.log(e.backtrace.inspect)
|
196
|
+
end
|
197
|
+
else
|
198
|
+
viewSnippet = htmlsnipet
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
viewmodel = Hash.new
|
203
|
+
viewmodel = {
|
204
|
+
:name => pageOptions.name,
|
205
|
+
:title => pageOptions.title,
|
206
|
+
:url => pageOptions.url,
|
207
|
+
:resource => pageOptions.resource,
|
208
|
+
:rootdir => website,
|
209
|
+
:view => {
|
210
|
+
:name => viewname,
|
211
|
+
:path => viewfullpath,
|
212
|
+
:model => viewModel
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
if options[:mode] == "cms"
|
217
|
+
viewhtml = "<div class='cms' data-view='#{viewpath}' data-page='#{pageOptions.url}'>#{Scms.render(viewSnippet, viewmodel)}</div>"
|
218
|
+
else
|
219
|
+
viewhtml = Scms.render(viewSnippet, viewmodel)
|
220
|
+
end
|
221
|
+
else
|
222
|
+
ScmsUtils.errLog("View not found: #{viewname} [#{viewpath}]")
|
223
|
+
ScmsUtils.writelog("::View not found: #{viewname} [#{viewpath}]", website)
|
224
|
+
ScmsUtils.writelog("type NUL > #{viewpath}", website)
|
283
225
|
end
|
226
|
+
|
227
|
+
return viewhtml
|
284
228
|
end
|
285
229
|
|
286
230
|
def Scms.parsetemplate(template, hash = Hash.new)
|
231
|
+
return Scms.render(template, hash)
|
232
|
+
end
|
233
|
+
|
234
|
+
def Scms.render(template, hash = Hash.new)
|
287
235
|
result = ""
|
288
236
|
if template != nil
|
289
237
|
begin
|
@@ -291,22 +239,29 @@ module Scms
|
|
291
239
|
page = hash
|
292
240
|
else
|
293
241
|
page = OpenStruct.new(hash)
|
294
|
-
end
|
242
|
+
end
|
295
243
|
|
296
244
|
erb = ERB.new(template)
|
297
245
|
result = erb.result(page.instance_eval { binding })
|
298
246
|
rescue StandardError => e
|
247
|
+
puts "page: #{page}"
|
299
248
|
ScmsUtils.errLog("Critical Error: Could not parse template")
|
300
|
-
|
301
|
-
#puts e.inspect
|
249
|
+
ScmsUtils.errLog(e.message)
|
302
250
|
|
303
|
-
result = "
|
251
|
+
result = "<code style='border: 1px solid #666; background-color: light-yellow;'><pre>"
|
252
|
+
result += e.message
|
253
|
+
result += "\n\n"
|
254
|
+
result += e.inspect
|
255
|
+
result += "\n\n"
|
256
|
+
result += "Invalid Keys in Template\n\n"
|
304
257
|
result += "Valid Keys are:\n"
|
305
258
|
hash.each do |key, value|
|
306
259
|
result += "- page.#{key}\n"
|
307
260
|
puts "nil value foy key: #{key}" if value == nil
|
308
261
|
singleton_class.send(:define_method, key) { value }
|
309
262
|
end
|
263
|
+
result = "</code></pre>"
|
264
|
+
|
310
265
|
|
311
266
|
result += "\n\n"
|
312
267
|
result += template
|
@@ -320,41 +275,140 @@ module Scms
|
|
320
275
|
return result
|
321
276
|
end
|
322
277
|
|
323
|
-
def Scms.
|
324
|
-
|
325
|
-
|
278
|
+
def Scms.save(settings, website, pageOptions, views, options)
|
279
|
+
|
280
|
+
fileName = File.join(website, File.join(pageOptions.url.sub('~/','')))
|
281
|
+
erb = File.join(website, pageOptions.template)
|
282
|
+
#ScmsUtils.log("Generating: #{fileName} with #{pageOptions.template}")
|
283
|
+
|
284
|
+
if File.exists?(erb)
|
285
|
+
|
286
|
+
# Build bundle model
|
287
|
+
bundleModel = Scms.bundleModel(website, settings, options)
|
288
|
+
# Build navigation model
|
289
|
+
navModel = Scms.navModel(website, settings, options)
|
290
|
+
#puts "navModel: #{navModel}"
|
291
|
+
|
292
|
+
monkeyhook = "";
|
293
|
+
monkeyhook = "<script src='scripts/air-monkey-hook.js'></script>" if options[:mode] == "cms"
|
294
|
+
|
295
|
+
livereload = ""
|
296
|
+
if options[:watch]
|
297
|
+
livereload = "<script async='true' defer='true'>document.write('<script src=\"http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1\"></' + 'script>')</script>" if options[:mode] != "cms"
|
298
|
+
end
|
299
|
+
|
300
|
+
pagemodel = Hash.new
|
301
|
+
pagemodel = {
|
302
|
+
:name => pageOptions.name,
|
303
|
+
:title => pageOptions.title,
|
304
|
+
:description => pageOptions.description,
|
305
|
+
:keywords => pageOptions.keywords,
|
306
|
+
:url => pageOptions.url,
|
307
|
+
:resource => pageOptions.resource,
|
308
|
+
:bundles => bundleModel,
|
309
|
+
:navigation => navModel,
|
310
|
+
:views => views,
|
311
|
+
:rootdir => website,
|
312
|
+
:monkeyhook => monkeyhook,
|
313
|
+
:livereload => livereload
|
314
|
+
}
|
315
|
+
|
316
|
+
#puts "pagemodel:"
|
317
|
+
#puts pagemodel
|
318
|
+
|
319
|
+
pubsubdir = File.dirname(fileName)
|
320
|
+
Dir.mkdir(pubsubdir, 755) unless File::directory?(pubsubdir)
|
321
|
+
|
322
|
+
erbtemplate = File.read(erb)
|
323
|
+
|
324
|
+
#puts "pagemodel: #{pagemodel}"
|
325
|
+
#html = ""
|
326
|
+
html = Scms.render(erbtemplate, pagemodel)
|
327
|
+
|
328
|
+
|
329
|
+
websiteroot = '/'
|
330
|
+
websiteroot = settings["rooturl"] if settings["rooturl"] != nil
|
331
|
+
#puts "On save mode: #{options[:mode]}"
|
332
|
+
websiteroot = ScmsUtils.uriEncode("file:///#{website}/") if options[:mode] == "cms"
|
333
|
+
|
334
|
+
html = html.gsub('~/', websiteroot)
|
335
|
+
begin
|
336
|
+
File.open(fileName, 'w') {|f| f.write(html) }
|
337
|
+
ScmsUtils.successLog("Generated: #{pageOptions.url}")
|
338
|
+
rescue Exception=>e
|
339
|
+
ScmsUtils.errLog(e.message)
|
340
|
+
ScmsUtils.log(e.backtrace.inspect)
|
341
|
+
end
|
342
|
+
else
|
343
|
+
ScmsUtils.errLog("Template doesn't exist: #{pageOptions.template}")
|
344
|
+
ScmsUtils.writelog("::Template doesn't exist #{pageOptions.template}", website)
|
345
|
+
ScmsUtils.writelog("type NUL > #{erb}", website)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def Scms.navModel(website, settings, options)
|
350
|
+
websiteroot = '/'
|
351
|
+
websiteroot = settings["rooturl"] unless settings["rooturl"] == nil
|
352
|
+
websiteroot = ScmsUtils.uriEncode("file:///#{website}/") if options[:mode] == "cms"
|
353
|
+
|
354
|
+
navModel = Array.new
|
355
|
+
if settings["pages"] != nil
|
356
|
+
settings["pages"].each do |pagedata|
|
357
|
+
if pagedata != nil
|
358
|
+
pagedata.each do |pageoptions|
|
359
|
+
pagename = pageoptions[0]
|
360
|
+
pageconfig = pageoptions[1]
|
361
|
+
pageurl = "about:blank"
|
362
|
+
pageurl = pageconfig["generate"]
|
363
|
+
pageurl = pageconfig["url"] unless pageconfig["url"] == nil
|
364
|
+
navtext = pageconfig["navigation"]
|
365
|
+
navmeta = pageconfig["navigation_meta"]
|
366
|
+
navModel.push({"text" => navtext, "url" => pageurl.gsub("~/", websiteroot), "pagename" => pagename, "meta" => navmeta}) unless navtext == nil
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
if settings["nav"] != nil
|
372
|
+
settings["nav"].each do |pagedata|
|
373
|
+
if pagedata != nil
|
374
|
+
pagedata.each do |pageoptions|
|
375
|
+
pagename = pageoptions[0]
|
376
|
+
pageconfig = pageoptions[1]
|
377
|
+
pageurl = "about:blank"
|
378
|
+
pageurl = pageconfig["url"] unless pageconfig["url"] == nil
|
379
|
+
navtext = pagename
|
380
|
+
navtext = pageconfig["text"]
|
381
|
+
navmeta = pageconfig["meta"]
|
382
|
+
navModel.push({"text" => navtext, "url" => pageurl.gsub("~/", websiteroot), "pagename" => pagename, "meta" => navmeta})
|
383
|
+
end
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
return navModel
|
388
|
+
end
|
389
|
+
|
390
|
+
def Scms.bundleModel(website, settings, options)
|
391
|
+
bundleModel = Hash.new
|
326
392
|
bundleConfig = settings["bundles"]
|
327
393
|
if bundleConfig != nil
|
328
394
|
bundleConfig.each do |bundle|
|
329
395
|
#ScmsUtils.log( "bundle (#{bundle.class}) = #{bundle}" )
|
396
|
+
|
397
|
+
websiteroot = '/'
|
398
|
+
websiteroot = settings["rooturl"] unless settings["rooturl"] == nil
|
399
|
+
websiteroot = ScmsUtils.uriEncode("file:///#{website}/") if options[:mode] == "cms"
|
400
|
+
|
330
401
|
bundle.each do |option|
|
331
402
|
name = option[0]
|
332
|
-
|
333
|
-
bundlemodel[name] = bundleName
|
334
|
-
end
|
335
|
-
end
|
336
|
-
end
|
337
|
-
return bundlemodel
|
338
|
-
end
|
403
|
+
config = option[1]
|
339
404
|
|
340
|
-
|
341
|
-
|
342
|
-
settings["pages"].each do |pagedata|
|
343
|
-
if pagedata != nil
|
344
|
-
pagedata.each do |pageoptions|
|
345
|
-
pagename = pageoptions[0]
|
346
|
-
pageconfig = pageoptions[1]
|
347
|
-
pageurl = "about:blank"
|
348
|
-
pageurl = pageconfig["generate"]
|
349
|
-
pageurl = pageconfig["url"] unless pageconfig["url"] == nil
|
350
|
-
navtext = pageconfig["navigation"]
|
351
|
-
navmeta = pageconfig["navigation_meta"]
|
352
|
-
navmodel.push({"text" => navtext, "url" => pageurl, "pagename" => pagename, "meta" => navmeta}) unless navtext == nil
|
405
|
+
bundleName = File.join(config["generate"])
|
406
|
+
bundleModel[name] = bundleName.gsub("~/", websiteroot)
|
353
407
|
end
|
354
408
|
end
|
355
409
|
end
|
356
|
-
return
|
357
|
-
end
|
410
|
+
return bundleModel
|
411
|
+
end
|
358
412
|
|
359
413
|
def Scms.bundle(settings, website)
|
360
414
|
bundleConfig = settings["bundles"]
|
@@ -364,12 +418,14 @@ module Scms
|
|
364
418
|
#ScmsUtils.log( "bundle (#{bundle.class}) = #{bundle}" )
|
365
419
|
bundle.each do |option|
|
366
420
|
name = option[0]
|
367
|
-
|
421
|
+
config = option[1]
|
422
|
+
|
423
|
+
bundleName = File.join(config["generate"].gsub("~/",""))
|
368
424
|
ScmsUtils.boldlog("Bundeling:")
|
369
425
|
|
370
426
|
content = ""
|
371
427
|
assetList = ""
|
372
|
-
files =
|
428
|
+
files = config["files"]
|
373
429
|
if files != nil
|
374
430
|
files.each do |asset|
|
375
431
|
assetList += " - #{asset}\n"
|
@@ -462,7 +518,7 @@ module Scms
|
|
462
518
|
end
|
463
519
|
end
|
464
520
|
|
465
|
-
def Scms.
|
521
|
+
def Scms.copyWebsite(website, pub)
|
466
522
|
if pub.to_s.strip.length != 0
|
467
523
|
FileUtils.mkdir pub unless Dir.exists? pub
|
468
524
|
source = File.join(website)
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Scms
|
2
|
+
require 'fileutils'
|
3
|
+
require 'scms/scms-utils.rb'
|
4
|
+
|
5
|
+
class PageOptions
|
6
|
+
attr_accessor :name, :template, :url, :title, :keywords, :description, :resource, :handler
|
7
|
+
|
8
|
+
def name= name
|
9
|
+
@name = name
|
10
|
+
end
|
11
|
+
|
12
|
+
def template= template
|
13
|
+
@template = template
|
14
|
+
end
|
15
|
+
|
16
|
+
def url= url
|
17
|
+
@url = url
|
18
|
+
end
|
19
|
+
|
20
|
+
def title= title
|
21
|
+
@title = title
|
22
|
+
end
|
23
|
+
|
24
|
+
def keywords= keywords
|
25
|
+
@keywords = keywords
|
26
|
+
end
|
27
|
+
|
28
|
+
def description= description
|
29
|
+
@description = description
|
30
|
+
end
|
31
|
+
|
32
|
+
def resource= resource
|
33
|
+
@resource = resource
|
34
|
+
end
|
35
|
+
|
36
|
+
def handler= handler
|
37
|
+
@handler = handler
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize (name, website, pageconfig, siteConfig)
|
41
|
+
@name = name
|
42
|
+
@template = siteConfig["template"]
|
43
|
+
@url = "#{name}.html"
|
44
|
+
@title = name
|
45
|
+
@keywords = ""
|
46
|
+
@description = ""
|
47
|
+
@resource = Hash.new
|
48
|
+
@handler = nil
|
49
|
+
|
50
|
+
if pageconfig != nil
|
51
|
+
@template = pageconfig["template"] unless pageconfig["template"] == nil
|
52
|
+
|
53
|
+
@url = "#{name}/index.html" if pageconfig["cleanurl"] == true
|
54
|
+
@url = pageconfig["generate"] if pageconfig["generate"] != nil #depreciated
|
55
|
+
@url = pageconfig["url"] if pageconfig["url"] != nil
|
56
|
+
|
57
|
+
@title = pageconfig["title"] unless pageconfig["title"] == nil
|
58
|
+
@keywords = pageconfig["keywords"] if pageconfig["keywords"] != nil
|
59
|
+
@description = pageconfig["description"] if pageconfig["description"] != nil
|
60
|
+
@handler = pageconfig["handler"]
|
61
|
+
@resource = getResource(website, pageconfig["resource"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def getResource(website, resource)
|
67
|
+
ymlresource = Hash.new
|
68
|
+
if resource != nil
|
69
|
+
resourcepath = File.join(website, resource)
|
70
|
+
if File.exists?(resourcepath)
|
71
|
+
#ScmsUtils.log( "_Resource found: #{pageOptions.resource}_" )
|
72
|
+
begin
|
73
|
+
ymlresource = YAML.load_file(resourcepath)
|
74
|
+
rescue Exception=>e
|
75
|
+
ScmsUtils.errLog(e.message)
|
76
|
+
ScmsUtils.log(e.backtrace.inspect)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
ScmsUtils.errLog("Resource not found: #{resource}")
|
80
|
+
ScmsUtils.writelog("::Resource not found #{resource}", website)
|
81
|
+
ScmsUtils.writelog("type NUL > #{resourcepath}", website)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
return ymlresource
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/lib/scms/scms-utils.rb
CHANGED
@@ -20,17 +20,7 @@ module ScmsUtils
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def ScmsUtils.readyaml(yamlpath)
|
23
|
-
ScmsUtils.log("Loading yaml: #{ScmsUtils.uriEncode("file:///#{yamlpath}")}")
|
24
23
|
config = nil
|
25
|
-
|
26
|
-
##http://snk.tuxfamily.org/log/yaml-json-validation-kwalify-ruby19.html
|
27
|
-
#'kwalify'
|
28
|
-
#schema = Kwalify::Yaml.load_file('some_complex_schema.yaml')
|
29
|
-
#validator = Kwalify::Validator.new(schema)
|
30
|
-
#parser = Kwalify::Yaml::Parser.new(validator)
|
31
|
-
#yaml = some_complex_object.to_yaml # machine-generate
|
32
|
-
#data = parser.parse(yaml) # parse & validate <== FAIL
|
33
|
-
|
34
24
|
if File.exist?(yamlpath)
|
35
25
|
tree = File.read(yamlpath)
|
36
26
|
begin
|
@@ -40,6 +30,7 @@ module ScmsUtils
|
|
40
30
|
#config = YAML.load_file(yamlpath)
|
41
31
|
rescue Exception => e
|
42
32
|
ScmsUtils.errLog("Error Loading _config.yml (check there are no tabs in the file)")
|
33
|
+
ScmsUtils.log("Yaml: #{ScmsUtils.uriEncode("file:///#{yamlpath}")}")
|
43
34
|
ScmsUtils.log( "Verify your config")
|
44
35
|
ScmsUtils.log( "http://yaml-online-parser.appspot.com/")
|
45
36
|
ScmsUtils.errLog( e.message )
|
data/lib/scms/scms-watcher.rb
CHANGED
@@ -14,13 +14,15 @@ module ScmsWatcher
|
|
14
14
|
puts "***********************************"
|
15
15
|
puts ""
|
16
16
|
|
17
|
-
settings = Scms.
|
17
|
+
settings = Scms.getSettings(configdir)
|
18
18
|
Scms.bundle(settings, Folders[:website])
|
19
|
-
Scms.build(Folders[:website], settings, options
|
19
|
+
Scms.build(Folders[:website], settings, options)
|
20
20
|
end
|
21
21
|
}
|
22
22
|
|
23
|
+
# [todo] Create this by getting all directories that start with _
|
23
24
|
psst = []
|
25
|
+
psst.push("_pages") if File.directory? "_pages" # .html .htm .md .xml .erb, etc
|
24
26
|
psst.push("_views") if File.directory? "_views" # .html .htm .md .xml .erb, etc
|
25
27
|
psst.push("_layouts") if File.directory? "_layouts" # .html .htm .erb
|
26
28
|
psst.push("_templates") if File.directory? "_templates" # .html .htm .erb
|
@@ -29,15 +31,46 @@ module ScmsWatcher
|
|
29
31
|
|
30
32
|
puts "Listening to #{psst}"
|
31
33
|
listener = Listen.to(psst, force_polling: true) do |modified, added, removed|
|
32
|
-
# puts "modified: #{modified}" if modified.length > 0
|
33
|
-
# puts "added: #{added}" if added.length > 0
|
34
|
-
# puts "removed: #{removed}" if removed.length > 0
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
sassfile = false
|
36
|
+
bundlefile = false
|
37
|
+
buildfile = false
|
38
|
+
|
39
|
+
if removed.length > 0
|
40
|
+
removed.each{|filename|
|
41
|
+
removedfile = Pathname.new(filename).relative_path_from(Pathname.new(Folders[:website])).to_s
|
42
|
+
#ext = File.extname(removedfile)
|
43
|
+
|
44
|
+
puts ""
|
45
|
+
puts "***********************************************"
|
46
|
+
puts " Deleted: #{removedfile}"
|
47
|
+
puts "***********************************************"
|
48
|
+
puts ""
|
49
|
+
|
50
|
+
if removedfile.start_with?('_pages/')
|
51
|
+
buildfile = true
|
52
|
+
end
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
if added.length > 0
|
57
|
+
added.each{|filename|
|
58
|
+
addedfile = Pathname.new(filename).relative_path_from(Pathname.new(Folders[:website])).to_s
|
59
|
+
#ext = File.extname(addedfile)
|
60
|
+
|
61
|
+
puts ""
|
62
|
+
puts "***********************************************"
|
63
|
+
puts " Added: #{addedfile}"
|
64
|
+
puts "***********************************************"
|
65
|
+
puts ""
|
40
66
|
|
67
|
+
if addedfile.start_with?('_pages/')
|
68
|
+
buildfile = true
|
69
|
+
end
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
if modified.length > 0
|
41
74
|
modified.each{|filename|
|
42
75
|
modifiedfile = Pathname.new(filename).relative_path_from(Pathname.new(Folders[:website])).to_s
|
43
76
|
ext = File.extname(modifiedfile)
|
@@ -48,6 +81,8 @@ module ScmsWatcher
|
|
48
81
|
puts "***********************************************"
|
49
82
|
puts ""
|
50
83
|
|
84
|
+
buildfile = true
|
85
|
+
|
51
86
|
if modifiedfile.start_with?('_source/')
|
52
87
|
bundlefile = true
|
53
88
|
buildfile = false
|
@@ -60,12 +95,13 @@ module ScmsWatcher
|
|
60
95
|
break
|
61
96
|
end
|
62
97
|
}
|
63
|
-
|
64
|
-
Scms.sassall(Folders[:website]) if sassfile
|
65
|
-
Scms.bundle(settings, Folders[:website]) if bundlefile
|
66
|
-
Scms.build(Folders[:website], settings, options[:mode]) if buildfile
|
67
98
|
end
|
99
|
+
|
100
|
+
Scms.sassall(Folders[:website]) if sassfile
|
101
|
+
Scms.bundle(settings, Folders[:website]) if bundlefile
|
102
|
+
Scms.build(Folders[:website], settings, options) if buildfile
|
68
103
|
end
|
104
|
+
|
69
105
|
listener.start # not blocking
|
70
106
|
listener.ignore! /\.png/
|
71
107
|
listener.ignore! /\.gif/
|
data/lib/scms/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Courtenay Probert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cprobert-s3sync
|
@@ -191,6 +191,7 @@ files:
|
|
191
191
|
- lib/scms/s3deploy.rb
|
192
192
|
- lib/scms/scms-helpers.rb
|
193
193
|
- lib/scms/scms-httpserver.rb
|
194
|
+
- lib/scms/scms-pageoptions.rb
|
194
195
|
- lib/scms/scms-utils.rb
|
195
196
|
- lib/scms/scms-watcher.rb
|
196
197
|
- lib/scms/scms-xmlhandler.rb
|