stoyan / etc
- Source
- Commits
- Network (1)
- Issues (0)
- Downloads (0)
- Wiki (1)
- Graphs
-
Tree:
3269972
Stoyan Stefanov (author)
Tue Mar 17 20:15:09 -0700 2009
commit 3269972aa8798cc7404f4fb9c07f0742c30f7ac9
tree 40435d5518172681795ae4061570c03a464f1d83
parent 558b9e3748aa9e051ad1ffca7fa09dcb25e62efc
tree 40435d5518172681795ae4061570c03a464f1d83
parent 558b9e3748aa9e051ad1ffca7fa09dcb25e62efc
| 558b9e37 » | Stoyan Stefanov | 2009-03-17 | 1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |
| 2 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | ||||
| 3 | <html> | ||||
| 4 | <head> | ||||
| 5 | <meta http-equiv="Content-type" content="text/html; charset=utf-8"> | ||||
| 6 | <title>Relative to Absolute links test</title> | ||||
| 7 | <style type="text/css"> | ||||
| 8 | body {font-family: consolas, courier new, courier;} | ||||
| 9 | .even {background: #eee;} | ||||
| 10 | </style> | ||||
| 11 | </head> | ||||
| 12 | <body> | ||||
| 13 | <table border="1" id="result"> | ||||
| 14 | <tr><th>host</th> | ||||
| 15 | <th>file</th> | ||||
| 16 | <th>result</th></tr> | ||||
| 17 | </table> | ||||
| 18 | </body> | ||||
| 19 | <script type="text/javascript"> | ||||
| 20 | |||||
| 21 | var hosts = [ | ||||
| 22 | 'http://example.org', | ||||
| 23 | 'http://example.org/', | ||||
| 24 | 'http://example.org/level1/', | ||||
| 25 | 'http://example.org/level1/test.php', | ||||
| 26 | 'http://example.org/level1', | ||||
| 27 | 'http://example.org/level1/level2', | ||||
| 28 | 'http://example.org/level1/level2/', | ||||
| 29 | 'http://example.org/level1/level2/test.html', | ||||
| 30 | 'http://example.org/level1/level2/level3/' | ||||
| 31 | ]; | ||||
| 32 | |||||
| 33 | var files = [ | ||||
| 34 | 'image.png', | ||||
| 35 | '/image.png', | ||||
| 36 | '../../image.png', | ||||
| 37 | '/../../image.png', | ||||
| 38 | 'dir/image.png', | ||||
| 39 | '/dir/image.png', | ||||
| 40 | 'dir/../image.png', | ||||
| 3269972a » | Stoyan Stefanov | 2009-03-17 | 41 | './image.png', | |
| 42 | './dir/image.png' | ||||
| 558b9e37 » | Stoyan Stefanov | 2009-03-17 | 43 | ]; | |
| 44 | |||||
| 45 | var i, j, td, tr, t = document.getElementsByTagName('table')[0]; | ||||
| 46 | for (i = 0; i < hosts.length; i++) { | ||||
| 47 | for (j = 0; j < files.length; j++) { | ||||
| 48 | tr = document.createElement('tr'); | ||||
| 49 | if (j % 2) tr.className = 'even'; | ||||
| 50 | td = document.createElement('td'); | ||||
| 51 | td.innerHTML = hosts[i]; | ||||
| 52 | tr.appendChild(td); | ||||
| 53 | td = document.createElement('td'); | ||||
| 54 | td.innerHTML = files[j]; | ||||
| 55 | tr.appendChild(td); | ||||
| 56 | td = document.createElement('td'); | ||||
| 57 | td.innerHTML = toAbs(files[j], hosts[i]); | ||||
| 58 | tr.appendChild(td); | ||||
| 59 | t.appendChild(tr); | ||||
| 60 | } | ||||
| 61 | } | ||||
| 62 | |||||
| 63 | |||||
| 64 | function toAbs(link, host) { | ||||
| 65 | |||||
| 66 | var lparts = link.split('/'); | ||||
| 67 | if (/http:|https:|ftp:/.test(lparts[0])) { | ||||
| 68 | // already abs, return | ||||
| 69 | return link; | ||||
| 70 | } | ||||
| 71 | |||||
| 72 | var i, hparts = host.split('/'); | ||||
| 73 | if (hparts.length > 3) { | ||||
| 74 | hparts.pop(); // strip trailing thingie, either scriptname or blank | ||||
| 75 | } | ||||
| 76 | |||||
| 77 | if (lparts[0] === '') { // like "/here/dude.png" | ||||
| 78 | host = hparts[0] + '//' + hparts[2]; | ||||
| 79 | hparts = host.split('/'); // re-split host parts from scheme and domain only | ||||
| 80 | delete lparts[0]; | ||||
| 81 | } | ||||
| 82 | |||||
| 83 | for(i = 0; i < lparts.length; i++) { | ||||
| 84 | if (lparts[i] === '..') { | ||||
| 85 | // remove the previous dir level, if exists | ||||
| 86 | if (typeof lparts[i - 1] !== 'undefined') { | ||||
| 87 | delete lparts[i - 1]; | ||||
| 88 | } else if (hparts.length > 3) { // at least leave scheme and domain | ||||
| 89 | hparts.pop(); // stip one dir off the host for each /../ | ||||
| 90 | } | ||||
| 91 | delete lparts[i]; | ||||
| 92 | } | ||||
| 3269972a » | Stoyan Stefanov | 2009-03-17 | 93 | if(lparts[i] === '.') { | |
| 94 | delete lparts[i]; | ||||
| 95 | } | ||||
| 558b9e37 » | Stoyan Stefanov | 2009-03-17 | 96 | } | |
| 97 | |||||
| 98 | // remove deleted | ||||
| 99 | var newlinkparts = []; | ||||
| 100 | for (i = 0; i < lparts.length; i++) { | ||||
| 101 | if (typeof lparts[i] !== 'undefined') { | ||||
| 102 | newlinkparts[newlinkparts.length] = lparts[i]; | ||||
| 103 | } | ||||
| 104 | } | ||||
| 105 | |||||
| 106 | return hparts.join('/') + '/' + newlinkparts.join('/'); | ||||
| 107 | |||||
| 108 | } | ||||
| 109 | </script> | ||||
| 110 | </html> | ||||
| 111 | |||||
| 112 | |||||
| 113 | |||||
