basyura's blog

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

hatena.vim を読む その15

function! s:HtmlUnescape(string) " HTMLエスケープを解除
    " 引数で与えられた変数を設定
    let string = a:string
    " 実態参照が無くなるなるまでループ
    while match(string, '&#\d\+;') != -1
        " 実態参照対象の数値を抜き出す
        let num = matchstr(string, '&#\zs\d\+\ze;')
        " 置換してるんだけどこの処理は正しい?必要?
        " <あいうえお> → 0あいうえお2かき"
        "   nr2char({expr})
        "       コード{expr}で表される1文字からなる文字列を返す。例: >
        "           nr2char(64)   "@"を返す
        "           nr2char(32)   " "を返す
        "
        let string = substitute(
                        string, '&#\d\+;', nr2char(num), '')
    endwhile
    " 置換処理
    let string = substitute(string, '>',   '>', 'g')
    let string = substitute(string, '&lt;',   '<', 'g')
    let string = substitute(string, '&quot;', '"', 'g')
    let string = substitute(string, '&amp;',  '\&', 'g')
    return string
endfunction

" a:hatena_user からグループ/ユーザを取得
function! s:GetBaseURLAndUser(hatena_user)
    " a:hatena_user を : で分割
    let pair = split(a:hatena_user, ':')
    " 配列の長さが 1 より大きい場合
    if len(pair) > 1
        " s:hatena_group_base_url のフォーマットに従って変換
        let base_url = printf(s:hatena_group_base_url, pair[0])
        " user に変数セット
        let user = pair[1]
    else
        " 変数セット
        let base_url = s:hatena_base_url
        let user = a:hatena_user
    endif
    " 返却
    return [base_url, user]
endfunction