Skip to content

Commit 3a45658

Browse files
committed
Add loader object to autoload available matchers on demand
1 parent bd23c89 commit 3a45658

File tree

3 files changed

+93
-50
lines changed

3 files changed

+93
-50
lines changed

autoload/fancy.vim

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,51 @@ call s:add_methods('matcher', [
175175
\ 'search_forward', 'search_backward'
176176
\ ])
177177

178+
" }}}
179+
" Loader prototype {{{
180+
181+
let s:loader_prototype = {}
182+
183+
fun! s:loader() abort
184+
let loader = {
185+
\ 'filetypes': {}
186+
\ }
187+
call extend(loader, s:loader_prototype, 'keep')
188+
return loader
189+
endf
190+
191+
fun! s:loader_load(ft) dict abort
192+
return self.filetypes[a:ft]
193+
endf
194+
195+
fun! s:loader_save(ft, list) dict abort
196+
let self.filetypes[a:ft] = a:list
197+
endf
198+
199+
fun! s:loader_is_cached(ft) dict abort
200+
return has_key(self.filetypes, a:ft)
201+
endf
202+
203+
fun! s:loader_load_by_filetype(ft) dict abort
204+
if self.is_cached(a:ft)
205+
return self.load(a:ft)
206+
else
207+
let matchers = fancy#ft#{a:ft}#matchers()
208+
call self.save(a:ft, matchers)
209+
return matchers
210+
endf
211+
212+
call s:add_methods('loader', [
213+
\ 'load', 'save', 'is_cached', 'load_by_filetype'
214+
\ ])
215+
178216
" }}}
179217
" Fancy prototype {{{
180218

181219
let s:fancy_prototype = {}
182220

183221
fun! s:fancy() abort
184-
let matchers = s:get_filetype_matchers(&filetype)
222+
let matchers = s:loader().load_by_filetype(&filetype)
185223
if empty(matchers)
186224
call s:error(printf('%s: no available matcher', &filetype))
187225
return
@@ -246,7 +284,7 @@ fun! s:lookup_fancy(id)
246284
return found[0]
247285
endf
248286

249-
fun! s:get_filetype_matchers(ft)
287+
fun! s:matchers_by_filetype(ft)
250288
if has_key(g:fancy_filetypes, a:ft)
251289
return g:fancy_filetypes[a:ft]
252290
endif

autoload/fancy/ft/markdown.vim

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
" Language: Markdown
2+
" Author: Vital Kudzelka
3+
" License: MIT
4+
5+
fun! fancy#ft#markdown#matchers()
6+
" Github Flavored Markdown {{{
7+
8+
let github_flavored_markdown = fancy#matcher()
9+
10+
fun! github_flavored_markdown.start_line(...) dict abort
11+
return self.search_backward('^\(\s\+\)\?```\w\+$')
12+
endf
13+
14+
fun! github_flavored_markdown.end_line(indent, ...) dict abort
15+
return self.search_forward('^\(\s\{'.a:indent.'\}\)\?```$')
16+
endf
17+
18+
fun! github_flavored_markdown.filetype(fancy) dict abort
19+
let text = join(a:fancy.buffer.read(
20+
\ a:fancy.matcher.start_at,
21+
\ a:fancy.matcher.start_at),
22+
\ '\n')
23+
return substitute(text, '\(\s\+\)\?```', '', '')
24+
endf
25+
26+
" }}}
27+
" Bitbucket {{{
28+
29+
let bitbucket_markdown = fancy#matcher()
30+
31+
fun! bitbucket_markdown.start_line(...) dict abort
32+
return self.search_backward('\(```\n\)\@<=\#!\w\+$')
33+
endf
34+
35+
fun! bitbucket_markdown.end_line(...) dict abort
36+
return self.search_forward('^```$')
37+
endf
38+
39+
fun! bitbucket_markdown.filetype(fancy) dict abort
40+
let text = join(a:fancy.buffer.read(
41+
\ a:fancy.matcher.start_at,
42+
\ a:fancy.matcher.start_at),
43+
\ '\n')
44+
return substitute(text, '\#!', '', '')
45+
endf
46+
47+
" }}}
48+
49+
return [
50+
\ bitbucket_markdown,
51+
\ github_flavored_markdown,
52+
\ ]
53+
endf

plugin/fancy.vim

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -24,51 +24,3 @@ augroup fancy_markdown
2424
augroup END
2525

2626
" }}}
27-
" Configuration {{{
28-
29-
let github_flavored_markdown = fancy#matcher()
30-
31-
fun! github_flavored_markdown.start_line(...) dict abort
32-
return self.search_backward('^\(\s\+\)\?```\w\+$')
33-
endf
34-
35-
fun! github_flavored_markdown.end_line(indent, ...) dict abort
36-
return self.search_forward('^\(\s\{'.a:indent.'\}\)\?```$')
37-
endf
38-
39-
fun! github_flavored_markdown.filetype(fancy) dict abort
40-
let text = join(a:fancy.buffer.read(
41-
\ a:fancy.matcher.start_at,
42-
\ a:fancy.matcher.start_at),
43-
\ '\n')
44-
return substitute(text, '\(\s\+\)\?```', '', '')
45-
endf
46-
47-
48-
let bitbucket_markdown = fancy#matcher()
49-
50-
fun! bitbucket_markdown.start_line(...) dict abort
51-
return self.search_backward('\(```\n\)\@<=\#!\w\+$')
52-
endf
53-
54-
fun! bitbucket_markdown.end_line(...) dict abort
55-
return self.search_forward('^```$')
56-
endf
57-
58-
fun! bitbucket_markdown.filetype(fancy) dict abort
59-
let text = join(a:fancy.buffer.read(
60-
\ a:fancy.matcher.start_at,
61-
\ a:fancy.matcher.start_at),
62-
\ '\n')
63-
return substitute(text, '\#!', '', '')
64-
endf
65-
66-
let filetypes = {}
67-
let filetypes.markdown = [
68-
\ bitbucket_markdown,
69-
\ github_flavored_markdown,
70-
\ ]
71-
72-
let g:fancy_filetypes = get(g:, 'fancy_filetypes', filetypes)
73-
74-
" }}}

0 commit comments

Comments
 (0)