function! hugohelper#SpellCheck()
    exe "setlocal spell! spelllang=" . g:hugohelper_spell_check_lang
endfun

function! hugohelper#TitleToSlug()
    normal gg
    exe '/^title'
    normal! vi"y
    exe '/^slug'
    normal! f"pVu
    " Not sure why I can't make \%V work here
    exe ':s/ /-/g'
    exe 'normal! f-r f-r '
endfun

function! hugohelper#TitleCase()
    normal gg
    exe '/^title'
    normal! vi"u~
endfun

function! hugohelper#Draft()
    call s:set_key('draft', 'true')
endfun

function! hugohelper#Undraft()
    call s:set_key('draft', 'false')
endfun

function! hugohelper#DateIsNow()
    call s:set_key('date', s:hugo_now())
endfun

function! hugohelper#LastmodIsNow()
    call s:set_key('lastmod', s:hugo_now())
endfun

function! hugohelper#Highlight(language)
    normal! I{{< highlight language_placeholder >}}
    exe 's/language_placeholder/' . a:language . '/'
    normal! o{{< /highlight >}}
endfun

function! hugohelper#Link(link)
    let l:selection = s:get_visual_selection()
    exe ':s/\%V\(.*\)\%V\(.\)/[\0]/'
    exe "normal! gv\ef]a(link_placeholder)\e"
    exe 's/link_placeholder/' . escape(a:link, '\\/.*^~[]') . '/'
    exe "normal! gv\ef)"
endfun

function! hugohelper#HasFrontMatter()
    try
        call s:front_matter_format()
        return 1
    catch
    endtry
    return 0
endfun

function! s:get_visual_selection()
    " From http://stackoverflow.com/a/6271254/794380
    let [lnum1, col1] = getpos("'<")[1:2]
    let [lnum2, col2] = getpos("'>")[1:2]
    let lines = getline(lnum1, lnum2)
    let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)]
    let lines[0] = lines[0][col1 - 1:]
    return join(lines, "\n")
endfun

function! s:front_matter_format()
    let l:line = getline(1)
    if l:line =~ '+++'
        return 'toml'
    elseif l:line =~ '---'
        return 'yaml'
    else
        throw "Could not determine Hugo front matter format. Looking for +++ or ---. JSON not supported."
    endif
endfun

function! s:set_key(key, value)
    let l:format = s:front_matter_format()
    if l:format == 'toml'
        exe '1;/+++/substitute/^' . a:key . '\s*=.*/' . a:key . ' = ' . a:value
    elseif l:format == 'yaml'
        exe '1;/---/substitute/^' . a:key . '\s*:.*/' . a:key . ': ' . a:value
    else
        throw "Can't set key, value pair for unknown format " . l:format
    endif
endfun

function! s:hugo_now()
    " Contrust a time string using the format: 2018-09-18T19:41:32-07:00
    let l:time = strftime("%FT%T%z")
    return l:time[:-3] . ':' . l:time[-2:]
endfun

" vim: expandtab shiftwidth=4
