trac-wysiwyg-0.12.0.3+r10725/ 0000755 0001750 0001750 00000000000 11677636642 013416 5 ustar wmb wmb trac-wysiwyg-0.12.0.3+r10725/0.12/ 0000755 0001750 0001750 00000000000 11677636642 013776 5 ustar wmb wmb trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/ 0000755 0001750 0001750 00000000000 11677636642 016372 5 ustar wmb wmb trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/__init__.py 0000644 0001750 0001750 00000004325 11346222740 020466 0 ustar wmb wmb # -*- coding: utf-8 -*- import re from trac.core import Component, implements from trac.config import ListOption from trac.ticket.web_ui import TicketModule from trac.web.api import IRequestFilter from trac.web.chrome import ITemplateProvider, add_link, add_stylesheet, add_script, add_script_data from trac.web.href import Href __all__ = ['WysiwygModule'] class WysiwygModule(Component): implements(ITemplateProvider, IRequestFilter) wysiwyg_stylesheets = ListOption('tracwysiwyg', 'wysiwyg_stylesheets', doc="""Add stylesheets to the WYSIWYG editor""") # ITemplateProvider#get_htdocs_dirs def get_htdocs_dirs(self): from pkg_resources import resource_filename return [('tracwysiwyg', resource_filename(__name__, 'htdocs'))] # ITemplateProvider#get_templates_dirs def get_templates_dirs(self): return [] # IRequestFilter#pre_process_request def pre_process_request(self, req, handler): return handler # IRequestFilter#post_process_request def post_process_request(self, req, template, data, content_type): options = {} options['escapeNewlines'] = False if template == 'ticket.html': options['escapeNewlines'] = TicketModule(self.env).must_preserve_newlines if options: add_script_data(req, { '_tracwysiwyg': options }) add_link(req, 'tracwysiwyg.base', req.href() or '/') stylesheets = ['chrome/common/css/trac.css', 'chrome/tracwysiwyg/editor.css'] stylesheets += self.wysiwyg_stylesheets for stylesheet in stylesheets: add_link(req, 'tracwysiwyg.stylesheet', _expand_filename(req, stylesheet)) add_stylesheet(req, 'tracwysiwyg/wysiwyg.css') add_script(req, 'tracwysiwyg/wysiwyg.js') add_script(req, 'tracwysiwyg/wysiwyg-load.js') return (template, data, content_type) def _expand_filename(req, filename): if filename.startswith('chrome/common/') and 'htdocs_location' in req.chrome: href = Href(req.chrome['htdocs_location']) return href(filename[14:]) if filename.startswith('/') or re.match(r'https?://', filename): href = Href(filename) return href() return req.href(filename) trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/htdocs/ 0000755 0001750 0001750 00000000000 11677636761 017660 5 ustar wmb wmb trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/htdocs/wysiwyg.css 0000644 0001750 0001750 00000010614 11317167602 022076 0 ustar wmb wmb iframe.wysiwyg { border: 1px solid #d7d7d7; clear: both; display: block; -moz-user-select: none; -webkit-user-select: none; } div.trac-resizable { clear: both; } iframe.wysiwyg:focus { border: 1px solid #886; } .editor-toggle { float: right; font-size: 80%; } .wysiwyg-toolbar { border: solid #d7d7d7; border-width: 1px 1px 1px 0; height: 18px; width: 400px; float: left; -moz-user-select: none; -webkit-user-select: none; } .wysiwyg-toolbar ul, .wysiwyg-toolbar li { list-style-type: none; margin: 0px; padding: 0px; } .wysiwyg-toolbar li { float: left; display: block; } .wysiwyg-toolbar li :link, .wysiwyg-toolbar li :visited { background: transparent url(toolbar.png) no-repeat; border: 1px solid #fff; border-left-color: #d7d7d7; cursor: default; display: block; width: 20px; height: 16px; color: #777; } .wysiwyg-toolbar li.selected :link, .wysiwyg-toolbar li.selected :visited { border: 1px solid #7c4; } .wysiwyg-toolbar li a:hover, .wysiwyg-toolbar li.selected a:hover { background-color: transparent; border: 1px solid #fb2; color: #886; } .wysiwyg-toolbar li a#wt-style { width: 62px; white-space: nowrap; overflow-x: hidden; line-height: 1.2; padding-left: 2px; padding-right: 2px; background-image: url(../common/desc.png); background-position: right bottom; } .wysiwyg-toolbar li a#wt-style span { display: none; } .wysiwyg-toolbar li.wysiwyg-menu-style a#wt-style span.wysiwyg-menu-style { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-paragraph a#wt-style span.wysiwyg-menu-paragraph { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading1 a#wt-style span.wysiwyg-menu-heading1 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading2 a#wt-style span.wysiwyg-menu-heading2 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading3 a#wt-style span.wysiwyg-menu-heading3 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading4 a#wt-style span.wysiwyg-menu-heading4 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading5 a#wt-style span.wysiwyg-menu-heading5 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-heading6 a#wt-style span.wysiwyg-menu-heading6 { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-code a#wt-style span.wysiwyg-menu-code { display: inline; } .wysiwyg-toolbar li.wysiwyg-menu-quote a#wt-style span.wysiwyg-menu-quote { display: inline; } .wysiwyg-toolbar li a#wt-em { background-position: 0 0; } .wysiwyg-toolbar li a#wt-strong { background-position: 0 -16px; } .wysiwyg-toolbar li a#wt-underline { background-position: 0 -32px; } .wysiwyg-toolbar li a#wt-monospace { background-position: 0 -160px; } .wysiwyg-toolbar li a#wt-link { background-position: 0 -96px; } .wysiwyg-toolbar li a#wt-unlink { background-position: 0 -112px; } .wysiwyg-toolbar li a#wt-ol { background-position: 0 -176px; } .wysiwyg-toolbar li a#wt-ul { background-position: 0 -192px; } .wysiwyg-toolbar li a#wt-outdent { background-position: 0 -208px; } .wysiwyg-toolbar li a#wt-indent { background-position: 0 -224px; } .wysiwyg-toolbar li a#wt-table { background-position: 0 -240px; } .wysiwyg-toolbar li a#wt-hr { background-position: 0 -128px; } .wysiwyg-toolbar li a#wt-br { background-position: 0 -144px; } .wysiwyg-toolbar li a#wt-remove { background-position: 0 -256px; } .wysiwyg-toolbar li a#wt-decorationmenu, .wysiwyg-toolbar li a#wt-tablemenu { width: 10px; background-image: url(../common/desc.png); background-position: center bottom; } .wysiwyg-menu { border: 1px solid #d7d7d7; padding: 1px 2px; background-color: #fff; -moz-opacity: 0.90; opacity: 0.90; } .wysiwyg-menu p, .wysiwyg-menu h1, .wysiwyg-menu h2, .wysiwyg-menu h3, .wysiwyg-menu h4, .wysiwyg-menu h5, .wysiwyg-menu h6, .wysiwyg-menu pre.wiki, .wysiwyg-menu blockquote.citation { margin: 0px; } .wysiwyg-menu ul, .wysiwyg-menu li { list-style-type: none; margin: 0px; padding: 0px; } .wysiwyg-menu :link, .wysiwyg-menu :visited { display: block; padding: 1px; border: 1px solid #fff; color: #000; } .wysiwyg-menu .selected :link, .wysiwyg-menu .selected :visited { border: 1px solid #7c4; } .wysiwyg-menu a:hover, .wysiwyg-menu .selected a:hover { border: 1px solid #fb2; } .wysiwyg-menu .menu { font-size: 85%; } trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/htdocs/wysiwyg-load.js 0000644 0001750 0001750 00000000125 10761221176 022632 0 ustar wmb wmb jQuery(document).ready(function($) { setTimeout(TracWysiwyg.initialize, 10); }); trac-wysiwyg-0.12.0.3+r10725/0.12/tracwysiwyg/htdocs/wysiwyg.js 0000644 0001750 0001750 00000431460 11642344654 021735 0 ustar wmb wmb var TracWysiwyg = function(textarea, options) { var self = this; var editorMode = TracWysiwyg.getEditorMode(); this.autolink = true; this.textarea = textarea; this.options = options = options || {}; var wikitextToolbar = null; var textareaResizable = null; if (/\btrac-resizable\b/i.test(textarea.className)) { var tmp = textarea.parentNode; tmp = tmp && tmp.parentNode; if (tmp && /\btrac-resizable\b/i.test(tmp.className)) { wikitextToolbar = tmp.previousSibling; textareaResizable = tmp; } } else { wikitextToolbar = textarea.previousSibling; } if (wikitextToolbar && (wikitextToolbar.nodeType != 1 || wikitextToolbar.className != "wikitoolbar")) { wikitextToolbar = null; } this.textareaResizable = textareaResizable; this.wikitextToolbar = wikitextToolbar; this.createEditable(document, textarea, textareaResizable); var frame = this.frame; var resizable = this.resizable; this.contentWindow = frame.contentWindow; this.contentDocument = this.contentWindow.document; this.initializeEditor(this.contentDocument); this.wysiwygToolbar = this.createWysiwygToolbar(document); this.styleMenu = this.createStyleMenu(document); this.decorationMenu = this.createDecorationMenu(document); this.tableMenu = this.createTableMenu(document); this.menus = [ this.styleMenu, this.decorationMenu, this.tableMenu ]; this.toolbarButtons = this.setupMenuEvents(); this.toggleEditorButtons = null; this.autolinkButton = null; this.savedWysiwygHTML = null; this.setupToggleEditorButtons(); this.setupSyncTextAreaHeight(); var styleStatic = { position: "static", left: "-9999px", top: "-9999px" }; var styleAbsolute = { position: "absolute", left: "-9999px", top: "-9999px" }; switch (editorMode) { case "textarea": TracWysiwyg.setStyle(textareaResizable || textarea, styleStatic); if (wikitextToolbar) { TracWysiwyg.setStyle(wikitextToolbar, styleStatic); } TracWysiwyg.setStyle(resizable || frame, { position: "absolute", left: "-9999px", top: TracWysiwyg.elementPosition(textareaResizable || textarea).top + "px" }); TracWysiwyg.setStyle(this.wysiwygToolbar, styleAbsolute); TracWysiwyg.setStyle(this.autolinkButton.parentNode, { display: "none" }); textarea.setAttribute("tabIndex", ""); frame.setAttribute("tabIndex", "-1"); break; case "wysiwyg": TracWysiwyg.setStyle(textareaResizable || textarea, { position: "absolute", left: "-9999px", top: TracWysiwyg.elementPosition(textareaResizable || textarea).top + "px" }); if (wikitextToolbar) { TracWysiwyg.setStyle(wikitextToolbar, styleAbsolute); } TracWysiwyg.setStyle(resizable || frame, styleStatic); TracWysiwyg.setStyle(this.wysiwygToolbar, styleStatic); TracWysiwyg.setStyle(this.autolinkButton.parentNode, { display: "" }); textarea.setAttribute("tabIndex", "-1"); frame.setAttribute("tabIndex", ""); break; } var body = document.body; for (var i = 0; i < this.menus.length; i++) { body.insertBefore(this.menus[i], body.firstChild); } var element = wikitextToolbar || textareaResizable || textarea; element.parentNode.insertBefore(this.toggleEditorButtons, element); element.parentNode.insertBefore(this.wysiwygToolbar, element); function lazySetup() { if (self.contentDocument.body) { var exception; try { self.execCommand("useCSS", false); } catch (e) { } try { self.execCommand("styleWithCSS", false); } catch (e) { } if (editorMode == "wysiwyg") { try { self.loadWysiwygDocument() } catch (e) { exception = e } } self.setupEditorEvents(); self.setupFormEvent(); if (exception) { (self.textareaResizable || self.textarea).style.position = "static"; if (self.wikitextToolbar) { self.wikitextToolbar.style.position = "static"; } (self.resizable || self.frame).style.position = self.wysiwygToolbar.style.position = "absolute"; self.autolinkButton.parentNode.style.display = "none"; alert("Failed to activate the wysiwyg editor."); throw exception; } } else { setTimeout(lazySetup, 100); } } lazySetup(); }; TracWysiwyg.prototype.initializeEditor = function(d) { var l = window.location; var html = []; html.push( '\n', '', '
', 'Code block', '
Quote' ]; var menu = d.createElement("div"); menu.className = "wysiwyg-menu"; TracWysiwyg.setStyle(menu, { position: "absolute", left: "-1000px", top: "-1000px", zIndex: 1000 }); menu.innerHTML = html.join("").replace(/ href="#">/g, ' href="#" onmousedown="return false" tabindex="-1">'); return menu; }; TracWysiwyg.prototype.createDecorationMenu = function(d) { var html = [ ' ' ]; var menu = d.createElement("div"); menu.className = "wysiwyg-menu"; TracWysiwyg.setStyle(menu, { position: "absolute", left: "-1000px", top: "-1000px", zIndex: 1000 }); menu.innerHTML = html.join("").replace(/ href="#">/g, ' href="#" onmousedown="return false" tabindex="-1">'); return menu; }; TracWysiwyg.prototype.createTableMenu = function(d) { var html = [ ' ' ]; var menu = d.createElement("div"); menu.className = "wysiwyg-menu"; TracWysiwyg.setStyle(menu, { position: "absolute", left: "-1000px", top: "-1000px", zIndex: 1000 }); menu.innerHTML = html.join("").replace(/ href="#">/g, ' href="#" onmousedown="return false" tabindex="-1">'); return menu; }; TracWysiwyg.prototype.setupMenuEvents = function() { function addToolbarEvent(element, self, args) { var method = args.shift(); addEvent(element, "click", function(event) { var w = self.contentWindow; TracWysiwyg.stopEvent(event || w.event); var keepMenus = false, exception; try { keepMenus = method.apply(self, args) } catch (e) { exception = e } if (!keepMenus) { self.hideAllMenus(); } element.blur(); w.focus(); if (exception) { throw exception; } }); } function argsByType(self, name, element) { switch (name) { case "style": return [ self.toggleMenu, self.styleMenu, element ]; case "strong": return [ self.execDecorate, "bold" ]; case "em": return [ self.execDecorate, "italic" ]; case "underline": return [ self.execDecorate, "underline" ]; case "strike": return [ self.execDecorate, "strikethrough" ]; case "sub": return [ self.execDecorate, "subscript" ]; case "sup": return [ self.execDecorate, "superscript" ]; case "monospace": return [ self.execDecorate, "monospace" ]; case "decorationmenu": return [ self.toggleMenu, self.decorationMenu, element ]; case "remove": return [ self.execCommand, "removeformat" ]; case "paragraph": return [ self.formatParagraph ]; case "heading1": return [ self.formatHeaderBlock, "h1" ]; case "heading2": return [ self.formatHeaderBlock, "h2" ]; case "heading3": return [ self.formatHeaderBlock, "h3" ]; case "heading4": return [ self.formatHeaderBlock, "h4" ]; case "heading5": return [ self.formatHeaderBlock, "h5" ]; case "heading6": return [ self.formatHeaderBlock, "h6" ]; case "link": return [ self.createLink ]; case "unlink": return [ self.execCommand, "unlink" ]; case "ol": return [ self.insertOrderedList ]; case "ul": return [ self.insertUnorderedList ]; case "outdent": return [ self.outdent ]; case "indent": return [ self.indent ]; case "table": return [ self.insertTable ]; case "tablemenu": return [ self.toggleMenu, self.tableMenu, element ]; case "insert-row-before": return [ self.insertTableRow, false ]; case "insert-row-after": return [ self.insertTableRow, true ]; case "insert-col-before": return [ self.insertTableColumn, false ]; case "insert-col-after": return [ self.insertTableColumn, true ]; case "delete-row": return [ self.deleteTableRow ]; case "delete-col": return [ self.deleteTableColumn ]; case "code": return [ self.formatCodeBlock ]; case "quote": return [ self.formatQuoteBlock ]; case "hr": return [ self.insertHorizontalRule ]; case "br": return [ self.insertLineBreak ]; } return null; } function setup(container) { var elements = container.getElementsByTagName("a"); var length = elements.length; for (var i = 0; i < length; i++) { var element = elements[i]; var name = element.id.replace(/^wt-/, ""); var args = argsByType(this, name, element); if (args) { addToolbarEvent(element, this, args); buttons[name] = element; } } } var buttons = {}; setup.call(this, this.wysiwygToolbar); for (var i = 0; i < this.menus.length; i++) { setup.call(this, this.menus[i]); } return buttons; }; TracWysiwyg.prototype.toggleMenu = function(menu, element) { if (parseInt(menu.style.left, 10) < 0) { this.hideAllMenus(menu); var position = TracWysiwyg.elementPosition(element); TracWysiwyg.setStyle(menu, { left: position[0] + "px", top: (position[1] + 18) + "px" }); } else { this.hideAllMenus(); } return true; }; TracWysiwyg.prototype.hideAllMenus = function(except) { var menus = this.menus; var length = menus.length; for (var i = 0; i < length; i++) { if (menus[i] != except) { TracWysiwyg.setStyle(menus[i], { left: "-1000px", top: "-1000px" }); } } }; TracWysiwyg.prototype.execDecorate = function(name) { if (this.selectionContainsTagName("pre")) { return; } var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor; var position = this.getSelectionPosition(); var ancestor = {}; ancestor.start = getSelfOrAncestor(position.start, /^(?:a|tt)$/); ancestor.end = getSelfOrAncestor(position.end, /^(?:a|tt)$/); this.expandSelectionToElement(ancestor); if (name != "monospace") { this.execCommand(name); } else { this.execDecorateMonospace(); } this.selectionChanged(); }; TracWysiwyg.prototype.execDecorateMonospace = function() { var html = this.getSelectionHTML(); var removePattern = /
");
}
}
}
addEvent(d, window.opera ? "keypress" : "keydown", listenerKeydown);
function listenerKeypress(event) {
event = event || self.contentWindow.event;
var modifier = (event.ctrlKey ? 0x40000000 : 0)
| (event.shiftKey ? 0x20000000 : 0) | (event.altKey ? 0x10000000 : 0);
switch (event.charCode || event.keyCode) {
case 0x20: // SPACE
self.detectTracLink(event);
return;
case 0x3e: // ">"
self.detectTracLink(event);
return;
case 0x0d: // ENTER
self.detectTracLink(event);
switch (modifier) {
case 0:
if (self.insertParagraphOnEnter) {
self.insertParagraphOnEnter(event);
}
break;
case 0x20000000: // Shift
if (self.insertLineBreakOnShiftEnter) {
self.insertLineBreakOnShiftEnter(event);
}
break;
}
return;
}
}
addEvent(d, "keypress", listenerKeypress);
function listenerKeyup(event) {
var keyCode = event.keyCode;
if (ime) {
switch (keyCode) {
case 0x20: // SPACE
self.detectTracLink(event);
break;
}
ime = false;
}
self.selectionChanged();
}
addEvent(d, "keyup", listenerKeyup);
function listenerMouseup(event) {
self.selectionChanged();
}
addEvent(d, "mouseup", listenerMouseup);
function listenerClick(event) {
self.hideAllMenus();
self.selectionChanged();
}
addEvent(d, "click", listenerClick);
};
TracWysiwyg.prototype.loadWysiwygDocument = function() {
var d = this.contentDocument;
var container = d.body;
var tmp;
while (tmp = container.lastChild) {
container.removeChild(tmp);
}
var fragment = this.wikitextToFragment(this.textarea.value, d, this.options);
container.appendChild(fragment);
this.savedWysiwygHTML = container.innerHTML;
};
TracWysiwyg.prototype.focusWysiwyg = function() {
var self = this;
var w = this.contentWindow;
function lazy() {
w.focus();
try { self.execCommand("useCSS", false); } catch (e) { }
try { self.execCommand("styleWithCSS", false); } catch (e) { }
self.selectionChanged();
}
setTimeout(lazy, 10);
};
TracWysiwyg.prototype.loadTracWikiText = function() {
this.textarea.value = this.domToWikitext(this.contentDocument.body, this.options);
this.savedWysiwygHTML = null;
};
TracWysiwyg.prototype.focusTextarea = function() {
this.textarea.focus();
};
TracWysiwyg.prototype.setupToggleEditorButtons = function() {
var div = document.createElement("div");
var mode = TracWysiwyg.editorMode;
var html = ''
+ ''
+ ' '
+ ' '
+ ' ';
div.className = "editor-toggle";
div.innerHTML = html.replace(/@/g, ++TracWysiwyg.count);
this.toggleEditorButtons = div;
var buttons = div.getElementsByTagName("input");
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
switch (button.type) {
case "checkbox":
var listener = this.listenerToggleAutolink(button);
addEvent(button, "click", listener);
addEvent(button, "keypress", listener);
this.autolinkButton = button;
break;
case "radio":
addEvent(button, "click", this.listenerToggleEditor(button.value));
break;
}
}
};
TracWysiwyg.prototype.setupSyncTextAreaHeight = function() {
var self = this;
var d = document;
var timer = null;
var editrows = document.getElementById("editrows");
if (editrows) {
addEvent(editrows, "change", changeHeight);
}
if (this.textareaResizable) {
addEvent(this.textarea.nextSibling, "mousedown", beginDrag);
}
function changeHeight() {
if (timer !== null) {
clearTimeout(timer);
}
setTimeout(sync, 10);
}
function beginDrag(event) {
addEvent(d, "mousemove", changeHeight);
addEvent(d, "mouseup", endDrag);
}
function endDrag(event) {
TracWysiwyg.removeEvent(d, "mousemove", changeHeight);
TracWysiwyg.removeEvent(d, "mouseup", endDrag);
}
function sync() {
timer = null;
self.syncTextAreaHeight();
}
};
TracWysiwyg.prototype.syncTextAreaHeight = function() {
var height = this.textarea.offsetHeight;
var frame = this.frame;
if (height > 0 && frame.height != height) {
frame.height = height;
}
};
TracWysiwyg.prototype.detectTracLink = function(event) {
if (!this.autolink) {
return;
}
var range = this.getSelectionRange();
var node = range.startContainer;
if (!node || !range.collapsed) {
return;
}
var getSelfOrAncestor = TracWysiwyg.getSelfOrAncestor;
if (getSelfOrAncestor(node, /^(?:a|tt|pre)$/)) {
return;
}
var offset = range.startOffset;
if (node.nodeType != 3) {
node = node.childNodes[offset];
while (node && node.nodeType != 3) {
node = node.lastChild;
}
if (!node) {
return;
}
offset = node.nodeValue.length;
}
else if (offset == 0) {
node = node.previousSibling;
if (!node || node.nodeType == 1) {
return;
}
offset = node.nodeValue.length;
}
var startContainer = node;
var endContainer = node;
var text = [ node.nodeValue.substring(0, offset) ];
for ( ; ; ) {
if (/[ \t\r\n\f\v]/.test(text[text.length - 1])) {
break;
}
node = node.previousSibling;
if (!node || node.nodeType == 1) {
break;
}
text.push(node.nodeValue);
startContainer = node;
}
text.reverse();
text = text.join("");
if (!text) {
return;
}
var pattern = this.wikiDetectTracLinkPattern;
pattern.lastIndex = /[^ \t\r\n\f\v]*$/.exec(text).index;
var match, tmp;
for (tmp = pattern.exec(text); tmp; tmp = pattern.exec(text)) {
match = tmp;
}
if (!match) {
return;
}
var label = match[0];
var link = this.normalizeTracLink(label);
var id = this.generateDomId();
var anchor = this.createAnchor(link, label, { id: id, "data-tracwysiwyg-autolink": "true" });
var anonymous = this.contentDocument.createElement("div");
anonymous.appendChild(anchor);
var html = anonymous.innerHTML;
node = endContainer;
var startOffset = match.index;
while (startContainer != node && startOffset >= startContainer.nodeValue.length) {
startOffset -= startContainer.nodeValue.length;
startContainer = startContainer.nextSibling;
}
var endOffset = startOffset + label.length;
endContainer = startContainer;
while (endContainer != node && endOffset >= endContainer.nodeValue.length) {
endOffset -= endContainer.nodeValue.length;
endContainer = endContainer.nextSibling;
}
this.selectRange(startContainer, startOffset, endContainer, endOffset);
offset = text.length - match.index - label.length;
if (offset == 0) {
switch (event.keyCode) {
case 0x20: // SPACE
this.insertHTML(html + "\u00a0");
TracWysiwyg.stopEvent(event);
return;
case 0x0d: // ENTER
if (event.shiftKey) {
if (window.opera || !anonymous.addEventListener) {
this.insertHTML(html + "
");
if (window.opera) {
anchor = this.contentDocument.getElementById(id);
node = anchor.parentNode;
offset = node.childNodes.length;
this.selectRange(node, offset, node, offset);
}
TracWysiwyg.stopEvent(event);
return;
}
}
this.insertHTML(html);
anchor = this.contentDocument.getElementById(id);
node = event.shiftKey ? anchor.parentNode : anchor;
offset = node.childNodes.length;
this.selectRange(node, offset, node, offset);
return;
}
}
this.insertHTML(html);
anchor = this.contentDocument.getElementById(id);
node = anchor.nextSibling;
if (!node) {
node = anchor.parentNode;
offset = node.childNodes.length;
}
this.selectRange(node, offset, node, offset);
};
TracWysiwyg.prototype.formatParagraph = function() {
if (this.selectionContainsTagName("table")) {
return;
}
this.execCommand("formatblock", "
"); this.selectionChanged(); }; TracWysiwyg.prototype.formatHeaderBlock = function(name) { if (this.selectionContainsTagName("table")) { return; } this.execCommand("formatblock", "<" + name + ">"); this.selectionChanged(); }; TracWysiwyg.prototype.insertOrderedList = function() { if (this.selectionContainsTagName("table") || this.selectionContainsTagName("pre")) { return; } this.execCommand("insertorderedlist"); this.selectionChanged(); }; TracWysiwyg.prototype.insertUnorderedList = function() { if (this.selectionContainsTagName("table") || this.selectionContainsTagName("pre")) { return; } this.execCommand("insertunorderedlist"); this.selectionChanged(); }; TracWysiwyg.prototype.outdent = function() { if (this.selectionContainsTagName("table") || this.selectionContainsTagName("pre")) { return; } this.execCommand("outdent"); }; TracWysiwyg.prototype.indent = function() { if (this.selectionContainsTagName("table") || this.selectionContainsTagName("pre")) { return; } this.execCommand("indent"); }; TracWysiwyg.prototype.insertTable = function() { if (this.selectionContainsTagName("table") || this.selectionContainsTagName("pre")) { return; } var id = this.generateDomId(); this.insertHTML(this.tableHTML(id, 2, 3)); var element = this.contentDocument.getElementById(id) if (element) { this.selectNodeContents(element); } this.selectionChanged(); }; TracWysiwyg.prototype._tableHTML = function(row, col) { var tr = "