### vim:ft=zsh:foldmethod=marker
## koders.com source code search backend for lookup
## Copyright: 2009, Frank Terbeck <ft@bewatermyfriend.org>

LOOKUP_guard || return 1
[[ -n ${lookup_describe} ]] &&
    printf '%s' 'source code search via koders.com' &&
    return 0

local lookup_context
local -a comp_args known_langs
local -A known_licences

lookup_context="$(LOOKUP_context)"

known_langs=(
#{{{
    "ActionScript"
    "Ada"
    "ASP"
    "ASP.NET"
    "Assembler"
    "C"
    "C#"
    "C++"
    "Cobol"
    "ColdFusion"
    "Delphi"
    "Eiffel"
    "Erlang"
    "Fortran"
    "Java"
    "JavaScript"
    "JSP"
    "Lisp"
    "Lua"
    "Mathematica"
    "Matlab"
    "ObjectiveC"
    "Perl"
    "PHP"
    "Prolog"
    "Python"
    "Ruby"
    "Scheme"
    "Smalltalk"
    "SQL"
    "Tcl"
    "VB"
    "VB.NET"
    "*"
#}}}
)

known_licences=(
#{{{
    AFL     'Academic Free Licence'
    AGPLv3  'Affero General Public Licence v3'
    AL20    'Apache Licence, Version 2.0'
    ASL     'Apache Software Licence'
    APSL    'Apple Public Source Licence'
    BSD     'Berkeley Software Distribution Licence'
    CPL     'Common Public Licence'
    EPL10   'Eclipse Public Licence v1.0'
    GTPL    'Globus Toolkit Public Licence'
    GPL     'GNU General Public Licence v1 v2 v3'
    LGPL    'GNU Lesser General Public Licence'
    IBMPL   'IBM Public Licence'
    IBMILA  'International Licence Agreement for Non-Warranted Programs'
    IOSL    'Intel Open Source Licence'
    MSCL    'Microsoft Community Licence'
    MSLCL   'Microsoft Limited Community Licence'
    MSPL    'Microsoft Permissive Licence'
    MSLPL   'Microsoft Limited Permissive Licence'
    MSRL    'Microsoft Reference Licence'
    MSVSSDK 'Microsoft Visual Studio SDK Licence'
    MITD    'MIT Derived Licence'
    MPL10   'Mozilla Public Licence Version 1.0'
    MPL11   'Mozilla Public Licence Version 1.1'
    NPL10   'Netscape Public Licence, Version 1.0'
    NPL11   'Netscape Public Licence, Version 1.1'
    OSL     'Open Software Licence'
    PHPL    'PHP Licence'
    CNRIPL  'Python Licence'
    PSFL    'Python Software Foundation Licence'
    SL      'Sleepycat Software Product Licence'
    SISSL   'Sun Industry Standards Source Licence'
    SPL     'Sun Public Licence'
    W3C     'W3C Software Licence'
    WXWLL   'wxWindows Library Licence'
    ZLL     'zlib/libpng Licence'
    ZPL     'Zope Public Licence'
    "*"     'Match all licences'
#}}}
)

LOOKUP_guard -fd LOOKUP_help_${backend} ||
function LOOKUP_help_${backend}() {
    LOOKUP_guard || return 1
    local l
    local -i i
    local -a ls

    i=8
    ls=(${(on)known_langs})

    printf 'usage: %s <query>\n' ${backend}
    printf '  -l <lang>     limit search to specific language\n'
    printf '  -L <licence>  limit search to specific licence\n'
    printf '\n Search source code via koders.com\n'
    printf '\nKnown languages:\n'
    while (( ${#ls} > 0 )) ; do
        if (( ${#ls} > i )) ; then
            print ' ' ${ls[1,$i]}
            shift $i ls
        else
            print ' ' ${ls}
            ls=()
        fi
    done
    printf '\nKnown licences:\n'
    for l in ${(kon)known_licences} ; do
        printf '%8s - %s\n' $l ${known_licences[$l]}
    done
    printf '\n Per default this backend makes unlimited searches.\n'
    printf ' Results include code from all languages in all licences.\n'
    printf '\n You may specify a default language and a default licence via\n'
    printf ' the default-lang and default-licence styles (both default to '\''*'\''\n'
    printf ' which means unlimited) in this context: %s\n' ${lookup_context}
    printf '\nExamples:\n'
    printf ' %% zstyle '\'':lookup:*:%s:*'\'' default-lang    C\n' ${backend}
    printf ' %% zstyle '\'':lookup:*:%s:*'\'' default-licence BSD\n\n' ${backend}
    printf ' %% lookup %s strlcpy\n' ${backend}
    printf ' %% lookup %s -l C handle_keys\n' ${backend}
    printf ' %% lookup %s -L GPL -l C strlcpy\n\n' ${backend}
}
LOOKUP_help && return 0

if [[ -n ${lookup_complete} ]] ; then

    LOOKUP_guard -fd __lookup_${backend}_langs ||
    function __lookup_${backend}_langs() {
        _describe -t koders_langs 'known languages' known_langs
    }

    LOOKUP_guard -fd __lookup_${backend}_licences ||
    function __lookup_${backend}_licences() {
        local l
        local -a ls

        ls=()
        for l in ${(k)known_licences}; do
            ls+=("$l:${known_licences[$l]}")
        done
        _describe -t koders_licences 'known licences' ls
    }

    comp_args=(
        '-l[limit search to specific language]:language:__lookup_'${backend}'_langs'
        '-L[limit search to specific licence]:licence:__lookup_'${backend}'_licences'
        '*:source code search string:true'
    )

    _arguments -s -w -A '-*' ${comp_args} && return 0
    _message 'source code search string'
    return 0
fi

local lang licence
local -x QUERY

zstyle -s "${lookup_context}" default-lang    lang    || lang='*'
zstyle -s "${lookup_context}" default-licence licence || licence='*'

lu_parseopts_args=( l string L string )
LOOKUP_parseopts "$@" || return 1
[[ -n ${opts[-l]} ]] && lang="${opts[-l]}"
[[ -n ${opts[-L]} ]] && licence="${opts[-L]}"

QUERY="${args[*]}"
LOOKUP_query_handler || return 1
if [[ -z ${QUERY} ]] ; then
    LOOKUP_help -f
    return 1
fi

LOOKUP_encode -s -q
LOOKUP_browser "http://koders.com/default.aspx?s=${QUERY}&la=${lang}&li=${licence}"
return $?
