| 
<?php
 error_reporting(E_ALL);
 ini_set('display_errors',1);  # for debug
 
 require_once('SpamChecker.class.php');
 
 /* demo class, only for showing result, not to be used in prod */
 
 class MyAnalyzer extends VowConAnalyzer {
 function HTMLReport() {
 if(!isset($this->TextStats))
 $this->CalcTextStats();
 if(!$this->TextStats)
 return '';  # No data to show, evaluates as "false"
 $Cols = array('Word'=>'word','Groups'=>'groupCount','Max'=>'groupMaxSize',
 'Sum'=>'groupSum','SumSq'=>'groupSumSq',
 'Distinct'=>'distinct','Score'=>'scoreStr');
 $trBG = '<tr style="background-color:'; # Note that < and " are both open
 $tdR = '<td style="text-align:right">';
 $res = '<table border="1"'.
 ' style="border-collapse:collapse;border:solid 1px black;">';
 $res.= $trBG.'#99f"><th>'.
 implode('</th><th>',array_keys($Cols)).
 '</th></tr>';
 foreach($this->words as $word) {
 if(is_numeric($word)) continue;
 if(!trim($word)) continue;
 $w = $this->Stats($word);
 $w->scoreStr = sprintf('%.2f',$w->score);
 $res.= $trBG.
 ($w->score > $this->MaxWordScore ? '#f66':
 ($w->score > $this->BadWordLimit ? '#f96' :
 ($w->score > $this->MaxAvgScore  ? '#ff9' : ''))).';">';
 foreach($Cols as $name=>$prop)
 $res.= (($name=='Word') ? '<td>' : $tdR).$w->$prop.'</td>';
 $res.= '</tr>';
 }
 $dash = $tdR.'-</td>';
 $res.= $trBG.'#99f"><td>Max Score</td>'.$dash.$dash.$dash.$dash.$dash.
 $tdR.sprintf('%.2f',$this->TextStats->MaxScore).'</td></tr>';
 $res.= $trBG.'#99f"><td>Avg Score</td>'.$dash.$dash.$dash.$dash.$dash.
 $tdR.sprintf('%.2f',$this->TextStats->AvgScore).'</td></tr>';
 $res.= $trBG.'#99f"><td>Bad word %</td>'.$dash.$dash.$dash.$dash.$dash.
 $tdR.'<span style="color:'.
 ($this->TextStats->BadPercent > $this->MaxBadPercent ? 'red' : 'green').'">'.
 sprintf('%d',$this->TextStats->BadPercent).'%</span></td></tr>';
 $res.= $trBG.'white">'.
 '<th>Legend</th>'.
 '<td colspan="6">'.
 '<table style="font-size:70%;font-family:Verdana,sans-serif;"><tr>'.
 '<td style="background-color:#f66">   </td>'.
 '<td>Above max word score ('.sprintf('%.2f',$this->MaxWordScore).')</td></tr>'.
 '<td style="background-color:#f96">   </td>'.
 '<td>Above bad word limit ('.sprintf('%.2f',$this->BadWordLimit).')</td></tr>'.
 '<td style="background-color:#ff9">   </td>'.
 '<td>Above max average score ('.sprintf('%.2f',$this->MaxAvgScore).')</td></tr>'.
 '</table>'.
 '</td>'.
 '</tr>';
 $res.= '</table>';
 return $res;
 }
 }
 
 if(count($_REQUEST)) {
 $SpamChk = new SpamChecker(new MyAnalyzer());
 $SpamChk->Ignore('sessionkey'); # example, see SpamChecker_test_1.php
 if(!$SpamChk->Accepted())
 # !! Report displayed for demo/debugging purpouses
 #    In a real app, log & redirect to either:
 # a) error page                       (user friendly but also spammer friendly)
 # b) same page as successfull submit  (stealthy, but possibly misleading for users)
 # c) reload page, displaying error    (perhaps too spammer friendly?)
 # d) site homepage                    (might be the best alternative in some cases)
 die('<h1>Spam detected:</h1>'.
 $SpamChk->VowCon->GetTextStatus().
 $SpamChk->VowCon->HTMLReport());
 }
 
 ?>
 |