www_app 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 314db5f05be4d54977a9370a2e673eb5c565bd68
4
- data.tar.gz: aeca39fff563301a42e6478099b711166d88ca90
3
+ metadata.gz: fbfdf7458b157b502e9cf03a522b7d3d41883a6e
4
+ data.tar.gz: dff3da5abcc509526f77e5b511306c5f113e4a9a
5
5
  SHA512:
6
- metadata.gz: d3be19391e62718cd337f6c2a1a428bd0608a89fc60eb970985e04d02432cb361d8713764f5d5dc0ca872e4a7b54de7d379b5cc85a123afee57c1644d7f0642e
7
- data.tar.gz: 3900d7a3efe2b6bdc378b68b4fb6d9d4fe65e3ebcdf697a5a17a77e9d8be8aeb4aeda4497705630e0e6249495aed878c99799650cbd424698b023960644da0af
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
- div {
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
- border '1px solid #000'
25
- background_color 'grey'
32
+ div {
26
33
 
27
- on('scary') {
28
- border '2px dotted red'
29
- background_color 'white'
30
- }
34
+ border '1px solid #000'
35
+ background_color 'grey'
31
36
 
32
- p { 'Click the button to make me scared.' }
37
+ on('scary') {
38
+ border '2px dotted red'
39
+ background_color 'white'
40
+ }
33
41
 
34
- button {
35
- parent 'div'
36
- add_class 'scary'
42
+ p { 'Click the button to make me scared.' }
37
43
 
38
- 'Scary-ify'
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.1.0
@@ -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) :
@@ -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
 
@@ -0,0 +1,11 @@
1
+
2
+ describe "page_title" do
3
+
4
+ it "creates only one :title tag" do
5
+ WWW_App.new {
6
+ page_title { 'yo' }
7
+ }.render.scan(/<title>[^>]+<\/title>/).
8
+ should == ['<title>yo</title>']
9
+ end # === it creates on :title tag
10
+
11
+ end # === describe "page_title"
@@ -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="&#47;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"
@@ -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
@@ -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" , ">= 0.2"
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.1
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-01-22 00:00:00.000000000 Z
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: '0.2'
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: '0.2'
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:
@@ -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
-
@@ -1,14 +0,0 @@
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
-
@@ -1,17 +0,0 @@
1
-
2
- I am ...
3
- I am bored.
4
- I am happy.
5
- I am Batman.
6
- I am busy.
7
-
8
- Contest:
9
- Page:
10
- Note:
11
- Random thought:
12
- New Command:
13
- Make me laugh.
14
-
15
- It is friends only.
16
-
17
-