Привет. Просто хочу поделиться своим решением.
Что касается проблем с кавычками. Как я уже говорил, я сталкивался с проблемами — регулярное выражение не захватывало кавычки, когда:
- имя пользователя и ID поста могли быть заключены в двойные кавычки
- были вложенные кавычки
Я решил выполнить поиск и замену с использованием другой логики. Вместо поиска тегов и их содержимого я использовал регулярное выражение, которое ищет только теги:
было:
raw.gsub!(%r{\[quote="?([^;]+);(\d+)"?\](.+?)\[\/quote\]}im) do
стало:
raw.gsub!(%r{(\[QUOTE(="?([^;]+);(\d+)"?)?\])|(\[\/QUOTE\])}im) do
а затем немного изменил определение источника цитаты:
if $3 && $4
if topic_lookup = topic_lookup_from_imported_post_id(post_id)
post_number = topic_lookup[:post_number]
topic_id = topic_lookup[:topic_id]
"\n[quote=\"#{new_username},post:#{post_number},topic:#{topic_id}\"]\n"
else
"\n[quote=\"#{new_username}\"]\n"
end
elsif $5
"\n[/quote]\n"
end
Также я изменил код для спойлеров. Вместо:
# [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
raw.gsub!(%r{\[spoiler="?(.+?)"?\](.+?)\[/spoiler\]}im) do
"\n#{$1}\n[spoiler]#{$2}[/spoiler]\n"
end
который размывал текст, я конвертировал его в тег details:
raw.gsub!(%r{(\[spoiler(="?(.*?)"?)?\])|(\[\/spoiler\])}im) do
if $3
"\n[details=#{$3}]\n"
elsif $1
"\n[details]\n"
elsif $4
"\n[/details]\n"
end
end
Дело в том, что в мире vBulletin спойлер — это не размытый контент, а скорее свернутый. Поэтому я считаю, что для скрипта импорта из vBulletin гораздо уместнее конвертировать спойлеры в details, а не в размытый спойлер.
Я также заметил тег упоминаний. В моем случае в vBulletin упоминания выглядели так:
[mention=XXX]username[/mention]
Регулярное выражение, используемое в скрипте, не учитывает, что тег может содержать ID пользователя.
# [MENTION]<username>[/MENTION]
raw.gsub!(%r{\[mention\](.+?)\[/mention\]}i) do
new_username = get_username_for_old_username($1)
"@#{new_username}"
end
Я исправил это по-своему:
# [MENTION]<username>[/MENTION]
raw.gsub!(%r{\[mention(=\d+)?\](.+?)\[/mention\]}i) do
new_username = get_username_for_old_username($2)
"@#{new_username}"
end


