mixin print_val(val, depth, options)
    - if (val === undefined)
        span.undefined undefined
    - if (val === null)
        span.null null
    - else if (val instanceof Date)
        span.date #{val.toString()}
    - else if (typeof val === 'object')
        - if (Object.keys(val).length === 0)
            - if (val instanceof Array)
                span.array [ ]
            - else
                span.object { }
        - else
            mixin print_obj(val, depth + 1, options)
    - else if (typeof val === 'function')
        a.showFn args: #{val.length}, fn name: #{val.name}
        pre.fn !{val}
        - if (Object.keys(val).length)
            mixin print_obj(val, depth + 1, options)
    - else
        - _type = typeof val;
        span(class="#{_type}") #{val}

mixin print_obj(obj, depth, options)
    - depth = depth || 0;
    - options = options || {};
    - options.depth = options.depth || EDTsettings.depth;
    - options.sort = (options.sort === undefined) ? EDTsettings.sort : options.sort;
    - if (!obj.EDT_hidden)
        - if (depth < options.depth)
            - var keys = Object.keys(obj);
            - if (typeof options.sort === 'function')
                - keys = keys.sort(options.sort);
            - else if (options.sort)
                - keys = keys.sort();
            table.object
                thead: tr.collapse
                    - if (obj instanceof Array)
                        th.arr index
                    - else
                        th name
                    th value
                    th.indicator
                tbody
                    - keys.forEach(function(prop){
                        - var val = obj[prop]
                        - if (!val || val.EDT_hidden === undefined)
                            tr
                                td !{prop}
                                td(colspan=2): mixin print_val(val, depth, options)
                    - })
        - else
            span.exceeded (Depth exceeded; max depth: #{options.depth})
