📄 helpers.rb
字号:
require File.dirname(__FILE__) + '/helpers/action_view_mods'module Haml # This module contains various helpful methods to make it easier to do # various tasks. Haml::Helpers is automatically included in the context # that a Haml template is parsed in, so all these methods are at your # disposal from within the template. module Helpers self.extend self @@action_view = false @@force_no_action_view = false # Returns whether or not ActionView is installed on the system. def self.action_view? @@action_view end # Takes any string, finds all the endlines and converts them to # HTML entities for endlines so they'll render correctly in # whitespace-sensitive tags without screwing up the indentation. def flatten(input) input.gsub(/\n/, '
').gsub(/\r/, '') end # Takes an Enumerable object and a block # and iterates over the object, # yielding each element to a Haml block # and putting the result into <tt><li></tt> elements. # This creates a list of the results of the block. # For example: # # = list_of([['hello'], ['yall']]) do |i| # = i[0] # # Produces: # # <li>hello</li> # <li>yall</li> # # And # # = list_of({:title => 'All the stuff', :description => 'A book about all the stuff.'}) do |key, val| # %h3= key.humanize # %p= val # # Produces: # # <li> # <h3>Title</h3> # <p>All the stuff</p> # </li> # <li> # <h3>Description</h3> # <p>A book about all the stuff.</p> # </li> # def list_of(array, &block) # :yields: item to_return = array.collect do |i| result = capture_haml(i, &block) if result.count("\n") > 1 result.gsub!("\n", "\n ") result = "\n #{result.strip}\n" else result.strip! end "<li>#{result}</li>" end to_return.join("\n") end # Increments the number of tabs the buffer automatically adds # to the lines of the template. # For example: # # %h1 foo # - tab_up # %p bar # - tab_down # %strong baz # # Produces: # # <h1>foo</h1> # <p>bar</p> # <strong>baz</strong> # def tab_up(i = 1) buffer.tabulation += i end # Increments the number of tabs the buffer automatically adds # to the lines of the template. # # See tab_up. def tab_down(i = 1) buffer.tabulation -= i end # Surrounds the given block of Haml code with the given characters, # with no whitespace in between. # For example: # # = surround '(', ')' do # %a{:href => "food"} chicken # # Produces: # # (<a href='food'>chicken</a>) # # and # # = surround '*' do # %strong angry # # Produces: # # *<strong>angry</strong>* # def surround(front, back = nil, &block) back ||= front output = capture_haml(&block) "#{front}#{output.chomp}#{back}\n" end # Prepends the given character to the beginning of the Haml block, # with no whitespace between. # For example: # # = precede '*' do # %span.small Not really # # Produces: # # *<span class='small'>Not really</span> # def precede(char, &block) "#{char}#{capture_haml(&block).chomp}\n" end # Appends the given character to the end of the Haml block, # with no whitespace between. # For example: # # click # = succeed '.' do # %a{:href=>"thing"} here # # Produces: # # click # <a href='thing'>here</a>. # def succeed(char, &block) "#{capture_haml(&block).chomp}#{char}\n" end # Captures the result of the given block of Haml code, # gets rid of the excess indentation, # and returns it as a string. # For example, after the following, # # .foo # - foo = capture_haml(13) do |a| # %p= a # # the local variable <tt>foo</tt> would be assigned to "<p>13</p>\n". # def capture_haml(*args, &block) capture_haml_with_buffer(buffer.buffer, *args, &block) end private # Sets whether or not ActionView is installed on the system. def self.action_view(value) # :nodoc: @@action_view = value end # Gets a reference to the current Haml::Buffer object. def buffer @haml_stack[-1] end # Gives a proc the same local "_hamlout" and "_erbout" variables # that the current template has. def bind_proc(&proc) _hamlout = buffer _erbout = _hamlout.buffer proc { |*args| proc.call(*args) } end # Performs the function of capture_haml, assuming <tt>local_buffer</tt> # is where the output of block goes. def capture_haml_with_buffer(local_buffer, *args, &block) position = local_buffer.length block.call(*args) captured = local_buffer.slice!(position..-1) min_tabs = nil captured.each do |line| tabs = line.index(/[^ ]/) min_tabs ||= tabs min_tabs = min_tabs > tabs ? tabs : min_tabs end result = captured.map do |line| line[min_tabs..-1] end result.to_s end include ActionViewMods if self.const_defined? "ActionViewMods" endend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -