hum 0.0.1

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.
Files changed (89) hide show
  1. data/.gitignore +10 -0
  2. data/CHANGELOG.md +3 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +7 -0
  5. data/README.md +35 -0
  6. data/Rakefile +1 -0
  7. data/bin/hum +5 -0
  8. data/hum.gemspec +24 -0
  9. data/lib/hum.rb +7 -0
  10. data/lib/hum/array.rb +61 -0
  11. data/lib/hum/engine.rb +401 -0
  12. data/lib/hum/exec.rb +111 -0
  13. data/lib/hum/string.rb +8 -0
  14. data/lib/hum/version.rb +3 -0
  15. data/test/hum/templates/comma/comma.array +1 -0
  16. data/test/hum/templates/comma/comma.css +6 -0
  17. data/test/hum/templates/comma/comma.haml +6 -0
  18. data/test/hum/templates/comma/comma.haml_tags +1 -0
  19. data/test/hum/templates/comma/comma.html +0 -0
  20. data/test/hum/templates/comma/comma.sass +2 -0
  21. data/test/hum/templates/comma/comma_clean.sass +1 -0
  22. data/test/hum/templates/comma/comma_end.html +9 -0
  23. data/test/hum/templates/complex_parent/complex_parent.array +1 -0
  24. data/test/hum/templates/complex_parent/complex_parent.css +18 -0
  25. data/test/hum/templates/complex_parent/complex_parent.haml +12 -0
  26. data/test/hum/templates/complex_parent/complex_parent.haml_tags +1 -0
  27. data/test/hum/templates/complex_parent/complex_parent.html +0 -0
  28. data/test/hum/templates/complex_parent/complex_parent.sass +12 -0
  29. data/test/hum/templates/complex_parent/complex_parent_clean.sass +6 -0
  30. data/test/hum/templates/complex_parent/complex_parent_end.html +18 -0
  31. data/test/hum/templates/deep_nest/deep_nest.array +1 -0
  32. data/test/hum/templates/deep_nest/deep_nest.css +15 -0
  33. data/test/hum/templates/deep_nest/deep_nest.haml +19 -0
  34. data/test/hum/templates/deep_nest/deep_nest.haml_tags +1 -0
  35. data/test/hum/templates/deep_nest/deep_nest.html +0 -0
  36. data/test/hum/templates/deep_nest/deep_nest.sass +10 -0
  37. data/test/hum/templates/deep_nest/deep_nest_clean.sass +5 -0
  38. data/test/hum/templates/deep_nest/deep_nest_end.html +27 -0
  39. data/test/hum/templates/deep_nest/deep_nest_start.scss +15 -0
  40. data/test/hum/templates/line_nest/line_nest.array +1 -0
  41. data/test/hum/templates/line_nest/line_nest.css +6 -0
  42. data/test/hum/templates/line_nest/line_nest.haml +9 -0
  43. data/test/hum/templates/line_nest/line_nest.haml_tags +1 -0
  44. data/test/hum/templates/line_nest/line_nest.html +0 -0
  45. data/test/hum/templates/line_nest/line_nest.sass +5 -0
  46. data/test/hum/templates/line_nest/line_nest_clean.sass +2 -0
  47. data/test/hum/templates/line_nest/line_nest_end.html +15 -0
  48. data/test/hum/templates/nest/nest.array +1 -0
  49. data/test/hum/templates/nest/nest.css +9 -0
  50. data/test/hum/templates/nest/nest.haml +7 -0
  51. data/test/hum/templates/nest/nest.haml_tags +1 -0
  52. data/test/hum/templates/nest/nest.html +0 -0
  53. data/test/hum/templates/nest/nest.sass +6 -0
  54. data/test/hum/templates/nest/nest_clean.sass +3 -0
  55. data/test/hum/templates/nest/nest_end.html +12 -0
  56. data/test/hum/templates/parent_nest/parent_nest.array +1 -0
  57. data/test/hum/templates/parent_nest/parent_nest.css +12 -0
  58. data/test/hum/templates/parent_nest/parent_nest.haml +8 -0
  59. data/test/hum/templates/parent_nest/parent_nest.haml_tags +1 -0
  60. data/test/hum/templates/parent_nest/parent_nest.html +0 -0
  61. data/test/hum/templates/parent_nest/parent_nest.sass +8 -0
  62. data/test/hum/templates/parent_nest/parent_nest_clean.sass +4 -0
  63. data/test/hum/templates/parent_nest/parent_nest_end.html +12 -0
  64. data/test/hum/templates/parent_select/parent_select.array +1 -0
  65. data/test/hum/templates/parent_select/parent_select.css +4 -0
  66. data/test/hum/templates/parent_select/parent_select.haml +6 -0
  67. data/test/hum/templates/parent_select/parent_select.haml_tags +1 -0
  68. data/test/hum/templates/parent_select/parent_select.html +0 -0
  69. data/test/hum/templates/parent_select/parent_select.sass +4 -0
  70. data/test/hum/templates/parent_select/parent_select_clean.sass +2 -0
  71. data/test/hum/templates/parent_select/parent_select_end.html +9 -0
  72. data/test/hum/templates/simple/simple.array +1 -0
  73. data/test/hum/templates/simple/simple.css +9 -0
  74. data/test/hum/templates/simple/simple.haml +7 -0
  75. data/test/hum/templates/simple/simple.haml_tags +1 -0
  76. data/test/hum/templates/simple/simple.html +0 -0
  77. data/test/hum/templates/simple/simple.sass +8 -0
  78. data/test/hum/templates/simple/simple_clean.sass +3 -0
  79. data/test/hum/templates/simple/simple_end.html +10 -0
  80. data/test/hum/templates/single/single.array +1 -0
  81. data/test/hum/templates/single/single.css +3 -0
  82. data/test/hum/templates/single/single.haml +5 -0
  83. data/test/hum/templates/single/single.haml_tags +1 -0
  84. data/test/hum/templates/single/single.html +0 -0
  85. data/test/hum/templates/single/single.sass +2 -0
  86. data/test/hum/templates/single/single_clean.sass +1 -0
  87. data/test/hum/templates/single/single_end.html +8 -0
  88. data/test/run_tests.rb +119 -0
  89. metadata +241 -0
@@ -0,0 +1,111 @@
1
+ require 'optparse'
2
+ require 'fileutils'
3
+ require 'hum/engine'
4
+ require 'fssm'
5
+
6
+ module Hum
7
+
8
+ class Exec
9
+
10
+ class Generic
11
+
12
+ def initialize(args)
13
+ @args = args
14
+
15
+ #Command line options
16
+ @options = {}
17
+
18
+ #Files to output
19
+ @files = {}
20
+ end
21
+
22
+ def parse!
23
+ begin
24
+ parse
25
+ rescue Exception => e
26
+ exit 1
27
+ end
28
+ exit 0
29
+ end
30
+
31
+ def parse
32
+ @opts = OptionParser.new(&method(:set_opts))
33
+ if @args.kind_of? String
34
+ @args = [@args]
35
+ end
36
+ @opts.parse!(@args)
37
+ process_result
38
+ end
39
+
40
+ protected
41
+
42
+ def process_result
43
+ args = @args.dup
44
+ input ||=
45
+ begin
46
+ filename = args.shift
47
+ @options[:filename] = filename
48
+ end
49
+ @files[:input] = input
50
+ end
51
+
52
+ end #Generic
53
+
54
+ class Hum < Generic
55
+
56
+ def initialize(args)
57
+ super
58
+ end
59
+
60
+ protected
61
+
62
+ def set_opts(opts)
63
+ opts.on_tail("-v", "--version", "Print version") do
64
+ puts "Hum #{::Hum::VERSION}"
65
+ exit
66
+ end
67
+ opts.on_tail("--watch", "Watch for changes") do
68
+ @options[:watch] = true
69
+ end
70
+ end
71
+
72
+ def process_result
73
+ return watch if @options[:watch]
74
+ super
75
+ begin
76
+ #open css
77
+ input = @files[:input]
78
+ @machine = Engine.new
79
+ @machine.load(input)
80
+ @machine.run
81
+ rescue Exception => e
82
+ puts e
83
+ end
84
+ end
85
+
86
+ private
87
+
88
+ def watch
89
+ puts ">>> Hum is watching for changes. Press Ctrl-C to stop."
90
+ begin
91
+ current_path = Dir.pwd
92
+ monitor = FSSM::Monitor.new
93
+ monitor.path current_path, "**/*.css" do
94
+ update do |b, input|
95
+ puts ">>> Change found - #{input}..."
96
+ @machine = Engine.new
97
+ @machine.load(input)
98
+ @machine.run
99
+ end
100
+ end
101
+ monitor.run
102
+ rescue Exception => e
103
+ puts e
104
+ end
105
+ end
106
+
107
+ end #Hum < Generic
108
+
109
+ end #Exec
110
+
111
+ end #Hum
@@ -0,0 +1,8 @@
1
+ #Fixes string.each in ruby 1.9
2
+ unless "".respond_to?(:each)
3
+ String.class_eval do
4
+ def each &block
5
+ self.lines &block
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Hum
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".foo", ".bar"], :tab=>0}]
@@ -0,0 +1,6 @@
1
+ .foo{
2
+ color: red;
3
+ }
4
+ .bar{
5
+ color: red;
6
+ }
@@ -0,0 +1,6 @@
1
+ %html
2
+ %head
3
+ %link{:type => 'text/css', :rel => 'stylesheet', :href => 'comma.css'}
4
+ %body
5
+ %div.foo Inner content
6
+ %div.bar Inner content
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".foo", ".bar"], :tab=>0, :haml=>["%div.foo", "%div.bar"]}]
File without changes
@@ -0,0 +1,2 @@
1
+ .foo, .bar
2
+ color: red
@@ -0,0 +1 @@
1
+ .foo, .bar
@@ -0,0 +1,9 @@
1
+ <html>
2
+ <head>
3
+ <link href='comma.css' rel='stylesheet' type='text/css' />
4
+ </head>
5
+ <body>
6
+ <div class='foo'>Inner content</div>
7
+ <div class='bar'>Inner content</div>
8
+ </body>
9
+ </html>
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".x-msg"], :tab=>0}, {:line=>2, :select=>["p"], :tab=>1}, {:line=>3, :select=>[".x-msg.green"], :tab=>0, :parent=>1, :kids=>[4]}, {:line=>4, :select=>[".close"], :tab=>1}, {:line=>5, :select=>[".x-msg.red"], :tab=>0, :parent=>1, :kids=>[6]}, {:line=>6, :select=>[".close"], :tab=>1}]
@@ -0,0 +1,18 @@
1
+ .x-msg {
2
+ position: relative;
3
+ }
4
+ .x-msg p {
5
+ color: #444;
6
+ }
7
+ .x-msg.green {
8
+ background-position: 10px 10px;
9
+ }
10
+ .x-msg.green .close {
11
+ background-image:none;
12
+ }
13
+ .x-msg.red{
14
+ background-position: 12px 12px;
15
+ }
16
+ .x-msg.red .close {
17
+ background-image:none;
18
+ }
@@ -0,0 +1,12 @@
1
+ %html
2
+ %head
3
+ %link{:type => 'text/css', :rel => 'stylesheet', :href => 'complex_parent.css'}
4
+ %body
5
+ %div.x-msg
6
+ %p Inner content
7
+ %div.x-msg.green
8
+ %p Inner content
9
+ %div.close Inner content
10
+ %div.x-msg.red
11
+ %p Inner content
12
+ %div.close Inner content
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".x-msg"], :tab=>0, :haml=>["%div.x-msg"]}, {:line=>2, :select=>["p"], :tab=>1, :haml=>["%p"]}, {:line=>3, :select=>[".x-msg.green"], :tab=>0, :parent=>1, :kids=>[4], :haml=>["%div.x-msg.green"]}, {:line=>4, :select=>[".close"], :tab=>1, :haml=>["%div.close"]}, {:line=>5, :select=>[".x-msg.red"], :tab=>0, :parent=>1, :kids=>[6], :haml=>["%div.x-msg.red"]}, {:line=>6, :select=>[".close"], :tab=>1, :haml=>["%div.close"]}]
@@ -0,0 +1,12 @@
1
+ .x-msg
2
+ position: relative
3
+ p
4
+ color: #444
5
+ &.green
6
+ background-position: 10px 10px
7
+ .close
8
+ background-image: none
9
+ &.red
10
+ background-position: 12px 12px
11
+ .close
12
+ background-image: none
@@ -0,0 +1,6 @@
1
+ .x-msg
2
+ p
3
+ &.green
4
+ .close
5
+ &.red
6
+ .close
@@ -0,0 +1,18 @@
1
+ <html>
2
+ <head>
3
+ <link href='complex_parent.css' rel='stylesheet' type='text/css' />
4
+ </head>
5
+ <body>
6
+ <div class='x-msg'>
7
+ <p>Inner content</p>
8
+ </div>
9
+ <div class='x-msg green'>
10
+ <p>Inner content</p>
11
+ <div class='close'>Inner content</div>
12
+ </div>
13
+ <div class='x-msg red'>
14
+ <p>Inner content</p>
15
+ <div class='close'>Inner content</div>
16
+ </div>
17
+ </body>
18
+ </html>
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>["div"], :tab=>0}, {:line=>2, :select=>["p"], :tab=>1}, {:line=>3, :select=>["a"], :tab=>1}, {:line=>4, :select=>["div.red", "div.blue"], :tab=>0, :parent=>1}, {:line=>5, :select=>["div.black", "div.white"], :tab=>0, :parent=>1}]
@@ -0,0 +1,15 @@
1
+ div {
2
+ font-size: 11px;
3
+ }
4
+ div p {
5
+ font-size: 12px;
6
+ }
7
+ div a {
8
+ font-size: 14px;
9
+ }
10
+ div.red, div.blue {
11
+ border: 1px solid red;
12
+ }
13
+ div.black, div.white {
14
+ border: 1px solid orange;
15
+ }
@@ -0,0 +1,19 @@
1
+ %html
2
+ %head
3
+ %link{:type => 'text/css', :rel => 'stylesheet', :href => 'deep_nest.css'}
4
+ %body
5
+ %div
6
+ %p Inner content
7
+ %a Inner content
8
+ %div.red
9
+ %p Inner content
10
+ %a Inner content
11
+ %div.blue
12
+ %p Inner content
13
+ %a Inner content
14
+ %div.black
15
+ %p Inner content
16
+ %a Inner content
17
+ %div.white
18
+ %p Inner content
19
+ %a Inner content
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>["div"], :tab=>0, :haml=>["%div"]}, {:line=>2, :select=>["p"], :tab=>1, :haml=>["%p"]}, {:line=>3, :select=>["a"], :tab=>1, :haml=>["%a"]}, {:line=>4, :select=>["div.red", "div.blue"], :tab=>0, :parent=>1, :haml=>["%div.red", "%div.blue"]}, {:line=>5, :select=>["div.black", "div.white"], :tab=>0, :parent=>1, :haml=>["%div.black", "%div.white"]}]
@@ -0,0 +1,10 @@
1
+ div
2
+ font-size: 11px
3
+ p
4
+ font-size: 12px
5
+ a
6
+ font-size: 14px
7
+ &.red, &.blue
8
+ border: 1px solid red
9
+ &.black, &.white
10
+ border: 1px solid orange
@@ -0,0 +1,5 @@
1
+ div
2
+ p
3
+ a
4
+ &.red, &.blue
5
+ &.black, &.white
@@ -0,0 +1,27 @@
1
+ <html>
2
+ <head>
3
+ <link href='deep_nest.css' rel='stylesheet' type='text/css' />
4
+ </head>
5
+ <body>
6
+ <div>
7
+ <p>Inner content</p>
8
+ <a>Inner content</a>
9
+ </div>
10
+ <div class='red'>
11
+ <p>Inner content</p>
12
+ <a>Inner content</a>
13
+ </div>
14
+ <div class='blue'>
15
+ <p>Inner content</p>
16
+ <a>Inner content</a>
17
+ </div>
18
+ <div class='black'>
19
+ <p>Inner content</p>
20
+ <a>Inner content</a>
21
+ </div>
22
+ <div class='white'>
23
+ <p>Inner content</p>
24
+ <a>Inner content</a>
25
+ </div>
26
+ </body>
27
+ </html>
@@ -0,0 +1,15 @@
1
+ div{
2
+ font-size:11px;
3
+ p{
4
+ font-size:12px;
5
+ }
6
+ a{
7
+ font-size:14px;
8
+ }
9
+ &.red, &.blue{
10
+ border: 1px solid red;
11
+ }
12
+ &.black, &.white{
13
+ border:1px solid orange;
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".bar p"], :tab=>0}, {:line=>2, :select=>[".buz p b"], :tab=>0}]
@@ -0,0 +1,6 @@
1
+ .bar p{
2
+ font-size:12px;
3
+ }
4
+ .buz p b{
5
+ font-weight:bold;
6
+ }
@@ -0,0 +1,9 @@
1
+ %html
2
+ %head
3
+ %link{:type => 'text/css', :rel => 'stylesheet', :href => 'line_nest.css'}
4
+ %body
5
+ %div.bar
6
+ %p Inner content
7
+ %div.buz
8
+ %p
9
+ %b Inner content
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".bar p"], :tab=>0, :haml=>["%div.bar %p"]}, {:line=>2, :select=>[".buz p b"], :tab=>0, :haml=>["%div.buz %p %b"]}]
@@ -0,0 +1,5 @@
1
+ .bar p
2
+ font-size: 12px
3
+
4
+ .buz p b
5
+ font-weight: bold
@@ -0,0 +1,2 @@
1
+ .bar p
2
+ .buz p b
@@ -0,0 +1,15 @@
1
+ <html>
2
+ <head>
3
+ <link href='line_nest.css' rel='stylesheet' type='text/css' />
4
+ </head>
5
+ <body>
6
+ <div class='bar'>
7
+ <p>Inner content</p>
8
+ </div>
9
+ <div class='buz'>
10
+ <p>
11
+ <b>Inner content</b>
12
+ </p>
13
+ </div>
14
+ </body>
15
+ </html>
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".foo"], :tab=>0}, {:line=>2, :select=>[".bar"], :tab=>1}, {:line=>3, :select=>[".baz"], :tab=>2}]
@@ -0,0 +1,9 @@
1
+ .foo{
2
+ height: 100px;
3
+ }
4
+ .foo .bar{
5
+ display: inline;
6
+ }
7
+ .foo .bar .baz{
8
+ color: blue;
9
+ }
@@ -0,0 +1,7 @@
1
+ %html
2
+ %head
3
+ %link{:type => 'text/css', :rel => 'stylesheet', :href => 'nest.css'}
4
+ %body
5
+ %div.foo
6
+ %div.bar
7
+ %div.baz Inner content
@@ -0,0 +1 @@
1
+ [{:line=>1, :select=>[".foo"], :tab=>0, :haml=>["%div.foo"]}, {:line=>2, :select=>[".bar"], :tab=>1, :haml=>["%div.bar"]}, {:line=>3, :select=>[".baz"], :tab=>2, :haml=>["%div.baz"]}]
File without changes
@@ -0,0 +1,6 @@
1
+ .foo
2
+ height: 100px
3
+ .bar
4
+ display: inline
5
+ .baz
6
+ color: blue