From 0fcd8d5a3c0098deb5c643bfb96bf264552e7c53 Mon Sep 17 00:00:00 2001 From: dinedine Date: Wed, 12 Jan 2011 16:54:09 +0100 Subject: [PATCH] new version of codemirror + enable liquid colorization + minify codemirror + cmd+S works on Safari, Firox and Chrome --- .gitignore | 2 +- config/assets.yml | 2 +- public/javascripts/admin/application.js | 17 +- public/javascripts/admin/plugins/cmd.js | 32 +- .../admin/plugins/codemirror/codemirror.js | 225 ++++-- .../plugins/codemirror/codemirror.min.js | 23 + .../plugins/codemirror/codemirror_base.min.js | 118 ++++ .../admin/plugins/codemirror/editor.js | 639 ++++++++++++------ .../admin/plugins/codemirror/highlight.js | 4 +- .../admin/plugins/codemirror/mirrorframe.js | 6 +- .../admin/plugins/codemirror/parsecss.js | 22 +- .../plugins/codemirror/parsehtmlmixed.js | 37 +- .../plugins/codemirror/parsejavascript.js | 19 +- .../admin/plugins/codemirror/parsesparql.js | 2 +- .../admin/plugins/codemirror/parsexml.js | 7 +- .../admin/plugins/codemirror/select.js | 268 +++++--- .../admin/plugins/codemirror/stringstream.js | 21 +- .../plugins/codemirror/tokenizejavascript.js | 2 +- .../admin/plugins/codemirror/undo.js | 30 +- .../admin/plugins/codemirror/util.js | 9 +- public/javascripts/admin/plugins/shortcut.js | 101 ++- public/javascripts/admin/theme_assets.js | 4 +- .../admin/plugins/codemirror/csscolors.css | 20 +- .../admin/plugins/codemirror/docs.css | 172 ++++- 24 files changed, 1246 insertions(+), 536 deletions(-) create mode 100644 public/javascripts/admin/plugins/codemirror/codemirror.min.js create mode 100644 public/javascripts/admin/plugins/codemirror/codemirror_base.min.js diff --git a/.gitignore b/.gitignore index f2d1892e..336a694e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ tmp/**/* rerun.txt uploads spec/tmp +public/assets public/sites public/uploads public/stylesheets/all.css @@ -29,4 +30,3 @@ config/deploy.rb perf/test.rb gem_graph.png sites/ - diff --git a/config/assets.yml b/config/assets.yml index 055991cb..173f8d49 100644 --- a/config/assets.yml +++ b/config/assets.yml @@ -57,7 +57,7 @@ javascripts: image_picker: - public/javascripts/admin/plugins/json2.js - public/javascripts/admin/plugins/scrollTo.js - - public/javascripts/admin/plugins/codemirror/codemirror.js + - public/javascripts/admin/plugins/codemirror/codemirror.min.js - public/javascripts/admin/plugins/fancybox.js - public/javascripts/admin/plugins/plupload/plupload.full.js - public/javascripts/admin/plugins/imagepicker.js diff --git a/public/javascripts/admin/application.js b/public/javascripts/admin/application.js index 06a13b06..80848730 100644 --- a/public/javascripts/admin/application.js +++ b/public/javascripts/admin/application.js @@ -19,27 +19,26 @@ $.growl.settings.dockCss = { /* ___ codemirror ___ */ var addCodeMirrorEditor = function(type, el, parser) { - if (type == 'liquid') type = 'xml'; - var parserfile = "parse" + type + ".js"; - if (parser != undefined) parserfile = parser; + parser = (parser || 'Liquid') + 'Parser'; var editor = CodeMirror.fromTextArea(el.attr('id'), { height: "400px", - parserfile: parserfile, stylesheet: [ "/stylesheets/admin/plugins/codemirror/csscolors.css", "/stylesheets/admin/plugins/codemirror/xmlcolors.css", "/stylesheets/admin/plugins/codemirror/javascriptcolors.css", "/stylesheets/admin/plugins/codemirror/liquidcolors.css"], - path: "/javascripts/admin/plugins/codemirror/", + basefiles: '/javascripts/admin/plugins/codemirror/codemirror_base.min.js', continuousScanning: 500, reindentOnLoad: true, initCallback: function(editor) { - jQuery(editor.frame.contentDocument).keypress(function(event) { + jQuery(editor.frame.contentDocument).keydown(function(event) { jQuery(document).trigger(event); }); + editor.setParser(parser); } }); + CodeMirrorEditors.push({ 'el': el, 'editor': editor }); } @@ -88,6 +87,9 @@ $(document).ready(function() { }); $('.formtastic li.error input').eq(0).focus(); + // nifty code editor + $('code.html textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); }); + // save form in AJAX $('form.save-with-shortcut').saveWithShortcut(); @@ -123,9 +125,6 @@ $(document).ready(function() { // nifty checkboxes $('.formtastic li.toggle input[type=checkbox]').checkToggle(); - // nifty code editor - $('code.html textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); }); - // site selector $('#site-selector').selectmenu({ style: 'dropdown', width: 395, offsetTop: 8, change: function(event, ui) { $('#site-selector').parent().submit(); diff --git a/public/javascripts/admin/plugins/cmd.js b/public/javascripts/admin/plugins/cmd.js index 7971670e..1c5d2ae3 100644 --- a/public/javascripts/admin/plugins/cmd.js +++ b/public/javascripts/admin/plugins/cmd.js @@ -1,13 +1,23 @@ -$.cmd = function(key, callback, args) { +$.cmd = function(key, callback, args, options) { + var keyCode = key.charCodeAt(0); + var altKeyCode = keyCode + (32 * (keyCode < 97 ? 1 : -1)); + + options = (options || { ignoreCase: false }); + + if (!options.ignoreCase) altKeyCode = null; + + $(document).keydown(function(e) { var isCtrl = false; - $(document).keydown(function(e) { - if(!args) args=[]; // IE barks when args is null - if(e.metaKey) isCtrl = true; - if(e.keyCode == key.charCodeAt(0) && isCtrl) { - callback.apply(this, args); - return false; - } - }).keyup(function(e) { - if(e.ctrlKey) isCtrl = false; - }); + + if (!args) args = []; // IE barks when args is null + + if (e.ctrlKey || e.metaKey) isCtrl = true; + + if ((keyCode == e.which || altKeyCode == e.which) && isCtrl) { + e.preventDefault(); + callback.apply(this, args); + return false; + } + }); + }; \ No newline at end of file diff --git a/public/javascripts/admin/plugins/codemirror/codemirror.js b/public/javascripts/admin/plugins/codemirror/codemirror.js index f4de2207..4d1c938a 100644 --- a/public/javascripts/admin/plugins/codemirror/codemirror.js +++ b/public/javascripts/admin/plugins/codemirror/codemirror.js @@ -1,4 +1,4 @@ -/* CodeMirror main module +/* CodeMirror main module (http://codemirror.net/) * * Implements the CodeMirror constructor and prototype, which take care * of initializing the editor frame, and providing the outside interface. @@ -21,12 +21,18 @@ var CodeMirror = (function(){ for (var i = 0; i < array.length; i++) action(array[i]); } + function createHTMLElement(el) { + if (document.createElementNS && document.documentElement.namespaceURI !== null) + return document.createElementNS("http://www.w3.org/1999/xhtml", el) + else + return document.createElement(el) + } // These default options can be overridden by passing a set of // options to a specific CodeMirror constructor. See manual.html for // their meaning. setDefaults(CodeMirrorConfig, { - stylesheet: "", + stylesheet: [], path: "", parserfile: [], basefiles: ["util.js", "stringstream.js", "select.js", "undo.js", "editor.js", "tokenize.js"], @@ -37,6 +43,7 @@ var CodeMirror = (function(){ lineNumberTime: 50, continuousScanning: false, saveFunction: null, + onLoad: null, onChange: null, undoDepth: 50, undoDelay: 800, @@ -45,20 +52,29 @@ var CodeMirror = (function(){ readOnly: false, width: "", height: "300px", + minHeight: 100, autoMatchParens: false, + markParen: null, + unmarkParen: null, parserConfig: null, tabMode: "indent", // or "spaces", "default", "shift" + enterMode: "indent", // or "keep", "flat" + electricChars: true, reindentOnLoad: false, activeTokens: null, - cursorActivity: null, + onCursorActivity: null, lineNumbers: false, + firstLineNumber: 1, + onLineNumberClick: null, indentUnit: 2, - domain: null + domain: null, + noScriptCaching: false, + incrementalLoading: false }); - function addLineNumberDiv(container) { - var nums = document.createElement("DIV"), - scroller = document.createElement("DIV"); + function addLineNumberDiv(container, firstNum) { + var nums = createHTMLElement("div"), + scroller = createHTMLElement("div"); nums.style.position = "absolute"; nums.style.height = "100%"; if (nums.style.setExpression) { @@ -66,27 +82,33 @@ var CodeMirror = (function(){ catch(e) {} // Seems to throw 'Not Implemented' on some IE8 versions } nums.style.top = "0px"; + nums.style.left = "0px"; nums.style.overflow = "hidden"; container.appendChild(nums); scroller.className = "CodeMirror-line-numbers"; nums.appendChild(scroller); + scroller.innerHTML = "
" + firstNum + "
"; return nums; } function frameHTML(options) { if (typeof options.parserfile == "string") options.parserfile = [options.parserfile]; + if (typeof options.basefiles == "string") + options.basefiles = [options.basefiles]; if (typeof options.stylesheet == "string") options.stylesheet = [options.stylesheet]; var html = [""]; // Hack to work around a bunch of IE8-specific problems. html.push(""); + var queryStr = options.noScriptCaching ? "?nocache=" + new Date().getTime().toString(16) : ""; forEach(options.stylesheet, function(file) { - html.push(""); + html.push(""); }); forEach(options.basefiles.concat(options.parserfile), function(file) { - html.push("