'use strict'; /*@ Ox.SourceViewer Source Viewer options Options self Shared private variable ([options[, self]]) -> Source Viewer @*/ Ox.SourceViewer = function(options, self) { self = self || {}; var that = Ox.Container({}, self) .defaults({ file: '', replaceCode: [], replaceComment: [] }) .options(options) .addClass('OxSourceViewer'); self.options.replaceComment.unshift( // removes indentation inside
 tags
        [
            /
([\s\S]+)<\/pre>/g,
            function(pre, text) {
                var lines = trim(text).split('\n'),
                    indent = Ox.min(lines.map(function(line) {
                        var match = line.match(/^\s+/);
                        return match ? match[0].length : 0;
                    }));
                return '
' + lines.map(function(line) {
                    return line.slice(indent);
                }).join('\n') + '
'; } ] ); self.$table = $('').appendTo(that.$content); Ox.get(self.options.file, function(source) { var sections = [{comment: '', code: ''}]; Ox.tokenize(source).forEach(function(token, i) { // treat doc comments as code var type = token.type == 'comment' && token.value[2] != '@' ? 'comment' : 'code'; // remove '//' comments if (!/^\/\/[^@]/.test(token.value)) { if (type == 'comment' ) { i && sections.push({comment: '', code: ''}); token.value = Ox.parseMarkdown( trim(token.value.slice(2, -2)) ); self.options.replaceComment.forEach(function(replace) { token.value = token.value.replace( replace[0], replace[1] ); }); } Ox.last(sections)[type] += token.value; } }); sections.forEach(function(section) { var $section = $('') .appendTo(self.$table), $comment = $('
') .addClass('OxComment OxSerif OxSelectable') .html(Ox.addLinks(section.comment, true)) .appendTo($section), $code = $('') .addClass('OxCode') .append( Ox.SyntaxHighlighter({ replace: self.options.replaceCode, source: trim(section.code) }) ) .appendTo($section); }); setTimeout(function() { var height = that.height(); if (self.$table.height() < height) { self.$table.css({height: height + 'px'}); } }, 100); }); function trim(str) { // removes leading or trailing empty line return str.replace(/^\s*\n/, '').replace(/\n\s*$/, ''); } return that; };