139 lines
4.1 KiB
VimL
Executable File
139 lines
4.1 KiB
VimL
Executable File
" Author: Mykola Golubyev ( Nickolay Golubev )
|
|
" Email: golubev.nikolay@gmail.com
|
|
" Site: www.railmoon.com
|
|
" Plugin: oscan
|
|
" Module: extractor#sco
|
|
" Purpose: extract sco taged headers or sco folded result
|
|
|
|
function! railmoon#oscan#extractor#sco#create()
|
|
let new_extractor = copy(s:tag_scan_sco_extractor)
|
|
|
|
|
|
let new_extractor.folded_result_start = searchpair('>>>', '', '<<<', 'bnW')
|
|
let new_extractor.folded_result_end = searchpair('>>>', '', '<<<', 'nW')
|
|
|
|
let new_extractor.buffer_number = bufnr('%')
|
|
|
|
let new_extractor.is_extract_tag_headers = 0 == new_extractor.folded_result_start
|
|
|
|
if new_extractor.is_extract_tag_headers
|
|
let new_extractor.description = 'SourceCodeObedience. Select header to move to'
|
|
else
|
|
let new_extractor.description = 'SourceCodeObedience. Select result to move to'
|
|
endif
|
|
|
|
return new_extractor
|
|
endfunction
|
|
|
|
let s:tag_scan_sco_extractor = {}
|
|
function! s:tag_scan_sco_extractor.process(record)
|
|
exec 'buffer '.self.buffer_number
|
|
update
|
|
e
|
|
exec a:record.data
|
|
|
|
if ! self.is_extract_tag_headers
|
|
Enter
|
|
endif
|
|
endfunction
|
|
|
|
function! s:tag_scan_sco_extractor.taged_headers_tags_by_line(line_number, line)
|
|
return split(substitute(a:line, '^\s*tags:\(.*\)', '\1', ''), ',')
|
|
endfunction
|
|
|
|
function! s:tag_scan_sco_extractor.taged_headers_header_by_line(line_number, line)
|
|
let line_with_header = getline(a:line_number - 1)
|
|
if line_with_header =~ '^\s*header:'
|
|
return [ substitute(line_with_header, '^\s*header:\(.*\)', '\1', '') ]
|
|
endif
|
|
|
|
return [ '[ '.substitute(a:line, '^\s*tags:\(.*\)', '\1', '').' ]' ]
|
|
endfunction
|
|
|
|
function! s:tag_scan_sco_extractor.extract_taged_headers()
|
|
let result = []
|
|
|
|
let pos = getpos('.')
|
|
call cursor(1, 1)
|
|
|
|
let pattern = '^\s*tags:'
|
|
|
|
let option = 'Wc'
|
|
|
|
while 1
|
|
let search_result = search(pattern, option)
|
|
|
|
if search_result == 0
|
|
break
|
|
endif
|
|
|
|
let line = getline(search_result)
|
|
|
|
let data = self.taged_headers_header_by_line(search_result, line)
|
|
let tag_list = self.taged_headers_tags_by_line(search_result, line)
|
|
|
|
call add(result, railmoon#oscan#record#create(data, tag_list, search_result, search_result))
|
|
|
|
let option = 'W'
|
|
endwhile
|
|
|
|
call setpos('.', pos)
|
|
|
|
return result
|
|
endfunction
|
|
|
|
let s:smart_mark_pattern_comment = '\s\+```\(.*[^>]\)>>.*$'
|
|
let s:smart_mark_pattern_without_comment = '@\s\+\(\S\+\)\s\+\(\d*\)\s\(.*\)'
|
|
let s:smart_mark_pattern = s:smart_mark_pattern_without_comment.s:smart_mark_pattern_comment
|
|
|
|
let s:sco_result_pattern = '^#\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\d\+\)\s\+\(.*\)$'
|
|
|
|
function! s:tag_scan_sco_extractor.extract_sco_results()
|
|
let result = []
|
|
|
|
let line_number = self.folded_result_start + 1
|
|
|
|
while line_number < self.folded_result_end
|
|
let line = getline(line_number)
|
|
|
|
if line =~ s:sco_result_pattern
|
|
let file_name = substitute(line, s:sco_result_pattern, '\1', '')
|
|
let function_name = substitute(line, s:sco_result_pattern, '\2', '')
|
|
let file_line_number = substitute(line, s:sco_result_pattern, '\3', '')
|
|
let body = substitute(line, s:sco_result_pattern, '\4', '')
|
|
|
|
let short_file_name = fnamemodify(file_name, ':t')
|
|
|
|
let tag_list = []
|
|
call extend(tag_list, railmoon#oscan#extractor#util#tags_from_line(body))
|
|
call add(tag_list, function_name)
|
|
call extend(tag_list, railmoon#oscan#extractor#util#tags_from_file_name(file_name))
|
|
|
|
call add(result, railmoon#oscan#record#create([ body ], tag_list, line_number, short_file_name))
|
|
endif
|
|
|
|
let line_number += 1
|
|
endwhile
|
|
|
|
return result
|
|
endfunction
|
|
|
|
function! s:tag_scan_sco_extractor.extract()
|
|
if self.is_extract_tag_headers
|
|
return self.extract_taged_headers()
|
|
endif
|
|
|
|
|
|
return self.extract_sco_results()
|
|
endfunction
|
|
|
|
function! s:tag_scan_sco_extractor.colorize()
|
|
if self.is_extract_tag_headers
|
|
syntax match Comment '\[.*\]' contains=Keyword
|
|
syntax keyword Keyword tag symbol file include text grep calling contained
|
|
else
|
|
setf cpp
|
|
endif
|
|
endfunction
|
|
|