solutus 0.0.2 → 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
  SHA256:
3
- metadata.gz: 49cd8eff79c5ef6ec077eca26f41a41d665388f7a4dcac730a310f1df588cb95
4
- data.tar.gz: 8f502367c1b27d14040cf2856fab20f365f91b3c05e6b26486a4102a8329e3fc
3
+ metadata.gz: 6b53796ffa09cef641f839b82b1c6a550039db52c0dfeba0b20b1f4e5fa291cd
4
+ data.tar.gz: f98588c4cb4b9b4ae957457438770f6c21c8d33fe964bf5f091ba98ce12ba375
5
5
  SHA512:
6
- metadata.gz: a1aae2085d6b3ac081bf89db1e3b74a2aba9b72c4616e8b1ab977409f4da952cf0a8d8e3fde3e00946a69ba79f1bfa90639cc9396a8ca746c1bcdd6b1db4bfcb
7
- data.tar.gz: '09e0f4b38235c12bc62efed2705bbf021ac68428cda126a9e1429daf18becea546c680ea76d769b5e4730f06e006f61b9c585a6d6f4d9e28656abd5b9e8356f3'
6
+ metadata.gz: 96ec0c958d3fedbeed95f74e04c9b0b95add3a09e6bbb064354be042e4893e0fdb1cdfc071870f5f15ab7a98bd73a975fa1d62e218ded353f8e31b12f4eaacef
7
+ data.tar.gz: 813cf1e0610875f65d39fbc8645ab839a65bc2e08f04d4f6ed7d048660d0c453b646e5e049900cd65094567dc15eebb84b3548066fe4c25474e3cec36cbed55e
data/lib/solutus.rb CHANGED
@@ -3,6 +3,8 @@ require 'yaml'
3
3
  require 'sinatra/base'
4
4
  require 'mustache'
5
5
  require 'redcarpet'
6
+ require 'json'
7
+ require 'nokogiri'
6
8
 
7
9
  class Solutus
8
10
  DEFAULT_TEMPLATE = "default"
@@ -14,12 +16,35 @@ class Solutus
14
16
  TEMPLATES_PATH = "templates"
15
17
  SITE_PAGES_PATH = File.join("pages", "site-pages")
16
18
  POSTS_PATH = File.join("pages", "posts")
17
- BLOG_DATE_FORMAT = "%b %-d, %Y"
19
+ BLOG_DATE_FORMAT = "%b %e, %Y"
18
20
  SETTINGS_FILE = "settings.yml"
19
-
21
+ DAY_ENDINGS = ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "st"]
22
+
23
+ @@blog_urls = Hash.new
24
+ @@page_urls = Array.new
25
+
26
+ def self.load_settings
27
+ begin
28
+ yml_text = ""
29
+ f = File.open(SETTINGS_FILE, "r")
30
+ f.each_line do |line|
31
+ yml_text += line
32
+ end
33
+ f.close
34
+ YAML.load(yml_text)
35
+ rescue
36
+ puts "settings.yml not found"
37
+ end
38
+ end
39
+
20
40
  class Solutus_Server < Sinatra::Base
21
41
  set :public_folder, SITE_PATH
22
42
 
43
+ configure do
44
+ glob = Solutus.load_settings
45
+ set :global_settings, glob
46
+ end
47
+
23
48
  get "/" do
24
49
  send_file File.join(settings.public_folder, 'index.html')
25
50
  end
@@ -30,18 +55,182 @@ class Solutus
30
55
  end
31
56
 
32
57
  get "/edit" do
33
- send_file File.join(path_to_resources, "index.html")
58
+ render_index
59
+ end
60
+
61
+ get "/editpage" do
62
+ render_edit_page(params["page-path"])
63
+ end
64
+
65
+ post "/savepage" do
66
+ path = params["path"]
67
+
68
+ f = File.open(path, "r")
69
+ yml_text = ""
70
+ f.each_line do |line|
71
+ yml_text += line
72
+ end
73
+ f.close
74
+
75
+ data = YAML.load(yml_text)
76
+ data["content"] = params["content"]
77
+
78
+ new_contents = YAML.dump(data)
79
+ f = File.open(path, "w")
80
+ f.write(new_contents)
81
+ f.close
82
+
83
+ Solutus.command("build")
84
+ "saved page @ #{path}"
34
85
  end
35
86
 
36
87
  post "/newpost" do
37
- Solutus.command("new", "post", params["post-title"])
88
+ path = Solutus.command("new", "post", params["post-title"])
38
89
  Solutus.build
39
- send_file File.join(path_to_resources, "editBlog.html")
90
+ render_edit_post(path)
91
+ end
92
+
93
+ get "/editpost" do
94
+ render_edit_post(*params["post-path"].split(","))
95
+ end
96
+
97
+ post "/savepost" do
98
+ path = params["path"]
99
+ f = File.open(path, "r")
100
+ yml_text = ""
101
+ f.each_line do |line|
102
+ yml_text += line
103
+ end
104
+ f.close
105
+ data = YAML.load(yml_text)
106
+ data["title"] = params["title"]
107
+ new_contents = YAML.dump(data)
108
+ new_contents += "---\n"
109
+ new_contents += params["markdown"]
110
+ f = File.open(path, "w")
111
+ f.write(new_contents)
112
+ f.close
113
+ Solutus.command("build")
114
+ "saved post @ #{path}"
40
115
  end
41
116
 
42
117
  def path_to_resources
43
118
  File.join(File.dirname(File.expand_path(__FILE__)), '../resources')
44
119
  end
120
+
121
+ class ServerStache < Mustache
122
+ end
123
+
124
+ def render_edit_page(path)
125
+ f = File.open(File.join(path_to_resources, "editPage.html"), "r")
126
+ template = ""
127
+ f.each_line do |line|
128
+ template += line
129
+ end
130
+ f.close
131
+
132
+ f = File.open(path, "r")
133
+ file_contents = ""
134
+ f.each_line do |line|
135
+ file_contents += line
136
+ end
137
+ data = YAML.load(file_contents)
138
+
139
+ ServerStache.template = template
140
+ result = ServerStache.new
141
+
142
+ result[:title] = data["title"]
143
+ result[:path] = path
144
+ settings.global_settings.each do |key, val|
145
+ result[key.to_sym] = val
146
+ end
147
+ page_html = Solutus.render_page(Solutus.templates, settings.global_settings, data)
148
+ parser = Nokogiri::HTML(page_html)
149
+ parser.at_css("#solutus-content")['contenteditable'] = true
150
+ result[:everything] = parser.at_css("#solutus-everything")
151
+ result.render
152
+ end
153
+
154
+ def render_edit_post(path, url="/")
155
+ f = File.open(File.join(path_to_resources, "editBlog.html"), "r")
156
+ template = ""
157
+ f.each_line do |line|
158
+ template += line
159
+ end
160
+ f.close
161
+
162
+ Mustache.template = template
163
+ result = Mustache.new
164
+
165
+ f = File.open(path, "r")
166
+ file_contents = ""
167
+ f.each_line do |line|
168
+ file_contents += line
169
+ end
170
+ data = YAML.load(file_contents)
171
+
172
+ result[:title] = data["title"]
173
+ result[:markdown] = file_contents.split("---")[-1]
174
+ result[:link] = url
175
+ result[:canview] = url != "/"
176
+ result[:path] = path
177
+ result.render
178
+ end
179
+
180
+ def render_index
181
+ f = File.open(File.join(path_to_resources, "index.html"), "r")
182
+ template = ""
183
+ f.each_line do |line|
184
+ template += line
185
+ end
186
+ f.close
187
+ Mustache.template = template
188
+ result = Mustache.new
189
+ settings.global_settings.each do |key, val|
190
+ result[key.to_sym] = val
191
+ end
192
+ result[:blogs] = blog_select
193
+ result[:pages] = page_select
194
+ result.render
195
+ end
196
+
197
+ def page_select
198
+ result = "<select name=\"page-path\">\n"
199
+ Solutus.page_urls.each do |page|
200
+ path = page["file_path"]
201
+ title = page["title"]
202
+ result += "<option value=\"#{path}\">#{title}</option>\n"
203
+ end
204
+ result += "</select>"
205
+ result
206
+ end
207
+
208
+ def blog_select
209
+ result = "<select name=\"post-path\">\n"
210
+ Solutus.blog_urls.each do |yr, arr|
211
+ sorted = arr.sort_by {|k| k["date"]} .reverse
212
+ sorted.each do |blog|
213
+ title = blog["title"]
214
+ path = blog["file_path"]
215
+ url = blog["url"]
216
+ result += "<option value=\"#{path},#{url}\">#{title}</option>\n"
217
+ end
218
+ end
219
+ result += "</select>"
220
+ result
221
+ end
222
+ end
223
+
224
+ def self.blog_urls
225
+ @@blog_urls
226
+ end
227
+
228
+ def self.page_urls
229
+ @@page_urls
230
+ end
231
+
232
+ def self.templates
233
+ @@templates
45
234
  end
46
235
 
47
236
  def self.command(*args)
@@ -67,15 +256,15 @@ class Solutus
67
256
  if args[1] == "page"
68
257
  new_page(args[2])
69
258
  elsif args[1] == "post"
70
- new_post(args[2])
259
+ return new_post(args[2])
71
260
  end
72
261
  end
73
262
  else
74
- puts "Unknown command"
263
+ puts "Invalid arguments"
75
264
  end
76
265
  end
77
266
  else
78
- puts "Not enough arguments"
267
+ puts "Unknown command"
79
268
  end
80
269
  end
81
270
  end
@@ -92,12 +281,7 @@ class Solutus
92
281
  end
93
282
 
94
283
  def self.build
95
- yml_text = ""
96
- f = File.open(SETTINGS_FILE, "r")
97
- f.each_line do |line|
98
- yml_text += line
99
- end
100
- settings_data = YAML.load(yml_text)
284
+ settings_data = load_settings
101
285
 
102
286
  if File.directory?(BUILD_PATH)
103
287
  FileUtils.remove_dir(BUILD_PATH)
@@ -106,7 +290,7 @@ class Solutus
106
290
  Dir.mkdir(SITE_PATH)
107
291
  copy_static
108
292
 
109
- templates = Hash.new
293
+ @@templates = Hash.new
110
294
  Dir.entries(TEMPLATES_PATH).each do |entry|
111
295
  next if entry == "." || entry == ".."
112
296
  puts "Loading template #{entry}"
@@ -117,10 +301,11 @@ class Solutus
117
301
  f.each_line do |line|
118
302
  contents += line
119
303
  end
120
- templates[entry.split(".")[0]] = contents
304
+ @@templates[entry.split(".")[0]] = contents
121
305
  end
122
306
  end
123
-
307
+
308
+ @@page_urls = Array.new
124
309
  Dir.entries(SITE_PAGES_PATH).each do |entry|
125
310
  next if entry == "." || entry == ".."
126
311
  puts "Rendering page #{entry}"
@@ -132,16 +317,20 @@ class Solutus
132
317
  yml_text += line
133
318
  end
134
319
  data = YAML.load(yml_text)
135
- html = render_page(templates, settings_data, data, false)
320
+ html = render_page(@@templates, settings_data, data, false)
136
321
  new_path = File.join(SITE_PATH, entry.split(".")[0] + ".html")
137
322
  f = File.new(new_path, "w")
138
323
  puts "Created #{new_path}"
139
324
  f.write(html)
140
325
  f.close
326
+ @@page_urls.push({
327
+ "title" => data["title"],
328
+ "file_path" => path
329
+ })
141
330
  end
142
331
  end
143
332
 
144
- blog_urls = Hash.new
333
+ @@blog_urls = Hash.new
145
334
  Dir.entries(POSTS_PATH).each do |entry|
146
335
  next if entry == "." || entry == ".."
147
336
  path = File.join(POSTS_PATH, entry)
@@ -157,16 +346,21 @@ class Solutus
157
346
  date = data["date"]
158
347
 
159
348
  puts "Rendering blog post #{entry}"
160
- html = render_page(templates, settings_data, data, true)
349
+ html = render_page(@@templates, settings_data, data, true)
161
350
 
162
351
  relative_dir = File.join(date.year.to_s, date.month.to_s, date.day.to_s)
163
352
  root_url = File.join("archive", relative_dir, entry.split(".")[0] + ".html")
164
353
 
165
354
  year = date.year.to_s
166
- if !blog_urls.key?(year)
167
- blog_urls[year] = Array.new
355
+ if !@@blog_urls.key?(year)
356
+ @@blog_urls[year] = Array.new
168
357
  end
169
- blog_urls[year].push({"title" => data["title"], "url" => root_url, "date" => date})
358
+ @@blog_urls[year].push({
359
+ "title" => data["title"],
360
+ "url" => root_url,
361
+ "file_path" => path,
362
+ "date" => date
363
+ })
170
364
 
171
365
  dir_path = File.join(BLOG_BUILD_PATH, relative_dir)
172
366
  if !File.directory?(dir_path)
@@ -181,23 +375,25 @@ class Solutus
181
375
 
182
376
  #TODO: CREATE SOME FCUKIN BLOG NAVIGATION HTML PAGES
183
377
  content = ""
184
- blog_urls.each do |yr, arr|
378
+ @@blog_urls.each do |yr, arr|
185
379
  sorted = arr.sort_by {|k| k["date"]} .reverse
186
380
  content += "<h3>#{yr}</h3>\n<hr>\n"
187
- content += "<ul>"
188
381
  sorted.each do |hash|
189
382
  url = hash["url"]
190
383
  title = hash["title"]
191
- pretty_date = hash["date"].strftime("%b %-d")
192
- content += "<li><a href=\"/#{url}\">#{title}</a> (#{pretty_date})</li>"
384
+ pretty_date = hash["date"].strftime("%b %e") +
385
+ DAY_ENDINGS[hash["date"].strftime("%e").to_i]
386
+ content += "<div class=\"solutus-blog-block\">"
387
+ content += "<div class=\"solutus-blog-title\"><a href=\"/#{url}\">#{title}</a></div>"
388
+ content += "<div>#{pretty_date}</div>"
389
+ content += "</div>"
193
390
  end
194
- content += "</ul>"
195
391
  end
196
392
  path = File.join(SITE_PATH, "archive.html")
197
393
  data = Hash.new
198
394
  data["title"] = "Archive"
199
395
  data["content"] = content
200
- html = render_page(templates, settings_data, data, false)
396
+ html = render_page(@@templates, settings_data, data, false)
201
397
  f = File.new(path, "w")
202
398
  f.write(html)
203
399
  f.close
@@ -228,9 +424,17 @@ HERE
228
424
  puts "Created new site page #{title} at #{path}"
229
425
  end
230
426
 
427
+ def self.correct_time(time)
428
+ time.utc.localtime("+05:30")
429
+ end
430
+
231
431
  def self.new_post(title)
232
432
  i = 1
233
433
  new_title = title.gsub(/\s+/, "")
434
+ if title.empty?
435
+ puts "Empty title"
436
+ return ""
437
+ end
234
438
  while true
235
439
  path = File.join(POSTS_PATH, new_title + ".md")
236
440
  if File.file?(path)
@@ -252,9 +456,10 @@ HERE
252
456
  f.write(text)
253
457
  f.close
254
458
  puts "Created new blog post #{title} at #{path}"
459
+ path
255
460
  end
256
461
 
257
- def self.render_page(templates, default_data, data, blog)
462
+ def self.render_page(templates, default_data, data, blog=false)
258
463
  if data.key?("template")
259
464
  Mustache.template = templates[data["template"]]
260
465
  else
@@ -277,7 +482,7 @@ HERE
277
482
 
278
483
  def self.wrap_element(key, content)
279
484
  if content.is_a?(Time)
280
- content = content.strftime(BLOG_DATE_FORMAT)
485
+ content = correct_time(content).strftime(BLOG_DATE_FORMAT)
281
486
  end
282
487
  result = ""
283
488
  result += "<div id=\"solutus-#{key}\">\n"
@@ -337,7 +542,7 @@ name: #{name}
337
542
  author: Your Name
338
543
  watermark: |
339
544
  <p style="text-align: center;">
340
- <small>Powered by <a href="https://rubygems.org/gems/solutus/versions/0.0.1">Solutus</a></small>
545
+ <small>Powered by <a href="https://rubygems.org/gems/solutus/">Solutus</a></small>
341
546
  </p>
342
547
  stylesheets: |
343
548
  <link rel="stylesheet" type="text/css" href="/css/styles.css" />
@@ -364,9 +569,10 @@ HERE
364
569
  {{{date}}}
365
570
  {{/blog}}
366
571
  {{{content}}}
572
+ <small style="display: block; text-align: center;">&copy; {{author}}</small>
367
573
  {{{watermark}}}
368
- {{{scripts}}}
369
574
  </div>
575
+ {{{scripts}}}
370
576
  </body>
371
577
  </html>
372
578
  HERE
@@ -381,6 +587,7 @@ HERE
381
587
  index_file = <<HERE
382
588
  template: default
383
589
  title: Home page
590
+ type: html
384
591
  content: |
385
592
  <h1>Hello World!</h1>
386
593
  <p>
@@ -0,0 +1,51 @@
1
+ <!DOCTYPE html>
2
+ <head>
3
+ <title>Editing {{title}}</title>
4
+ <style type="text/css">
5
+ body {
6
+ margin:40px auto;
7
+ background-color: #eeeeee;
8
+ max-width:650px;
9
+ line-height:1.6;
10
+ font-size:18px;
11
+ color:#444;
12
+ padding:0 10px;
13
+ font-family: "Segoe UI", sans-serif;
14
+ }
15
+
16
+ h1, h2, h3 {
17
+ line-height:1.2
18
+ }
19
+ </style>
20
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
21
+ <script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
23
+ </head>
24
+
25
+ <body>
26
+ <h1>Editing <span style="border: 1px solid gray" id="title-input" contenteditable>{{title}}</span></h1>
27
+ ({{path}})
28
+ <p><a href="/edit">Back to Edit</a></p>
29
+ {{#canview}}
30
+ <p><a href="{{link}}">View on Site</a></p>
31
+ {{/canview}}
32
+ <p><button id="solutus-save-button" type="submit">Save</button></p>
33
+ <textarea id="solutus-mde">{{{markdown}}}</textarea>
34
+
35
+ <script>
36
+ var simplemde = new SimpleMDE({ element: document.getElementById("solutus-mde") });
37
+
38
+ function save() {
39
+ $.post("/savepost", {
40
+ "path": "{{path}}",
41
+ "title": $("#title-input").html(),
42
+ "markdown": simplemde.value()
43
+ }, function(response) {
44
+ console.log(response);
45
+ });
46
+ }
47
+
48
+ $("#solutus-save-button").click(save);
49
+ </script>
50
+ </body>
51
+ </html>
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html>
2
+ <head>
3
+ <title>Editing {{title}}</title>
4
+
5
+ <style type="text/css">
6
+ #solutus-editmenu {
7
+ width: 100%;
8
+ margin: 0;
9
+ padding: 15px;
10
+ background-color: #eeeeee;
11
+ font-family: sans-serif;
12
+ }
13
+ </style>
14
+ {{{stylesheets}}}
15
+ </head>
16
+
17
+ <body>
18
+ <div id="solutus-editmenu">
19
+ Editing <b>{{title}}</b> @ <code>{{path}}</code>
20
+ <button id="solutus-save-button">Save</button>
21
+ <a href="/edit">Back to Edit</a>
22
+ </div>
23
+ {{{everything}}}
24
+ {{{scripts}}}
25
+ <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
26
+ <script>
27
+ function save() {
28
+ $.post("/savepage", {
29
+ "path": "{{path}}",
30
+ "content": $("#solutus-content").html()
31
+ }, function(response) {
32
+ console.log(response);
33
+ });
34
+ }
35
+
36
+ $("#solutus-save-button").click(save);
37
+ </script>
38
+ </body>
39
+ </html>
data/resources/index.html CHANGED
@@ -1,18 +1,53 @@
1
1
  <!DOCTYPE html>
2
2
  <head>
3
- <title>Editing Site</title>
3
+ <title>Editing {{name}}</title>
4
+ <style type="text/css">
5
+ body {
6
+ margin:40px auto;
7
+ background-color: #eeeeee;
8
+ max-width:650px;
9
+ line-height:1.6;
10
+ font-size:18px;
11
+ color:#444;
12
+ padding:0 10px;
13
+ font-family: "Segoe UI", sans-serif;
14
+ }
15
+
16
+ h1, h2, h3 {
17
+ line-height:1.2
18
+ }
19
+ </style>
4
20
  </head>
5
- <body>
6
- <h1>Editing Website</h1>
7
- <p><a href="/">View Site</a></p>
8
- <p>
9
- <form method="post" action="/newpost">
10
- <fieldset>
11
- <legend>New Blog Post:</legend>
12
- <p><label for="post-title">Title:</label> <input type="text" name="post-title"></p>
13
- <p><button type="submit">Create</button></fieldset></p>
14
- </fieldset>
15
- </form>
16
- </p>
17
- </body>
21
+
22
+ <body>
23
+ <h1>Editing {{name}}</h1>
24
+ <p><a href="/">View Site</a></p>
25
+ <p>
26
+ <form method="get" action="/editpage">
27
+ <fieldset>
28
+ <legend>Edit Page:</legend>
29
+ {{{pages}}}
30
+ <p><button type="submit">Edit page</button></fieldset></p>
31
+ </fieldset>
32
+ </form>
33
+ </p>
34
+ <p>
35
+ <form method="post" action="/newpost">
36
+ <fieldset>
37
+ <legend>New Blog Post:</legend>
38
+ <p><label for="post-title">Title:</label> <input type="text" name="post-title"></p>
39
+ <p><button type="submit">Create new blog post</button></fieldset></p>
40
+ </fieldset>
41
+ </form>
42
+ </p>
43
+ <p>
44
+ <form method="get" action="/editpost">
45
+ <fieldset>
46
+ <legend>Edit Blog Post:</legend>
47
+ {{{blogs}}}
48
+ <p><button type="submit">Edit blog post</button></fieldset></p>
49
+ </fieldset>
50
+ </form>
51
+ </p>
52
+ </body>
18
53
  </html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solutus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jerome Wei
@@ -9,7 +9,63 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2018-05-15 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mustache
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: redcarpet
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  description: A miminal static site generator and local Web frontend
14
70
  email: jeromew@berkeley.edu
15
71
  executables:
@@ -20,6 +76,7 @@ files:
20
76
  - bin/solutus
21
77
  - lib/solutus.rb
22
78
  - resources/editBlog.html
79
+ - resources/editPage.html
23
80
  - resources/index.html
24
81
  homepage: https://github.com/jeromew21/solutus
25
82
  licenses: