You may remember one of my previous posts on a Vim script I wrote to quickly open an issue in the browser from the OOo sources. As the patches/dev300/apply file is containing issues numbers formatted differently (in the form i#XXXXX instead of #iXXXXX#), I decided to tweak my script to support this other issues format.

The previous OpenIssue function was using expand("\<cword>") in order to get the selected issue. This is not working for the new format I wanted to support as # is a words delimiter. Thanks to word_tools.vim from Luc Hermitte, I have written a new function getting all the issues formats. Here is the new code:

" Get the issue number under the cursor. An issue number is containing
" digits, lating letters and #. The # characters are removed from the result.
" 
" Code heavily inspired from the words_tools.vim of Luc Hermitte
" http://hermitte.free.fr/vim/ressources/dollar_VIM/plugin/words_tools_vim.html
function! GetCurrentIssueText()
  let c = col ('.')-1
  let l = line('.')
  let ll = getline(l)
  let ll1 = strpart(ll,0,c)
  let ll1 = matchstr(ll1,'[0-9#a-zA-Z]*$')
  if strlen(ll1) == 0
    return ll1
  else
    let ll2 = strpart(ll,c,strlen(ll)-c+1)
    let ll2 = strpart(ll2,0,match(ll2,'$\|[^0-9#a-zA-Z]'))
    let text = ll1.ll2

    let text = substitute( text, "#", "", "g" )
    return text
  endif
endfunction

" Open IssueZilla / Bugzilla for the selected issue
function! OpenIssue( )

    let s:browser = "firefox"

    let s:issueText = GetCurrentIssueText( )
    let s:urlTemplate = ""
    let s:pattern = "\\(\\a\\+\\)\\(\\d\\+\\)"

    let s:prefix = substitute( s:issueText, s:pattern, "\\1", "" )
    let s:id = substitute( s:issueText, s:pattern, "\\2", "" )

    if s:prefix == "i"
        let s:urlTemplate = "http://qa.openoffice.org/issues/show_bug.cgi?id=%"
    elseif s:prefix == "n"
        let s:urlTemplate = "https://bugzilla.novell.com/show_bug.cgi?id=%"
    endif

    if s:urlTemplate != ""
        let s:url = substitute( s:urlTemplate, "%", s:id, "g" )
        let s:cmd = "silent !" . s:browser . " " . s:url . "&"
        execute s:cmd
    endif
endfunction

map   :call OpenIssue()