//$Id$
jQuery.fn.extend({
flexibleSyntaxHighlighter: function(s) {
if ($(this).length === 0) {
return this;
}
s = jQuery.extend({
mode: "tiki",
lineNumbers: false,
lineWrapping: true,
readOnly: false,
force: false,
theme: window.codeMirrorTheme || 'default'
}, s);
if ($.isEmptyObject(syntaxHighlighter.modes)) {
syntaxHighlighter.modes = $.extend(syntaxHighlighter.modes, CodeMirror.modes);
}
var geshiColors = {
'4cs': '',
'6502acme': '',
'6502kickass': '',
'6502tasm': '',
'68000devpac': '',
'abap': '',
'actionscript3': '',
'actionscript': '',
'ada': '',
'algol68': '',
'apache': '',
'applescript': '',
'apt_sources': '',
'asm': '',
'asp': 'vbscript',
'autoconf': '',
'autohotkey': '',
'autoit': '',
'avisynth': '',
'awk': '',
'bash': 'shell',
'basic4gl': '',
'bf': '',
'bibtex': '',
'blitzbasic': '',
'bnf': '',
'boo': '',
'caddcl': '',
'cadlisp': '',
'cfdg': '',
'cfm': '',
'chaiscript': '',
'cil': '',
'clojure': 'clojure',
'c_mac': '',
'cmake': '',
'cobol': '',
'c': 'clike',
'cpp': 'clike',
'cpp-qt': 'clike',
'csharp': 'clike',
'css': 'css',
'cuesheet': '',
'dcs': '',
'delphi': '',
'diff': 'diff',
'div': '',
'dos': '',
'dot': '',
'd': '',
'ecmascript': '',
'eiffel': '',
'email': '',
'e': '',
'erlang': '',
'f1': '',
'fo': '',
'fortran': '',
'freebasic': '',
'fsharp': '',
'gambas': '',
'gdb': '',
'genero': '',
'genie': '',
'gettext': '',
'glsl': '',
'gml': '',
'gnuplot': '',
'go': 'go',
'groovy': 'groovy',
'gwbasic': '',
'haskell': 'haskell',
'hicest': '',
'hq9plus': '',
'html4strict': 'htmlmixed',
'icon': '',
'idl': '',
'ini': '',
'inno': '',
'intercal': '',
'io': '',
'java5': 'clike',
'java': 'clike',
'javascript': 'javascript',
'j': '',
'jquery': 'javascript',
'kixtart': '',
'klonec': '',
'klonecpp': '',
'latex': '',
'lb': '',
'lisp': '',
'locobasic': '',
'logtalk': '',
'lolcode': '',
'lotusformulas': '',
'lotusscript': '',
'lscript': '',
'lsl2': '',
'lua': 'lua',
'm68k': '',
'magiksf': '',
'make': '',
'mapbasic': '',
'matlab': '',
'mirc': '',
'mmix': '',
'modula2': '',
'modula3': '',
'mpasm': '',
'mxml': 'xml',
'mysql': 'sql',
'newlisp': '',
'nsis': '',
'oberon2': '',
'objc': 'clike',
'objeck': '',
'ocaml-brief': '',
'ocaml': '',
'oobas': '',
'oracle11': '',
'oracle8': '',
'oxygene': '',
'oz': '',
'pascal': 'pascal',
'pcre': '',
'perl6': 'perl',
'perl': 'perl',
'per': '',
'pf': '',
'php-brief': 'php',
'php': 'php',
'pic16': '',
'pike': '',
'pixelbender': '',
'plsql': 'plsql',
'postgresql': 'plsql',
'povray': '',
'powerbuilder': '',
'powershell': '',
'progress': '',
'prolog': '',
'properties': 'properties',
'providex': '',
'purebasic': '',
'python': 'python',
'qbasic': 'vbscript',
'q': '',
'rails': '',
'rebol': '',
'reg': '',
'robots': '',
'rpmspec': '',
'rsplus': 'r',
'ruby': 'ruby',
'sas': '',
'scala': '',
'scheme': '',
'scilab': '',
'sdlbasic': '',
'smalltalk': 'smalltalk',
'smarty': 'smarty',
'systemverilog': '',
'tcl': '',
'teraterm': '',
'text': '',
'thinbasic': '',
'tsql': 'sql',
'typoscript': '',
'unicon': '',
'vala': '',
'vbnet': 'vbscript',
'vb': 'vbscript',
'verilog': '',
'vhdl': '',
'vim': '',
'visualfoxpro': '',
'visualprolog': '',
'whitespace': '',
'whois': '',
'winbatch': '',
'xbasic': '',
'xml': 'xmlpure',
'xorg_conf': '',
'xpp': '',
'z80': '',
'zxbasic': ''
};
s.mode = (geshiColors[s.mode] ? geshiColors[s.mode] : s.mode);
jQuery(this).addClass('CodeMirrorPrepSize'); //we have to hide all the textareas or pre objects to know how much space we can take up
jQuery(this).each(function() {
var settings = jQuery.extend(true, {}, s);
settings.parent = jQuery(this).parent();
//removes the toggle button
settings.parent.find('.cm-remove').remove();
var o = jQuery(this);
if (o.hasClass('codeMirror') && !o.is(':visible')) return;
if ((!settings.force && !o.is('pre')) || !s.mode) {
if (!o.data('codemirror') || o.data("nocodemirror")) {
jQuery(this)
.removeClass('CodeMirrorPrepSize')
.show();
return;
}
}
var textarea;
settings.parent.visible(function() {
var syntax, wrap, theme, lineNumbers;
if (!o.is(':input')) {
syntax = o.data('syntax');
lineNumbers = o.data('line-numbers');
wrap = o.data('wrap');
theme = o.data('theme');
textarea = $('')
.val(o.text())
.insertAfter(o);
if (syntax) textarea.data('syntax', (geshiColors[syntax] ? geshiColors[syntax] : syntax));
if (lineNumbers) textarea.data('line-numbers', lineNumbers);
if (wrap) textarea.data('wrap', wrap);
if (theme) textarea.data('theme', theme);
settings.readOnly = true;
} else {
textarea = o;
settings.readOnly = textarea.attr('readonly'); //make sure we inherit the textarea's readonly attribute
}
//-->Width fix
settings.width = settings.parent.width();
settings.height = o.height();
o.removeClass('CodeMirrorPrepSize');
//prevent the bottom scrollbar from popping up if not enough height
settings.height = (settings.height < 25 ? 25 : settings.height);
settings.width = (settings.width < 50 ? 50 : settings.width);
//-->End Width fix
if (textarea.data('codeMirrorRelationshipFullscreen')) return false;
if (!textarea.length) return false;
if (!window.CodeMirror) return false;
function applyOverride(override, setting) {
var attr = textarea.data(override);
if (!settings[setting]) {
settings[setting] = attr;
} else if (!attr) {
attr = settings[setting];
}
settings[setting] = attr;
return settings[setting];
}
var mode = applyOverride('syntax', 'mode');
lineNumbers = applyOverride('line-numbers', 'lineNumbers');
wrap = applyOverride('wrap', 'lineWrapping');
theme = applyOverride('theme', 'theme');
if (s.readOnly) {
if (!syntaxHighlighter.modes.hasOwnProperty(mode)) {
o
.removeClass('CodeMirrorPrepSize')
.show();
textarea.remove();
return;
}
o.hide();
}
if (!mode) {
syntaxHighlighter.remove(textarea);
syntaxHighlighter.ready(textarea, settings, "");
} else {
o.addClass('CodeMirrorHide');
var scrollTop = o.scrollTop(),
textareaHeight = o.innerHeight();
syntaxHighlighter.remove(textarea);
var editor = syntaxHighlighter.ready(textarea, settings, mode),
editorWindow = jQuery(editor.getWrapperElement()).find('.CodeMirror-scroll').addBack(),
scroller = jQuery(editor.getScrollerElement());
scroller.scrollTop(scrollTop * (scroller.innerHeight() / textareaHeight));
o.removeClass('CodeMirrorHide');
editorWindow.find('div:first')
.css('width', 'auto')
.css('height', 'auto');
if (settings.readOnly) {
editorWindow
.css('height', 'auto')
.css('overflow', 'hidden');
}
o.trigger('syntaxHighlighterLoaded');
}
if (settings.theme == "off" && !settings.readOnly && $("textarea", this).data("codeMirrorRelationship") === 0) {
$(".cm-remove").click(); // cheap fix to have codemirror available but off by default
}
}, true);
});
return this;
}
});
//An effective way of interacting with a codemirror editor
var syntaxHighlighter;
syntaxHighlighter = {
modes: {},
ready: function (textarea, settings, mode) {
var changeCount = 0,
previewTimer = null,
previewDelay = 5000,
updateAutoSaveAndPreview = function () {
textarea.val(editor.getValue()).change();
if (window.auto_save) {
auto_save(textarea.attr('id'));
}
},
editor = CodeMirror.fromTextArea(textarea[0], {
stylesheet: 'default',
lineNumbers: settings.lineNumbers,
readOnly: settings.readOnly,
mode: mode,
lineWrapping: settings.lineWrapping,
theme: settings.theme === "off" ? "default" : settings.theme
});
settings = $.extend({
changeText: tr("Change Highlighter"),
removeText: tr("Toggle Highlighter")
}, settings);
editor.on("change", function (cm, change) {
previewDelay = 2000;
changeCount++;
if (previewTimer) {
clearTimeout(previewTimer);
}
if (changeCount > 25) {
changeCount = 0;
previewDelay = 100
}
previewTimer = setTimeout(updateAutoSaveAndPreview, previewDelay);
});
editor.on("blur", function () {
if (previewTimer) {
clearTimeout(previewTimer);
}
updateAutoSaveAndPreview();
});
if (settings.readOnly) {
$(editor.getWrapperElement())
.addClass('codelisting')
.css('padding', '0px');
}
// Only size the scrollbar - not the children!
if (settings.height) {
$(editor.getScrollerElement()).height(settings.height);
}
if (settings.width) {
//design has a max-width set, and we really shouldn't override that if possible, so account for that when setting width
var scroller = $(editor.getScrollerElement());
var maxWidth = (scroller.parent().css('max-width') + '').replace('px', '') * 1;
settings.width = (maxWidth < settings.width ? maxWidth : settings.width);
scroller
.width(settings.width);
}
var parents = textarea.parents('form');
if (!parents.data('codeMirrorActive')) {
parents
.submit(function () {
if (textarea.data('codeMirrorRelationship')) { //always get value from textarea, but onlu update it if active
textarea
.val(editor.getValue())
.change();
}
})
.data('codeMirrorActive', true);
}
if (!settings.readOnly) {
syntaxHighlighter.add(editor, textarea);
var changeButton = jQuery(
'' +
settings.changeText +
'')
.insertAfter(textarea.next())
.click(function () {
//Modes
var options = tr('Modes:') + '
';
options += "
";
//Modes
options += tr('Theme:') + '
';
options += '
';
//Others
options += tr('Options:') + '
';
options += '' + tr("Line Numbers") + '
';
options += '' + tr("Line Wrapping") + '
';
var msg = jQuery('