static function find($uri_path_or_slug, $version = null, $strptime = null, $applyBodyFilters = true)
{
$version = self::parseVersion($version);
$path = false;
if (strpos($uri_path_or_slug, 'content/posts/') !== false) {
$path = $uri_path_or_slug;
if ($path[0] !== '/') {
$path = gb::$site_dir . '/' . $path;
}
}
if ($version === 'work') {
# find path to raw content
if ((!$path || !is_file($path)) && ($path = self::pathToWork($uri_path_or_slug, $strptime)) === null) {
return false;
}
# parse pathspec, producing date and actual slug needed to look up cached
try {
self::parsePathspec(self::pathspecFromAbsPath($path), $date, $slug, $fnext);
} catch (UnexpectedValueException $e) {
return null;
}
# try to find a cached version
$post = self::findByDateAndSlug($date, $slug);
# load work
return self::loadWork($path, $post, 'GBPost', $version, $slug, $applyBodyFilters);
} elseif ($version === null) {
if ($path) {
self::parsePathspec(self::pathspecFromAbsPath($path), $date, $slug, $fnext);
return self::findByDateAndSlug($date, $slug);
}
$path = self::pathToCached($uri_path_or_slug, $strptime);
$data = @file_get_contents($path);
if ($data === false && gb::$posts_fuzzy_lookup === true) {
# exact match failed -- try fuzzy matching using glob and our knowledge of patterns
list($prefix, $suffix) = self::cachenameFromURI($uri_path_or_slug, $strptime, true);
$path = strtr($prefix, array('/' => '{/,*,.}', '-' => '{/,*,.}', '.' => '{/,*,.}')) . '*' . $suffix;
$path = GBExposedContent::pathToCached('posts', $path . gb::$content_cache_fnext);
# try any file with the cachename as prefix
if ($path = gb::glob($path)) {
$data = @file_get_contents($path);
/*
Send premanent redirect if we found a valid article.
Discussion: This is where things might go really wrong -- imagine we did find an
article on fuzzy matching but it's _another_ article. Fail. But that
case is almost negligible since we only expand the time prefix, not
the slug.
*/
global $gb_handle_request;
if ($data !== false && isset($gb_handle_request) && $gb_handle_request === true && ($post = unserialize($data)) && headers_sent() === false) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $post->url());
exit('Moved to <a href="' . h($post->url()) . '">' . h($post->url()) . '</a>');
}
}
}
return $data === false ? false : unserialize($data);
}
throw new Exception('arbitrary version retrieval not yet implemented');
}