2013年2月19日火曜日

PHPでswiffyを自由にhtmlに組み込む方法について

精神と時の部屋でコードが進んで時間が出来たので表題のメモを残しておきます。
ついでに精神と時の部屋とは



のことです。
あとは電車の中とかもすごく進みますね!!
で今日はFlashが使えない端末を救う?GoogleのSwiffyについて。
FlashをSVGに変換、再生出来るようになります。
Swiffyの詳しい内容はこちらのサイトに纏まってます。

Google Swiffy 覚書

つまり

swiffyobject = {...略};

の{...略}の部分のJSONを差し替えて行けば自由にコンテンツを再生できます。
ただ元データが吐き出しが丸々のhtmlですので加工が大変です。
これを以下のPHPのバッチで加工することも出来ます ※2013/02/19現在

//Swiffyの生ファイルたちを置いた場所

$path = "old_swiffy/";
//SwiffyのJSONを抽出したfileの生成場所
$new_path = "new_swiffy/";

if ($dir = opendir("$path")) {
    while (($file_name = readdir($dir)) !== false) {
        if ($file_name != "." && $file_name != "..") {
            make_json($file_name);
        }
    }
    closedir($dir);
}

function make_json($file_name){
    //コマンドラインで実行することを前提
    //functionのスコープの外からglobalを使って参照
    global $path;
    global $new_path;

    $file = "$path/$file_name";
    //Linuxのコマンドを使って整形
    $data = `head -n 10 $file | tail -n 1`;
    //保存
    file_put_contents($new_path . $file_name, $data);
    
    return;
}

でもこれだとruntime.jsのバージョンが変わったりするとFlashの再変換が必要だったり、コンテンツを追加する度に手間です。
なのでサイト表示の際に自動的に抽出&runtime.jsのバージョン確認を出来るようにしました。
ここではhtmlをObjectで扱えるライブラリを使います。

simple_html_dom

英語ドキュメントが嫌な方はこちら

PHPでjQueryチックにWebサイトをクローリングする方法

こちらを使って書いたPHPのコードがこちら。

//$html_file_pathはURLでもfileのpathでも良い
function get_swiffy_data($html_file_path) {
    //ライブラリの読み込み
    require_once 'simple_html_dom.php';

    //最新バージョンの情報を保存する場所
    $swiffy_version_path = 'hoge/swiffy_version.txt';
    $swiffy_version = file_get_contents($swiffy_version_path);

    //simple_html_dom.phpの関数
    $html_Objects = file_get_html($html_file_path);
    //読み込まれるJavaScriptの抽出
    $element = $html_doc->find('script', 0);


    $parse_url = parse_url($element->src);
    if ($swiffy_version != $parse_url['path']) {
        $path_parts = pathinfo($parse_url['path']);
        // 保存先フォルダの作成する。
        $file_path = $path_parts['dirname'];
        if (!file_exists($file_path)) {
            mkdir($file_path, 0775, true);
        }
        file_put_contents($swiffy_version_path, $parse_url['path']);
        file_put_contents($parse_url['path'], file_get_contents($element->src));
    }
    //読み込まれるJavaScriptの抽出
    $result['js_path'] =  $parse_url['path']);
    //Jsonを抽出
    $element = $html_doc->find('script', 1);
    $result['swiffy_json'] = $element->innertext;

    return $result;
}


仕組みとして最新のjs情報と比較して無かったらGoogleから取得しています。
ここでは例としてjsの最新情報をtextに保存してます。
parse_url()pathinfo()はPHPの標準関数です。
名前の通り、それぞれURLとfileのpathを細かくparseしてくれます。
とても便利なのですがよく同じ用途でexplode()を使っているのを見かけます。
なんかの参考になればと思います。

個人的には標準関数を使ったPHPっぽい感じのコードかなと思いますw