diff --git a/spec/blueprint/html/utils_spec.cr b/spec/blueprint/html/utils_spec.cr
index 41b1300..2ad9ffe 100644
--- a/spec/blueprint/html/utils_spec.cr
+++ b/spec/blueprint/html/utils_spec.cr
@@ -10,6 +10,8 @@ private class DummyPage
b "World"
end
+ span { plain { "Plain!" } }
+
i "Hi"
whitespace
plain "User"
@@ -24,11 +26,17 @@ end
describe "Blueprint::HTML utils" do
describe "#plain" do
- it "renders plain text" do
+ it "renders plain text passed via argument" do
page = DummyPage.new
page.to_html.should contain("
HelloWorld
")
end
+
+ it "renders plain text passed via block" do
+ page = DummyPage.new
+
+ page.to_html.should contain("Plain!")
+ end
end
describe "#doctype" do
diff --git a/src/blueprint/html.cr b/src/blueprint/html.cr
index 67fd1db..6c25d6c 100644
--- a/src/blueprint/html.cr
+++ b/src/blueprint/html.cr
@@ -6,6 +6,7 @@ require "./html/builder"
require "./html/component_renderer"
require "./html/element_registrar"
require "./html/element_renderer"
+require "./html/renderer"
require "./html/standard_elements"
require "./html/svg"
require "./html/utils"
@@ -16,34 +17,25 @@ module Blueprint::HTML
include Blueprint::HTML::ComponentRenderer
include Blueprint::HTML::ElementRegistrar
include Blueprint::HTML::ElementRenderer
+ include Blueprint::HTML::Renderer
include Blueprint::HTML::StandardElements
include Blueprint::HTML::SVG
include Blueprint::HTML::Utils
- @buffer = String::Builder.new
+ @buffer : String::Builder = String::Builder.new
def to_html : String
- return "" unless render?
-
- envelope { blueprint }
+ render_to(@buffer)
@buffer.to_s
end
def to_html(&) : String
- return "" unless render?
-
- envelope do
- blueprint { render_block { yield } }
- end
+ render_to(@buffer) { yield self }
@buffer.to_s
end
- private def render? : Bool
- true
- end
-
private def envelope(&) : Nil
yield
end
diff --git a/src/blueprint/html/component_registrar.cr b/src/blueprint/html/component_registrar.cr
index 15accd5..dc08ad6 100644
--- a/src/blueprint/html/component_registrar.cr
+++ b/src/blueprint/html/component_registrar.cr
@@ -1,7 +1,7 @@
module Blueprint::HTML::ComponentRegistrar
macro register_component(helper_method, component_class, block = true)
{% if block %}
- private def {{helper_method.id}}(**args, &block) : Nil
+ private def {{helper_method.id}}(**args, &) : Nil
render {{component_class}}.new(**args) do |component|
yield component
end
@@ -9,7 +9,7 @@ module Blueprint::HTML::ComponentRegistrar
{% if block == :optional %}
private def {{helper_method.id}}(**args) : Nil
- render({{component_class}}.new(**args)) { nil }
+ render({{component_class}}.new(**args)) {}
end
{% end %}
{% else %}
diff --git a/src/blueprint/html/component_renderer.cr b/src/blueprint/html/component_renderer.cr
index 0861058..6759c09 100644
--- a/src/blueprint/html/component_renderer.cr
+++ b/src/blueprint/html/component_renderer.cr
@@ -9,18 +9,4 @@ module Blueprint::HTML::ComponentRenderer
with self yield blueprint
end
end
-
- protected def render_to(buffer : String::Builder) : Nil
- return unless render?
-
- @buffer = buffer
- blueprint
- end
-
- protected def render_to(buffer : String::Builder, &) : Nil
- return unless render?
-
- @buffer = buffer
- blueprint { render_block { yield } }
- end
end
diff --git a/src/blueprint/html/renderer.cr b/src/blueprint/html/renderer.cr
new file mode 100644
index 0000000..35957d2
--- /dev/null
+++ b/src/blueprint/html/renderer.cr
@@ -0,0 +1,23 @@
+module Blueprint::HTML::Renderer
+ def render_to(buffer : String::Builder) : Nil
+ return unless render?
+
+ @buffer = buffer
+
+ envelope { blueprint }
+ end
+
+ def render_to(buffer : String::Builder, &) : Nil
+ return unless render?
+
+ @buffer = buffer
+
+ envelope do
+ blueprint { render_block { yield } }
+ end
+ end
+
+ private def render? : Bool
+ true
+ end
+end
diff --git a/src/blueprint/html/svg.cr b/src/blueprint/html/svg.cr
index 3a7dc64..b46a04f 100644
--- a/src/blueprint/html/svg.cr
+++ b/src/blueprint/html/svg.cr
@@ -1,13 +1,13 @@
require "../svg/component"
module Blueprint::HTML::SVG
+ private def svg(**attributes) : Nil
+ svg(**attributes) { }
+ end
+
private def svg(**attributes, &) : Nil
render Blueprint::SVG::Component.new(**attributes) do |component|
with component yield
end
end
-
- private def svg(**attributes) : Nil
- render Blueprint::SVG::Component.new(**attributes)
- end
end
diff --git a/src/blueprint/html/utils.cr b/src/blueprint/html/utils.cr
index f4c6e8e..6f68ad8 100644
--- a/src/blueprint/html/utils.cr
+++ b/src/blueprint/html/utils.cr
@@ -1,21 +1,23 @@
module Blueprint::HTML::Utils
private def plain(content : String) : Nil
- ::HTML.escape(content, @buffer)
+ plain { content }
+ end
+
+ private def plain(&) : Nil
+ ::HTML.escape(yield, @buffer)
end
private def doctype : Nil
@buffer << ""
end
- private def comment(&) : Nil
- @buffer << ""
+ private def comment(content : String) : Nil
+ comment { content }
end
- private def comment(content : String) : Nil
+ private def comment(&) : Nil
@buffer << ""
end
@@ -24,7 +26,7 @@ module Blueprint::HTML::Utils
end
def unsafe_raw(content : String) : Nil
- @buffer << content
+ unsafe_raw { content }
end
def unsafe_raw(&) : Nil
diff --git a/src/blueprint/raw_html.cr b/src/blueprint/raw_html.cr
index f282c84..1288e33 100644
--- a/src/blueprint/raw_html.cr
+++ b/src/blueprint/raw_html.cr
@@ -16,7 +16,7 @@ module Blueprint::RawHTML
private def render_block(&) : Nil
buffer_size_before_block_evaluation = @buffer.bytesize
content = with self yield
- @buffer << content.to_s if buffer_size_before_block_evaluation == @buffer.bytesize
+ @buffer << content if buffer_size_before_block_evaluation == @buffer.bytesize
end
private def element(_tag_name : String | Symbol, __content__ : String, **attributes) : Nil
@@ -39,10 +39,4 @@ module Blueprint::RawHTML
@buffer << yield
@buffer << "-->"
end
-
- private def comment(content : String) : Nil
- @buffer << ""
- end
end