Файл: library/wysihtml5/src/dom/auto_link.js
Строк: 201
<?php
/**
* Find urls in descendant text nodes of an element and auto-links them
* Inspired by http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/
*
* @param {Element} element Container element in which to search for urls
*
* @example
* <div id="text-container">Please click here: www.google.com</div>
* <script>wysihtml5.dom.autoLink(document.getElementById("text-container"));</script>
*/
(function(wysihtml5) {
var /**
* Don't auto-link urls that are contained in the following elements:
*/
IGNORE_URLS_IN = wysihtml5.lang.array(["CODE", "PRE", "A", "SCRIPT", "HEAD", "TITLE", "STYLE"]),
/**
* revision 1:
* /(S+.{1}[^s,.!]+)/g
*
* revision 2:
* /(b(((https?|ftp)://)|(www.))[-A-Z0-9+&@#/%?=~_|!:,.;[]]*[-A-Z0-9+&@#/%=~_|])/gim
*
* put this in the beginning if you don't wan't to match within a word
* (^|[>({[s>])
*/
URL_REG_EXP = /((https?://|www.)[^s<]{3,})/gi,
TRAILING_CHAR_REG_EXP = /([^w/-](,?))$/i,
MAX_DISPLAY_LENGTH = 100,
BRACKETS = { ")": "(", "]": "[", "}": "{" };
function autoLink(element) {
if (_hasParentThatShouldBeIgnored(element)) {
return element;
}
if (element === element.ownerDocument.documentElement) {
element = element.ownerDocument.body;
}
return _parseNode(element);
}
/**
* This is basically a rebuild of
* the rails auto_link_urls text helper
*/
function _convertUrlsToLinks(str) {
return str.replace(URL_REG_EXP, function(match, url) {
var punctuation = (url.match(TRAILING_CHAR_REG_EXP) || [])[1] || "",
opening = BRACKETS[punctuation];
url = url.replace(TRAILING_CHAR_REG_EXP, "");
if (url.split(opening).length > url.split(punctuation).length) {
url = url + punctuation;
punctuation = "";
}
var realUrl = url,
displayUrl = url;
if (url.length > MAX_DISPLAY_LENGTH) {
displayUrl = displayUrl.substr(0, MAX_DISPLAY_LENGTH) + "...";
}
// Add http prefix if necessary
if (realUrl.substr(0, 4) === "www.") {
realUrl = "http://" + realUrl;
}
return '<a href="' + realUrl + '">' + displayUrl + '</a>' + punctuation;
});
}
/**
* Creates or (if already cached) returns a temp element
* for the given document object
*/
function _getTempElement(context) {
var tempElement = context._wysihtml5_tempElement;
if (!tempElement) {
tempElement = context._wysihtml5_tempElement = context.createElement("div");
}
return tempElement;
}
/**
* Replaces the original text nodes with the newly auto-linked dom tree
*/
function _wrapMatchesInNode(textNode) {
var parentNode = textNode.parentNode,
nodeValue = wysihtml5.lang.string(textNode.data).escapeHTML(),
tempElement = _getTempElement(parentNode.ownerDocument);
// We need to insert an empty/temporary <span /> to fix IE quirks
// Elsewise IE would strip white space in the beginning
tempElement.innerHTML = "<span></span>" + _convertUrlsToLinks(nodeValue);
tempElement.removeChild(tempElement.firstChild);
while (tempElement.firstChild) {
// inserts tempElement.firstChild before textNode
parentNode.insertBefore(tempElement.firstChild, textNode);
}
parentNode.removeChild(textNode);
}
function _hasParentThatShouldBeIgnored(node) {
var nodeName;
while (node.parentNode) {
node = node.parentNode;
nodeName = node.nodeName;
if (IGNORE_URLS_IN.contains(nodeName)) {
return true;
} else if (nodeName === "body") {
return false;
}
}
return false;
}
function _parseNode(element) {
if (IGNORE_URLS_IN.contains(element.nodeName)) {
return;
}
if (element.nodeType === wysihtml5.TEXT_NODE && element.data.match(URL_REG_EXP)) {
_wrapMatchesInNode(element);
return;
}
var childNodes = wysihtml5.lang.array(element.childNodes).get(),
childNodesLength = childNodes.length,
i = 0;
for (; i<childNodesLength; i++) {
_parseNode(childNodes[i]);
}
return element;
}
wysihtml5.dom.autoLink = autoLink;
// Reveal url reg exp to the outside
wysihtml5.dom.autoLink.URL_REG_EXP = URL_REG_EXP;
})(wysihtml5);
?>