Empty commit

This commit is contained in:
Git 2013-05-29 08:00:51 +00:00
parent 07804af8e4
commit b7ca8d3cf6
34 changed files with 136 additions and 1504 deletions

View File

@ -1,45 +0,0 @@
<?
class Collages {
public static function get_comment_count($CollageID) {
global $DB, $Cache;
$NumComments = $Cache->get_value('collage_comments_'.$CollageID);
if ($NumComments === false) {
$DB->query("SELECT COUNT(ID) FROM collages_comments WHERE CollageID = '$CollageID'");
list($NumComments) = $DB->next_record();
$Cache->cache_value('collage_comments_'.$CollageID, $NumComments, 0);
}
return $NumComments;
}
public static function get_comment_catalogue($CollageID, $CatalogueID) {
global $DB, $Cache;
$Catalogue = $Cache->get_value('collage_comments_'.$CollageID.'_catalogue_'.$CatalogueID);
if ($Catalogue === false) {
$CatalogueLimit = $CatalogueID * THREAD_CATALOGUE . ', ' . THREAD_CATALOGUE;
$DB->query("
SELECT
ID,
UserID,
Time,
Body
FROM collages_comments
WHERE CollageID = '$CollageID'
LIMIT $CatalogueLimit");
$Catalogue = $DB->to_array(false, MYSQLI_ASSOC);
$Cache->cache_value('collage_comments_'.$CollageID.'_catalogue_'.$CatalogueID, $Catalogue, 0);
}
return $Catalogue;
}
public static function increase_subscriptions($CollageID) {
global $DB;
$DB->query("UPDATE collages SET Subscribers = Subscribers + 1 WHERE ID = '$CollageID'");
}
public static function decrease_subscriptions($CollageID) {
global $DB;
$DB->query("UPDATE collages SET Subscribers = IF(Subscribers < 1, 0, Subscribers - 1) WHERE ID = '$CollageID'");
}
}

View File

@ -1,27 +0,0 @@
<?php
class Reports {
/**
* This function formats a string containing a torrent's remaster information
* to be used in Reports v2.
*
* @param boolean $Remastered - whether the torrent contains remaster information
* @param string $RemasterTitle - the title of the remaster information
* @param string $RemasterYear - the year of the remaster information
*/
public static function format_reports_remaster_info($Remastered, $RemasterTitle, $RemasterYear) {
if ($Remastered) {
$RemasterDisplayString = ' &lt;';
if ($RemasterTitle != '' && $RemasterYear != '') {
$RemasterDisplayString .= "$RemasterTitle - $RemasterYear";
} else if ($RemasterTitle != '' && $RemasterYear == '') {
$RemasterDisplayString .= $RemasterTitle;
} else if ($RemasterTitle == '' && $RemasterYear != '') {
$RemasterDisplayString .= $RemasterYear;
}
$RemasterDisplayString .= '&gt;';
} else {
$RemasterDisplayString = '';
}
return $RemasterDisplayString;
}
}

View File

@ -1,700 +0,0 @@
<?
class TEXT_2 {
// tag=>max number of attributes
private $ValidTags = array('b'=>0, 'u'=>0, 'i'=>0, 's'=>0, '*'=>0, 'artist'=>0, 'user'=>0, 'n'=>0, 'inlineurl'=>0, 'inlinesize'=>1, 'align'=>1, 'color'=>1, 'colour'=>1, 'size'=>1, 'url'=>1, 'img'=>1, 'quote'=>1, 'pre'=>1, 'code'=>1, 'tex'=>0, 'hide'=>1, 'plain'=>0
);
private $Smileys = array(
':angry:' => 'angry.gif',
':-D' => 'biggrin.gif',
':D' => 'biggrin.gif',
':|' => 'blank.gif',
':-|' => 'blank.gif',
':blush:' => 'blush.gif',
':cool:' => 'cool.gif',
':&#39;(' => 'crying.gif',
':crying:' => 'crying.gif',
'&gt;.&gt;' => 'eyesright.gif',
':frown:' => 'frown.gif',
'&lt;3' => 'heart.gif',
':unsure:' => 'hmm.gif',
':\\' => 'hmm.gif',
':whatlove:' => 'ilu.gif',
':lol:' => 'laughing.gif',
':loveflac:' => 'loveflac.gif',
':ninja:' => 'ninja.gif',
':no:' => 'no.gif',
':nod:' => 'nod.gif',
':ohno:' => 'ohnoes.gif',
':ohnoes:' => 'ohnoes.gif',
':omg:' => 'omg.gif',
':o' => 'ohshit.gif',
':O' => 'ohshit.gif',
':paddle:' => 'paddle.gif',
':(' => 'sad.gif',
':-(' => 'sad.gif',
':shifty:' => 'shifty.gif',
':sick:' => 'sick.gif',
':)' => 'smile.gif',
':-)' => 'smile.gif',
':sorry:' => 'sorry.gif',
':thanks:' => 'thanks.gif',
':P' => 'tongue.gif',
':-P' => 'tongue.gif',
':-p' => 'tongue.gif',
':wave:' => 'wave.gif',
';-)' => 'wink.gif',
':wink:' => 'wink.gif',
':creepy:' => 'creepy.gif',
':worried:' => 'worried.gif',
':wtf:' => 'wtf.gif',
':wub:' => 'wub.gif',
);
private $NoImg = 0; // If images should be turned into URLs
private $Levels = 0; // If images should be turned into URLs
function __construct() {
foreach ($this->Smileys as $Key=>$Val) {
$this->Smileys[$Key] = '<img border="0" src="'.STATIC_SERVER.'common/smileys/'.$Val.'" alt="" />';
}
reset($this->Smileys);
}
function full_format($Str) {
$Str = display_str($Str);
//Inline links
$URLPrefix = '(\[url\]|\[url\=|\[img\=|\[img\])';
$Str = preg_replace('/'.$URLPrefix.'\s+http/i', '$1http', $Str);
$Str = preg_replace('/(?<!'.$URLPrefix.')http(s)?:\/\//i', '$1[inlineurl]http$2://', $Str);
// For anonym.to and archive.org links, remove any [inlineurl] in the middle of the link
$Str = strtr($Str, array('?[inlineurl]http'=>'?http', '=[inlineurl]http'=>'=http'));
$callback = create_function('$matches', 'return str_replace("[inlineurl]","",$matches[0]);');
$Str = preg_replace_callback('/(?<=\[inlineurl\]|'.$URLPrefix.')(\S*\[inlineurl\]\S*)/m', $callback, $Str);
$Str = preg_replace('/\=\=\=\=([^=].*)\=\=\=\=/i', '[inlinesize=3]$1[/inlinesize]', $Str);
$Str = preg_replace('/\=\=\=([^=].*)\=\=\=/i', '[inlinesize=5]$1[/inlinesize]', $Str);
$Str = preg_replace('/\=\=([^=].*)\=\=/i', '[inlinesize=7]$1[/inlinesize]', $Str);
$Str = $this->parse($Str);
$HTML = $this->to_html($Str);
$HTML = nl2br($HTML);
return $HTML;
}
function strip_bbcode($Str) {
$Str = display_str($Str);
//Inline links
$Str = preg_replace('/(?<!(\[url\]|\[url\=|\[img\=|\[img\]))http(s)?:\/\//i', '$1[inlineurl]http$2://', $Str);
$Str = $this->parse($Str);
$Str = $this->raw_text($Str);
$Str = nl2br($Str);
return $Str;
}
function valid_url($Str, $Extension = '', $Inline = false) {
$Regex = '/^';
$Regex .= '(https?|ftps?|irc):\/\/'; // protocol
$Regex .= '(\w+(:\w+)?@)?'; // user:pass@
$Regex .= '(';
$Regex .= '(([0-9]{1,3}\.){3}[0-9]{1,3})|'; // IP or...
$Regex .= '(([a-z0-9\-\_]+\.)+\w{2,6})'; // sub.sub.sub.host.com
$Regex .= ')';
$Regex .= '(:[0-9]{1,5})?'; // port
$Regex .= '\/?'; // slash?
$Regex .= '(\/?[0-9a-z\-_.,&=@~%\/:;()+|!#]+)*'; // /file
if (!empty($Extension)) {
$Regex.=$Extension;
}
// query string
if ($Inline) {
$Regex .= '(\?([0-9a-z\-_.,%\/\@~&=:;()+*\^$!#|]|\[\d*\])*)?';
} else {
$Regex .= '(\?[0-9a-z\-_.,%\/\@[\]~&=:;()+*\^$!#|]*)?';
}
$Regex .= '(#[a-z0-9\-_.,%\/\@[\]~&=:;()+*\^$!]*)?'; // #anchor
$Regex .= '$/i';
return preg_match($Regex, $Str, $Matches);
}
function local_url($Str) {
$URLInfo = parse_url($Str);
if (!$URLInfo) { return false; }
$Host = $URLInfo['host'];
// If for some reason your site does not require subdomains or contains a directory in the SITE_URL, revert to the line below.
//if ($Host == NONSSL_SITE_URL || $Host == SSL_SITE_URL || $Host == 'www.'.NONSSL_SITE_URL) {
if (preg_match('/(\S+\.)*'.NONSSL_SITE_URL.'/', $Host)) {
$URL = $URLInfo['path'];
if (!empty($URLInfo['query'])) {
$URL.='?'.$URLInfo['query'];
}
if (!empty($URLInfo['fragment'])) {
$URL.='#'.$URLInfo['fragment'];
}
return $URL;
} else {
return false;
}
}
/* How parsing works
Parsing takes $Str, breaks it into blocks, and builds it into $Array.
Blocks start at the beginning of $Str, when the parser encounters a [, and after a tag has been closed.
This is all done in a loop.
EXPLANATION OF PARSER LOGIC
1) Find and parse the next tag (regex)
1a) See if it's a [[wiki-link]] or an ordinary tag, and get the tag name
1b) If it's not a wiki link:
1bi) check it against the $this->ValidTags array to see if it's actually a tag and not [bullshit]
1bii) Get the attribute, if it exists [name=attribute]
If it's [not a tag] or has an invalid attribute, just leave it as plaintext and move on
2) If there aren't any tags left, write everything remaining to a block and return (done parsing)
3) If the next tag isn't where the pointer is, write everything up to there to a text block.
4) Move the pointer past the end of the tag
5) Find out where the tag closes (beginning of [/tag])
5a) Different for different types of tag. Some tags don't close, others are weird like [*]
5b) If it's a normal tag, it may have versions of itself nested inside - e.g.:
[quote=bob]*
[quote=joe]I am a redneck!**[/quote]
Me too!
***[/quote]
If we're at the position *, the first [/quote] tag is denoted by **.
However, our quote tag doesn't actually close there. We must perform
a loop which checks the number of opening [quote] tags, and make sure
they are all closed before we find our final [/quote] tag (***).
5c) Get the contents between [open] and [/close] and call it the block.
In many cases, this will be parsed itself later on, in a new parse() call.
5d) Move the pointer past the end of the [/close] tag.
6) Depending on what type of tag we're dealing with, create an array with the attribute and block.
In many cases, the block may be parsed here itself. Stick them in the $Array.
7) Increment array pointer, start again (past the end of the [/close] tag)
*/
function parse($Str) {
$i = 0; // Pointer to keep track of where we are in $Str
$Len = strlen($Str);
$Array = array();
$ArrayPos = 0;
while ($i < $Len) {
$Block = '';
// 1) Find and parse the next tag (regex)
// [name=|[name]|[[wiki-link]]
$IsTag = preg_match("/((\[[a-zA-Z*]{1,100})([=\]]))|(\[\[[^\n\"'\[\]]+\]\])/", $Str, $Tag, PREG_OFFSET_CAPTURE, $i);
$TagPos = $Tag[0][1];
// At this point we still don't know whether the tag code is valid
// $IsTag will be updated with new information
// 1a) See if it's a [[wiki-link]] or an ordinary tag, and get the tag name
if ($IsTag && !empty($Tag[4][0])) { // Wiki-link
$WikiLink = true;
$TagName = substr($Tag[4][0], 2, -2);
$Attrib = '';
$ExtraTagLen = 0;
} elseif ($IsTag) { // 1b) If it's not a wiki link:
$WikiLink = false;
$TagName = strtolower(substr($Tag[2][0], 1));
$MaxAttribs = $this->ValidTags[$TagName];
// 1bi) check it against the $this->ValidTags array to see if it's actually a tag and not [bullshit]
if (!isset($this->ValidTags[$TagName])) {
$IsTag = 0;
}
// 1bii) Get the attribute, if it exists [name=attribute]
$HasAttrib = ($Tag[3][0] == '=');
if ($IsTag && $HasAttrib) {
$AttribFrom = $TagPos + strlen($Tag[0][0]);
$Attrib = substr($Str, $AttribFrom, strpos($Str, ']', $AttribFrom) - $AttribFrom);
$ExtraTagLen = strlen($Attrib) + 1;
// check $Attrib is valid, i.e. the tag is in a valid format
// disallowed characters
if ((strpos($Attrib, "\n") !== false)
|| (strpos($Attrib, "'") !== false)
|| (strpos($Attrib, "\"") !== false)) {
$IsTag = 0;
} elseif (strpos($Attrib, '[') !== false) {
// attributes aren't allowed to contain any tag (or something which looks like it might be one) inside them
foreach ($this->ValidTags as $PossibleTag=>$_) {
if (strpos($Attrib, '['.$PossibleTag) !== false) {
$IsTag = 0;
}
}
}
} else {
$Attrib = '';
$ExtraTagLen = 0;
}
if (!$IsTag) {
// we jump past the beginning of the "tag", but not the attribute value, as this may contain real tags
$Array[$ArrayPos] = substr($Str, $i, ($TagPos - $i) + strlen($Tag[0][0]));
$i = $TagPos + strlen($Tag[0][0]);
++$ArrayPos;
continue;
}
}
// 2) If there aren't any tags left, write everything remaining to a block
if (!$IsTag) {
// No more tags
$Array[$ArrayPos] = substr($Str, $i);
break;
}
// 3) If the next tag isn't where the pointer is, write everything up to there to a text block.
if ($TagPos > $i) {
$Array[$ArrayPos] = substr($Str, $i, $TagPos - $i);
++$ArrayPos;
$i = $TagPos;
}
// 4) Move the pointer past the end of the tag
$i=$TagPos+strlen($Tag[0][0])+$ExtraTagLen;
// 5) Find out where the tag closes (beginning of [/tag])
// Unfortunately, BBCode doesn't have nice standards like xhtml
// [*], [img=...], and http:// follow different formats
// Thus, we have to handle these before we handle the majority of tags
//5a) Different for different types of tag. Some tags don't close, others are weird like [*]
if ($TagName == 'img' && $HasAttrib) { //[img=...]
$Block = ''; // Nothing inside this tag
// Don't need to touch $i
} elseif ($TagName == 'inlineurl') { // We did a big replace early on to turn http:// into [inlineurl]http://
// Let's say the block can stop at a newline or a space
$CloseTag = strcspn($Str, " \n\r", $i);
if ($CloseTag === false) { // block finishes with URL
$CloseTag = $Len;
}
if (preg_match('/[!;,.?:]+$/',substr($Str, $i, $CloseTag), $Match)) {
$CloseTag -= strlen($Match[0]);
}
$URL = substr($Str, $i, $CloseTag);
if (substr($URL, -1) == ')' && substr_count($URL, '(') < substr_count($URL, ')')) {
$CloseTag--;
$URL = substr($URL, 0, -1);
}
$Block = $URL; // Get the URL
// strcspn returns the number of characters after the offset $i, not after the beginning of the string
// Therefore, we use += instead of the = everywhere else
$i += $CloseTag; // 5d) Move the pointer past the end of the [/close] tag.
} elseif ($WikiLink == true || $TagName == 'n') {
// Don't need to do anything - empty tag with no closing
} elseif ($TagName == '*') {
// We're in a list. Find where it ends
$NewLine = $i;
do { // Look for \n[*]
$NewLine = strpos($Str, "\n", $NewLine + 1);
} while ($NewLine !== false && substr($Str, $NewLine + 1, 3) == '[*]');
$CloseTag = $NewLine;
if ($CloseTag === false) { // block finishes with list
$CloseTag = $Len;
}
$Block = substr($Str, $i, $CloseTag - $i); // Get the list
$i = $CloseTag; // 5d) Move the pointer past the end of the [/close] tag.
} else {
//5b) If it's a normal tag, it may have versions of itself nested inside
$CloseTag = $i - 1;
$InTagPos = $i - 1;
$NumInOpens = 0;
$NumInCloses = -1;
$InOpenRegex = '/\[('.$TagName.')';
if ($MaxAttribs > 0) {
$InOpenRegex.="(=[^\n'\"\[\]]+)?";
}
$InOpenRegex.='\]/i';
// Every time we find an internal open tag of the same type, search for the next close tag
// (as the first close tag won't do - it's been opened again)
do {
$CloseTag = stripos($Str, '[/'.$TagName.']', $CloseTag+1);
if ($CloseTag === false) {
$CloseTag = $Len;
break;
} else {
$NumInCloses++; // Majority of cases
}
// Is there another open tag inside this one?
$OpenTag = preg_match($InOpenRegex, $Str, $InTag, PREG_OFFSET_CAPTURE, $InTagPos + 1);
if (!$OpenTag || $InTag[0][1] > $CloseTag) {
break;
} else {
$InTagPos = $InTag[0][1];
$NumInOpens++;
}
} while ($NumInOpens > $NumInCloses);
// Find the internal block inside the tag
$Block = substr($Str, $i, $CloseTag - $i); // 5c) Get the contents between [open] and [/close] and call it the block.
$i = $CloseTag + strlen($TagName) + 3; // 5d) Move the pointer past the end of the [/close] tag.
}
// 6) Depending on what type of tag we're dealing with, create an array with the attribute and block.
switch ($TagName) {
case 'inlineurl':
$Array[$ArrayPos] = array('Type'=>'inlineurl', 'Attr'=>$Block, 'Val'=>'');
break;
case 'url':
$Array[$ArrayPos] = array('Type'=>'img', 'Attr'=>$Attrib, 'Val'=>$Block);
if (empty($Attrib)) { // [url]http://...[/url] - always set URL to attribute
$Array[$ArrayPos] = array('Type'=>'url', 'Attr'=>$Block, 'Val'=>'');
} else {
$Array[$ArrayPos] = array('Type'=>'url', 'Attr'=>$Attrib, 'Val'=>$this->parse($Block));
}
break;
case 'quote':
$Array[$ArrayPos] = array('Type'=>'quote', 'Attr'=>$this->Parse($Attrib), 'Val'=>$this->parse($Block));
break;
case 'img':
case 'image':
if (empty($Block)) {
$Block = $Attrib;
}
$Array[$ArrayPos] = array('Type'=>'img', 'Val'=>$Block);
break;
case 'aud':
case 'mp3':
case 'audio':
if (empty($Block)) {
$Block = $Attrib;
}
$Array[$ArrayPos] = array('Type'=>'aud', 'Val'=>$Block);
break;
case 'user':
$Array[$ArrayPos] = array('Type'=>'user', 'Val'=>$Block);
break;
case 'artist':
$Array[$ArrayPos] = array('Type'=>'artist', 'Val'=>$Block);
break;
case 'tex':
$Array[$ArrayPos] = array('Type'=>'tex', 'Val'=>$Block);
break;
case 'pre':
case 'code':
case 'plain':
$Block = strtr($Block, array('[inlineurl]'=>''));
$Block = preg_replace('/\[inlinesize\=3\](.*?)\[\/inlinesize\]/i', '====$1====', $Block);
$Block = preg_replace('/\[inlinesize\=5\](.*?)\[\/inlinesize\]/i', '===$1===', $Block);
$Block = preg_replace('/\[inlinesize\=7\](.*?)\[\/inlinesize\]/i', '==$1==', $Block);
$Array[$ArrayPos] = array('Type'=>$TagName, 'Val'=>$Block);
break;
case 'hide':
$Array[$ArrayPos] = array('Type'=>'hide', 'Attr'=>$Attrib, 'Val'=>$this->parse($Block));
break;
case '*':
$Array[$ArrayPos] = array('Type'=>'list');
$Array[$ArrayPos]['Val'] = explode('[*]', $Block);
foreach ($Array[$ArrayPos]['Val'] as $Key=>$Val) {
$Array[$ArrayPos]['Val'][$Key] = $this->parse(trim($Val));
}
break;
case 'n':
$ArrayPos--;
break; // n serves only to disrupt bbcode (backwards compatibility - use [pre])
default:
if ($WikiLink == true) {
$Array[$ArrayPos] = array('Type'=>'wiki','Val'=>$TagName);
} else {
// Basic tags, like [b] or [size=5]
$Array[$ArrayPos] = array('Type'=>$TagName, 'Val'=>$this->parse($Block));
if (!empty($Attrib) && $MaxAttribs > 0) {
$Array[$ArrayPos]['Attr'] = strtolower($Attrib);
}
}
}
$ArrayPos++; // 7) Increment array pointer, start again (past the end of the [/close] tag)
}
return $Array;
}
function to_html($Array) {
$this->Levels++;
if ($this->Levels > 10) {
return $Block['Val'];
} // Hax prevention
$Str = '';
foreach ($Array as $Block) {
if (is_string($Block)) {
$Str.=$this->smileys($Block);
continue;
}
switch ($Block['Type']) {
case 'b':
$Str.='<strong>'.$this->to_html($Block['Val']).'</strong>';
break;
case 'u':
$Str.='<span style="text-decoration: underline;">'.$this->to_html($Block['Val']).'</span>';
break;
case 'i':
$Str.='<em>'.$this->to_html($Block['Val'])."</em>";
break;
case 's':
$Str.='<span style="text-decoration: line-through;">'.$this->to_html($Block['Val']).'</span>';
break;
case 'user':
$Str.='<a href="user.php?action=search&amp;search='.urlencode($Block['Val']).'">'.$Block['Val'].'</a>';
break;
case 'artist':
$Str.='<a href="artist.php?artistname='.urlencode(Format::undisplay_str($Block['Val'])).'">'.$Block['Val'].'</a>';
break;
case 'wiki':
$Str.='<a href="wiki.php?action=article&amp;name='.urlencode($Block['Val']).'">'.$Block['Val'].'</a>';
break;
case 'tex':
$Str.='<img style="vertical-align: middle;" src="'.STATIC_SERVER.'blank.gif" onload="if (this.src.substr(this.src.length-9,this.src.length) == \'blank.gif\') { this.src = \'http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chl='.urlencode(mb_convert_encoding($Block['Val'],"UTF-8","HTML-ENTITIES")).'&amp;chco=\' + hexify(getComputedStyle(this.parentNode,null).color); }" />';
break;
case 'plain':
$Str.=$Block['Val'];
break;
case 'pre':
$Str.='<pre>'.$Block['Val'].'</pre>';
break;
case 'code':
$Str.='<code>'.$Block['Val'].'</code>';
break;
case 'list':
$Str.='<ul>';
foreach ($Block['Val'] as $Line) {
$Str.='<li>'.$this->to_html($Line).'</li>';
}
$Str.='</ul>';
break;
case 'align':
$ValidAttribs = array('left', 'center', 'right');
if (!in_array($Block['Attr'], $ValidAttribs)) {
$Str.='[align='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/align]';
} else {
$Str.='<div style="text-align: '.$Block['Attr'].';">'.$this->to_html($Block['Val']).'</div>';
}
break;
case 'color':
case 'colour':
$ValidAttribs = array('aqua', 'black', 'blue', 'fuchsia', 'green', 'grey', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow');
if (!in_array($Block['Attr'], $ValidAttribs) && !preg_match('/^#[0-9a-f]{6}$/', $Block['Attr'])) {
$Str.='[color='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/color]';
} else {
$Str.='<span style="color: '.$Block['Attr'].';">'.$this->to_html($Block['Val']).'</span>';
}
break;
case 'inlinesize':
case 'size':
$ValidAttribs = array('1','2','3','4','5','6','7','8','9','10');
if (!in_array($Block['Attr'], $ValidAttribs)) {
$Str.='[size='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/size]';
} else {
$Str.='<span class="size'.$Block['Attr'].'">'.$this->to_html($Block['Val']).'</span>';
}
break;
case 'quote':
$this->NoImg++; // No images inside quote tags
if (!empty($Block['Attr'])) {
$Str.='<strong>'.$this->to_html($Block['Attr']).'</strong> wrote: ';
}
$Str.='<blockquote>'.$this->to_html($Block['Val']).'</blockquote>';
$this->NoImg--;
break;
case 'hide':
$Str.='<strong>'.(($Block['Attr']) ? $Block['Attr'] : 'Hidden text').'</strong>: <a href="javascript:void(0);" onclick="BBCode.spoiler(this);">Show</a>';
$Str.='<blockquote class="hidden spoiler">'.$this->to_html($Block['Val']).'</blockquote>';
break;
case 'img':
if ($this->NoImg > 0 && $this->valid_url($Block['Val'])) {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a> (image)';
break;
}
if (!$this->valid_url($Block['Val'], '\.(jpe?g|gif|png|bmp|tiff)')) {
$Str.='[img]'.$Block['Val'].'[/img]';
} else {
$Str.='<img style="max-width: 500px;" onclick="lightbox.init(this,500);" alt="'.$Block['Val'].'" src="'.ImageTools::process($Block['Val']).'" />';
}
break;
case 'aud':
if ($this->NoImg > 0 && $this->valid_url($Block['Val'])) {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a> (audio)';
break;
}
if (!$this->valid_url($Block['Val'], '\.(mp3|ogg|wav)')) {
$Str.='[aud]'.$Block['Val'].'[/aud]';
} else {
//TODO: Proxy this for staff?
$Str.='<audio controls="controls" src="'.$Block['Val'].'"><a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a></audio>';
}
break;
case 'url':
// Make sure the URL has a label
if (empty($Block['Val'])) {
$Block['Val'] = $Block['Attr'];
$NoName = true; // If there isn't a Val for this
} else {
$Block['Val'] = $this->to_html($Block['Val']);
$NoName = false;
}
if (!$this->valid_url($Block['Attr'])) {
$Str.='[url='.$Block['Attr'].']'.$Block['Val'].'[/url]';
} else {
$LocalURL = $this->local_url($Block['Attr']);
if ($LocalURL) {
if ($NoName) {
$Block['Val'] = substr($LocalURL,1);
}
$Str.='<a href="'.$LocalURL.'">'.$Block['Val'].'</a>';
} else {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Attr'].'">'.$Block['Val'].'</a>';
}
}
break;
case 'inlineurl':
if (!$this->valid_url($Block['Attr'], '', true)) {
$Array = $this->parse($Block['Attr']);
$Block['Attr'] = $Array;
$Str.=$this->to_html($Block['Attr']);
}
else {
$LocalURL = $this->local_url($Block['Attr']);
if ($LocalURL) {
$Str.='<a href="'.$LocalURL.'">'.substr($LocalURL,1).'</a>';
} else {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Attr'].'">'.$Block['Attr'].'</a>';
}
}
break;
}
}
$this->Levels--;
return $Str;
}
function raw_text($Array) {
$Str = '';
foreach ($Array as $Block) {
if (is_string($Block)) {
$Str.=$Block;
continue;
}
switch ($Block['Type']) {
case 'b':
case 'u':
case 'i':
case 's':
case 'color':
case 'size':
case 'quote':
case 'align':
$Str.=$this->raw_text($Block['Val']);
break;
case 'tex': //since this will never strip cleanly, just remove it
break;
case 'artist':
case 'user':
case 'wiki':
case 'pre':
case 'code':
case 'aud':
case 'img':
$Str.=$Block['Val'];
break;
case 'list':
foreach ($Block['Val'] as $Line) {
$Str.='*'.$this->raw_text($Line);
}
break;
case 'url':
// Make sure the URL has a label
if (empty($Block['Val'])) {
$Block['Val'] = $Block['Attr'];
} else {
$Block['Val'] = $this->raw_text($Block['Val']);
}
$Str.=$Block['Val'];
break;
case 'inlineurl':
if (!$this->valid_url($Block['Attr'], '', true)) {
$Array = $this->parse($Block['Attr']);
$Block['Attr'] = $Array;
$Str.=$this->raw_text($Block['Attr']);
}
else {
$Str.=$Block['Attr'];
}
break;
}
}
return $Str;
}
function smileys($Str) {
global $LoggedUser;
if (!empty($LoggedUser['DisableSmileys'])) {
return $Str;
}
$Str = strtr($Str, $this->Smileys);
return $Str;
}
}
/*
//Uncomment this part to test the class via command line:
function display_str($Str) {return $Str;}
function check_perms($Perm) {return true;}
$Str = "hello
[pre]http://anonym.to/?http://whatshirts.portmerch.com/
====hi====
===hi===
==hi==[/pre]
====hi====
hi";
$Text = NEW TEXT;
echo $Text->full_format($Str);
echo "\n"
*/
?>

View File

@ -1,663 +0,0 @@
<?
class TEXT_3 {
// tag=>max number of attributes
private $ValidTags = array('b'=>0, 'u'=>0, 'i'=>0, 's'=>0, '*'=>0, 'artist'=>0, 'user'=>0, 'n'=>0, 'inlineurl'=>0, 'inlinesize'=>1, 'align'=>1, 'color'=>1, 'colour'=>1, 'size'=>1, 'url'=>1, 'img'=>1, 'quote'=>1, 'pre'=>1, 'tex'=>0, 'hide'=>1, 'plain'=>0
);
private $Smileys = array(
':angry:' => 'angry.gif',
':-D' => 'biggrin.gif',
':D' => 'biggrin.gif',
':|' => 'blank.gif',
':-|' => 'blank.gif',
':blush:' => 'blush.gif',
':cool:' => 'cool.gif',
':\'(' => 'crying.gif',
'&gt;.&gt;' => 'eyesright.gif',
':frown:' => 'frown.gif',
'&lt;3' => 'heart.gif',
':unsure:' => 'hmm.gif',
':whatlove:' => 'ilu.gif',
':lol:' => 'laughing.gif',
':loveflac:' => 'loveflac.gif',
':ninja:' => 'ninja.gif',
':no:' => 'no.gif',
':nod:' => 'nod.gif',
':ohno:' => 'ohnoes.gif',
':ohnoes:' => 'ohnoes.gif',
':omg:' => 'omg.gif',
':o' => 'ohshit.gif',
':O' => 'ohshit.gif',
':paddle:' => 'paddle.gif',
':(' => 'sad.gif',
':-(' => 'sad.gif',
':shifty:' => 'shifty.gif',
':sick:' => 'sick.gif',
':)' => 'smile.gif',
':-)' => 'smile.gif',
':sorry:' => 'sorry.gif',
':thanks:' => 'thanks.gif',
':P' => 'tongue.gif',
':-P' => 'tongue.gif',
':-p' => 'tongue.gif',
':wave:' => 'wave.gif',
':wink:' => 'wink.gif',
':creepy:' => 'creepy.gif',
':worried:' => 'worried.gif',
':wtf:' => 'wtf.gif',
':wub:' => 'wub.gif'
);
private $NoImg = 0; // If images should be turned into URLs
private $Levels = 0; // If images should be turned into URLs
function __construct() {
foreach ($this->Smileys as $Key=>$Val) {
$this->Smileys[$Key] = '<img border="0" src="'.STATIC_SERVER.'common/smileys/'.$Val.'" alt="" />';
}
reset($this->Smileys);
}
function full_format($Str) {
$Str = display_str($Str);
//Inline links
$Str = preg_replace('/(?<!(\[url\]|\[url\=|\[img\=|\[img\]))http(s)?:\/\//i', '$1[inlineurl]http$2://', $Str);
// For anonym.to links. We can't have this in the regex because PHP freaks out at the ?, even if it's escaped
$Str = strtr($Str, array('?[inlineurl]http'=>'?http', '=[inlineurl]http'=>'=http'));
$Str = preg_replace('/\=\=\=\=([^=].*)\=\=\=\=/i', '[inlinesize=3]$1[/inlinesize]', $Str);
$Str = preg_replace('/\=\=\=([^=].*)\=\=\=/i', '[inlinesize=5]$1[/inlinesize]', $Str);
$Str = preg_replace('/\=\=([^=].*)\=\=/i', '[inlinesize=7]$1[/inlinesize]', $Str);
$Str = $this->parse($Str);
$HTML = $this->to_html($Str);
$HTML = nl2br($HTML);
return $HTML;
}
function strip_bbcode($Str) {
$Str = display_str($Str);
//Inline links
$Str = preg_replace('/(?<!(\[url\]|\[url\=|\[img\=|\[img\]))http(s)?:\/\//i', '$1[inlineurl]http$2://', $Str);
$Str = $this->parse($Str);
$Str = $this->raw_text($Str);
$Str = nl2br($Str);
return $Str;
}
function valid_url($Str, $Extension = '', $Inline = false) {
$Regex = '/^';
$Regex .= '(https?|ftps?|irc):\/\/'; // protocol
$Regex .= '(\w+(:\w+)?@)?'; // user:pass@
$Regex .= '(';
$Regex .= '(([0-9]{1,3}\.){3}[0-9]{1,3})|'; // IP or...
$Regex .= '(([a-z0-9\-\_]+\.)+\w{2,6})'; // sub.sub.sub.host.com
$Regex .= ')';
$Regex .= '(:[0-9]{1,5})?'; // port
$Regex .= '\/?'; // slash?
$Regex .= '(\/?[0-9a-z\-_.,&=@~%\/:;()+!#]+)*'; // /file
if (!empty($Extension)) {
$Regex.=$Extension;
}
// query string
if ($Inline) {
$Regex .= '(\?([0-9a-z\-_.,%\/\@~&=:;()+*\^$!#]|\[\d*\])*)?';
} else {
$Regex .= '(\?[0-9a-z\-_.,%\/\@[\]~&=:;()+*\^$!#]*)?';
}
$Regex .= '(#[a-z0-9\-_.,%\/\@[\]~&=:;()+*\^$!]*)?'; // #anchor
$Regex .= '$/i';
return preg_match($Regex, $Str, $Matches);
}
function local_url($Str) {
$URLInfo = parse_url($Str);
if (!$URLInfo) {
return false;
}
$Host = $URLInfo['host'];
// If for some reason your site does not require subdomains or contains a directory in the SITE_URL, revert to the line below.
//if ($Host == NONSSL_SITE_URL || $Host == SSL_SITE_URL || $Host == 'www.'.NONSSL_SITE_URL) {
if (preg_match('/(\S+\.)*'.NONSSL_SITE_URL.'/', $Host)) {
$URL = $URLInfo['path'];
if (!empty($URLInfo['query'])) {
$URL.='?'.$URLInfo['query'];
}
if (!empty($URLInfo['fragment'])) {
$URL.='#'.$URLInfo['fragment'];
}
return $URL;
} else {
return false;
}
}
/* How parsing works
Parsing takes $Str, breaks it into blocks, and builds it into $Array.
Blocks start at the beginning of $Str, when the parser encounters a [, and after a tag has been closed.
This is all done in a loop.
EXPLANATION OF PARSER LOGIC
1) Find the next tag (regex)
1a) If there aren't any tags left, write everything remaining to a block and return (done parsing)
1b) If the next tag isn't where the pointer is, write everything up to there to a text block.
2) See if it's a [[wiki-link]] or an ordinary tag, and get the tag name
3) If it's not a wiki link:
3a) check it against the $this->ValidTags array to see if it's actually a tag and not [bullshit]
If it's [not a tag], just leave it as plaintext and move on
3b) Get the attribute, if it exists [name=attribute]
4) Move the pointer past the end of the tag
5) Find out where the tag closes (beginning of [/tag])
5a) Different for different types of tag. Some tags don't close, others are weird like [*]
5b) If it's a normal tag, it may have versions of itself nested inside - e.g.:
[quote=bob]*
[quote=joe]I am a redneck!**[/quote]
Me too!
***[/quote]
If we're at the position *, the first [/quote] tag is denoted by **.
However, our quote tag doesn't actually close there. We must perform
a loop which checks the number of opening [quote] tags, and make sure
they are all closed before we find our final [/quote] tag (***).
5c) Get the contents between [open] and [/close] and call it the block.
In many cases, this will be parsed itself later on, in a new parse() call.
5d) Move the pointer past the end of the [/close] tag.
6) Depending on what type of tag we're dealing with, create an array with the attribute and block.
In many cases, the block may be parsed here itself. Stick them in the $Array.
7) Increment array pointer, start again (past the end of the [/close] tag)
*/
function parse($Str) {
$i = 0; // Pointer to keep track of where we are in $Str
$Len = strlen($Str);
$Array = array();
$ArrayPos = 0;
while ($i < $Len) {
$Block = '';
// 1) Find the next tag (regex)
// [name(=attribute)?]|[[wiki-link]]
$IsTag = preg_match("/((\[[a-zA-Z*]+)(=(?:[^\n'\"\[\]]|\[\d*\])+)?\])|(\[\[[^\n\"'\[\]]+\]\])/", $Str, $Tag, PREG_OFFSET_CAPTURE, $i);
// 1a) If there aren't any tags left, write everything remaining to a block
if (!$IsTag) {
// No more tags
$Array[$ArrayPos] = substr($Str, $i);
break;
}
// 1b) If the next tag isn't where the pointer is, write everything up to there to a text block.
$TagPos = $Tag[0][1];
if ($TagPos > $i) {
$Array[$ArrayPos] = substr($Str, $i, $TagPos - $i);
++$ArrayPos;
$i = $TagPos;
}
// 2) See if it's a [[wiki-link]] or an ordinary tag, and get the tag name
if (!empty($Tag[4][0])) { // Wiki-link
$WikiLink = true;
$TagName = substr($Tag[4][0], 2, -2);
$Attrib = '';
} else { // 3) If it's not a wiki link:
$WikiLink = false;
$TagName = strtolower(substr($Tag[2][0], 1));
//3a) check it against the $this->ValidTags array to see if it's actually a tag and not [bullshit]
if (!isset($this->ValidTags[$TagName])) {
$Array[$ArrayPos] = substr($Str, $i, ($TagPos - $i) + strlen($Tag[0][0]));
$i = $TagPos + strlen($Tag[0][0]);
++$ArrayPos;
continue;
}
$MaxAttribs = $this->ValidTags[$TagName];
// 3b) Get the attribute, if it exists [name=attribute]
if (!empty($Tag[3][0])) {
$Attrib = substr($Tag[3][0], 1);
} else {
$Attrib = '';
}
}
// 4) Move the pointer past the end of the tag
$i = $TagPos + strlen($Tag[0][0]);
// 5) Find out where the tag closes (beginning of [/tag])
// Unfortunately, BBCode doesn't have nice standards like xhtml
// [*], [img=...], and http:// follow different formats
// Thus, we have to handle these before we handle the majority of tags
//5a) Different for different types of tag. Some tags don't close, others are weird like [*]
if ($TagName == 'img' && !empty($Tag[3][0])) { //[img=...]
$Block = ''; // Nothing inside this tag
// Don't need to touch $i
} elseif ($TagName == 'inlineurl') { // We did a big replace early on to turn http:// into [inlineurl]http://
// Let's say the block can stop at a newline or a space
$CloseTag = strcspn($Str, " \n\r", $i);
if ($CloseTag === false) { // block finishes with URL
$CloseTag = $Len;
}
if (preg_match('/[!;,.?:]+$/',substr($Str, $i, $CloseTag), $Match)) {
$CloseTag -= strlen($Match[0]);
}
$URL = substr($Str, $i, $CloseTag);
if (substr($URL, -1) == ')' && substr_count($URL, '(') < substr_count($URL, ')')) {
$CloseTag--;
$URL = substr($URL, 0, -1);
}
$Block = $URL; // Get the URL
// strcspn returns the number of characters after the offset $i, not after the beginning of the string
// Therefore, we use += instead of the = everywhere else
$i += $CloseTag; // 5d) Move the pointer past the end of the [/close] tag.
} elseif ($WikiLink == true || $TagName == 'n') {
// Don't need to do anything - empty tag with no closing
} elseif ($TagName == '*') {
// We're in a list. Find where it ends
$NewLine = $i;
do { // Look for \n[*]
$NewLine = strpos($Str, "\n", $NewLine + 1);
} while ($NewLine !== false && substr($Str, $NewLine+1, 3) == '[*]');
$CloseTag = $NewLine;
if ($CloseTag === false) { // block finishes with list
$CloseTag = $Len;
}
$Block = substr($Str, $i, $CloseTag - $i); // Get the list
$i = $CloseTag; // 5d) Move the pointer past the end of the [/close] tag.
} else {
//5b) If it's a normal tag, it may have versions of itself nested inside
$CloseTag = $i - 1;
$InTagPos = $i - 1;
$NumInOpens = 0;
$NumInCloses = -1;
$InOpenRegex = '/\[('.$TagName.')';
if ($MaxAttribs > 0) {
$InOpenRegex.="(=[^\n'\"\[\]]+)?";
}
$InOpenRegex.='\]/i';
// Every time we find an internal open tag of the same type, search for the next close tag
// (as the first close tag won't do - it's been opened again)
do {
$CloseTag = stripos($Str, '[/'.$TagName.']', $CloseTag+1);
if ($CloseTag === false) {
$CloseTag = $Len;
break;
} else {
$NumInCloses++; // Majority of cases
}
// Is there another open tag inside this one?
$OpenTag = preg_match($InOpenRegex, $Str, $InTag, PREG_OFFSET_CAPTURE, $InTagPos + 1);
if (!$OpenTag || $InTag[0][1] > $CloseTag) {
break;
} else {
$InTagPos = $InTag[0][1];
$NumInOpens++;
}
} while ($NumInOpens > $NumInCloses);
// Find the internal block inside the tag
$Block = substr($Str, $i, $CloseTag - $i); // 5c) Get the contents between [open] and [/close] and call it the block.
$i = $CloseTag + strlen($TagName) + 3; // 5d) Move the pointer past the end of the [/close] tag.
}
// 6) Depending on what type of tag we're dealing with, create an array with the attribute and block.
switch ($TagName) {
case 'inlineurl':
$Array[$ArrayPos] = array('Type'=>'inlineurl', 'Attr'=>$Block, 'Val'=>'');
break;
case 'url':
$Array[$ArrayPos] = array('Type'=>'img', 'Attr'=>$Attrib, 'Val'=>$Block);
if (empty($Attrib)) { // [url]http://...[/url] - always set URL to attribute
$Array[$ArrayPos] = array('Type'=>'url', 'Attr'=>$Block, 'Val'=>'');
} else {
$Array[$ArrayPos] = array('Type'=>'url', 'Attr'=>$Attrib, 'Val'=>$this->parse($Block));
}
break;
case 'quote':
$Array[$ArrayPos] = array('Type'=>'quote', 'Attr'=>$this->Parse($Attrib), 'Val'=>$this->parse($Block));
break;
case 'img':
case 'image':
if (empty($Block)) {
$Block = $Attrib;
}
$Array[$ArrayPos] = array('Type'=>'img', 'Val'=>$Block);
break;
case 'aud':
case 'mp3':
case 'audio':
if (empty($Block)) {
$Block = $Attrib;
}
$Array[$ArrayPos] = array('Type'=>'aud', 'Val'=>$Block);
break;
case 'user':
$Array[$ArrayPos] = array('Type'=>'user', 'Val'=>$Block);
break;
case 'artist':
$Array[$ArrayPos] = array('Type'=>'artist', 'Val'=>$Block);
break;
case 'tex':
$Array[$ArrayPos] = array('Type'=>'tex', 'Val'=>$Block);
break;
case 'pre':
case 'plain':
$Block = strtr($Block, array('[inlineurl]'=>''));
$Block = preg_replace('/\[inlinesize\=3\](.*?)\[\/inlinesize\]/i', '====$1====', $Block);
$Block = preg_replace('/\[inlinesize\=5\](.*?)\[\/inlinesize\]/i', '===$1===', $Block);
$Block = preg_replace('/\[inlinesize\=7\](.*?)\[\/inlinesize\]/i', '==$1==', $Block);
$Array[$ArrayPos] = array('Type'=>$TagName, 'Val'=>$Block);
break;
case 'hide':
$Array[$ArrayPos] = array('Type'=>'hide', 'Attr'=>$Attrib, 'Val'=>$this->parse($Block));
break;
case '*':
$Array[$ArrayPos] = array('Type'=>'list');
$Array[$ArrayPos]['Val'] = explode('[*]', $Block);
foreach ($Array[$ArrayPos]['Val'] as $Key=>$Val) {
$Array[$ArrayPos]['Val'][$Key] = $this->parse(trim($Val));
}
break;
case 'n':
$ArrayPos--;
break; // n serves only to disrupt bbcode (backwards compatibility - use [pre])
default:
if ($WikiLink == true) {
$Array[$ArrayPos] = array('Type'=>'wiki','Val'=>$TagName);
} else {
// Basic tags, like [b] or [size=5]
$Array[$ArrayPos] = array('Type'=>$TagName, 'Val'=>$this->parse($Block));
if (!empty($Attrib) && $MaxAttribs > 0) {
$Array[$ArrayPos]['Attr'] = strtolower($Attrib);
}
}
}
$ArrayPos++; // 7) Increment array pointer, start again (past the end of the [/close] tag)
}
return $Array;
}
function to_html($Array) {
$this->Levels++;
if ($this->Levels > 10) { // Hax prevention
return $Block['Val'];
}
$Str = '';
foreach ($Array as $Block) {
if (is_string($Block)) {
$Str.=$this->smileys($Block);
continue;
}
switch ($Block['Type']) {
case 'b':
$Str.='<strong>'.$this->to_html($Block['Val']).'</strong>';
break;
case 'u':
$Str.='<span style="text-decoration: underline;">'.$this->to_html($Block['Val']).'</span>';
break;
case 'i':
$Str.='<em>'.$this->to_html($Block['Val'])."</em>";
break;
case 's':
$Str.='<span style="text-decoration: line-through">'.$this->to_html($Block['Val']).'</span>';
break;
case 'user':
$Str.='<a href="user.php?action=search&amp;search='.urlencode($Block['Val']).'">'.$Block['Val'].'</a>';
break;
case 'artist':
$Str.='<a href="artist.php?artistname='.urlencode(mb_convert_encoding($Block['Val'],"UTF-8","HTML-ENTITIES")).'">'.$Block['Val'].'</a>';
break;
case 'wiki':
$Str.='<a href="wiki.php?action=article&amp;name='.urlencode($Block['Val']).'">'.$Block['Val'].'</a>';
break;
case 'tex':
$Str.='<img style="vertical-align: middle" src="'.STATIC_SERVER.'blank.gif" onload="if (this.src.substr(this.src.length-9,this.src.length) == \'blank.gif\') { this.src = \'http://chart.apis.google.com/chart?cht=tx&amp;chf=bg,s,FFFFFF00&amp;chl='.urlencode(mb_convert_encoding($Block['Val'],"UTF-8","HTML-ENTITIES")).'&amp;chco=\' + hexify(getComputedStyle(this.parentNode,null).color); }" alt="TeX" />';
break;
case 'plain':
$Str.=$Block['Val'];
break;
case 'pre':
$Str.='<pre>'.$Block['Val'].'</pre>';
break;
case 'list':
$Str.='<ul>';
foreach ($Block['Val'] as $Line) {
$Str.='<li>'.$this->to_html($Line).'</li>';
}
$Str.='</ul>';
break;
case 'align':
$ValidAttribs = array('left', 'center', 'right');
if (!in_array($Block['Attr'], $ValidAttribs)) {
$Str.='[align='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/align]';
} else {
$Str.='<div style="text-align:'.$Block['Attr'].'">'.$this->to_html($Block['Val']).'</div>';
}
break;
case 'color':
case 'colour':
$ValidAttribs = array('aqua', 'black', 'blue', 'fuchsia', 'green', 'grey', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow');
if (!in_array($Block['Attr'], $ValidAttribs) && !preg_match('/^#[0-9a-f]{6}$/', $Block['Attr'])) {
$Str.='[color='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/color]';
} else {
$Str.='<span style="color:'.$Block['Attr'].'">'.$this->to_html($Block['Val']).'</span>';
}
break;
case 'inlinesize':
case 'size':
$ValidAttribs = array('1','2','3','4','5','6','7','8','9','10');
if (!in_array($Block['Attr'], $ValidAttribs)) {
$Str.='[size='.$Block['Attr'].']'.$this->to_html($Block['Val']).'[/size]';
} else {
$Str.='<span class="size'.$Block['Attr'].'">'.$this->to_html($Block['Val']).'</span>';
}
break;
case 'quote':
$this->NoImg++; // No images inside quote tags
if (!empty($Block['Attr'])) {
$Str.='<strong>'.$this->to_html($Block['Attr']).'</strong> wrote: ';
}
$Str.='<blockquote>'.$this->to_html($Block['Val']).'</blockquote>';
$this->NoImg--;
break;
case 'hide':
$Str.='<strong>'.(($Block['Attr']) ? $Block['Attr'] : 'Hidden text').'</strong>: <a href="javascript:void(0);" onclick="BBCode.spoiler(this);">Show</a>';
$Str.='<blockquote class="hidden spoiler">'.$this->to_html($Block['Val']).'</blockquote>';
break;
case 'img':
if ($this->NoImg > 0 && $this->valid_url($Block['Val'])) {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a> (image)';
break;
}
if (!$this->valid_url($Block['Val'], '\.(jpe?g|gif|png|bmp|tiff)')) {
$Str.='[img]'.$Block['Val'].'[/img]';
} else {
$Str.='<img style="max-width: 500px;" onclick="lightbox.init(this,500);" alt="'.$Block['Val'].'" src="'.ImageTools::process($Block['Val']).'" />';
}
break;
case 'aud':
if ($this->NoImg > 0 && $this->valid_url($Block['Val'])) {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a> (audio)';
break;
}
if (!$this->valid_url($Block['Val'], '\.(mp3|ogg|wav)')) {
$Str.='[aud]'.$Block['Val'].'[/aud]';
} else {
//TODO: Proxy this for staff?
$Str.='<audio controls="controls" src="'.$Block['Val'].'"><a rel="noreferrer" target="_blank" href="'.$Block['Val'].'">'.$Block['Val'].'</a></audio>';
}
break;
case 'url':
// Make sure the URL has a label
if (empty($Block['Val'])) {
$Block['Val'] = $Block['Attr'];
$NoName = true; // If there isn't a Val for this
} else {
$Block['Val'] = $this->to_html($Block['Val']);
$NoName = false;
}
if (!$this->valid_url($Block['Attr'])) {
$Str.='[url='.$Block['Attr'].']'.$Block['Val'].'[/url]';
} else {
$LocalURL = $this->local_url($Block['Attr']);
if ($LocalURL) {
if ($NoName) {
$Block['Val'] = substr($LocalURL,1);
}
$Str.='<a href="'.$LocalURL.'">'.$Block['Val'].'</a>';
} else {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Attr'].'">'.$Block['Val'].'</a>';
}
}
break;
case 'inlineurl':
if (!$this->valid_url($Block['Attr'], '', true)) {
$Array = $this->parse($Block['Attr']);
$Block['Attr'] = $Array;
$Str.=$this->to_html($Block['Attr']);
}
else {
$LocalURL = $this->local_url($Block['Attr']);
if ($LocalURL) {
$Str.='<a href="'.$LocalURL.'">'.substr($LocalURL,1).'</a>';
} else {
$Str.='<a rel="noreferrer" target="_blank" href="'.$Block['Attr'].'">'.$Block['Attr'].'</a>';
}
}
break;
}
}
$this->Levels--;
return $Str;
}
function raw_text($Array) {
$Str = '';
foreach ($Array as $Block) {
if (is_string($Block)) {
$Str.=$Block;
continue;
}
switch ($Block['Type']) {
case 'b':
case 'u':
case 'i':
case 's':
case 'color':
case 'size':
case 'quote':
case 'align':
$Str.=$this->raw_text($Block['Val']);
break;
case 'tex': //since this will never strip cleanly, just remove it
break;
case 'artist':
case 'user':
case 'wiki':
case 'pre':
case 'aud':
case 'img':
$Str.=$Block['Val'];
break;
case 'list':
foreach ($Block['Val'] as $Line) {
$Str.='*'.$this->raw_text($Line);
}
break;
case 'url':
// Make sure the URL has a label
if (empty($Block['Val'])) {
$Block['Val'] = $Block['Attr'];
} else {
$Block['Val'] = $this->raw_text($Block['Val']);
}
$Str.=$Block['Val'];
break;
case 'inlineurl':
if (!$this->valid_url($Block['Attr'], '', true)) {
$Array = $this->parse($Block['Attr']);
$Block['Attr'] = $Array;
$Str.=$this->raw_text($Block['Attr']);
}
else {
$Str.=$Block['Attr'];
}
break;
}
}
return $Str;
}
function smileys($Str) {
global $LoggedUser;
if (!empty($LoggedUser['DisableSmileys'])) {
return $Str;
}
$Str = strtr($Str, $this->Smileys);
return $Str;
}
}
/*
//Uncomment this part to test the class via command line:
function display_str($Str) {return $Str;}
function check_perms($Perm) {return true;}
$Str = "hello
[pre]http://anonym.to/?http://whatshirts.portmerch.com/
====hi====
===hi===
==hi==[/pre]
====hi====
hi";
$Text = NEW TEXT;
echo $Text->full_format($Str);
echo "\n"
*/
?>

View File

@ -38,11 +38,7 @@ function compare($X, $Y) {
$RevisionID = false;
}
if ($Data) {
if (!is_array($Data)) {
$Data = unserialize($Data);
}
list($K, list($Name, $Image, $Body, $NumSimilar, $SimilarArray, , , $VanityHouseArtist)) = each($Data);
} else {
if ($RevisionID) {
$sql = "

View File

@ -7,7 +7,8 @@
list($Page, $Limit) = Format::page_limit(NOTIFICATIONS_PER_PAGE);
$Results = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
unt.TorrentID,
unt.UnRead,
unt.FilterID,
@ -50,7 +51,7 @@
}
if (!isset($FilterGroups[$Result['FilterID']])) {
$FilterGroups[$Result['FilterID']] = array();
$FilterGroups[$Result['FilterID']]['FilterLabel'] = $Result['Label'] ? $Result['Label'] : false;
$FilterGroups[$Result['FilterID']]['FilterLabel'] = ($Result['Label'] ? $Result['Label'] : false);
}
array_push($FilterGroups[$Result['FilterID']], $Result);
}

View File

@ -16,7 +16,8 @@
list($Page, $Limit) = Format::page_limit(USERS_PER_PAGE);
$DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
ID,
Username,
Enabled,
@ -42,7 +43,7 @@
'userId' => (int) $UserID,
'username' => $Username,
'donor' => $Donor == 1,
'warned' => ($Warned!='0000-00-00 00:00:00'),
'warned' => ($Warned != '0000-00-00 00:00:00'),
'enabled' => ($Enabled == 2 ? false : true),
'class' => Users::make_class_string($PermissionID)
);

View File

@ -32,9 +32,6 @@ function compare($X, $Y) {
}
if ($Data) {
if (!is_array($Data)) {
$Data = unserialize($Data);
}
list($K, list($Name, $Image, $Body, $NumSimilar, $SimilarArray, , , $VanityHouseArtist)) = each($Data);
} else {
if ($RevisionID) {

View File

@ -45,7 +45,7 @@
}
$Categories = array_keys($Categories);
} else {
$Categories = array(1,2,3,4,5,6,7);
$Categories = array(1, 2, 3, 4, 5, 6, 7);
}
// Ordering
@ -71,7 +71,8 @@
}
$BaseSQL = $SQL = "
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
c.ID,
c.Name,
c.NumTorrents,
@ -88,8 +89,6 @@
$SQL .= " AND bc.UserID = '" . $LoggedUser['ID'] . "'";
}
if (!empty($Search)) {
$SQL .= " AND $Type LIKE '%";
$SQL .= implode("%' AND $Type LIKE '%", $Words);

View File

@ -21,9 +21,6 @@ function compare($X, $Y) {
$Data = $Cache->get_value('collage_'.$CollageID);
if ($Data) {
if (!is_array($Data)) {
$Data = unserialize($Data);
}
list($K, list($Name, $Description, , , $CommentList, $Deleted, $CollageCategoryID, $CreatorID, $Locked, $MaxGroups, $MaxGroupsPerUser)) = each($Data);
} else {
$DB->query("SELECT Name, Description, UserID, Deleted, CategoryID, Locked, MaxGroups, MaxGroupsPerUser FROM collages WHERE ID='$CollageID'");

View File

@ -35,7 +35,8 @@
$Sort = (empty($_GET['sort']) || $_GET['sort'] != 'unread' ? 'Date DESC' : "cu.Unread = '1' DESC, DATE DESC");
$sql = "
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
c.ID,
c.Subject,
cu.Unread,

View File

@ -8,7 +8,8 @@
}
$Words = explode(' ', $Search);
$sql = '
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
ID,
Message,
Time

View File

@ -46,7 +46,8 @@
}
$Reports = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
r.ID,
r.UserID,
um.Username,

View File

@ -124,7 +124,8 @@
$DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
r.ID,
r.ReporterID,
reporter.Username,

View File

@ -37,7 +37,8 @@
//Torrent exists, check it's applicable
$DB->query("
SELECT t.UserID,
SELECT
t.UserID,
t.Time,
tg.ReleaseType,
t.Encoding,
@ -50,7 +51,7 @@
IF(t.Remastered = '1', t.RemasterCatalogueNumber, tg.CatalogueNumber)
FROM torrents AS t
LEFT JOIN torrents_group AS tg ON t.GroupID=tg.ID
WHERE t.ID = ".$TorrentID."
WHERE t.ID = $TorrentID
LIMIT 1");

View File

@ -30,15 +30,19 @@
if (empty($_POST['id']) || !is_number($_POST['id'])) {
error(404);
}
$DB->query("UPDATE ip_bans SET
FromIP=$Start,
ToIP='$End',
Reason='$Notes'
$DB->query("
UPDATE ip_bans
SET
FromIP=$Start,
ToIP='$End',
Reason='$Notes'
WHERE ID='".$_POST['id']."'");
} else { //Create
$DB->query("INSERT INTO ip_bans
(FromIP, ToIP, Reason) VALUES
('$Start','$End', '$Notes')");
$DB->query("
INSERT INTO ip_bans
(FromIP, ToIP, Reason)
VALUES
('$Start','$End', '$Notes')");
}
$Cache->delete_value('ip_bans_'.$IPA);
}
@ -47,7 +51,14 @@
define('BANS_PER_PAGE', '20');
list($Page, $Limit) = Format::page_limit(BANS_PER_PAGE);
$sql = "SELECT SQL_CALC_FOUND_ROWS ID, FromIP, ToIP, Reason FROM ip_bans AS i ";
$sql = "
SELECT
SQL_CALC_FOUND_ROWS
ID,
FromIP,
ToIP,
Reason
FROM ip_bans AS i ";
if (!empty($_REQUEST['notes'])) {
$sql .= "WHERE Reason LIKE '%".db_string($_REQUEST['notes'])."%' ";
@ -68,7 +79,7 @@
$DB->query('SELECT FOUND_ROWS()');
list($Results) = $DB->next_record();
$PageLinks=Format::get_pages($Page,$Results,BANS_PER_PAGE,11);
$PageLinks = Format::get_pages($Page, $Results, BANS_PER_PAGE, 11);
View::show_header('IP Address Bans');
$DB->set_query_id($Bans);
@ -132,8 +143,8 @@
$Row = 'a';
while (list($ID, $Start, $End, $Reason) = $DB->next_record()) {
$Row = ($Row === 'a' ? 'b' : 'a');
$Start=long2ip($Start);
$End=long2ip($End);
$Start = long2ip($Start);
$End = long2ip($End);
?>
<tr class="row<?=$Row?>">
<form class="manage_form" name="ban" action="" method="post">

View File

@ -131,8 +131,8 @@ function compare($X, $Y) {
<div class="box box_image box_image_albumart box_albumart"><!-- .box_albumart deprecated -->
<div class="head">
<strong><?=(count($CoverArt) > 0 ? 'Covers (' . (count($CoverArt) + 1) . ')' : 'Cover')?></strong>
<? if(count($CoverArt) > 0) {
if(empty($LoggedUser['ShowExtraCovers'])) {
for ($Index = 0; $Index <= count($CoverArt); $Index++) { ?>
<span id="cover_controls_<?=($Index)?>"<?=($Index > 0 ? ' style="display: none;"' : '')?>>
<? if ($Index == count($CoverArt)) { ?>
@ -150,7 +150,12 @@ function compare($X, $Y) {
<? } ?>
</span>
<? }
} ?>
} else { ?>
<span>
<a class="brackets show_all_covers" href="#">Hide</a>
</span>
<? }
}?>
</div>
<?
$Index = 0;
@ -169,10 +174,13 @@ function compare($X, $Y) {
<? foreach ($CoverArt as $Cover) {
list($ImageID, $Image, $Summary, $AddedBy) = $Cover;
?>
<div id="cover_div_<?=$Index?>" style="display: none;">
<div id="cover_div_<?=$Index?>" <?=empty($LoggedUser['ShowExtraCovers']) ? 'style="display: none;"' : ""?>>
<p align="center">
<?
$Src = 'src="" data-gazelle-temp-src="' . ImageTools::process($Image, true) . '"';
<? if(empty($LoggedUser['ShowExtraCovers'])) {
$Src = 'src="" data-gazelle-temp-src="' . ImageTools::process($Image, true) . '"';
} else {
$Src = 'src="' . ImageTools::process($Image, true) . '"';
}
?>
<img id="cover_<?=$Index?>" style="max-width: 220px;" <?=$Src?> alt="<?=$Summary?>" onclick="lightbox.init('<?=ImageTools::process($Image)?>',220);" />
</p>

View File

@ -15,7 +15,8 @@
$DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
ud.UserID,
ud.Time
FROM users_downloads AS ud
@ -30,10 +31,19 @@
if (count($UserIDs) > 0) {
$UserIDs = implode(',',$UserIDs);
$DB->query("SELECT uid FROM xbt_snatched WHERE fid='$TorrentID' AND uid IN($UserIDs)");
$DB->query("
SELECT uid
FROM xbt_snatched
WHERE fid='$TorrentID'
AND uid IN($UserIDs)");
$Snatched = $DB->to_array('uid');
$DB->query("SELECT uid FROM xbt_files_users WHERE fid='$TorrentID' AND Remaining=0 AND uid IN($UserIDs)");
$DB->query("
SELECT uid
FROM xbt_files_users
WHERE fid='$TorrentID'
AND Remaining=0
AND uid IN($UserIDs)");
$Seeding = $DB->to_array('uid');
}

View File

@ -91,7 +91,12 @@ function header_link($SortKey, $DefaultWay = 'desc') {
$Results = $DB->to_array(false, MYSQLI_ASSOC, false);
} else {
$DB->query("
SELECT SQL_CALC_FOUND_ROWS unt.TorrentID, unt.UnRead, unt.FilterID, t.GroupID
SELECT
SQL_CALC_FOUND_ROWS
unt.TorrentID,
unt.UnRead,
unt.FilterID,
t.GroupID
FROM users_notify_torrents AS unt
JOIN torrents AS t ON t.ID = unt.TorrentID
WHERE unt.UserID=$UserID".

View File

@ -13,7 +13,8 @@
}
$Result = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
xu.uid,
t.Size,
xu.active,

View File

@ -13,7 +13,8 @@
}
$Result = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
xs.uid,
xs.tstamp
FROM xbt_snatched AS xs

View File

@ -209,7 +209,7 @@ function header_link($SortKey,$DefaultWay="DESC") {
if (empty($_GET['media'])) {
$ExtraWhere .= " AND (
t.LogScore = 100 OR
t.Media IN ('Vinyl','WEB','DVD','Soundboard','Casette','SACD','Blu-ray','DAT')
t.Media IN ('Vinyl','WEB','DVD','Soundboard','Cassette','SACD','Blu-ray','DAT')
)";
} elseif (strtoupper($_GET['media']) == 'CD' && empty($_GET['log'])) {
$ExtraWhere .= " AND t.LogScore = 100";
@ -226,18 +226,22 @@ function header_link($SortKey,$DefaultWay="DESC") {
$GroupBy = 't.ID';
}
if ((empty($_GET['search']) || trim($_GET['search']) == '') && $Order!='Name') {
if ((empty($_GET['search']) || trim($_GET['search']) == '') && $Order != 'Name') {
$SQL = "
SELECT
SQL_CALC_FOUND_ROWS t.GroupID,
SQL_CALC_FOUND_ROWS
t.GroupID,
t.ID AS TorrentID,
$Time AS Time,
tg.CategoryID
FROM $From
JOIN torrents_group AS tg ON tg.ID=t.GroupID
WHERE $UserField='$UserID' $ExtraWhere $SearchWhere
GROUP BY ".$GroupBy."
ORDER BY $Order $Way LIMIT $Limit";
WHERE $UserField='$UserID'
$ExtraWhere
$SearchWhere
GROUP BY $GroupBy
ORDER BY $Order $Way
LIMIT $Limit";
} else {
$DB->query("
CREATE TEMPORARY TABLE temp_sections_torrents_user (
@ -267,7 +271,9 @@ function header_link($SortKey,$DefaultWay="DESC") {
JOIN torrents_group AS tg ON tg.ID=t.GroupID
LEFT JOIN torrents_artists AS ta ON ta.GroupID=tg.ID
LEFT JOIN artists_alias AS aa ON aa.AliasID=ta.AliasID
WHERE $UserField='$UserID' $ExtraWhere $SearchWhere
WHERE $UserField='$UserID'
$ExtraWhere
$SearchWhere
GROUP BY TorrentID, Time");
if (!empty($_GET['search']) && trim($_GET['search']) != '') {
@ -275,8 +281,12 @@ function header_link($SortKey,$DefaultWay="DESC") {
}
$SQL = "
SELECT SQL_CALC_FOUND_ROWS
GroupID, TorrentID, Time, CategoryID
SELECT
SQL_CALC_FOUND_ROWS
GroupID,
TorrentID,
Time,
CategoryID
FROM temp_sections_torrents_user";
if (!empty($Words)) {
$SQL .= "

View File

@ -190,6 +190,8 @@ function checked($Checked) {
<input type="hidden" name="coverart" value="" />
<input type="checkbox" name="coverart" id="coverart"<?=$SiteOptions['CoverArt'] ? ' checked="checked"' : ''?> />
<label for="coverart">Show cover artwork next to torrent information</label>
<input type="checkbox" name="show_extra_covers" id="show_extra_covers"<?=$SiteOptions['ShowExtraCovers'] ? ' checked="checked"' : ''?> />
<label for="show_extra_covers">Show all additional cover art on torrent pages by default</label>
</td>
</tr>
<tr>

View File

@ -25,7 +25,8 @@
$Limit = sprintf("%d, %d", ($Page - 1) * USERS_PER_PAGE, USERS_PER_PAGE);
}
$DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
ID,
Username,
Enabled,

View File

@ -208,6 +208,7 @@
$Options['DisableAutoSave'] = (!empty($_POST['disableautosave']) ? 1 : 0);
$Options['NoVoteLinks'] = (!empty($_POST['novotelinks']) ? 1 : 0);
$Options['CoverArt'] = (int) !empty($_POST['coverart']);
$Options['ShowExtraCovers'] = (int) !empty($_POST['show_extra_covers']);
if (isset($LoggedUser['DisableFreeTorrentTop10'])) {
$Options['DisableFreeTorrentTop10'] = $LoggedUser['DisableFreeTorrentTop10'];

View File

@ -460,7 +460,7 @@ function check_paranoia_here($Setting) {
if (check_perms('users_view_keys',$Class) || $OwnProfile) {
?>
<li>Passkey: <a href="#" onclick="this.innerHTML='<?=display_str($torrent_pass)?>'; return false;" class="brackets">View</a></li>
<li>Passkey: <a href="#" id="passkey" onclick="togglePassKey('<?=display_str($torrent_pass)?>'); return false;" class="brackets">View</a></li>
<? }
if (check_perms('users_view_invites')) {
if (!$InviterID) {

View File

@ -88,7 +88,8 @@ function UnBan(ip, id, elemID) {
if ($UsersOnly == 1) {
$RS = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
h1.IP,
h1.StartTime,
h1.EndTime,
@ -110,7 +111,8 @@ function UnBan(ip, id, elemID) {
LIMIT $Limit");
} else {
$RS = $DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
h1.IP,
h1.StartTime,
h1.EndTime,

View File

@ -21,7 +21,8 @@
}
$sql = "
SELECT
SQL_CALC_FOUND_ROWS f.ID as ForumID,
SQL_CALC_FOUND_ROWS
f.ID as ForumID,
f.Name as ForumName,
t.Title,
q.PageID,

View File

@ -28,7 +28,8 @@
$ShowUnread = (!isset($_GET['showunread']) && !isset($HeavyInfo['SubscriptionsUnread']) || isset($HeavyInfo['SubscriptionsUnread']) && !!$HeavyInfo['SubscriptionsUnread'] || isset($_GET['showunread']) && !!$_GET['showunread']);
$ShowCollapsed = (!isset($_GET['collapse']) && !isset($HeavyInfo['SubscriptionsCollapse']) || isset($HeavyInfo['SubscriptionsCollapse']) && !!$HeavyInfo['SubscriptionsCollapse'] || isset($_GET['collapse']) && !!$_GET['collapse']);
$sql = '
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
MAX(p.ID) AS ID
FROM ( SELECT TopicID
FROM users_subscriptions

View File

@ -39,7 +39,11 @@
}
$DB->query("SELECT info_hash FROM torrents where ID = $TorrentID");
if (list($InfoHash) = $DB->next_record(MYSQLI_NUM, FALSE)) {
$DB->query("UPDATE users_freeleeches SET Expired=TRUE WHERE UserID=$UserID AND TorrentID=$TorrentID");
$DB->query("
UPDATE users_freeleeches
SET Expired=TRUE
WHERE UserID=$UserID
AND TorrentID=$TorrentID");
$Cache->delete_value('users_tokens_'.$UserID);
Tracker::update_tracker('remove_token', array('info_hash' => rawurlencode($InfoHash), 'userid' => $UserID));
}
@ -51,7 +55,8 @@
list($Page, $Limit) = Format::page_limit(25);
$DB->query("
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
f.TorrentID,
t.GroupID,
f.Time,

View File

@ -41,7 +41,8 @@
}
$SQL = "
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
w.ID,
w.Title,
w.Date,

View File

@ -10,7 +10,8 @@
View::show_header($Title);
$sql = "
SELECT SQL_CALC_FOUND_ROWS
SELECT
SQL_CALC_FOUND_ROWS
w.ID,
w.Title,
w.Date,
@ -28,7 +29,7 @@
?>
<div class="thin">
<? if ($Letter) { ?>
<? if ($Letter) { ?>
<div class="header">
<h2><?=$Title?></h2>
</div>
@ -38,15 +39,15 @@
<td>Last updated on</td>
<td>Last edited by</td>
</tr>
<? while (list($ID, $Title, $Date, $UserID) = $DB->next_record()) { ?>
<? while (list($ID, $Title, $Date, $UserID) = $DB->next_record()) { ?>
<tr>
<td><a href="wiki.php?action=article&amp;id=<?=$ID?>"><?=$Title?></a></td>
<td><?=$Date?></td>
<td><?=Users::format_username($UserID, false, false, false)?></td>
</tr>
<? } ?>
<? } ?>
</table>
<? } ?>
<? } ?>
<div class="box pad center">
<p>Search the wiki for user created tutorials and information.</p>
<form class="search_form" name="wiki" action="wiki.php" method="get">

View File

@ -2,6 +2,7 @@
var show_all = false;
var current;
$(document).ready(function() {
show_all = $(".show_all_covers").text() == "Hide";
$(".next_cover").click(function(e) {
e.preventDefault();
var next = $(this).data("gazelle-next-cover");

View File

@ -167,3 +167,12 @@ function userform_submit() {
userform.submit();
};
}
function togglePassKey(key) {
if ($('#passkey').raw().innerHTML == 'View') {
$('#passkey').raw().innerHTML = key;
} else {
$('#passkey').raw().innerHTML = 'View';
}
}