From 01219eaf55c1c92c1b3070c83c5549898b301d26 Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Thu, 8 May 2014 21:35:26 -0500 Subject: [PATCH] Unpantsed: a 40% speedup --- lib/maruku.rb | 1 - lib/maruku/input/parse_span.rb | 97 +++++++++++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/lib/maruku.rb b/lib/maruku.rb index 2038374..f7eb6be 100644 --- a/lib/maruku.rb +++ b/lib/maruku.rb @@ -89,7 +89,6 @@ class Maruku < MaRuKu::MDDocument; end # Code for parsing Markdown span-level elements require 'maruku/input/charsource' require 'maruku/input/parse_span' -require 'maruku/input/rubypants' require 'maruku/input/extensions' diff --git a/lib/maruku/input/parse_span.rb b/lib/maruku/input/parse_span.rb index b914608..dd82444 100644 --- a/lib/maruku/input/parse_span.rb +++ b/lib/maruku/input/parse_span.rb @@ -22,14 +22,16 @@ def parse_span(string, parent=nil) def read_span(src, escaped, exit_on_chars=nil, exit_on_strings=nil) escaped = Array(escaped) con = SpanContext.new - c = d = nil + dquote_state = squote_state = :closed + c = d = prev_char = nil while true c = src.cur_char # This is only an optimization which cuts 50% of the time used. # (but you can't use a-zA-z in exit_on_chars) - if c && c =~ /a-zA-Z0-9/ + if c && c =~ /[[:alnum:]]/ con.push_char src.shift_char + prev_char = c next end @@ -49,7 +51,21 @@ def read_span(src, escaped, exit_on_chars=nil, exit_on_strings=nil) if src.cur_chars_are " \n" src.ignore_chars(3) con.push_element md_br + prev_char = ' ' next + elsif src.cur_chars_are ' >>' # closing guillemettes + src.ignore_chars(3) + con.push_element md_entity('nbsp') + con.push_element md_entity('raquo') + elsif src.cur_chars(5) =~ / '\d\ds/ # special case: '80s + src.ignore_chars(2) + con.push_space + con.push_element md_entity('rsquo') + elsif src.cur_chars_are " '" # opening single-quote + src.ignore_chars(2) + con.push_space + con.push_element md_entity('lsquo') + squote_state = :open else src.ignore_char con.push_space @@ -70,9 +86,14 @@ def read_span(src, escaped, exit_on_chars=nil, exit_on_strings=nil) case d = src.next_char when '<' # guillemettes - src.ignore_chars(2) - con.push_char '<' - con.push_char '<' + if src.cur_chars_are '<< ' + src.ignore_chars(3) + con.push_element md_entity('laquo') + con.push_element md_entity('nbsp') + else + src.ignore_chars(2) + con.push_element md_entity('laquo') + end when '!' if src.cur_chars_are '