basyura's blog

あしたになったらほんきだす。

hantea.vim を読む その10

function! s:HatenaEdit(...) " 編集する
    " ログイン
    " b:hatena_lgin_info (バッファ内変数) が存在しない場合
    if !exists('b:hatena_login_info')
        " ログイン処理を呼び出す
        let hatena_login_info = s:HatenaLogin()
        " ログイン情報が無い場合は終了
        if !len(hatena_login_info)
            return
        endif
    else
        " ログイン情報がある場合は変数に格納
        let hatena_login_info = b:hatena_login_info
    endif
    " ログイン情報を各変数に格納
    let [base_url, user, cookie_file] = hatena_login_info

    " 編集する日付を取得
    " 引数の数が 0 より大きい場合
    if a:0 > 0
        " 一つ目の引数を格納
        let date = a:1
    else
        " 現在日時をデフォルト値として日付入力を求めて
        " 結果を変数に格納する
        let date = input('Date: ', strftime('%Y%m%d'))
    endif
    " 日付の長さが 0 の場合はキャンセルしたと判定して終了
    if !len(date)
        echo 'キャンセルしました'
        return
    endif

    " 20051124, 2005-11-24, 11/24, 24 といった日付を認識
    let pat = '\%(\%(\(\d\d\d\d\)[/-]\=\)\=\(\d\d\)[/-]\=\)\=\(\d\d\)'
    " パターンにマッチした結果を変数に格納
    let matches = matchlist(date, pat)
    " matches の長さが 0 の場合はメッセージを表示して終了
    if !len(matches)
        echoerr '日時のフォーマットが正しくありません!(YYYYMMDD)'
        return
    endif
    " 格納した結果を各変数に格納
    let [year, month, day] = matches[1:3]
    " 日付の長さが 0 の場合はメッセージを表示して終了
    if !strlen(day)
        echoerr '日時のフォーマットが正しくありません!(YYYYMMDD)'
        return
    endif
    " 年の長さが 0 の場合は今日の年を取得して格納
    if !strlen(year)  | let year  = strftime('%Y') | endif
    " 月の長さが 0 の場合は今日の月を取得して格納
    if !strlen(month) | let month = strftime('%m') | endif
    " 説明に
    "  > :HatenaEdit [[[YYYY]MM]DD]
    " とあるように HatenaEdit 15 とした場合は HatenaEdit 20090415 と補完される
    
    " HatenaLoadContent を呼び出して本文を取得する
    let content = HatenaLoadContent(base_url,user,year,month,day,cookie_file)

    " セッション(編集バッファ)を作成
    let tmpfile = tempname()
    " let g:hatena_edit_command = 'edit!'
    " と定義されているので tmpfile の編集が始まる
    "   :e[dit]! [++opt] [+cmd]
    "       どのような場合でもカレントファイルを編集する。
    "       カレントバッファに対する変更は全て失われる。
    execute g:hatena_edit_command tmpfile
    " filetype の指定
    set filetype=hatena
    " スワップファイルを使用しない
    "   :setl[ocal] ... コマンド ":set" と似ているが、
    "       カレントバッファ/ウィンドウについて
    "       ローカルな値のみを設定する。
    setlocal noswapfile
    " ファイルエンコーディングの既定値に
    " content にある fenc の値を使用する
    let &fileencoding = content['fenc']
    " rkm(セッションIDのMD5値?)に content にある rkm を使用する
    let b:rkm = content['rkm']
    " rkm の長さが 0 の場合はログインしてないと判定
    " メッセージを表示して終了
    if !strlen(b:rkm)
        echoerr 'ログインできませんでした'
        if exists('s:user')
            unlet s:user
        endif
        return
    endif
    " 変数の詰め替え
    let b:hatena_login_info = hatena_login_info
    let b:year  = year
    let b:month = month
    let b:day   = day
    let b:trivial   = g:hatena_always_trivial
    let b:diary_title   = content['diary_title']
    let b:day_title     = content['day_title']
    let b:timestamp     = content['timestamp']
    let b:prev_titlestring = &titlestring

    
    " バッファをファイルに書き込んだ後 HatenaUpdate を呼び出す
    " redonly にセットする
    " タイトルを設定する
    " バッファを削除
    "   :bd[elete][!] [N]
    "       バッファ[N](デフォルト: カレントバッファ)を
    "       メモリから取り除き、バッファリストから削除する。
    autocmd BufWritePost <buffer> call s:HatenaUpdate() 
                | set readonly 
                |let &titlestring = b:prev_titlestring 
                | bdelete
    " ウインドウを離れる前にウインドウタイトルを設定
    autocmd WinLeave <buffer> let &titlestring = b:prev_titlestring
    " 別のウインドウに入った後ウインドウタイトルを設定
    autocmd WinEnter <buffer> let &titlestring = b:diary_title 
            . ' ' . b:year . '-' . b:month 
            . '-' . b:day . ' [' . b:hatena_login_info[1] . ']'
    " ウインドウタイトルを設定
    let &titlestring = b:diary_title . ' ' 
            . b:year . '-' . b:month . '-' 
            . b:day . ' [' . user . ']'
    " paste の設定を取得
    let nopaste = !&paste   
    " paste を設定
    set paste
    " 開いているテンプファイルに日記のボディ部を差し込む
    execute 'normal i' . content['body']
    " nopaste の場合は設定
    if nopaste
        set nopaste
    endif
    " 未編集設定
    set nomodified
endfunction