Alice
view release on metacpan or search on metacpan
share/static/alice.js view on Meta::CPAN
return $(range.parentElement());
}
function selectNode(element) {
var range = this._document.body.createTextRange();
range.moveToElementText(element);
range.select();
}
return {
getNode: getNode,
selectNode: selectNode
}
})());
} else {
if (typeof Selection == 'undefined') {
var Selection = {}
Selection.prototype = window.getSelection().__proto__;
}
Object.extend(Selection.prototype, (function() {
function getNode() {
if (this.rangeCount > 0)
return this.getRangeAt(0).getNode();
else
return null;
}
function selectNode(element) {
var range = document.createRange();
range.selectNode(element);
this.removeAllRanges();
this.addRange(range);
}
return {
getNode: getNode,
selectNode: selectNode
}
})());
}
document.on("dom:loaded", function() {
function fieldChangeHandler(event, element) {
var value;
if (element.contentEditable == 'true')
value = element.innerHTML;
else if (element.getValue)
value = element.getValue();
if (value && element.previousValue != value) {
element.fire("field:change");
element.previousValue = value;
}
}
$(document.body).on("keyup", 'input,textarea,*[contenteditable=""],*[contenteditable=true]', fieldChangeHandler);
});
WysiHat.Commands = (function(window) {
function boldSelection() {
this.execCommand('bold', false, null);
}
function boldSelected() {
return this.queryCommandState('bold');
}
function underlineSelection() {
this.execCommand('underline', false, null);
}
function underlineSelected() {
return this.queryCommandState('underline');
}
function italicSelection() {
this.execCommand('italic', false, null);
}
function italicSelected() {
return this.queryCommandState('italic');
}
function strikethroughSelection() {
this.execCommand('strikethrough', false, null);
}
function indentSelection() {
if (Prototype.Browser.Gecko) {
var selection, range, node, blockquote;
selection = window.getSelection();
range = selection.getRangeAt(0);
node = selection.getNode();
if (range.collapsed) {
range = document.createRange();
range.selectNodeContents(node);
selection.removeAllRanges();
selection.addRange(range);
}
blockquote = new Element('blockquote');
range = selection.getRangeAt(0);
range.surroundContents(blockquote);
} else {
this.execCommand('indent', false, null);
}
}
function outdentSelection() {
this.execCommand('outdent', false, null);
}
function toggleIndentation() {
if (this.indentSelected()) {
this.outdentSelection();
} else {
this.indentSelection();
}
}
function indentSelected() {
var node = window.getSelection().getNode();
return node.match("blockquote, blockquote *");
share/static/alice.js view on Meta::CPAN
function insertUnorderedList() {
this.toggleUnorderedList();
}
function unorderedListSelected() {
var element = window.getSelection().getNode();
if (element) return element.match('*[contenteditable=""] ul, *[contenteditable=true] ul, *[contenteditable=""] ul *, *[contenteditable=true] ul *');
return false;
}
function insertImage(url) {
this.execCommand('insertImage', false, url);
}
function insertHTML(html) {
if (Prototype.Browser.IE) {
var range = window.document.selection.createRange();
range.pasteHTML(html);
range.collapse(false);
range.select();
} else {
this.execCommand('insertHTML', false, html);
}
}
function execCommand(command, ui, value) {
var handler = this.commands.get(command);
if (handler) {
handler.bind(this)(value);
} else {
try {
window.document.execCommand(command, ui, value);
} catch(e) { return null; }
}
document.activeElement.fire("field:change");
}
function queryCommandState(state) {
var handler = this.queryCommands.get(state);
if (handler) {
return handler.bind(this)();
} else {
try {
return window.document.queryCommandState(state);
} catch(e) { return null; }
}
}
function getSelectedStyles() {
var styles = $H({});
var editor = this;
editor.styleSelectors.each(function(style){
var node = editor.selection.getNode();
styles.set(style.first(), Element.getStyle(node, style.last()));
});
return styles;
}
return {
boldSelection: boldSelection,
boldSelected: boldSelected,
underlineSelection: underlineSelection,
underlineSelected: underlineSelected,
italicSelection: italicSelection,
italicSelected: italicSelected,
strikethroughSelection: strikethroughSelection,
indentSelection: indentSelection,
outdentSelection: outdentSelection,
toggleIndentation: toggleIndentation,
indentSelected: indentSelected,
fontSelection: fontSelection,
fontSizeSelection: fontSizeSelection,
colorSelection: colorSelection,
backgroundColorSelection: backgroundColorSelection,
alignSelection: alignSelection,
alignSelected: alignSelected,
linkSelection: linkSelection,
unlinkSelection: unlinkSelection,
linkSelected: linkSelected,
formatblockSelection: formatblockSelection,
toggleOrderedList: toggleOrderedList,
insertOrderedList: insertOrderedList,
orderedListSelected: orderedListSelected,
toggleUnorderedList: toggleUnorderedList,
insertUnorderedList: insertUnorderedList,
unorderedListSelected: unorderedListSelected,
insertImage: insertImage,
insertHTML: insertHTML,
execCommand: execCommand,
queryCommandState: queryCommandState,
getSelectedStyles: getSelectedStyles,
commands: $H({}),
queryCommands: $H({
link: linkSelected,
orderedlist: orderedListSelected,
unorderedlist: unorderedListSelected
}),
styleSelectors: $H({
fontname: 'fontFamily',
fontsize: 'fontSize',
forecolor: 'color',
hilitecolor: 'backgroundColor',
backcolor: 'backgroundColor'
})
};
})(window);
if (Prototype.Browser.IE) {
Object.extend(Selection.prototype, (function() {
function setBookmark() {
var bookmark = $('bookmark');
if (bookmark) bookmark.remove();
bookmark = new Element('span', { 'id': 'bookmark' }).update(" ");
var parent = new Element('div');
parent.appendChild(bookmark);
var range = this._document.selection.createRange();
share/static/alice.js view on Meta::CPAN
});
})();
document.on("dom:loaded", function() {
if ('selection' in document && 'onselectionchange' in document) {
var selectionChangeHandler = function() {
var range = document.selection.createRange();
var element = range.parentElement();
$(element).fire("selection:change");
}
document.on("selectionchange", selectionChangeHandler);
} else {
var previousRange;
var selectionChangeHandler = function() {
var element = document.activeElement;
var elementTagName = element.tagName.toLowerCase();
if (elementTagName == "textarea" || elementTagName == "input") {
previousRange = null;
$(element).fire("selection:change");
} else {
var selection = window.getSelection();
if (selection.rangeCount < 1) return;
var range = selection.getRangeAt(0);
if (range && range.equalRange(previousRange)) return;
previousRange = range;
element = range.commonAncestorContainer;
while (element.nodeType == Node.TEXT_NODE)
element = element.parentNode;
$(element).fire("selection:change");
}
};
document.on("mouseup", selectionChangeHandler);
document.on("keyup", selectionChangeHandler);
}
});
WysiHat.Formatting = (function() {
var ACCUMULATING_LINE = {};
var EXPECTING_LIST_ITEM = {};
var ACCUMULATING_LIST_ITEM = {};
return {
getBrowserMarkupFrom: function(applicationMarkup) {
var container = new Element("div").update(applicationMarkup);
function spanify(element, style) {
element.replace(
'<span style="' + style +
'" class="Apple-style-span">' +
element.innerHTML + '</span>'
);
}
function convertStrongsToSpans() {
container.select("strong").each(function(element) {
spanify(element, "font-weight: bold");
});
}
function convertEmsToSpans() {
container.select("em").each(function(element) {
spanify(element, "font-style: italic");
});
}
function convertDivsToParagraphs() {
container.select("div").each(function(element) {
element.replace("<p>" + element.innerHTML + "</p>");
});
}
if (Prototype.Browser.WebKit || Prototype.Browser.Gecko) {
convertStrongsToSpans();
convertEmsToSpans();
} else if (Prototype.Browser.IE || Prototype.Browser.Opera) {
convertDivsToParagraphs();
}
return container.innerHTML;
},
getApplicationMarkupFrom: function(element) {
var mode = ACCUMULATING_LINE, result, container, line, lineContainer, previousAccumulation;
function walk(nodes) {
var length = nodes.length, node, tagName, i;
for (i = 0; i < length; i++) {
node = nodes[i];
if (node.nodeType == Node.ELEMENT_NODE) {
tagName = node.tagName.toLowerCase();
open(tagName, node);
walk(node.childNodes);
close(tagName);
} else if (node.nodeType == Node.TEXT_NODE) {
read(node.nodeValue);
}
}
}
function open(tagName, node) {
if (mode == ACCUMULATING_LINE) {
if (isBlockElement(tagName)) {
if (isEmptyParagraph(node)) {
accumulate(new Element("br"));
}
flush();
if (isListElement(tagName)) {
container = insertList(tagName);
mode = EXPECTING_LIST_ITEM;
}
share/static/alice.js view on Meta::CPAN
function close(tagName) {
if (mode == ACCUMULATING_LINE) {
if (isLineElement(tagName)) {
flush();
}
if (line != lineContainer) {
lineContainer = lineContainer.parentNode;
}
} else if (mode == EXPECTING_LIST_ITEM) {
if (isListElement(tagName)) {
container = result;
mode = ACCUMULATING_LINE;
}
} else if (mode == ACCUMULATING_LIST_ITEM) {
if (isListItemElement(tagName)) {
flush();
mode = EXPECTING_LIST_ITEM;
}
if (line != lineContainer) {
lineContainer = lineContainer.parentNode;
}
}
}
function isBlockElement(tagName) {
return isLineElement(tagName) || isListElement(tagName);
}
function isLineElement(tagName) {
return tagName == "p" || tagName == "div";
}
function isListElement(tagName) {
return tagName == "ol" || tagName == "ul";
}
function isListItemElement(tagName) {
return tagName == "li";
}
function isLineBreak(tagName) {
return tagName == "br";
}
function isEmptyParagraph(node) {
return node.tagName.toLowerCase() == "p" && node.childNodes.length == 0;
}
function read(value) {
accumulate(document.createTextNode(value));
}
function accumulateInlineElement(tagName, node) {
var element = node.cloneNode(false);
if (tagName == "span") {
if ($(node).getStyle("fontWeight") == "bold") {
element = new Element("strong");
} else if ($(node).getStyle("fontStyle") == "italic") {
element = new Element("em");
}
}
accumulate(element);
lineContainer = element;
}
function accumulate(node) {
if (mode != EXPECTING_LIST_ITEM) {
if (!line) line = lineContainer = createLine();
previousAccumulation = node;
lineContainer.appendChild(node);
}
}
function getPreviouslyAccumulatedTagName() {
if (previousAccumulation && previousAccumulation.nodeType == Node.ELEMENT_NODE) {
return previousAccumulation.tagName.toLowerCase();
}
}
function flush() {
if (line && line.childNodes.length) {
container.appendChild(line);
line = lineContainer = null;
}
}
function createLine() {
if (mode == ACCUMULATING_LINE) {
return new Element("div");
} else if (mode == ACCUMULATING_LIST_ITEM) {
return new Element("li");
}
}
function insertList(tagName) {
var list = new Element(tagName);
result.appendChild(list);
return list;
}
result = container = new Element("div");
walk(element.childNodes);
flush();
return result.innerHTML;
}
};
})();
WysiHat.Toolbar = Class.create((function() {
function initialize(editor) {
this.editor = editor;
this.element = this.createToolbarElement();
}
share/static/alice.js view on Meta::CPAN
var button = Element('button');
button.update(options.get('label'));
button.addClassName(options.get('name'));
toolbar.appendChild(button);
return button;
},
observeButtonClick: function(element, handler) {
element.on('click', function(e) {e.stop()});
element.on('mouseup', function(event) {
alice.input.focus();
handler(this.editor, element, this);
this.editor.fire("selection:change");
event.stop();
}.bind(this));
},
});
Object.extend(Alice.Toolbar, {
updateColors: function (editor) {
var range = alice.input.range || editor;
if (range) {
var node = range.getNode();
var fg = node.getStyle("color");
var bg = node.getStyle("background-color");
var button = alice.input.toolbar.element.down("button.colors");
button.setStyle({"border-color": fg, "background-color": bg});
}
return 1;
}
});
Alice.Toolbar.ButtonSet = [
{
label: "",
name: "colors",
query: Alice.Toolbar.updateColors,
handler: function (editor, button, toolbar) {
var cb = function (color, fg) {
if (fg) {
button.setStyle({"border-color": color})
editor.colorSelection(color);
} else {
button.setStyle({"background-color": color});
editor.backgroundColorSelection(color);
}
};
if (toolbar.picker) {
toolbar.picker.remove();
toolbar.picker = undefined;
} else {
toolbar.picker = new Alice.Colorpicker(button, cb);
}
}
},
{
label: "b",
name: "bold",
handler: function (editor, button, toolbar) {
editor.boldSelection();
}
},
{
label: "i",
name: "italic",
handler: function (editor, button, toolbar) {
editor.italicSelection();
}
},
{
label: "u",
name: "underline",
handler: function (editor, button, toolbar) {
var elem = toolbar.element.down(".underline");
if (elem.hasClassName("selected"))
elem.removeClassName("selected");
else
elem.addClassName("selected");
editor.underlineSelection();
}
}
];
Alice.Colorpicker = Class.create({
initialize: function(button, callback) {
var elem = new Element("div").addClassName("color_picker");
var toggle = new Element("div").addClassName("toggle");
var blank = new Element("span").addClassName("blank").addClassName("color");
blank.setStyle({"background-color": "none"});
blank.insert("⃠");
toggle.insert('<span id="fg" class="active">fg</span><span id="bg">bg</span>');
toggle.insert(blank);
elem.insert(toggle);
var colorcontainer = new Element("div").addClassName("colors");
this.colors().each(function(color) {
var box = new Element("span").addClassName("color");
box.setStyle({"background-color": color});
colorcontainer.insert(box);
});
elem.insert(colorcontainer);
document.body.insert(elem);
elem.observe("mousedown", this.clicked.bind(this));
elem.observe("mouseup", function(e) {e.stop()});
this.button = button;
this.elem = elem;
this.cb = callback;
this.fg = true;
},
clicked: function(e) {
e.stop();
var box = e.findElement("span.color");
if (box) {
var color = box.getStyle("background-color");
share/static/alice.js view on Meta::CPAN
}
this.shortcut("Enter");
},
shortcut: function(name, options) {
var meta = this.isMac ? "Meta" : "Ctrl";
var keystroke = name.replace("Cmd", meta).replace("Opt", "Alt"),
method = "on" + name.replace(/\+/g, "");
window.shortcut.add(keystroke, function(event) {
if (this.enabled) {
this.activeWindow = this.application.activeWindow();
if (method.match(/\d$/)) {
this.onNumeric.call(this, event, method.substr(-1));
}
else {
this[method].call(this, event);
}
delete this.activeWindow;
}
}.bind(this), options);
},
onCmd: function(e) {
if (e.keyCode == 186) {
e.stop();
this.application.nextUnreadWindow();
}
},
onNumeric: function(event, number) {
var win = this.application.nth_window(number);
if (number == 0) {
win = this.application.info_window();
}
if (win) win.focus();
},
onCmdC: function(event) {
this.application.input.cancelNextFocus();
},
onCtrlC: function(event) {
this.onCmdC(event);
},
onCmdK: function() {
this.activeWindow.clearMessages();
this.application.connection.sendMessage({
msg: "/clear",
source: this.activeWindow.id,
});
},
onCmdB: function() {
if (this.application.input.editor) {
this.application.input.focus();
this.application.input.editor.boldSelection();
}
},
onCmdShiftU: function() {
if (this.application.input.editor) {
this.application.input.focus();
this.application.input.editor.underlineSelection();
}
},
onCmdI: function() {
if (this.application.input.editor) {
this.application.input.focus();
this.application.input.editor.italicSelection();
}
},
onCmdU: function() {
this.application.nextUnreadWindow();
},
onCmdShiftM: function() {
this.application.windows().invoke('markRead');
},
onCmdShiftJ: function() {
this.activeWindow.scrollToPosition(0);
},
onCmdShiftK: function() {
this.application.toggleOverlay();
},
onCmdRight: function() {
this.application.nextWindow();
},
onCmdShiftL: function() {
this.application.nextWindow();
},
onCmdShiftRight: function() {
this.application.nextWindow();
},
onCmdLeft: function() {
this.application.previousWindow();
},
onCmdShiftH: function() {
this.application.previousWindow();
},
onCmdShiftLeft: function() {
this.application.previousWindow();
},
onOptUp: function() {
this.application.input.previousCommand();
},
( run in 1.207 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )