mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
Only apply textarea fix to textareas; refactor
Textareas are the only preserved tag that is editable, so we don't need to recode the newline for <pre> or <code> tags. With this and the last few preceding commits we bring Haml 4.x's performance nearly back in line with Haml 3.1.4. Haml 3.1.4: user system total real compiled haml pretty 0.330000 0.000000 0.330000 ( 0.332720) compiled haml ugly 0.180000 0.000000 0.180000 ( 0.173543) cached haml pretty 0.740000 0.000000 0.740000 ( 0.740294) cached haml ugly 0.490000 0.000000 0.490000 ( 0.497688) Haml 3.1.8: user system total real compiled haml pretty 0.600000 0.000000 0.600000 ( 0.605575) compiled haml ugly 0.210000 0.000000 0.210000 ( 0.210508) cached haml pretty 1.240000 0.010000 1.250000 ( 1.256737) cached haml ugly 0.520000 0.000000 0.520000 ( 0.527566) Haml 4.0.0: user system total real compiled haml pretty 0.720000 0.000000 0.720000 ( 0.754891) compiled haml ugly 0.300000 0.000000 0.300000 ( 0.296439) cached haml pretty 1.300000 0.000000 1.300000 ( 1.301510) cached haml ugly 0.570000 0.000000 0.570000 ( 0.578155) This commit: user system total real compiled haml pretty 0.430000 0.010000 0.440000 ( 0.429153) compiled haml ugly 0.220000 0.000000 0.220000 ( 0.220758) cached haml pretty 0.810000 0.000000 0.810000 ( 0.809804) cached haml ugly 0.510000 0.000000 0.510000 ( 0.516821)
This commit is contained in:
parent
b1d8cc3b93
commit
2efd12f27e
3 changed files with 27 additions and 37 deletions
|
@ -156,9 +156,7 @@ module Haml
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if ugly %>
|
<% if ugly %>
|
||||||
if toplevel?
|
fix_textareas!(result, nil) if toplevel? && result.include?('<textarea')
|
||||||
result = Haml::Helpers.fix_preserved_whitespace(result, nil, options)
|
|
||||||
end
|
|
||||||
return result
|
return result
|
||||||
<% else %>
|
<% else %>
|
||||||
<% if !(in_tag && preserve_tag && !nuke_inner_whitespace) %>
|
<% if !(in_tag && preserve_tag && !nuke_inner_whitespace) %>
|
||||||
|
@ -186,9 +184,7 @@ module Haml
|
||||||
<% if in_tag && !nuke_inner_whitespace %> result = tabs(tabulation) + result <% end %>
|
<% if in_tag && !nuke_inner_whitespace %> result = tabs(tabulation) + result <% end %>
|
||||||
end
|
end
|
||||||
|
|
||||||
if toplevel?
|
fix_textareas!(result, tabs(tabulation)) if toplevel? && result.include?('<textarea')
|
||||||
result = Haml::Helpers.fix_preserved_whitespace(result, tabs(tabulation), options)
|
|
||||||
end
|
|
||||||
|
|
||||||
<% if in_tag && !nuke_inner_whitespace %>
|
<% if in_tag && !nuke_inner_whitespace %>
|
||||||
result = "\\n\#{result}\\n\#{tabs(tabulation-1)}"
|
result = "\\n\#{result}\\n\#{tabs(tabulation-1)}"
|
||||||
|
@ -265,6 +261,29 @@ RUBY
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# Works like #{find_and_preserve}, but allows the first newline after a
|
||||||
|
# preserved opening tag to remain unencoded, and then outdents the content.
|
||||||
|
# This change was motivated primarily by the change in Rails 3.2.3 to emit
|
||||||
|
# a newline after textarea helpers.
|
||||||
|
#
|
||||||
|
# @param input [String] The text to process
|
||||||
|
# @param tabs [String] The tabs provided by the Haml::Buffer
|
||||||
|
# @param options [Hash] The options hash provided by the Haml::Buffer
|
||||||
|
# @since Haml 4.0.1
|
||||||
|
# @private
|
||||||
|
def fix_textareas!(input, tabs)
|
||||||
|
pattern = /([ ]*)<(textarea)([^>]*)>(\n|
)(.*?)(<\/\2>)/im
|
||||||
|
input.gsub!(pattern) do |s|
|
||||||
|
match = pattern.match(s)
|
||||||
|
content = match[5]
|
||||||
|
unless tabs.nil?
|
||||||
|
content.sub!(match[1].to_s, '')
|
||||||
|
content.sub!(tabs, '')
|
||||||
|
end
|
||||||
|
"#{match[1]}<#{match[2]}#{match[3]}>\n#{content}</#{match[2]}>"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if RUBY_VERSION < "1.9"
|
if RUBY_VERSION < "1.9"
|
||||||
def new_encoded_string
|
def new_encoded_string
|
||||||
""
|
""
|
||||||
|
|
|
@ -113,33 +113,6 @@ MESSAGE
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Works like #{find_and_preserve}, but allows the first newline after a
|
|
||||||
# preserved opening tag to remain unencoded, and then outdents the content.
|
|
||||||
# This change was motivated primarily by the change in Rails 3.2.3 to emit
|
|
||||||
# a newline after textarea helpers.
|
|
||||||
#
|
|
||||||
# There's no reason this should be part of the public API provided by Haml
|
|
||||||
# and is here only for uniformity with the other helpers' locations. In a
|
|
||||||
# future version of Haml this will likely be moved into Haml::Buffer, so
|
|
||||||
# use it at your own risk.
|
|
||||||
#
|
|
||||||
# @param input [String] The text to process
|
|
||||||
# @param tabs [String] The tabs provided by the Haml::Buffer
|
|
||||||
# @param options [Hash] The options hash provided by the Haml::Buffer
|
|
||||||
# @since Haml 4.0.1
|
|
||||||
# @private
|
|
||||||
def fix_preserved_whitespace(input, tabs, options)
|
|
||||||
input.gsub(options[:retab_pattern]) do |s|
|
|
||||||
match = options[:retab_pattern].match(s)
|
|
||||||
content = match[5]
|
|
||||||
unless tabs.nil?
|
|
||||||
content.sub!(match[1].to_s, '')
|
|
||||||
content.sub!(tabs, '')
|
|
||||||
end
|
|
||||||
"#{match[1]}<#{match[2]}#{match[3]}>\n#{content}</#{match[2]}>"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Takes any string, finds all the newlines, and converts them to
|
# Takes any string, finds all the newlines, and converts them to
|
||||||
# HTML entities so they'll render correctly in
|
# HTML entities so they'll render correctly in
|
||||||
# whitespace-sensitive tags without screwing up the indentation.
|
# whitespace-sensitive tags without screwing up the indentation.
|
||||||
|
|
|
@ -261,9 +261,7 @@ module Haml
|
||||||
#
|
#
|
||||||
# @return [{Symbol => Object}] The options hash
|
# @return [{Symbol => Object}] The options hash
|
||||||
def for_buffer
|
def for_buffer
|
||||||
options_for_buffer = {}
|
self.class.buffer_option_keys.inject({}) do |hash, key|
|
||||||
options_for_buffer[:retab_pattern] = /([ ]*)<(#{preserve.map(&Regexp.method(:escape)).join('|')})([^>]*)>(\n|
)(.*?)(<\/\2>)/im
|
|
||||||
self.class.buffer_option_keys.inject(options_for_buffer) do |hash, key|
|
|
||||||
hash[key] = send(key)
|
hash[key] = send(key)
|
||||||
hash
|
hash
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue