2012年12月15日土曜日

[日記]mixiの日記をBloggerの記事に変換するためのスクリプトを作ってみました

私のお出かけ日記はmixiで作っていてそれをBloggerでも変換して載せているのですが、変換する手作業が面倒なためそれを自動的に行うツールを今日は作ってみました。

変換① 絵文字やタイトルの部分の変換
mixi の日記ではわーい(嬉しい顔) といった絵文字を使っているのですが、それはコピペすると [m:50] といった文字列に変わっちゃいます。このパターンの文字列を読点「。」に変換します。

また、これは私の使い方なのですが、タイトルを 【タイトル】 という風にかぎかっこを使っています。この部分の見出しも HTML 風に変えてみます。

変換するツールは VB Script で作りました。
テキストファイルに保存して、それをツールに読み込ませてあげるとこれらの文字列が変換されたファイルが出力されるようになっています。

mixi日記をBloggerに変換するスクリプト.vbs 'ドラッグ&ドロップしたテキストファイルを変換します。
'
' ・絵文字を取り読点(。)に変換
' ・【】でタイトルを作っているので HTML 形式の見出しに変換
' ・変換後のファイル名は元のファイル名_new

'引数のファイルを取得
Set args = WScript.Arguments
strFileName = args(0)

'変換後のファイル名 = 元のファイル名_new
pos = InstrRev(strFileName, ".")
strDistFile = Left(strFileName,(pos-1)) & "_new" & Mid(strFileName, pos)

'オブジェクトの生成
Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, 1)
Set objFile_Dist = objFSO.CreateTextFile(strDistFile)

'正規表現オブジェクトを生成
Set regEx = New RegExp

'元ファイルから一行ずつ読み込み、正規表現による文字列処理
Do While (objFile.AtEndOfStream <> True)
  strLineData = objFile.ReadLine

  '絵文字を取り読点(。)に変換
  With regEx
    .Pattern = "\[m:[0-9]+\]"
    .IgnoreCase = No '大文字小文字の区別を行う
    .Global = True '文字列全体を検索
  End With
  strLineData = regEx.Replace(strLineData, "。")

  '【】でタイトルを作っているので HTML 形式の見出しに変換
  With regEx
    .Pattern = "【"
    .IgnoreCase = No '大文字小文字の区別を行う
    .Global = True '文字列全体を検索
  End With
  strLineData = regEx.Replace(strLineData, "<span style=""font-size: medium;""><strong>")

  With regEx
    .Pattern = "】"
    .IgnoreCase = No '大文字小文字の区別を行う
    .Global = True '文字列全体を検索
  End With
  strLineData = regEx.Replace(strLineData, "</strong></span><br /><hr />")

  objFile_Dist.WriteLine(strLineData)
Loop
※参考


変換② Youtubeウインドウのサイズ変更
Youtubeウインドウのサイズがちょっと小さいので大きくします。
やり方は上の変換の仕方とまったく同じです。

デフォルトで挿入されるYoutubeウインドウのサイズ: 高さ 266、幅 320
変更するYoutubeウインドウのサイズ: 高さ 400、幅 480
文字列変換をしています。

※このファイルでは Unicode に対応していないので改修しました。→ こちら を参照。

Youtubeサイズを変更.vbs 'ドラッグ&ドロップしたテキストファイルを変換します。
'
' ・Youtubeのサイズを変更
' ・変換後のファイル名は元のファイル名_new

'引数のファイルを取得
Set args = WScript.Arguments
strFileName = args(0)

'変換後のファイル名 = 元のファイル名_new
pos = InstrRev(strFileName, ".")
strDistFile = Left(strFileName,(pos-1)) & "_new" & Mid(strFileName, pos)

'オブジェクトの生成
Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, 1)
Set objFile_Dist = objFSO.CreateTextFile(strDistFile)

'正規表現オブジェクトを生成
Set regEx = New RegExp

'初期化
i = 0

'元ファイルから一行ずつ読み込み、正規表現による文字列処理
Do While (objFile.AtEndOfStream <> True)
  Found_1 = False
  Found_2 = False
  strLineData = objFile.ReadLine

  '----------------------------------------------
  '検索文字列: <object width="320" height="266"
  '変更後文字列:<object width="480" height="400"
  '----------------------------------------------
  regEx.Pattern = "<object width=""320"" height=""266"""
  If regEx.Test(strLineData) Then
    Found_1 = True
    strLineData = regEx.Replace(strLineData, "<object width=""480"" height=""400""")
  End If

  '------------------------------------------------------------
  '検索文字列:  height="266" width="320"><param name="movie"
  '変更後文字列: height="400" width="480"><param name="movie"
  '------------------------------------------------------------
  regEx.Pattern = " height=""266"" width=""320""><param name=""movie"""
  If regEx.Test(strLineData) Then
    If Found_1 = True Then MsgBox "下記の行が処理できませんでした" & vbCrLf & strLineData
    Found_1 = True
    strLineData = regEx.Replace(strLineData, " height=""400"" width=""480""><param name=""movie""")
  End If

  '----------------------------------------------
  '検索文字列: <embed width="320" height="266"
  '変更後文字列:<embed width="480" height="400"
  '----------------------------------------------
  regEx.Pattern = "<embed width=""320"" height=""266"""
  If regEx.Test(strLineData) Then
    Found_2 = True  
    strLineData = regEx.Replace(strLineData, "<embed width=""480"" height=""400""")
  End If

  If Found_1 and Not Found_2 Then MsgBox "下記の行が処理できませんでした" & vbCrLf & strLineData
  If Not Found_1 and Found_2 Then MsgBox "下記の行が処理できませんでした" & vbCrLf & strLineData

  If Found_1 and Found_2 Then i = i + 1

  objFile_Dist.WriteLine(strLineData)

Loop

MsgBox "Youtubeのサイズを " & i & " 箇所変更しました。"
※参考


変換③ 画像の横並びの編集
次はBloggerで貼り付けた画像を横並びにします。
やり方は上の変換の仕方とまったく同じです。

スクリプト中に【2】という文字列を見つけたらその直後の2つの画像データを横並びに、【3】という文字列を見つけたらその直後の画像データ3つを横並びにならべます。
HTML の table を使っています。(画像を横に並べる(table)を参照)

※このファイルでは Unicode に対応していないので改修しました。→ こちら を参照。

画像を横並びに編集.vbs 'ドラッグ&ドロップしたテキストファイルを変換します。
'
' ・テーブルを作って画像を並べたい所に【2】または【3】のキーワードを入れる
' ・Youtubeのサイズの変更をする
' ・変換後のファイル名は元のファイル名_new

'引数のファイルを取得
Set args = WScript.Arguments
strFileName = args(0)

'変換後のファイル名 = 元のファイル名_new
pos = InstrRev(strFileName, ".")
strDistFile = Left(strFileName,(pos-1)) & "_new" & Mid(strFileName, pos)

'オブジェクトの生成
Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, 1)
Set objFile_Dist = objFSO.CreateTextFile(strDistFile)

'正規表現オブジェクトを生成
Set regEx = New RegExp

'初期処理
flgTable2 = False
flgTable3 = False
TableCount = 0
i = 0
j = 0

'元ファイルから一行ずつ読み込み、正規表現による文字列処理
Do While (objFile.AtEndOfStream <> True)
  strLineData = objFile.ReadLine

  If (Trim(strLineData) = "【2】<br />") or (Trim(strLineData) = "【2】<br />") Then
    If flgTable2 or flgTable3 Then
      MsgBox "【2】の使い方がおかしいです。"
      WScript.Quit
    End If
    flgTable2 = True
    TableCount = 0
    i = i + 1
    objFile_Dist.WriteLine("<table align=""center"" border=""0"">")
    objFile_Dist.WriteLine("<tbody>")
    objFile_Dist.WriteLine("    <tr>")
    strLineData = ""

  ElseIf (Trim(strLineData) = "【3】<br />") or (Trim(strLineData) = "【3】<br />") Then
    If flgTable2 or flgTable3 Then
      MsgBox "【3】の使い方がおかしいです。"
      WScript.Quit
    End If
    flgTable3 = True
    TableCount = 0
    j = j + 1
    objFile_Dist.WriteLine("<table align=""center"" border=""0"">")
    objFile_Dist.WriteLine("<tbody>")
    objFile_Dist.WriteLine("    <tr>")
    strLineData = ""

  ElseIf Trim(strLineData) = "<br />" Then
    If flgTable2 or flgTable3 Then strLineData = ""

  ElseIf Left(strLineData, 5) = "<div " Then
    If flgTable2 or flgTable3 Then strLineData = ""

  ElseIf Right(strLineData, 6) = "</div>" Then
    If flgTable2 or flgTable3 Then
      strLineData = Left(strLineData, Len(strLineData)-6)

      If Left(strLineData,3) = "<a " and Right(strLineData,4) = "</a>" Then
        objFile_Dist.WriteLine("      <td>" & strLineData & "</td>")
        TableCount = TableCount + 1

        If (flgTable2 and TableCount = 2) or (flgTable3 and TableCount = 3) Then
          objFile_Dist.WriteLine("    </tr>")
          objFile_Dist.WriteLine("</tbody>")
          objFile_Dist.WriteLine("</table>")
          TableCount = 0
          flgTable2 = False
          flgTable3 = False
        End If

        strLineData = ""
      Else
         MsgBox "【2】または【3】の使い方がおかしいです(画像じゃないデータ)。" & vbCrLf & strLineData
         WScript.Quit
      End If

    End If
  Else
    If flgTable2 or flgTable3 Then
      MsgBox "【2】または【3】の使い方がおかしいです(想定外のデータ)。" & vbCrLf & strLineData
      WScript.Quit
    End If
  End If

  If Trim(strLineData) <> "" Then objFile_Dist.WriteLine(strLineData)
Loop

MsgBox "画像を2個並べる処理( " & i & " 個)" & vbCrLf & "画像を3個並べる処理( " & j & " 個)" & vbCrLf & "処理しました。"

※参考

これで変換が随分と楽にできるようになりました。

まるとん

日記の一覧に戻る

0 件のコメント:

コメントを投稿