public
Description: random
Homepage: http://phpied.com
Clone URL: git://github.com/stoyan/etc.git
etc / toAbs / absolute.html
100644 114 lines (98 sloc) 3.266 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!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>