weaver 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/weaver +23 -0
- data/lib/weaver/version.rb +1 -1
- data/lib/weaver.rb +389 -132
- data/weaver.gemspec +2 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1935b42581f7e4c6448b307ce17a4f6bbd6f168
|
4
|
+
data.tar.gz: 534788172b09e63d3b41efb2af77de2490be72b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c32e2b77f1c2a77d0a1455b205ad560f6dc705eccdf94c6960bb35b4eddc108426aa9ba80298f45debe3f285685ac320d85e49420f72ed33432233645a8d7bd4
|
7
|
+
data.tar.gz: e556fa59bd695bbf37099ae444d6913817182f16a21af7f1ad840cb0a5cfb17bbd9dd94338cb66b055836985d4168636acb453efdeb0bd7eefb5368ad3602545
|
data/exe/weaver
CHANGED
@@ -43,6 +43,15 @@ class Website < Sinatra::Base
|
|
43
43
|
return send_file(params[:splat].first, :disposition => 'inline')
|
44
44
|
end
|
45
45
|
|
46
|
+
if params[:splat].first.start_with? "js/"
|
47
|
+
return send_file(params[:splat].first, :disposition => 'inline')
|
48
|
+
end
|
49
|
+
|
50
|
+
if params[:splat].first.start_with? "css/"
|
51
|
+
return send_file(params[:splat].first, :disposition => 'inline')
|
52
|
+
end
|
53
|
+
|
54
|
+
|
46
55
|
viewname = params[:splat].first
|
47
56
|
result = getWeavefile viewname
|
48
57
|
viewFile = result[:viewFile]
|
@@ -93,6 +102,16 @@ where [options] are:
|
|
93
102
|
if Dir.exist? "images"
|
94
103
|
FileUtils.cp_r("images", buildDir)
|
95
104
|
end
|
105
|
+
if Dir.exist? "js"
|
106
|
+
Dir["js/*.*"].each do |x|
|
107
|
+
FileUtils.cp_r(x, File.join("js", buildDir))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
if Dir.exist? "css"
|
111
|
+
Dir["css/*.*"].each do |x|
|
112
|
+
FileUtils.cp_r(x, File.join("css", buildDir))
|
113
|
+
end
|
114
|
+
end
|
96
115
|
|
97
116
|
files = Dir["source/**/*.weave"]
|
98
117
|
files.each do |file|
|
@@ -153,8 +172,12 @@ end
|
|
153
172
|
|
154
173
|
to_create = "#{args[0]}"
|
155
174
|
FileUtils::mkdir_p "#{to_create}"
|
175
|
+
FileUtils::mkdir_p "#{to_create}/cache"
|
176
|
+
File.write("#{to_create}/cache/this_directory_is_used_by_weaver_as_a_cache","")
|
156
177
|
FileUtils::mkdir_p "#{to_create}/source"
|
157
178
|
FileUtils::mkdir_p "#{to_create}/images"
|
179
|
+
FileUtils::mkdir_p "#{to_create}/js"
|
180
|
+
FileUtils::mkdir_p "#{to_create}/css"
|
158
181
|
File.write "#{to_create}/Gemfile", gemfile
|
159
182
|
File.write "#{to_create}/source/index.weave", source
|
160
183
|
end
|
data/lib/weaver/version.rb
CHANGED
data/lib/weaver.rb
CHANGED
@@ -3,6 +3,7 @@ require "weaver/version"
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'sinatra'
|
5
5
|
require 'json'
|
6
|
+
require 'active_support/core_ext/object/to_query'
|
6
7
|
|
7
8
|
module Weaver
|
8
9
|
|
@@ -44,13 +45,47 @@ module Weaver
|
|
44
45
|
tag
|
45
46
|
end
|
46
47
|
|
48
|
+
def root
|
49
|
+
@page.root
|
50
|
+
end
|
51
|
+
|
52
|
+
def request_js(path)
|
53
|
+
@page.request_js(script_file)
|
54
|
+
end
|
55
|
+
|
56
|
+
def request_css(path)
|
57
|
+
@page.request_css(path)
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_page_load(script)
|
61
|
+
@page.on_page_load(script)
|
62
|
+
end
|
63
|
+
|
64
|
+
def write_script_once(script)
|
65
|
+
@page.write_script_once(script)
|
66
|
+
end
|
67
|
+
|
68
|
+
def background(&block)
|
69
|
+
@page.background(block)
|
70
|
+
end
|
71
|
+
|
72
|
+
def on_page_load(script)
|
73
|
+
@page.on_page_load(script)
|
74
|
+
end
|
75
|
+
|
47
76
|
def icon(type)
|
48
77
|
iconname = type.to_s.gsub(/_/, "-")
|
49
|
-
|
78
|
+
if type.is_a? Symbol
|
79
|
+
i class: "fa fa-#{iconname}" do
|
80
|
+
end
|
81
|
+
else
|
82
|
+
i class: "fa" do
|
83
|
+
text type
|
84
|
+
end
|
50
85
|
end
|
51
86
|
end
|
52
87
|
|
53
|
-
def
|
88
|
+
def wform(options={}, &block)
|
54
89
|
theform = Form.new(@page, @anchors, options)
|
55
90
|
theform.instance_eval(&block)
|
56
91
|
@inner_content << theform.generate
|
@@ -90,17 +125,24 @@ module Weaver
|
|
90
125
|
|
91
126
|
def image(name, options={})
|
92
127
|
|
93
|
-
style = ""
|
128
|
+
style = "#{options[:style]}"
|
94
129
|
if options[:rounded_corners] == true
|
95
130
|
style += " border-radius: 8px"
|
96
131
|
elsif options[:rounded_corners] == :top
|
97
132
|
style += " border-radius: 8px 8px 0px 0px"
|
98
133
|
else
|
99
|
-
style += " border-radius: #{options[:rounded_corners]}px"
|
134
|
+
style += " border-radius: #{options[:rounded_corners]}px" if options[:rounded_corners]
|
100
135
|
|
101
136
|
end
|
102
137
|
|
103
|
-
|
138
|
+
img_options = {
|
139
|
+
class: "img-responsive #{options[:class]}",
|
140
|
+
src: "#{@page.root}images/#{name}",
|
141
|
+
style: style
|
142
|
+
}
|
143
|
+
img_options[:id] = options[:id] if options[:id]
|
144
|
+
|
145
|
+
img img_options
|
104
146
|
end
|
105
147
|
|
106
148
|
def crossfade_image(image_normal, image_hover)
|
@@ -112,6 +154,35 @@ module Weaver
|
|
112
154
|
@page.request_css "css/crossfade_style.css"
|
113
155
|
end
|
114
156
|
|
157
|
+
def gallery(images, thumbnails=images, options={}, &block)
|
158
|
+
|
159
|
+
@page.request_css "css/plugins/blueimp/css/blueimp-gallery.min.css"
|
160
|
+
|
161
|
+
div class:"lightBoxGallery" do
|
162
|
+
(0...images.length).to_a.each do |index|
|
163
|
+
|
164
|
+
title = options[:titles][index] if options[:titles]
|
165
|
+
|
166
|
+
a href:"#{images[index]}", title: "#{title}", :"data-gallery"=> "" do
|
167
|
+
img src:"#{thumbnails[index]}", style: "margin: 5px;"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
div id:"blueimp-gallery", class:"blueimp-gallery" do
|
172
|
+
div class:"slides" do end
|
173
|
+
h3 class:"title" do end
|
174
|
+
a class:"prev" do end
|
175
|
+
a class:"next" do end
|
176
|
+
a class:"close" do end
|
177
|
+
a class:"play-pause" do end
|
178
|
+
ol class:"indicator" do end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
@page.request_js "js/plugins/blueimp/jquery.blueimp-gallery.min.js"
|
183
|
+
|
184
|
+
end
|
185
|
+
|
115
186
|
def breadcrumb(patharray)
|
116
187
|
ol class: "breadcrumb" do
|
117
188
|
patharray.each do |path|
|
@@ -234,6 +305,11 @@ ENDROW
|
|
234
305
|
div :class => "jumbotron", style: additional_style, &block
|
235
306
|
end
|
236
307
|
|
308
|
+
def modal(id=nil, &block)
|
309
|
+
mm = ModalDialog.new(@page, @anchors, id, &block)
|
310
|
+
@inner_content << mm.generate
|
311
|
+
end
|
312
|
+
|
237
313
|
def _button(options={}, &block)
|
238
314
|
|
239
315
|
anIcon = options[:icon]
|
@@ -255,14 +331,19 @@ ENDROW
|
|
255
331
|
dim = "btn-circle" if options[:circle]
|
256
332
|
|
257
333
|
buttonOptions = {
|
258
|
-
:type => "button",
|
259
|
-
:class => "btn btn-#{style} #{size} #{blockstyle} #{outline} #{dim}"
|
334
|
+
:type => options[:type] || "button",
|
335
|
+
:class => "btn btn-#{style} #{size} #{blockstyle} #{outline} #{dim}",
|
336
|
+
:id => options[:id]
|
260
337
|
}
|
261
338
|
|
262
339
|
if block
|
340
|
+
closer = ""
|
341
|
+
|
342
|
+
closer = "; return false;" if options[:nosubmit]
|
343
|
+
|
263
344
|
action = Action.new(@page, @anchors, &block)
|
264
345
|
buttonOptions[:onclick] = "#{action.name}(this)"
|
265
|
-
buttonOptions[:onclick] = "#{action.name}(this, #{options[:data]})" if options[:data]
|
346
|
+
buttonOptions[:onclick] = "#{action.name}(this, #{options[:data]})#{closer}" if options[:data]
|
266
347
|
@page.scripts << action.generate
|
267
348
|
end
|
268
349
|
|
@@ -272,6 +353,7 @@ ENDROW
|
|
272
353
|
type = :a if options[:toggle]
|
273
354
|
|
274
355
|
|
356
|
+
|
275
357
|
method_missing type, buttonOptions do
|
276
358
|
if title.is_a? Symbol
|
277
359
|
icon title
|
@@ -283,7 +365,7 @@ ENDROW
|
|
283
365
|
end
|
284
366
|
end
|
285
367
|
|
286
|
-
def
|
368
|
+
def normal_button(anIcon, title={}, options={}, &block)
|
287
369
|
options[:icon] = anIcon
|
288
370
|
options[:title] = title
|
289
371
|
_button(options, &block)
|
@@ -444,6 +526,68 @@ ENDROW
|
|
444
526
|
end
|
445
527
|
end
|
446
528
|
|
529
|
+
class ModalDialog
|
530
|
+
|
531
|
+
def initialize(page, anchors, id, &block)
|
532
|
+
@page = page
|
533
|
+
@anchors = anchors
|
534
|
+
@id = id || @page.create_anchor("modal")
|
535
|
+
|
536
|
+
@header_content = Elements.new(@page, @anchors)
|
537
|
+
@body_content = Elements.new(@page, @anchors)
|
538
|
+
@footer_content = Elements.new(@page, @anchors)
|
539
|
+
|
540
|
+
instance_eval(&block) if block
|
541
|
+
end
|
542
|
+
|
543
|
+
def id
|
544
|
+
@id
|
545
|
+
end
|
546
|
+
|
547
|
+
def header(&block)
|
548
|
+
@header_content.instance_eval(&block)
|
549
|
+
end
|
550
|
+
|
551
|
+
def body(&block)
|
552
|
+
@body_content.instance_eval(&block)
|
553
|
+
end
|
554
|
+
|
555
|
+
def footer(&block)
|
556
|
+
@footer_content.instance_eval(&block)
|
557
|
+
end
|
558
|
+
|
559
|
+
def generate
|
560
|
+
elem = Elements.new(@page, @anchors)
|
561
|
+
|
562
|
+
id = @id
|
563
|
+
header_content = @header_content
|
564
|
+
body_content = @body_content
|
565
|
+
footer_content = @footer_content
|
566
|
+
|
567
|
+
elem.instance_eval do
|
568
|
+
div class: "modal fade", id: id, tabindex: -1, role: "dialog" do
|
569
|
+
div class: "modal-dialog", role: "document" do
|
570
|
+
div class: "modal-content" do
|
571
|
+
div class: "modal-header" do
|
572
|
+
button "×", type: "button", class: "close", :"data-dismiss" => "modal", :"aria-label" => "Close"
|
573
|
+
text header_content.generate
|
574
|
+
end
|
575
|
+
div class: "modal-body" do
|
576
|
+
text body_content.generate
|
577
|
+
end
|
578
|
+
div class: "modal-footer" do
|
579
|
+
text footer_content.generate
|
580
|
+
end
|
581
|
+
end
|
582
|
+
end
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
elem.generate
|
587
|
+
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
447
591
|
class DynamicTableCell < Elements
|
448
592
|
|
449
593
|
def data_button(anIcon, title={}, options={}, &block)
|
@@ -454,6 +598,39 @@ ENDROW
|
|
454
598
|
end
|
455
599
|
end
|
456
600
|
|
601
|
+
class JavaScriptObject
|
602
|
+
def initialize(&block)
|
603
|
+
@object = {}
|
604
|
+
instance_eval(&block) if block
|
605
|
+
end
|
606
|
+
|
607
|
+
def string(name, string)
|
608
|
+
@object[name] = {type: :string, value: string}
|
609
|
+
end
|
610
|
+
|
611
|
+
def variable(name, var_name)
|
612
|
+
@object[name] = {type: :var, value: var_name}
|
613
|
+
end
|
614
|
+
|
615
|
+
def generate
|
616
|
+
result = @object.map {
|
617
|
+
|key,value|
|
618
|
+
|
619
|
+
value_expression = value[:value]
|
620
|
+
|
621
|
+
if value[:type] == :string
|
622
|
+
value_expression = "\"#{value[:value]}\""
|
623
|
+
end
|
624
|
+
|
625
|
+
"#{key}: #{value_expression}"
|
626
|
+
|
627
|
+
}.join ","
|
628
|
+
|
629
|
+
"{#{result}}"
|
630
|
+
end
|
631
|
+
|
632
|
+
end
|
633
|
+
|
457
634
|
class DynamicTable
|
458
635
|
|
459
636
|
def initialize(page, anchors, url, options={}, &block)
|
@@ -462,6 +639,7 @@ ENDROW
|
|
462
639
|
@url = url
|
463
640
|
@options = options
|
464
641
|
@columns = nil
|
642
|
+
@query_object = nil
|
465
643
|
|
466
644
|
self.instance_eval(&block) if block
|
467
645
|
|
@@ -531,15 +709,39 @@ ENDROW
|
|
531
709
|
elem.generate
|
532
710
|
end
|
533
711
|
|
712
|
+
def query(&block)
|
713
|
+
@query_object = JavaScriptObject.new(&block)
|
714
|
+
end
|
715
|
+
|
534
716
|
def generate_script
|
535
717
|
|
718
|
+
query_object_declaration = ''
|
719
|
+
query_string = ""
|
720
|
+
|
721
|
+
if @query_object
|
722
|
+
query_object_declaration = @query_object.generate
|
723
|
+
query_string = "+ \"?\" + $.param(query_object)"
|
724
|
+
end
|
725
|
+
|
536
726
|
<<-DATATABLE_SCRIPT
|
537
727
|
|
538
728
|
function refresh_table_#{@table_name}()
|
539
729
|
{
|
540
|
-
|
730
|
+
var query_object = #{query_object_declaration};
|
731
|
+
|
732
|
+
$.get( "#{@url}" #{query_string}, function( data )
|
541
733
|
{
|
542
|
-
|
734
|
+
|
735
|
+
var data_object = {};
|
736
|
+
if (data !== null && typeof data === 'object')
|
737
|
+
{
|
738
|
+
data_object = data;
|
739
|
+
}
|
740
|
+
else
|
741
|
+
{
|
742
|
+
data_object = JSON.parse(data);
|
743
|
+
}
|
744
|
+
|
543
745
|
var head = $("##{@head_name}")
|
544
746
|
var body = $("##{@body_name}")
|
545
747
|
|
@@ -656,7 +858,7 @@ ENDROW
|
|
656
858
|
end
|
657
859
|
|
658
860
|
def generate
|
659
|
-
puts @code
|
861
|
+
#puts @code
|
660
862
|
<<-FUNCTION
|
661
863
|
function #{@actionName}(caller, data) {
|
662
864
|
#{@code}
|
@@ -761,15 +963,26 @@ function #{@actionName}(caller, data) {
|
|
761
963
|
@options = options
|
762
964
|
@scripts = []
|
763
965
|
|
764
|
-
@formName = @page.create_anchor
|
966
|
+
@formName = options[:id] || @page.create_anchor("form")
|
765
967
|
end
|
766
968
|
|
767
|
-
def passwordfield(name, textfield_label, options={})
|
969
|
+
def passwordfield(name, textfield_label=nil, options={})
|
970
|
+
|
971
|
+
if textfield_label.is_a? Hash
|
972
|
+
options = textfield_label
|
973
|
+
textfield_label = nil
|
974
|
+
end
|
975
|
+
|
768
976
|
options[:type] = "password"
|
769
977
|
textfield(name, textfield_label, options)
|
770
978
|
end
|
771
979
|
|
772
|
-
def textfield(name, textfield_label, options={})
|
980
|
+
def textfield(name, textfield_label=nil, options={})
|
981
|
+
|
982
|
+
if textfield_label.is_a? Hash
|
983
|
+
options = textfield_label
|
984
|
+
textfield_label = nil
|
985
|
+
end
|
773
986
|
|
774
987
|
textfield_name = @page.create_anchor "textfield"
|
775
988
|
options[:type] ||= "text"
|
@@ -781,19 +994,28 @@ function #{@actionName}(caller, data) {
|
|
781
994
|
input_options[:placeholder] = options[:placeholder]
|
782
995
|
input_options[:id] = textfield_name
|
783
996
|
input_options[:name] = options[:name]
|
997
|
+
input_options[:rows] = options[:rows]
|
784
998
|
input_options[:class] = "form-control"
|
785
999
|
|
1000
|
+
input_options[:autocomplete] = options[:autocomplete] || "on"
|
1001
|
+
input_options[:autocorrect] = options[:autocorrect] || "on"
|
1002
|
+
input_options[:autocapitalize] = options[:autocapitalize] || "off"
|
1003
|
+
|
786
1004
|
if options[:mask]
|
787
1005
|
@page.request_css "css/plugins/jasny/jasny-bootstrap.min.css"
|
788
1006
|
@page.request_js "js/plugins/jasny/jasny-bootstrap.min.js"
|
789
1007
|
|
790
1008
|
input_options[:"data-mask"] = options[:mask]
|
791
|
-
|
792
1009
|
end
|
793
1010
|
|
794
1011
|
div :class => "form-group" do
|
795
|
-
label textfield_label
|
796
|
-
|
1012
|
+
label textfield_label if textfield_label
|
1013
|
+
if input_options[:rows] and input_options[:rows] > 1
|
1014
|
+
textarea input_options do
|
1015
|
+
end
|
1016
|
+
else
|
1017
|
+
input input_options
|
1018
|
+
end
|
797
1019
|
end
|
798
1020
|
|
799
1021
|
@scripts << <<-SCRIPT
|
@@ -943,7 +1165,9 @@ function #{@actionName}(caller, data) {
|
|
943
1165
|
def submit(anIcon, title={}, options={}, &block)
|
944
1166
|
options[:icon] = anIcon
|
945
1167
|
options[:title] = title
|
1168
|
+
options[:type] = "submit"
|
946
1169
|
options[:data] = "get_#{@formName}_object()"
|
1170
|
+
options[:nosubmit] = true if block
|
947
1171
|
_button(options, &block)
|
948
1172
|
end
|
949
1173
|
|
@@ -989,10 +1213,20 @@ $(document).ready(function () {
|
|
989
1213
|
def generate
|
990
1214
|
inner = super
|
991
1215
|
formName = @formName
|
1216
|
+
options = @options
|
992
1217
|
|
993
1218
|
elem = Elements.new(@page, @anchors)
|
994
1219
|
elem.instance_eval do
|
995
|
-
|
1220
|
+
|
1221
|
+
form_opts = {
|
1222
|
+
id: formName,
|
1223
|
+
role: "form"
|
1224
|
+
}
|
1225
|
+
|
1226
|
+
form_opts[:action] = options[:action] if options[:action]
|
1227
|
+
form_opts[:class] = options[:class] if options[:class]
|
1228
|
+
|
1229
|
+
method_missing :form, form_opts do
|
996
1230
|
text inner
|
997
1231
|
end
|
998
1232
|
end
|
@@ -1315,21 +1549,27 @@ $(document).ready(function () {
|
|
1315
1549
|
|
1316
1550
|
class Page
|
1317
1551
|
|
1318
|
-
attr_accessor :scripts
|
1552
|
+
attr_accessor :scripts, :onload_scripts
|
1319
1553
|
|
1320
|
-
def initialize(title, options)
|
1554
|
+
def initialize(title, global_settings, options, &block)
|
1321
1555
|
@title = title
|
1322
1556
|
@content = ""
|
1323
1557
|
@body_class = nil
|
1324
1558
|
@anchors = {}
|
1559
|
+
@global_settings = global_settings
|
1325
1560
|
@options = options
|
1326
1561
|
@scripts = []
|
1327
1562
|
@top_content = ""
|
1328
1563
|
|
1329
1564
|
@scripts_once = {}
|
1565
|
+
@onload_scripts = []
|
1330
1566
|
|
1331
1567
|
@requested_scripts = {}
|
1332
1568
|
@requested_css = {}
|
1569
|
+
|
1570
|
+
@background = Elements.new(self, @anchors)
|
1571
|
+
|
1572
|
+
@block = Proc.new &block
|
1333
1573
|
end
|
1334
1574
|
|
1335
1575
|
def create_anchor(name)
|
@@ -1347,7 +1587,7 @@ $(document).ready(function () {
|
|
1347
1587
|
end
|
1348
1588
|
|
1349
1589
|
def root
|
1350
|
-
return @
|
1590
|
+
return @global_settings[:root]
|
1351
1591
|
end
|
1352
1592
|
|
1353
1593
|
def request_js(path)
|
@@ -1358,10 +1598,18 @@ $(document).ready(function () {
|
|
1358
1598
|
@requested_css[path] = true
|
1359
1599
|
end
|
1360
1600
|
|
1601
|
+
def on_page_load(script)
|
1602
|
+
@onload_scripts << script
|
1603
|
+
end
|
1604
|
+
|
1361
1605
|
def write_script_once(script)
|
1362
1606
|
@scripts_once[script] = true
|
1363
1607
|
end
|
1364
1608
|
|
1609
|
+
def background(&block)
|
1610
|
+
@background.instance_eval(&block)
|
1611
|
+
end
|
1612
|
+
|
1365
1613
|
def top(&block)
|
1366
1614
|
elem = Elements.new(@page, @anchors)
|
1367
1615
|
elem.instance_eval(&block)
|
@@ -1371,6 +1619,21 @@ $(document).ready(function () {
|
|
1371
1619
|
|
1372
1620
|
def generate(back_folders, options={})
|
1373
1621
|
|
1622
|
+
if @options[:cache_file]
|
1623
|
+
expired = @options[:cache_expired]
|
1624
|
+
cache_exist = File.exist?("cache/cachedpage#{@options[:cache_file]}")
|
1625
|
+
|
1626
|
+
if cache_exist and !expired
|
1627
|
+
puts "Weaver Hit cache for file: #{@options[:cache_file]}"
|
1628
|
+
puts "- expired: #{expired}"
|
1629
|
+
puts "- cache_exist: #{cache_exist}"
|
1630
|
+
return File.read("cache/cachedpage#{@options[:cache_file]}");
|
1631
|
+
end
|
1632
|
+
puts "Weaver Miss cache for file: #{@options[:cache_file]}"
|
1633
|
+
puts "- expired: #{expired}"
|
1634
|
+
puts "- cache_exist: #{cache_exist}"
|
1635
|
+
end
|
1636
|
+
|
1374
1637
|
scripts = @scripts.join("\n")
|
1375
1638
|
|
1376
1639
|
mod = "../" * back_folders
|
@@ -1405,7 +1668,12 @@ $(document).ready(function () {
|
|
1405
1668
|
SCRIPT_DECL
|
1406
1669
|
}.join "\n"
|
1407
1670
|
|
1408
|
-
<<-
|
1671
|
+
onload_scripts = @onload_scripts.map {|value| <<-SCRIPT_DECL
|
1672
|
+
#{value}
|
1673
|
+
SCRIPT_DECL
|
1674
|
+
}.join "\n"
|
1675
|
+
|
1676
|
+
result =<<-SKELETON
|
1409
1677
|
<!DOCTYPE html>
|
1410
1678
|
<html>
|
1411
1679
|
<!-- Generated using weaver: https://github.com/davidsiaw/weaver -->
|
@@ -1419,7 +1687,6 @@ $(document).ready(function () {
|
|
1419
1687
|
<link href="#{mod}css/bootstrap.min.css" rel="stylesheet">
|
1420
1688
|
<link href="#{mod}font-awesome/css/font-awesome.css" rel="stylesheet">
|
1421
1689
|
<link href="#{mod}css/plugins/iCheck/custom.css" rel="stylesheet">
|
1422
|
-
<link href="#{mod}css/plugins/blueimp/css/blueimp-gallery.min.css" rel="stylesheet">
|
1423
1690
|
|
1424
1691
|
#{extra_css}
|
1425
1692
|
|
@@ -1429,8 +1696,15 @@ $(document).ready(function () {
|
|
1429
1696
|
</head>
|
1430
1697
|
|
1431
1698
|
#{body_tag}
|
1699
|
+
|
1700
|
+
<div id="background" style="z-index: -999; position:absolute; left:0px; right:0px; width:100%; height:100%">
|
1701
|
+
#{@background.generate}
|
1702
|
+
</div>
|
1703
|
+
|
1704
|
+
<div id="content" style="z-index: 0">
|
1432
1705
|
#{@top_content}
|
1433
1706
|
#{@content}
|
1707
|
+
</div>
|
1434
1708
|
|
1435
1709
|
<!-- Mainly scripts -->
|
1436
1710
|
<script src="#{mod}js/jquery-2.1.1.js"></script>
|
@@ -1441,21 +1715,6 @@ $(document).ready(function () {
|
|
1441
1715
|
|
1442
1716
|
#{extra_scripts}
|
1443
1717
|
|
1444
|
-
<!-- blueimp gallery -->
|
1445
|
-
<script src="#{mod}js/plugins/blueimp/jquery.blueimp-gallery.min.js"></script>
|
1446
|
-
|
1447
|
-
<style>
|
1448
|
-
/* Local style for demo purpose */
|
1449
|
-
|
1450
|
-
.lightBoxGallery {
|
1451
|
-
text-align: center;
|
1452
|
-
}
|
1453
|
-
|
1454
|
-
.lightBoxGallery img {
|
1455
|
-
margin: 5px;
|
1456
|
-
}
|
1457
|
-
|
1458
|
-
</style>
|
1459
1718
|
|
1460
1719
|
|
1461
1720
|
<!-- Custom and plugin javascript -->
|
@@ -1465,17 +1724,14 @@ $(document).ready(function () {
|
|
1465
1724
|
<script>
|
1466
1725
|
#{scripts}
|
1467
1726
|
#{extra_one_time_scripts}
|
1727
|
+
|
1728
|
+
$( document ).ready(function() {
|
1729
|
+
|
1730
|
+
#{onload_scripts}
|
1731
|
+
|
1732
|
+
});
|
1468
1733
|
</script>
|
1469
1734
|
|
1470
|
-
<div id="blueimp-gallery" class="blueimp-gallery">
|
1471
|
-
<div class="slides"></div>
|
1472
|
-
<h3 class="title"></h3>
|
1473
|
-
<a class="prev">‹</a>
|
1474
|
-
<a class="next">›</a>
|
1475
|
-
<a class="close">×</a>
|
1476
|
-
<a class="play-pause"></a>
|
1477
|
-
<ol class="indicator"></ol>
|
1478
|
-
</div>
|
1479
1735
|
|
1480
1736
|
|
1481
1737
|
</body>
|
@@ -1483,16 +1739,25 @@ $(document).ready(function () {
|
|
1483
1739
|
</html>
|
1484
1740
|
|
1485
1741
|
SKELETON
|
1742
|
+
|
1743
|
+
if @options[:cache_file]
|
1744
|
+
FileUtils.mkdir_p "cache"
|
1745
|
+
File.write("cache/cachedpage#{@options[:cache_file]}", result);
|
1746
|
+
end
|
1747
|
+
|
1748
|
+
return result
|
1749
|
+
|
1486
1750
|
end
|
1487
1751
|
end
|
1488
1752
|
|
1489
1753
|
class Row
|
1490
|
-
attr_accessor :extra_classes
|
1754
|
+
attr_accessor :extra_classes, :style
|
1491
1755
|
|
1492
1756
|
def initialize(page, anchors, options)
|
1493
1757
|
@columns = []
|
1494
1758
|
@free = 12
|
1495
1759
|
@extra_classes = options[:class] || ""
|
1760
|
+
@style = options[:style]
|
1496
1761
|
@anchors = anchors
|
1497
1762
|
@page = page
|
1498
1763
|
end
|
@@ -1559,8 +1824,20 @@ $(document).ready(function () {
|
|
1559
1824
|
md = col[:options][:md] || col[:occupy]
|
1560
1825
|
lg = col[:options][:lg] || col[:occupy]
|
1561
1826
|
|
1827
|
+
hidden = ""
|
1828
|
+
|
1829
|
+
xs_style = "col-xs-#{xs}" unless col[:options][:xs] == 0
|
1830
|
+
sm_style = "col-sm-#{sm}" unless col[:options][:sm] == 0
|
1831
|
+
md_style = "col-md-#{md}" unless col[:options][:md] == 0
|
1832
|
+
lg_style = "col-lg-#{lg}" unless col[:options][:lg] == 0
|
1833
|
+
|
1834
|
+
hidden += "hidden-xs " if col[:options][:xs] == 0
|
1835
|
+
hidden += "hidden-sm " if col[:options][:sm] == 0
|
1836
|
+
hidden += "hidden-md " if col[:options][:md] == 0
|
1837
|
+
hidden += "hidden-lg " if col[:options][:lg] == 0
|
1838
|
+
|
1562
1839
|
<<-ENDCOLUMN
|
1563
|
-
<div class="
|
1840
|
+
<div class="#{xs_style} #{sm_style} #{md_style} #{lg_style} #{hidden}">
|
1564
1841
|
#{col[:elem].generate}
|
1565
1842
|
</div>
|
1566
1843
|
ENDCOLUMN
|
@@ -1574,23 +1851,22 @@ $(document).ready(function () {
|
|
1574
1851
|
@items = []
|
1575
1852
|
end
|
1576
1853
|
|
1577
|
-
def nav(name, icon=:question, url=nil, &block)
|
1578
|
-
if url
|
1579
|
-
@items << { name: name, link: url, icon: icon }
|
1580
|
-
|
1581
|
-
@items << { name: name, link: "#", icon: icon }
|
1582
|
-
end
|
1583
|
-
if block
|
1854
|
+
def nav(name, icon=:question, url=nil, options={}, &block)
|
1855
|
+
if url and !block
|
1856
|
+
@items << { name: name, link: url, icon: icon, options: options }
|
1857
|
+
elsif block
|
1584
1858
|
menu = Menu.new
|
1585
1859
|
menu.instance_eval(&block)
|
1586
|
-
@items << { name: name, menu: menu, icon: icon }
|
1860
|
+
@items << { name: name, menu: menu, icon: icon, options: options }
|
1861
|
+
else
|
1862
|
+
@items << { name: name, link: "#", icon: icon, options: options }
|
1587
1863
|
end
|
1588
1864
|
end
|
1589
1865
|
end
|
1590
1866
|
|
1591
1867
|
class StructuredPage < Page
|
1592
1868
|
|
1593
|
-
def initialize(title, options)
|
1869
|
+
def initialize(title, global_settings, options, &block)
|
1594
1870
|
@rows = []
|
1595
1871
|
super
|
1596
1872
|
end
|
@@ -1608,7 +1884,7 @@ $(document).ready(function () {
|
|
1608
1884
|
end
|
1609
1885
|
|
1610
1886
|
class NavPage < StructuredPage
|
1611
|
-
def initialize(title, options)
|
1887
|
+
def initialize(title, global_settings, options, &block)
|
1612
1888
|
super
|
1613
1889
|
@menu = Menu.new
|
1614
1890
|
end
|
@@ -1625,14 +1901,15 @@ $(document).ready(function () {
|
|
1625
1901
|
end
|
1626
1902
|
|
1627
1903
|
class SideNavPage < NavPage
|
1628
|
-
def initialize(title, options)
|
1904
|
+
def initialize(title, global_settings, options, &block)
|
1629
1905
|
super
|
1630
1906
|
end
|
1631
1907
|
|
1632
1908
|
def generate(level)
|
1909
|
+
instance_eval &@block
|
1633
1910
|
rows = @rows.map { |row|
|
1634
1911
|
<<-ENDROW
|
1635
|
-
<div class="row #{row.extra_classes}">
|
1912
|
+
<div class="row #{row.extra_classes}" style="#{row.style}">
|
1636
1913
|
#{row.generate}
|
1637
1914
|
</div>
|
1638
1915
|
ENDROW
|
@@ -1644,11 +1921,10 @@ $(document).ready(function () {
|
|
1644
1921
|
navigation.instance_eval do
|
1645
1922
|
|
1646
1923
|
menu.items.each do |item|
|
1647
|
-
li do
|
1924
|
+
li item[:options] do
|
1648
1925
|
if item.has_key? :menu
|
1649
1926
|
|
1650
|
-
|
1651
|
-
a href:"#" do
|
1927
|
+
a href:"#{item[:link]}" do
|
1652
1928
|
icon item[:icon]
|
1653
1929
|
span :class => "nav-label" do
|
1654
1930
|
text item[:name]
|
@@ -1660,17 +1936,23 @@ $(document).ready(function () {
|
|
1660
1936
|
|
1661
1937
|
ul :class => "nav nav-second-level" do
|
1662
1938
|
item[:menu].items.each do |inneritem|
|
1663
|
-
li do
|
1939
|
+
li inneritem[:options] do
|
1664
1940
|
if inneritem.has_key?(:menu)
|
1665
1941
|
raise "Second level menu not supported"
|
1666
1942
|
else
|
1667
|
-
|
1943
|
+
a href:"#{inneritem[:link]}" do
|
1944
|
+
icon inneritem[:icon]
|
1945
|
+
span :class => "nav-label" do
|
1946
|
+
text inneritem[:name]
|
1947
|
+
end
|
1948
|
+
end
|
1668
1949
|
end
|
1669
1950
|
end
|
1670
1951
|
end
|
1671
1952
|
end
|
1672
1953
|
elsif
|
1673
|
-
a href: "#" do
|
1954
|
+
a href: "#{item[:link]}" do
|
1955
|
+
icon item[:icon]
|
1674
1956
|
span :class => "nav-label" do
|
1675
1957
|
text item[:name]
|
1676
1958
|
end
|
@@ -1687,7 +1969,7 @@ $(document).ready(function () {
|
|
1687
1969
|
brand_content = <<-BRAND_CONTENT
|
1688
1970
|
|
1689
1971
|
<li>
|
1690
|
-
<a href="#"><i class="fa fa-home"></i> <span class="nav-label"
|
1972
|
+
<a href="#{root}"><i class="fa fa-home"></i> <span class="nav-label">#{@brand}</span> <span class="label label-primary pull-right"></span></a>
|
1691
1973
|
</li>
|
1692
1974
|
BRAND_CONTENT
|
1693
1975
|
end
|
@@ -1728,14 +2010,15 @@ $(document).ready(function () {
|
|
1728
2010
|
end
|
1729
2011
|
|
1730
2012
|
class TopNavPage < NavPage
|
1731
|
-
def initialize(title, options)
|
2013
|
+
def initialize(title, global_settings, options, &block)
|
1732
2014
|
super
|
1733
2015
|
end
|
1734
2016
|
|
1735
2017
|
def generate(level)
|
2018
|
+
instance_eval &@block
|
1736
2019
|
rows = @rows.map { |row|
|
1737
2020
|
<<-ENDROW
|
1738
|
-
<div class="row #{row.extra_classes}">
|
2021
|
+
<div class="row #{row.extra_classes}" style="#{row.style}">
|
1739
2022
|
#{row.generate}
|
1740
2023
|
</div>
|
1741
2024
|
ENDROW
|
@@ -1750,7 +2033,7 @@ $(document).ready(function () {
|
|
1750
2033
|
navigation.instance_eval do
|
1751
2034
|
|
1752
2035
|
menu.items.each do |item|
|
1753
|
-
li do
|
2036
|
+
li item[:options] do
|
1754
2037
|
if item.has_key? :menu
|
1755
2038
|
|
1756
2039
|
li :class => "dropdown" do
|
@@ -1769,7 +2052,7 @@ $(document).ready(function () {
|
|
1769
2052
|
end
|
1770
2053
|
ul role: "menu", :class => "dropdown-menu" do
|
1771
2054
|
item[:menu].items.each do |inneritem|
|
1772
|
-
li do
|
2055
|
+
li inneritem[:options] do
|
1773
2056
|
if inneritem.has_key?(:menu)
|
1774
2057
|
raise "Second level menu not supported"
|
1775
2058
|
else
|
@@ -1799,7 +2082,7 @@ $(document).ready(function () {
|
|
1799
2082
|
|
1800
2083
|
<div class="navbar-header">
|
1801
2084
|
|
1802
|
-
<a href="#" class="navbar-brand"
|
2085
|
+
<a href="#{root}" class="navbar-brand">#{@brand}</a>
|
1803
2086
|
</div>
|
1804
2087
|
BRAND_CONTENT
|
1805
2088
|
end
|
@@ -1846,11 +2129,12 @@ $(document).ready(function () {
|
|
1846
2129
|
end
|
1847
2130
|
|
1848
2131
|
class NonNavPage < StructuredPage
|
1849
|
-
def initialize(title, options)
|
2132
|
+
def initialize(title, global_settings, options, &block)
|
1850
2133
|
super
|
1851
2134
|
end
|
1852
2135
|
|
1853
2136
|
def generate(level)
|
2137
|
+
instance_eval &@block
|
1854
2138
|
rows = @rows.map { |row|
|
1855
2139
|
<<-ENDROW
|
1856
2140
|
<div class="row #{row.extra_classes}">
|
@@ -1875,39 +2159,34 @@ $(document).ready(function () {
|
|
1875
2159
|
end
|
1876
2160
|
|
1877
2161
|
class RawPage < Page
|
1878
|
-
def initialize(title, options)
|
1879
|
-
@element = Elements.new(self, {})
|
2162
|
+
def initialize(title, global_settings, options, &block)
|
1880
2163
|
super
|
1881
2164
|
end
|
1882
2165
|
|
1883
|
-
def
|
1884
|
-
@element = value
|
1885
|
-
end
|
2166
|
+
def generate(back_folders, options={})
|
1886
2167
|
|
2168
|
+
elem = Elements.new(self, {})
|
2169
|
+
elem.instance_eval(&@block)
|
1887
2170
|
|
1888
|
-
|
1889
|
-
@element.generate
|
2171
|
+
elem.generate
|
1890
2172
|
end
|
1891
2173
|
|
1892
2174
|
end
|
1893
2175
|
|
1894
2176
|
class EmptyPage < Page
|
1895
|
-
def initialize(title, options)
|
1896
|
-
@element = Elements.new(self, {})
|
2177
|
+
def initialize(title, global_settings, options, &block)
|
1897
2178
|
super
|
1898
2179
|
end
|
1899
2180
|
|
1900
|
-
def element=(value)
|
1901
|
-
@element = value
|
1902
|
-
end
|
1903
|
-
|
1904
2181
|
def generate(level)
|
2182
|
+
elem = Elements.new(self, {})
|
2183
|
+
elem.instance_eval(&@block)
|
1905
2184
|
@body_class = "gray-bg"
|
1906
2185
|
@content = <<-CONTENT
|
1907
2186
|
<div id="wrapper">
|
1908
2187
|
<div class="wrapper-content">
|
1909
2188
|
<div class="container">
|
1910
|
-
#{
|
2189
|
+
#{elem.generate}
|
1911
2190
|
</div>
|
1912
2191
|
</div>
|
1913
2192
|
</div>
|
@@ -1918,21 +2197,20 @@ $(document).ready(function () {
|
|
1918
2197
|
|
1919
2198
|
|
1920
2199
|
class CenterPage < Page
|
1921
|
-
def initialize(title, options)
|
1922
|
-
@element = Elements.new(self, {})
|
2200
|
+
def initialize(title, global_settings, options, &block)
|
1923
2201
|
super
|
1924
2202
|
end
|
1925
2203
|
|
1926
|
-
def element=(value)
|
1927
|
-
@element = value
|
1928
|
-
end
|
1929
|
-
|
1930
2204
|
def generate(level)
|
2205
|
+
|
2206
|
+
elem = Elements.new(self, {})
|
2207
|
+
elem.instance_eval(&@block)
|
2208
|
+
|
1931
2209
|
@body_class = "gray-bg"
|
1932
2210
|
@content = <<-CONTENT
|
1933
2211
|
<div class="middle-box text-center animated fadeInDown">
|
1934
2212
|
<div>
|
1935
|
-
#{
|
2213
|
+
#{elem.generate}
|
1936
2214
|
</div>
|
1937
2215
|
</div>
|
1938
2216
|
CONTENT
|
@@ -1945,95 +2223,74 @@ $(document).ready(function () {
|
|
1945
2223
|
def initialize(file, options={})
|
1946
2224
|
@pages = {}
|
1947
2225
|
@file = file
|
1948
|
-
@
|
2226
|
+
@global_settings = options
|
1949
2227
|
|
1950
|
-
@
|
1951
|
-
@
|
2228
|
+
@global_settings[:root] = @global_settings[:root] || "/"
|
2229
|
+
@global_settings[:root] = "#{@global_settings[:root]}/" unless @global_settings[:root].end_with? "/"
|
1952
2230
|
instance_eval(File.read(file), file)
|
1953
2231
|
end
|
1954
2232
|
|
1955
|
-
def center_page(path, title=nil, &block)
|
2233
|
+
def center_page(path, title=nil, options={}, &block)
|
1956
2234
|
|
1957
2235
|
if title == nil
|
1958
2236
|
title = path
|
1959
2237
|
path = ""
|
1960
2238
|
end
|
1961
2239
|
|
1962
|
-
p = CenterPage.new(title, @options)
|
1963
|
-
|
1964
|
-
elem = Elements.new(p, {})
|
1965
|
-
elem.instance_eval(&block) if block
|
1966
|
-
|
1967
|
-
p.element=elem
|
1968
|
-
|
2240
|
+
p = CenterPage.new(title, @global_settings, options, &block)
|
1969
2241
|
@pages[path] = p
|
1970
2242
|
end
|
1971
2243
|
|
1972
|
-
def sidenav_page(path, title=nil, &block)
|
2244
|
+
def sidenav_page(path, title=nil, options={}, &block)
|
1973
2245
|
|
1974
2246
|
if title == nil
|
1975
2247
|
title = path
|
1976
2248
|
path = ""
|
1977
2249
|
end
|
1978
2250
|
|
1979
|
-
p = SideNavPage.new(title, @options)
|
1980
|
-
p.instance_eval(&block) if block
|
2251
|
+
p = SideNavPage.new(title, @global_settings, options, &block)
|
1981
2252
|
@pages[path] = p
|
1982
2253
|
end
|
1983
2254
|
|
1984
|
-
def topnav_page(path, title=nil, &block)
|
2255
|
+
def topnav_page(path, title=nil, options={}, &block)
|
1985
2256
|
|
1986
2257
|
if title == nil
|
1987
2258
|
title = path
|
1988
2259
|
path = ""
|
1989
2260
|
end
|
1990
2261
|
|
1991
|
-
p = TopNavPage.new(title, @options)
|
1992
|
-
p.instance_eval(&block) if block
|
2262
|
+
p = TopNavPage.new(title, @global_settings, options, &block)
|
1993
2263
|
@pages[path] = p
|
1994
2264
|
end
|
1995
2265
|
|
1996
|
-
def nonnav_page(path, title=nil, &block)
|
2266
|
+
def nonnav_page(path, title=nil, options={}, &block)
|
1997
2267
|
|
1998
2268
|
if title == nil
|
1999
2269
|
title = path
|
2000
2270
|
path = ""
|
2001
2271
|
end
|
2002
2272
|
|
2003
|
-
p = NonNavPage.new(title, @options)
|
2004
|
-
p.instance_eval(&block) if block
|
2273
|
+
p = NonNavPage.new(title, @global_settings, options, &block)
|
2005
2274
|
@pages[path] = p
|
2006
2275
|
end
|
2007
2276
|
|
2008
2277
|
|
2009
|
-
def empty_page(path, title=nil, &block)
|
2278
|
+
def empty_page(path, title=nil, options={}, &block)
|
2010
2279
|
|
2011
2280
|
if title == nil
|
2012
2281
|
title = path
|
2013
2282
|
path = ""
|
2014
2283
|
end
|
2015
2284
|
|
2016
|
-
p = EmptyPage.new(title, @options)
|
2017
|
-
|
2018
|
-
elem = Elements.new(p, {})
|
2019
|
-
elem.instance_eval(&block) if block
|
2020
|
-
|
2021
|
-
p.element=elem
|
2022
|
-
|
2285
|
+
p = EmptyPage.new(title, @global_settings, options, &block)
|
2023
2286
|
@pages[path] = p
|
2024
2287
|
end
|
2025
2288
|
|
2026
|
-
def raw_page(path="", &block)
|
2289
|
+
def raw_page(path="", options={}, &block)
|
2027
2290
|
|
2028
2291
|
# raw pages dont even have a title
|
2029
2292
|
|
2030
|
-
p = RawPage.new("", @options)
|
2031
|
-
|
2032
|
-
elem = Elements.new(p, {})
|
2033
|
-
elem.instance_eval(&block) if block
|
2034
|
-
|
2035
|
-
p.element=elem
|
2036
|
-
|
2293
|
+
p = RawPage.new("", @global_settings, options, &block)
|
2037
2294
|
@pages[path] = p
|
2038
2295
|
end
|
2039
2296
|
|
data/weaver.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.summary = "Website generator"
|
13
13
|
spec.description = "Site generator with a simple DSL"
|
14
|
-
spec.homepage = "https://github.
|
14
|
+
spec.homepage = "https://davidsiaw.github.io/weaver-docs/"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
|
30
|
+
spec.add_dependency "activesupport"
|
30
31
|
spec.add_dependency "sinatra"
|
31
32
|
spec.add_dependency "trollop"
|
32
33
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weaver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Siaw
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03
|
11
|
+
date: 2016-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
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'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: sinatra
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -685,7 +699,7 @@ files:
|
|
685
699
|
- lib/weaver.rb
|
686
700
|
- lib/weaver/version.rb
|
687
701
|
- weaver.gemspec
|
688
|
-
homepage: https://github.
|
702
|
+
homepage: https://davidsiaw.github.io/weaver-docs/
|
689
703
|
licenses:
|
690
704
|
- MIT
|
691
705
|
metadata:
|