mirror of
https://github.com/php/web-php.git
synced 2026-03-23 23:02:13 +01:00
mega. Feedback is definitely welcome on the documentation dropdown changes. Squashed commit of the following: commit 6c282d4558e77c2f9943db318691bef596e4fd4b Author: Adam Harvey <aharvey@php.net> Date: Thu Dec 27 19:30:16 2012 +0800 Update the community links. commit 82edf79fff4a500e3ca4a349b4c100e70d651f7e Author: Adam Harvey <aharvey@php.net> Date: Thu Dec 27 19:12:38 2012 +0800 Move the calendar of events link under news to better balance the community dropdown. commit 809d2a9f6044db71a117453575a9882c5607d8a6 Author: Adam Harvey <aharvey@php.net> Date: Thu Dec 27 19:07:10 2012 +0800 Add a direct link to the manual TOC, and replace database with date/time in the function reference, as that seems to be more commonly hit per Webalizer. commit 73ca38258415f275a148fc8f74c91833eaf4ac71 Author: Adam Harvey <aharvey@php.net> Date: Thu Dec 27 18:55:44 2012 +0800 Attempt to cut the documentation mega dropdown... er, down. At present, this is more than the height of my viewport on a MBP. This is obviously a bad thing, and nobody in their right mind is ever going to read it. I've cut it down to a maximum of one heading and five entries per column. For the time being, I've tried to guess what the most hit and important pages are in the manual, but hopefully we can get some metrics on this before the beta site is launched and adjust accordingly.
969 lines
31 KiB
PHP
969 lines
31 KiB
PHP
<?php
|
|
/* $Id$ */
|
|
|
|
// Set the static content root differently on php.net
|
|
if ($MYSITE == "http://www.php.net/" || $MYSITE == 'http://php.net/') {
|
|
$_SERVER['STATIC_ROOT'] = 'http://static.php.net/www.php.net';
|
|
} elseif ($MYSITE == 'https://www.php.net/' || $MYSITE == 'https://php.net/') {
|
|
$_SERVER['STATIC_ROOT'] = 'https://static.php.net/www.php.net';
|
|
} elseif (!isset($_SERVER['STATIC_ROOT'])) {
|
|
$_SERVER['STATIC_ROOT'] = "";
|
|
}
|
|
|
|
// Use class names instead of colors
|
|
ini_set('highlight.comment', 'comment');
|
|
ini_set('highlight.default', 'default');
|
|
ini_set('highlight.keyword', 'keyword');
|
|
ini_set('highlight.string', 'string');
|
|
ini_set('highlight.html', 'html');
|
|
|
|
// Highlight PHP code
|
|
function highlight_php($code, $return = FALSE)
|
|
{
|
|
// Using OB, as highlight_string() only supports
|
|
// returning the result from 4.2.0
|
|
ob_start();
|
|
highlight_string($code);
|
|
$highlighted = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
// This should eventually be a php_syntax_check() call when we move to PHP5
|
|
// But use this ugly hack for now to avoid code snippets with bad syntax screwing up the highlighter
|
|
if(strstr($highlighted,"include/layout.inc</b>")) $highlighted = '<span class="html">'.nl2br(htmlentities($code))."</span>";
|
|
|
|
// Fix output to use CSS classes and wrap well
|
|
$highlighted = '<div class="phpcode">' . str_replace(
|
|
array(
|
|
' ',
|
|
'<br />',
|
|
'<font color="', // for PHP 4
|
|
'<span style="color: ', // from PHP 5.0.0RC1
|
|
'</font>',
|
|
"\n ",
|
|
' ',
|
|
' '
|
|
),
|
|
array(
|
|
' ',
|
|
"<br />\n",
|
|
'<span class="',
|
|
'<span class="',
|
|
'</span>',
|
|
"\n ",
|
|
' ',
|
|
' '
|
|
),
|
|
$highlighted
|
|
) . '</div>';
|
|
|
|
if ($return) { return $highlighted; }
|
|
else { echo $highlighted; }
|
|
}
|
|
|
|
// Stats pages still need this
|
|
function commonHeader($title) { site_header($title); }
|
|
|
|
function site_header($title = '', $config = array())
|
|
{
|
|
if (myphpnet_beta()) {
|
|
return site_header_beta($title, $config);
|
|
}
|
|
global $EXPL_LANG, $SIDEBAR_DATA, $RSIDEBAR_DATA, $PAGE_COLUMNS, $PGI;
|
|
|
|
// Default to empty array if improper parameter passed
|
|
if (!is_array($config)) { $config = array(); }
|
|
|
|
// String defaults
|
|
$lang_input = $canonical = $base = $meta = $layout_helper = '';
|
|
|
|
// Count number of columns for layout. The number identifies
|
|
// the layout precisely, as we have no page having a right
|
|
// sidebar and no left sidebar
|
|
$PAGE_COLUMNS = 1;
|
|
if (!empty($SIDEBAR_DATA)) { $PAGE_COLUMNS++; }
|
|
if (!empty($RSIDEBAR_DATA)) { $PAGE_COLUMNS++; }
|
|
|
|
// Check which language we are presenting, default to english
|
|
$lang = "en";
|
|
if (isset($config["lang"])) {
|
|
$lang = language_convert($config["lang"]);
|
|
} elseif (isset($PGI, $PGI['head'], $PGI['head'][1])) {
|
|
$lang = language_convert($PGI['head'][1]);
|
|
}
|
|
|
|
// Print out lang and charset headers
|
|
if (!isset($config["charset"])) { $config["charset"] = "utf-8"; }
|
|
header("Content-type: text/html;charset={$config['charset']}");
|
|
header("Content-language: {$lang}");
|
|
if (isset($config["generate_modified"]) && $config["generate_modified"]) {
|
|
$timestamp = @filemtime($_SERVER["DOCUMENT_ROOT"] . "/" .$_SERVER["BASE_PAGE"]);
|
|
if ($timestamp) {
|
|
$tsstring = gmdate("D, d M Y H:i:s ", $timestamp) . "GMT";
|
|
header("Last-Modified: " . $tsstring);
|
|
}
|
|
}
|
|
|
|
|
|
if (isset($config["extra_headers"]) && is_array($config["extra_headers"])) {
|
|
foreach($config["extra_headers"] as $key => $value) {
|
|
header(sprintf("%s: %s", $key, $value));
|
|
}
|
|
}
|
|
|
|
if (!empty($title)) { $title = ": $title"; }
|
|
|
|
// This page should not be indexed by robots
|
|
if (in_array("noindex", $config)) {
|
|
$meta .= "\n <meta name=\"robots\" content=\"noindex\" />";
|
|
}
|
|
|
|
// Set onload handler if required
|
|
$onload = (isset($config['onload']) ? ' onload="' . $config['onload'] . '"' : '');
|
|
|
|
// Explicit language setting means that we should put that into the form
|
|
if (isset($EXPL_LANG)) {
|
|
$lang_input = "\n <input type=\"hidden\" name=\"lang\" value=\"$EXPL_LANG\" />";
|
|
}
|
|
|
|
// Link tags
|
|
$link = "";
|
|
if (isset($config['link']) && is_array($config['link'])) {
|
|
foreach($config['link'] as $rel => $url) {
|
|
if (!is_array($url)) {
|
|
$link .= "\n <link rel=\"$rel\" href=\"$url\" />";
|
|
} else {
|
|
$link .= "\n <link ";
|
|
foreach($url as $attr => $val) {
|
|
$link .= "$attr=\"$val\" ";
|
|
}
|
|
$link .= "/>";
|
|
}
|
|
}
|
|
}
|
|
|
|
// Base href setting for URL shortcuts to work
|
|
if (!empty($_SERVER['BASE_HREF'])) {
|
|
$base = "\n <base href=\"{$_SERVER['BASE_HREF']}\" />";
|
|
$canonical = '<link rel="canonical" href="//php.net/' . $_SERVER['BASE_PAGE'] . '" />';
|
|
}
|
|
|
|
// Define layout helper in case we need it
|
|
if ($PAGE_COLUMNS > 2) {
|
|
$layout_helper = "<div id=\"layout_{$PAGE_COLUMNS}_helper\">";
|
|
}
|
|
|
|
// Choose name of mirror site specific CSS file
|
|
$mirror_specific_style = ($_SERVER['STATIC_ROOT'] ? 'phpnet' : 'mirror');
|
|
|
|
// Support for more header tags
|
|
$moreheadtags = '';
|
|
if (isset($config['headtags'])) {
|
|
if (is_array($config['headtags'])) {
|
|
$moreheadtags = "\n " . join("\n ", $config['headtags']);
|
|
} else {
|
|
$moreheadtags = "\n " . ((string)$config['headtags']);
|
|
}
|
|
}
|
|
$classname = "default";
|
|
if(isset($_SERVER['BASE_PAGE'])) {
|
|
$classname = dirname($_SERVER['BASE_PAGE']);
|
|
if(empty($classname)) {
|
|
$classname = "default";
|
|
}
|
|
}
|
|
|
|
// Right-to-left support
|
|
$rtl = "";
|
|
/* Does not appear to work... commenting out.
|
|
switch ($lang) {
|
|
case "he":
|
|
case "ar":
|
|
$rtl = ' style="direction: rtl"';
|
|
break;
|
|
}
|
|
*/
|
|
|
|
// RTL Hack. Edit styles/rtl.css for rtl specific CSS.
|
|
$import_rtl = '';
|
|
if (in_array($lang, array('ar', 'fa', 'he'))) {
|
|
$import_rtl = '@import url("' . $_SERVER['STATIC_ROOT'] . '/styles/rtl.css");';
|
|
}
|
|
|
|
$profile = "";
|
|
if (isset($config['profile']) && !empty($config['profile'])) {
|
|
$profile = ' profile="';
|
|
if (is_array($config['profile'])) {
|
|
$profile .= implode(" ", $config['profile']);
|
|
} else {
|
|
$profile .= $config['profile'];
|
|
}
|
|
$profile .= '"';
|
|
}
|
|
|
|
|
|
print <<<END_HEADER
|
|
<!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{$profile}>
|
|
<title>PHP{$title}</title>
|
|
<style type="text/css" media="all">
|
|
@import url("{$_SERVER['STATIC_ROOT']}/styles/site.css");
|
|
@import url("{$_SERVER['STATIC_ROOT']}/styles/{$mirror_specific_style}.css");
|
|
$import_rtl
|
|
</style>
|
|
<!--[if IE]><![if gte IE 6]><![endif]-->
|
|
<style type="text/css" media="print">
|
|
@import url("{$_SERVER['STATIC_ROOT']}/styles/print.css");
|
|
</style>
|
|
<!--[if IE]><![endif]><![endif]-->
|
|
<meta http-equiv="Content-Type" content="text/html; charset={$config['charset']}"/>
|
|
<link rel="shortcut icon" href="{$_SERVER['STATIC_ROOT']}/favicon.ico" />{$link}
|
|
$canonical
|
|
<script type="text/javascript" src="{$_SERVER['STATIC_ROOT']}/userprefs.js"></script>{$base}{$meta}{$moreheadtags}
|
|
</head>
|
|
<body{$onload}>
|
|
|
|
<div id="headnav">
|
|
<a href="/" rel="home"><img src="{$_SERVER['STATIC_ROOT']}/images/php.gif"
|
|
alt="PHP" width="120" height="67" id="phplogo" /></a>
|
|
<div id="headmenu">
|
|
<a href="/downloads.php">downloads</a> |
|
|
<a href="/docs.php">documentation</a> |
|
|
<a href="/FAQ.php">faq</a> |
|
|
<a href="/support.php">getting help</a> |
|
|
<a href="/mailing-lists.php">mailing lists</a> |
|
|
<a href="/license">licenses</a> |
|
|
<a href="https://wiki.php.net/">wiki</a> |
|
|
<a href="https://bugs.php.net/">reporting bugs</a> |
|
|
<a href="/sites.php">php.net sites</a> |
|
|
<a href="/conferences/">conferences</a> |
|
|
<a href="/my.php">my php.net</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="headsearch">
|
|
<form method="post" action="/search.php" id="topsearch">
|
|
<p>
|
|
<span title="Keyboard shortcut: Alt+S (Win), Ctrl+S (Apple)">
|
|
<span class="shortkey">s</span>earch for
|
|
</span>
|
|
<input type="text" name="pattern" value="" size="30" accesskey="s" />
|
|
<span>in the</span>
|
|
<select name="show">
|
|
<option value="all" >all php.net sites</option>
|
|
<option value="local" >this mirror only</option>
|
|
<option value="quickref" selected="selected">function list</option>
|
|
<option value="manual" >online documentation</option>
|
|
<option value="bugdb" >bug database</option>
|
|
<option value="news_archive">Site News Archive</option>
|
|
<option value="changelogs">All Changelogs</option>
|
|
<option value="pear" >just pear.php.net</option>
|
|
<option value="pecl" >just pecl.php.net</option>
|
|
<option value="talks" >just talks.php.net</option>
|
|
<option value="maillist" >general mailing list</option>
|
|
<option value="devlist" >developer mailing list</option>
|
|
<option value="phpdoc" >documentation mailing list</option>
|
|
</select>
|
|
<input type="image"
|
|
src="{$_SERVER['STATIC_ROOT']}/images/small_submit_white.gif"
|
|
class="submit" alt="search" />{$lang_input}
|
|
</p>
|
|
</form>
|
|
</div>
|
|
|
|
<div id="layout_{$PAGE_COLUMNS}">{$layout_helper}
|
|
END_HEADER;
|
|
|
|
// Print out left column
|
|
if ($PAGE_COLUMNS > 1) {
|
|
echo "\n <div id=\"leftbar\">\n$SIDEBAR_DATA\n </div>";
|
|
}
|
|
|
|
// Print out right column
|
|
if ($PAGE_COLUMNS > 2) {
|
|
echo "\n <div id=\"rightbar\">\n$RSIDEBAR_DATA\n </div>";
|
|
}
|
|
|
|
// Any layout workarounds?
|
|
if (!empty($config["layout_workaround"])) {
|
|
echo $config["layout_workaround"];
|
|
}
|
|
|
|
// Start main page content
|
|
echo "\n <div id=\"content\" class=\"$classname\"{$rtl}>\n";
|
|
}
|
|
|
|
// Stats pages still need this
|
|
function commonFooter() { site_footer(); }
|
|
|
|
function site_footer($config = array())
|
|
{
|
|
if (myphpnet_beta()) {
|
|
return site_footer_beta($config);
|
|
}
|
|
global $LAST_UPDATED, $PAGE_COLUMNS;
|
|
|
|
$stats = (have_stats() ? "\n <a href=\"/stats/\">stats</a> |" : "");
|
|
$rsslink = (isset($config["rss"]) ?
|
|
"<a href=\"{$config["rss"]}\">RSS</a> |" :
|
|
"");
|
|
$atomlink = (isset($config["atom"]) ?
|
|
"<a href=\"{$config["atom"]}\">Atom</a> |" :
|
|
"");
|
|
$viewsource = (isset($_SERVER['BASE_PAGE']) ?
|
|
"<a href=\"/source.php?url=/{$_SERVER['BASE_PAGE']}\">show source</a> |" :
|
|
"");
|
|
$provider_url = mirror_provider_url();
|
|
$provider_name = mirror_provider();
|
|
$mirror_text = (is_official_mirror() ?
|
|
"<a href=\"/mirror.php\">This mirror</a> generously provided by:" :
|
|
"<a href=\"/mirror.php\">This unofficial mirror</a> is operated at:");
|
|
$last_updated = strftime("%c %Z", $LAST_UPDATED);
|
|
$layout_helper = ($PAGE_COLUMNS > 2 ? "</div>" : "");
|
|
//$functionsjs = (in_array("functionsjs", $config) ? "\n<script src=\"" . $_SERVER['STATIC_ROOT'] . '/functions.js" type="text/javascript"></script>' : '');
|
|
|
|
// Automate the Copyright year
|
|
$current_year = date('Y');
|
|
|
|
print <<<END_FOOTER
|
|
|
|
</div>
|
|
<div class="cleaner"> </div>
|
|
{$layout_helper}</div>
|
|
|
|
<div id="footnav">
|
|
$rsslink $atomlink $viewsource
|
|
<a href="/credits.php">credits</a> |$stats
|
|
<a href="/sitemap.php">sitemap</a> |
|
|
<a href="/contact.php">contact</a> |
|
|
<a href="/contact.php#ads">advertising</a> |
|
|
<a href="/mirrors.php">mirror sites</a>
|
|
</div>
|
|
|
|
<div id="pagefooter">
|
|
<div id="copyright">
|
|
<a href="/copyright.php">Copyright © 2001-{$current_year} The PHP Group</a><br />
|
|
All rights reserved.
|
|
</div>
|
|
|
|
<div id="thismirror">
|
|
{$mirror_text}
|
|
<a href="{$provider_url}">{$provider_name}</a><br />
|
|
Last updated: {$last_updated}
|
|
</div>
|
|
</div>
|
|
<!--[if IE 6]>
|
|
<script type="text/javascript">
|
|
/*Load jQuery if not already loaded*/ if(typeof jQuery == 'undefined'){ document.write("<script type=\"text/javascript\" src=\"//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\"></"+"script>"); var __noconflict = true; }
|
|
var IE6UPDATE_OPTIONS = {
|
|
icons_path: "/ie6update/images/"
|
|
}
|
|
</script>
|
|
<script type="text/javascript" src="/ie6update/ie6update.js"></script>
|
|
<![endif]-->
|
|
</body>
|
|
</html>
|
|
END_FOOTER;
|
|
}
|
|
|
|
// Resize the image using the output of make_image()
|
|
// (considering possible HTML/XHTML image tag endings)
|
|
function resize_image($img, $width = 1, $height = 1)
|
|
{
|
|
// Drop width and height values from image if available
|
|
$str = preg_replace('!width=\"([0-9]+?)\"!i', '', $img);
|
|
$str = preg_replace('!height=\"([0-9]+?)\"!i', '', $str);
|
|
|
|
// Return image with new width and height added
|
|
return preg_replace(
|
|
'!/?>$!',
|
|
sprintf(' height="%s" width="%s" />', $height, $width),
|
|
$str
|
|
);
|
|
}
|
|
|
|
// Return an <img /> tag for a given image file available on the server
|
|
function make_image($file, $alt = FALSE, $align = FALSE, $extras = FALSE,
|
|
$dir = '/images', $border = 0, $addsize = TRUE)
|
|
{
|
|
// If no / was provided at the start of $dir, add it
|
|
$webdir = $_SERVER['STATIC_ROOT'] . ($dir{0} == '/' ? '' : '/') . $dir;
|
|
|
|
// Get width and height values if possible
|
|
if ($addsize && ($size = @getimagesize($_SERVER['DOCUMENT_ROOT'] . "$dir/$file"))) {
|
|
$sizeparams = ' ' . trim($size[3]);
|
|
} else {
|
|
$sizeparams = '';
|
|
}
|
|
|
|
// Convert right or left alignment to CSS float,
|
|
// but leave other alignments intact (for now)
|
|
if (in_array($align, array("right", "left"))) {
|
|
$align = ' style="float: ' . $align . ';"';
|
|
} elseif ($align) {
|
|
$align = ' align="' . $align . '"';
|
|
} else {
|
|
$align = '';
|
|
}
|
|
|
|
// Return with image built up
|
|
return sprintf('<img src="%s/%s" alt="%s"%s%s%s />',
|
|
$webdir,
|
|
$file,
|
|
($alt ? $alt : ''),
|
|
$sizeparams,
|
|
$align,
|
|
($extras ? ' ' . $extras : '')
|
|
);
|
|
return $image;
|
|
}
|
|
|
|
// Print an <img /> tag out for a given file
|
|
function print_image($file, $alt = FALSE, $align = FALSE, $extras = FALSE,
|
|
$dir = '/images', $border = 0)
|
|
{
|
|
echo make_image($file, $alt, $align, $extras, $dir, $border);
|
|
}
|
|
|
|
// Shortcut to usual news image printing (right floating
|
|
// image from the news dir with an alt and an URL)
|
|
function news_image($URL, $image, $alt, $print = true)
|
|
{
|
|
$str = "<a href=\"$URL\">" . make_image("news/$image", $alt, "right") . "</a>";
|
|
if ($print) {
|
|
echo $str;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
// Return HTML code for a submit button image
|
|
function make_submit($file, $alt = FALSE, $align = FALSE, $extras = FALSE,
|
|
$dir = '/images', $border = 0)
|
|
{
|
|
// Get an image without size info and convert the
|
|
// border attribute to use CSS, as border="" is not
|
|
// supported on <input> elements in [X]HTML
|
|
$img = make_image($file, $alt, $align, $extras, $dir, 0, FALSE);
|
|
$img = str_replace(
|
|
"border=\"$border\"",
|
|
"style=\"border: {$border}px;\"",
|
|
$img
|
|
);
|
|
|
|
// Return with ready input image
|
|
return '<input type="image"' . substr($img, 4);
|
|
}
|
|
|
|
// Return a hiperlink to something within the site
|
|
function make_link ($url, $linktext = FALSE, $target = FALSE, $extras = FALSE)
|
|
{
|
|
return sprintf("<a href=\"%s\"%s%s>%s</a>",
|
|
$url,
|
|
($target ? ' target="' . $target . '"' : ''),
|
|
($extras ? ' ' . $extras : ''),
|
|
($linktext ? $linktext : $url)
|
|
);
|
|
}
|
|
|
|
// Print a hyperlink to something, within the site
|
|
function print_link($url, $linktext = FALSE, $target = FALSE, $extras = FALSE)
|
|
{
|
|
echo make_link($url, $linktext, $target, $extras);
|
|
}
|
|
|
|
// make_popup_link()
|
|
// return a hyperlink to something, within the site, that pops up a new window
|
|
//
|
|
function make_popup_link ($url, $linktext=false, $target=false, $windowprops="", $extras=false) {
|
|
return sprintf("<a href=\"%s\" target=\"%s\" onclick=\"window.open('%s','%s','%s');return false;\"%s>%s</a>",
|
|
htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE),
|
|
($target ? $target : "_new"),
|
|
htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE),
|
|
($target ? $target : "_new"),
|
|
$windowprops,
|
|
($extras ? ' '.$extras : ''),
|
|
($linktext ? $linktext : $url)
|
|
);
|
|
}
|
|
|
|
// print_popup_link()
|
|
// print a hyperlink to something, within the site, that pops up a new window
|
|
//
|
|
function print_popup_link($url, $linktext=false, $windowprops="", $target=false, $extras=false) {
|
|
echo make_popup_link($url, $linktext, $windowprops, $target, $extras);
|
|
}
|
|
|
|
// Print a link for a downloadable file (including filesize)
|
|
function download_link($file, $title, $showsize = TRUE, $mirror = '')
|
|
{
|
|
// Construct the download link for this site or a mirror site
|
|
$download_link = "get/$file/from/a/mirror";
|
|
if ($mirror != '') {
|
|
$download_link = $mirror . $download_link;
|
|
} else {
|
|
$download_link = "/" . $download_link;
|
|
}
|
|
|
|
// Print out the download link
|
|
print_link($download_link, $title);
|
|
|
|
// Size display is required
|
|
if ($showsize) {
|
|
|
|
// We have a full path or a relative to the distributions dir
|
|
if ($tmp = strrchr($file, "/")) {
|
|
$local_file = substr($tmp, 1, strlen($tmp));
|
|
} else {
|
|
$local_file = "distributions/$file";
|
|
}
|
|
|
|
// Try to get the size of the file
|
|
$size = @filesize($local_file);
|
|
|
|
// Print out size in bytes (if size is
|
|
// less then 1Kb, or else in Kb)
|
|
if ($size) {
|
|
echo ' [';
|
|
if ($size < 1024) {
|
|
echo number_format($size, 0, '.', ',') . 'b';
|
|
} else {
|
|
echo number_format($size/1024, 0, '.', ',') . 'Kb';
|
|
}
|
|
echo ']';
|
|
}
|
|
}
|
|
}
|
|
|
|
function sect_to_file($string) {
|
|
$string = strtolower($string);
|
|
$string = str_replace(' ','-',$string);
|
|
$string = str_replace('_','-',$string);
|
|
$func = "function.$string.php";
|
|
$chap = "ref.$string.php";
|
|
$feat = "features.$string.php";
|
|
$struct = "control-structures.$string.php";
|
|
if(@is_file($func)) return $func;
|
|
else if(@is_file($chap)) return $chap;
|
|
else if(@is_file($feat)) return $feat;
|
|
else if(@is_file($struct)) return $struct;
|
|
else return "$string.php";
|
|
}
|
|
|
|
function clean($var) {
|
|
return htmlspecialchars(get_magic_quotes_gpc() ? stripslashes($var) : $var, ENT_QUOTES);
|
|
}
|
|
|
|
// Clean out the content of one user note for printing to HTML
|
|
function clean_note($text)
|
|
{
|
|
// Highlight PHP source
|
|
$text = highlight_php(trim($text), TRUE);
|
|
|
|
// Turn urls into links
|
|
$text = preg_replace(
|
|
'!((mailto:|(http|ftp|nntp|news):\/\/).*?)(\s|<|\)|"|\\\\|\'|$)!',
|
|
'<a href="\1" rel="nofollow" target="_blank">\1</a>\4',
|
|
$text
|
|
);
|
|
|
|
return $text;
|
|
}
|
|
|
|
function display_errors($errors)
|
|
{
|
|
echo '<div class="errors">';
|
|
if (count($errors) > 1) {
|
|
echo "You need to do the following before your submission will be accepted:<ul>";
|
|
foreach ($errors as $error) {
|
|
echo "<li>$error</li>\n";
|
|
}
|
|
echo "</ul>";
|
|
}
|
|
else {
|
|
echo $errors[0];
|
|
}
|
|
echo '</div>';
|
|
}
|
|
|
|
// Displays an event. Used in event submission
|
|
// previews and event information displays
|
|
function display_event($event, $include_date = 1)
|
|
{
|
|
global $COUNTRIES;
|
|
// Current month (int)($_GET['cm'] ?: 0)
|
|
global $cm;
|
|
// Current year (int)($_GET['cy'] ?: 0)
|
|
global $cy;
|
|
|
|
// Weekday names array
|
|
for ($i = 1; $i <= 7; $i++) {
|
|
$days[$i] = strftime('%A', mktime(12, 0, 0, 4, $i, 2001));
|
|
}
|
|
|
|
// Recurring possibilities
|
|
$re = array(
|
|
1 => 'First',
|
|
2 => 'Second',
|
|
3 => 'Third',
|
|
4 => 'Fourth',
|
|
-1 => 'Last',
|
|
-2 => '2nd Last',
|
|
-3 => '3rd Last'
|
|
);
|
|
|
|
$sday = (isset($event['start']) && !empty($event['start'])) ? strtotime($event['start']) : 0;
|
|
$eday = (isset($event['end']) && !empty($event['end'])) ? strtotime($event['end']) : 0;
|
|
?>
|
|
<table border="0" cellspacing="0" cellpadding="3" width="100%" class="vevent">
|
|
<tr bgcolor="#dddddd"><td>
|
|
<?php
|
|
|
|
// Print out date if needed
|
|
if ($include_date && (isset($event['start']))) {
|
|
echo "<b>", date("F j, Y", $sday), "</b>\n";
|
|
}
|
|
|
|
// Print link in case we have one
|
|
if ($event['url']) { echo '<a href="', htmlentities($event['url'], ENT_QUOTES | ENT_IGNORE, 'UTF-8'),'" class="url">'; }
|
|
// Print event description
|
|
echo "<b class='summary'>", stripslashes(htmlentities($event['sdesc'], ENT_QUOTES | ENT_IGNORE, 'UTF-8')), "</b>";
|
|
// End link
|
|
if ($event['url']) { echo "</a>"; }
|
|
|
|
// Print extra date info for recurring and multiday events
|
|
switch ($event['type']) {
|
|
case 2:
|
|
case 'multi':
|
|
$dtend = date("Y-m-d", strtotime("+1 day", $eday));
|
|
echo " (<abbr class='dtstart'>", date("Y-m-d",$sday), "</abbr> to <abbr class='dtend' title='$dtend'>", date("Y-m-d",$eday), "</abbr>)";
|
|
break;
|
|
case 3:
|
|
case 'recur':
|
|
$days = $re[$event['recur']]. " " .$days[$event['recur_day']];
|
|
if (!$cm || $cy) {
|
|
$cm = date("m");
|
|
$cy = date("Y");
|
|
}
|
|
$month = date("M", mktime(0, 0, 0, $cm, 1, $cy));
|
|
$dtstart = date("Y-m-d", strtotime($days . ' 0st' .$month. ' ' .$cy));
|
|
echo ' (Every <abbr class="dtstart" title="'.$dtstart.'">', $days, "</abbr> of the month)";
|
|
break;
|
|
}
|
|
|
|
// Event category
|
|
if(isset($event['category']) && $event['category']) {
|
|
$cat = array("unknown", "User Group Event", "Conference", "Training");
|
|
echo ' [' . $cat[$event['category']] . '] ';
|
|
}
|
|
|
|
// Print out country information
|
|
echo ' (<span class="location">' , $COUNTRIES[$event['country']] , '</span>)';
|
|
?>
|
|
</td></tr>
|
|
<tr bgcolor="#eeeeee" class="description"><td>
|
|
<?php
|
|
|
|
// Print long description
|
|
echo preg_replace("/\r?\n\r?\n/", "<br /><br />", trim(htmlentities($event['ldesc'],ENT_QUOTES | ENT_IGNORE, 'UTF-8')));
|
|
// If we have an URL, print it out
|
|
if ($event['url']) {
|
|
echo '<br /><br /><b>URL:</b> ',
|
|
'<a href="', htmlentities($event['url'], ENT_QUOTES | ENT_IGNORE, 'UTF-8'), '">',
|
|
htmlentities($event['url'], ENT_QUOTES | ENT_IGNORE, 'UTF-8'), '</a>';
|
|
}
|
|
?>
|
|
</td></tr>
|
|
</table>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Print a view
|
|
*
|
|
* @param string $templateName
|
|
* @param array $params
|
|
* @return void
|
|
*/
|
|
function print_view($templateName, array $params = array()) {
|
|
$path = $_SERVER['DOCUMENT_ROOT'] . '/views/' . $templateName;
|
|
if(file_exists($path)) {
|
|
if(!empty($params)) {
|
|
foreach($params as $key => $param) {
|
|
$$key = $param;
|
|
}
|
|
}
|
|
include_once $path;
|
|
}
|
|
}
|
|
|
|
// Print news links for archives
|
|
function news_archive_sidebar()
|
|
{
|
|
global $SIDEBAR_DATA;
|
|
$SIDEBAR_DATA = '
|
|
<h3>Latest news</h3>
|
|
|
|
<p>
|
|
For the latest news, <a href="/index.php" rel="home">check the homepage</a>,
|
|
or <a href="/feed.atom">our Atom feed</a>.
|
|
</p>
|
|
|
|
<h3>Archives by year</h3>
|
|
|
|
<ul class="toc">
|
|
';
|
|
for ($i = date("Y"); $i >= 1998; $i--) {
|
|
$pagename = "archive/$i.php";
|
|
$classname = ($pagename == $_SERVER['BASE_PAGE'] ? ' class="active"' : '');
|
|
$SIDEBAR_DATA .= "<li{$classname}><a href=\"/{$pagename}\">{$i}</a></li>\n";
|
|
}
|
|
$SIDEBAR_DATA .= '</ul>';
|
|
}
|
|
|
|
// Print news
|
|
function print_news($news, $dog, $max = 5, $onlyyear = null, $return = false) {
|
|
$retval = array();
|
|
$count = 0;
|
|
$news = $news ? $news : array(); // default to empty array (if no news)
|
|
foreach($news as $item) {
|
|
$vevent = "";
|
|
$ok = false;
|
|
|
|
// Only print entries in the provided s/dog/cat/ egory
|
|
// If its a conference, use the hCalendar container
|
|
foreach($item["category"] as $category) {
|
|
if (in_array($category["term"], (array)$dog)) {
|
|
$ok = true;
|
|
++$count;
|
|
}
|
|
if ($category["term"] === "conferences" || $category["term"] === "cfp") {
|
|
$vevent = " vevent";
|
|
}
|
|
}
|
|
if ($count > $max) {
|
|
break;
|
|
}
|
|
if ($ok === false) {
|
|
continue;
|
|
}
|
|
|
|
$image = "";
|
|
if(isset($item["newsImage"])) {
|
|
$image = news_image($item["newsImage"]["link"], $item["newsImage"]["content"], $item["newsImage"]["title"], false);
|
|
}
|
|
|
|
//$id = parse_url($item["id"], PHP_URL_FRAGMENT); 5.1.2
|
|
$id = parse_url($item["id"]);
|
|
$id = $id["fragment"];
|
|
|
|
// Find the permlink
|
|
foreach($item["link"] as $link) {
|
|
if ($link["rel"] === "via") {
|
|
$permlink = $link["href"];
|
|
break;
|
|
}
|
|
}
|
|
if (!isset($permlink)) {
|
|
$permlink = "#" .$id;
|
|
}
|
|
|
|
// PHP4 strtotime() doesn't support RFC3339 timestamps
|
|
$published = substr($item["published"], 0, 10);
|
|
$nixtimestamp = strtotime($published);
|
|
$newsdate = date("d-M-Y", $nixtimestamp);
|
|
if ($onlyyear && date("Y", $nixtimestamp) != $onlyyear) {
|
|
$count--;
|
|
continue;
|
|
}
|
|
|
|
if ($return) {
|
|
$retval[] = array(
|
|
"title" => $item["title"],
|
|
"id" => $id,
|
|
"permlink" => $permlink,
|
|
"date" => $newsdate,
|
|
);
|
|
continue;
|
|
}
|
|
|
|
echo <<< EOT
|
|
<div class="newsItem hentry{$vevent}">
|
|
<div class="newsImage">{$image}</div>
|
|
<h2 class="summary entry-title"><a name="{$id}" id="{$id}" href="{$permlink}" rel="bookmark" class="bookmark">{$item["title"]}</a></h2>
|
|
<div class="entry-content description">
|
|
<abbr class="published newsdate" title="{$item["published"]}">{$newsdate}</abbr>
|
|
{$item["content"]}
|
|
</div>
|
|
</div>
|
|
|
|
EOT;
|
|
}
|
|
|
|
return $retval;
|
|
}
|
|
|
|
|
|
|
|
|
|
// BETA
|
|
function site_header_beta($title = '', $config = array())
|
|
{
|
|
global $SIDEBAR_DATA;
|
|
global $MYSITE;
|
|
|
|
$defaults = array(
|
|
"lang" => myphpnet_language(),
|
|
"current" => "",
|
|
"meta-navigation" => array(),
|
|
'classes' => '',
|
|
);
|
|
|
|
$config += $defaults;
|
|
|
|
$lang = language_convert($config["lang"]);
|
|
$curr = $config["current"];
|
|
$classes = $config['classes'];
|
|
|
|
if (empty($title)) {
|
|
$title = "Hypertext Preprocessor";
|
|
}
|
|
|
|
// shorturl; http://wiki.snaplog.com/short_url
|
|
if (isset($_SERVER['BASE_PAGE']) && $shortname = get_shortname($_SERVER["BASE_PAGE"])) {
|
|
$shorturl = "http://php.net/" . $shortname;
|
|
}
|
|
|
|
// For static content
|
|
// FIXME: How does static.php.net work? Will it get the /js/ folders?
|
|
if (false && ($MYSITE == "http://www.php.net/" || $MYSITE == 'http://php.net/')) {
|
|
$STATIC_ROOT = "http://static.php.net/www.php.net/";
|
|
} elseif (false && !empty($_SERVER["STATIC_ROOT"])) {
|
|
$STATIC_ROOT = $_SERVER["STATIC_ROOT"];
|
|
} else {
|
|
$STATIC_ROOT = "/";
|
|
}
|
|
|
|
require dirname(__FILE__) ."/header.inc";
|
|
}
|
|
function site_footer_beta($config = array())
|
|
{
|
|
require dirname(__FILE__) . "/footer.inc";
|
|
}
|
|
|
|
function news_toc($sections = null) {
|
|
include dirname(__FILE__) . "/pregen-news.inc";
|
|
$items = array(
|
|
"news" => array(
|
|
"title" => "News",
|
|
"link" => "/archive/",
|
|
"children" => print_news($NEWS_ENTRIES, "frontpage", 3, null, true),
|
|
),
|
|
"conferences" => array(
|
|
"title" => "Conferences",
|
|
"link" => "/conferences/",
|
|
"children" => print_news($NEWS_ENTRIES, "conferences", 3, null, true),
|
|
),
|
|
"papers" => array(
|
|
"title" => "Call for Papers",
|
|
"link" => "/conferences/",
|
|
"children" => print_news($NEWS_ENTRIES, "cfp", 3, null, true),
|
|
),
|
|
);
|
|
|
|
foreach($items as $section => $menu) {
|
|
|
|
// only print requested sections.
|
|
if (is_array($sections) && !in_array($section, $sections)) {
|
|
continue;
|
|
}
|
|
|
|
echo "<dt><a href='{$menu["link"]}'>{$menu["title"]}</a></dt>\n";
|
|
foreach($menu["children"] as $child) {
|
|
echo "<dd><a href='{$child["permlink"]}'>{$child["title"]}</a></dd>\n";
|
|
}
|
|
}
|
|
}
|
|
function doc_toc($lang) {
|
|
$file = dirname(__FILE__) . "/../manual/$lang/toc/index.inc";
|
|
if (!file_exists($file)) {
|
|
$lang = "en"; // Fallback on english if the translation doesn't exist
|
|
$file = dirname(__FILE__) . "/../manual/en/toc/index.inc";
|
|
}
|
|
require dirname(__FILE__) . "/../manual/$lang/toc/index.inc";
|
|
|
|
?>
|
|
<dl>
|
|
<dt><a href="/manual/">PHP Manual</a></dt>
|
|
<?php doc_toc_list($lang, $TOC, 'getting-started'); ?>
|
|
<?php doc_toc_title($lang, $TOC, 'install', 'dd'); ?>
|
|
</dl>
|
|
|
|
<dl>
|
|
<?php doc_toc_title($lang, $TOC, 'langref'); ?>
|
|
<?php doc_sub_entry($lang, 'langref', 'language.basic-syntax'); ?>
|
|
<?php doc_sub_entry($lang, 'langref', 'language.variables'); ?>
|
|
<?php doc_sub_entry($lang, 'langref', 'language.operators'); ?>
|
|
<?php doc_sub_entry($lang, 'langref', 'language.functions'); ?>
|
|
<?php doc_sub_entry($lang, 'langref', 'language.oop5'); ?>
|
|
</dl>
|
|
|
|
<dl>
|
|
<?php doc_toc_title($lang, $TOC, 'funcref'); ?>
|
|
<?php doc_sub_entry($lang, 'refs.basic.vartype', 'book.array'); ?>
|
|
<?php doc_sub_entry($lang, 'refs.calendar', 'book.datetime'); ?>
|
|
<?php doc_sub_entry($lang, 'refs.basic.text', 'book.strings'); ?>
|
|
<?php doc_toc_title($lang, $TOC, 'faq'); ?>
|
|
</dl>
|
|
|
|
<dl>
|
|
<?php doc_toc_title($lang, $TOC, 'security'); ?>
|
|
<?php doc_sub_entry($lang, 'security', 'security.database'); ?>
|
|
<?php doc_sub_entry($lang, 'security', 'security.variables'); ?>
|
|
<?php doc_sub_entry($lang, 'faq', 'faq.passwords'); ?>
|
|
<?php doc_toc_title($lang, $TOC, 'appendices'); ?>
|
|
</dl>
|
|
<?php
|
|
}
|
|
function doc_sub_entry($lang, $file, $subfile, $elm = "dd") {
|
|
static $cache = array();
|
|
|
|
if (isset($cache["$lang.$file"])) {
|
|
$TOC = $cache["$lang.$file"];
|
|
} else {
|
|
include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc";
|
|
}
|
|
|
|
foreach($TOC as $entry) {
|
|
if (substr($entry[0], 0, strlen($subfile)) == $subfile) {
|
|
echo "\t<$elm><a href='/manual/$lang/{$entry[0]}'>{$entry[1]}</a></$elm>\n";
|
|
}
|
|
}
|
|
}
|
|
function doc_toc_list($lang, $index, $file) {
|
|
include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc";
|
|
|
|
doc_toc_title($lang, $index, $file);
|
|
foreach($TOC as $entry) {
|
|
echo "\t<dd><a href='/manual/$lang/{$entry[0]}'>{$entry[1]}</a></dd>\n";
|
|
}
|
|
}
|
|
function doc_toc_title($lang, $index, $file, $elm = "dt") {
|
|
foreach($index as $entry) {
|
|
if ($entry[0] == "$file.php") {
|
|
$link = $entry[0];
|
|
$title = $entry[1];
|
|
break;
|
|
}
|
|
}
|
|
echo "<$elm><a href='/manual/$lang/$link'>$title</a></$elm>\n";
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* vim: set et ts=4 sw=4 ft=php: : */
|
|
|