<?php
// PIM functions (for PmWiki)
// consider adding other related scripts here too (e.g. MemoryRecipe, Recalls, GroupStats, Coeditions, ...)
// http://fabien.benetou.fr/pub/graphformatexporter.php.txt
// http://fabien.benetou.fr/pub/memorization.php.txt
// note that the order is important though
// e.g. currently MemoryRecipe is loaded after thus can't be called here
// add to http://fabien.benetou.fr/repository/
// it would be particularly useful to refactor each properly
// especially since they share variables (e.g. first edit) but also some have better function
// e.g. caching in Coeditions
// change ProcessingJS generation by first producing JSON
// via http://www.php.net/manual/en/function.json-encode.php
// cf http://fabien.benetou.fr/Tools/Processing and http://fabien.benetou.fr/Tools/JavaScript
// this might be even faster on most computers since JS engines are improving
//handle implicit linking
/*
cf http://fabien.benetou.fr/MemoryRecalls/ImprovingPIM#ImplicitLinking
*/
function ImplicitLinking(){
return "list of pages generated on the fly";
}
//$AutoCreate['/\\.GroupStats$/'] = array( 'ctime' => $Now, 'text' => ImplicitLinking());
//$AutoCreate['/^Categora\\./'] = array('ctime' => $Now);
//doesn't work, AutoCreate present in pmwiki.php and example too
// category works though
// TODO try making it global $AutoCreate;
//display working status
// see http://fabien.benetou.fr/Tools/Greasemonkey#VirtualBlinders
Markup("currenttask", "directives", "/\(:currenttask:\)/", GetCurrentTask());
function GetCurrentTask(){
$currenttask = trim(file_get_contents("/home/utopiah/web/benetou.fr/fabien/pub/currenttask"));
if ($currenttask == "")
return "(either available or asleep, Im usually on CET)";
return "[[CognitiveEnvironments/".$currenttask."]]";
}
Markup("timetable", "fulltext", "/\(:timetable:\)/",
"\n||border=1\n||!Time ||!Action ||\n"
.preg_replace("/echo -level HILIGHT -window 1 /","",
preg_replace("/.* (\d+) (\d+).* \/(.*)/","||$1:$2||$3||",file_get_contents("/home/utopiah/.irssi/cron.save"))
)
."");
//load a dedicated edition page for the admin (shouldn't be hard coded but I dont use Auth)
//global $GLOBALS;
if ($GLOBALS['action'] == 'edit' & & ( $GLOBALS['Author'] == 'Fabien' || $GLOBALS['Author'] == 'Utopiah' ) )
{
//TODO fails since moved in cookbook directory, thus added back there
global $SkinDir,$pagename;
LoadPageTemplate($pagename, "$SkinDir/edit.tmpl");
}
//display editions through an horizontal line
/*
fomally done via GnuPlot, cf http://fabien.benetou.fr/Wiki/Visualization#timeline
http://www.scholarpedia.org/article/Spike-response_model is probably too complicated for the small resolution
yet provide interesting non-linear properties
*/
function DisplayVisualEdits($pagename){
global $ScriptUrl, $PubDir, $FarmD;
$processingpath = '/pub/libraries/processing.js';
$processingfile = "/pub/visualization/edits_per_page/$pagename.pjs";
$processinglib = "< script src = \"$processingpath\" type = \"text/javascript\" > < / script > ";
$first_edit = 1212192000;
$now = time();
// draw the timeline from the first edit to now()
// get the list of edits of the current page
// "get inspired" by PrintDiff() in scripts/pagerev.php
$canvaswidth = 600-2*10;
$canvasheight = 10;
$block_width = 4;
$block_height = 8;
$page = ReadPage($pagename);
if (!$page) return;
krsort($page); reset($page);
// newest first
// for each edit
$canvas = "
void setup()
{
size($canvaswidth, $canvasheight);
PFont font;
font = loadFont(\"FFScala-Bold-12.vlw\");
textFont(font);
}
void mouseMoved() {
checkButtons();
}
void mouseDragged() {
checkButtons();
}
void draw()
{
background(251);
fill(0,0,255,20);
noStroke();
";
$mousePressed = "void mousePressed() {";
$destination_link = "$ScriptUrl/".strtr($pagename,".","/")."?action=diff#diff";
$mousePressed .= "\t\tif (lastHovered>0) { link(\"$destination_link\"+lastHovered); }\n";
$checkButtons = "void checkButtons() {";
print $processinglib.'< canvas data-src = "'.$processingfile.'" width = "'.$canvaswidth.'" height = "'.$canvasheight.'" > < / canvas > ';
// set to false to de-activate cache (practical for tests)
$newest_diff = true;
//$newest_diff = false;
//$first_diff = true;
foreach($page as $k=>$v) {
if (!preg_match("/^diff:(\d+):(\d+):?([^:]*)/",$k,$match)) continue;
$diff = $match[1];
$diffclass = $match[3];
if ($diffclass=='minor')
{ $canvas .= "\t\tfill(0,255,0,20);\n"; }
else
{ $canvas .= "\t\tfill(0,0,255,20);\n"; }
//if ($first_diff)
// { $canvas .= "\t\tfill(255,0,0,20);\n"; $first_diff = false;}
$buttonname = "over".$diff."Button";
//$bools .= "boolean $buttonname = false;\n";
if (file_exists($FarmD.$processingfile) & & $newest_diff)
if ( filemtime($FarmD.$processingfile) > $diff)
return;
$newest_diff = false;
// add a sightly transparent tick rectangle with its Unix timestamp link to the diff page
// the mouse over a certain edit should change its color
// see http://processingjs.org/learning/basic/embeddedlinks
// or clicablerects.js via Pomax on :mozilla2/#processing.js (14/05/2011 ~11pm)
$x = round ( ($canvaswidth - $block_width) * ( (($now - $first_edit)-($now-$diff)) / ($now - $first_edit)));
$y = 1;
$checkButtons .= "\t\tif ( mouseX > $x & & mouseX < $x+$block_width) lastHovered = $diff; \n";
// if (mouseY > $y & & mouseY < $y+$block_height) not really required
// others should be set to false else one always jump to the olded diff mouved over
$canvas .= "\t\trect($x,$y,$block_width,$block_height);\n";
}
$canvas .= "\t\tstroke(0,155);\n";
$canvas .= "\t\tfill(0,0,255,80);\n";
$canvas .= "\t\ttext(\"Edits:\",2,10 );\n";
$canvas .= "\t\tfill(0,0,255,40);\n";
for ($year=2009;$year< 2012 ; $ year + + ) { / / each year until now
$unixyear = mktime(0,0,0,1,1,$year);
$x = round ( ($canvaswidth - $block_width) * ( (($now - $first_edit)-($now-$unixyear)) / ($now - $first_edit)));
$y = 0;
$canvas .= "line($x,$y,$x,$y+$block_height+2); text(\"$year\",$x+2,$y+10 );\n";
}
$canvas = $bools . $canvas ."}" . $mousePressed ."}" .$checkButtons . "}";
// load ProcessinJS
$write_result = file_put_contents($FarmD.$processingfile,$canvas);
// print resulting canvas
$older_gnuplot_version = "< div > < center > < img src = \"/pub/visualization/edits_per_page/{$pagename}.png\" alt = \"/pub/visualization/edits_per_page/{$pagename}.png\"/ > < / br > (< a href = \"$ScriptUrl/Wiki/Visualization#timeline\" > visualization details< / a > ).< / center > < / div > < hr / > ";
}
//display images with transparancy invertionnaly proportional to last time of update
// http://fabien.benetou.fr/MemoryRecalls/ImprovingPIM#VisualDecayOfInformation
function DisplayDecay($pagename){
/*
consider
adding threshold
not keeping it linear (e.g. log)
but still constantly inscreasing between 0 and 1
use a factor when matches (e.g. regex changing $impeding_factor or $first_edit)
regex would match groupname (e.g. "Person." with fast decay) or pagename or both (e.g. "Math" with slow decay)
yellowish background, looking like old paper
...rest got deleted by a dumb rm...
*/
global $ScriptUrl;
$first_edit = 1212192000;
$now = time();
//load page
$page = ReadPage($pagename);
if (!$page) return;
$last_edit = $page["time"];
//get last edit
$destination_link = "$ScriptUrl/".strtr($pagename,".","/")."?action=edit";
//use the previous equation adding 1 - ()
$opacity = round ( 1 - ( (($now - $first_edit)-($now-$last_edit)) / ($now - $first_edit)) , 2 );
$opacitymsg = "opacity=$opacity";
if ($opacity > 0.8)
$opacitymsg = "< font color = \"red\" > ".$opacitymsg."< / font > ";
//if user if admin
if ( $GLOBALS['Author'] == 'Fabien' || $GLOBALS['Author'] == 'Utopiah' ) {
//for 1 to a multiplier of value
for ($i=0;$i< $opacity*10;$i++){
// display another visual problem with a link back to improvingwiki#visualdecay
print "< div style = \"opacity:$opacity;position:absolute;top:".rand(60,800)."px;left:".rand(100,500)."px;\" > < a href = \"$destination_link\" > "
.decbin(rand(0,10000))."< / a > < / div > ";
}
// add a good practice msg
print "< div style = \"opacity:$opacity;position:absolute;top:10px;left:450px;width:300px;background-color:gray;\" >
$opacitymsg edits should be done to check if
the informamtion presented is still relevant,
links are working,
opinion expressed still correct, etc.
< / div > ";
}
//print img with opacity + warning message
print "< div style = \"opacity:$opacity;\" > < a name = \"Decay\" > < / a > If you can read this text ($opacitymsg) if means the page has not been edited for a long time. Consequently the information it holds might be deprecated or no longer represent the opinion of this author.< / div > ";
}