????JFIF??x?x????'
| Server IP : 104.21.30.238 / Your IP : 216.73.216.87 Web Server : LiteSpeed System : Linux premium151.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 User : tempvsty ( 647) PHP Version : 8.0.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /././././proc/thread-self/cwd/wp-content/plugins/motopress-content-editor/jquery/dom/range/ |
Upload File : |
steal('jquery','jquery/dom/compare').then(function($){
// TODOS ...
// Ad
/**
* @function jQuery.fn.range
* @parent $.Range
*
* Returns a jQuery.Range for the element selected.
*
* $('#content').range()
*/
$.fn.range = function(){
return $.Range(this[0])
}
var convertType = function(type){
return type.replace(/([a-z])([a-z]+)/gi, function(all,first, next){
return first+next.toLowerCase()
}).replace(/_/g,"");
},
reverse = function(type){
return type.replace(/^([a-z]+)_TO_([a-z]+)/i, function(all, first, last){
return last+"_TO_"+first;
});
},
getWindow = function( element ) {
return element ? element.ownerDocument.defaultView || element.ownerDocument.parentWindow : window
},
bisect = function(el, start, end){
//split the start and end ... figure out who is touching ...
if(end-start == 1){
return
}
},
support = {};
/**
* @Class jQuery.Range
* @parent dom
* @tag alpha
*
* Provides text range helpers for creating, moving,
* and comparing ranges cross browser.
*
* ## Examples
*
* // Get the current range
* var range = $.Range.current()
*
* // move the end of the range 2 characters right
* range.end("+2")
*
* // get the startOffset of the range and the container
* range.start() //-> { offset: 2, container: HTMLELement }
*
* //get the most common ancestor element
* var parent = range.parent()
*
* //select the parent
* var range2 = new $.Range(parent)
*
* @constructor
*
* Returns a jQuery range object.
*
* @param {TextRange|HTMLElement|Point} [range] An object specifiying a
* range. Depending on the object, the selected text will be different. $.Range supports the
* following types
*
* - __undefined or null__ - returns a range with nothing selected
* - __HTMLElement__ - returns a range with the node's text selected
* - __Point__ - returns a range at the point on the screen. The point can be specified like:
*
* //client coordinates
* {clientX: 200, clientY: 300}
*
* //page coordinates
* {pageX: 200, pageY: 300}
* {top: 200, left: 300}
*
* - __TextRange__ a raw text range object.
*/
$.Range = function(range){
if(this.constructor !== $.Range){
return new $.Range(range);
}
if(range && range.jquery){
range = range[0];
}
// create one
if(!range || range.nodeType){
this.win = getWindow(range)
if(this.win.document.createRange){
this.range = this.win.document.createRange()
}else{
this.range = this.win.document.body.createTextRange()
}
if(range){
this.select(range)
}
} else if (range.clientX != null || range.pageX != null || range.left != null) {
this.moveToPoint(range)
} else if (range.originalEvent && range.originalEvent.touches && range.originalEvent.touches.length) {
this.moveToPoint(range.originalEvent.touches[0])
} else if (range.originalEvent && range.originalEvent.changedTouches && range.originalEvent.changedTouches.length) {
this.moveToPoint(range.originalEvent.changedTouches[0])
} else {
this.range = range;
}
};
/**
* @static
*/
$.Range.
/**
* Gets the current range.
*
* $.Range.current() //-> jquery.range
*
* @param {HTMLElement} [el] an optional element used to get selection for a given window.
* @return {jQuery.Range} a jQuery.Range wrapped range.
*/
current = function(el){
var win = getWindow(el),
selection;
if(win.getSelection){
selection = win.getSelection()
return new $.Range( selection.rangeCount ? selection.getRangeAt(0) : win.document.createRange())
}else{
return new $.Range( win.document.selection.createRange() );
}
};
$.extend($.Range.prototype,
/** @prototype **/
{
moveToPoint : function(point){
var clientX = point.clientX, clientY = point.clientY
if(!clientX){
var off = scrollOffset();
clientX = (point.pageX || point.left || 0 ) - off.left;
clientY = (point.pageY || point.top || 0 ) - off.top;
}
if(support.moveToPoint){
this.range = $.Range().range
this.range.moveToPoint(clientX, clientY);
return this;
}
// it's some text node in this range ...
var parent = document.elementFromPoint(clientX, clientY);
//typically it will be 'on' text
for(var n=0; n < parent.childNodes.length; n++){
var node = parent.childNodes[n];
if(node.nodeType === 3 || node.nodeType === 4){
var range = $.Range(node),
length = range.toString().length;
// now lets start moving the end until the boundingRect is within our range
for(var i = 1; i < length+1; i++){
var rect = range.end(i).rect();
if(rect.left <= clientX && rect.left+rect.width >= clientX &&
rect.top <= clientY && rect.top+rect.height >= clientY ){
range.start(i-1);
this.range = range.range;
return;
}
}
}
}
// if not 'on' text, recursively go through and find out when we shift to next
// 'line'
var previous;
iterate(parent.childNodes, function(textNode){
var range = $.Range(textNode);
if(range.rect().top > point.clientY){
return false;
}else{
previous = range;
}
});
if(previous){
previous.start(previous.toString().length);
this.range = previous.range;
}else{
this.range = $.Range(parent).range
}
},
window : function(){
return this.win || window;
},
/**
* Return true if any portion of these two ranges overlap.
*
* var foo = document.getElementById('foo');
*
* $.Range(foo.childNodes[0]).compare(foo.childNodes[1]) //-> false
*
* @param {jQuery.Range} elRange
* @return {Boolean} true if part of the ranges overlap, false if otherwise.
*/
overlaps : function(elRange){
if(elRange.nodeType){
elRange = $.Range(elRange).select(elRange);
}
//if the start is within the element ...
var startToStart = this.compare("START_TO_START", elRange),
endToEnd = this.compare("END_TO_END", elRange)
// if we wrap elRange
if(startToStart <=0 && endToEnd >=0){
return true;
}
// if our start is inside of it
if( startToStart >= 0 &&
this.compare("START_TO_END", elRange) <= 0 ) {
return true;
}
// if our end is inside of elRange
if(this.compare("END_TO_START", elRange) >= 0 &&
endToEnd <= 0 ) {
return true;
}
return false;
},
/**
* Collapses a range
*
* $('#foo').range().collapse()
*
* @param {Boolean} [toStart] true if to the start of the range, false if to the
* end. Defaults to false.
* @return {jQuery.Range} returns the range for chaining.
*/
collapse : function(toStart){
this.range.collapse(toStart === undefined ? true : toStart);
return this;
},
/**
* Returns the text of the range.
*
* currentText = $.Range.current().toString()
*
* @return {String} the text of the range
*/
toString : function(){
return typeof this.range.text == "string" ? this.range.text : this.range.toString();
},
/**
* Gets or sets the start of the range.
*
* If a value is not provided, start returns the range's starting container and offset like:
*
* $('#foo').range().start() //-> {container: fooElement, offset: 0 }
*
* If a set value is provided, it can set the range. The start of the range is set differently
* depending on the type of set value:
*
* - __Object__ - an object with the new starting container and offset is provided like
*
* $.Range().start({container: $('#foo')[0], offset: 20})
*
* - __Number__ - the new offset value. The container is kept the same.
*
* - __String__ - adjusts the offset by converting the string offset to a number and adding it to the current
* offset. For example, the following moves the offset forward four characters:
*
* $('#foo').range().start("+4")
*
*
* @param {Object|String|Number} [set] a set value if setting the start of the range or nothing if reading it.
* @return {jQuery.Range|Object} if setting the start, the range is returned for chaining, otherwise, the
* start offset and container are returned.
*/
start : function(set){
if(set === undefined){
if(this.range.startContainer){
return {
container : this.range.startContainer,
offset : this.range.startOffset
}
}else{
var start = this.clone().collapse().parent();
var startRange = $.Range(start).select(start).collapse();
startRange.move("END_TO_START", this);
return {
container : start,
offset : startRange.toString().length
}
}
} else {
if (this.range.setStart) {
if(typeof set == 'number'){
this.range.setStart(this.range.startContainer, set)
} else if(typeof set == 'string') {
this.range.setStart(this.range.startContainer, this.range.startOffset+ parseInt(set,10) );
} else {
this.range.setStart(set.container, set.offset)
}
} else {
throw 'todo'
}
return this;
}
},
/**
* Sets or gets the end of the range.
* It takes similar options as [jQuery.Range.prototype.start].
* @param {Object} [set]
*/
end : function(set){
if (set === undefined) {
if (this.range.startContainer) {
return {
container: this.range.endContainer,
offset: this.range.endOffset
}
}
else {
var end = this.clone().collapse(false).parent(),
endRange = $.Range(end).select(end).collapse();
endRange.move("END_TO_END", this);
return {
container: end,
offset: endRange.toString().length
}
}
} else {
if (this.range.setEnd) {
if(typeof set == 'number'){
this.range.setEnd(this.range.endContainer, set)
} else {
this.range.setEnd(set.container, set.offset)
}
} else {
throw 'todo'
}
return this;
}
},
/**
* Returns the most common ancestor element of
* the endpoints in the range. This will return text elements if the range is
* within a text element.
* @return {HTMLNode} the TextNode or HTMLElement
* that fully contains the range
*/
parent : function(){
if(this.range.commonAncestorContainer){
return this.range.commonAncestorContainer;
} else {
var parentElement = this.range.parentElement(),
range = this.range;
// IE's parentElement will always give an element, we want text ranges
iterate(parentElement.childNodes, function(txtNode){
if($.Range(txtNode).range.inRange( range ) ){
// swap out the parentElement
parentElement = txtNode;
return false;
}
});
return parentElement;
}
},
/**
* Returns the bounding rectangle of this range.
*
* @param {String} [from] - where the coordinates should be
* positioned from. By default, coordinates are given from the client viewport.
* But if 'page' is given, they are provided relative to the page.
*
* @return {TextRectangle} - The client rects.
*/
rect : function(from){
var rect = this.range.getBoundingClientRect()
if(from === 'page'){
var off = scrollOffset();
rect = $.extend({}, rect);
rect.top += off.top;
rect.left += off.left;
}
return rect;
},
/**
* Returns client rects
* @param {String} [from] how the rects coordinates should be given (viewport or page). Provide 'page' for
* rect coordinates from the page.
*/
rects : function(from){
var rects = $.makeArray( this.range.getClientRects() ).sort(function(rect1, rect2){
return rect2.width*rect2.height - rect1.width*rect1.height;
}),
i=0,j,
len = rects.length;
//return rects;
//rects are sorted, largest to smallest
while(i < rects.length){
var cur = rects[i],
found = false;
j = i+1;
for(j = i+1; j < rects.length; j++){
if( withinRect(cur, rects[j] ) ) {
found = rects[j];
break;
}
}
if(found){
rects.splice(i,1)
}else{
i++;
}
}
// safari will be return overlapping ranges ...
if(from == 'page'){
var off = scrollOffset();
return $.map(rects, function(item){
var i = $.extend({}, item)
i.top += off.top;
i.left += off.left;
return i;
})
}
return rects;
}
});
(function(){
//method branching ....
var fn = $.Range.prototype,
range = $.Range().range;
/**
* @function compare
* Compares one range to another range.
*
* ## Example
*
* // compare the highlight element's start position
* // to the start of the current range
* $('#highlight')
* .range()
* .compare('START_TO_START', $.Range.current())
*
*
*
* @param {Object} type Specifies the boundry of the
* range and the <code>compareRange</code> to compare.
*
* - START\_TO\_START - the start of the range and the start of compareRange
* - START\_TO\_END - the start of the range and the end of compareRange
* - END\_TO\_END - the end of the range and the end of compareRange
* - END\_TO\_START - the end of the range and the start of compareRange
*
* @param {$.Range} compareRange The other range
* to compare against.
* @return {Number} a number indicating if the range
* boundary is before,
* after, or equal to <code>compareRange</code>'s
* boundary where:
*
* - -1 - the range boundary comes before the compareRange boundary
* - 0 - the boundaries are equal
* - 1 - the range boundary comes after the compareRange boundary
*/
fn.compare = range.compareBoundaryPoints ?
function(type, range){
return this.range.compareBoundaryPoints(this.window().Range[reverse( type )], range.range)
}:
function(type, range){
return this.range.compareEndPoints(convertType(type), range.range)
}
/**
* @function move
* Move the endpoints of a range relative to another range.
*
* // Move the current selection's end to the
* // end of the #highlight element
* $.Range.current().move('END_TO_END',
* $('#highlight').range() )
*
*
* @param {String} type a string indicating the ranges boundary point
* to move to which referenceRange boundary point where:
*
* - START\_TO\_START - the start of the range moves to the start of referenceRange
* - START\_TO\_END - the start of the range move to the end of referenceRange
* - END\_TO\_END - the end of the range moves to the end of referenceRange
* - END\_TO\_START - the end of the range moves to the start of referenceRange
*
* @param {jQuery.Range} referenceRange
* @return {jQuery.Range} the original range for chaining
*/
fn.move = range.setStart ?
function(type, range){
var rangesRange = range.range;
switch(type){
case "START_TO_END" :
this.range.setStart(rangesRange.endContainer, rangesRange.endOffset)
break;
case "START_TO_START" :
this.range.setStart(rangesRange.startContainer, rangesRange.startOffset)
break;
case "END_TO_END" :
this.range.setEnd(rangesRange.endContainer, rangesRange.endOffset)
break;
case "END_TO_START" :
this.range.setEnd(rangesRange.startContainer, rangesRange.startOffset)
break;
}
return this;
}:
function(type, range){
this.range.setEndPoint(convertType(type), range.range)
return this;
};
var cloneFunc = range.cloneRange ? "cloneRange" : "duplicate",
selectFunc = range.selectNodeContents ? "selectNodeContents" : "moveToElementText";
fn.
/**
* Clones the range and returns a new $.Range
* object.
*
* @return {jQuery.Range} returns the range as a $.Range.
*/
clone = function(){
return $.Range( this.range[cloneFunc]() );
};
fn.
/**
* @function
* Selects an element with this range. If nothing
* is provided, makes the current
* range appear as if the user has selected it.
*
* This works with text nodes.
*
* @param {HTMLElement} [el]
* @return {jQuery.Range} the range for chaining.
*/
select = range.selectNodeContents ? function(el){
if(!el){
this.window().getSelection().addRange(this.range);
}else {
this.range.selectNodeContents(el);
}
return this;
} : function(el){
if(!el){
this.range.select()
} else if(el.nodeType === 3){
//select this node in the element ...
var parent = el.parentNode,
start = 0,
end;
iterate(parent.childNodes, function(txtNode){
if(txtNode === el){
end = start + txtNode.nodeValue.length;
return false;
} else {
start = start + txtNode.nodeValue.length
}
})
this.range.moveToElementText(parent);
this.range.moveEnd('character', end - this.range.text.length)
this.range.moveStart('character', start);
} else {
this.range.moveToElementText(el);
}
return this;
};
})();
// helpers -----------------
// iterates through a list of elements, calls cb on every text node
// if cb returns false, exits the iteration
var iterate = function(elems, cb){
var elem, start;
for (var i = 0; elems[i]; i++) {
elem = elems[i];
// Get the text from text nodes and CDATA nodes
if (elem.nodeType === 3 || elem.nodeType === 4) {
if (cb(elem) === false) {
return false;
}
// Traverse everything else, except comment nodes
}
else
if (elem.nodeType !== 8) {
if (iterate(elem.childNodes, cb) === false) {
return false;
}
}
}
},
supportWhitespace,
isWhitespace = function(el){
if(supportWhitespace == null){
supportWhitespace = 'isElementContentWhitespace' in el;
}
return (supportWhitespace? el.isElementContentWhitespace :
(el.nodeType === 3 && '' == el.data.trim()));
},
// if a point is within a rectangle
within = function(rect, point){
return rect.left <= point.clientX && rect.left + rect.width >= point.clientX &&
rect.top <= point.clientY &&
rect.top + rect.height >= point.clientY
},
// if a rectangle is within another rectangle
withinRect = function(outer, inner){
return within(outer, {
clientX: inner.left,
clientY: inner.top
}) && //top left
within(outer, {
clientX: inner.left + inner.width,
clientY: inner.top
}) && //top right
within(outer, {
clientX: inner.left,
clientY: inner.top + inner.height
}) && //bottom left
within(outer, {
clientX: inner.left + inner.width,
clientY: inner.top + inner.height
}) //bottom right
},
// gets the scroll offset from a window
scrollOffset = function( win){
var win = win ||window;
doc = win.document.documentElement, body = win.document.body;
return {
left: (doc && doc.scrollLeft || body && body.scrollLeft || 0) + (doc.clientLeft || 0),
top: (doc && doc.scrollTop || body && body.scrollTop || 0) + (doc.clientTop || 0)
};
};
support.moveToPoint = !!$.Range().range.moveToPoint
});