From 98e2821b38a775737e42a2479a6bc65107210859 Mon Sep 17 00:00:00 2001 From: Elliot Kroo Date: Thu, 11 Mar 2010 15:21:30 -0800 Subject: reorganizing the first level of folders (trunk/branch folders are not the git way :) --- infrastructure/ace/www/domline.js | 210 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 infrastructure/ace/www/domline.js (limited to 'infrastructure/ace/www/domline.js') diff --git a/infrastructure/ace/www/domline.js b/infrastructure/ace/www/domline.js new file mode 100644 index 0000000..70f86cc --- /dev/null +++ b/infrastructure/ace/www/domline.js @@ -0,0 +1,210 @@ +// THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.domline + +/** + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var domline = {}; +domline.noop = function() {}; +domline.identity = function(x) { return x; }; + +domline.addToLineClass = function(lineClass, cls) { + // an "empty span" at any point can be used to add classes to + // the line, using line:className. otherwise, we ignore + // the span. + cls.replace(/\S+/g, function (c) { + if (c.indexOf("line:") == 0) { + // add class to line + lineClass = (lineClass ? lineClass+' ' : '')+c.substring(5); + } + }); + return lineClass; +} + +// if "document" is falsy we don't create a DOM node, just +// an object with innerHTML and className +domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { + var result = { node: null, + appendSpan: domline.noop, + prepareForAdd: domline.noop, + notifyAdded: domline.noop, + clearSpans: domline.noop, + finishUpdate: domline.noop, + lineMarker: 0 }; + + var browser = (optBrowser || {}); + var document = optDocument; + + if (document) { + result.node = document.createElement("div"); + } + else { + result.node = {innerHTML: '', className: ''}; + } + + var html = []; + var preHtml, postHtml; + var curHTML = null; + function processSpaces(s) { + return domline.processSpaces(s, doesWrap); + } + var identity = domline.identity; + var perTextNodeProcess = (doesWrap ? identity : processSpaces); + var perHtmlLineProcess = (doesWrap ? processSpaces : identity); + var lineClass = 'ace-line'; + result.appendSpan = function(txt, cls) { + if (cls.indexOf('list') >= 0) { + var listType = /(?:^| )list:(\S+)/.exec(cls); + if (listType) { + listType = listType[1]; + if (listType) { + preHtml = ''; + } + result.lineMarker += txt.length; + return; // don't append any text + } + } + var href = null; + var simpleTags = null; + if (cls.indexOf('url') >= 0) { + cls = cls.replace(/(^| )url:(\S+)/g, function(x0, space, url) { + href = url; + return space+"url"; + }); + } + if (cls.indexOf('tag') >= 0) { + cls = cls.replace(/(^| )tag:(\S+)/g, function(x0, space, tag) { + if (! simpleTags) simpleTags = []; + simpleTags.push(tag.toLowerCase()); + return space+tag; + }); + } + if ((! txt) && cls) { + lineClass = domline.addToLineClass(lineClass, cls); + } + else if (txt) { + var extraOpenTags = ""; + var extraCloseTags = ""; + if (href) { + extraOpenTags = extraOpenTags+''; + extraCloseTags = ''+extraCloseTags; + } + if (simpleTags) { + simpleTags.sort(); + extraOpenTags = extraOpenTags+'<'+simpleTags.join('><')+'>'; + simpleTags.reverse(); + extraCloseTags = ''+extraCloseTags; + } + html.push('',extraOpenTags, + perTextNodeProcess(domline.escapeHTML(txt)), + extraCloseTags,''); + } + }; + result.clearSpans = function() { + html = []; + lineClass = ''; // non-null to cause update + result.lineMarker = 0; + }; + function writeHTML() { + var newHTML = perHtmlLineProcess(html.join('')); + if (! newHTML) { + if ((! document) || (! optBrowser)) { + newHTML += ' '; + } + else if (! browser.msie) { + newHTML += '
'; + } + } + if (nonEmpty) { + newHTML = (preHtml||'')+newHTML+(postHtml||''); + } + html = preHtml = postHtml = null; // free memory + if (newHTML !== curHTML) { + curHTML = newHTML; + result.node.innerHTML = curHTML; + } + if (lineClass !== null) result.node.className = lineClass; + } + result.prepareForAdd = writeHTML; + result.finishUpdate = writeHTML; + result.getInnerHTML = function() { return curHTML || ''; }; + + return result; +}; + +domline.escapeHTML = function(s) { + var re = /[&<>'"]/g; /']/; // stupid indentation thing + if (! re.MAP) { + // persisted across function calls! + re.MAP = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + } + return s.replace(re, function(c) { return re.MAP[c]; }); +}; + +domline.processSpaces = function(s, doesWrap) { + if (s.indexOf("<") < 0 && ! doesWrap) { + // short-cut + return s.replace(/ /g, ' '); + } + var parts = []; + s.replace(/<[^>]*>?| |[^ <]+/g, function(m) { parts.push(m); }); + if (doesWrap) { + var endOfLine = true; + var beforeSpace = false; + // last space in a run is normal, others are nbsp, + // end of line is nbsp + for(var i=parts.length-1;i>=0;i--) { + var p = parts[i]; + if (p == " ") { + if (endOfLine || beforeSpace) + parts[i] = ' '; + endOfLine = false; + beforeSpace = true; + } + else if (p.charAt(0) != "<") { + endOfLine = false; + beforeSpace = false; + } + } + // beginning of line is nbsp + for(var i=0;i Date: Thu, 25 Mar 2010 19:14:53 +0100 Subject: Added aceCreateDomline hook plus some code cleanup in the ace --- infrastructure/ace/www/domline.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'infrastructure/ace/www/domline.js') diff --git a/infrastructure/ace/www/domline.js b/infrastructure/ace/www/domline.js index 70f86cc..38cddf5 100644 --- a/infrastructure/ace/www/domline.js +++ b/infrastructure/ace/www/domline.js @@ -1,4 +1,5 @@ // THIS FILE IS ALSO AN APPJET MODULE: etherpad.collab.ace.domline +// %APPJET%: import("etherpad.admin.plugins"); /** * Copyright 2009 Google Inc. @@ -16,6 +17,10 @@ * limitations under the License. */ +// requires: top +// requires: plugins +// requires: undefined + var domline = {}; domline.noop = function() {}; domline.identity = function(x) { return x; }; @@ -92,12 +97,22 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { return space+tag; }); } + + var extraOpenTags = ""; + var extraCloseTags = ""; + + ((top == undefined) ? plugins : top.plugins).callHook( + "aceCreateDomLine", {domline:domline, cls:cls} + ).map(function (modifier) { + cls = modifier.cls; + extraOpenTags = extraOpenTags+modifier.extraOpenTags; + extraCloseTags = modifier.extraCloseTags+extraCloseTags; + }); + if ((! txt) && cls) { lineClass = domline.addToLineClass(lineClass, cls); } else if (txt) { - var extraOpenTags = ""; - var extraCloseTags = ""; if (href) { extraOpenTags = extraOpenTags+''; -- cgit v1.2.3-1-g7c22 From 0b3182ce6e606d7f87cfd25fb58602980b41bc97 Mon Sep 17 00:00:00 2001 From: Egil Moeller Date: Sat, 27 Mar 2010 16:44:50 +0100 Subject: Bugfix for the ace callHook support --- infrastructure/ace/www/domline.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'infrastructure/ace/www/domline.js') diff --git a/infrastructure/ace/www/domline.js b/infrastructure/ace/www/domline.js index 38cddf5..90e9943 100644 --- a/infrastructure/ace/www/domline.js +++ b/infrastructure/ace/www/domline.js @@ -101,7 +101,7 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { var extraOpenTags = ""; var extraCloseTags = ""; - ((top == undefined) ? plugins : top.plugins).callHook( + (function () { try { return top.plugins; } catch (e) { return plugins; }; })().callHook( "aceCreateDomLine", {domline:domline, cls:cls} ).map(function (modifier) { cls = modifier.cls; -- cgit v1.2.3-1-g7c22 From e794aa43d7977aa58a7ef8704ac212008e0280e9 Mon Sep 17 00:00:00 2001 From: "Simon B @piratpartiet" Date: Wed, 21 Apr 2010 10:55:30 +0200 Subject: Fix IFRAME bug. Closes #70 --- infrastructure/ace/www/domline.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'infrastructure/ace/www/domline.js') diff --git a/infrastructure/ace/www/domline.js b/infrastructure/ace/www/domline.js index 90e9943..016e868 100644 --- a/infrastructure/ace/www/domline.js +++ b/infrastructure/ace/www/domline.js @@ -101,7 +101,7 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { var extraOpenTags = ""; var extraCloseTags = ""; - (function () { try { return top.plugins; } catch (e) { return plugins; }; })().callHook( + parent.parent.plugins.callHook( "aceCreateDomLine", {domline:domline, cls:cls} ).map(function (modifier) { cls = modifier.cls; -- cgit v1.2.3-1-g7c22 From c318ce528125da08ec3d4b4714d35e1b59de73eb Mon Sep 17 00:00:00 2001 From: "Simon B @piratpartiet" Date: Thu, 22 Apr 2010 00:16:22 +0200 Subject: Bugfix regession from IFRAME+IE bugs. Closes GH-70 --- infrastructure/ace/www/domline.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'infrastructure/ace/www/domline.js') diff --git a/infrastructure/ace/www/domline.js b/infrastructure/ace/www/domline.js index 016e868..f1d19e4 100644 --- a/infrastructure/ace/www/domline.js +++ b/infrastructure/ace/www/domline.js @@ -101,7 +101,14 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { var extraOpenTags = ""; var extraCloseTags = ""; - parent.parent.plugins.callHook( + var plugins_; + if (typeof(plugins)!='undefined') { + plugins_ = plugins; + } else { + plugins_ = parent.parent.plugins; + } + + plugins_.callHook( "aceCreateDomLine", {domline:domline, cls:cls} ).map(function (modifier) { cls = modifier.cls; -- cgit v1.2.3-1-g7c22