diff options
Diffstat (limited to 'vim/autoload/html/timestamp.vim')
-rw-r--r-- | vim/autoload/html/timestamp.vim | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/vim/autoload/html/timestamp.vim b/vim/autoload/html/timestamp.vim new file mode 100644 index 00000000..8f250710 --- /dev/null +++ b/vim/autoload/html/timestamp.vim @@ -0,0 +1,74 @@ +" Keys and date formats for return value of s:Timestamp() +let s:formats = { + \ 'human': '%a, %d %b %Y %T %Z', + \ 'machine': '%Y-%m-%dT%H:%M:%SZ', + \} + +" Get UTC timestamp string dictionary with layout in s:formats +function! s:Timestamp(time) abort + + " Force UTC, recording previous timezone, if any + if exists('$TZ') + let tz = $TZ + endif + let $TZ = 'UTC' + + " Get current time + let time = localtime() + + " Fill out timestamp dictionary + let timestamp = {} + for key in keys(s:formats) + let timestamp[key] = strftime(s:formats[key], time) + endfor + + " Clear UTC and restore previous timezone, if any + unlet $TZ + if exists('tz') + let $TZ = tz + endif + + " Return filled-out timestamp dictionary + return timestamp + +endfunction + +" Define timestamp prefix string +let s:prefix = 'Last updated: ' + +" Define pattern to match date timestamps; no ZALGO, please +let s:pattern = '\m\C' + \.s:prefix + \.'<time datetime="[^"]\+">' + \.'[^<]\+' + \.'</time>' + +" Update a timestamp +function! html#timestamp#Update() abort + + " Do nothing if the buffer hasn't been modified + if !&modified + return + endif + + " Find the first occurrence of the timestamp pattern, bail if none + let lnum = search(s:pattern, 'nw') + if !lnum + return + endif + + " Get timestamp dictionary + let timestamp = s:Timestamp(localtime()) + + " Fill out updated timestamp string with dictionary values + let update = s:prefix + \.'<time datetime="'.timestamp['machine'].'">' + \.timestamp['human'] + \.'</time>' + + " Apply the updated timestamp + let line = getline(lnum) + let line = substitute(line, s:pattern, update, '') + keepjumps call setline(lnum, line) + +endfunction |