<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Relative to Absolute links test</title>
<style type="text/css">
body {font-family: consolas, courier new, courier;}
.even {background: #eee;}
</style>
</head>
<body>
<table border="1" id="result">
<tr><th>host</th>
<th>file</th>
<th>result</th></tr>
</table>
</body>
<script type="text/javascript">
var hosts = [
'http://example.org',
'http://example.org/',
'http://example.org/level1/',
'http://example.org/level1/test.php',
'http://example.org/level1',
'http://example.org/level1/level2',
'http://example.org/level1/level2/',
'http://example.org/level1/level2/test.html',
'http://example.org/level1/level2/level3/'
];
var files = [
'image.png',
'/image.png',
'../../image.png',
'/../../image.png',
'dir/image.png',
'/dir/image.png',
'dir/../image.png',
'./image.png',
'./dir/image.png'
];
var i, j, td, tr, t = document.getElementsByTagName('table')[0];
for (i = 0; i < hosts.length; i++) {
for (j = 0; j < files.length; j++) {
tr = document.createElement('tr');
if (j % 2) tr.className = 'even';
td = document.createElement('td');
td.innerHTML = hosts[i];
tr.appendChild(td);
td = document.createElement('td');
td.innerHTML = files[j];
tr.appendChild(td);
td = document.createElement('td');
td.innerHTML = toAbs(files[j], hosts[i]);
tr.appendChild(td);
t.appendChild(tr);
}
}
function toAbs(link, host) {
var lparts = link.split('/');
if (/http:|https:|ftp:/.test(lparts[0])) {
// already abs, return
return link;
}
var i, hparts = host.split('/');
if (hparts.length > 3) {
hparts.pop(); // strip trailing thingie, either scriptname or blank
}
if (lparts[0] === '') { // like "/here/dude.png"
host = hparts[0] + '//' + hparts[2];
hparts = host.split('/'); // re-split host parts from scheme and domain only
delete lparts[0];
}
for(i = 0; i < lparts.length; i++) {
if (lparts[i] === '..') {
// remove the previous dir level, if exists
if (typeof lparts[i - 1] !== 'undefined') {
delete lparts[i - 1];
} else if (hparts.length > 3) { // at least leave scheme and domain
hparts.pop(); // stip one dir off the host for each /../
}
delete lparts[i];
}
if(lparts[i] === '.') {
delete lparts[i];
}
}
// remove deleted
var newlinkparts = [];
for (i = 0; i < lparts.length; i++) {
if (typeof lparts[i] !== 'undefined') {
newlinkparts[newlinkparts.length] = lparts[i];
}
}
return hparts.join('/') + '/' + newlinkparts.join('/');
}
</script>
</html>