PR

nicky.cgi から Movable Type へ記事移動

前回 pc.casey.jp » geeklog から WordPress へ記事移動3(.htaccess編) を書いた。

Movable Typeへのエクスポートが出来ればWordPressへのインポートに当てることができる。残念ながらMovable Typeを使ったことはないのだけれど、人気があるらしいし、データフォーマットもわかったことだし、nicky.cgiからのデータエクスポートもやらなければなと思っていたところだし、最近はphpでCUI/GUIのexeを作って遊んでいる。となれば・・・ということである。

スポンサードリンク

概要

  • コマンドラインから実行する単体exeです。
  • 本プログラムはオープンソース(OSS)でライセンスはGPLです。自由に勝手に使ってください。そのかわり補償などはありません。
  • ソースを公開しますのでWindows以外でも簡単に移植できるでしょう。
  • 上記にもありますがMovable Typeは使ったことがありません。が、geeklogからWordPressへの記事移動の手段としてMovable Type形式のデータを目撃し、nicky.cgiからのエクスポートが自分に必要だったのでサラっと作っただけです。
  • プログラムはmain.phpとnicky_conv.phpの2つのソースからなっています。
  • 以下にそれを公開します。通常はexe版はこちらです→ nicky_conv_cui (854 ダウンロード ) 。WordPress版は別のページに置いておきます。
  • WordPress版では画像のインポートもサポートします。

main.php

<?php
    /* ----------------------------------------------------
     *    nicky.cgi data convert script for Movable Type
     *    ( php for win32 command user interface )
     * ----------------------------------------------------
     * Usage:
     *  nicky_conv_cui.exe "c:\nicky\2009" "http://new.yourdomain.jp/wp/blogname/files/"
     *
     * History:
     *  - 2010.09.03 Ver.0.01a first
     *
     * Script=Shift-JIS, Import=EUC, Output=UTF-8
     * Copyright 2010 CASEY, GPL
     */

    require_once("nicky_conv.php");
    $n = new nicky_conv();
    $filetype = "nky";
    $outputFileName = "data.txt";

    // get data path --------------------------------------
    if(empty($argv[1])){
        print 'Ex. nicky_conv_cui.exe "path" ["image_url_path"]';
        exit(0);
    }
    $baseDir = $argv[1] . '\\';
    print "Target:" .$baseDir . PHP_EOL;

    // get replace url ------------------------------------
    if(!empty($argv[2])){
        print "imgPath:" .$argv[2] . PHP_EOL;
        $n->setImagePath($argv[2]);
    }else{
        print "imgPath: Nothing" . PHP_EOL;
    }

    // get script path ------------------------------------
    $thisPath = getcwd();
    print "pgPath:" . $thisPath . PHP_EOL;
    $outputFileName = $thisPath . '\\' . $outputFileName;
    if(file_exists($outputFileName)){
        unlink($outputFileName);
    }

    // start conv -----------------------------------------
    $fp = fopen($outputFileName, "a");
        $dir = opendir($baseDir);
        while($file = readdir($dir)) {
            if(is_file($baseDir.$file)) {
                if (preg_match("/\.$filetype/i", $file)) {
                    $n->reset();
                    $n->readData($baseDir.$file);
                    $data = $n->makeData();
                    print $data;

                    $data  = mb_convert_encoding($data, "UTF-8", "SJIS");
                    fwrite($fp, $data);
                }
            }
        }
        closedir($dir);
    fclose($fp);

    // end proc  ------------------------------------------
    print 'End';
    exit(0);
?>

nicky_conv.php

<?php
    /* ----------------------------------------------------
     *    nicky.cgi data convert script for Movable Type
     *    ( php for win32 command user interface )
     * ----------------------------------------------------
     * History:
     *  - 2010.09.03 Ver.0.01a first
     *
     * Script=Shift-JIS, Import=EUC, Output=UTF-8
     * Copyright 2010 CASEY, GPL
     */
class nicky_conv{

    // init
    function nicky_conv(){
        $this->reset();
    }

    // init for next data
    function reset(){
        // init, set default
        $this->Author            = 'admin';
        $this->Title            = 'no title';
        $this->Category            = 'nicky';
        $this->PrimaryCategory    = 'nicky';
        $this->Status            = 'publish';
        $this->AllowComments    = 0;
        $this->AllowPings        = 1;
        $this->ConvertBreaks    = 0;
        $this->Body                = null;
        $this->SeparateBig        = '--------';
        $this->SeparateSmall    = '-----';
        $this->Date                = '01/01/1970 00:00:00';
        $this->Output            = array();
    }

    // set image path
    function setImagePath($url){
        $this->ImagePath = $url;
    }

    // read data (*.nky, EUC)
    function readData($file){
        $output = null;

        // read
        $data = @file_get_contents($file);
        $arr = split("\x01", $data);

        // convert
        $a = array();
        foreach($arr as $k => $v){
            $a[$k] = mb_convert_encoding($v, "SJIS", "EUC");
        }
        $this->Title = $a[1] ? $a[1] : $this->Title;
        $this->Body  = $a[2] ? $a[2] : $this->Body;

        // image?
        if($a[3]){
            $tag = sprintf('<img title="%s" src="%s" /><br /><br />', $a[3], $this->ImagePath . $a[3]);
            $this->Body = $tag . $this->Body;
        }

        // arr[0] = date or date time
        // 11/17/2009 03:02:26
        mb_ereg('(\d+)[^\d.+](\d+)[^\d.+](\d+)', $arr[0], $dt_arr);
        $dt = sprintf("%s/%s/%s", $dt_arr[2], $dt_arr[3], $dt_arr[1]);
        if(mb_ereg('(\d+):(\d+)', $a[0], $dt_arr)){
            $dt .= sprintf(" %s:%s:%s", $dt_arr[1], $dt_arr[2], '00');
        }else{
            $dt . '00:00:00';
        }
        $this->Date = $dt;

        return true;
    }

    // make output data (utf-8)
    function makeData(){
        $data = "AUTHOR: "                        . $this->Author;
        $data .= PHP_EOL . "TITLE: "            . $this->Title;
        $data .= PHP_EOL . "DATE: "                . $this->Date;
        $data .= PHP_EOL . "PRIMARY CATEGORY: "    . $this->PrimaryCategory;
        $data .= PHP_EOL . "CATEGORY ID: "        . $this->Category;
        $data .= PHP_EOL . "STATUS: "            . $this->Status;
        $data .= PHP_EOL . "ALLOW COMMENTS: "    . $this->AllowComments;
        $data .= PHP_EOL . "ALLOW PINGS: "        . $this->AllowPings;
        $data .= PHP_EOL . "CONVERT BREAKS: "    . $this->ConvertBreaks;
        $data .= PHP_EOL                        . $this->SeparateSmall;
        $data .= PHP_EOL . "BODY: ";
        $data .= PHP_EOL                        . $this->Body;
        $data .= PHP_EOL                        . $this->SeparateSmall;
        $data .= PHP_EOL                        . $this->SeparateBig . PHP_EOL;
        return $data;
    }
}
?>

※汚いコードですいません。その場しのぎなので、と言い訳しておきます・・・。

2011.10.18追記

nicky.cgi 開発元(公式サイト)からエクスポートに関して本記事へリンクされているようです。

nicky!の記事をエクスポートしたい。
nicky!製作者は試しておりませんが、pc.casey.jp様よりMovable Type / WordPressへ記事を移動させる記事が提供されております。
(「日記CGI[nicky!]取り扱い説明書」より引用)

コメント