Backlog記法で書かれたWikiをMarkdownのプロジェクトのWikiに全面自動移行するスクリプト

## 経緯

前々からBacklogを使っていてBacklog記法で課題やWikiを編集していましたが、ちょっと前からMarkdownのプロジェクトを新設しそちらでの運用を始めていました。普段の課題はMarkdownで書いてますが、Wikiに関しては過去の資料が大量にあることと２重管理が怖かったので古いBacklog記法のプロジェクトを使い続けていました。

ただそれだとWikiを書くときだけBacklog記法で書く必要性がありめんどうだと思っていて、検索しても、

[過去のプロジェクトを含めて新wikiルール(markdown)に移行したい](http://feedback.backlog.jp/forums/140671-backlog-%E8%A6%81%E6%9C%9B-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%A0%B1%E5%91%8A-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0/suggestions/4421682-%E9%81%8E%E5%8E%BB%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%90%AB%E3%82%81%E3%81%A6%E6%96%B0wiki%E3%83%AB%E3%83%BC%E3%83%AB-markdown-%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84)

このページを見てm9(^Д^)ﾌﾟｷﾞｬｰってなるだけだったので、ついカッとなって自動でWikiを移行するスクリプトを書きました。

## ソース

各モジュールは以下を担当してます。

- mechanize
    - Backlog記法のWikiのURL一覧を取得
    - 一覧のURLごとに開いてタイトルとHTMLを取得
    - Markdownを新設プロジェクトのWikiに自動投稿
- pandoc
    - HTMLをMarkdownへ変換

gistはこちら →　https://gist.github.com/kazuph/9263163

```rb:backlog2markdown.rb
#!/usr/bin/env ruby
# coding : utf-8

require 'open-uri'
require "mechanize"
require 'pandoc-ruby'
require "awesome_print"
require "pry"
require "date"

class Backlog2Markdown

  def initialize(user_id, password, subdomain, from, to)
    @user_id   = user_id
    @password  = password
    @subdomain = subdomain
    @from      = from
    @to        = to

    @agent                  = Mechanize.new
    @agent.user_agent_alias = "Mac Safari"
    @agent.max_history      = 1

  end

  def login
    page = @agent.get("https://#{@subdomain}.backlog.jp/LoginDisplay.action")
    form = page.forms[0]
    form.field_with(id: "userId").value    = @user_id
    form.field_with(id: "password").value  = @password
    @agent.submit(form, form.buttons.first)
  end

  def wiki_url_list()
    page = @agent.get("https://#{@subdomain}.backlog.jp/wiki/#{@from}/Home")
    wikipagelist = page.at('#wikipagelist')
    @links = wikipagelist.search('a').map{|a|
      a.attributes['href'].value
    }
  end

  def wiki_html(link)
    page  = @agent.get("https://#{@subdomain}.backlog.jp" + link)
    title = page.at('#mainTitle').text.gsub(/(\n|\t)/, '')
    article = page.at('#loom').to_s
    {title: title, article: article}
  end

  def to_markdown(html)
    @converter = PandocRuby.new(html, :from => :html, :to => :markdown)
    md = @converter.convert
  end

  def post_wiki (title, article)
    page = @agent.get("https://#{@subdomain}.backlog.jp/NewWiki.action?projectKey=#{@to}")
    form = page.forms[3]
    form.field_with(id: "page.name").value    = fronted_tag title
    form.field_with(id: "page.content").value = work_around article
    form.checkbox_with(name: 'mailNotify').uncheck
    # binding.pry
    @agent.submit(form, form.buttons.first)
  end

  def fronted_tag title
    title.gsub!(/(.*?)(\[.*\])/, '\2\1')
    title
  end

  def work_around text
    text.gsub!(/^\\$\n/,  '')
    text.gsub!(/!\[\]/,  '![some_image]')
    text
  end

end

if __FILE__ == $0
  i = Backlog2Markdown.new( ENV["USER_ID"], ENV["PASS"], ENV["SUBDOMAIN"], ENV["FROM"], ENV["TO"])
  i.login

  links = i.wiki_url_list

  links.each do |l|
    wiki = i.wiki_html l
    # binding.pry
    md   = i.to_markdown wiki[:article]
    puts wiki[:title]
    i.post_wiki wiki[:title], md
    sleep 3
  end
end
```

```rb:Gemfile
source "https://rubygems.org"

gem "mechanize"
gem 'pandoc-ruby'
gem "awesome_print"
gem "pry"
```

## 実行方法
pandocは予めインストールしておいてください。

### 必要な変数の説明

- USER_ID: ユーザーID
- PASS: パスワード
- SUBDOMAIN: XXXXX.backlog.jpのXXXXXの部分
- FROM: Backlog記法のプロジェクトのID
- TO: Markdown記法のプロジェクトのID

環境変数使うの面倒臭かったらハードコーディングしてください。

### 実行
```shell-session
bundle install
USER_ID=user_id PASS=password SUBDOMAIN=your_backlog_subdomain  FROM=backlog_prj  TO=markdown_prj bundle exec ruby backlog2markdown.rb
```

いきなりやるのは怖いと思うので```binding.pry```を挟んで徐々に値確認しつつ実行するといいと思います。

あとBacklogがViewを変えるとすぐに動かなくなると思いますがその辺はご了承ください。

## TODO
- テーブル記法が崩れる
- ソースにコメントがない（読めばわかると思いますが）