Skip to content

Commit

Permalink
Started porting. Due to circumstances, I'm unable to actually TEST an…
Browse files Browse the repository at this point in the history
…ything, sigh.
  • Loading branch information
unknown committed Jul 14, 2010
1 parent 40f2800 commit 6e26cea
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 54 deletions.
7 changes: 7 additions & 0 deletions src/wysihat.kpf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Komodo Project File - DO NOT EDIT -->
<project id="871c9909-9748-47f8-93ff-410463bd6eae" kpf_version="4" name="wysihat.kpf">
<preference-set idref="871c9909-9748-47f8-93ff-410463bd6eae">
<boolean id="import_live">1</boolean>
</preference-set>
</project>
10 changes: 5 additions & 5 deletions src/wysihat/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ WysiHat.Commands = (function(window) {
**/
function indentSelection() {
// TODO: Should use feature detection
if (Prototype.Browser.Gecko) {
if ($.browser.mozilla) {
var selection, range, node, blockquote;

selection = window.getSelection();
Expand All @@ -101,7 +101,7 @@ WysiHat.Commands = (function(window) {
selection.addRange(range);
}

blockquote = new Element('blockquote');
blockquote = $('<blockquote></blockquote>');
range = selection.getRangeAt(0);
range.surroundContents(blockquote);
} else {
Expand Down Expand Up @@ -178,7 +178,7 @@ WysiHat.Commands = (function(window) {
* color of the entire iframe unless hilitecolor is used.
**/
function backgroundColorSelection(color) {
if(Prototype.Browser.Gecko) {
if($.browser.mozilla) {
this.execCommand('hilitecolor', false, color);
} else {
this.execCommand('backcolor', false, color);
Expand All @@ -201,7 +201,7 @@ WysiHat.Commands = (function(window) {
**/
function alignSelected() {
var node = window.getSelection().getNode();
return Element.getStyle(node, 'textAlign');
return $(node).css('textAlign');
}

/**
Expand Down Expand Up @@ -357,7 +357,7 @@ WysiHat.Commands = (function(window) {
* Insert HTML at the insertion point.
**/
function insertHTML(html) {
if (Prototype.Browser.IE) {
if ($.browser.msie) {
var range = window.document.selection.createRange();
range.pasteHTML(html);
range.collapse(false);
Expand Down
2 changes: 1 addition & 1 deletion src/wysihat/dom/range.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//= require "ierange"

Object.extend(Range.prototype, (function() {
jQuery.extend(Range.prototype, (function() {
function beforeRange(range) {
if (!range || !range.compareBoundaryPoints) return false;
return (this.compareBoundaryPoints(this.START_TO_START, range) == -1 &&
Expand Down
15 changes: 6 additions & 9 deletions src/wysihat/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,21 @@ WysiHat.Editor = {
* Creates a new editor for the textarea.
**/
attach: function(textarea) {
var editArea;
var $editArea;

textarea = $(textarea);

var id = textarea.id + '_editor';
if (editArea = $(id)) return editArea;
if ($editArea = $(id)) { return $editArea; }

editArea = new Element('div', {
'id': id,
'class': 'editor',
'contentEditable': 'true'
});
$editArea = $('<div id="' + id + '" class="editor" contentEditable="true"></div>');

editArea.update(WysiHat.Formatting.getBrowserMarkupFrom(textarea.value));
$editArea.html(WysiHat.Formatting.getBrowserMarkupFrom(textarea.val()));

// TODO port to jQuery
Object.extend(editArea, WysiHat.Commands);

textarea.insert({before: editArea});
textarea.before(editArea);
textarea.hide();

// WysiHat.BrowserFeatures.run()
Expand Down
35 changes: 31 additions & 4 deletions src/wysihat/element/sanitize_contents.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
(function() {
function cloneWithAllowedAttributes(element, allowedAttributes) {
var result = new Element(element.tagName), length = allowedAttributes.length, i;
var length = allowedAttributes.length, i;
var result = $('<' + element.tagName.toLowerCase() + '></' + element.tagName.toLowerCase() + '>')
element = $(element);

for (i = 0; i < allowedAttributes.length; i++) {
attribute = allowedAttributes[i];
if (element.hasAttribute(attribute)) {
result.writeAttribute(attribute, element.readAttribute(attribute));
if (element.attr(attribute)) {
result.attr(attribute, element.attr(attribute));
}
}

return result;
}

function withEachChildNodeOf(element, callback) {
var nodes = $A(element.childNodes), length = nodes.length, i;
var nodes = $(element).children;
var length = nodes.length, i;
for (i = 0; i < length; i++) callback(nodes[i]);
}

Expand Down Expand Up @@ -78,4 +80,29 @@
return element;
}
});
jQuery.fn.sanitizeContents = function(options) {
var element = $(this);
var tagsToRemove = {};
$.each((options.remove || "").split(","), function(tagName) {
tagsToRemove[$.trim(tagName)] = true;
});

var tagsToAllow = {};
$.each((options.allow || "").split(","), function(selector) {
var parts = $.trim(selector).split(/[\[\]]/);
var tagName = parts[0];
var allowedAttributes = $.grep(parts.slice(1), function(n, i) {
return /./.test(n);
});
tagsToAllow[tagName] = allowedAttributes;
});

var tagsToSkip = options.skip;

withEachChildNodeOf(element, function(childNode) {
sanitizeNode(childNode, tagsToRemove, tagsToAllow, tagsToSkip);
});

return element;
}
})();
17 changes: 10 additions & 7 deletions src/wysihat/events/field_change.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
document.on("dom:loaded", function() {
$(document).ready(function() {
function fieldChangeHandler(event, element) {
var $element = $(element);
element = $element.get(0);
var value;

if (element.contentEditable == 'true')
value = element.innerHTML;
else if (element.getValue)
value = element.getValue();
if ($element.attr('contentEditable') === 'true') {
value = $element.html();
}
value = $element.val();

// TODO: where did previousValue come from? Guessing it's with contentEditable
if (value && element.previousValue != value) {
element.fire("field:change");
$element.trigger("field:change");
element.previousValue = value;
}
}

$(document.body).on("keyup", 'input,textarea,*[contenteditable=""],*[contenteditable=true]', fieldChangeHandler);
$('input,textarea,*[contenteditable=""],*[contenteditable=true]').keyup(fieldChangeHandler);
});
33 changes: 16 additions & 17 deletions src/wysihat/events/frame_loaded.js
Original file line number Diff line number Diff line change
@@ -1,45 +1,46 @@
(function() {
function onReadyStateComplete(document, callback) {
var handler;

function checkReadyState() {
if (document.readyState === 'complete') {
if (handler) handler.stop();
// TODO: the prototype code checked to see if the event exists before removing it.
$(document).unbind('readystatechange', checkReadyState);
callback();
return true;
} else {
return false;
}
}

handler = Element.on(document, 'readystatechange', checkReadyState);
$(document).bind('readystatechange', checkReadyState);
checkReadyState();
}

function observeFrameContentLoaded(element) {
element = $(element);
var bare = element.get(0);

var loaded, contentLoadedHandler;

loaded = false;
function fireFrameLoaded() {
if (loaded) return;
if (loaded) { return };

loaded = true;
if (contentLoadedHandler) contentLoadedHandler.stop();
element.fire('frame:loaded');
if (contentLoadedHandler) { contentLoadedHandler.stop(); }
element.trigger('frame:loaded');
}

if (window.addEventListener) {
contentLoadedHandler = document.on("DOMFrameContentLoaded", function(event) {
if (element == event.element())
contentLoadedHandler = $(document).bind("DOMFrameContentLoaded", function(event) {
if (element == $(this))
fireFrameLoaded();
});
}

element.on('load', function() {
element.load(function() {
var frameDocument;

// TODO: find contentDocument
if (typeof element.contentDocument !== 'undefined') {
frameDocument = element.contentDocument;
} else if (typeof element.contentWindow !== 'undefined' && typeof element.contentWindow.document !== 'undefined') {
Expand All @@ -52,13 +53,11 @@
return element;
}

function onFrameLoaded(element, callback) {
element.on('frame:loaded', callback);
element.observeFrameContentLoaded();
function onFrameLoaded($element, callback) {
$element.bind('frame:loaded', callback);
$element.observeFrameContentLoaded();
}

Element.addMethods({
observeFrameContentLoaded: observeFrameContentLoaded,
onFrameLoaded: onFrameLoaded
});
jQuery.fn.observeFrameContentLoaded = observeFrameContentLoaded;
jQuery.fn.onFrameLoaded = onFrameLoaded;
})();
21 changes: 12 additions & 9 deletions src/wysihat/events/selection_change.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
document.on("dom:loaded", function() {
$(document).ready(function() {
var $doc = $(document);
if ('onselectionchange' in document) {
var selectionChangeHandler = function() {
var range = document.selection.createRange();
var element = range.parentElement();
$(element).fire("selection:change");
$(element).trigger("selection:change");
}

document.on("selectionchange", selectionChangeHandler);
$doc.bind("selectionchange", selectionChangeHandler);
} else {
var previousRange;

Expand All @@ -16,24 +17,26 @@ document.on("dom:loaded", function() {

if (elementTagName == "textarea" || elementTagName == "input") {
previousRange = null;
$(element).fire("selection:change");
$(element).trigger("selection:change");
} else {
var selection = window.getSelection();
if (selection.rangeCount < 1) return;
if (selection.rangeCount < 1) { return };

var range = selection.getRangeAt(0);
if (range && range.equalRange(previousRange)) return;
if (range && range.equalRange(previousRange)) {
return;
}
previousRange = range;

element = range.commonAncestorContainer;
while (element.nodeType == Node.TEXT_NODE)
element = element.parentNode;

$(element).fire("selection:change");
$(element).trigger("selection:change");
}
};

document.on("mouseup", selectionChangeHandler);
document.on("keyup", selectionChangeHandler);
$doc.mouseup(selectionChangeHandler);
$doc.keyup(selectionChangeHandler);
}
});
4 changes: 2 additions & 2 deletions src/wysihat/features.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ WysiHat.BrowserFeatures = (function() {
function createTmpIframe(callback) {
var frame, frameDocument;

frame = new Element('iframe');
frame.setStyle({
frame = $('<iframe></iframe>');
frame.css({
position: 'absolute',
left: '-1000px'
});
Expand Down

0 comments on commit 6e26cea

Please sign in to comment.