Skip to content

Commit a2c8dd8

Browse files
committed
Refactor view finding
1 parent cceb922 commit a2c8dd8

File tree

1 file changed

+84
-80
lines changed

1 file changed

+84
-80
lines changed

autoload/rails.vim

Lines changed: 84 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,11 @@ function! s:lastmethod(...)
281281
return rails#buffer().last_method(a:0 ? a:1 : line("."))
282282
endfunction
283283

284-
function! s:readable_last_format(start) dict abort
284+
function! s:readable_format(start) dict abort
285+
let format = matchstr(self.getline(a:start), '\%(:formats *=>\|\<formats:\) *\[\= *[:''"]\zs\w\+')
286+
if format !=# ''
287+
return format
288+
endif
285289
if self.type_name('view')
286290
let format = fnamemodify(self.path(),':r:e')
287291
if format == ''
@@ -302,21 +306,14 @@ function! s:readable_last_format(start) dict abort
302306
let line -= 1
303307
endwhile
304308
endif
305-
return ""
309+
return self.type_name('mailer') ? 'text' : 'html'
306310
endfunction
307311

308-
function! s:format(...)
309-
let format = rails#buffer().last_format(a:0 > 1 ? a:2 : line("."))
310-
return format ==# '' && a:0 ? a:1 : format
312+
function! s:format()
313+
return rails#buffer().format(line('.'))
311314
endfunction
312315

313-
call s:add_methods('readable',['end_of','last_opening_line','last_method_line','last_method','last_format','define_pattern'])
314-
315-
let s:view_types = split('rhtml,erb,rxml,builder,rjs,mab,liquid,haml,dryml,mn,slim',',')
316-
317-
function! s:viewspattern()
318-
return '\%('.join(s:view_types,'\|').'\)'
319-
endfunction
316+
call s:add_methods('readable',['end_of','last_opening_line','last_method_line','last_method','format','define_pattern'])
320317

321318
function! s:controller(...)
322319
return rails#buffer().controller_name(a:0 ? a:1 : 0)
@@ -937,7 +934,7 @@ function! s:BufCommands()
937934
command! -buffer -bar -nargs=? -complete=customlist,s:Complete_environments Rdbext :call s:BufDatabase(2,<q-args>)|let b:dbext_buffer_defaulted = 1
938935
endif
939936
let ext = expand("%:e")
940-
if ext =~ s:viewspattern()
937+
if RailsFilePath() =~ '\<app/views/'
941938
" TODO: complete controller names with trailing slashes here
942939
command! -buffer -bar -bang -nargs=? -range -complete=customlist,s:controllerList Rextract :<line1>,<line2>call s:Extract(<bang>0,<f-args>)
943940
endif
@@ -1870,7 +1867,7 @@ function! s:RailsFind()
18701867

18711868
" UGH
18721869
let buffer = rails#buffer()
1873-
let format = s:format('html')
1870+
let format = s:format()
18741871

18751872
let res = s:findit('\v\s*<require\s*\(=\s*File.dirname\(__FILE__\)\s*\+\s*[:'."'".'"](\f+)>.=',expand('%:h').'/\1')
18761873
if res != ""|return res.(fnamemodify(res,':e') == '' ? '.rb' : '')|endif
@@ -2587,6 +2584,60 @@ function! s:observerEdit(cmd,...)
25872584
call s:EditSimpleRb(a:cmd,"observer",a:0? a:1 : s:model(1),"app/models/","_observer.rb")
25882585
endfunction
25892586

2587+
function! s:dotcmp(i1, i2)
2588+
return strlen(s:gsub(a:i1,'[^.]', '')) - strlen(s:gsub(a:i2,'[^.]', ''))
2589+
endfunc
2590+
2591+
let s:view_types = split('rhtml,erb,rxml,builder,rjs,haml',',')
2592+
2593+
function! s:readable_resolve_view(name,...) dict abort
2594+
let name = a:name
2595+
let pre = 'app/views/'
2596+
if name !~# '/'
2597+
let controller = self.controller_name(1)
2598+
if controller != ''
2599+
let name = controller.'/'.name
2600+
endif
2601+
endif
2602+
if name =~# '\.\w\+\.\w\+$' || name =~# '\.\%('.join(s:view_types,'\|').'\)$'
2603+
return pre.name
2604+
else
2605+
for format in ['.'.self.format(a:0 ? a:1 : 0), '']
2606+
let found = self.app().relglob('', 'app/views/'.name.format.'.*')
2607+
call sort(found, s:function('s:dotcmp'))
2608+
if !empty(found)
2609+
return found[0]
2610+
endif
2611+
endfor
2612+
endif
2613+
return ''
2614+
endfunction
2615+
2616+
function! s:readable_resolve_layout(name, ...) dict abort
2617+
let name = a:name
2618+
if name ==# ''
2619+
let name = self.controller_name(1)
2620+
endif
2621+
if name !~# '/'
2622+
let name = 'layouts/'.name
2623+
endif
2624+
let view = self.resolve_view(name, a:0 ? a:1 : 0)
2625+
if view ==# '' && a:name ==# ''
2626+
let view = self.resolve_view('layouts/application', a:0 ? a:1 : 0)
2627+
endif
2628+
return view
2629+
endfunction
2630+
2631+
call s:add_methods('readable', ['resolve_view', 'resolve_layout'])
2632+
2633+
function! s:findview(name)
2634+
return rails#buffer().resolve_view(a:name, line('.'))
2635+
endfunction
2636+
2637+
function! s:findlayout(name)
2638+
return rails#buffer().resolve_layout(a:name, line('.'))
2639+
endfunction
2640+
25902641
function! s:viewEdit(cmd,...)
25912642
if a:0 && a:1 =~ '^[^!#:]'
25922643
let view = matchstr(a:1,'[^!#:]*')
@@ -2605,65 +2656,26 @@ function! s:viewEdit(cmd,...)
26052656
if view !~ '/'
26062657
return s:error("Cannot find view without controller")
26072658
endif
2608-
let file = "app/views/".view
2609-
let found = s:findview(view)
2659+
let found = rails#buffer().resolve_view(view, line('.'))
2660+
let djump = a:0 ? matchstr(a:1,'!.*\|#\zs.*\|:\zs\d*\ze\%(:in\)\=$') : ''
26102661
if found != ''
2611-
let dir = fnamemodify(rails#app().path(found),':h')
2612-
if !isdirectory(dir)
2613-
if a:0 && a:1 =~ '!'
2614-
call mkdir(dir,'p')
2615-
else
2616-
return s:error('No such directory')
2617-
endif
2618-
endif
26192662
call s:edit(a:cmd,found)
2620-
elseif file =~ '\.\w\+$'
2621-
call s:findedit(a:cmd,file)
2663+
call s:djump(djump)
2664+
elseif a:0 && a:1 =~# '!'
2665+
call s:edit(a:cmd,'app/views/'.view)
2666+
call s:djump(djump)
26222667
else
2623-
let format = s:format(rails#buffer().type_name('mailer') ? 'text' : 'html')
2624-
if glob(rails#app().path(file.'.'.format).'.*[^~]') != ''
2625-
let file .= '.' . format
2626-
endif
26272668
call s:findedit(a:cmd,file)
26282669
endif
26292670
endfunction
26302671

2631-
function! s:findview(name)
2632-
let self = rails#buffer()
2633-
let name = a:name
2634-
let pre = 'app/views/'
2635-
if name !~# '/'
2636-
let controller = self.controller_name(1)
2637-
if controller != ''
2638-
let name = controller.'/'.name
2639-
endif
2640-
endif
2641-
if name =~# '\.\w\+\.\w\+$' || name =~# '\.'.s:viewspattern().'$'
2642-
return pre.name
2643-
else
2644-
for format in ['.'.s:format('html'), '']
2645-
for type in s:view_types
2646-
if self.app().has_file(pre.name.format.'.'.type)
2647-
return pre.name.format.'.'.type
2648-
endif
2649-
endfor
2650-
endfor
2651-
endif
2652-
return ''
2653-
endfunction
2654-
2655-
function! s:findlayout(name)
2656-
return s:findview("layouts/".(a:name == '' ? 'application' : a:name))
2657-
endfunction
2658-
26592672
function! s:layoutEdit(cmd,...)
2660-
if a:0
2673+
if a:0 && a:1 =~# '/'
2674+
return s:viewEdit(a:cmd,a:1)
2675+
elseif a:0
26612676
return s:viewEdit(a:cmd,"layouts/".a:1)
26622677
endif
2663-
let file = s:findlayout(s:controller(1))
2664-
if file == ""
2665-
let file = s:findlayout("application")
2666-
endif
2678+
let file = s:findlayout('')
26672679
if file == ""
26682680
let file = "app/views/layouts/application.html.erb"
26692681
endif
@@ -3022,10 +3034,7 @@ function! s:readable_related(...) dict abort
30223034
let lastmethod = self.last_method(a:1)
30233035
if self.type_name('controller','mailer') && lastmethod != ""
30243036
let root = s:sub(s:sub(s:sub(f,'/application%(_controller)=\.rb$','/shared_controller.rb'),'/%(controllers|models|mailers)/','/views/'),'%(_controller)=\.rb$','/'.lastmethod)
3025-
let format = self.last_format(a:1)
3026-
if format == ''
3027-
let format = self.type_name('mailer') ? 'text' : 'html'
3028-
endif
3037+
let format = self.format(a:1)
30293038
if glob(self.app().path().'/'.root.'.'.format.'.*[^~]') != ''
30303039
return root . '.' . format
30313040
else
@@ -3062,8 +3071,6 @@ function! s:readable_related(...) dict abort
30623071
endif
30633072
elseif self.type_name('controller')
30643073
return s:sub(s:sub(f,'/controllers/','/helpers/'),'%(_controller)=\.rb$','_helper.rb')
3065-
" elseif self.type_name('helper')
3066-
" return s:findlayout(s:controller())
30673074
elseif self.type_name('model-arb')
30683075
let table_name = matchstr(join(self.getline(1,50),"\n"),'\n\s*self\.table_name\s*=\s*[:"'']\zs\w\+')
30693076
if table_name == ''
@@ -3216,17 +3223,14 @@ function! s:Extract(bang,...) range abort
32163223
else
32173224
let curdir = fnamemodify(RailsFilePath(),':h')
32183225
endif
3219-
let curdir = rails_root."/".curdir
3220-
let dir = fnamemodify(file,":h")
3221-
let fname = fnamemodify(file,":t")
3222-
if fnamemodify(fname,":e") == ""
3223-
let name = fname
3224-
let fname .= ".".matchstr(expand("%:t"),'\.\zs.*')
3225-
elseif fnamemodify(fname,":e") !~ '^'.s:viewspattern().'$'
3226-
let name = fnamemodify(fname,":r")
3227-
let fname .= ".".ext
3228-
else
3229-
let name = fnamemodify(fname,":r:r")
3226+
let curdir = rails_root.'/'.curdir
3227+
let dir = fnamemodify(file,':h')
3228+
let fname = fnamemodify(file,':t')
3229+
let name = matchstr(file, '^[^.]*')
3230+
if fnamemodify(fname, ':e') == ''
3231+
let fname .= matchstr(expand('%:t'),'\..*')
3232+
elseif fnamemodify(fname, ':e') !=# ext
3233+
let fname .= '.'.ext
32303234
endif
32313235
let var = "@".name
32323236
let collection = ""

0 commit comments

Comments
 (0)