Initial Commit
This commit is contained in:
354
database/php/pear/PHP/UML/Output/HtmlNew/DocElement.php
Normal file
354
database/php/pear/PHP/UML/Output/HtmlNew/DocElement.php
Normal file
@@ -0,0 +1,354 @@
|
||||
<?php
|
||||
/**
|
||||
* PHP_UML
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_UML
|
||||
* @author Baptiste Autin <ohlesbeauxjours@yahoo.fr>
|
||||
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
|
||||
* @version SVN: $Revision: 176 $
|
||||
* @link http://pear.php.net/package/PHP_UML
|
||||
* @since $Date: 2011-09-19 00:03:11 +0200 (lun., 19 sept. 2011) $
|
||||
*/
|
||||
|
||||
/**
|
||||
* General class for an renderer in the HtmlNew implementation
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_UML
|
||||
* @subpackage Output
|
||||
* @subpackage HtmlNew
|
||||
* @author Baptiste Autin <ohlesbeauxjours@yahoo.fr>
|
||||
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
|
||||
*/
|
||||
abstract class PHP_UML_Output_HtmlNew_DocElement extends PHP_UML_Output_ApiRenderer
|
||||
{
|
||||
const FILE_EXT = 'htm';
|
||||
|
||||
const RESOURCES_DIRNAME = '$resources';
|
||||
const HELP_FILENAME = 'help';
|
||||
const INDEX_FILENAME = 'index';
|
||||
const INDEXALL_FILENAME = 'index-all';
|
||||
const MENU_FILENAME = 'menu';
|
||||
const JS_MAIN_NAME = 'MainList';
|
||||
const TEMPLATES_DIRNAME = 'templates';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param PHP_UML_Output_ExporterAPI $exporter Reference to an exporter
|
||||
*/
|
||||
public function __construct(PHP_UML_Output_ExporterAPI $exporter)
|
||||
{
|
||||
parent::__construct($exporter);
|
||||
$this->mainTpl = $this->getTemplate('main.htm');
|
||||
}
|
||||
|
||||
protected function getDescription(PHP_UML_Metamodel_Stereotype $s, $annotatedElement='')
|
||||
{
|
||||
$tag = PHP_UML_Metamodel_Helper::getStereotypeTag($s, 'description');
|
||||
if (!is_null($tag))
|
||||
return nl2br(htmlspecialchars($tag->value));
|
||||
else
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the operation's parameters, as a comma-sep list, between brackets
|
||||
*
|
||||
* @param PHP_UML_Metamodel_Operation $operation The operation
|
||||
* @param bool $withType If true, adds an hyperlink
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getParameterList(PHP_UML_Metamodel_Operation $operation, $withType = false)
|
||||
{
|
||||
$n = count($operation->ownedParameter);
|
||||
$pieces = array();
|
||||
for ($i=0; $i<$n; $i++) {
|
||||
$parameter = $operation->ownedParameter[$i];
|
||||
if (substr($parameter->direction, 0, 2)=='in') {
|
||||
$str = '';
|
||||
if ($withType && isset($parameter->type)) {
|
||||
if (is_object($parameter->type))
|
||||
$str .= $this->getLinkTo($parameter->type).' ';
|
||||
else
|
||||
$str .= $this->displayUnresolved($parameter->type);
|
||||
}
|
||||
if ($parameter->direction=='inout') {
|
||||
$str .= '&';
|
||||
}
|
||||
$str .= $parameter->name;
|
||||
$str .= $this->getDefaultValue($parameter);
|
||||
$pieces[] = $str;
|
||||
}
|
||||
}
|
||||
return '('.implode(',', $pieces).')';
|
||||
}
|
||||
|
||||
protected function getDefaultValue(PHP_UML_Metamodel_TypedElement $obj)
|
||||
{
|
||||
if ($obj->default!='')
|
||||
return '<span class="defVal"> = '.htmlentities($obj->default, ENT_QUOTES).'</span>';
|
||||
else
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a HTML hyperlink towards a given element
|
||||
* (since datatypes don't own to a "package", we suppose they are located in
|
||||
* the top package)
|
||||
*
|
||||
* @param PHP_UML_Metamodel_Classifier $t The element
|
||||
* @param string $cssStyle CSS style to use
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getLinkTo(PHP_UML_Metamodel_Classifier $t, $cssStyle='link')
|
||||
{
|
||||
$loc = '';
|
||||
$ns = '';
|
||||
if (isset($t->package)) {
|
||||
$loc = $this->getAbsPath($t->package);
|
||||
$ns = $this->getAbsPath($t->package, self::T_NAMESPACE);
|
||||
}
|
||||
return '<a href="'.$this->getContextPackage()->rpt.$loc.self::getObjPrefix($t).$t->name.'.'.
|
||||
self::FILE_EXT.'" class="'.$cssStyle.'">'.$ns.$t->name.'</a>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders an unresolved type as an HTML span
|
||||
*
|
||||
* @param string $type Type, provided as a string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function displayUnresolved($type)
|
||||
{
|
||||
return '<span class="link">'.$type.'</span> ';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Renders the properties of a given stereotype as an HTML list (LI tags).
|
||||
* Docblocks in $ignoredTag are not shown, as well as "return" tag with only a type
|
||||
*
|
||||
* @param PHP_UML_Metamodel_Stereotype $s A stereotype
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getTagsAsList(PHP_UML_Metamodel_Stereotype $s)
|
||||
{
|
||||
$str = '';
|
||||
foreach ($s->ownedAttribute as $tag) {
|
||||
if (!(in_array($tag->name, $this->ignoredTag) || ($tag->name=='return' && strpos($tag->value, ' ')===false))) {
|
||||
if ($tag->name!='description') {
|
||||
$str .= '<li class="smaller">';
|
||||
$str .= '@'.$tag->name.' ';
|
||||
} else {
|
||||
$str .= '<li>';
|
||||
}
|
||||
if (strlen($tag->value)>0)
|
||||
$str .= nl2br(htmlspecialchars($tag->value));
|
||||
$str .= '</li>';
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Renders the block "Properties" of a package or a class as HTML
|
||||
*
|
||||
* @param PHP_UML_Metamodel_NamedElement $p A classifier/a package
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPropertyBlock(PHP_UML_Metamodel_NamedElement $p)
|
||||
{
|
||||
if (empty($p->ownedAttribute))
|
||||
return '';
|
||||
|
||||
$str = '<h2>Properties</h2>';
|
||||
$str .= '<ul class="summary">';
|
||||
foreach ($p->ownedAttribute as $o) {
|
||||
$str .= '<li class="Collapsed" id="'.$this->generatePropertyId($o).'">';
|
||||
$str .= '<a href="javascript:void(0);" class="'.
|
||||
$this->getPropertyStyle($o->visibility).'" target="main">'.
|
||||
$o->name.'</a>';
|
||||
|
||||
$str .= '<ul class="description"><li>';
|
||||
$str .= ucfirst($o->visibility).' ';
|
||||
if (!$o->isInstantiable)
|
||||
$str .= 'static ';
|
||||
if ($o->isReadOnly)
|
||||
$str .= 'const ';
|
||||
if (is_object($o->type))
|
||||
$str .= $this->getLinkTo($o->type).' ';
|
||||
else
|
||||
$str .= $this->displayUnresolved($o->type);
|
||||
$str .= '<span class="smallTitle">'.$o->name.'</span>'.$this->getDefaultValue($o).'</li>';
|
||||
if (!is_null($o->description)) {
|
||||
$str .= $this->getTagsAsList($o->description);
|
||||
}
|
||||
$str .= $this->getFileInfo($o);
|
||||
$str .= '</ul>';
|
||||
|
||||
$str .= '</li>';
|
||||
}
|
||||
$str .= '</ul>';
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the block "Function" of a package or a classifier as HTML
|
||||
*
|
||||
* @param PHP_UML_Metamodel_NamedElement $p A classifier or a package
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getFunctionBlock(PHP_UML_Metamodel_NamedElement $p)
|
||||
{
|
||||
if (empty($p->ownedOperation))
|
||||
return'';
|
||||
|
||||
$str = '<h2>Functions</h2>';
|
||||
$str .= '<ul class="summary">';
|
||||
foreach ($p->ownedOperation as $o) {
|
||||
$fullName = $this->getParameterList($o, true);
|
||||
|
||||
$str .= '<li class="Collapsed" id="'.$this->generateFunctionId($o).'">';
|
||||
$str .= '<a href="javascript:void(0);" class="'.$this->getFunctionStyle($o->visibility);
|
||||
if ($o->isAbstract)
|
||||
$str .= ' abstract';
|
||||
$str .= '" target="main">'.$o->name.'</a>'.$fullName;
|
||||
|
||||
$str .= '<ul class="description"><li>';
|
||||
$str .= ucfirst($o->visibility).' ';
|
||||
if (!$o->isInstantiable)
|
||||
$str .= 'static ';
|
||||
if ($o->isAbstract)
|
||||
$str .= 'abstract ';
|
||||
$return = $this->getReturnParam($o);
|
||||
if (!empty($return)) {
|
||||
if (is_object($return->type))
|
||||
$str .= $this->getLinkTo($return->type).' ';
|
||||
else
|
||||
$str .= $this->displayUnresolved($return->type);
|
||||
}
|
||||
$str .= '<span class="smallTitle">'.$o->name.'</span>'.$fullName.'</li>';
|
||||
|
||||
if (!is_null($o->description)) {
|
||||
$str .= $this->getTagsAsList($o->description);
|
||||
}
|
||||
foreach ($this->getAllImplemented($p) as $ai) {
|
||||
foreach ($ai->ownedOperation as $aiO) {
|
||||
if ($aiO->name == $o->name && !empty($aiO->description)) {
|
||||
$txt = $this->getDescription($aiO->description, $aiO->id);
|
||||
if ($txt!='')
|
||||
$str .= '<li>'.$txt.'<br/><span class="note">(copied from interface '.$this->getLinkTo($ai).')</span></li>';
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($this->getAllInherited($p) as $ai) {
|
||||
foreach ($ai->ownedOperation as $aiO) {
|
||||
if ($aiO->name == $o->name && !empty($aiO->description)) {
|
||||
$txt = $this->getDescription($aiO->description, $aiO->id);
|
||||
if ($txt!='')
|
||||
$str .= '<li>'.$txt.'<br/><span class="note">(copied from class '.$this->getLinkTo($ai).')</span></li>';
|
||||
}
|
||||
}
|
||||
}
|
||||
$str .= $this->getFileInfo($o);
|
||||
$str .= '</ul>';
|
||||
|
||||
$str .= '</li>';
|
||||
}
|
||||
$str .= '</ul>';
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML for the link "Package" in the navigation bar
|
||||
*
|
||||
* @param string $rel A prefix to add to the hyperlink (eg: ../)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getNavigParentPackage($rel='')
|
||||
{
|
||||
return '<li><a href="'.$rel.self::PACKAGE_FILENAME.'.'.self::FILE_EXT.'" class="top">Package</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML code for the common items of the navigation bar
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCommonLinks()
|
||||
{
|
||||
return '<li><a href="javascript:toggler.toggleAll(\''.self::JS_MAIN_NAME.'\', \'btnToggle\')" class="expandAllBtn" id="btnToggle">Expand all</a></li>'.
|
||||
'<li><a href="'.$this->getContextPackage()->rpt.self::HELP_FILENAME.'.'.self::FILE_EXT.'" class="helpBtn">Help</a></li>'.
|
||||
'<li><a href="'.$this->getContextPackage()->rpt.self::INDEXALL_FILENAME.'.'.self::FILE_EXT.'" class="indexAllBtn">Index</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML code for the "File" information tag
|
||||
*
|
||||
* @param PHP_UML_Metamodel_NamedElement $p An element
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getFileInfo(PHP_UML_Metamodel_NamedElement $p)
|
||||
{
|
||||
if (!empty($p->file->package))
|
||||
return '<li>File: '.$this->getAbsPath($p->file->package).$p->file->name.'</li>';
|
||||
else
|
||||
return '';
|
||||
}
|
||||
|
||||
protected function getPropertyStyle($visibility)
|
||||
{
|
||||
return 'property-'.substr($visibility, 0, 3);
|
||||
}
|
||||
|
||||
protected function getFunctionStyle($visibility)
|
||||
{
|
||||
return 'method-'.substr($visibility, 0, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the template's placeholders with their value
|
||||
*
|
||||
* @param string $main Main HTML content (generated by PHP_UML)
|
||||
* @param string $nav Navigation HTML content (navig bar)
|
||||
* @param string $tit Title content
|
||||
* @param string $name Element name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function replaceInTpl($main, $nav, $tit, $name)
|
||||
{
|
||||
$str = str_replace('#NAVIG', $nav, $this->mainTpl);
|
||||
$str = str_replace('#TITLE', $tit, $str);
|
||||
$str = str_replace('#DETAIL', $main, $str);
|
||||
$str = str_replace('#RELPATHTOP', $this->getContextPackage()->rpt, $str);
|
||||
$str = str_replace('#NAME', $this->getTypeName().' '.$name, $str);
|
||||
$str = str_replace('#CURDATE', date("M j, Y, G:i:s O"), $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
protected function getTemplateDirectory()
|
||||
{
|
||||
return dirname(__FILE__).DIRECTORY_SEPARATOR.self::TEMPLATES_DIRNAME;
|
||||
}
|
||||
|
||||
protected function save($elementName, $str)
|
||||
{
|
||||
$fic = $this->getContextPackage()->dir.$elementName.'.'.self::FILE_EXT;
|
||||
file_put_contents($fic, $str);
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user