diff --git a/sinatra-contrib/lib/sinatra/contrib.rb b/sinatra-contrib/lib/sinatra/contrib.rb index 3601ee44b..9d56e3315 100644 --- a/sinatra-contrib/lib/sinatra/contrib.rb +++ b/sinatra-contrib/lib/sinatra/contrib.rb @@ -28,6 +28,8 @@ module Common # Other extensions you don't want to be loaded unless needed. module Custom register :Reloader, 'sinatra/reloader' + + helpers :HamlHelpers, 'sinatra/haml_helpers' end ## diff --git a/sinatra-contrib/lib/sinatra/haml_helpers.rb b/sinatra-contrib/lib/sinatra/haml_helpers.rb new file mode 100644 index 000000000..0aff3fc32 --- /dev/null +++ b/sinatra-contrib/lib/sinatra/haml_helpers.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'sinatra/base' +require 'sinatra/capture' + +module Sinatra + # = Sinatra::HamlHelpers + # + # This extension provides some of the helper methods that existed in Haml 5 + # but were removed in Haml 6. To use this in your app, just +register+ it: + # + # require 'sinatra/base' + # require 'sinatra/haml_helpers' + # + # class Application < Sinatra::Base + # register Sinatra::HamlHelpers + # + # # now you can use the helpers in your views + # get '/' do + # haml_code = <<~HAML + # %p + # != surround "(", ")" do + # %a{ href: "https://example.org/" } example.org + # HAML + # haml haml_code + # end + # end + # + module HamlHelpers + include Sinatra::Capture + + def surround(front, back = front, &block) + "#{front}#{_capture_haml(&block).chomp}#{back}\n" + end + + def precede(str, &block) + "#{str}#{_capture_haml(&block).chomp}\n" + end + + def succeed(str, &block) + "#{_capture_haml(&block).chomp}#{str}\n" + end + + def _capture_haml(*args, &block) + capture(*args, &block) + end + end + + helpers HamlHelpers +end diff --git a/sinatra-contrib/spec/haml_helpers_spec.rb b/sinatra-contrib/spec/haml_helpers_spec.rb new file mode 100644 index 000000000..0de49e6e0 --- /dev/null +++ b/sinatra-contrib/spec/haml_helpers_spec.rb @@ -0,0 +1,77 @@ +require 'haml' +require 'spec_helper' +require 'sinatra/haml_helpers' + +RSpec.describe Sinatra::HamlHelpers do + describe "#surround" do + it "renders correctly" do + mock_app do + helpers Sinatra::HamlHelpers + get "/" do + haml_code = <<~HAML + %p + != surround "(", ")" do + %a{ href: "https://example.org/" } surrounded + HAML + haml haml_code + end + end + + get "/" + html_code = <<~HTML +
+ (surrounded) +
+ HTML + expect(body).to eq(html_code) + end + end + + describe "#precede" do + it "renders correctly" do + mock_app do + helpers Sinatra::HamlHelpers + get "/" do + haml_code = <<~HAML + %p + != precede "* " do + %a{ href: "https://example.org/" } preceded + HAML + haml haml_code + end + end + + get "/" + html_code = <<~HTML ++ * preceded +
+ HTML + expect(body).to eq(html_code) + end + end + + describe "#succeed" do + it "renders correctly" do + mock_app do + helpers Sinatra::HamlHelpers + get "/" do + haml_code = <<~HAML + %p + != succeed "." do + %a{ href: "https://example.org/" } succeeded + HAML + haml haml_code + end + end + + get "/" + html_code = <<~HTML ++ succeeded. +
+ HTML + expect(body).to eq(html_code) + end + end +end