def replace_abbreviations(el, regexps = nil)
return if @root.options[:abbrev_defs].empty?
if !regexps
regexps = [Regexp.union(*@root.options[:abbrev_defs].keys.map {|k| /#{Regexp.escape(k)}/})]
regexps << /(?=(?:\W|^)#{regexps.first}(?!\w))/
end
el.children.map! do |child|
if child.type == :text
if child.value =~ regexps.first
result = []
strscan = StringScanner.new(child.value)
while temp = strscan.scan_until(regexps.last)
temp << strscan.scan(/\W|^/)
abbr = strscan.scan(regexps.first)
result << Element.new(:text, temp) << Element.new(:abbreviation, abbr)
end
result << Element.new(:text, strscan.rest)
else
child
end
else
replace_abbreviations(child, regexps)
child
end
end.flatten!
end