mixin para(t, hypertext)
    if t
        if hypertext
            //- TODO! need to sanitize
            p=t
            //-   | !{t}
        else
            each line in t.split(/\n/)
                if line
                    if line.startsWith('  ')
                        code=line
                        br
                    else
                        p=line

mixin mpara(l, hypertext)
    if l
        each d in l
            if d.value
                +para(d.value, hypertext)
mixin aggpara(l)
    if l
        ul
            each k, v in l
                li
                    b=k.join(', ')
                    p
                        +para(v)

mixin linklist(l, url)
    each v, i in l
        if(i < l.length-2)
            if(url)
                a(href=url+v)=v
            else
                = v
            | , 
        else
            if(i == l.length - 1 && i > 0)
                |  and 
            if(url)
                a(href=url+v)=v
            else
                =v

mixin CVSS(value)
    if value.baseScore
        = value.baseScore.toFixed(1)
    |  
    if value.version >= "3"
        | (
        a(href="https://cvss.js.org/#" + value.vectorString)=value.vectorString
        | )
    else
        a(href='https://nvd.nist.gov/vuln-metrics/cvss/v2-calculator?vector='+value.vectorString)=value.vectorString

mixin renderDate(value)
    - var v = false;
    - if (value instanceof Date) { v = value;} else {
    -   var timestamp = Date.parse(value);
    -   v = isNaN(timestamp) ? false : new Date(timestamp)
    - }
    if v
        = v.toJSON().substr(0,10)

mixin jsondump(obj)
    if obj !== null
        if typeof obj === 'string'
            if obj.length < 20
                span(class=obj)=obj
            else
                span.wrp=obj
        else if obj instanceof Array
            if obj.length > 0
                ol
                    for v, k in obj
                        li
                            +jsondump(v)
        else if typeof obj === 'object'
            for v, k in obj
                if obj.hasOwnProperty(k)
                    .indent
                        b.ico(class=k)=k
                            | : 
                        |  
                        +jsondump(v)
        else
            =obj

block content
    block pageDef
        mixin page(obj)
            +jsondump(obj)
    .big=doc_id
    if doc
        if renderTemplate == 'default'
            - delete doc._id;
            +page(doc)
        else if renderTemplate != undefined
            block renderPage
                - try {
                    +#{renderTemplate}(doc)
                - } catch(e) {
                    - delete doc._id;        
                    +page(doc)
                - }
    else
        .tred Document not found