mt3.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:5k
源码类别:

Ajax

开发平台:

Others

  1. #!/usr/bin/env ruby
  2. # MovableType 3.x converter for typo by Patrick Lenz <patrick@lenz.sh>
  3. #
  4. # MAKE BACKUPS OF EVERYTHING BEFORE RUNNING THIS SCRIPT!
  5. # THIS SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND
  6. require File.dirname(__FILE__) + '/../../config/environment'
  7. require 'optparse'
  8. class MTMigrate
  9.   attr_accessor :options
  10.   def initialize
  11.     self.options = {}
  12.     self.parse_options
  13.     self.convert_categories
  14.     self.convert_entries
  15.     self.convert_prefs
  16.   end
  17.   def convert_categories
  18.     mt_categories = ActiveRecord::Base.connection.select_all(%{
  19.       SELECT category_label AS name
  20.       FROM `#{self.options[:mt_db]}`.mt_category
  21.       WHERE category_blog_id = '#{self.options[:blog_id]}'
  22.     })
  23.     puts "Converting #{mt_categories.size} categories.."
  24.     mt_categories.each do |cat|
  25.       Category.create(cat) unless Category.find_by_name(cat['name'])
  26.     end
  27.   end
  28.   def convert_entries
  29.     default_filter = translate_filter ActiveRecord::Base.connection.select_all(%{
  30.       SELECT
  31.         blog_convert_paras
  32.       FROM `#{self.options[:mt_db]}`.mt_blog
  33.       WHERE blog_id = '#{self.options[:blog_id]}'
  34.     })[0]["blog_convert_paras"]
  35.     mt_entries = ActiveRecord::Base.connection.select_all(%{
  36.       SELECT
  37.         entry_id,
  38.         entry_allow_comments AS allow_comments,
  39.         entry_allow_pings AS allow_pings,
  40.         entry_title AS title,
  41.         entry_text AS body,
  42.         entry_text_more AS extended,
  43.         entry_excerpt AS excerpt,
  44.         entry_convert_breaks AS convert_breaks,
  45.         entry_keywords AS keywords,
  46.         entry_created_on AS created_at,
  47.         entry_modified_on AS updated_at,
  48.         author_name AS author
  49.       FROM `#{self.options[:mt_db]}`.mt_entry, `#{self.options[:mt_db]}`.mt_author
  50.       WHERE entry_blog_id = '#{self.options[:blog_id]}'
  51.       AND author_id = entry_author_id
  52.     })
  53.     puts "Converting #{mt_entries.size} entries.."
  54.     mt_entries.each do |entry|
  55.       a = Article.new
  56.       a.attributes = entry.reject { |k,v| k =~ /entry_id|convert_breaks/ }
  57.       if entry["convert_breaks"] == "__default__"
  58.         a.text_filter = default_filter
  59.       else
  60.         a.text_filter = translate_filter entry["convert_breaks"]
  61.       end
  62.       a.save
  63.       # Fetch category assignments
  64.       ActiveRecord::Base.connection.select_all(%{
  65.         SELECT category_label, placement_is_primary
  66.         FROM `#{self.options[:mt_db]}`.mt_category, `#{self.options[:mt_db]}`.mt_entry, `#{self.options[:mt_db]}`.mt_placement
  67.         WHERE entry_id = #{entry['entry_id']}
  68.         AND category_id = placement_category_id
  69.         AND entry_id = placement_entry_id
  70.       }).each do |c|
  71.         a.categories.push_with_attributes(Category.find_by_name(c['category_label']), :is_primary => c['placement_is_primary'])
  72.       end
  73.       # Fetch comments
  74.       ActiveRecord::Base.connection.select_all(%{
  75.         SELECT
  76.           comment_author AS author,
  77.           comment_email AS email,
  78.           comment_url AS url,
  79.           comment_text AS body,
  80.           comment_created_on AS created_at,
  81.           comment_modified_on AS updated_at
  82.         FROM `#{self.options[:mt_db]}`.mt_comment
  83.         WHERE comment_entry_id = #{entry['entry_id']}
  84.       }).each do |c|
  85.         a.comments.create(c)
  86.       end
  87.       # Fetch trackbacks
  88.       ActiveRecord::Base.connection.select_all(%{
  89.         SELECT
  90.           tbping_title AS title,
  91.           tbping_excerpt AS excerpt,
  92.           tbping_source_url AS url,
  93.           tbping_ip AS ip,
  94.           tbping_blog_name AS blog_name,
  95.           tbping_created_on AS created_at,
  96.           tbping_modified_on AS updated_at
  97.         FROM `#{self.options[:mt_db]}`.mt_tbping, `#{self.options[:mt_db]}`.mt_trackback
  98.         WHERE tbping_tb_id = trackback_id
  99.         AND trackback_entry_id = #{entry['entry_id']}
  100.       }).each do |tb|
  101.         a.trackbacks.create(tb)
  102.       end
  103.     end
  104.   end
  105.   def convert_prefs
  106.     puts "Converting prefs"
  107.     ActiveRecord::Base.connection.select_one(%{
  108.       SELECT
  109.         blog_name,
  110.         blog_allow_comments_default AS default_allow_comments,
  111.         blog_allow_pings_default AS default_allow_pings
  112.       FROM `#{self.options[:mt_db]}`.mt_blog
  113.       WHERE blog_id = '#{self.options[:blog_id]}'
  114.     }).each do |pref_name, pref_value|
  115.       begin
  116.         Setting.find_by_name(pref_name).update_attribute("value", pref_value)
  117.       rescue
  118.         Setting.create({'name' => pref_name, 'value' => pref_value})
  119.       end
  120.     end
  121.   end
  122.   def parse_options
  123.     OptionParser.new do |opt|
  124.       opt.banner = "Usage: mt3.rb [options]"
  125.       opt.on('--blog-id BLOGID', Integer, 'Blog ID to import from.') { |i| self.options[:blog_id] = i }
  126.       opt.on('--db DBNAME', String, 'Movable Type database name.') { |d| self.options[:mt_db] = d }
  127.       opt.on_tail('-h', '--help', 'Show this message.') do
  128.         puts opt
  129.         exit
  130.       end
  131.       opt.parse!(ARGV)
  132.     end
  133.     unless self.options.include?(:blog_id) and self.options.include?(:mt_db)
  134.       puts "See mt3.rb --help for help."
  135.       exit
  136.     end
  137.   end
  138.   def translate_filter(input)
  139.     return case input
  140.       when /textile/: 'textile'
  141.       when /markdown/ : 'markdown'
  142.       else  nil
  143.     end
  144.   end
  145. end
  146. MTMigrate.new