1
0
mirror of synced 2025-01-20 15:31:40 +03:00
This commit is contained in:
jepso 2007-06-29 14:10:15 +00:00
parent 6d27356354
commit b2499e03e8
7 changed files with 448 additions and 237 deletions

View File

@ -96,9 +96,6 @@ class DocTool
$class = ' class="one-page"';
}
echo '<div' . $class . ' id="table-of-contents">' . "\n";
echo '<h1>Table of Contents</h1>' . "\n";
$classes[] = 'tree';
} else {
@ -151,9 +148,6 @@ class DocTool
echo '</ul>' . "\n";
if ($toc instanceof Sensei_Doc_Toc) {
echo '</div>' . "\n";
}
}
public function makeUrl($path)

95
manual/new/scripts/toc.js Normal file
View File

@ -0,0 +1,95 @@
function toggleToc()
{
var toc = document.getElementById('table-of-contents').getElementsByTagName('ul')[0];
var toggleLink = document.getElementById('toc-collapse-toggle').getElementsByTagName('a')[0];
var stickySpan = document.getElementById('toc-sticky-toggle');
if (toc && toggleLink && toc.style.display == 'none') {
toggleLink.innerHTML = tocHideText;
toc.style.display = 'block';
if (stickySpan) {
stickySpan.style.display = 'inline';
}
createCookie('hidetoc', 0, 1000);
} else {
toggleLink.innerHTML = tocShowText;
toc.style.display = 'none';
if (stickySpan) {
stickySpan.style.display = 'none';
}
createCookie('hidetoc', 1, 1000);
}
}
function toggleStickyToc()
{
var wrap = document.getElementById('wrap');
var toggleLink = document.getElementById('toc-sticky-toggle').getElementsByTagName('a')[0];
var collapseSpan = document.getElementById('toc-collapse-toggle');
if (wrap && toggleLink && !hasClassName(wrap, 'sticky-toc')) {
toggleLink.innerHTML = tocUnstickyText;
addClassName(wrap, 'sticky-toc');
if (collapseSpan) {
collapseSpan.style.display = 'none';
}
createCookie('stickytoc', 1, 1000);
} else {
toggleLink.innerHTML = tocStickyText;
removeClassName(wrap, 'sticky-toc');
if (collapseSpan) {
collapseSpan.style.display = 'inline';
}
createCookie('stickytoc', 0, 1000);
}
}
function createTocToggle()
{
var container = document.getElementById('toc-toggles');
var span = document.createElement('span');
var link = document.createElement('a');
var text = document.createTextNode(tocHideText);
link.appendChild(text);
link.setAttribute('href', 'javascript:toggleToc()');
span.setAttribute('id', 'toc-collapse-toggle');
span.appendChild(link);
container.appendChild(span);
if (readCookie('hidetoc') == 1) {
toggleToc();
}
if (readCookie('stickytoc') == 1) {
span.style.display = 'none';
}
}
function createTocStickyToggle()
{
var container = document.getElementById('toc-toggles');
var span = document.createElement('span');
var link = document.createElement('a');
var text = document.createTextNode(tocStickyText);
link.appendChild(text);
link.setAttribute('href', 'javascript:toggleStickyToc()');
span.setAttribute('id', 'toc-sticky-toggle');
span.appendChild(link);
container.appendChild(span);
if (readCookie('stickytoc') == 1) {
toggleStickyToc();
}
if (readCookie('hidetoc') == 1) {
span.style.display = 'none';
}
}

View File

@ -1,14 +1,12 @@
var symbolClosed = '+';
var symbolOpen = '-';
//var symbolClosed = '▹';
//var symbolOpen = '▿';
function Tree_AutoInit()
{
var candidates = document.getElementsByTagName('ul');
for (i in candidates) {
if (HasClassName(candidates[i], 'tree')) {
if (hasClassName(candidates[i], 'tree')) {
Tree_Init(candidates[i]);
}
}
@ -31,7 +29,7 @@ function Tree_Init(element)
expander.href = 'javascript:void(0);';
expander.onclick = Tree_Toggle;
if (HasClassName(subTree, 'closed')) {
if (hasClassName(subTree, 'closed')) {
expander.innerHTML = symbolClosed;
} else {
expander.innerHTML = symbolOpen;
@ -62,187 +60,14 @@ function Tree_Toggle()
li = expander.parentNode;
subTree = Tree_FindChild(li, 'ul');
if (HasClassName(subTree, 'closed')) {
RemoveClassName(subTree, 'closed');
if (hasClassName(subTree, 'closed')) {
removeClassName(subTree, 'closed');
expander.innerHTML = symbolOpen;
} else {
AddClassName(subTree, 'closed');
addClassName(subTree, 'closed');
expander.innerHTML = symbolClosed;
}
}
// ----------------------------------------------------------------------------
// HasClassName
//
// Description : returns boolean indicating whether the object has the class name
// built with the understanding that there may be multiple classes
//
// Arguments:
// objElement - element to manipulate
// strClass - class name to add
//
function HasClassName(objElement, strClass)
{
// if there is a class
if ( objElement.className )
{
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for ( var i = 0; i < arrList.length; i++ )
{
// if class found
if ( arrList[i].toUpperCase() == strClassUpper )
{
// we found it
return true;
}
}
}
// if we got here then the class name is not there
return false;
}
// ----------------------------------------------------------------------------
// AddClassName
//
// Description : adds a class to the class attribute of a DOM element
// built with the understanding that there may be multiple classes
//
// Arguments:
// objElement - element to manipulate
// strClass - class name to add
//
function AddClassName(objElement, strClass, blnMayAlreadyExist)
{
// if there is a class
if (objElement.className) {
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// if the new class name may already exist in list
if (blnMayAlreadyExist) {
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for (var i = 0; i < arrList.length; i++) {
// if class found
if (arrList[i].toUpperCase() == strClassUpper) {
// remove array item
arrList.splice(i, 1);
// decrement loop counter as we have adjusted the array's contents
i--;
}
}
}
// add the new class to end of list
arrList[arrList.length] = strClass;
// add the new class to beginning of list
//arrList.splice(0, 0, strClass);
// assign modified class name attribute
objElement.className = arrList.join(' ');
// if there was no class
} else {
// assign modified class name attribute
objElement.className = strClass;
}
}
// ----------------------------------------------------------------------------
// RemoveClassName
//
// Description : removes a class from the class attribute of a DOM element
// built with the understanding that there may be multiple classes
//
// Arguments:
// objElement - element to manipulate
// strClass - class name to remove
//
function RemoveClassName(objElement, strClass)
{
// if there is a class
if ( objElement.className )
{
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for ( var i = 0; i < arrList.length; i++ )
{
// if class found
if ( arrList[i].toUpperCase() == strClassUpper )
{
// remove array item
arrList.splice(i, 1);
// decrement loop counter as we have adjusted the array's contents
i--;
}
}
// assign modified class name attribute
objElement.className = arrList.join(' ');
}
// if there was no class
// there is nothing to remove
}
/*
* Handlers for automated loading
*/
_LOADERS = Array();
function callAllLoaders() {
var i, loaderFunc;
for(i=0;i<_LOADERS.length;i++) {
loaderFunc = _LOADERS[i];
if(loaderFunc != callAllLoaders) loaderFunc();
}
}
function appendLoader(loaderFunc) {
if(window.onload && window.onload != callAllLoaders)
_LOADERS[_LOADERS.length] = window.onload;
window.onload = callAllLoaders;
_LOADERS[_LOADERS.length] = loaderFunc;
}
appendLoader(Tree_AutoInit);

179
manual/new/scripts/util.js Normal file
View File

@ -0,0 +1,179 @@
/**
* Checks if the object has the class name.
*
* @param objElement element to manipulate
* @param strClass class name to add
*
* @return boolean indicating whether the object has the class name built with
* the understanding that there may be multiple classes.
*/
function hasClassName(objElement, strClass)
{
// if there is a class
if (objElement.className) {
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for (var i = 0; i < arrList.length; i++) {
// if class found
if (arrList[i].toUpperCase() == strClassUpper) {
// we found it
return true;
}
}
}
// if we got here then the class name is not there
return false;
}
/**
* Adds a class to the class attribute of a DOM element built with the
* understanding that there may be multiple classes.
*
* @param objElement element to manipulate
* @param strClass class name to add
*/
function addClassName(objElement, strClass, blnMayAlreadyExist)
{
// if there is a class
if (objElement.className) {
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// if the new class name may already exist in list
if (blnMayAlreadyExist) {
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for (var i = 0; i < arrList.length; i++) {
// if class found
if (arrList[i].toUpperCase() == strClassUpper) {
// remove array item
arrList.splice(i, 1);
// decrement loop counter as we have adjusted the array's contents
i--;
}
}
}
// add the new class to end of list
arrList[arrList.length] = strClass;
// add the new class to beginning of list
//arrList.splice(0, 0, strClass);
// assign modified class name attribute
objElement.className = arrList.join(' ');
// if there was no class
} else {
// assign modified class name attribute
objElement.className = strClass;
}
}
/**
* RemoveClassName
*
* Removes a class from the class attribute of a DOM element built with the
* understanding that there may be multiple classes.
*
* @param objElement element to manipulate
* @param strClass class name to remove
*/
function removeClassName(objElement, strClass)
{
// if there is a class
if (objElement.className) {
// the classes are just a space separated list, so first get the list
var arrList = objElement.className.split(' ');
// get uppercase class for comparison purposes
var strClassUpper = strClass.toUpperCase();
// find all instances and remove them
for (var i = 0; i < arrList.length; i++) {
// if class found
if (arrList[i].toUpperCase() == strClassUpper) {
// remove array item
arrList.splice(i, 1);
// decrement loop counter as we have adjusted the array's contents
i--;
}
}
// assign modified class name attribute
objElement.className = arrList.join(' ');
}
// if there was no class
// there is nothing to remove
}
/*
* Handlers for automated loading
*/
_LOADERS = Array();
function callAllLoaders() {
var i, loaderFunc;
for(i=0;i<_LOADERS.length;i++) {
loaderFunc = _LOADERS[i];
if(loaderFunc != callAllLoaders) loaderFunc();
}
}
function appendLoader(loaderFunc) {
if(window.onload && window.onload != callAllLoaders)
_LOADERS[_LOADERS.length] = window.onload;
window.onload = callAllLoaders;
_LOADERS[_LOADERS.length] = loaderFunc;
}
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+";";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name,"",-1);
}

View File

@ -2,7 +2,7 @@ body, html {
margin: 0;
padding: 0;
font-family: "Trebuchet MS", sans-serif;
font-size: normal;
font-size: medium;
background: white;
color: black;
}
@ -18,7 +18,7 @@ h1 {
margin-top: 0;
}
h2, #table-of-contents h1 {
h2 {
font-size: 1.5em;
text-align: left;
margin: 0.67em 0;
@ -41,7 +41,7 @@ h4 {
p, ul, ol, dl {
line-height: 1.5em;
text-align: justify;
font-size: normal;
font-size: medium;
}
ul {
@ -56,6 +56,7 @@ table {
border: 1px solid #aaaaaa;
border-collapse: collapse;
margin: 0.5em 0;
color: black;
background-color: #f9f9f9;
line-height: 1.5em;
}
@ -66,9 +67,30 @@ td, th {
}
th {
color: black;
background-color: #f2f2f2;
}
a:link {
color: #3465a4;
background-color: inherit;
text-decoration: none;
}
a:visited {
color: #75507b;
background-color: inherit;
text-decoration: none;
}
a:link:hover,
a:link:active,
a:visited:hover,
a:visited:active {
text-decoration: underline;
color: #555753;
background-color: inherit;
}
/*** Code blocks and highlighting**********************************************/
@ -82,50 +104,50 @@ pre {
padding: 1em;
margin: 1em 0;
line-height: 1.2em;
color: black;
background-color: #f6f6f6;
border: 1px solid #cccccc;
/* Pup's Box Flow Hack, Rev 2 */
overflow/**/: auto;
\height: 1%;
}
/* This rule applies only to Firefox */
pre, x:-moz-any-link {
/* overflow: auto causes artefacts */
overflow: hidden;
/* prevents text to be hidden by wrapping it */
white-space: -moz-pre-wrap !important;
}
pre .default {
color: #000000;
background-color: inherit;
}
pre .keyword {
color: #3465a4;
background-color: inherit;
}
pre .string {
color: #ef2929;
background-color: inherit;
}
pre .comment {
color: #888a85;
background-color: inherit;
}
a:link {
color: #3465a4;
text-decoration: none;
}
/** Page layout ***************************************************************/
a:visited {
color: #75507b;
text-decoration: none;
}
a:link:hover,
a:link:active,
a:visited:hover,
a:visited:active {
text-decoration: underline;
color: #555753;
}
#table-of-contents {
border: 1px solid #cccccc;
background-color: #f6f6f6;
padding: 0 1em;
margin: 0;
#sidebar {
float: right;
margin: 1em;
padding: 0;
}
#wrap {
@ -133,30 +155,22 @@ a:visited:active {
padding: 0;
}
#sidebar {
float: right;
width: 25%;
margin: 0;
#content {
padding: 1em;
}
#content {
margin-right: 25%;
padding: 1em;
padding-right: 2em;
}
/** Tree specific styles ******************************************************/
ul.tree {
font-size: 0.9em;
}
ul.tree, ul.tree ul {
list-style-type: none;
padding-left: 2em;
text-align: left;
margin-left: 0;
margin: 0;
font-size: 1em;
}
ul.tree {
margin-top: 1em;
}
.tree a {
@ -167,6 +181,7 @@ ul.tree, ul.tree ul {
.tree .expander {
color: black;
background-color: inherit;
display: block;
float: left;
margin: 0;
@ -181,9 +196,75 @@ ul.tree, ul.tree ul {
.tree .expander:active,
.tree .expander:hover {
color: black;
background-color: inherit;
text-decoration: none;
}
.tree ul.closed {
display: none;
}
/** Table of Contents *********************************************************/
#table-of-contents {
border: 1px solid #cccccc;
color: black;
background-color: #f6f6f6;
padding: 1em;
padding-top: 0;
margin: 0;
}
#table-of-contents p,
#table-of-contents ul.tree,
#table-of-contents span {
font-size: 0.9em;
}
#table-of-contents p {
margin-bottom: 0;
}
#table-of-contents h1 {
display: block;
font-size: 1.5em;
margin-right: 0.5em;
margin-bottom: 0;
text-align: left;
}
#toc-toggles {
margin: 0;
padding: 0;
text-align: right;
}
#toc-toggles span {
padding-left: 0.5em;
}
/** Sticky Table of Contents **************************************************/
div#wrap.sticky-toc #sidebar {
/* Netscape 4, IE 4.x-5.0/Win and other lesser browsers will use this */
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 25%;
overflow: auto;
}
div#wrap.sticky-toc > #sidebar {
/* used by Opera 5+, Netscape6+/Mozilla, Konqueror, Safari, OmniWeb 4.5+,
iCab, ICEbrowser */
position: fixed;
}
.sticky-toc #content {
position: absolute;
top: 0;
left: 0;
right: 25%;
padding-right: 2em;
}

View File

@ -4,4 +4,12 @@
pre {
word-wrap: break-word;
}
}
div#wrap.sticky-toc #sidebar {
/* IE5.5+/Win - this is more specific than the IE 5.0 version */
top: expression(eval(document.documentElement.scrollTop));
height: expression(eval(document.documentElement.clientHeight - 32));
}

View File

@ -16,7 +16,9 @@
<![endif]>
<![endif]-->
<script type="text/javascript" src="<?php echo $baseUrl; ?>scripts/util.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl; ?>scripts/tree.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl; ?>scripts/toc.js"></script>
</head>
@ -24,17 +26,44 @@
<div id="wrap">
<?php if($tool->getOption('section') || $tool->getOption('one-page')): ?>
<div id="sidebar">
<div id="table-of-contents">
<div id="toc-toggles"></div>
<h1>Table of Contents</h1>
<?php $tool->renderToc(); ?>
<script type="text/javascript">
//<![CDATA[
var tocHideText = "hide"; var tocShowText = "show"; createTocToggle();
var tocStickyText = "sticky"; var tocUnstickyText = 'unstick'; createTocStickyToggle();
//]]>
</script>
<p>
<?php if($tool->getOption('one-page')): ?>
<a href="<?php echo ($tool->getOption('clean-url') ? "${baseUrl}chapter/" : '?chapter=') . $tool->findByIndex('1.')->getPath(); ?>">View one chapter per page</a>
<?php else: ?>
<a href="<?php echo ($tool->getOption('clean-url') ? "${baseUrl}one-page" : '?one-page=1') . '#' . $tool->getOption('section')->getPath(); ?>">View all in one page</a>
<?php endif; ?>
</p>
</div>
<div id="content">
<?php
</div>
try {
$tool->render();
} catch (Exception $e) {
?>
<?php endif; ?>
<div id="content">
<?php if($tool->getOption('section') || $tool->getOption('one-page')): ?>
<?php $tool->render(); ?>
<?php else: ?>
<h1>Doctrine Manual</h1>
@ -45,12 +74,12 @@ try {
</ul>
</p>
<?php
}
?>
<?php endif; ?>
</div>
</div>
</body>
</html>