171 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 *  pgn4web javascript chessboard
 | 
						|
 *  copyright (C) 2009-2013 Paolo Casaschi
 | 
						|
 *  see README file and http://pgn4web.casaschi.net
 | 
						|
 *  for credits, license and more details
 | 
						|
 */
 | 
						|
 | 
						|
error_reporting(E_ALL | E_STRICT);
 | 
						|
 | 
						|
$targetUrl = get_param("targetUrl", "tu", "");
 | 
						|
$linkFilterDefault = ".+.pgn$";
 | 
						|
$linkFilter = get_param("linkFilter", "lf", $linkFilterDefault);
 | 
						|
$frameDepthDefault = 0;
 | 
						|
$frameDepth = get_param("frameDepth", "fd", $frameDepthDefault);
 | 
						|
$viewerUrlDefault = "viewer.php?pd=";
 | 
						|
$viewerUrl = get_param("viewerUrl", "vu", $viewerUrlDefault);
 | 
						|
$doubleEncodeLink = get_param("doubleEncodeLink", "del", "false");
 | 
						|
$doubleEncodeLink = (($doubleEncodeLink == "true") || ($doubleEncodeLink == "t"));
 | 
						|
$headlessPage = get_param("headlessPage", "hp", "false");
 | 
						|
$headlessPage = (($headlessPage == "true") || ($headlessPage == "t"));
 | 
						|
$help = get_param("help", "h", "false");
 | 
						|
$help = (($help == "true") || ($help == "t"));
 | 
						|
if ((! is_numeric($frameDepth)) || ($frameDepth < 0) || ($frameDepth > 5)) { $frameDepth = $frameDepthDefault; }
 | 
						|
$actualFrameDepth = 0;
 | 
						|
$urls = array();
 | 
						|
get_links($targetUrl, $frameDepth);
 | 
						|
print_links();
 | 
						|
 | 
						|
function get_links($targetUrl, $depth) {
 | 
						|
    global $urls, $linkFilter, $frameDepth, $actualFrameDepth;
 | 
						|
 | 
						|
    if (! $targetUrl) { return; }
 | 
						|
 | 
						|
    if ($frameDepth - $depth > $actualFrameDepth) { $actualFrameDepth = $frameDepth - $depth; }
 | 
						|
 | 
						|
    $html = file_get_contents($targetUrl);
 | 
						|
    $dom = new DOMDocument();
 | 
						|
    @$dom->loadHTML($html);
 | 
						|
    $xpath = new DOMXPath($dom);
 | 
						|
 | 
						|
    $bases = $xpath->evaluate("/html/head//base");
 | 
						|
    if ($bases->length > 0) {
 | 
						|
        $baseItem = $bases->item($bases->length - 1);
 | 
						|
        $base = $baseItem->getAttribute('href');
 | 
						|
    } else {
 | 
						|
        $base = $targetUrl;
 | 
						|
    }
 | 
						|
 | 
						|
    if ($depth > 0) {
 | 
						|
        $frames = $xpath->evaluate("/html/body//iframe");
 | 
						|
        for ($i = 0; $i < $frames->length; $i++) {
 | 
						|
            $frame = $frames->item($i);
 | 
						|
            $url = make_absolute($frame->getAttribute('src'), $base);
 | 
						|
            if ($url != $targetUrl) { get_links($url, $depth -1); }
 | 
						|
        }
 | 
						|
        $frames = $xpath->evaluate("/html/body//frame");
 | 
						|
        for ($i = 0; $i < $frames->length; $i++) {
 | 
						|
            $frame = $frames->item($i);
 | 
						|
            $url = make_absolute($frame->getAttribute('src'), $base);
 | 
						|
            if ($url != $targetUrl) { get_links($url, $depth -1); }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    $hrefs = $xpath->evaluate("/html/body//a");
 | 
						|
    for ($i = 0; $i < $hrefs->length; $i++) {
 | 
						|
        $href = $hrefs->item($i);
 | 
						|
        $url = $href->getAttribute('href');
 | 
						|
        $absolute = make_absolute($url, $base);
 | 
						|
        if (preg_match("@".$linkFilter."@i", parse_url($absolute, PHP_URL_PATH))) {
 | 
						|
            array_push($urls, $absolute);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function print_links() {
 | 
						|
    global $urls, $targetUrl, $linkFilter, $frameDepth, $viewerUrl, $doubleEncodeLink, $headlessPage, $help, $actualFrameDepth;
 | 
						|
 | 
						|
    $labelColor = "lightgray";
 | 
						|
 | 
						|
    $urls = array_unique($urls);
 | 
						|
    sort($urls);
 | 
						|
 | 
						|
    print("<!DOCTYPE HTML>" . "\n" . "<html>" . "\n" . "<head>" . "\n");
 | 
						|
 | 
						|
    if (($numUrls = count($urls)) == 1) { print "<title>1 link</title>" . "\n"; }
 | 
						|
    else { print "<title>$numUrls links</title>" . "\n"; }
 | 
						|
 | 
						|
    print "<link rel='shortcut icon' href='pawn.ico' />" . "\n";
 | 
						|
    print "<style tyle='text/css'> body { font-family: sans-serif; padding: 1.75em; line-height: 1.5em; } a { color: black; text-decoration: none; } ol { color: $labelColor; } </style>" . "\n";
 | 
						|
    print "<script type='text/javascript'> var viewerWin; </script>" . "\n";
 | 
						|
 | 
						|
    print("</head>" . "\n" . "<body>" . "\n");
 | 
						|
 | 
						|
    if ($help) {
 | 
						|
        print("<pre>" . "\n");
 | 
						|
        print("targetUrl = target url to scan for links" . "\n");
 | 
						|
        print("linkFilter = filter for selecting links" . "\n");
 | 
						|
        print("frameDepth = maximum recursive depth to scan frames" . "\n");
 | 
						|
        print("viewerUrl = viewer url to open links" . "\n");
 | 
						|
        print("doubleEncodeLink = true|false" . "\n");
 | 
						|
        print("headlessPage = true|false" . "\n");
 | 
						|
        print("help = true" . "\n");
 | 
						|
        print("\n");
 | 
						|
        print("</pre>" . "\n");
 | 
						|
    }
 | 
						|
 | 
						|
    if (!$headlessPage) {
 | 
						|
        print "<span style='color:$labelColor'>targetUrl</span>     <a href='" . $targetUrl . "' target='_blank'>" . $targetUrl . "</a><br />" . "\n";
 | 
						|
        print "<span style='color:$labelColor'>linkFilter</span>     " . $linkFilter . "<br />" . "\n";
 | 
						|
        if ($frameDepth > 0) { print "frameDepth:     <b>" . $frameDepth . "</b>     <span style='opacity: 0.2;'>" . $actualFrameDepth . "</span><br />" . "\n"; }
 | 
						|
        print("<div> </div>" . "\n");
 | 
						|
    }
 | 
						|
    if ($numUrls > 0) {
 | 
						|
        print("<ol>" . "\n");
 | 
						|
        for ($i = 0; $i < count($urls); $i++) {
 | 
						|
            print("<li>");
 | 
						|
            print("<a href='javascript:void(0);' onclick='if (event.shiftKey) { location.href = \"$urls[$i]\"; } else { if (viewerWin && !viewerWin.closed) { viewerWin.close(); } viewerWin = window.open(\"" . ($viewerUrl . ($doubleEncodeLink ? rawurlencode(rawurlencode($urls[$i])) : rawurlencode($urls[$i]))) . "\", \"pgn4web_link_viewer\"); viewerWin.focus(); } this.blur(); return false;'>");
 | 
						|
            print($urls[$i] . "</a>" . "</li>" . "\n");
 | 
						|
        }
 | 
						|
        print "</ol>" . "\n";
 | 
						|
    } else {
 | 
						|
        print("<i>no links found</i>" . "\n");
 | 
						|
    }
 | 
						|
 | 
						|
    print("</body>" . "\n" . "</html>");
 | 
						|
}
 | 
						|
 | 
						|
function get_param($param, $shortParam, $default) {
 | 
						|
  if (isset($_REQUEST[$param])) { return $_REQUEST[$param]; }
 | 
						|
  if (isset($_REQUEST[$shortParam])) { return $_REQUEST[$shortParam]; }
 | 
						|
  return $default;
 | 
						|
}
 | 
						|
 | 
						|
function make_absolute($url, $base) {
 | 
						|
 | 
						|
    // Return base if no url
 | 
						|
    if( ! $url) return $base;
 | 
						|
 | 
						|
    // Return if already absolute URL
 | 
						|
    if(parse_url($url, PHP_URL_SCHEME) != '') return $url;
 | 
						|
 | 
						|
    // Urls only containing query or anchor
 | 
						|
    if($url[0] == '#' || $url[0] == '?') return $base.$url;
 | 
						|
 | 
						|
    // Parse base URL and convert to local variables: $scheme, $host, $path
 | 
						|
    extract(parse_url($base));
 | 
						|
 | 
						|
    // If no path, use /
 | 
						|
    if( ! isset($path)) $path = '/';
 | 
						|
 | 
						|
    // Remove non-directory element from path
 | 
						|
    $path = preg_replace('#/[^/]*$#', '', $path);
 | 
						|
 | 
						|
    // Destroy path if relative url points to root
 | 
						|
    if($url[0] == '/') $path = '';
 | 
						|
 | 
						|
    // Dirty absolute URL
 | 
						|
    $abs = "$host$path/$url";
 | 
						|
 | 
						|
    // Replace '//' or '/./' or '/foo/../' with '/'
 | 
						|
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
 | 
						|
    for($n = 1; $n > 0; $abs = preg_replace($re, '/', $abs, -1, $n)) {}
 | 
						|
 | 
						|
    // Absolute URL is ready!
 | 
						|
    return $scheme.'://'.$abs;
 | 
						|
}
 | 
						|
 | 
						|
?>
 |