Я хочу добавить уценку к ключевым фразам на вики-странице (gollum), которая будет ссылаться на соответствующую вики-страницу в форме:
This is the key phrase.
становится
This is the [[key phrase|Glossary#key phrase]].
У меня есть список ключевых фраз, таких как:
keywords = ["golden retriever", "pomeranian", "cat"]
И документ:
Sue has 1 golden retriever. John has two cats.
Jennifer has one pomeranian. Joe has three pomeranians.
Я хочу перебрать каждую строку и найти каждое совпадение (которое еще не является ссылкой) для каждого ключевого слова. Моя текущая попытка выглядит так:
File.foreach(target_file) do |line|
glosses.each do |gloss|
len = gloss.length
# Create the regex. Avoid anything that starts with [
# or (, ends with ] or ), and ignore case.
re = /(?<![\[\(])#{gloss}(?![\]\)])/i
# Find every instance of this gloss on this line.
positions = line.enum_for(:scan, re).map {Regexp.last_match.begin(0) }
positions.each do |pos|
line.insert(pos, "[[")
# +2 because we just inserted 2 ahead.
line.insert(pos+len+2, "|#{page}\##{gloss}]]")
end
end
puts line
end
Однако это столкнется с проблемой, если в одной строке есть два совпадения для одной и той же ключевой фразы. Поскольку я вставляю элементы в строку, позиция, которую я нашел для каждого совпадения, не является точной после первого. Я знаю, что могу каждый раз корректировать размер своих вставок, но, поскольку мои вставки имеют разный размер для каждого глянца, это кажется самым грубым, хакерским решением.
Есть ли решение, которое позволяет мне делать несколько вставок в одну и ту же строку одновременно без нескольких произвольных корректировок каждый раз?