wunderbar 0.20.2 → 0.21.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2YzNjNkYzA1OGY4Zjk5ODk1NjhmNzI0NTRhMTExNjdhYzUzYjQ3YQ==
4
+ OTFhYjVkZGYwMGZmMWJkMDE3OWVhNTYzOTg0YWMwMjc0OWE0MTMzZQ==
5
5
  data.tar.gz: !binary |-
6
- YTdjYTE3ZWM4ZTY0ZTEzOWViMTk2NjhjOGViYzFlYmZhZTVhMWFmNQ==
6
+ YmJkOTM5YTQ3Yjc2MDQ5YjhmYTVjNjRhODAxOWUwYzdjZjFmNmU0MQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MmNhMjk3ZjA5YzkxZDhmODU1ZjE3ZTc0NzQ0MmUyODdmZjU2NDU5NjRmYjU2
10
- YzQ5NWNkOGEyMTljNWJkNjI3ODY3MWVhMGU0MDQ2ZjU2YTQzYjdjOWMzY2Zl
11
- NmQ5MDZlNGQxYWU2YzNjMTEyYjVmYWM4ZWNjMGFjOTZkMGUxNTE=
9
+ OTZmZWMyZWRmMTc1NTc0ZTM4NDFlNjMzNzQ4YTRiNWUxMDVjNzQxZmJiMmU0
10
+ N2ZjZGQ3MWJiN2YyMjRmMGJiOGYzYTYxNTQyMTRjMGJiOTE0MGIzMjFhMmMz
11
+ ZTU4YTI4NmQxZGU3YjY0ODI0Nzk2OTRkMWM2OWMyZWRlYTM2NzA=
12
12
  data.tar.gz: !binary |-
13
- MzgxMTk0ODFlYTliNmMxY2E1N2YwMWM0ODhmY2Y4YzE2NTc1M2QyM2U1OGU2
14
- MGI1YzIzOWIwYTQ4Yjg4MTFkNGM1Yjg0Mzk1MDdkODNmMWEzMDk3MTdiYjc2
15
- NTlmYzM0YTlmZThlZTgzYjAwODkxYWQ0ODMxNjVjOWE0Y2VjNWM=
13
+ ZDg2NDI0ZDYxNDdlOWY5M2JjY2Q3MTJhYzYzMzg2YTlmODhmN2Y4NTVmM2Jl
14
+ ZmQzYWNmYmE2ODNlNWM1MmYyZTkyOGMzYTAzMzhjOWQ1NTA4ZTlmOTVmZDYy
15
+ MDNiOTFhNWFiOWEzNGNmYmQyZmFmNDM3MTcwMWZjNWFjODdmMTg=
data/README.md CHANGED
@@ -422,10 +422,26 @@ Additionally, the following options are supported:
422
422
  Optional dependencies:
423
423
  ---
424
424
 
425
+ The following gems are needed based on what functions you use:
426
+
427
+ * `em-websocket' is required by `wunderbar/websocket`
428
+ * `kramdown' is required by `wunderbar/markdown`
429
+ * `ruby2js' adds support for scripts written as blocks
430
+ * `sourcify' is required by `wunderbar/opal`
431
+
432
+ The following gems are required by extensions of the same name:
433
+
434
+ * `coderay` - syntax highlighting
435
+ * `opal` - ruby to javascript compiler
436
+ * `rack` - webserver interface
437
+ * `rails` - web application framework
438
+ * `sinatra` - DSL for creating web applications
439
+
425
440
  The following gems, if installed, will produce cleaner and prettier output:
426
441
 
427
442
  * `nokogiri` cleans up HTML fragments inserted via `<<`
428
443
  * `escape` prettier quoting of `system` commands
444
+ * `sanitize` will remove unsafe markup from tainted input
429
445
 
430
446
  Related efforts:
431
447
  ---
@@ -43,18 +43,22 @@ module Wunderbar
43
43
 
44
44
  if empty and not block
45
45
  proxy = @builder.proxiable_tag! @node.name, *args
46
- if SpacedNode === @node
47
- class << proxy.node?; include SpacedNode; end
48
- elsif CompactNode === @node
49
- class << proxy.node?; include CompactNode; end
50
- end
46
+ class << proxy.node?; include SpacedNode; end if SpacedNode === @node
47
+ class << proxy.node?; include CompactNode; end if CompactNode === @node
51
48
  proxy
52
- elsif SpacedNode === @node
53
- @builder.__send__ "_#{@node.name.to_s.gsub('-', '_')}_", *args, &block
54
- elsif CompactNode === @node and @node.name != :pre
55
- @builder.__send__ "_#{@node.name.to_s.gsub('-', '_')}!", *args, &block
56
49
  else
57
- @builder.__send__ "_#{@node.name.to_s.gsub('-', '_')}", *args, &block
50
+ name = @node.name.to_s.gsub('-', '_')
51
+ if CompactNode === @node and @node.name != :pre
52
+ if SpacedNode === @node
53
+ @builder.__send__ "_#{name}_!", *args, &block
54
+ else
55
+ @builder.__send__ "_#{name}!", *args, &block
56
+ end
57
+ elsif SpacedNode === @node
58
+ @builder.__send__ "_#{name}_", *args, &block
59
+ else
60
+ @builder.__send__ "_#{name}", *args, &block
61
+ end
58
62
  end
59
63
  end
60
64
  end
@@ -105,12 +105,16 @@ module Wunderbar
105
105
  end
106
106
  end
107
107
 
108
- if not head.children.any? {|child| child.name == 'title'}
109
- h1 = body.children.find {|child| child.name == 'h1'}
108
+ def find_name(name)
109
+ proc {|child| child.respond_to? :name and child.name == name}
110
+ end
111
+
112
+ if not head.children.any? &find_name('title')
113
+ h1 = body.children.find &find_name('h1')
110
114
  head.add_child Node.new('title', h1.text) if h1 and h1.text
111
115
  end
112
116
 
113
- base = head.children.index {|child| child.name == 'base'}
117
+ base = head.children.index &find_name('base')
114
118
  if base
115
119
  head.children.insert 1, head.children.delete_at(base) if base > 1
116
120
  base_href = head.children[1].attrs[:href]
@@ -144,7 +148,9 @@ module Wunderbar
144
148
 
145
149
  if name.sub!(/_$/,'')
146
150
  @_x.spaced!
147
- return __send__ "_#{name}", *args, &block if respond_to? "_#{name}"
151
+ if flag != '!' and respond_to? "_#{name}"
152
+ return __send__ "_#{name}#{flag}", *args, &block
153
+ end
148
154
  end
149
155
 
150
156
  name = name.to_s.gsub('_', '-')
@@ -0,0 +1,141 @@
1
+ require 'wunderbar/jquery'
2
+ require 'ruby2js/filter/jquery'
3
+ #
4
+
5
+ module Wunderbar
6
+ module Filter
7
+ module JQuery
8
+ include Ruby2JS::Filter::SEXP
9
+
10
+ def on_send(node)
11
+ if node.children[0] == nil and node.children[1] =~ /^_\w/
12
+ # map method calls starting with an underscore to jquery calls
13
+ # to create an element.
14
+ #
15
+ # input:
16
+ # _a 'name', href: 'link'
17
+ # output:
18
+ # $('<a></a>').text('name').attr(href: 'link')
19
+ #
20
+ tag = node.children[1].to_s[1..-1]
21
+ if Node::VOID.include? tag
22
+ element = s(:send, s(:str, "<#{tag}/>"), :~)
23
+ else
24
+ element = s(:send, s(:str, "<#{tag}></#{tag}>"), :~)
25
+ end
26
+ node.children[2..-1].each do |child|
27
+ if child.type == :hash
28
+ # convert _ to - in attribute names
29
+ pairs = child.children.map do |pair|
30
+ key, value = pair.children
31
+ if key.type == :sym
32
+ s(:pair, s(:str, key.children[0].to_s.gsub('_', '-')), value)
33
+ else
34
+ pair
35
+ end
36
+ end
37
+
38
+ element = s(:send, element, :attr, s(:hash, *pairs))
39
+
40
+ elsif child.type == :addClass
41
+ # :addClass arguments are inserted by "css proxy" logic below
42
+ element = s(:send, element, :addClass, s(:sym, *child.children))
43
+
44
+ elsif child.type == :block
45
+ # :block arguments are inserted by on_block logic below
46
+ element = s(:block, s(:send, element, :each!),
47
+ *node.children.last.children[1..-1])
48
+
49
+ else
50
+ # everything else added as text
51
+ element = s(:send, element, :text, child)
52
+
53
+ end
54
+ end
55
+
56
+ begin
57
+ jqchild, @_jqchild = @_jqchild, true
58
+
59
+ # have nested elements append themselves to their parent
60
+ if jqchild
61
+ element = s(:send, element, :appendTo,
62
+ s(:send, s(:lvar, :_parent), :~))
63
+ end
64
+
65
+ process element
66
+ ensure
67
+ @_jqchild = jqchild
68
+ end
69
+
70
+ elsif node.children[0] and node.children[0].type == :send
71
+ # determine if markaby style class and id names are being used
72
+ child = node
73
+ test = child.children.first
74
+ while test and test.type == :send and not test.is_method?
75
+ child, test = test, test.children.first
76
+ end
77
+
78
+ if child.children[0] == nil and child.children[1] =~ /^_\w/
79
+ # capture the arguments provided on the current node
80
+ children = node.children[2..-1]
81
+
82
+ # convert method calls to id and class values
83
+ prefix = []
84
+ while node != child
85
+ if node.children[1] !~ /!$/
86
+ # add class (mapping underscores to dashes)
87
+ prefix.unshift s(:addClass, node.children[1].to_s.gsub('_','-'))
88
+ else
89
+ # convert method name to hash {id: name} pair
90
+ pair = s(:pair, s(:sym, :id),
91
+ s(:str, node.children[1].to_s[0..-2].gsub('_','-')))
92
+
93
+ # if a hash argument is already passed, merge in id value
94
+ hash = children.find_index {|node| node.type == :hash}
95
+ if hash
96
+ children[hash] = s(:hash, pair, *children[hash].children)
97
+ else
98
+ prefix.unshift s(:hash, pair)
99
+ end
100
+ end
101
+
102
+ # advance to next node
103
+ node = node.children.first
104
+ end
105
+
106
+ # collapse series of method calls into a single call
107
+ return process(s(:send, *node.children[0..1], *prefix, *children))
108
+ else
109
+ super
110
+ end
111
+
112
+ else
113
+ super
114
+ end
115
+ end
116
+
117
+ def on_block(node)
118
+ return super unless node.children[1].children.empty?
119
+
120
+ # traverse through potential "css proxy" style method calls
121
+ child = node.children.first
122
+ test = child.children.first
123
+ while test and test.type == :send and not test.is_method?
124
+ child, test = test, test.children.first
125
+ end
126
+
127
+ # append block as a standalone proc to wunderbar style method call
128
+ if child.children[0] == nil and child.children[1] =~ /^_\w/
129
+ block = s(:block, s(:send, nil, :proc),
130
+ s(:args, s(:arg, :_index), s(:arg, :_parent)),
131
+ *node.children[2..-1])
132
+ return on_send s(:send, *node.children.first.children, block)
133
+ end
134
+
135
+ super
136
+ end
137
+ end
138
+
139
+ Ruby2JS::Filter::DEFAULTS.push JQuery
140
+ end
141
+ end
@@ -76,7 +76,7 @@ module Wunderbar
76
76
  else
77
77
  width = options[:width] if name != :pre
78
78
  line += ">#{text.to_s.gsub(/[&<>]/,ESCAPE)}</#{name}>"
79
- if width and line.length > width
79
+ if indent and width and line.length > width
80
80
  reflowed = IndentedTextNode.reflow(indent, line, width)
81
81
  line = reflowed.pop
82
82
  result.push *reflowed
@@ -87,24 +87,35 @@ module Wunderbar
87
87
  else
88
88
  line += "></#{name}>"
89
89
  end
90
- elsif CompactNode === self
90
+ elsif CompactNode === self and not CompactNode === parent
91
91
  work = []
92
92
  walk(work, nil, options)
93
93
  width = options[:width]
94
94
  if width
95
95
  line += ">"
96
- (work+["</#{name}>"]).each do |node|
97
- if line.length + node.length > width
98
- result << line.rstrip
99
- line = indent.to_s
100
- if line.length + node.length > width and !node.include? '<'
101
- reflowed = IndentedTextNode.reflow(indent.to_s,
102
- "#{indent}#{node}", width)
103
- node = reflowed.pop.sub(/^#{indent}/, '')
104
- result.push *reflowed
96
+ work = work.join + "</#{name}>"
97
+ if line.length + work.length <= width
98
+ line += work
99
+ else
100
+ # split work into tokens with balanced <>
101
+ tokens = work.split(' ')
102
+ (tokens.length-1).downto(1) do |i|
103
+ if tokens[i].count('<') != tokens[i].count('>')
104
+ tokens[i-1,2] = tokens[i-1] + ' ' + tokens[i]
105
+ end
106
+ end
107
+
108
+ line += tokens.shift
109
+
110
+ # add tokens to line, breaking when line length would exceed width
111
+ tokens.each do |token|
112
+ if line.length + token.length < width
113
+ line += ' ' + token
114
+ else
115
+ result << line
116
+ line = indent.to_s + token
105
117
  end
106
118
  end
107
- line += node
108
119
  end
109
120
  else
110
121
  line += ">#{work.join}</#{name}>"
@@ -1,8 +1,8 @@
1
1
  module Wunderbar
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 20
5
- TINY = 2
4
+ MINOR = 21
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/wunderbar.gemspec CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "wunderbar"
5
- s.version = "0.20.2"
5
+ s.version = "0.21.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sam Ruby"]
9
- s.date = "2014-01-23"
9
+ s.date = "2014-01-26"
10
10
  s.description = " Wunderbar makes it easy to produce valid HTML5, wellformed XHTML, Unicode\n (utf-8), consistently indented, readable applications. This includes\n output that conforms to the Polyglot specification and the emerging\n results from the XML Error Recovery Community Group.\n"
11
11
  s.email = "rubys@intertwingly.net"
12
- s.files = ["wunderbar.gemspec", "README.md", "COPYING", "lib/wunderbar.rb", "lib/wunderbar", "lib/wunderbar/logger.rb", "lib/wunderbar/coderay.rb", "lib/wunderbar/rails.rb", "lib/wunderbar/builder.rb", "lib/wunderbar/coffeescript.rb", "lib/wunderbar/vendor", "lib/wunderbar/vendor/polymer-v0.0.20131003.min.js", "lib/wunderbar/vendor/bootstrap.min.js", "lib/wunderbar/vendor/angular-resource.min.js", "lib/wunderbar/vendor/jquery-1.10.2.min.js", "lib/wunderbar/vendor/Markdown.Converter.js", "lib/wunderbar/vendor/bootstrap-theme.min.css", "lib/wunderbar/vendor/angular-route.min.js", "lib/wunderbar/vendor/angular.min.js", "lib/wunderbar/vendor/underscore-min.js", "lib/wunderbar/vendor/stupidtable.min.js", "lib/wunderbar/vendor/bootstrap.min.css", "lib/wunderbar/markdown.rb", "lib/wunderbar/environment.rb", "lib/wunderbar/pagedown.rb", "lib/wunderbar/underscore.rb", "lib/wunderbar/server.rb", "lib/wunderbar/polymer.rb", "lib/wunderbar/version.rb", "lib/wunderbar/node.rb", "lib/wunderbar/asset.rb", "lib/wunderbar/script.rb", "lib/wunderbar/websocket.rb", "lib/wunderbar/bootstrap.rb", "lib/wunderbar/jquery", "lib/wunderbar/jquery/stupidtable.rb", "lib/wunderbar/angularjs", "lib/wunderbar/angularjs/route.rb", "lib/wunderbar/angularjs/resource.rb", "lib/wunderbar/opal", "lib/wunderbar/opal/browser.rb", "lib/wunderbar/opal/jquery.rb", "lib/wunderbar/html-methods.rb", "lib/wunderbar/job-control.rb", "lib/wunderbar/cssproxy.rb", "lib/wunderbar/angularjs.rb", "lib/wunderbar/jquery.rb", "lib/wunderbar/bootstrap", "lib/wunderbar/bootstrap/theme.rb", "lib/wunderbar/cgi-methods.rb", "lib/wunderbar/sinatra.rb", "lib/wunderbar/rack.rb", "lib/wunderbar/opal.rb", "lib/wunderbar/installation.rb"]
12
+ s.files = ["wunderbar.gemspec", "README.md", "COPYING", "lib/wunderbar.rb", "lib/wunderbar", "lib/wunderbar/logger.rb", "lib/wunderbar/coderay.rb", "lib/wunderbar/rails.rb", "lib/wunderbar/builder.rb", "lib/wunderbar/coffeescript.rb", "lib/wunderbar/vendor", "lib/wunderbar/vendor/polymer-v0.0.20131003.min.js", "lib/wunderbar/vendor/bootstrap.min.js", "lib/wunderbar/vendor/angular-resource.min.js", "lib/wunderbar/vendor/jquery-1.10.2.min.js", "lib/wunderbar/vendor/Markdown.Converter.js", "lib/wunderbar/vendor/bootstrap-theme.min.css", "lib/wunderbar/vendor/angular-route.min.js", "lib/wunderbar/vendor/angular.min.js", "lib/wunderbar/vendor/underscore-min.js", "lib/wunderbar/vendor/stupidtable.min.js", "lib/wunderbar/vendor/bootstrap.min.css", "lib/wunderbar/markdown.rb", "lib/wunderbar/environment.rb", "lib/wunderbar/pagedown.rb", "lib/wunderbar/underscore.rb", "lib/wunderbar/server.rb", "lib/wunderbar/polymer.rb", "lib/wunderbar/version.rb", "lib/wunderbar/node.rb", "lib/wunderbar/asset.rb", "lib/wunderbar/script.rb", "lib/wunderbar/websocket.rb", "lib/wunderbar/bootstrap.rb", "lib/wunderbar/jquery", "lib/wunderbar/jquery/filter.rb", "lib/wunderbar/jquery/stupidtable.rb", "lib/wunderbar/angularjs", "lib/wunderbar/angularjs/route.rb", "lib/wunderbar/angularjs/resource.rb", "lib/wunderbar/opal", "lib/wunderbar/opal/browser.rb", "lib/wunderbar/opal/jquery.rb", "lib/wunderbar/html-methods.rb", "lib/wunderbar/job-control.rb", "lib/wunderbar/cssproxy.rb", "lib/wunderbar/angularjs.rb", "lib/wunderbar/jquery.rb", "lib/wunderbar/bootstrap", "lib/wunderbar/bootstrap/theme.rb", "lib/wunderbar/cgi-methods.rb", "lib/wunderbar/sinatra.rb", "lib/wunderbar/rack.rb", "lib/wunderbar/opal.rb", "lib/wunderbar/installation.rb"]
13
13
  s.homepage = "http://github.com/rubys/wunderbar"
14
14
  s.licenses = ["MIT"]
15
15
  s.require_paths = ["lib"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wunderbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.2
4
+ version: 0.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-23 00:00:00.000000000 Z
11
+ date: 2014-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -65,6 +65,7 @@ files:
65
65
  - lib/wunderbar/script.rb
66
66
  - lib/wunderbar/websocket.rb
67
67
  - lib/wunderbar/bootstrap.rb
68
+ - lib/wunderbar/jquery/filter.rb
68
69
  - lib/wunderbar/jquery/stupidtable.rb
69
70
  - lib/wunderbar/angularjs/route.rb
70
71
  - lib/wunderbar/angularjs/resource.rb