handle variable-length front matter
This commit is contained in:
@@ -1,3 +1,90 @@
|
||||
" Script-local function that retrieves the front-matter of a file.
|
||||
function s:getfrontmatter(filename)
|
||||
let l:ext = fnamemodify(a:filename, ':e')
|
||||
if index(g:denote_note_file_extensions, l:ext) == -1
|
||||
return []
|
||||
endif
|
||||
" The following code aims to be as robust as possible. This is achieved by
|
||||
" parsing each file-type (extension) separately. A common signature of the
|
||||
" front matter is the empty line that separates the front matter from the
|
||||
" rest of the text. As fail safe, we assume that the front matter is shorter
|
||||
" than l:max lines.
|
||||
" Markdown:
|
||||
" - The first line is either '---' or '+++'.
|
||||
" - The last line is the same as the first line.
|
||||
" - All entries (apart first and last lines) are of the form '^\w\+:\?'.
|
||||
" - Contains the entry '^identifier'.
|
||||
" Org:
|
||||
" - All lines start with '^#+\w\+:\s*'.
|
||||
" - Contains the entry '^#identifier:
|
||||
" Text:
|
||||
" - The last line is '^-\+$.
|
||||
" - All lines start with '^\w\+:\s*.
|
||||
" - Contains the entry '^identifier:'
|
||||
"
|
||||
" Note: getbufline() returns an empty list if no more lines are available.
|
||||
let l:max = 50
|
||||
call bufload(a:filename)
|
||||
let l:fmt = []
|
||||
let l:lnr = 1
|
||||
let l:identifier_seen = v:false
|
||||
if l:ext == 'md'
|
||||
let l:separator = getbufline(a:filename, l:lnr)[0]
|
||||
if index(['---', '+++'], l:separator) == -1
|
||||
return []
|
||||
endif
|
||||
call add(l:fmt, l:separator)
|
||||
let l:lnr += 1
|
||||
while l:lnr < l:max
|
||||
let l:line = getbufline(a:filename, l:lnr)[0]
|
||||
if l:line == l:separator
|
||||
call add(l:fmt, l:line)
|
||||
return l:identifier_seen && getbufline(a:filename, l:lnr + 1)[0] == '' ? l:fmt : []
|
||||
endif
|
||||
if l:line !~ '^\w\+:\?'
|
||||
return []
|
||||
endif
|
||||
call add(l:fmt, l:line)
|
||||
if l:line =~ '^identifier'
|
||||
let l:identifier_seen = v:true
|
||||
endif
|
||||
let l:lnr += 1
|
||||
endwhile
|
||||
elseif l:ext == 'org'
|
||||
while l:lnr < l:max
|
||||
let l:line = getbufline(a:filename, l:lnr)[0]
|
||||
if l:line == ''
|
||||
return l:identifier_seen ? l:fmt : []
|
||||
endif
|
||||
if l:line !~ '^#+\w\+:'
|
||||
return []
|
||||
endif
|
||||
call add(l:fmt, l:line)
|
||||
if l:line =~ '^#+identifier:'
|
||||
let l:identifier_seen = v:true
|
||||
endif
|
||||
let l:lnr += 1
|
||||
endwhile
|
||||
elseif l:ext == 'txt'
|
||||
while l:lnr < l:max
|
||||
let l:line = getbufline(a:filename, l:lnr)[0]
|
||||
if l:line =~ '^-\+$'
|
||||
call add(l:fmt, l:line)
|
||||
return l:identifier_seen && getbufline(a:filename, l:lnr + 1)[0] == '' ? l:fmt : []
|
||||
endif
|
||||
if l:line !~ '^\w\+:'
|
||||
return []
|
||||
endif
|
||||
call add(l:fmt, l:line)
|
||||
if l:line =~ '^identifier:'
|
||||
let l:identifier_seen = v:true
|
||||
endif
|
||||
let l:lnr += 1
|
||||
endwhile
|
||||
endif
|
||||
return []
|
||||
endfunction
|
||||
|
||||
" Put all notes of the given tag to the location list. The search argument may be
|
||||
" empty. For improving search, white spaces are replaced by the * |wildcard|.
|
||||
function denote#notes#list(search)
|
||||
@@ -35,7 +122,7 @@ function denote#notes#new(title, ext=g:denote_new_ext)
|
||||
call denote#loclist#jumptowindow()
|
||||
" Open file and write front matter
|
||||
exe 'edit ' l:fn
|
||||
call setline(1, libdenote#fm_gen(a:ext, l:identifier, a:title))
|
||||
call setline(1, libdenote#fm_gen(a:ext, l:identifier, a:title, [], g:denote_fm_md_type))
|
||||
endfunction
|
||||
|
||||
" Function to set the title of the selected entry
|
||||
@@ -56,11 +143,18 @@ function denote#notes#settitle(linenr, title)
|
||||
if index(g:denote_note_file_extensions, l:ext) >= 0
|
||||
" Handle front matter
|
||||
call bufload(l:filename)
|
||||
let l:frontmatter = getbufline(l:filename,
|
||||
\ 1, 1 + libdenote#fm_len(fnamemodify(l:filename, ':e')))
|
||||
let l:frontmatter = libdenote#fm_alter(l:frontmatter, {'title': a:title})
|
||||
call setbufline(l:filename, 1, l:frontmatter)
|
||||
let curl=line('.')
|
||||
let l:frontmatter = s:getfrontmatter(l:filename)
|
||||
if empty(l:frontmatter)
|
||||
" Write fresh front matter
|
||||
let l:frontmatter = libdenote#fm_gen(l:ext, l:meta.id, l:meta.title, l:meta.tags, g:denote_fm_md_type)
|
||||
call add(l:frontmatter, '')
|
||||
call appendbufline(l:filename, 0, l:frontmatter)
|
||||
else
|
||||
" Modify front matter
|
||||
let l:frontmatter = libdenote#fm_alter(l:frontmatter, {'title': a:title})
|
||||
call setbufline(l:filename, 1, l:frontmatter)
|
||||
endif
|
||||
let curl = line('.')
|
||||
call denote#loclist#jumptowindow()
|
||||
exe 'silent buf ' .. l:bufnr
|
||||
exe 'silent file ' .. l:newfilename
|
||||
@@ -108,10 +202,18 @@ function denote#notes#tagmod(line1, line2, tag, add)
|
||||
if index(g:denote_note_file_extensions, l:ext) >= 0
|
||||
" Handle front matter
|
||||
call bufload(l:filename)
|
||||
let l:frontmatter = getbufline(l:filename, 1, 1 + libdenote#fm_len(fnamemodify(l:filename, ':e')))
|
||||
let l:frontmatter = libdenote#fm_alter(l:frontmatter, {'tags': l:meta.tags})
|
||||
call setbufline(l:filename, 1, l:frontmatter)
|
||||
let curl=line('.')
|
||||
let l:frontmatter = s:getfrontmatter(l:filename)
|
||||
if empty(l:frontmatter)
|
||||
" Write fresh front matter
|
||||
let l:frontmatter = libdenote#fm_gen(l:ext, l:meta.id, l:meta.title, l:meta.tags, g:denote_fm_md_type)
|
||||
call add(l:frontmatter, '')
|
||||
call appendbufline(l:filename, 0, l:frontmatter)
|
||||
else
|
||||
" Modify front matter
|
||||
let l:frontmatter = libdenote#fm_alter(l:frontmatter, {'tags': l:meta.tags})
|
||||
call setbufline(l:filename, 1, l:frontmatter)
|
||||
endif
|
||||
let curl = line('.')
|
||||
call denote#loclist#jumptowindow()
|
||||
exe 'silent buf ' .. l:bufnr
|
||||
exe 'silent file ' .. l:newfilename
|
||||
@@ -145,7 +247,7 @@ function denote#notes#copy(origfile)
|
||||
if index(g:denote_note_file_extensions, l:ext) >= 0
|
||||
call denote#loclist#jumptowindow()
|
||||
exe 'edit ' .. l:filename
|
||||
call appendbufline(l:filename, 0, libdenote#fm_gen(l:ext, l:identifier, l:title))
|
||||
call appendbufline(l:filename, 0, libdenote#fm_gen(l:ext, l:identifier, l:title), [], g:denote_fm_md_type)
|
||||
exe 'w'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
Reference in New Issue
Block a user