Olá. Só quero compartilhar minha solução.
Quanto aos problemas com as citações. Como eu disse antes, eu estava enfrentando problemas - regexp não captura citações então:
- nome de usuário e ID da postagem podem estar entre aspas duplas
- citações aninhadas
Decidi fazer uma busca e substituição usando uma lógica diferente. Em vez de procurar por tags e seus conteúdos, usei uma expressão regular que procura apenas por tags:
era:
raw.gsub!(%r{\\[quote=\"?([^;]+);(\\d+)\"?\\](.+?)\\[\\/quote\\]}im) do
tornou-se:
raw.gsub!(%r{(\\[QUOTE(=\"?([^;]+);(\\d+)\"?)?\\])|(\\[\\/QUOTE\\])}im) do
e então mudei um pouco a determinação da origem de uma citação:
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
Também mudei o código do spoiler. Em vez de:
# [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
raw.gsub!(%r{\\[spoiler=\"?(.+?)\"?\\](.+?)\\[/spoiler\\]}im) do
"\n#{$1}\n[spoiler]#{$2}[/spoiler]\n"
end
que desfoca o texto, eu o converto para a tag de detalhes:
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
Porque acontece que no mundo vbulletin - spoiler não é o conteúdo desfocado, mas sim o conteúdo colapsado. Então eu acho que é muito mais apropriado para o script de importação vbulletin converter spoilers em detalhes em vez de spoiler desfocado.
Também notei a tag de menção. No meu caso, no vbulletin, as menções pareciam assim:
[mention=XXX]username[/mention]
A expressão regular usada no script não leva em conta que a tag pode conter o ID do usuário.
# [MENTION]<username>[/MENTION]
raw.gsub!(%r{\\[mention\\](.+?)\\[/mention\\]}i) do
new_username = get_username_for_old_username($1)
"@#{new_username}"
end
Eu corrigi isso do meu jeito também:
# [MENTION]<username>[/MENTION]
raw.gsub!(%r{\\[mention(=\\d+)?\\](.+?)\\[/mention\\]}i) do
new_username = get_username_for_old_username($2)
"@#{new_username}"
end


