New package proposal
| From: | Dmitry Koteroff | Date: | Mon, 31 May 2004 13:53:01 +0000 |
| Subject: | New package proposal | ||
| Groups: | php.pear.dev | ||
| Request: | Send a blank email to pear-dev+get-29816@lists.php.net to get a copy of this message | ||
Hello.
I have written useful package (PHP4, PHP5) for automatize PEAR
coding standards name conversion in PHP programs - e.g. from PEAR
classname to full filename and vice versa.
class PEAR_NameScheme {
// static string name2path(string $classname, $absolutize=false);
// static string path2name(string $path);
// static string getInc($abs = false);
}
The main goal is to handle classnames in lowercase CORRECTLY,
selecting corresponding filename in the filesystem (with
capitals). For example,
PEAR_NameScheme::name2path("pear", true)
and
PEAR_NameScheme::name2path("neT_sMtp", true)
both return correct full pathes - /path/to/pear/PEAR.php and
/path/to/pear/Net_SMTP.php (you see filename is case-sensitive).
It could be used to write __autoload() routine in PHP5, or in
content-management systems which loads components on demand. I
have used it in lots of my own projects.
What do you think about placing this package to PEAR? Source
attached (comments in Russion). If you agree I will translate it
to English, write docs and reformat to PEAR coding standarts.
--
Best regards,
Dmitry Koteroff.
<?php // Áèáëèîòåêà PEAR_NameSheme. define("PEAR_NameScheme_ext", "php"); // ðàñøèðåíèå áèáëèîòå÷íûõ ôàéëîâ define("PEAR_NameScheme_bar", "_"); // ñèìâîë ïîä÷åðêà class PEAR_NameScheme { // static string name2path(string $classname) // Âîçâðàùàåò èìÿ ôàéëà ïî èìåíè áèáëèîòåêè. // Ïàðàìåòð $classname ìîæåò ñîäåðæàòü èìÿ êëàññà // È Â ÍÈÆÍÅÌ ÐÅÃÈÑÒÐÅ. Èìÿ ôàéëà âñå ðàâíî âîçâðàùàåòñÿ // â âåðõíåì. function name2path($classname, $absolutize=false) { $parts = explode("_", $classname.".".PEAR_NameScheme_ext); // Èùåì â include_path íóæíóþ äèðåêòîðèþ áèáëèîòåê. foreach (PEAR_NameScheme::getInc($absolutize) as $libDir) { $path = $libDir; $found = true; // Ïðîõîäèì ïî âñåì ÷àñòÿì â èìåíè êëàññà. // Íàïðèìåð, äëÿ A_B_C áóäåò: "A", "B", "C.php". foreach ($parts as $part) { // Åñòü ôàéë ñ èìåíåì, ñîâïàäàþùèì ñ íàçâàíèåì ÷àñòè. $casePart = false; // Ôàéëà ñ òî÷íî òàêèì èìåíåì íåò. Âîçìîæíî, // íåïðàâèëüíûé ðåãèñòð ñèìâîëîâ. Èùåì â äèðåêòîðèè // ýëåìåíò ñ òåì æå èìåíåì (ðåãèñòð íå âàæåí). foreach (glob("$path/*") as $e) { $e = basename($e); // Èìåíà îäèíàêîâû (áåç ó÷åòà ðåãèñòðà)? if (!strcasecmp($e, $part)) { $casePart = $e; break; } } // Åñëè íè÷åãî íå íàøëè, ïåðåõîäèì ê ñëåäóþùåìó ïóòè. if ($casePart === false) { $found = false; break; } // Èíà÷å ïðîäîëæàåì îáðàáàòûâàòü ñëåäóþùóþ ÷àñòü. $path .= "/".$casePart; } // Íàøëè íóæíûé ôàéë?.. if ($found) { if (!$absolutize) return substr($path, strlen($libDir)+1); else return $path; } } return false; } // static string path2name(string $filename) // Âîçâðàùàåò èìÿ ïðîñòðàíñòâà èìåí áèáëèîòåêè ïî // èìåíè ôàéëà, â êîòîðîì îíà ñîäåðæèòñÿ. Äîïóñòèìî // ïåðåäàâàòü àáñîëþòíûå èìåíà ôàéëîâ - â ýòîì ñëó÷àå // ïðîèçâîäèòñÿ ïîèñê ïî include_path.  ñëó÷àå // íåâîçìîæíîñòè îïðåäåëåíèÿ èìåíè âîçâðàùàåò false. function path2name($path) { // Óêàçàí àáñîëþòíûé ïóòü ê ôàéëó. if (preg_match('//^\w:|^[/\\\\]//s', $path)) { $path = str_replace("\\", "/", realpath($path)); // Èùåì â include_path ñîîòâåòñòâóþùóþ äèðåêòîðèþ. $inc = PEAR_NameScheme::getInc(true); $found = false; foreach ($inc as $i) { if (strpos($path, $i."/") === 0) { // Åñëè íàøëè - âûðåçàåì. $path = substr($path, strlen($i)+1); $found = true; break; } } if (!$found) return false; } $name = preg_replace("{[/\\\\]}s", PEAR_NameScheme_bar, $path); $name = preg_replace('/\.'.PEAR_NameScheme_ext.'$/s', '', $name); return $name; } // static array getInc($absolutize = false) // Âîçâðàùàåò ñïèñîê äèðåêòîðèé â include_path. // Åñëè $absolutize=true, òî êàæäûé ïóòü â ñïèñêå // áóäåò àáñîëþòíûì. Âñå ñëýøè â ðåçóëüòàòå // îêàçûâàþòñÿ ïðÿìûìè: "/". function getInc($abs = false) { $sep = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')? ";" : ":"; $inc = explode($sep, ini_get("include_path")); // Åñëè íóæíû àáñîëþòíûå ïóòè... if ($abs) $inc = array_map("realpath", $inc); // Âûçîâ str_replace ñ àðãóìåíòîì-ìàññèâîì. return str_replace("\\", "/", $inc); } } ?>
<?php // Áèáëèîòåêà PEAR_NameSheme. define("PEAR_NameScheme_ext", "php"); // ðàñøèðåíèå áèáëèîòå÷íûõ ôàéëîâ define("PEAR_NameScheme_bar", "_"); // ñèìâîë ïîä÷åðêà class PEAR_NameScheme { // static string name2path(string $classname) // Âîçâðàùàåò èìÿ ôàéëà ïî èìåíè áèáëèîòåêè. // Ïàðàìåòð $classname ìîæåò ñîäåðæàòü èìÿ êëàññà // È Â ÍÈÆÍÅÌ ÐÅÃÈÑÒÐÅ. Èìÿ ôàéëà âñå ðàâíî âîçâðàùàåòñÿ // â âåðõíåì. function name2path($classname, $absolutize=false) { $parts = explode("_", $classname.".".PEAR_NameScheme_ext); // Èùåì â include_path íóæíóþ äèðåêòîðèþ áèáëèîòåê. foreach (PEAR_NameScheme::getInc($absolutize) as $libDir) { $path = $libDir; $found = true; // Ïðîõîäèì ïî âñåì ÷àñòÿì â èìåíè êëàññà. // Íàïðèìåð, äëÿ A_B_C áóäåò: "A", "B", "C.php". foreach ($parts as $part) { // Åñòü ôàéë ñ èìåíåì, ñîâïàäàþùèì ñ íàçâàíèåì ÷àñòè. $casePart = false; // Ôàéëà ñ òî÷íî òàêèì èìåíåì íåò. Âîçìîæíî, // íåïðàâèëüíûé ðåãèñòð ñèìâîëîâ. Èùåì â äèðåêòîðèè // ýëåìåíò ñ òåì æå èìåíåì (ðåãèñòð íå âàæåí). foreach (glob("$path/*") as $e) { $e = basename($e); // Èìåíà îäèíàêîâû (áåç ó÷åòà ðåãèñòðà)? if (!strcasecmp($e, $part)) { $casePart = $e; break; } } // Åñëè íè÷åãî íå íàøëè, ïåðåõîäèì ê ñëåäóþùåìó ïóòè. if ($casePart === false) { $found = false; break; } // Èíà÷å ïðîäîëæàåì îáðàáàòûâàòü ñëåäóþùóþ ÷àñòü. $path .= "/".$casePart; } // Íàøëè íóæíûé ôàéë?.. if ($found) { if (!$absolutize) return substr($path, strlen($libDir)+1); else return $path; } } return false; } // static string path2name(string $filename) // Âîçâðàùàåò èìÿ ïðîñòðàíñòâà èìåí áèáëèîòåêè ïî // èìåíè ôàéëà, â êîòîðîì îíà ñîäåðæèòñÿ. Äîïóñòèìî // ïåðåäàâàòü àáñîëþòíûå èìåíà ôàéëîâ - â ýòîì ñëó÷àå // ïðîèçâîäèòñÿ ïîèñê ïî include_path.  ñëó÷àå // íåâîçìîæíîñòè îïðåäåëåíèÿ èìåíè âîçâðàùàåò false. function path2name($path) { // Óêàçàí àáñîëþòíûé ïóòü ê ôàéëó. if (preg_match('//^\w:|^[/\\\\]//s', $path)) { $path = str_replace("\\", "/", realpath($path)); // Èùåì â include_path ñîîòâåòñòâóþùóþ äèðåêòîðèþ. $inc = PEAR_NameScheme::getInc(true); $found = false; foreach ($inc as $i) { if (strpos($path, $i."/") === 0) { // Åñëè íàøëè - âûðåçàåì. $path = substr($path, strlen($i)+1); $found = true; break; } } if (!$found) return false; } $name = preg_replace("{[/\\\\]}s", PEAR_NameScheme_bar, $path); $name = preg_replace('/\.'.PEAR_NameScheme_ext.'$/s', '', $name); return $name; } // static array getInc($absolutize = false) // Âîçâðàùàåò ñïèñîê äèðåêòîðèé â include_path. // Åñëè $absolutize=true, òî êàæäûé ïóòü â ñïèñêå // áóäåò àáñîëþòíûì. Âñå ñëýøè â ðåçóëüòàòå // îêàçûâàþòñÿ ïðÿìûìè: "/". function getInc($abs = false) { $sep = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')? ";" : ":"; $inc = explode($sep, ini_get("include_path")); // Åñëè íóæíû àáñîëþòíûå ïóòè... if ($abs) $inc = array_map("realpath", $inc); // Âûçîâ str_replace ñ àðãóìåíòîì-ìàññèâîì. return str_replace("\\", "/", $inc); } } ?>