You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
misc/cookbook/memory_management.php

180 lines
6.9 KiB

<?php if (!defined('PmWiki')) exit();
/*
Mainly based on PageFeed by Daniel Roesler (diafygi)
http://www.pmwiki.org/wiki/Cookbook/PageFeed
conversation array imported from it
http://fabien.benetou.fr/Wiki/MemoryRecipe
TODO
support the regex syntax function calls as done in groupkeypages.php
clean unused code
test with the W3C that feeds generated are proper
update recipe date and name
transform the default call without argument
abstract the date checking function
and facilitate any pattern
addition, substraction, from list, from math func (e.g. mod), ...
note that if backward compability of files is important the 3 formers can remain empty
but ideally the local/config.php file should be modified
weighting for the composite function should read local PTV
if unsset then use the default behavior
make the content of description easier to change
create a variable at the head of the script
ignore empty date field
else Unix epoch bug
! behavior_recall seems to be the most general
modify it to accept negative -> support of preparation
modify it to accept exp as default -> support of memory-recipe
*/
## Recipe version information
$RecipeInfo['MemoryManagement']['Version'] = '2011-06-20';
## Add action for pagefeed
SDV($HandleActions['memorizationMM'], 'MemorizationMM');
SDV($HandleActions['recallMM'], 'BehaviorRecallMM');
SDV($HandleActions['preparationMM'], 'PreparationMM');
# from http://www.pmwiki.org/wiki/PmWiki/Functions
function FeedTextMM($pagename, &$page, $tag) {
$text = RetrieveAuthSection("ReadingNotes.GroupHeader","");
$content = MarkupToHTML($pagename, $text);
$text = RetrieveAuthSection($pagename, '##Chapter2');
$content .= MarkupToHTML($pagename, $text);
return "<$tag><![CDATA[$content]]></$tag>";
}
function MemorizationMM($pagename, $auth = 'read'){ GenerateFeed(title,description,feedfile,timedirection,pattern); }
function BehaviorRecallMM($pagename, $auth = 'read'){ GenerateFeed(); }
function PreparationMM($pagename, $auth = 'read'){ GenerateFeed(); }
## Create feed from page history
function GenerateFeed() {
# consider defaults : exp, +, ...
global $FarmD, $WikiTitle, $ScriptUrl;
#### location of the resulting feed
$feedfile = $FarmD."/pub/memoryfeeds/recallfeed.xml"; #change to a pattern when support arguments
#$feedfile = $FarmD."/pub/memoryfeeds/memorizationfeed.xml"; #change to a pattern when support arguments
#$feedfile = $FarmD."/pub/memoryfeeds/preparationfeed.xml"; #change to a pattern when support arguments
if (!file_exists($feedfile)){
if (!touch($feedfile)){
print "Creation of the feed file fails, check write permissions for pmWiki and $feedfile.\nMake sure the target directory exists and with the right write permissions.";
return;
}
}
# open $feed as read
$feed_oldcontent = file_get_contents($feedfile);
$feed_newcontent = '';
#### patterns to use
$exponential_pattern = array(1,10,30,60,120,350,700,1500,3000,7000,15000,30000,100000); //exp
$monthly_pattern = array(1,30,60,90,120,150,180,210,240,270,300); //mod30
$weekly_pattern = array(1,7,14,21,28,35,43,50,57,64,71,78,85,93,100,101,107,114,121,128,135,143,150,157,164,171,178,185,193,200); //mod7
$daily_pattern = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30); //mod1
#### variables to check value of
$varname='recall';
#$varname='startrecall';
#$varname='startprepare';
$pages = ListPages();
# 2 loops can be probably optimized since they are ordered by date
foreach ($pages as $page) {
if ( isset(PageTextVar($page,$varname)) ) {
$params = explode(" ",$recall);
$patternrecall = $params[1];
$daterecall = $params[0];
switch($patternrecall){
case "daily": $datestorecall = $daily_pattern; break;
case "weekly": $datestorecall = $weekly_pattern; break;
case "monthly": $datestorecall = $monthly_pattern; break;
default: $datestorecall = $exponential_pattern; break;
}
$current_unix_day = strtotime(date("Y-m-d"));
$sign = "+";
# else $sign = "-";
foreach ($datestorecall as $day) {
$checkdate = strtotime((preg_replace("/(\d+)\/(\d+)\/(\d+)/",'$3-$2-$1',$daterecall)." $sign $day days"));
# print $daterecall . " + " . $day . " (" . $checkdate . ") == " . date("d/m/Y");
if ($checkdate==$current_unix_day)
{
# generate GUID
$item_GUID = $page.'_'.date("Y-m-d");
# if not present in file using a regex on the GUID
if (preg_match("/$item_GUID/",$feed_oldcontent) == 0)
{
# generate date
$feed_newitemdate = date(DATE_RSS, time());
# transform line to XML format
$cleaned_page_name = str_replace(".","/",$page);
global $FmtV;
$pagecontent = FmtPageName($FmtV, $page);
# does this actually work?!
$ItemTitle = "<title>Day $day recall for page $page started at $daterecall</title>";
$ItemLink = "<link>$ScriptUrl/$cleaned_page_name#BehaviorRecallDay$day</link>";
$ItemDescription = "<description>This is to improve behaviors you decided yourself were valuable. Also don't forget to improve those instructions to be more and more efficient!$pagecontent</description>";
/*
<title>Day $day recall for page $page started at $daterecall</title>
<link>$ScriptUrl/$cleaned_page_name#MemorizationDay$day</link>"
FeedText($page,$page,"description")
<title>Day $day of preparation for page $page started at $dateprepare</title>
<link>$ScriptUrl/$page</link>
<description>This is to improve preparation of things you will have to produce. Also don't forget to improve those instructions to be more and more efficient!</description>
*/
$feed_newitem = "<item>\n
$ItemTitle
$ItemLink
$ItemDescription
<guid>$item_GUID</guid>
<pubDate>$feed_newitemdate</pubDate>\n</item>";
# appending the item
$feed_newcontent .= $feed_newitem;
}
break; #we can't have 2 days at the same time, move on to the next page
}
# print "<br/>";
} # check if the next recall day is today
} # check if the next page is tagged
}
# feed should be properly updated
$feed_newdate = date(DATE_RSS, time());
$ChannelTitle = "BehaviorRecall";
#$ChannelTitle="Memorization";
#$ChannelTitle="Preparation";
$feed_header = "<?xml version=\"1.0\"?>\n<rss version=\"2.0\">
<channel>
<title>$ChannelTitle feed for $WikiTitle .</title>
<link>$ScriptUrl</link>
<description>Receive links as reminded to periodic behaviors you want to transform to habits.</description>
<lastBuildDate>$feed_newdate</lastBuildDate>";
$feed_footer = "\n</channel>\n</rss>";
print $feed_header;
print $feed_oldcontent;
print $feed_newcontent;
print $feed_footer;
$write_result = file_put_contents($feedfile,$feed_oldcontent.$feed_newcontent);
if (!$write_result){
if (strlen($feed_oldcontent.$feed_newcontent)>0){
print "Creation of the feed file fails, check write permissions for pmWiki and $feedfile.";
return;
} else {
print "No item to generate, did you correctly tag your pages?";
return;
}
}
}