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("
$text
"); } 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.=""; else $nestedtags['font']=true; $out.=""; } else { switch($data[$pos]){ case "n": $out.="
\n"; break; case "0": if ($nestedtags['font']) $out.="
"; $nestedtags['font'] = false; break; case "b": if ($nestedtags['b']){ $out.=""; $nestedtags['b']=false; }else{ $nestedtags['b']=true; $out.=""; } break; case "i": if ($nestedtags['i']) { $out.=""; $nestedtags['i']=false; }else{ $nestedtags['i']=true; $out.=""; } break; case "c": if ($nestedtags['div']) { $out.=""; $nestedtags['div']=false; }else{ $nestedtags['div']=true; $out.="
"; } break; case "h": if ($nestedtags['h']) { $out.=""; $nestedtags['h']=false; }else{ $nestedtags['h']=true; $out.=""; } break; case ">": if ($nestedtags['>']){ $nestedtags['>']=false; $out.="
"; }else{ $nestedtags['>']=true; $out.="
"; } break; case "<": if ($nestedtags['<']){ $nestedtags['<']=false; $out.="
"; }else{ $nestedtags['<']=true; $out.="
"; } break; case "H": if ($nestedtags['div']) { $out.=""; $nestedtags['div']=false; }else{ $nestedtags['div']=true; $out.=""; } 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 * ALL internal site links that are displayed MUST 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 = ""; } } 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("","",$navbanner); $navbanner = str_replace("","",$navbanner); // Build the nav section $builtnavs .= "{$navbanner}{$collapseheader}{$sublinks}
{$collapsefooter}\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"") { if ($char=="<") $ignoreuntil=">"; if ($char=="&") $ignoreuntil=";"; if ($char=="`") $ignoreuntil=substr($text,$i+1,1); }else{ break; } } } } if (!isset($i)) $i=0; if ($iappoencode($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("