Changeset 1396


Ignore:
Timestamp:
02/10/18 11:42:14 (9 months ago)
Author:
gogo
Message:

#1484, Rewrite expandRelativeUrl handlng to work properly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/XinhaCore.js

    r1394 r1396  
    62676267Xinha.prototype.fixRelativeLinks = function(html) 
    62686268{ 
    6269   if ( typeof this.config.expandRelativeUrl != 'undefined' && this.config.expandRelativeUrl )  
    6270   { 
    6271     if (html == null) 
    6272     { 
    6273       return ""; 
    6274     } 
    6275     var src = html.match(/(src|href)="([^"]*)"/gi); 
    6276     var b = document.location.href; 
    6277     if ( src ) 
    6278     { 
    6279       var url,url_m,relPath,base_m,absPath; 
    6280       for ( var i=0;i<src.length;++i ) 
    6281       { 
    6282         url = src[i].match(/(src|href)="([^"]*)"/i); 
    6283         url_m = url[2].match( /\.\.\//g ); 
    6284         if ( url_m ) 
    6285         { 
    6286           relPath = new RegExp( "(.*?)(([^\/]*\/){"+ url_m.length+"})[^\/]*$" ); 
    6287           base_m = b.match( relPath ); 
    6288           absPath = url[2].replace(/(\.\.\/)*/,base_m[1]); 
    6289           html = html.replace( new RegExp(Xinha.escapeStringForRegExp(url[2])),absPath ); 
    6290         } 
    6291       } 
    6292     } 
    6293   } 
    6294    
     6269 
    62956270  if ( typeof this.config.stripSelfNamedAnchors != 'undefined' && this.config.stripSelfNamedAnchors ) 
    62966271  { 
     
    63116286  } 
    63126287 
     6288  // Rewrite 2018 expandRelativeUrl 
     6289  //  note that this must be done AFTER stripBaseHref otherwise we can get 
     6290  //  absolute urls, which won't be expanded 
     6291  if ( typeof this.config.expandRelativeUrl != 'undefined' && this.config.expandRelativeUrl )  
     6292  { 
     6293    if(html == null) return ''; 
     6294     
     6295    // These are the regexes for matching the urls globally 
     6296    var url_regexp_global = [  
     6297     /(src|href|background|action)(=")([^"]+?)((?:(?:#|\?).*)?")/gi, 
     6298     /(src|href|background|action)(=')([^']+?)((?:(?:#|\?).*)?')/gi 
     6299    ]; 
     6300     
     6301    // And singly (you can not change a regex flag after creation) 
     6302    var url_regexp_single = [  
     6303     /(src|href|background|action)(=")([^"]+?)((?:(?:#|\?).*)?")/i, 
     6304     /(src|href|background|action)(=')([^']+?)((?:(?:#|\?).*)?')/i 
     6305    ]; 
     6306     
     6307    // Find a list of urls in the document to inspect 
     6308    //  we want urls that include a relative component 
     6309    // 
     6310    //  that is ./,  ../, or start with a basename 
     6311    //   (dirname or filename) 
     6312    // 
     6313    //  excluded are urls with a protocol (http://...) 
     6314    //               urls with a same-protocol (//...) 
     6315    // 
     6316     
     6317    var candidates = [ ]; 
     6318     
     6319    for(var i = 0; i < url_regexp_global.length ; i++) 
     6320    { 
     6321 
     6322             
     6323      var all_urls   =  html.match(url_regexp_global[i]); 
     6324      if(!all_urls) continue; 
     6325       
     6326      for(var j = 0; j < all_urls.length; j++) 
     6327      { 
     6328        if(all_urls[j].match(/=["']([a-z]+:)?\/\//)) continue; // Exclude: '//...' and 'https://' 
     6329        if( 
     6330             ( !all_urls[j].match(/=["']\//)       ) // Starts with something other than a slash 
     6331          || ( all_urls[j].match(/=["']\.{1,2}\//) ) // Starts with a ./ or ../ 
     6332          || ( all_urls[j].match(/\/\.{1,2}\//   ) ) // Includes a ./ or ../ 
     6333          || ( all_urls[j].match(/\/{2,}/   )      ) // Includes repeated /, we will clean these up too 
     6334        ) 
     6335        { 
     6336          // We have to run the match again to get the parts 
     6337          candidates[candidates.length] =  all_urls[j].match(url_regexp_single[i]); 
     6338        } 
     6339      } 
     6340    } 
     6341           
     6342    // Get our PATH for the page that is doing the editing something like /foo/bar/xinha.php 
     6343    var ourpath = document.location.pathname; 
     6344     
     6345    // Remove our basename --> /foo/bar/ 
     6346    ourpath = ourpath.replace(/\/[^/]+$/, '/'); 
     6347     
     6348    // For each of the candidate urls, fix them 
     6349    for(var i = 0; i < candidates.length; i++) 
     6350    { 
     6351      var src = candidates[i]; 
     6352       
     6353      var lastHtml = html; 
     6354       
     6355      // Add the relative url to our path if it is not semi-absolute 
     6356      var fixedUrl = (!src[3].match(/^\//)) ? ourpath + src[3] : src[3]; 
     6357       
     6358      // Remove any /./ components 
     6359      fixedUrl = fixedUrl.replace(/\/\.\//g, '/'); 
     6360       
     6361      // Reduce any multiple slash 
     6362      fixedUrl = fixedUrl.replace(/\/{2,}/g, '/'); 
     6363       
     6364      // Remove any /[something]/../ components 
     6365      //  (this makes /foo/../bar become /bar correctly 
     6366      //  repeat this until either there are no more /../ 
     6367      //  or there has been no further change 
     6368      var lastFixedUrl; 
     6369      do 
     6370      { 
     6371        lastFixedUrl = fixedUrl; 
     6372        fixedUrl = fixedUrl.replace(/\/[^/]+\/\.\.\//g, '/');           
     6373      } while( lastFixedUrl != fixedUrl ); 
     6374       
     6375      // Now if we have any /../ left, they should be invalid, so kill those 
     6376      fixedUrl = fixedUrl.replace('/../', '/'); 
     6377       
     6378      // And that's all 
     6379      html = html.replace( src[0], src[1]+src[2]+fixedUrl+src[4]);   
     6380    } 
     6381  } 
     6382   
    63136383  return html; 
    63146384}; 
Note: See TracChangeset for help on using the changeset viewer.