92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env ruby
 | 
						|
# frozen_string_literal: true
 | 
						|
 | 
						|
# For pull request: https://github.com/jekyll/jekyll/pull/8192
 | 
						|
 | 
						|
require 'benchmark/ips'
 | 
						|
require 'bundler/setup'
 | 
						|
require 'memory_profiler'
 | 
						|
require 'jekyll'
 | 
						|
 | 
						|
CONTEXT = {"bar"=>"The quick brown fox"}
 | 
						|
MARKUP_1 = %Q(foo=bar lorem="ipsum \\"dolor\\"" alpha='beta \\'gamma\\'').freeze
 | 
						|
MARKUP_2 = %Q(foo=bar lorem="ipsum 'dolor'" alpha='beta "gamma"').freeze
 | 
						|
 | 
						|
#
 | 
						|
 | 
						|
def old_parse_params(markup)
 | 
						|
  params = {}
 | 
						|
 | 
						|
  while (match = Jekyll::Tags::IncludeTag::VALID_SYNTAX.match(markup))
 | 
						|
    markup = markup[match.end(0)..-1]
 | 
						|
 | 
						|
    value = if match[2]
 | 
						|
              match[2].gsub('\\"', '"')
 | 
						|
            elsif match[3]
 | 
						|
              match[3].gsub("\\'", "'")
 | 
						|
            elsif match[4]
 | 
						|
              CONTEXT[match[4]]
 | 
						|
            end
 | 
						|
 | 
						|
    params[match[1]] = value
 | 
						|
  end
 | 
						|
  params
 | 
						|
end
 | 
						|
 | 
						|
def new_parse_params(markup)
 | 
						|
  params = {}
 | 
						|
  markup.scan(Jekyll::Tags::IncludeTag::VALID_SYNTAX) do |key, d_quoted, s_quoted, variable|
 | 
						|
    value = if d_quoted
 | 
						|
              d_quoted.include?('\\"') ? d_quoted.gsub('\\"', '"') : d_quoted
 | 
						|
            elsif s_quoted
 | 
						|
              s_quoted.include?("\\'") ? s_quoted.gsub("\\'", "'") : s_quoted
 | 
						|
            elsif variable
 | 
						|
              CONTEXT[variable]
 | 
						|
            end
 | 
						|
 | 
						|
    params[key] = value
 | 
						|
  end
 | 
						|
  params
 | 
						|
end
 | 
						|
 | 
						|
#
 | 
						|
 | 
						|
def report(label, markup, color)
 | 
						|
  prof_report = MemoryProfiler.report { yield }
 | 
						|
 | 
						|
  allocated_memory  = prof_report.scale_bytes(prof_report.total_allocated_memsize)
 | 
						|
  allocated_objects = prof_report.total_allocated
 | 
						|
  retained_memory   = prof_report.scale_bytes(prof_report.total_retained_memsize)
 | 
						|
  retained_objects  = prof_report.total_retained
 | 
						|
 | 
						|
  puts <<~MSG.send(color)
 | 
						|
    #{(label + " ").ljust(49, "-")}
 | 
						|
 | 
						|
    MARKUP: #{markup}
 | 
						|
    RESULT: #{yield}
 | 
						|
 | 
						|
    Total allocated: #{allocated_memory} (#{allocated_objects} objects)
 | 
						|
    Total retained:  #{retained_memory} (#{retained_objects} objects)
 | 
						|
  MSG
 | 
						|
end
 | 
						|
 | 
						|
report('old w/ escaping', MARKUP_1, :magenta) { old_parse_params(MARKUP_1) }
 | 
						|
report('new w/ escaping', MARKUP_1, :cyan)    { new_parse_params(MARKUP_1) }
 | 
						|
 | 
						|
report('old no escaping', MARKUP_2, :green)  { old_parse_params(MARKUP_2) }
 | 
						|
report('new no escaping', MARKUP_2, :yellow) { new_parse_params(MARKUP_2) }
 | 
						|
 | 
						|
#
 | 
						|
 | 
						|
Benchmark.ips do |x|
 | 
						|
  x.report("old + esc".magenta) { old_parse_params(MARKUP_1) }
 | 
						|
  x.report("new + esc".cyan)    { new_parse_params(MARKUP_1) }
 | 
						|
  x.compare!
 | 
						|
end
 | 
						|
 | 
						|
Benchmark.ips do |x|
 | 
						|
  x.report("old - esc".green)  { old_parse_params(MARKUP_2) }
 | 
						|
  x.report("new - esc".yellow) { new_parse_params(MARKUP_2) }
 | 
						|
  x.compare!
 | 
						|
end
 |