Вход Регистрация
Файл: 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(matchurl) {
      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(0MAX_DISPLAY_LENGTH) + "...";
      }
      
// Add http prefix if necessary
      
if (realUrl.substr(04) === "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.firstChildtextNode);
    }
    
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<childNodesLengthi++) {
      
_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);
?>
Онлайн: 3
Реклама