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