wunderbar 0.10.5 → 0.10.6

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.
data/README.md CHANGED
@@ -282,6 +282,7 @@ HTML methods
282
282
  * `_svg`: insert svg namespace
283
283
  * `_math`: insert math namespace
284
284
  * `_coffeescript`: convert [coffeescript](http://coffeescript.org/) to JS and insert script tag
285
+ * `_import!`: insert markup with indentation matching the current output
285
286
  * `xhtml?`: output as XHTML?
286
287
 
287
288
  Note that adding an exclamation mark to the end of the tag name disables this
@@ -291,7 +292,7 @@ Builder extensions
291
292
  ---
292
293
  * `indented_text!`: matches text indentation to markup
293
294
  * `indented_data!`: useful for script and styles in HTML syntax
294
- * `disable_indendation!`: temporarily disable insertion of whitespace
295
+ * `disable_indentation!`: temporarily disable insertion of whitespace
295
296
  * `margin!`: insert blank lines between tags
296
297
 
297
298
  Logging:
@@ -37,7 +37,7 @@ module Wunderbar
37
37
  self << post if post
38
38
  end
39
39
 
40
- def disable_indendation!(&block)
40
+ def disable_indentation!(&block)
41
41
  indent, level, pending_newline, pending_margin =
42
42
  indentation_state! [0, 0, @pending_newline, @pending_margin]
43
43
  text! " "*indent*level
@@ -5,6 +5,13 @@ class HtmlMarkup < Wunderbar::BuilderBase
5
5
  link meta param source track wbr
6
6
  )
7
7
 
8
+ HTML5_BLOCK = %w(
9
+ # https://developer.mozilla.org/en/HTML/Block-level_elements
10
+ address article aside audio blockquote br canvas dd div dl fieldset
11
+ figcaption figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr
12
+ noscript ol output p pre section table tfoot ul video
13
+ )
14
+
8
15
  def initialize(scope)
9
16
  @_scope = scope
10
17
  @x = Wunderbar::XmlMarkup.new :scope => scope, :indent => 2, :target => []
@@ -99,7 +106,7 @@ class HtmlMarkup < Wunderbar::BuilderBase
99
106
  end
100
107
 
101
108
  if flag == '!'
102
- @x.disable_indendation! do
109
+ @x.disable_indentation! do
103
110
  @x.tag! name, *args, &block
104
111
  end
105
112
  elsif flag == '?'
@@ -193,4 +200,58 @@ class HtmlMarkup < Wunderbar::BuilderBase
193
200
  def clear!
194
201
  @x.target!.clear
195
202
  end
203
+
204
+ def self.flatten?(children)
205
+ # do any of the text nodes need special processing to preserve spacing?
206
+ flatten = false
207
+ space = true
208
+ if children.any? {|child| child.text? and !child.text.strip.empty?}
209
+ children.each do |child|
210
+ if child.text? or child.element?
211
+ unless child.text == ''
212
+ flatten = true if not space and not child.text =~ /\A\s/
213
+ space = (child.text =~ /\s\Z/)
214
+ end
215
+ space = true if child.element? and HTML5_BLOCK.include? child.name
216
+ end
217
+ end
218
+ end
219
+ flatten
220
+ end
221
+
222
+ def _import!(children)
223
+ if String === children
224
+ require 'nokogiri'
225
+ children = Nokogiri::HTML::fragment(children.to_s).children
226
+ end
227
+
228
+ # remove leading and trailing space
229
+ children.shift if children.first.text.strip.empty?
230
+ children.pop if children.last.text.strip.empty?
231
+
232
+ children.each do |child|
233
+ if child.text?
234
+ text = child.text
235
+ if text.strip.empty?
236
+ @x.text! "\n" if text.count("\n")>1
237
+ elsif @x.indentation_state!.first == 0
238
+ @x.indented_text! text.gsub(/\s+/, ' ')
239
+ else
240
+ @x.indented_text! text.strip
241
+ end
242
+ else
243
+ if self.class.flatten? child.children
244
+ @x.disable_indentation! do
245
+ @x.tag!(child.name, child.attributes) {_import! child.children}
246
+ end
247
+ elsif child.children.empty?
248
+ @x.tag!(child.name, child.attributes)
249
+ elsif child.children.all? {|gchild| gchild.text?}
250
+ @x.tag!(child.name, child.text.strip, child.attributes)
251
+ else
252
+ @x.tag!(child.name, child.attributes) {_import! child.children}
253
+ end
254
+ end
255
+ end
256
+ end
196
257
  end
@@ -2,7 +2,7 @@ module Wunderbar
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 10
5
- TINY = 5
5
+ TINY = 6
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/wunderbar.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "wunderbar"
5
- s.version = "0.10.5"
5
+ s.version = "0.10.6"
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 = "2012-04-15"
9
+ s.date = "2012-04-16"
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
12
  s.files = ["wunderbar.gemspec", "README.md", "COPYING", "lib/wunderbar.rb", "lib/wunderbar", "lib/wunderbar/installation.rb", "lib/wunderbar/html-methods.rb", "lib/wunderbar/job-control.rb", "lib/wunderbar/server.rb", "lib/wunderbar/logger.rb", "lib/wunderbar/rack.rb", "lib/wunderbar/builder.rb", "lib/wunderbar/sinatra.rb", "lib/wunderbar/environment.rb", "lib/wunderbar/cgi-methods.rb", "lib/wunderbar/cssproxy.rb", "lib/wunderbar/version.rb"]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wunderbar
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 59
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 10
9
- - 5
10
- version: 0.10.5
9
+ - 6
10
+ version: 0.10.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sam Ruby
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-15 00:00:00 Z
18
+ date: 2012-04-16 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: builder