Subscribed unsubscribe Subscribe Subscribe

vim で markdown のリンクをタイトルを取得しインサートする

tech

前回の続きになるが、もし hugo 等にブログを乗り換えた際はてな記法が使えなくなり markdown 等で書く必要がある。

現在このブログは基本的には markdown で記述しているが、リンク周りは [http://example.com:title] というはてな記法を使っていることが多い。これはリンク先のタイトルをよしなに取得してくれるという機能である。また、

のような埋め込み式?の物も [http://example.com:embed:cite] と記述すると展開される。

自分は vim を普段使っているので markdown も vim で書くことになるがまずは前者について考え、リンクする際に毎度タイトルを手打ちするのも手間なので下のようなコマンドを定義してタイトル付きの markdown のリンクをインサートするようにしてみた。

function! s:InsertMarkdownLink(url)
        let dom = webapi#html#parseURL(a:url)
        let head = dom.childNodes('head')
        if len(head) < 1
                return
        endif
        let metas = head[0].childNodes('meta')
        let encoding = "utf-8"
        for meta in metas
                if has_key(meta.attr, "http-equiv") && meta.attr["http-equiv"] == "Content-Type"
                        let matched = matchstr(meta.attr["content"], 'charset=\zs[a-zA-Z0-9-]*\ze')
                        if matched != ""
                                let encoding = matched
                        endif
                        break
                elseif has_key(meta.attr, "charset")
                        let encoding = meta.attr["charset"]
                        break
                endif
        endfor
        let title = iconv(webapi#html#decodeEntityReference(head[0].find('title').value()), encoding, &encoding)
        execute ":normal i[" . title . "](" . a:url . ")"
endfunction
command! -nargs=1 InsertMarkdownLink call s:InsertMarkdownLink("<args>")

一言ブログを乗り換えると言っても、いろいろなものに依存していたりするのでとても気が進まない。