class Kramdown::Parser::Kramdown
def replace_abbreviations(el, regexps = nil)
def replace_abbreviations(el, regexps = nil) return if @root.options[:abbrev_defs].empty? if !regexps sorted_abbrevs = @root.options[:abbrev_defs].keys.sort {|a,b| b.length <=> a.length} regexps = [Regexp.union(*sorted_abbrevs.map {|k| /#{Regexp.escape(k)}/})] regexps << /(?=(?:\W|^)#{regexps.first}(?!\w))/ # regexp should only match on word boundaries end el.children.map! do |child| if child.type == :text if child.value =~ regexps.first result = [] strscan = Kramdown::Utils::StringScanner.new(child.value, child.options[:location]) text_lineno = strscan.current_line_number while temp = strscan.scan_until(regexps.last) abbr_lineno = strscan.current_line_number abbr = strscan.scan(regexps.first) # begin of line case of abbr with \W char as first one if abbr.nil? temp << strscan.scan(/\W|^/) abbr = strscan.scan(regexps.first) end result << Element.new(:text, temp, nil, :location => text_lineno) result << Element.new(:abbreviation, abbr, nil, :location => abbr_lineno) text_lineno = strscan.current_line_number end result << Element.new(:text, strscan.rest, nil, :location => text_lineno) else child end else replace_abbreviations(child, regexps) child end end.flatten! end