Skip to content

Instantly share code, notes, and snippets.

@MihanEntalpo
Last active December 17, 2015 20:09
Show Gist options
  • Save MihanEntalpo/5665333 to your computer and use it in GitHub Desktop.
Save MihanEntalpo/5665333 to your computer and use it in GitHub Desktop.
<?php
doc('Функция генерирующая докблоки и записывающая их в файл (умеет грамотно обновлять файл)');
param('Имя файла, куда нужно сохранять данные','string');
param('Затереть ли файл? default=false','boolean');
def('docBlockGen',function($filename, $overWrite=false)
{
//Исходный контент добавляемый в файл при создании.
$content = '<?php
//Здесь находятся док-блоки для всякого разного - сгенерированные генератором :)
//Тэги <func funcName> и </func funcName> нужны генератору для обновления сведений. Все что вне этих тэгов - остается
//неизменным.
//Если нужно изменить блок внутри тэгов так, чтобы он больше не обновлялся (и не добавлялся повторно)
// - нужно добавить в тэг <func funcname> восклицательный знак перед словом func, вот так: <!func funcName>
// закрывающий тэг не менять!
';
if (!file_exists($filename))
{
if (!is_writable(dirname($filename))) throw new RuntimeException('Файл не существует, а папка не доступна для записи!');
}
else
{
if (!is_writable($filename)) throw new RuntimeException('Файл существует, но не доступен от записи!');
if ($overWrite)
{
unlink($filename);
}
else
{
if (!is_readable($filename)) throw new RuntimeException('Файл не доступен для чтения!');
$content = file_get_contents($filename);
}
}
$addBlocks = '';
foreach(docs() as $group)
{
foreach($group['fns'] as $funcName=>$data)
{
if (strrpos($funcName,"\\")!==FALSE)
{
//echo "<br>" . $funcName . ", " . strrpos($funcName,"\\");
$nameSpace = substr($funcName,0,strrpos($funcName,"\\"));
$realFuncName = str_replace($nameSpace . "\\", "", $funcName);
//echo "<b>".$nameSpace."</b>";
}
else
{
$nameSpace = "";
$realFuncName = $funcName;
}
$block = "//<func ". $funcName . ">\n";
$block.= "/** \n";
$block.= "* ". gisset($data['doc'],$funcName);
if (isset($group['doc']))
{
$block.= " (" . $group['doc'] . ")";
}
$block .="\n";
$paramsString = "";
foreach(gisset($data['params'],array()) as $paramName => $paramData)
{
$block.= "* @param " . gisset($paramData['type'], 'mixed') . " " . $paramName . " " . $paramData['doc'] . "\n";
if (strlen($paramsString)!=0) $paramsString .= ",";
$paramsString .= '$' . $paramName;
}
$block.= "*/ \n";
$block.= "namespace " . $nameSpace . "{\n";
$block.= "function " . $realFuncName . "(" . $paramsString . "){}\n";
$block.= "}\n";
$block.= "//</func ". $funcName . ">\n";
if (preg_match("#//<(?P<dontedit>!)?func {$funcName}>([\n\r\t]|.)*?//</func {$funcName}>\n#ium",$content,$matches))
{
//echo "<br>Функция " . $funcName . " уже есть в файле";
if ($matches['dontedit']=='!')
{
//echo " и ее обновлять запрещено!";
}
else
{
$content = str_replace($matches[0], $block, $content);
}
}
else
{
$addBlocks .= $block;
}
}
}
$content .= $addBlocks;
file_put_contents($filename, $content);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment