Nevertheless, I added the strip method (my favorite) at the end of
lcolstrip. I'll explain why.

# given

template = %{
--%html
----%head
------%title
----%body
------%div
}

# when

template.lcolstrip #=> "\n%html\n  %head\n    %title\n  %body\n    %div
\n"
template.lcolstrip.strip #=> "%html\n  %head\n    %title\n  %body\n
%div"

I think it's a good idea to delete the leading and the trailing
newline characters.

module Shamaoke # : )
  module StringAdditions
    def lcolstrip
      spaces = self.lines.find_all do |line|
        line.match(/\S/)
      end.inject(self.length) do |memo, line|
        # x is a quantity of leading spaces in a line
        (x = line.length - line.lstrip.length) < memo ? x : memo
      end
      self.gsub(/^ {#{spaces}}/, '').strip # a little addition
    end
  end
end

On Jan 29, 6:31 pm, Bradley Grzesiak <[email protected]> wrote:
> The call to 'strip' is unnecessary.
>
> Also, I suggest this instead, since you don't want to change the
> 'number_of_spaces' parameter when you refactor:
>
> module Shamaoke
>   module StringAdditions
>     def lcolstrip
>       spaces = self.lines.select do |l|
>         l.match /\S/
>       end.reduce(self.length) do |m, l|
>         (x = l.length - l.lstrip.length) < m ? x : m
>       end
>       self.gsub /^ {#{spaces}}/, ''
>     end
>   end
> end
> String.send(:include, Shamaoke::StringAdditions)
>
> Cheers!
> :brad
>
>
>
> On Fri, Jan 29, 2010 at 8:24 AM, P.A. <[email protected]> wrote:
> > I've found another solution combining your idiom and my method.
>
> > # begin
> > require 'haml'
>
> > template = %{
> > ----%html
> > ------%head
> > --------%title
> > ------%body
> > --------%div
> > }.strip.gsub(/^\s{4}/, '')
>
> > Haml.Engine.new(template).render
>
> > # end
>
> > Of course, you feel free to make a helper method to improve this
> > awkwardness.
>
> > # begin
> > class String
> > --def adtemp(number_of_spaces) # adjust_template
> > ----self.strip.gsub(/^\s{#{number_of_spaces}}/, '')
> > --end
> > end
>
> > new_template = %{
> > ----%html
> > ------%head
> > --------%title
> > ------%body
> > --------%div
> > }.adtemp(4)
>
> > # end
>
> > Of course, we can improve it further. We need to add the adtemp method
> > in the HAML code and use it in a begin-rescue block which will watch
> > over the Inconsistent Indentation error.
>
> > On Jan 29, 4:13 pm, "P.A." <[email protected]> wrote:
> > > Brilliant! That's exactly what I want. The problem was to organize
> > > controller, view and spec code in a single file. And now it's done. If
> > > you interested in that code what I got, please see below. (It might be
> > > problems with an indentation in email.)
>
> > > # gems:
> > > # - rack;
> > > # - sinatra;
> > > # - haml;
> > > # - rspec;
> > > # - rack-test.
>
> > > # controller.rb
>
> > > # application
>
> > > require 'sinatra'
> > > require 'haml'
>
> > > class Controller < Sinatra::Base
> > >   set :environment, ($*[0].to_sym if $*[0].respond_to? :to_sym)
> > > || :test
>
> > >   template :layout do
> > >     <<-haml.gsub(/^\s{6}/, '')
> > >       %html
> > >         %head
> > >           %title
> > >         %body
> > >           %div
> > >             = yield
> > >     haml
> > >   end
>
> > >   template :test do
> > >     <<-haml.gsub(/^\s{6}/, '')
> > >       %div Works!
> > >     haml
> > >   end
>
> > >   get '/' do
> > >     content_type 'text/html; charset=utf-8'
> > >     haml :test
> > >   end
> > > end
>
> > > # run code
>
> > > if Controller.development?
> > >   Controller.run!
> > > end
>
> > > # spec
>
> > > require 'spec'
> > > require 'rack/test'
>
> > > describe 'Sinatra application' do
> > >   include Rack::Test::Methods
>
> > >   def app
> > >     Controller
> > >   end
>
> > >   it 'should response to "/"' do
> > >     get '/'
> > >     last_response.status.should == 200
> > >   end
>
> > >   it 'should return a text/html document' do
> > >     get '/'
> > >     last_response.headers['content-type'].should == 'text/html;
> > > charset=utf-8'
> > >   end
>
> > >   it 'should return a standart html template' do
> > >     get '/'
> > >     template = /<html>.*<\/html>/m
> > >     last_response.body.should =~ template
> > >   end
>
> > >   it 'should return a standart html template with a partial included'
> > > do
> > >     get '/'
> > >     template = /<html>.*<div>Works!<\/div>.*<\/html>/m
> > >     last_response.body.should =~ template
> > >   end
> > > end
>
> > > # how it works
>
> > > # spec
> > > $ spec controller.rb
>
> > > # app
>
> > > $ ruby controller.rb development
>
> > > Thank you for the help.
>
> > > On Jan 28, 11:30 pm, Bradley Grzesiak <[email protected]> wrote:
>
> > > > You could do this:
>
> > > > # dashes are actually spaces, for clarity in email
> > > > template = <<-EOF.gsub(/^\s{4}/, '')
> > > > ----%html
> > > > ------%head
> > > > --------%title
> > > > ------%body
> > > > EOF
>
> > > > I tweeted about this last August. =Phttp://
> > twitter.com/listrophy/status/3382558239
>
> > > > :brad
>
> > > > On Thu, Jan 28, 2010 at 1:35 PM, Nathan Weizenbaum <[email protected]>
> > wrote:
> > > > > The problem is that, as the error message says, your indentation is
> > > > > inconsistent. Once you strip your template, it looks like this:
> > > > >https://gist.github.com/c50eed9d9965aae844bc. The first indentation
> > Haml
> > > > > sees is for "%head", which is indented 8 spaces. It then expects 8
> > spaces to
> > > > > be the amount you'll indent by in the future, but "%title" is only
> > indented
> > > > > by 2 spaces beyond "%head". Thus, it raises an error.
>
> > > > > On Thu, Jan 28, 2010 at 7:49 AM, P.A. <[email protected]> wrote:
>
> > > > >> Hi.
>
> > > > >> I have next code.
>
> > > > >> # begin
> > > > >> require 'haml'
>
> > > > >> template = %{
> > > > >> ------%html
> > > > >> --------%head
> > > > >> --------%body
> > > > >> }.strip
>
> > > > >> Haml::Engine.new(template).render
> > > > >> # end
>
> > > > >> It works fine and render the template.
>
> > > > >> But if I add the %title tag inside the %head...
>
> > > > >> # begin
> > > > >> require 'haml'
>
> > > > >> template = %{
> > > > >> ------%html
> > > > >> --------%head
> > > > >> ----------%title
> > > > >> --------%body
> > > > >> }.strip
>
> > > > >> Haml::Engine.new(template).render
> > > > >> # end
>
> > > > >> ...I get the error: "Inconsistent indentation: 10 spaces were used
> > for
> > > > >> indentation, but the rest of the document was indented using 8
> > > > >> spaces."
>
> > > > >> What is the problem of this error? How can I resolve it?
>
> > > > >> Thanks.
>
> > > > >> Debian GNU/Linux 5.0.3;
> > > > >> Ruby 1.9.2;
> > > > >> Haml 2.2.17.
>
> > > > >> --
> > > > >> You received this message because you are subscribed to the Google
> > Groups
> > > > >> "Haml" group.
> > > > >> To post to this group, send email to [email protected].
> > > > >> To unsubscribe from this group, send email to
> > > > >> [email protected]<haml%[email protected]><
> > haml%[email protected]<haml%[email protected]>
> > >.
> > > > >> For more options, visit this group at
> > > > >>http://groups.google.com/group/haml?hl=en.
>
> > > > >  --
> > > > > You received this message because you are subscribed to the Google
> > Groups
> > > > > "Haml" group.
> > > > > To post to this group, send email to [email protected].
> > > > > To unsubscribe from this group, send email to
> > > > > [email protected]<haml%[email protected]><
> > haml%[email protected]<haml%[email protected]>
> > >.
> > > > > For more options, visit this group at
> > > > >http://groups.google.com/group/haml?hl=en.
>
> > > > --
> > > > Bradley Grzesiak
> > > > co-founder, bendyworks llchttp://bendyworks.com/
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Haml" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected] <haml%[email protected]>.
> > For more options, visit this group at
> >http://groups.google.com/group/haml?hl=en.
>
> --
> Bradley Grzesiak
> co-founder, bendyworks llchttp://bendyworks.com/

-- 
You received this message because you are subscribed to the Google Groups 
"Haml" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/haml?hl=en.

Reply via email to