diff --git a/README.rdoc b/README.rdoc index ef6499a2..012df1e2 100644 --- a/README.rdoc +++ b/README.rdoc @@ -67,7 +67,7 @@ a tag without a name defaults to a div. So becomes
Hello!
- + Haml uses indentation to bring the individual elements to represent the HTML structure. A tag's children are indented two spaces more than the parent tag. @@ -235,8 +235,8 @@ the documentation for the Sass module. Haml and Sass are designed by Hampton Catlin (hcatlin) and he is the author of the original implementation. However, Hampton doesn't even know his way -around the code anymore and mostly just concentrates on the language issues. -Hampton lives in Toronto, Ontario (though he's an American by birth) and +around the code anymore and mostly just concentrates on the language issues. +Hampton lives in Toronto, Ontario (though he's an American by birth) and is a partner at Unspace Interactive. Nathan Weizenbaum is the primary maintainer and architect of the "modern" Ruby diff --git a/Rakefile b/Rakefile index c3f92189..4be33233 100644 --- a/Rakefile +++ b/Rakefile @@ -68,7 +68,7 @@ END but it can function as a stand-alone templating engine. END #' - + readmes = FileList.new('*') do |list| list.exclude(/(^|[^.a-z])[a-z]+/) list.exclude('TODO') @@ -133,7 +133,7 @@ END rdoc.rdoc_dir = 'rdoc_devel' rdoc.options << '--all' rdoc.rdoc_files.include('test/*.rb') - + # Get rid of exclusion rules rdoc.rdoc_files = Rake::FileList.new(*rdoc.rdoc_files.to_a) rdoc.rdoc_files.include('lib/haml/buffer.rb') @@ -167,17 +167,17 @@ END require 'test/profile' engine = ENV['ENGINE'] && ENV['ENGINE'].downcase == 'sass' ? Sass : Haml - + puts '-'*51, "Profiling #{engine}", '-'*51 - + args = [] args.push ENV['TIMES'].to_i if ENV['TIMES'] args.push ENV['FILE'] if ENV['FILE'] - + profiler = engine::Profiler.new res = profiler.profile(*args) puts res - + puts '-'*51 end diff --git a/extra/haml-mode.el b/extra/haml-mode.el index 18476e04..e4a4e2b8 100644 --- a/extra/haml-mode.el +++ b/extra/haml-mode.el @@ -7,10 +7,10 @@ ;;; functions are similar to those in yaml-mode and python-mode. ;;; To install, save this somewhere and add the following to your .emacs file: -;;; +;;; ;;; (add-to-list 'load-path "/path/to/haml-mode.el") ;;; (require 'haml-mode nil 't) -;;; +;;; ;;; Code: diff --git a/lib/haml.rb b/lib/haml.rb index 8d4a4d39..40789bce 100644 --- a/lib/haml.rb +++ b/lib/haml.rb @@ -2,18 +2,18 @@ dir = File.dirname(__FILE__) $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # = Haml (XHTML Abstraction Markup Language) -# +# # Haml is a markup language # that's used to cleanly and simply describe the XHTML of any web document, # without the use of inline code. # Haml functions as a replacement -# for inline page templating systems such as PHP, ERB, and ASP. -# However, Haml avoids the need for explicitly coding XHTML into the template, +# for inline page templating systems such as PHP, ERB, and ASP. +# However, Haml avoids the need for explicitly coding XHTML into the template, # because it is actually an abstract description of the XHTML, # with some code to generate dynamic content. -# +# # == Features -# +# # * Whitespace active # * Well-formatted markup # * DRY @@ -36,9 +36,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # # To enable it as a Rails plugin, # then run -# +# # haml --rails path/to/rails/app -# +# # Haml is enabled in Merb by default, # so Merb users don't have to do anything more. # @@ -50,24 +50,24 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # the same way you do in ERb templates. # Helper methods are also available in Haml templates. # For example (this example uses Rails, but the principle for Merb is the same): -# +# # # file: app/controllers/movies_controller.rb -# +# # class MoviesController < ApplicationController # def index # @title = "Teen Wolf" # end # end -# +# # -# file: app/views/movies/index.haml -# +# # #content # .title # %h1= @title # = link_to 'Home', home_url -# +# # may be compiled to: -# +# #
#
#

Teen Wolf

@@ -89,41 +89,41 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # engine.render #=> "

Haml code!

\n" # # == Characters with meaning to Haml -# +# # Various characters, when placed at a certain point in a line, # instruct Haml to render different types of things. -# +# # === XHTML Tags -# +# # These characters render XHTML tags. -# +# # ==== % -# -# +# +# # The percent character is placed at the beginning of a line. # It's followed immediately by the name of an element, # then optionally by modifiers (see below), a space, # and text to be rendered inside the element. # It creates an element in the form of . # For example: -# +# # %one # %two # %three Hey there -# +# # is compiled to: -# +# # # # Hey there # # -# +# # Any string is a valid element name; # Haml will automatically generate opening and closing tags for any element. -# +# # ==== {} -# +# # Brackets represent a Ruby hash # that is used for specifying the attributes of an element. # It is literally evaluated as a Ruby hash, @@ -132,13 +132,13 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # will be replaced by appropriate escape sequences. # The hash is placed after the tag is defined. # For example: -# +# # %head{ :name => "doc_head" } # %script{ 'type' => "text/" + "javascript", # :src => "javascripts/script_#{2 + 7}" } -# +# # is compiled to: -# +# # # @@ -200,7 +200,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # # In XHTML, the only valid value for these attributes is the name of the attribute. # Thus this will render in XHTML as -# +# # # # To set these attributes to false, simply assign them to a Ruby false value. @@ -211,9 +211,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # will just render as # # -# +# # ==== [] -# +# # Square brackets follow a tag definition and contain a Ruby object # that is used to set the class and id of that tag. # The class is set to the object's class @@ -222,40 +222,40 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # Because the id of an object is normally an obscure implementation detail, # this is most useful for elements that represent instances of Models. # For example: -# +# # # file: app/controllers/users_controller.rb -# +# # def show # @user = CrazyUser.find(15) # end -# +# # -# file: app/views/users/show.haml -# +# # %div[@user] # %bar[290]/ # Hello! -# +# # is compiled to: -# +# #
# # Hello! #
-# +# # This is based off of DHH's SimplyHelpful syntax, # as presented at RailsConf Europe 2006. -# +# # ==== / -# +# # The forward slash character, when placed at the end of a tag definition, # causes the tag to be self-closed. # For example: -# +# # %br/ # %meta{'http-equiv' => 'Content-Type', :content => 'text/html'}/ -# +# # is compiled to: -# +# #
# # @@ -271,9 +271,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # #
# -# +# # ==== . and # -# +# # The period and pound sign are borrowed from CSS. # They are used as shortcuts to specify the class # and id attributes of an element, respectively. @@ -281,22 +281,22 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # by chaining the class names together with periods. # They are placed immediately after the tag and before an attributes hash. # For example: -# +# # %div#things # %span#rice Chicken Fried # %p.beans{ :food => 'true' } The magical fruit # %h1.class.otherclass#id La La La -# +# # is compiled to: -# +# #
# Chicken Fried #

The magical fruit

#

La La La

#
-# +# # And, -# +# # #content # .articles # .article.title @@ -305,9 +305,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # 2006-11-05 # .article.entry # Neil Patrick Harris would like to dispel any rumors that he is straight -# +# # is compiled to: -# +# #
#
#
Doogie Howser Comes Out
@@ -317,34 +317,34 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) #
#
#
-# +# # ==== Implicit Div Elements -# +# # Because the div element is used so often, it is the default element. # If you only define a class and/or id using the . or # syntax, # a div element is automatically used. # For example: -# +# # #collection # .item # .description What a cool item! -# +# # is the same as: -# +# # %div{:id => collection} # %div{:class => 'item'} # %div{:class => 'description'} What a cool item! -# +# # and is compiled to: -# +# #
#
#
What a cool item!
#
#
-# +# # ==== = -# +# # = is placed at the end of a tag definition, # after class, id, and attribute declarations. # It's just a shortcut for inserting Ruby code into an element. @@ -353,45 +353,45 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # However, if the result is short enough, # it is displayed entirely on one line. # For example: -# +# # %p= "hello" -# +# # is not quite the same as: -# +# # %p # = "hello" -# +# # It's compiled to: -# +# #

hello

-# +# # === XHTML Helpers -# +# # ==== No Special Character -# +# # If no special character appears at the beginning of a line, # the line is rendered as plain text. # For example: -# +# # %gee # %whiz # Wow this is cool! -# +# # is compiled to: -# +# # # # Wow this is cool! # # -# +# # ==== !!! -# +# # When describing XHTML documents with Haml, # you can have a document type or XML prolog generated automatically # by including the characters !!!. # For example: -# +# # !!! XML # !!! # %html @@ -400,9 +400,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # %body # %h1 I am the international space station # %p Sign my guestbook -# +# # is compiled to: -# +# # # # @@ -414,112 +414,112 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) #

Sign my guestbook

# # -# +# # You can also specify the version and type of XHTML after the !!!. # XHTML 1.0 Strict, Transitional, and Frameset and XHTML 1.1 are supported. # The default version is 1.0 and the default type is Transitional. # For example: -# +# # !!! 1.1 -# +# # is compiled to: -# +# # -# +# # and -# +# # !!! Strict -# +# # is compiled to: -# +# # -# +# # If you're not using the UTF-8 character set for your document, # you can specify which encoding should appear # in the XML prolog in a similar way. # For example: -# +# # !!! XML iso-8859-1 -# +# # is compiled to: -# +# # -# +# # ==== / -# +# # The forward slash character, when placed at the beginning of a line, # wraps all text after it in an HTML comment. # For example: -# +# # %peanutbutterjelly # / This is the peanutbutterjelly element # I like sandwiches! -# +# # is compiled to: -# +# # # # I like sandwiches! # -# +# # The forward slash can also wrap indented sections of code. For example: -# +# # / # %p This doesn't render... # %div # %h1 Because it's commented out! -# +# # is compiled to: -# +# # -# +# # You can also use Internet Explorer conditional comments # (about)[http://www.quirksmode.org/css/condcom.html] # by enclosing the condition in square brackets after the /. # For example: -# +# # /[if IE] # %a{ :href => 'http://www.mozilla.com/en-US/firefox/' } # %h1 Get Firefox -# +# # is compiled to: -# +# # -# +# # ==== \ -# +# # The backslash character escapes the first character of a line, # allowing use of otherwise interpreted characters as plain text. # For example: -# +# # %title # = @title # \- MySite -# +# # is compiled to: -# +# # # MyPage # - MySite # -# +# # ==== | -# +# # The pipe character designates a multiline string. # It's placed at the end of a line # and means that all following lines that end with | # will be evaluated as though they were on the same line. # For example: -# +# # %whoo # %hoo I think this might get | # pretty long so I should | @@ -527,9 +527,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # multiline so it doesn't | # look awful. | # %p This is short. -# +# # is compiled to: -# +# # # # I think this might get pretty long so I should probably make it multiline so it doesn't look awful. @@ -613,21 +613,21 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # (BlueCloth takes precedence if both are installed). # # You can also define your own filters (see Setting Options, below). -# +# # === Ruby evaluators -# +# # ==== = -# +# # The equals character is followed by Ruby code, # which is evaluated and the output inserted into the document as plain text. # For example: -# +# # %p # = ['hi', 'there', 'reader!'].join " " # = "yo" -# +# # is compiled to: -# +# #

# hi there reader! # yo @@ -642,29 +642,29 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # would be compiled to # # <script>alert("I'm evil!");</script> -# +# # ==== - -# +# # The hyphen character makes the text following it into "silent script": # Ruby script that is evaluated, but not output. -# +# # It is not recommended that you use this widely; # almost all processing code and logic should be restricted # to the Controller, the Helper, or partials. -# +# # For example: -# +# # - foo = "hello" # - foo << " there" # - foo << " you!" # %p= foo -# +# # is compiled to: -# +# #

# hello there you! #

-# +# # ==== == # # Two equals characters interpolates Ruby code into plain text, @@ -729,7 +729,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # I feel ! # # ===== Blocks -# +# # Ruby blocks, like XHTML tags, don't need to be explicitly closed in Haml. # Rather, they're automatically closed, based on indentation. # A block begins whenever the indentation is increased @@ -737,13 +737,13 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # It ends when the indentation decreases # (as long as it's not an +else+ clause or something similar). # For example: -# +# # - (42...47).each do |i| # %p= i # %p See, I can count! -# +# # is compiled to: -# +# #

# 42 #

@@ -759,9 +759,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) #

# 46 #

-# +# # Another example: -# +# # %p # - case 2 # - when 1 @@ -770,9 +770,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # = "2?" # - when 3 # = "3." -# +# # is compiled to: -# +# #

# 2? #

@@ -783,7 +783,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # signifies a silent comment. # Any text following this isn't rendered in the resulting document # at all. -# +# # For example: # # %p foo @@ -809,7 +809,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # #

foo

#

bar

-# +# # == Other Useful Things # # === Helpers @@ -819,9 +819,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # creating nicely indented output for user-defined helpers, # and other useful things. # The helpers are all documented in the Haml::Helpers and Haml::Helpers::ActionViewExtensions modules. -# +# # === Haml Options -# +# # Options can be set by setting the hash Haml::Template.options # from environment.rb in Rails, # or by passing an options hash to Haml::Engine. @@ -842,7 +842,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # designated by = or ~ should be # evaluated. If this is true, said scripts are # rendered as empty strings. Defaults to false. -# +# # [:attr_wrapper] The character that should wrap element attributes. # This defaults to ' (an apostrophe). Characters # of this type within the attributes will be escaped diff --git a/lib/haml/buffer.rb b/lib/haml/buffer.rb index 9942649b..e6e29840 100644 --- a/lib/haml/buffer.rb +++ b/lib/haml/buffer.rb @@ -71,7 +71,7 @@ module Haml # Have to push every line in by the extra user set tabulation text.gsub!(/^/m, ' ' * @tabulation) end - + @buffer << text @real_tabs += tab_change end @@ -86,13 +86,13 @@ module Haml elsif preserve_script result = Haml::Helpers.find_and_preserve(result) end - + result = result.to_s while result[-1] == ?\n # String#chomp is slow result = result[0...-1] end - + result = html_escape(result) if escape_html if close_tag && (@options[:ugly] || Buffer.one_liner?(result) || preserve_tag) @@ -102,10 +102,10 @@ module Haml if close_tag @buffer << "\n" end - + result = result.gsub(/^/m, tabs(tabulation)) unless @options[:ugly] @buffer << "#{result}\n" - + if close_tag # We never get here if @options[:ugly] is true @buffer << "#{tabs(tabulation-1)}\n" @@ -119,7 +119,7 @@ module Haml # element, formats it, and adds it to the buffer. def open_tag(name, atomic, try_one_line, preserve_tag, escape_html, class_id, obj_ref, content, *attributes_hashes) tabulation = @real_tabs - + attributes = class_id attributes_hashes.each do |attributes_hash| attributes_hash.keys.each { |key| attributes_hash[key.to_s] = attributes_hash.delete(key) } diff --git a/lib/haml/engine.rb b/lib/haml/engine.rb index de68ec2e..dff38647 100644 --- a/lib/haml/engine.rb +++ b/lib/haml/engine.rb @@ -116,7 +116,7 @@ END # If it's a Binding or Proc object, # Haml uses it as the second argument to Kernel#eval; # otherwise, Haml just uses its #instance_eval context. - # + # # Note that Haml modifies the evaluation context # (either the scope object or the "self" object of the scope binding). # It extends Haml::Helpers, and various instance variables are set @@ -225,7 +225,7 @@ END # # Haml::Engine.new(".upcased= upcase").def_method(String, :upcased_div) # "foobar".upcased_div #=> "
FOOBAR
\n" - # + # # The first argument of the defined method is a hash of local variable names to values. # However, due to an unfortunate Ruby quirk, # the local variables which can be assigned must be pre-declared. @@ -241,7 +241,7 @@ END # obj = Object.new # Haml::Engine.new("%p= foo").def_method(obj, :render) # obj.render(:foo => "Hello!") #=> NameError: undefined local variable or method `foo' - # + # # Note that Haml modifies the evaluation context # (either the scope object or the "self" object of the scope binding). # It extends Haml::Helpers, and various instance variables are set diff --git a/lib/haml/exec.rb b/lib/haml/exec.rb index aa2797f5..7e8efd71 100644 --- a/lib/haml/exec.rb +++ b/lib/haml/exec.rb @@ -21,7 +21,7 @@ module Haml @opts.parse!(@args) process_result - + @options rescue Exception => e raise e if e.is_a? SystemExit @@ -45,7 +45,7 @@ module Haml def get_line(exception) exception.backtrace[0].scan(/:(\d+)/)[0] end - + private def set_opts(opts) @@ -110,7 +110,7 @@ Description: Options: END - + opts.on('--rails RAILS_DIR', "Install Haml and Sass from the Gem to a Rails project") do |dir| original_dir = dir @@ -218,7 +218,7 @@ END 'Output format. Can be xhtml (default), html4, or html5.') do |name| @options[:for_engine][:format] = name.to_sym end - + opts.on('-e', '--escape-html', 'Escape HTML characters (like ampersands and angle brackets) by default.') do @options[:for_engine][:escape_html] = true diff --git a/lib/haml/filters.rb b/lib/haml/filters.rb index 2ec8603e..ffa448ad 100644 --- a/lib/haml/filters.rb +++ b/lib/haml/filters.rb @@ -93,7 +93,7 @@ module Haml # # ... # end - # + # def lazy_require(*reqs) @lazy_requires = reqs end @@ -110,7 +110,7 @@ module Haml return rescue LoadError; end # RCov doesn't see this, but it is run end - + begin @required = @lazy_requires[-1] require @required @@ -210,7 +210,7 @@ END precompiler.send(:push_silent, src) end end - + module RedCloth include Base lazy_require 'redcloth' @@ -219,7 +219,7 @@ END ::RedCloth.new(text).to_html end end - + # Uses RedCloth to provide only Textile (not Markdown) parsing module Textile include Base diff --git a/lib/haml/helpers.rb b/lib/haml/helpers.rb index 9d191ae7..85fa6c55 100644 --- a/lib/haml/helpers.rb +++ b/lib/haml/helpers.rb @@ -35,7 +35,7 @@ module Haml # end # context.init_haml_helpers # context.haml_tag :p, "Stuff" - # + # def init_haml_helpers @haml_is_haml = true @haml_stack = [Haml::Buffer.new(Haml::Engine.new('').send(:options_for_buffer))] @@ -45,7 +45,7 @@ module Haml # call-seq: # find_and_preserve(input) # find_and_preserve {...} - # + # # Isolates the whitespace-sensitive tags in the string and uses preserve # to convert any endlines inside them into HTML entities for endlines. def find_and_preserve(input = '', &block) @@ -107,14 +107,14 @@ module Haml 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 - + "
  • #{result}
  • " end to_return.join("\n") @@ -163,7 +163,7 @@ module Haml def tab_down(i = 1) haml_buffer.tabulation -= i end - + # Surrounds the given block of Haml code with the given characters, # with no whitespace in between. # For example: @@ -187,10 +187,10 @@ module Haml 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: @@ -205,7 +205,7 @@ module Haml 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: @@ -222,7 +222,7 @@ module Haml 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. @@ -254,7 +254,7 @@ module Haml # between when the opening and closing tags are output. # If the block is a Haml block or outputs text using puts, # the text will be properly indented. - # + # # For example, # # haml_tag :table do @@ -331,7 +331,7 @@ END def html_escape(text) text.to_s.gsub(/[><&]/) { |s| HTML_ESCAPE[s] } end - + # Escapes HTML entities in text, but without escaping an ampersand # that is already part of an escaped entity. def escape_once(text) @@ -344,7 +344,7 @@ END def haml_buffer @haml_stack[-1] end - + # Gives a proc the same local "_hamlout" and "_erbout" variables # that the current template has. def haml_bind_proc(&proc) @@ -352,23 +352,23 @@ END _erbout = _hamlout.buffer proc { |*args| proc.call(*args) } end - + # Performs the function of capture_haml, assuming local_buffer # 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 @@ -376,7 +376,7 @@ END end # Returns whether or not the current template is a Haml template. - # + # # This function, unlike other Haml::Helpers functions, # also works in other ActionView templates, # where it will always return false. diff --git a/lib/haml/helpers/action_view_extensions.rb b/lib/haml/helpers/action_view_extensions.rb index 53329b3b..567297ae 100644 --- a/lib/haml/helpers/action_view_extensions.rb +++ b/lib/haml/helpers/action_view_extensions.rb @@ -31,7 +31,7 @@ if defined?(ActionView) # # .entry # :color #00f - # + # def page_class controller.controller_name + " " + controller.action_name end diff --git a/lib/haml/helpers/action_view_mods.rb b/lib/haml/helpers/action_view_mods.rb index 808c0fa0..5309b882 100644 --- a/lib/haml/helpers/action_view_mods.rb +++ b/lib/haml/helpers/action_view_mods.rb @@ -50,7 +50,7 @@ if defined?(ActionView) and not defined?(Merb::Plugins) alias_method :concat, :concat_with_haml end - module TagHelper + module TagHelper def content_tag_with_haml(name, *args, &block) content = content_tag_without_haml(name, *args, &block) @@ -105,7 +105,7 @@ if defined?(ActionView) and not defined?(Merb::Plugins) module FormHelper def form_for_with_haml(object_name, *args, &proc) if block_given? && is_haml? - oldproc = proc + oldproc = proc proc = haml_bind_proc do |*args| tab_up oldproc.call(*args) diff --git a/lib/haml/html.rb b/lib/haml/html.rb index 26c8ffd9..927ca6cc 100644 --- a/lib/haml/html.rb +++ b/lib/haml/html.rb @@ -59,7 +59,7 @@ module Haml String.new else lines = text.split("\n") - + lines.map do |line| line.strip! "#{tabulate(tabs)}#{'\\' if Haml::Engine::SPECIAL_CHARACTERS.include?(line[0])}#{line}\n" @@ -73,7 +73,7 @@ module Haml def self.options @@options end - + TEXT_REGEXP = /^(\s*).*$/ class ::Hpricot::Doc @@ -129,14 +129,14 @@ module Haml class ::Hpricot::Elem def to_haml(tabs = 0) - output = "#{tabulate(tabs)}" + output = "#{tabulate(tabs)}" if HTML.options[:rhtml] && name[0...5] == 'haml:' return output + HTML.send("haml_tag_#{name[5..-1]}", CGI.unescapeHTML(self.innerHTML)) end output += "%#{name}" unless name == 'div' && (attributes.include?('id') || attributes.include?('class')) - + if attributes output += "##{attributes['id']}" if attributes['id'] attributes['class'].split(' ').each { |c| output += ".#{c}" } if attributes['class'] @@ -144,10 +144,10 @@ module Haml remove_attribute('class') output += haml_attributes if attributes.length > 0 end - + output += "/" if children.length == 0 output += "\n" - + self.children.each do |child| output += child.to_haml(tabs + 1) end diff --git a/lib/haml/precompiler.rb b/lib/haml/precompiler.rb index 91252c53..086fcaef 100644 --- a/lib/haml/precompiler.rb +++ b/lib/haml/precompiler.rb @@ -180,7 +180,7 @@ END close until @to_close_stack.empty? flush_merged_text end - + # Processes and deals with lowering indentation. def process_indent(line) return unless line.tabs <= @template_tabs && @template_tabs > 0 @@ -228,7 +228,7 @@ END else push_plain text end end - + # Returns whether or not the text is a silent script text with one # of Ruby's mid-block keywords. def mid_block_keyword?(text) @@ -248,7 +248,7 @@ END @multiline.text << text[0...-1] return true end - + # A multiline string has just been activated, start adding the lines if is_multiline?(text) && (MULTILINE_STARTERS.include? text[0]) @multiline = Line.new text[0...-1], nil, line.index, nil, line.tabs @@ -273,7 +273,7 @@ END # Evaluates text in the context of the scope object, but # does not output the result. def push_silent(text, can_suppress = false) - flush_merged_text + flush_merged_text return if can_suppress && options[:suppress_eval] @precompiled << "#{text};" end @@ -291,11 +291,11 @@ END @merged_text << text @try_one_liner = false end - + def push_text(text, tab_change = 0, try_one_liner = false) push_merged_text("#{text}\n", tab_change, try_one_liner) end - + def flush_merged_text return if @merged_text.empty? @@ -305,7 +305,7 @@ END @merged_text = '' @tab_change = 0 @try_one_liner = false - end + end # Renders a block of text as plain text. # Also checks for an illegally opened block. @@ -343,12 +343,12 @@ END @precompiled << out end end - + # Causes text to be evaluated, and Haml::Helpers#find_and_flatten # to be run on it afterwards. def push_flat_script(text) flush_merged_text - + raise SyntaxError.new("Tag has no content.") if text.empty? push_script(text, true) end @@ -394,7 +394,7 @@ END close_tag = has_conditional ? "" : "-->" push_text(close_tag, -1) end - + # Closes a loud Ruby block. def close_loud(command) push_silent 'end', true @@ -414,7 +414,7 @@ END @haml_comment = false @template_tabs -= 1 end - + # Iterates through the classes and ids supplied through . # and # syntax, and returns a hash with them as attributes, # that can then be merged with another attributes hash. @@ -443,8 +443,8 @@ END # $5 holds the value matched by a string $2 || $5 end - - def parse_static_hash(text) + + def parse_static_hash(text) return {} unless text attributes = {} @@ -466,7 +466,7 @@ END def self.build_attributes(is_html, attr_wrapper, attributes = {}) quote_escape = attr_wrapper == '"' ? """ : "'" other_quote_char = attr_wrapper == '"' ? "'" : '"' - + result = attributes.collect do |attr, value| next if value.nil? @@ -495,7 +495,7 @@ END attributes_string = Precompiler.build_attributes(html?, @options[:attr_wrapper], attributes) "<#{name}#{attributes_string}#{self_close && xhtml? ? ' /' : ''}>" end - + # Parses a line into tag_name, attributes, attributes_hash, object_ref, action, value def parse_tag(line) raise SyntaxError.new("Invalid tag: \"#{line}\"") unless match = line.scan(/[%]([-:\w]+)([-\w\.\#]*)(.*)/)[0] @@ -517,7 +517,7 @@ END # render that tag to @precompiled. def render_tag(line) tag_name, attributes, attributes_hash, object_ref, action, value = parse_tag(line) - + raise SyntaxError.new("Illegal element: classes and ids must have values.") if attributes =~ /[\.#](\.|#|\z)/ preserve_tag = options[:preserve].include?(tag_name) @@ -581,7 +581,7 @@ END @output_tabs += 1 return end - + if parse flush_merged_text push_script(value, preserve_script, tag_name, preserve_tag, escape_html) @@ -599,13 +599,13 @@ END conditional, content = line.scan(COMMENT_REGEX)[0] content.strip! conditional << ">" if conditional - + if @block_opened && !content.empty? raise SyntaxError.new('Illegal Nesting: Nesting within a tag that already has content is illegal.') end open = "" : "-->"}") @@ -619,7 +619,7 @@ END close end end - + # Renders an XHTML doctype or XML shebang. def render_doctype(line) raise SyntaxError.new("Illegal Nesting: Nesting within a header command is illegal.") if @block_opened @@ -639,7 +639,7 @@ END '' else version, type = text.scan(DOCTYPE_REGEX)[0] - + if xhtml? if version == "1.1" '' @@ -660,7 +660,7 @@ END end end end - + # Starts a filtered block. def start_filtered(name) raise SyntaxError.new('Filters must have nested text.') unless @block_opened @@ -723,7 +723,7 @@ END end [spaces, spaces/2] end - + # Pushes value onto @to_close_stack and increases # @template_tabs. def push_and_tabulate(value) diff --git a/lib/haml/template/patch.rb b/lib/haml/template/patch.rb index 8c855eb6..28f63cac 100644 --- a/lib/haml/template/patch.rb +++ b/lib/haml/template/patch.rb @@ -26,7 +26,7 @@ module ActionView def compile_haml(template, file_name, local_assigns) render_symbol = assign_method_name(:haml, template, file_name) locals = local_assigns.keys - + @@template_args[render_symbol] ||= {} locals_keys = @@template_args[render_symbol].keys | locals @@template_args[render_symbol] = locals_keys.inject({}) { |h, k| h[k] = true; h } diff --git a/lib/haml/template/plugin.rb b/lib/haml/template/plugin.rb index df054ddf..af357c82 100644 --- a/lib/haml/template/plugin.rb +++ b/lib/haml/template/plugin.rb @@ -13,7 +13,7 @@ module Haml def compilable? true end - + def line_offset self.class.line_offset end @@ -26,13 +26,13 @@ module Haml options = Haml::Template.options.dup Haml::Engine.new(template, options).send(:precompiled_with_ambles, []) end - + def cache_fragment(block, name = {}, options = nil) @view.fragment_for(block, name, options) do eval("_hamlout.buffer", block.binding) end end - + def read_template_file(template_path, extension) File.read(template_path) end diff --git a/lib/sass.rb b/lib/sass.rb index c8f16e75..3b63ab94 100644 --- a/lib/sass.rb +++ b/lib/sass.rb @@ -11,7 +11,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # and implements various features that are useful # for creating manageable stylesheets. # -# == Features +# == Features # # * Whitespace active # * Well-formatted output @@ -32,9 +32,9 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # # To enable it as a Rails plugin, # then run -# +# # haml --rails path/to/rails/app -# +# # To enable Sass in Merb, # add # @@ -157,12 +157,12 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # # #main # :width 97% -# +# # p, div # :font-size 2em # a # :font-weight bold -# +# # pre # :font-size 3em # @@ -668,7 +668,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # #main { color: #fff; background-color: #000; } # #main p { width: 10em; } # -# .huge { font-size: 10em; font-weight: bold; text-decoration: underline; } +# .huge { font-size: 10em; font-weight: bold; text-decoration: underline; } # # === :compressed # @@ -678,7 +678,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # It's not meant to be human-readable. # For example: # -# #main{color:#fff;background-color:#000}#main p{width:10em}.huge{font-size:10em;font-weight:bold;text-decoration:underline} +# #main{color:#fff;background-color:#000}#main p{width:10em}.huge{font-size:10em;font-weight:bold;text-decoration:underline} # # == Sass Options # @@ -701,7 +701,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # For example: color: #0f3 # or width = !main_width. # By default, either syntax is valid. -# +# # [:never_update] Whether the CSS files should never be updated, # even if the template file changes. # Setting this to true may give small performance gains. @@ -713,7 +713,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # as opposed to only when the template has been modified. # Defaults to false. # Only has meaning within Ruby on Rails or Merb. -# +# # [:always_check] Whether a Sass template should be checked for updates every # time a controller is accessed, # as opposed to only when the Rails server starts. @@ -748,7 +748,7 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) # for Sass templates imported with the "@import" directive. # This defaults to the working directory and, in Rails or Merb, # whatever :template_location is. -# +# module Sass; end require 'sass/engine' diff --git a/lib/sass/constant.rb b/lib/sass/constant.rb index 640371a5..257edf48 100644 --- a/lib/sass/constant.rb +++ b/lib/sass/constant.rb @@ -8,13 +8,13 @@ module Sass # Whitespace characters WHITESPACE = [?\ , ?\t, ?\n, ?\r] - + # The character used to escape values ESCAPE_CHAR = ?\\ # The character used to open and close strings STRING_CHAR = ?" - + # A mapping of syntactically-significant characters # to parsed symbols SYMBOLS = { @@ -32,13 +32,13 @@ module Sass # The regular expression used to parse constants MATCH = /^#{Regexp.escape(CONSTANT_CHAR.chr)}([^\s#{(SYMBOLS.keys + [ ?= ]).map {|c| Regexp.escape("#{c.chr}") }.join}]+)\s*((?:\|\|)?=)\s*(.+)/ - + # First-order operations FIRST_ORDER = [:times, :div, :mod] - + # Second-order operations SECOND_ORDER = [:plus, :minus] - + class << self def parse(value, constants, line) begin @@ -53,21 +53,21 @@ module Sass raise e end end - + private - + def tokenize(value) escaped = false is_string = false beginning_of_token = true str = '' to_return = [] - + reset_str = Proc.new do to_return << str unless str.empty? '' end - + value.each_byte do |byte| unless escaped if byte == ESCAPE_CHAR @@ -97,7 +97,7 @@ module Sass str = reset_str.call next end - + symbol = SYMBOLS[byte] # Adjacent values without an operator should be concatenated @@ -135,28 +135,28 @@ module Sass end end end - + escaped = false beginning_of_token = false str << byte.chr end - + if is_string raise Sass::SyntaxError.new("Unterminated string: #{value.dump}") end str = reset_str.call to_return end - + def parenthesize(value) parenthesize_helper(0, value, value.length)[0] end - + def parenthesize_helper(i, value, value_len, return_after_expr = false) to_return = [] beginning = i token = value[i] - + while i < value_len && token != :close if token == :open to_return.push(*value[beginning...i]) @@ -194,13 +194,13 @@ module Sass else i += 1 end - + token = value[i] end to_return.push(*value[beginning...i]) return to_return, i + 1 end - + #-- # TODO: Don't pass around original value; # have Constant.parse automatically add it to exception. @@ -234,7 +234,7 @@ module Sass end end end - + def get_constant(value, constants) to_return = constants[value] raise SyntaxError.new("Undefined constant: \"!#{value}\"") unless to_return diff --git a/lib/sass/constant/color.rb b/lib/sass/constant/color.rb index db59a975..473023cf 100644 --- a/lib/sass/constant/color.rb +++ b/lib/sass/constant/color.rb @@ -21,9 +21,9 @@ module Sass::Constant # :nodoc: 'teal' => 0x008080, 'aqua' => 0x00ffff } - + REGEXP = /\##{"([0-9a-fA-F]{1,2})" * 3}/ - + def parse(value) if (value =~ REGEXP) @value = value.scan(REGEXP)[0].map { |num| num.ljust(2, num).to_i(16) } @@ -32,7 +32,7 @@ module Sass::Constant # :nodoc: @value = (0..2).map{ |n| color >> (n << 3) & 0xff }.reverse end end - + def plus(other) if other.is_a? Sass::Constant::String Sass::Constant::String.from_value(self.to_s + other.to_s) @@ -40,7 +40,7 @@ module Sass::Constant # :nodoc: piecewise(other, :+) end end - + def minus(other) if other.is_a? Sass::Constant::String raise NoMethodError.new(nil, :minus) @@ -48,7 +48,7 @@ module Sass::Constant # :nodoc: piecewise(other, :-) end end - + def times(other) if other.is_a? Sass::Constant::String raise NoMethodError.new(nil, :times) @@ -56,7 +56,7 @@ module Sass::Constant # :nodoc: piecewise(other, :*) end end - + def div(other) if other.is_a? Sass::Constant::String raise NoMethodError.new(nil, :div) @@ -64,7 +64,7 @@ module Sass::Constant # :nodoc: piecewise(other, :/) end end - + def mod(other) if other.is_a? Sass::Constant::String raise NoMethodError.new(nil, :mod) @@ -72,24 +72,24 @@ module Sass::Constant # :nodoc: piecewise(other, :%) end end - + def to_s red, green, blue = @value.map { |num| num.to_s(16).rjust(2, '0') } "##{red}#{green}#{blue}" end - + protected - + def self.filter_value(value) value.map { |num| num.to_i } end - + private - + def piecewise(other, operation) other_num = other.is_a? Number other_val = other.value - + rgb = [] for i in (0...3) res = @value[i].send(operation, other_num ? other_val : other_val[i]) diff --git a/lib/sass/constant/literal.rb b/lib/sass/constant/literal.rb index 34fbced9..cb9df479 100644 --- a/lib/sass/constant/literal.rb +++ b/lib/sass/constant/literal.rb @@ -13,7 +13,7 @@ class Sass::Constant::Literal # :nodoc: # The regular expression matching colors. COLOR = /^\# (?: [\da-f]{3} | [\da-f]{6} ) | #{html_color_matcher}/ix - + def self.parse(value) case value when NUMBER @@ -24,11 +24,11 @@ class Sass::Constant::Literal # :nodoc: Sass::Constant::String.new(value) end end - + def initialize(value = nil) self.parse(value) if value end - + def perform self end @@ -36,15 +36,15 @@ class Sass::Constant::Literal # :nodoc: def concat(other) Sass::Constant::String.from_value("#{self.to_s} #{other.to_s}") end - + attr_reader :value - + protected - + def self.filter_value(value) value end - + def self.from_value(value) instance = self.new instance.instance_variable_set('@value', self.filter_value(value)) diff --git a/lib/sass/constant/number.rb b/lib/sass/constant/number.rb index d822f13b..59cf3851 100644 --- a/lib/sass/constant/number.rb +++ b/lib/sass/constant/number.rb @@ -10,7 +10,7 @@ module Sass::Constant # :nodoc: @value = first.empty? ? second.to_i : "#{first}#{second}".to_f @unit = unit unless unit.empty? end - + def plus(other) if other.is_a? Number operate(other, :+) @@ -20,7 +20,7 @@ module Sass::Constant # :nodoc: Sass::Constant::String.from_value(self.to_s + other.to_s) end end - + def minus(other) if other.is_a? Number operate(other, :-) @@ -28,7 +28,7 @@ module Sass::Constant # :nodoc: raise NoMethodError.new(nil, :minus) end end - + def times(other) if other.is_a? Number operate(other, :*) @@ -38,7 +38,7 @@ module Sass::Constant # :nodoc: raise NoMethodError.new(nil, :times) end end - + def div(other) if other.is_a? Number operate(other, :/) @@ -46,7 +46,7 @@ module Sass::Constant # :nodoc: raise NoMethodError.new(nil, :div) end end - + def mod(other) if other.is_a? Number operate(other, :%) @@ -54,13 +54,13 @@ module Sass::Constant # :nodoc: raise NoMethodError.new(nil, :mod) end end - + def to_s value = @value value = value.to_i if value % 1 == 0.0 "#{value}#{@unit}" end - + protected def self.from_value(value, unit=nil) @@ -68,7 +68,7 @@ module Sass::Constant # :nodoc: instance.instance_variable_set('@unit', unit) instance end - + def operate(other, operation) unit = nil if other.unit.nil? diff --git a/lib/sass/constant/operation.rb b/lib/sass/constant/operation.rb index 3033af50..20adc45d 100644 --- a/lib/sass/constant/operation.rb +++ b/lib/sass/constant/operation.rb @@ -9,13 +9,13 @@ module Sass::Constant # :nodoc: @operand2 = operand2 @operator = operator end - + def to_s self.perform.to_s end - + protected - + def perform literal1 = @operand1.perform literal2 = @operand2.perform diff --git a/lib/sass/constant/string.rb b/lib/sass/constant/string.rb index f8e00a60..ea638311 100644 --- a/lib/sass/constant/string.rb +++ b/lib/sass/constant/string.rb @@ -2,11 +2,11 @@ require 'sass/constant/literal' module Sass::Constant # :nodoc: class String < Literal # :nodoc: - + def parse(value) @value = value end - + def plus(other) Sass::Constant::String.from_value(self.to_s + other.to_s) end @@ -14,7 +14,7 @@ module Sass::Constant # :nodoc: def funcall(other) Sass::Constant::String.from_value("#{self.to_s}(#{other.to_s})") end - + def to_s @value end diff --git a/lib/sass/css.rb b/lib/sass/css.rb index f9a3e5bf..94f73f22 100644 --- a/lib/sass/css.rb +++ b/lib/sass/css.rb @@ -105,7 +105,7 @@ module Sass build_tree.to_sass rescue Exception => err line = @template.string[0...@template.pos].split("\n").size - + err.backtrace.unshift "(css):#{line}" raise err end @@ -164,12 +164,12 @@ module Sass whitespace assert_match /:/ - + value = '' while @template.scan(/[^;\s\}]+/) value << @template[0] << whitespace end - + assert_match /(;|(?=\}))/ rule << Tree::AttrNode.new(name, value, nil) end @@ -244,7 +244,7 @@ module Sass # color: red # baz # color: blue - # + # def nest_rules(root) rules = OrderedHash.new root.children.select { |c| Tree::RuleNode === c }.each do |child| @@ -274,7 +274,7 @@ module Sass # # foo bar baz # color: red - # + # def flatten_rules(root) root.children.each { |child| flatten_rule(child) if child.is_a?(Tree::RuleNode) } end diff --git a/lib/sass/engine.rb b/lib/sass/engine.rb index 683733e0..489c6ce0 100755 --- a/lib/sass/engine.rb +++ b/lib/sass/engine.rb @@ -39,7 +39,7 @@ module Sass # The character used to denote a compiler directive. DIRECTIVE_CHAR = ?@ - + # Designates a non-parsed rule. ESCAPE_CHAR = ?\\ diff --git a/lib/sass/plugin/merb.rb b/lib/sass/plugin/merb.rb index 93e7e00e..f85209f4 100644 --- a/lib/sass/plugin/merb.rb +++ b/lib/sass/plugin/merb.rb @@ -15,13 +15,13 @@ unless defined?(Sass::MERB_LOADED) :always_check => env != "production", :full_exception => env != "production") config = Merb::Plugins.config[:sass] || Merb::Plugins.config["sass"] || {} - + if defined? config.symbolize_keys! config.symbolize_keys! end Sass::Plugin.options.merge!(config) - + if version[0] > 0 || version[1] >= 9 class Merb::Rack::Application # :nodoc: diff --git a/lib/sass/plugin/rails.rb b/lib/sass/plugin/rails.rb index b4e17fe5..dd3b4adb 100644 --- a/lib/sass/plugin/rails.rb +++ b/lib/sass/plugin/rails.rb @@ -5,7 +5,7 @@ unless defined?(Sass::RAILS_LOADED) :css_location => RAILS_ROOT + '/public/stylesheets', :always_check => RAILS_ENV != "production", :full_exception => RAILS_ENV != "production") - + # :stopdoc: module ActionController class Base diff --git a/lib/sass/tree/attr_node.rb b/lib/sass/tree/attr_node.rb index d75e62f6..9c04226b 100644 --- a/lib/sass/tree/attr_node.rb +++ b/lib/sass/tree/attr_node.rb @@ -3,12 +3,12 @@ require 'sass/tree/node' module Sass::Tree class AttrNode < ValueNode attr_accessor :name - + def initialize(name, value, style) @name = name super(value, style) end - + def to_s(tabs, parent_name = nil) if value[-1] == ?; raise Sass::SyntaxError.new("Invalid attribute: #{declaration.dump} (This isn't CSS!)", @line) @@ -34,7 +34,7 @@ module Sass::Tree children.each do |kid| to_return << "#{kid.to_s(tabs, real_name)}" << join_string end - + (@style == :compressed && parent_name) ? to_return : to_return[0...-1] end diff --git a/lib/sass/tree/node.rb b/lib/sass/tree/node.rb index 037e68d4..cf536d3c 100644 --- a/lib/sass/tree/node.rb +++ b/lib/sass/tree/node.rb @@ -16,7 +16,7 @@ module Sass end @children << child end - + def to_s result = String.new children.each do |child| diff --git a/lib/sass/tree/rule_node.rb b/lib/sass/tree/rule_node.rb index ca499b4f..37a8d47f 100644 --- a/lib/sass/tree/rule_node.rb +++ b/lib/sass/tree/rule_node.rb @@ -21,7 +21,7 @@ module Sass::Tree def continued? rule[-1] == ?, end - + def to_s(tabs, super_rules = nil) attributes = [] sub_rules = [] @@ -52,7 +52,7 @@ module Sass::Tree per_rule_indent + r.gsub(/,$/, '').gsub(rule_split, rule_separator).rstrip end.join(line_separator) end - + children.each do |child| if child.is_a? RuleNode sub_rules << child @@ -60,7 +60,7 @@ module Sass::Tree attributes << child end end - + to_return = '' if !attributes.empty? old_spaces = ' ' * (tabs - 1) @@ -77,7 +77,7 @@ module Sass::Tree to_return << "#{total_rule} {\n#{attributes}#{end_attrs}}\n" end end - + tabs += 1 unless attributes.empty? || @style != :nested sub_rules.each do |sub| to_return << sub.to_s(tabs, total_rule) diff --git a/lib/sass/tree/value_node.rb b/lib/sass/tree/value_node.rb index e7b43d90..b6a30051 100644 --- a/lib/sass/tree/value_node.rb +++ b/lib/sass/tree/value_node.rb @@ -3,7 +3,7 @@ require 'sass/tree/node' module Sass::Tree class ValueNode < Node attr_accessor :value - + def initialize(value, style) @value = value super(style)