LotGDocker/lotgd-web/lotgd/lib/output.php

903 lines
24 KiB
PHP
Raw Normal View History

2020-08-17 19:16:42 -04:00
<?php
/**
* Library Functions for page output.
* translator ready
* addnews ready
* mail ready
*
* @author core_module
*/
$nestedtags=array();
$output="";
$block_new_output = false;
/**
* Block any output statements temporarily
*
* @param bool $block should output be blocked
*/
function set_block_new_output($block)
{
global $block_new_output;
$block_new_output = $block;
}
/**
* Raw output (unprocessed) appended to the output buffer
*
* @param string $indata
*/
function rawoutput($indata) {
global $output, $block_new_output;
if ($block_new_output) return;
$output .= $indata . "\n";
}
/**
* Handles color and style encoding, and appends to the output buffer ($output)
*
* @param string|array $indata If an array is passed then the format for sprintf is assumed otherwise a simple string is assumed
*
* @see sprintf, apponencode
*/
function output_notl($indata){
global $output, $block_new_output;
if ($block_new_output) return;
$args = func_get_args();
//pop true off the end if we have it
$last = array_pop($args);
if ($last!==true){
array_push($args,$last);
$priv = false;
}else{
$priv = true;
}
$out = $indata;
$args[0]=&$out;
//apply variables
if (count($args)>1){
//special case since we use `% as a color code so often.
$out = str_replace("`%","`%%",$out);
$out = call_user_func_array("sprintf",$args);
}
//holiday text
if ($priv==false) $out = holidayize($out,'output');
//`1`2 etc color & formatting
$out = appoencode($out,$priv);
//apply to the page.
$output.=tlbutton_pop().$out;
$output.="\n";
}
/**
* Outputs a translated, color/style encoded string to the browser.
*
* @param string|array What to output. If an array is passed then the format used by sprintf is assumed
*
* @see output_notl
*
*/
function output(){
global $block_new_output;
if ($block_new_output) return;
$args = func_get_args();
if (is_array($args[0])) $args = $args[0];
if (is_bool($args[0]) && array_shift($args)) {
$schema= array_shift($args);
$args[0] = translate($args[0],$schema);
} else {
$args[0] = translate($args[0]);
}
call_user_func_array("output_notl",$args);
}
/**
* Generate debug output for players who have the SU_DEBUG_OUTPUT flag set in the superuser mask
*
* @param string $text The string to output
* @param bool $force If true, force debug output even for non SU/non flagged
*/
function debug($text, $force=false){
global $session, $block_new_output;
$temp = $block_new_output;
set_block_new_output(false);
if ($force || $session['user']['superuser'] & SU_DEBUG_OUTPUT){
if (is_array($text)){
require_once("lib/dump_item.php");
$text = appoencode(dump_item($text),true);
}
rawoutput("<div class='debug'>$text</div>");
}
set_block_new_output($temp);
}
/**
* Generates the appropriate output based on the LOGD coding system (ie: `b: Bold, `i: Italic)
*
* @param string $data The string to be output
* @param bool $priv Indicates if the passed string ($data) contains HTML
* @return string An output (HTML) formatted string
*/
function appoencode($data,$priv=false){
global $nestedtags,$session;
$start = 0;
$out="";
if( ($pos = strpos($data, "`")) !== false) {
global $nestedtags;
if (!isset($nestedtags['font'])) $nestedtags['font']=false;
if (!isset($nestedtags['div'])) $nestedtags['div']=false;
if (!isset($nestedtags['i'])) $nestedtags['i']=false;
if (!isset($nestedtags['b'])) $nestedtags['b']=false;
if (!isset($nestedtags['<'])) $nestedtags['<']=false;
if (!isset($nestedtags['>'])) $nestedtags['>']=false;
if (!isset($nestedtags['h'])) $nestedtags['h']=false;
static $colors = array(
"1" => "colDkBlue",
"2" => "colDkGreen",
"3" => "colDkCyan",
"4" => "colDkRed",
"5" => "colDkMagenta",
"6" => "colDkYellow",
"7" => "colDkWhite",
"~" => "colBlack",
"!" => "colLtBlue",
"@" => "colLtGreen",
"#" => "colLtCyan",
"\$" => "colLtRed",
"%" => "colLtMagenta",
"^" => "colLtYellow",
"&" => "colLtWhite",
")" => "colLtBlack",
"e" => "colDkRust",
"E" => "colLtRust",
"g" => "colXLtGreen",
"G" => "colXLtGreen",
"j" => "colMdGrey",
"J" => "colMdBlue",
"k" => "colaquamarine",
"K" => "coldarkseagreen",
"l" => "colDkLinkBlue",
"L" => "colLtLinkBlue",
"m" => "colwheat",
"M" => "coltan",
"p" => "collightsalmon",
"P" => "colsalmon",
"q" => "colDkOrange",
"Q" => "colLtOrange",
"R" => "colRose",
"T" => "colDkBrown",
"t" => "colLtBrown",
"V" => "colBlueViolet",
"v" => "coliceviolet",
"x" => "colburlywood",
"X" => "colbeige",
"y" => "colkhaki",
"Y" => "coldarkkhaki",
);
do {
++$pos;
if ($priv === false){
$out .= HTMLEntities(substr($data, $start, $pos - $start - 1), ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
} else {
$out .= substr($data, $start, $pos - $start - 1);
}
$start = $pos + 1;
if(isset($colors[$data[$pos]])) {
if ($nestedtags['font']) $out.="</span>";
else $nestedtags['font']=true;
$out.="<span class='".$colors[$data[$pos]]."'>";
} else {
switch($data[$pos]){
case "n":
$out.="<br>\n";
break;
case "0":
if ($nestedtags['font']) $out.="</span>";
$nestedtags['font'] = false;
break;
case "b":
if ($nestedtags['b']){
$out.="</b>";
$nestedtags['b']=false;
}else{
$nestedtags['b']=true;
$out.="<b>";
}
break;
case "i":
if ($nestedtags['i']) {
$out.="</i>";
$nestedtags['i']=false;
}else{
$nestedtags['i']=true;
$out.="<i>";
}
break;
case "c":
if ($nestedtags['div']) {
$out.="</div>";
$nestedtags['div']=false;
}else{
$nestedtags['div']=true;
$out.="<div align='center'>";
}
break;
case "h":
if ($nestedtags['h']) {
$out.="</em>";
$nestedtags['h']=false;
}else{
$nestedtags['h']=true;
$out.="<em>";
}
break;
case ">":
if ($nestedtags['>']){
$nestedtags['>']=false;
$out.="</div>";
}else{
$nestedtags['>']=true;
$out.="<div style='float: right; clear: right;'>";
}
break;
case "<":
if ($nestedtags['<']){
$nestedtags['<']=false;
$out.="</div>";
}else{
$nestedtags['<']=true;
$out.="<div style='float: left; clear: left;'>";
}
break;
case "H":
if ($nestedtags['div']) {
$out.="</span>";
$nestedtags['div']=false;
}else{
$nestedtags['div']=true;
$out.="<span class='navhi'>";
}
break;
case "w":
global $session;
if(!isset($session['user']['weapon']))
$session['user']['weapon']="";
$out.=appoencode($session['user']['weapon'],$priv);
break;
case "`":
$out.="`";
++$pos;
break;
default:
$out.="`".$data[$pos];
}
}
} while( ($pos = strpos($data, "`", $pos)) !== false);
}
if ($priv === false){
$out .= HTMLEntities(substr($data, $start), ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
} else {
$out .= substr($data, $start);
}
return $out;
}
$blockednavs = array(
'blockpartial'=>array(),
'blockfull'=>array(),
'blockcat'=>array(),
'unblockpartial'=>array(),
'unblockfull'=>array()
);
/**
* Called to block the display of a nav
* if $partial is true, it will block any nav that begins with the given $link.
* if $partial is false, it will block only navs that have exactly the given $link.
*
* @param string $link The URL to block
* @param bool $partial
*/
function blocknav($link,$partial=false){
//prevents a script from being able to generate navs on the given $link.
global $blockednavs;
$p = ($partial?'partial':'full');
$blockednavs["block$p"][$link] = true;
//eliminate any unblocked navs that match this description.
if (isset($blockednavs["unblock$p"][$link])) {
unset($blockednavs["unblock$p"][$link]);
}
if ($partial){
reset($blockednavs['unblockpartial']);
while (list($key,$val)=each($blockednavs['unblockpartial'])){
if (substr($link,0,strlen($val))==$val ||
substr($val,0,strlen($link))==$link){
unset($blockednavs['unblockpartial'][$val]);
}
}
}
}
/**
* Unlocks a nav from the blocked navs Array
* if $partial is true, it will unblock any nav that begins with the given $link.
* if $partial is false, it will unblock only navs that have exactly the given $link.
*
* @param string $link The nav to unblock
* @param bool $partial If the passed nav is partial or not
*/
function unblocknav($link,$partial=false){
//prevents a link that was otherwise blocked with blocknav() from
//actually being blocked.
global $blockednavs;
$p = ($partial?'partial':'full');
$blockednavs["unblock$p"][$link] = true;
//eliminate any blocked navs that match this description.
if (isset($blockednavs["block$p"][$link])) {
unset($blockednavs["block$p"][$link]);
}
if ($partial){
reset($blockednavs['blockpartial']);
while (list($key,$val)=each($blockednavs['blockpartial'])){
if (substr($link,0,strlen($val))==$val ||
substr($val,0,strlen($link))==$link){
unset($blockednavs['blockpartial'][$val]);
}
}
}
}
/**
* Called to block the display of an entire category of navs
*
* @param string $cat The category to block
*/
function blocknavcat($cat){
//prevents a script from being able to generate navs on the given $cat.
global $blockednavs;
if(!isset($blockednavs["blockcat"][$cat])) $blockednavs["blockcat"][$cat] = true;
}
/**
* Unlocks a nav category from the blocked navs Array
*
* @param string $cat The category to unblock
*/
function unblocknavcat($cat){
//prevents a category that was otherwise blocked with blocknavcat() from
//actually being blocked.
global $blockednavs;
//eliminate any blocked nav cats that match this description.
$blockednavs["blockcat"][$cat] = false;
}
function appendcount($link) {
global $session;
return appendlink($link, "c=" . $session['counter'] . "-" . date("His"));
}
function appendlink($link, $new)
{
if (strpos($link, "?") !== false) {
return $link . '&' . $new;
} else {
return $link . '?' . $new;
}
}
$navsection="";
$navbysection = array();
$navschema = array();
$navnocollapse = array();
$block_new_navs = false;
/**
* Allow header/footer code to block/unblock additional navs
*
* @param bool $block should new navs be blocked
*/
function set_block_new_navs($block)
{
global $block_new_navs;
$block_new_navs = $block;
}
/**
* Generate and/or store a nav banner for the player
*
* @param string $text the display string for the nav banner
* @param collapse $collapse (default true) can the nav section collapse
*/
function addnavheader($text, $collapse=true,$translate=TRUE)
{
global $navsection,$navbysection,$translation_namespace;
global $navschema,$navnocollapse, $block_new_navs,$notranslate;
if ($block_new_navs) return;
if (is_array($text)){
$text = "!array!".serialize($text);
}
$navsection=$text;
if (!array_key_exists($text,$navschema))
$navschema[$text] = $translation_namespace;
//So we can place sections with out adding navs to them.
if (!isset($navbysection[$navsection]))
$navbysection[$navsection] = array();
if ($collapse === false) {
$navnocollapse[$text] = true;
}
if ($translate === false) {
if (!isset($notranslate))
$notranslate = array();
array_push($notranslate,array($text,""));
}
}
/**
* Generate and/or store the allowed navs or nav banners for the player.
* If $link is missing - then a banner will be displayed in the nav list
* If $text is missing - the nav will be stored in the allowed navs for the player but not displayed
* <B>ALL</B> internal site links that are displayed <B>MUST</B> also call addnav or badnav will occur.
*
* @param string $text (optional) The display string for the nav or nav banner
* @param string $link (optional) The URL of the link
* @param bool $priv Indicates if the name contains HTML
* @param bool $pop Indicates if the URL should generate a popup
* @param string $popsize If a popup - the size of the popup window
*
* @see badnav, apponencode
*/
function addnav_notl($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
global $navsection,$navbysection,$navschema,$notranslate;
global $block_new_navs;
if ($block_new_navs) return;
if ($link===false) {
// Don't do anything if text is ""
if ($text != "") {
addnavheader($text,TRUE,FALSE);
}
}else{
$args = func_get_args();
if ($text==""){
//if there's no text to display, may as well just stick this on
//the nav stack now.
call_user_func_array("private_addnav",$args);
}else{
if (!isset($navbysection[$navsection]))
$navbysection[$navsection] = array();
if (!isset($notranslate))
$notranslate = array();
array_push($navbysection[$navsection],$args);
array_push($notranslate,$args);
}
}
}
function addnav($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
global $navsection,$navbysection,$translation_namespace,$navschema;
global $block_new_navs;
if ($block_new_navs) return;
if ($link===false) {
// Don't do anything if text is ""
if ($text != "") {
addnavheader($text);
}
}else{
$args = func_get_args();
if ($text==""){
//if there's no text to display, may as well just stick this on
//the nav stack now.
call_user_func_array("private_addnav",$args);
}else{
if (!isset($navbysection[$navsection]))
$navbysection[$navsection] = array();
$t = $args[0];
if (is_array($t)) {
$t = $t[0];
}
if (!array_key_exists($t,$navschema))
$navschema[$t] = $translation_namespace;
array_push($navbysection[$navsection],array_merge($args,array("translate"=>false)));
}
}
}
/**
* Determine if a nav/URL is blocked
*
* @param string $link The nav to check
* @return bool
*/
function is_blocked($link)
{
global $blockednavs;
if (isset($blockednavs['blockfull'][$link])) return true;
reset($blockednavs['blockpartial']);
while (list($l,$dummy)=each($blockednavs['blockpartial'])){
$shouldblock = false;
if (substr($link,0,strlen($l))==$l) {
if (isset($blockednavs['unblockfull'][$link]) &&
$blockednavs['unblockfull'][$link]) return false;
reset($blockednavs['unblockpartial']);
while (list($l2,$dummy)= each($blockednavs['unblockpartial'])){
if (substr($link,0,strlen($l2))==$l2){
return false;
}
}
return true;
}
}
return false;
}
/**
* Determine how many navs are available
*
* @param string $section The nav section to check
* @return int
*/
function count_viable_navs($section)
{
global $navbysection, $blockednavs;
if (isset($blockednavs['blockcat'][$section]) && $blockednavs['blockcat'][$section] == true) {
return 0;
}
$count = 0;
$val = $navbysection[$section];
reset($val);
if (count($val) > 0) {
while(list($k, $nav) = each($val)) {
if (is_array($nav) && count($nav) > 0) {
$link = $nav[1]; // [0] is the text, [1] is the link
if (!is_blocked($link)) $count++;
}
}
}
return $count;
}
/**
* Determins if there are any navs for the player
*
* @return bool
*/
function checknavs() {
global $navbysection, $session;
// If we already have navs entered (because someone stuck raw links in)
// just return true;
if (is_array($session['allowednavs']) &&
count($session['allowednavs']) > 0) return true;
// If we have any links which are going to be stuck in, return true
reset($navbysection);
while(list($key, $val) = each($navbysection)) {
if (count_viable_navs($key) > 0) {
reset($val);
while(list($k, $v) = each($val)) {
if (is_array($v) && count($v) > 0) return true;
}
}
}
// We have no navs.
return false;
}
/**
* Builds navs for display
*
* @return string Output formatted navs
*/
function buildnavs(){
global $navbysection, $navschema, $session, $navnocollapse;
reset($navbysection);
$builtnavs="";
while (list($key,$val)=each($navbysection)){
$tkey = $key;
$navbanner="";
if (count_viable_navs($key)>0){
if ($key>"") {
if ($session['loggedin']) tlschema($navschema[$key]);
if (substr($key,0,7)=="!array!"){
$key = unserialize(substr($key,7));
}
$navbanner = private_addnav($key);
if ($session['loggedin']) tlschema();
}
$style = "default";
$collapseheader = "";
$collapsefooter = "";
if ($tkey > "" && (!array_key_exists($tkey,$navnocollapse) || !$navnocollapse[$tkey])) {
// Generate the collapsable section header
$args = array("name"=>"nh-{$key}",
"title"=>($key ? $key : "Unnamed Navs"));
$args = modulehook("collapse-nav{", $args);
if (isset($args['content']))
$collapseheader = $args['content'];
if (isset($args['style']))
$style = $args['style'];
if (!($key > "") && $style == "classic") {
$navbanner = "<TR><TD>";
}
}
reset($val);
$sublinks = "";
while (list($k,$v)=each($val)){
if (is_array($v) && count($v)>0){
$sublinks .= call_user_func_array("private_addnav",$v);
}//end if
}//end while
// Generate the enclosing collapsable section footer
if ($tkey > "" && (!array_key_exists($tkey,$navnocollapse) || !$navnocollapse[$tkey])) {
$args = modulehook("}collapse-nav");
if (isset($args['content']))
$collapsefooter = $args['content'];
}
switch ($style) {
case "classic":
$navbanner = str_replace("</tr>","",$navbanner);
$navbanner = str_replace("</td>","",$navbanner);
// Build the nav section
$builtnavs .= "{$navbanner}{$collapseheader}<TABLE align='left'>{$sublinks}</TABLE>{$collapsefooter}</TR></TD>\n";
break;
case "default":
default:
// Is style isn't set (should the module not be active)
// - this catches it
// Build the nav section
$builtnavs .= "{$navbanner}{$collapseheader}{$sublinks}{$collapsefooter}\n";
break;
}
}//end if
}//end while
$navbysection = array();
return $builtnavs;
}//end function
$accesskeys=array();
$quickkeys=array();
/**
* Private functions (Undocumented)
*
* @param string $text
* @param string $link
* @param bool $priv
* @param bool $pop
* @param bool $popsize
* @return mixed
*/
function private_addnav($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
//don't call this directly please. I'll break your thumbs if you do.
global $nav,$session,$accesskeys,$REQUEST_URI,$quickkeys,$navschema,$notranslate;
if (is_blocked($link)) return false;
$thisnav = "";
$unschema = 0;
$translate=true;
if (isset($notranslate))
if (in_array(array($text,$link),$notranslate)) $translate=false;
if (is_array($text)){
if ($text[0] && $session['loggedin']) {
if ($link === false) $schema = "!array!" . serialize($text);
else $schema = $text[0];
if ($translate) {
tlschema($navschema[$schema]);
$unschema = 1;
}
}
if ($link != "!!!addraw!!!") {
if ($translate) $text[0] = translate($text[0]);
$text = call_user_func_array("sprintf",$text);
} else {
$text = call_user_func_array("sprintf",$text);
}
}else{
if ($text && $session['loggedin'] && $translate) {
tlschema($navschema[$text]);
$unschema = 1;
}
if ($link != "!!!addraw!!!" && $text>"" && $translate) $text = translate($text); //leave the hack in here for now, use addnav_notl please
}
$extra="";
$ignoreuntil="";
if ($link===false){
$text = holidayize($text,'nav');
$thisnav.=tlbutton_pop().templatereplace("navhead",array("title"=>appoencode($text,$priv)));
}elseif ($link === "") {
$text = holidayize($text,'nav');
$thisnav.=tlbutton_pop().templatereplace("navhelp",array("text"=>appoencode($text,$priv)));
} elseif ($link == "!!!addraw!!!") {
$thisnav .= $text;
}else{
if ($text!=""){
$extra="";
if (strpos($link,"?")){
$extra="&c={$session['counter']}";
}else{
$extra="?c={$session['counter']}";
}
$extra.="-".date("His");
//hotkey for the link.
$key="";
if ($text[1]=="?") {
// check to see if a key was specified up front.
$hchar = strtolower($text[0]);
if ($hchar==' ' || array_key_exists($hchar,$accesskeys) && $accesskeys[$hchar]==1){
$text = substr($text,2);
$text = holidayize($text,'nav');
if ($hchar == ' ') $key = " ";
}else{
$key = $text[0];
$text = substr($text,2);
$text = holidayize($text,'nav');
$found=false;
$text_len = strlen($text);
for ($i=0;$i<$text_len; ++$i){
$char = $text[$i];
if ($ignoreuntil == $char){
$ignoreuntil="";
}else{
if ($ignoreuntil<>""){
if ($char=="<") $ignoreuntil=">";
if ($char=="&") $ignoreuntil=";";
if ($char=="`") $ignoreuntil=$text[$i+1];
}else{
if ($char==$key) {
$found=true;
break;
}
}
}
}
if ($found==false) {
//the hotkey for this link wasn't actually in the
//text, prepend it in parens.
if (strpos($text, "__") !== false) {
$text=str_replace("__", "(".$key.") ", $text);
}else{
$text="(".strtoupper($key).") ".$text;
}
$i=strpos($text, $key);
}
}
} else {
$text = holidayize($text,'nav');
}
if ($key==""){
//we have no previously defined key. Look for a new one.
for ($i=0;$i<strlen($text); $i++){
$char = substr($text,$i,1);
if ($ignoreuntil == $char) {
$ignoreuntil="";
}else{
if ((isset($accesskeys[strtolower($char)]) && $accesskeys[strtolower($char)]==1) || (strpos("abcdefghijklmnopqrstuvwxyz0123456789", strtolower($char)) === false) || $ignoreuntil<>"") {
if ($char=="<") $ignoreuntil=">";
if ($char=="&") $ignoreuntil=";";
if ($char=="`") $ignoreuntil=substr($text,$i+1,1);
}else{
break;
}
}
}
}
if (!isset($i)) $i=0;
if ($i<strlen($text) && $key != ' '){
$key=substr($text,$i,1);
$accesskeys[strtolower($key)]=1;
$keyrep=" accesskey=\"$key\" ";
}else{
$key="";
$keyrep="";
}
if ($key=="" || $key==" "){
}else{
$pattern1 = "/^" . preg_quote($key, "/") . "/";
$pattern2 = "/([^`])" . preg_quote($key, "/") . "/";
$rep1 = "`H$key`H";
$rep2 = "\$1`H$key`H";
$text = preg_replace($pattern1, $rep1, $text, 1);
if (strpos($text, "`H") === false) {
$text = preg_replace($pattern2, $rep2, $text, 1);
}
if ($pop){
if ($popsize==""){
$quickkeys[$key]="window.open('$link')";
}else{
$quickkeys[$key]=popup($link,$popsize);
}
}else{
$quickkeys[$key]="window.location='$link$extra'";
}
}
$n= templatereplace("navitem",array(
"text"=>appoencode($text,$priv),
"link"=>HTMLEntities($link.($pop!=true?$extra:""), ENT_COMPAT, getsetting("charset", "ISO-8859-1")),
"accesskey"=>$keyrep,
"popup"=>($pop==true ? "target='_blank'".($popsize>""?" onClick=\"".popup($link,$popsize)."; return false;\"":"") : "")
));
$n = str_replace("<a ",tlbutton_pop()."<a ",$n);
$thisnav.=$n;
}
$session['allowednavs'][$link.$extra]=true;
$session['allowednavs'][str_replace(" ", "%20", $link).$extra]=true;
$session['allowednavs'][str_replace(" ", "+", $link).$extra]=true;
if (($pos = strpos($link, "#")) !== false) {
$sublink = substr($link, 0, $pos);
$session['allowednavs'][$sublink.$extra]=true;
}
}
if ($unschema) tlschema();
$nav .= $thisnav;
return $thisnav;
}
/**
* Determine how many navs are available
*
* @return int The number of legal navs
*/
function navcount(){
//returns count of total navs added, be it they are pending addition or
//actually added.
global $session,$navbysection;
$c=count($session['allowednavs']);
reset($navbysection);
while (list($key,$val)=each($navbysection)){
if (is_array($val)) $c+=count($val);
}
reset($navbysection);
return $c;
}
/**
* Reset and wipe the navs
*
*/
function clearnav(){
$session['allowednavs']=array();
}
/**
* Reset the output and wipe the navs
*
*/
function clearoutput(){
global $output,$nestedtags,$header,$nav,$session;
clearnav();
$output="";
unset($nestedtags);
$header="";
$nav="";
}
?>