getMainDir() . '/'); foreach ($item->getFiles() as $location => $fileInfo) { $filename = substr($location, $baseLength); if ($checkOldScandata) { if ($filename == 'scandata.xml' || $filename == 'scandata.zip') { $foundScandata = $filename; } } if ($filename == $targetScandata) { $foundScandata = $filename; } if (preg_match($imageFormatRegex, $filename)) { $foundImageStack = $filename; } } if ($foundScandata && $foundImageStack) { return true; } return false; } // Finds the prefix to use for the book given the part of the URL trailing after /stream/ public static function findPrefix($urlPortion) { if (!preg_match('#[^/&?]+#', $urlPortion, $matches)) { // URL portion was empty or started with /, &, or ? -- no item identifier return false; } $prefix = $matches[0]; // item identifier // $$$ Currently swallows the rest of the URL. // If we want to support e.g. /stream/itemid/subdir/prefix/page/23 will need to adjust. if (preg_match('#[^/&?]+/([^&?]+)#', $urlPortion, $matches)) { // Match is everything after item identifier and slash, up to end or ? or & // e.g. itemid/{match/these/parts}?foo=bar $prefix = $matches[1]; // sub prefix -- } return $prefix; } // $$$ would be cleaner to use different templates instead of the uiMode param // // @param subprefix Optional prefix to display a book inside an item (e.g. if does not match identifier) public static function draw($server, $mainDir, $identifier, $subPrefix, $title, $coverLeaf=null, $titleStart='Internet Archive', $uiMode='full', $protected = false, $isAdmin=false) { // Set title to default if not set if (!$title) { $title = 'BookReader'; } $id = $identifier; // manually update with Launchpad version number at each checkin so that browsers // do not use old cached version // see https://bugs.launchpad.net/gnubook/+bug/330748 $version = "3.0.9"; if (BookReader::getDevHost($server)) { // On dev host - add time to force reload // If debugging on IE, remove this line otherwise breakpoints will be invalid after reload $version .= '_' . time(); } if ("" == $id) { echo "No identifier specified!"; die(-1); } $metaURL = BookReader::jsMetadataURL($server, $identifier, $mainDir, $subPrefix); $metaURL .= "&version=" . $version; $locateURL = BookReader::jsLocateURL($identifier, $subPrefix); $coverThumb = 'http://www.archive.org/download/' . $identifier . '/'. $subPrefix . '/page/cover_w114.jpg'; // startup-up-image must be exactly 320x460 //$startupImage = 'http://www.archive.org/download/' . $identifier . '/'. $subPrefix . '/page/cover_w512.jpg'; ?> <? echo $title; ?>
Internet Archive BookReader -
Internet Archive BookReader
Internet Archive BookReader

Search results
Internet Archive
$identifier, 'itemPath' => $mainDir, 'server' => $server ); if ($subPrefix) { $params['subPrefix'] = $subPrefix; } $keys = array_keys($params); $lastParam = end($keys); $url = "http://{$serverBaseURL}/BookReader/BookReaderJSIA.php?"; foreach($params as $param=>$value) { $url .= $param . '=' . $value; if ($param != $lastParam) { $url .= '&'; } } return $url; } public static function jsMetadataURLForIE7($server, $identifier, $mainDir, $subPrefix = '') { $serverBaseURL = BookReader::serverBaseURL($server); $params = array( 'id' => $identifier, 'itemPath' => $mainDir, 'server' => $server ); if ($subPrefix) { $params['subPrefix'] = $subPrefix; } $keys = array_keys($params); $lastParam = end($keys); $url = "http://{$serverBaseURL}/BookReader/ie7/BookReaderJSIA.php?"; foreach($params as $param=>$value) { $url .= $param . '=' . $value; if ($param != $lastParam) { $url .= '&'; } } return $url; } // This returns a URL that finds the item then returns a redirect to BookReaderJSIA.php // on the item's server. public static function jsLocateURL($identifier, $subPrefix = '') { $locateURL = 'http://www.archive.org/bookreader/BookReaderJSLocate.php?id=' . $identifier; if ($subPrefix) { $locateURL .= '&subPrefix=' . $subPrefix; } return $locateURL; } // Return the URL for the requested /download/$path, or null public static function getURL($path, $item) { // $path should look like {itemId}/{operator}/{filename} // Other operators may be added $urlParts = BookReader::parsePath($path); // Check for non-handled cases $required = array('identifier', 'operator', 'operand'); foreach ($required as $key) { if (!array_key_exists($key, $urlParts)) { return null; } } $identifier = $urlParts['identifier']; $operator = $urlParts['operator']; $filename = $urlParts['operand']; $subPrefix = $urlParts['subPrefix']; $serverBaseURL = BookReader::serverBaseURL($item->getServer()); // Baseline query params $query = array( 'id' => $identifier, 'itemPath' => $item->getMainDir(), 'server' => $serverBaseURL ); if ($subPrefix) { $query['subPrefix'] = $subPrefix; } switch ($operator) { case 'page': // Look for old-style preview request - e.g. {identifier}_cover.jpg if (preg_match('/^(.*)_((cover|title|preview).*)/', $filename, $matches) === 1) { // Serve preview image $page = $matches[2]; $query['page'] = $page; return 'http://' . $serverBaseURL . '/BookReader/BookReaderPreview.php?' . http_build_query($query, '', '&'); } // New-style preview request - e.g. cover_thumb.jpg if (preg_match('/^(cover|title|preview)/', $filename, $matches) === 1) { $query['page'] = $filename; return 'http://' . $serverBaseURL . '/BookReader/BookReaderPreview.php?' . http_build_query($query, '', '&'); } // Asking for a non-preview page $query['page'] = $filename; return 'http://' . $serverBaseURL . '/BookReader/BookReaderImages.php?' . http_build_query($query, '', '&'); default: // Unknown operator return null; } return null; // was not handled } public static function browserFromUserAgent($userAgent) { $browserPatterns = array( 'ipad' => '/iPad/', 'iphone' => '/iPhone/', // Also covers iPod Touch 'android' => '/Android/', ); foreach ($browserPatterns as $browser => $pattern) { if (preg_match($pattern, $userAgent)) { return $browser; } } return null; } // $$$ Ideally we will not rely on user agent, but for the moment we do public static function paramsFromUserAgent($userAgent) { // $$$ using 'embed' here for devices with assumed small screens -- really should just use CSS3 media queries $browserParams = array( 'ipad' => array( 'ui' => 'touch' ), 'iphone' => array( 'ui' => 'embed', 'mode' => '1up' ), 'android' => array( ), // Presence of this OS doesn't tell us much about device ); $browser = BookReader::browserFromUserAgent($userAgent); if ($browser) { return $browserParams[$browser]; } return array(); } public static function parsePath($path) { // Parse the BookReader path and return the parts // e.g. itemid/some/sub/dir/page/cover.jpg -> array( 'identifier' => 'itemid', 'subPrefix' => 'some/sub/dir', // 'operator' => 'page', 'filename' => 'cover.jpg') $parts = array(); // Pull off query, e.g. ?foo=bar if (preg_match('#(.*?)(\?.*)#', $path, $matches) === 1) { $parts['query'] = $matches[2]; $path = $matches[1]; } // Pull off identifier if (preg_match('#[^/&?]+#', $path, $matches) === 0) { // no match return $parts; } $parts['identifier'] = $matches[0]; $path = substr($path, strlen($matches[0])); // Look for operators // The sub-prefix can be arbitrary, so we match up until the first operator $operators = '(' . join('|', self::$downloadOperators) . ')'; $pattern = '#(?P.*?)/(?P' . $operators . ')/(?P.*)#'; if (preg_match($pattern, $path, $matches) === 1) { $parts['subPrefix'] = substr($matches['subPrefix'], 1); // remove leading '/' $parts['operator'] = $matches['operator']; $parts['operand'] = $matches['operand']; } else { $parts['subPrefix'] = $path; } return $parts; } } ?>