stoyan / etc

random

Stoyan Stefanov (author)
Tue Mar 17 20:15:09 -0700 2009
commit  3269972aa8798cc7404f4fb9c07f0742c30f7ac9
tree    40435d5518172681795ae4061570c03a464f1d83
parent  558b9e3748aa9e051ad1ffca7fa09dcb25e62efc
etc / toAbs / absolute.html
558b9e37 » Stoyan Stefanov 2009-03-17 initial checkin 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 check for ./ in the urls, t... 41 './image.png',
42 './dir/image.png'
558b9e37 » Stoyan Stefanov 2009-03-17 initial checkin 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 check for ./ in the urls, t... 93 if(lparts[i] === '.') {
94 delete lparts[i];
95 }
558b9e37 » Stoyan Stefanov 2009-03-17 initial checkin 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