www_app 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -14
- data/VERSION +1 -1
- data/lib/www_app.rb +59 -7
- data/specs/sample.rb +40 -0
- data/specs/{as_ruby → server-side}/0000-new.rb +0 -0
- data/specs/{as_ruby → server-side}/0010-attrs.rb +0 -0
- data/specs/{as_ruby → server-side}/0011-class.rb +0 -0
- data/specs/{as_ruby → server-side}/0011-href.rb +0 -0
- data/specs/{as_ruby → server-side}/0011-id.rb +0 -0
- data/specs/{as_ruby → server-side}/0020-tag.rb +0 -0
- data/specs/{as_ruby → server-side}/0020-tag_content.rb +0 -0
- data/specs/{as_ruby → server-side}/0021-body.rb +0 -0
- data/specs/{as_ruby → server-side}/0021-form.rb +0 -0
- data/specs/{as_ruby → server-side}/0021-link.rb +0 -0
- data/specs/server-side/0021-page_title.rb +11 -0
- data/specs/{as_ruby → server-side}/0021-script.rb +0 -0
- data/specs/{as_ruby → server-side}/0030-mustache.rb +0 -0
- data/specs/server-side/0030-style.rb +63 -0
- data/specs/{as_ruby → server-side}/0040-css.rb +0 -0
- data/specs/server-side/0041-font_family.rb +15 -0
- data/specs/{as_ruby → server-side}/0050-on.rb +0 -0
- data/www_app.gemspec +1 -1
- metadata +21 -21
- data/specs/lib/sample.rb +0 -23
- data/specs/sampe.2.rb +0 -14
- data/specs/sample.3.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbfdf7458b157b502e9cf03a522b7d3d41883a6e
|
4
|
+
data.tar.gz: dff3da5abcc509526f77e5b511306c5f113e4a9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 938a2941e13c3912b4a9b6603d47fc77f0ac0e4b7c8813f66f27ad07392db2e00e66187e23bb6c02c6e9644ad4ec6ea244651b053800ec68e8ae520e7a18c4bf
|
7
|
+
data.tar.gz: 1580b1995dca04033a640ceee1131b328d086b525e3bdd1f681f57d45b9e992c2be756a7b9a7de466b7b8a8681049b124229b76d5557d279b18fffaf52913145
|
data/README.md
CHANGED
@@ -19,26 +19,37 @@ To install:
|
|
19
19
|
To Use:
|
20
20
|
|
21
21
|
```ruby
|
22
|
-
|
22
|
+
WWW_App.new {
|
23
|
+
|
24
|
+
style {
|
25
|
+
a {
|
26
|
+
_link { color '#fff' }
|
27
|
+
_visited { color '#f88' }
|
28
|
+
_hover { color '#ccc' }
|
29
|
+
}
|
30
|
+
}
|
23
31
|
|
24
|
-
|
25
|
-
background_color 'grey'
|
32
|
+
div {
|
26
33
|
|
27
|
-
|
28
|
-
|
29
|
-
background_color 'white'
|
30
|
-
}
|
34
|
+
border '1px solid #000'
|
35
|
+
background_color 'grey'
|
31
36
|
|
32
|
-
|
37
|
+
on('scary') {
|
38
|
+
border '2px dotted red'
|
39
|
+
background_color 'white'
|
40
|
+
}
|
33
41
|
|
34
|
-
|
35
|
-
parent 'div'
|
36
|
-
add_class 'scary'
|
42
|
+
p { 'Click the button to make me scared.' }
|
37
43
|
|
38
|
-
|
39
|
-
|
44
|
+
button {
|
45
|
+
parent 'div'
|
46
|
+
add_class 'scary'
|
40
47
|
|
41
|
-
|
48
|
+
'Scary-ify'
|
49
|
+
}
|
50
|
+
|
51
|
+
}
|
52
|
+
}.to_html
|
42
53
|
```
|
43
54
|
|
44
55
|
It generates the CSS, JS, and HTML.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/lib/www_app.rb
CHANGED
@@ -100,6 +100,7 @@ class WWW_App < BasicObject
|
|
100
100
|
|
101
101
|
Unescaped = ::Class.new(::StandardError)
|
102
102
|
Not_Unique = ::Class.new(::StandardError)
|
103
|
+
Wrong_Parent = ::Class.new(::StandardError)
|
103
104
|
HTML_ID_Duplicate = ::Class.new(Not_Unique)
|
104
105
|
|
105
106
|
ALWAYS_END_TAGS = [:script]
|
@@ -159,6 +160,21 @@ class WWW_App < BasicObject
|
|
159
160
|
:at_rules => [ 'font-face', 'media' ],
|
160
161
|
:protocols => [ :relative ],
|
161
162
|
|
163
|
+
:pseudo => %w[
|
164
|
+
active checked default dir() disabled
|
165
|
+
empty enabled
|
166
|
+
first first-child first-of-type fullscreen focus
|
167
|
+
hover
|
168
|
+
indeterminate in-range invalid
|
169
|
+
lang() last-child last-of-type left link
|
170
|
+
not() nth-child() nth-last-child() nth-last-of-type() nth-of-type()
|
171
|
+
only-child only-of-type optional out-of-range
|
172
|
+
read-only read-write required right root
|
173
|
+
scope
|
174
|
+
target
|
175
|
+
valid visited
|
176
|
+
].select { |name| name[/\A[a-z0-9\-]+\Z/] }.map { |name| name.gsub('-', '_').to_sym },
|
177
|
+
|
162
178
|
# From: Sanitize::Config::RELAXED[:css][:properties]
|
163
179
|
:properties => %w[
|
164
180
|
background bottom font_variant_numeric position
|
@@ -220,10 +236,11 @@ class WWW_App < BasicObject
|
|
220
236
|
end # === class self ==============================================
|
221
237
|
|
222
238
|
def initialize *files
|
223
|
-
@js
|
224
|
-
@style
|
225
|
-
@css_arr
|
239
|
+
@js = []
|
240
|
+
@style = {}
|
241
|
+
@css_arr = []
|
226
242
|
@css_id_override = nil
|
243
|
+
@render_it = true
|
227
244
|
|
228
245
|
@title = nil
|
229
246
|
@scripts = []
|
@@ -231,6 +248,7 @@ class WWW_App < BasicObject
|
|
231
248
|
@compiled = nil
|
232
249
|
@cache = {}
|
233
250
|
@is_doc = false
|
251
|
+
@page_title = nil
|
234
252
|
@default_ids = {}
|
235
253
|
|
236
254
|
@state = [:create]
|
@@ -364,6 +382,10 @@ class WWW_App < BasicObject
|
|
364
382
|
|
365
383
|
private # =========================================================
|
366
384
|
|
385
|
+
# =================================================================
|
386
|
+
# Parent-related methods
|
387
|
+
# =================================================================
|
388
|
+
|
367
389
|
#
|
368
390
|
# NOTE: Properties are defined first,
|
369
391
|
# so :elements methods can over-write them,
|
@@ -391,7 +413,10 @@ class WWW_App < BasicObject
|
|
391
413
|
EOF
|
392
414
|
}
|
393
415
|
|
394
|
-
#
|
416
|
+
# =================================================================
|
417
|
+
# Future features...
|
418
|
+
# =================================================================
|
419
|
+
|
395
420
|
def section
|
396
421
|
fail
|
397
422
|
end
|
@@ -407,7 +432,11 @@ class WWW_App < BasicObject
|
|
407
432
|
def at_bottom_of
|
408
433
|
fail
|
409
434
|
end
|
410
|
-
|
435
|
+
|
436
|
+
|
437
|
+
# =================================================================
|
438
|
+
# Miscellaneaous Helpers
|
439
|
+
# =================================================================
|
411
440
|
|
412
441
|
def is_doc?
|
413
442
|
@is_doc || !@style[:css].empty? || !@js.empty?
|
@@ -628,7 +657,8 @@ class WWW_App < BasicObject
|
|
628
657
|
:childs => [],
|
629
658
|
:parent_index => @current_tag_index,
|
630
659
|
:is_closed => false,
|
631
|
-
:tag_index => @tag_arr.size
|
660
|
+
:tag_index => @tag_arr.size,
|
661
|
+
:render? => @render_it
|
632
662
|
}
|
633
663
|
|
634
664
|
@tag_arr << e
|
@@ -693,6 +723,14 @@ class WWW_App < BasicObject
|
|
693
723
|
# CSS-related methods
|
694
724
|
# =================================================================
|
695
725
|
|
726
|
+
def style
|
727
|
+
orig = @render_it
|
728
|
+
@render_it = false
|
729
|
+
results = yield
|
730
|
+
@render_it = orig
|
731
|
+
results
|
732
|
+
end
|
733
|
+
|
696
734
|
def css_property name, val = nil
|
697
735
|
prop = {:name=>name, :value=>val, :parent=>parent? ? parent : nil}
|
698
736
|
|
@@ -705,13 +743,24 @@ class WWW_App < BasicObject
|
|
705
743
|
@css_arr.pop
|
706
744
|
end
|
707
745
|
|
746
|
+
Methods[:css][:pseudo].each { |name|
|
747
|
+
eval <<-EOF, nil, __FILE__, __LINE__ + 1
|
748
|
+
def _#{name}
|
749
|
+
orig = @css_id_override
|
750
|
+
@css_id_override = ':#{name}'.freeze
|
751
|
+
result = yield
|
752
|
+
@css_id_override = orig
|
753
|
+
result
|
754
|
+
end
|
755
|
+
EOF
|
756
|
+
}
|
708
757
|
|
709
758
|
# =================================================================
|
710
759
|
|
711
760
|
def page_title
|
712
761
|
@is_doc = true
|
713
762
|
in_tag(@head) {
|
714
|
-
tag(:title) { yield }
|
763
|
+
tag(:title) { @page_title = yield }
|
715
764
|
}
|
716
765
|
self
|
717
766
|
end
|
@@ -748,6 +797,7 @@ class WWW_App < BasicObject
|
|
748
797
|
h = vals
|
749
798
|
h.map { |raw_k,styles|
|
750
799
|
k = raw_k.to_s
|
800
|
+
|
751
801
|
<<-EOF
|
752
802
|
#{Sanitize.css_selector k} {
|
753
803
|
#{to_clean_text :styles, styles}
|
@@ -866,6 +916,8 @@ class WWW_App < BasicObject
|
|
866
916
|
to_clean_text(:html, @tag_arr[tag_index])
|
867
917
|
}.join(NEW_LINE).strip
|
868
918
|
|
919
|
+
return unless h[:render?]
|
920
|
+
|
869
921
|
if html.empty? && h[:text]
|
870
922
|
html = h[:text].is_a?(::Symbol) ?
|
871
923
|
h[:text].to_mustache(:html) :
|
data/specs/sample.rb
CHANGED
@@ -1,4 +1,17 @@
|
|
1
1
|
|
2
|
+
NAME: user
|
3
|
+
|
4
|
+
/define
|
5
|
+
name: username
|
6
|
+
is: one_line_text
|
7
|
+
length between: 3, 10
|
8
|
+
only chars: a-z A-Z 0-9 _ - *
|
9
|
+
unique: enforce
|
10
|
+
|
11
|
+
/after_create
|
12
|
+
|
13
|
+
-----------------------------
|
14
|
+
|
2
15
|
background {
|
3
16
|
url "/imgs/squares.png"
|
4
17
|
}
|
@@ -41,4 +54,31 @@ div.^(:col).^(:creations) {
|
|
41
54
|
|
42
55
|
} # div.col.creations
|
43
56
|
|
57
|
+
----------------------------
|
58
|
+
|
59
|
+
|
60
|
+
title "Hello, World!"
|
61
|
+
|
62
|
+
form {
|
63
|
+
button "send"
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
col.c_1! {
|
68
|
+
box {
|
69
|
+
p.first!.hello { "Hiya" }
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
col.c_2! {
|
74
|
+
box {
|
75
|
+
p.second!.hello.again {
|
76
|
+
border "1px solid #fff"
|
77
|
+
"Hiya, again."
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
|
44
84
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
describe "css pseudo" do
|
3
|
+
|
4
|
+
%w[link visited hover].each { |name|
|
5
|
+
it "adds :#{name} pseudo-class" do
|
6
|
+
target :style, <<-EOF
|
7
|
+
a:#{name} {
|
8
|
+
color: #fff;
|
9
|
+
}
|
10
|
+
EOF
|
11
|
+
|
12
|
+
actual do
|
13
|
+
style {
|
14
|
+
a {
|
15
|
+
send("_#{name}".to_sym) { color '#fff' }
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end # === it
|
20
|
+
}
|
21
|
+
|
22
|
+
it "does not add anything to :body" do
|
23
|
+
target :body, <<-EOF
|
24
|
+
<p>empty</p>
|
25
|
+
EOF
|
26
|
+
|
27
|
+
actual do
|
28
|
+
style {
|
29
|
+
a { _link { color '#fff' } }
|
30
|
+
}
|
31
|
+
p {
|
32
|
+
'empty'
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end # === it does not add anything
|
36
|
+
|
37
|
+
it "adds tag to :body when used outside of :style" do
|
38
|
+
target :body, <<-EOF
|
39
|
+
<a id="main" href="/test">test</a>
|
40
|
+
EOF
|
41
|
+
actual do
|
42
|
+
a.*(:main).href("/test") {
|
43
|
+
_link { color '#fff' }
|
44
|
+
"test"
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end # === it adds tag to :body when used outside of :style
|
48
|
+
|
49
|
+
it "uses :id in :style tag if specified" do
|
50
|
+
target :style, <<-EOF
|
51
|
+
#main:link {
|
52
|
+
color: #ffc;
|
53
|
+
}
|
54
|
+
EOF
|
55
|
+
actual do
|
56
|
+
a.*(:main).href("/test") {
|
57
|
+
_link { color '#ffc' }
|
58
|
+
"test"
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end # === it uses :id in :style tag if specified
|
62
|
+
|
63
|
+
end # === describe "css pseudo"
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
describe :font_family do
|
3
|
+
|
4
|
+
it "allows commas: Tommy, Harry, Sally" do
|
5
|
+
target :style, %^
|
6
|
+
body {
|
7
|
+
font-family: Ubuntu, Segoe UI, Helvetica, sans-serif;
|
8
|
+
}
|
9
|
+
^
|
10
|
+
actual {
|
11
|
+
font_family "Ubuntu, Segoe UI, Helvetica, sans-serif"
|
12
|
+
}
|
13
|
+
end # === it allows commas: Tommy, Harry, Sally
|
14
|
+
|
15
|
+
end # === describe :font_family
|
File without changes
|
data/www_app.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.required_ruby_version = '>= 2.2.0'
|
25
25
|
|
26
26
|
spec.add_runtime_dependency "yajl-ruby" , ">= 1.2"
|
27
|
-
spec.add_runtime_dependency "escape_escape_escape" , ">=
|
27
|
+
spec.add_runtime_dependency "escape_escape_escape" , ">= 1.4.2"
|
28
28
|
spec.add_runtime_dependency "mustache" , ">= 0.99"
|
29
29
|
|
30
30
|
spec.add_development_dependency "multi_json" , ">= 1.10.1"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: www_app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- da99
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yajl-ruby
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.4.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.4.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mustache
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -219,30 +219,30 @@ files:
|
|
219
219
|
- lib/www_app/Clean.rb
|
220
220
|
- lib/www_app/dsl.rb
|
221
221
|
- lib/www_app/source.rb
|
222
|
-
- specs/as_ruby/0000-new.rb
|
223
|
-
- specs/as_ruby/0010-attrs.rb
|
224
|
-
- specs/as_ruby/0011-class.rb
|
225
|
-
- specs/as_ruby/0011-href.rb
|
226
|
-
- specs/as_ruby/0011-id.rb
|
227
|
-
- specs/as_ruby/0020-tag.rb
|
228
|
-
- specs/as_ruby/0020-tag_content.rb
|
229
|
-
- specs/as_ruby/0021-body.rb
|
230
|
-
- specs/as_ruby/0021-form.rb
|
231
|
-
- specs/as_ruby/0021-link.rb
|
232
|
-
- specs/as_ruby/0021-script.rb
|
233
|
-
- specs/as_ruby/0030-mustache.rb
|
234
|
-
- specs/as_ruby/0040-css.rb
|
235
|
-
- specs/as_ruby/0050-on.rb
|
236
222
|
- specs/client-side/index.html
|
237
223
|
- specs/client-side/index.js
|
238
224
|
- specs/lib/config.ru
|
239
225
|
- specs/lib/helpers.rb
|
240
226
|
- specs/lib/qunit/qunit-1.15.0.css
|
241
227
|
- specs/lib/qunit/qunit-1.15.0.js
|
242
|
-
- specs/lib/sample.rb
|
243
|
-
- specs/sampe.2.rb
|
244
|
-
- specs/sample.3.rb
|
245
228
|
- specs/sample.rb
|
229
|
+
- specs/server-side/0000-new.rb
|
230
|
+
- specs/server-side/0010-attrs.rb
|
231
|
+
- specs/server-side/0011-class.rb
|
232
|
+
- specs/server-side/0011-href.rb
|
233
|
+
- specs/server-side/0011-id.rb
|
234
|
+
- specs/server-side/0020-tag.rb
|
235
|
+
- specs/server-side/0020-tag_content.rb
|
236
|
+
- specs/server-side/0021-body.rb
|
237
|
+
- specs/server-side/0021-form.rb
|
238
|
+
- specs/server-side/0021-link.rb
|
239
|
+
- specs/server-side/0021-page_title.rb
|
240
|
+
- specs/server-side/0021-script.rb
|
241
|
+
- specs/server-side/0030-mustache.rb
|
242
|
+
- specs/server-side/0030-style.rb
|
243
|
+
- specs/server-side/0040-css.rb
|
244
|
+
- specs/server-side/0041-font_family.rb
|
245
|
+
- specs/server-side/0050-on.rb
|
246
246
|
- www_app.gemspec
|
247
247
|
homepage: https://github.com/da99/www_app
|
248
248
|
licenses:
|
data/specs/lib/sample.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
|
2
|
-
title "Hello, World!"
|
3
|
-
|
4
|
-
form {
|
5
|
-
button "send"
|
6
|
-
}
|
7
|
-
|
8
|
-
|
9
|
-
col.c_1! {
|
10
|
-
box {
|
11
|
-
p.first!.hello { "Hiya" }
|
12
|
-
}
|
13
|
-
}
|
14
|
-
|
15
|
-
col.c_2! {
|
16
|
-
box {
|
17
|
-
p.second!.hello.again {
|
18
|
-
border "1px solid #fff"
|
19
|
-
"Hiya, again."
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
data/specs/sampe.2.rb
DELETED