diff --git a/script/import_scripts/smf2.rb b/script/import_scripts/smf2.rb index 611dabc81bf..3d1f69adbfe 100644 --- a/script/import_scripts/smf2.rb +++ b/script/import_scripts/smf2.rb @@ -259,7 +259,7 @@ class ImportScripts::Smf2 < ImportScripts::Base tags.each do |tag| post = tag.post Post.transaction do - post.raw = convert_quotes(post.raw) + post.raw = convert_bbcode(post.raw) post.rebake! post.save tag.destroy! @@ -320,8 +320,8 @@ class ImportScripts::Smf2 < ImportScripts::Base end body.gsub!(XListPattern) do |s| r = +"\n[ul]" - s.lines.each { |l| r << '[li]' << l.strip.sub(/^\[x\]\s*/, '') << '[/li]' } - r << "[/ul]\n" + s.lines.each { |l| "#{r}[li]#{l.strip.sub(/^\[x\]\s*/, '')}[/li]" } + "#{r}[/ul]\n" end if attachments.present? @@ -336,16 +336,16 @@ class ImportScripts::Smf2 < ImportScripts::Base end end if use_count.keys.length < attachments.select(&:present?).length - body << "\n\n---" + body = "#{body}\n\n---" attachments.each_with_index do |upload, num| if upload.present? && use_count[num] == (0) - body << ("\n\n" + get_upload_markdown(upload)) + "#{body}\n\n#{get_upload_markdown(upload)}" end end end end - opts[:ignore_quotes] ? body : convert_quotes(body) + opts[:ignore_quotes] ? body : convert_bbcode(body) end def get_upload_markdown(upload) @@ -357,25 +357,96 @@ class ImportScripts::Smf2 < ImportScripts::Base inner = $~[:inner].strip params = parse_tag_params($~[:params]) if params['author'].present? - quote = +"[quote=\"#{params['author']}" + quote = +"\n[quote=\"#{params['author']}" if QuoteParamsPattern =~ params['link'] tl = topic_lookup_from_imported_post_id($~[:msg].to_i) - quote << ", post:#{tl[:post_number]}, topic:#{tl[:topic_id]}" if tl + quote = "#{quote} post:#{tl[:post_number]}, topic:#{tl[:topic_id]}" if tl end - quote << "\"]#{convert_quotes(inner)}[/quote]" + quote = "#{quote}\"]\n#{convert_quotes(inner)}\n[/quote]" else "
#{convert_quotes(inner)}
" end end end + def convert_bbcode(raw) + return "" if raw.blank? + + raw = convert_quotes(raw) + + # [acronym] + raw.gsub!(/\[acronym=([^\]]+)\](.*?)\[\/acronym\]/im) { %{#{$2}} } + + # [br] + raw.gsub!(/\[br\]/i, "\n") + raw.gsub!(//i, "\n") + # [hr] + raw.gsub!(/\[hr\]/i, "
") + + # [sub] + raw.gsub!(/\[sub\](.*?)\[\/sub\]/im) { "#{$1}" } + # [sup] + raw.gsub!(/\[sup\](.*?)\[\/sup\]/im) { "#{$1}" } + + # [html] + raw.gsub!(/\[html\]/i, "\n```html\n") + raw.gsub!(/\[\/html\]/i, "\n```\n") + + # [php] + raw.gsub!(/\[php\]/i, "\n```php\n") + raw.gsub!(/\[\/php\]/i, "\n```\n") + + # [code] + raw.gsub!(/\[\/?code\]/i, "\n```\n") + + # [pre] + raw.gsub!(/\[\/?pre\]/i, "\n```\n") + + # [tt] + raw.gsub!(/\[\/?tt\]/i, "`") + + # [ftp] + raw.gsub!(/\[ftp/i, "[url") + raw.gsub!(/\[\/ftp\]/i, "[/url]") + + # [me] + raw.gsub!(/\[me=([^\]]*)\](.*?)\[\/me\]/im) { "_\\* #{$1} #{$2}_" } + + # [ul] + raw.gsub!(/\[ul\]/i, "") + raw.gsub!(/\[\/ul\]/i, "") + + # [li] + raw.gsub!(/\[li\](.*?)\[\/li\]/im) { "- #{$1}" } + + # puts [img] on their own line + raw.gsub!(/\[img[^\]]*\](.*?)\[\/img\]/im) { "\n#{$1}\n" } + + # puts [youtube] on their own line + raw.gsub!(/\[youtube\](.*?)\[\/youtube\]/im) { "\n#{$1}\n" } + + IGNORED_BBCODE.each { |code| raw.gsub!(/\[#{code}[^\]]*\](.*?)\[\/#{code}\]/im, '\1') } + + # ensure [/quote] are on their own line + raw.gsub!(/\s*\[\/quote\]\s*/im, "\n[/quote]\n") + + # remove tapatalk mess + raw.gsub!(/Sent from .+? using \[url=.*?\].+?\[\/url\]/i, "") + raw.gsub!(/Sent from .+? using .+?\z/i, "") + + # clean URLs + raw.gsub!(/\[url=(.+?)\]\1\[\/url\]/i, '\1') + + raw + end + def extract_quoted_message_ids(body) Set.new.tap do |quoted| body.scan(/\[quote\s+([^\]]+)\s*\]/) do |params| params = parse_tag_params(params) if params.has_key?("link") match = QuoteParamsPattern.match(params["link"]) - quoted << match[:msg].to_i if match + quoted = "#{quoted}#{match[:msg].to_i}" if match end end end @@ -499,7 +570,7 @@ class ImportScripts::Smf2 < ImportScripts::Base def parser @parser ||= OptionParser.new(nil, 12) do |o| o.banner = "Usage:\t#{File.basename($0)} [options]\n" - o.banner << "\t#{File.basename($0)} -d [options]" + o.banner = "${o.banner}\t#{File.basename($0)} -d [options]" o.on('-h HOST', :REQUIRED, "MySQL server hostname [\"#{self.host}\"]") { |s| self.host = s } o.on('-u USER', :REQUIRED, "MySQL username [\"#{self.username}\"]") { |s| self.username = s } o.on('-p [PASS]', :OPTIONAL, 'MySQL password. Without argument, reads password from STDIN.') { |s| self.password = s || :ask }