*/
/* ----- Settings ----- */
define('DOKU_INC', realpath(dirname(__FILE__).'/../../../').'/');
define('DISCUSSION_NS', 'discussion');
/* ----- Main ----- */
// conversion script should only be run once
if (@file_exists(dirname(__FILE__).'/convert_completed'))
die('Conversion already completed.');
require_once(DOKU_INC.'inc/init.php');
require_once(DOKU_INC.'inc/common.php');
require_once(DOKU_INC.'inc/io.php');
require_once(DOKU_INC.'inc/search.php');
require_once(DOKU_INC.'inc/pageutils.php');
require_once(DOKU_INC.'inc/parserutils.php');
$files = getDiscussionPages();
$n = 0;
foreach ($files as $file) {
if (convertDiscussionPage($file)) {
echo $file['id'].'
';
$n++;
}
}
if ($n > 0) {
io_saveFile(dirname(__FILE__).'/convert_completed', '');
echo '
Successfully converted '.$n.' discussion pages to new comments meta files.';
} else {
echo 'No discussion pages found.';
}
/* ----- Functions ----- */
/**
* returns a list of all discussion pages in the wiki
*/
function getDiscussionPages() {
global $conf;
$data = array();
search($data, $conf['datadir'], 'search_discussionpages', array());
return $data;
}
/**
* function for the search callback
*/
function search_discussionpages(&$data, $base, $file, $type, $lvl, $opts) {
global $conf;
if ($type == 'd') return true; // recurse into directories
if (!preg_match('#'.preg_quote('/'.DISCUSSION_NS.'/', '#').'#u', $file)) return false;
if (!preg_match('#\.txt$#', $file)) return false;
$id = pathID(str_replace(DISCUSSION_NS.'/', '', $file));
$data[] = array(
'id' => $id,
'old' => $conf['datadir'].$file,
'new' => metaFN($id, '.comments')
);
return true;
}
/**
* this converts individual discussion pages to .comment meta files
*/
function convertDiscussionPage($file) {
// read the old file
$data = io_readFile($file['old'], false);
// handle file with no comments yet
if (trim($data) == '') {
io_saveFile($file['new'], serialize(array('status' => 1, 'number' => 0)));
@unlink($file['old']);
return true;
}
// break it up into pieces
$old = explode('----', $data);
// merge with possibly already existing (newer) comments
$comments = array();
if (@file_exists($file['new']))
$comments = unserialize(io_readFile($file['old'], false));
// set general info
if (!isset($comments['status'])) $comments['status'] = 1;
$comments['number'] += count($old);
foreach ($old as $comment) {
// prepare comment data
if (strpos($comment, '') !== false) {
$in = '';
$out = ':';
} else {
$in = '//';
$out = ': //';
}
list($meta, $raw) = explode($out, $comment, 2);
$raw = trim($raw);
// skip empty comments
if (!$raw) {
$comments['number']--;
continue;
}
list($mail, $meta) = explode($in, $meta, 2);
list($name, $strd) = explode(', ', $meta, 2);
$date = strtotime($strd);
if ($date == -1) $date = time();
if ($mail) {
list($mail) = explode(' |', $mail, 2);
$mail = substr(strrchr($mail, '>'), 1);
}
$cid = md5($name.$date);
// render comment
$xhtml = p_render('xhtml', p_get_instructions($raw), $info);
// fill in the converted comment
$comments['comments'][$cid] = array(
'user' => array(
'name' => hsc($name),
'mail' => hsc($mail)),
'date' => array('created' => $date),
'show' => true,
'raw' => $raw,
'xhtml' => $xhtml,
'replies' => array()
);
}
// save the new file
io_saveFile($file['new'], serialize($comments));
// remove the old file
@unlink($file['old']);
return true;
}
// vim:ts=4:sw=4:et:enc=utf-8: