1
0
mirror of https://github.com/php/phd.git synced 2026-03-23 22:52:05 +01:00
Files
archived-phd/phpdotnet/phd/Package/Generic/ChunkedXHTML.php
2024-02-08 12:46:21 +00:00

212 lines
6.9 KiB
PHP

<?php
namespace phpdotnet\phd;
class Package_Generic_ChunkedXHTML extends Package_Generic_XHTML {
public function __construct() {
parent::__construct();
$this->registerFormatName("Chunked-XHTML");
$this->setTitle("Index");
$this->setChunked(true);
}
public function __destruct() {
$this->close();
}
public function appendData($data) {
if ($this->appendToBuffer) {
$this->buffer .= $data;
return;
} elseif ($this->flags & Render::CLOSE) {
$fp = $this->popFileStream();
fwrite($fp, $data);
$this->writeChunk($this->CURRENT_CHUNK, $fp);
fclose($fp);
$this->flags ^= Render::CLOSE;
} elseif ($this->flags & Render::OPEN) {
$fp = fopen("php://temp/maxmemory", "r+");
fwrite($fp, $data);
$this->pushFileStream($fp);
$this->flags ^= Render::OPEN;
} elseif ($data !== null) {
$fp = $this->getFileStream();
fwrite(end($fp), $data);
}
}
public function writeChunk($id, $fp) {
$filename = $this->getOutputDir() . Format::getFilename($id) . $this->getExt();
rewind($fp);
file_put_contents($filename, $this->header($id));
file_put_contents($filename, $fp, FILE_APPEND);
file_put_contents($filename, $this->footer($id), FILE_APPEND);
}
public function close() {
foreach ($this->getFileStream() as $fp) {
fclose($fp);
}
}
public function update($event, $val = null) {
switch($event) {
case Render::CHUNK:
$this->flags = $val;
break;
case Render::STANDALONE:
if ($val) {
$this->registerElementMap(static::getDefaultElementMap());
$this->registerTextMap(static::getDefaultTextMap());
}
break;
case Render::INIT:
if ($this->appendToBuffer) {
return; //Don't create output dir when rendering to buffer
}
$this->setOutputDir(Config::output_dir() . strtolower($this->getFormatName()) . '/');
$this->postConstruct();
if (file_exists($this->getOutputDir())) {
if (!is_dir($this->getOutputDir())) {
v("Output directory is a file?", E_USER_ERROR);
}
} else {
if (!mkdir($this->getOutputDir(), 0777, true)) {
v("Can't create output directory", E_USER_ERROR);
}
}
if (Config::css()) {
$this->fetchStylesheet();
}
break;
case Render::VERBOSE:
v("Starting %s rendering", $this->getFormatName(), VERBOSE_FORMAT_RENDERING);
break;
}
}
public function header($id) {
$title = $this->getLongDescription($id);
$lang = Config::language();
$root = Format::getRootIndex();
static $cssLinks = null;
if ($cssLinks === null) {
$cssLinks = $this->createCSSLinks();
}
$prev = $next = $parent = array("href" => null, "desc" => null);
if ($parentId = $this->getParent($id)) {
$parent = array("href" => $this->getFilename($parentId) . $this->getExt(),
"desc" => $this->getShortDescription($parentId));
}
if ($prevId = Format::getPrevious($id)) {
$prev = array("href" => Format::getFilename($prevId) . $this->getExt(),
"desc" => $this->getShortDescription($prevId));
}
if ($nextId = Format::getNext($id)) {
$next = array("href" => Format::getFilename($nextId) . $this->getExt(),
"desc" => $this->getShortDescription($nextId));
}
$navBar = $this->createNavBar($id);
return
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="' .$lang. '" lang="' .$lang. '">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>'.(($title != $root["ldesc"]) ? $root["ldesc"].': ' : "").$title.'</title>
'.$cssLinks.'
</head>
<body>
<table width="100%">
<tr valign="top">
<td style="font-size: smaller;" width="15%">
'.$navBar.'
</td>
<td width="85%">
<div style="text-align: center;">
'.($prevId ? '<div class="prev" style="text-align: left; float: left;"><a href="' .$prev["href"]. '">' .$prev["desc"]. '</a></div>' : '') .'
'.($nextId ? '<div class="next" style="text-align: right; float: right;"><a href="' .$next["href"]. '">' .$next["desc"].'</a></div>' : '') .'
'.($parentId ? '<div class="up"><a href="' .$parent["href"]. '">' .$parent["desc"]. '</a></div>' : '') .'
<div class="home"><a href="'.$root["filename"].$this->getExt().'">'.$root["ldesc"].'</a></div>
</div><hr/>
';
}
public function footer($id) {
return "\n </td>\n </tr>\n</table>\n</body>\n</html>\n";
}
protected function createNavBar($id) {
$root = Format::getRootIndex();
$navBar = '<style type="text/css">
#leftbar {
float: left;
width: 186px;
padding: 5px;
font-size: smaller;
}
ul.toc {
margin: 0px 5px 5px 5px;
padding: 0px;
}
ul.toc li {
font-size: 85%;
margin: 1px 0 1px 1px;
padding: 1px 0 1px 11px;
list-style-type: none;
background-repeat: no-repeat;
background-position: center left;
}
ul.toc li.header {
font-size: 115%;
padding: 5px 0px 5px 11px;
border-bottom: 1px solid #cccccc;
margin-bottom: 5px;
}
ul.toc li.active {
font-weight: bold;
}
ul.toc li a {
text-decoration: none;
}
ul.toc li a:hover {
text-decoration: underline;
}
</style>
<ul class="toc">
<li class="header home"><a href="'.$root["filename"].$this->getExt().'">'.$root["ldesc"].'</a></li>
';
// Fetch ancestors of the current node
$ancestors = array();
$currentId = $id;
while (($currentId = $this->getParent($currentId)) && $currentId != "index") {
$desc = "";
$link = $this->createLink($currentId, $desc);
$ancestors[] = array("desc" => $desc, "link" => $link);
}
// Show them from the root to the closest parent
foreach (array_reverse($ancestors) as $ancestor) {
$navBar .= " <li class=\"header up\"><a href=\"{$ancestor["link"]}\">{$ancestor["desc"]}</a></li>\n";
}
// Fetch siblings of the current node
$parent = $this->getParent($id);
foreach ($this->getChildren($parent) as $child) {
$desc = "";
$link = $this->createLink($child, $desc);
$active = ($id === $child);
$navBar .= " <li" .($active ? " class=\"active\"" : ""). "><a href=\"$link\">$desc</a></li>\n";
}
return $navBar . " </ul>\n";
}
}