X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=mdref%2FRepo.php;h=f52a35e5ac06c7d939e4e3ad6d718ee61a2eefdf;hb=8de7b39a79ff94a9fdefd792ea1f65c41400f654;hp=f59a82e7b387178621498dadad2ac6cfe1b5daaa;hpb=6478b415c59070f70ed860f3a592377eef9783b1;p=mdref%2Fmdref diff --git a/mdref/Repo.php b/mdref/Repo.php index f59a82e..f52a35e 100644 --- a/mdref/Repo.php +++ b/mdref/Repo.php @@ -3,79 +3,97 @@ namespace mdref; +use InvalidArgumentException; +use IteratorAggregate; +use function basename; +use function current; +use function file_get_contents; +use function glob; +use function is_file; +use function realpath; +use function rtrim; +use function sprintf; +use function trim; + /** * A reference repo */ -class Repo implements \IteratorAggregate { +class Repo implements IteratorAggregate { /** * The name of the repository * @var string */ private $name; - + /** * The path to the repository * @var string */ private $path; - + /** * The edit url template * @var string */ private $edit; - + /** * Path to the repository containing the name.mdref file * @param string $path * @throws \InvalidArgumentException */ - public function __construct($path) { - if (!($mdref = current(glob("$path/*.mdref")))) { - throw new \InvalidArgumentException( - sprintf("Not a reference, could not find '*.mdref': '%s'", - $path)); + public function __construct(string $path) { + if (!($glob = glob("$path/*.mdref"))) { + throw new InvalidArgumentException( + sprintf("Not a reference, could not find '*.mdref': '%s'", $path)); } - + + $mdref = current($glob); $this->path = realpath($path); $this->name = basename($mdref, ".mdref"); $this->edit = trim(file_get_contents($mdref)); } - + /** * Get the repository's name * @return string */ - public function getName() { + public function getName() : string { return $this->name; } - + /** * Get the path of the repository or a file in it * @param string $file * @return string */ - public function getPath($file = "") { + public function getPath(string $file = "") : string { return $this->path . "/$file"; } - + /** * Get the edit url for a ref entry * @param string $entry * @return string */ - public function getEditUrl($entry) { + public function getEditUrl(string $entry) : string { return sprintf($this->edit, $entry); } - + /** * Get the file path of an entry in this repo + * * @param string $entry + * @param string|null $canonical * @return string file path */ - public function hasEntry($entry, &$canonical = null) { - $file = $this->getPath("$entry.md"); - if (is_file($file)) { + public function hasEntry(string $entry, ?string &$canonical = null) : ?string { + $trim = rtrim($entry, "/"); + $file = $this->getPath("$trim.md"); + if (is_file($file)) { + if ($trim !== $entry) { + $canonical = $trim; + } return $file; } $file = $this->getPath($this->getName()."/$entry.md"); @@ -83,53 +101,65 @@ class Repo implements \IteratorAggregate { $canonical = $this->getName() . "/" . $entry; return $file; } + return null; } - + /** * Get the canonical entry name of a file in this repo * @param string $file * @return string entry */ - public function hasFile($file) { + public function hasFile(string $file) : ?string { if (($file = realpath($file))) { $path = $this->getPath(); $plen = strlen($path); if (!strncmp($file, $path, $plen)) { $dirname = dirname(substr($file, $plen)); $basename = basename($file, ".md"); - + if ($dirname === ".") { return $basename; } - + return $dirname . "/". $basename; } } + return null; + } + + /** + * Check whether the repo has a stub file to serve + * @param string|null $path receives the path if there's a stub + * @return bool + */ + public function hasStub(string &$path = null) : bool { + $path = $this->getPath($this->getName() . ".stub.php"); + return is_file($path) && is_readable($path); } - + /** * Get an Entry instance * @param string $entry * @return \mdref\Entry * @throws \OutOfBoundsException */ - public function getEntry($entry) { + public function getEntry(string $entry) : Entry { return new Entry($entry, $this); } - + /** * Get the root Entry instance * @return \mdref\Entry */ - public function getRootEntry() { + public function getRootEntry() : Entry { return new Entry($this->name, $this); } - + /** * Implements \IteratorAggregate * @return \mdref\Tree */ - public function getIterator() { + public function getIterator() : Tree { return new Tree($this->path, $this); } }