*/ /* ----- Settings ----- */ define('DOKU_INC', realpath(dirname(__FILE__) . '/../../../') . '/'); const 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'); $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 = []; search($data, $conf['datadir'], 'search_discussionpages', []); return $data; } /** * function for the search callback */ function search_discussionpages(&$data, $base, $file, $type, $lvl, $opts) { global $conf; // recurse into directories if ($type == 'd') { return true; } 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[] = [ '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(['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 = []; 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) = array_pad(explode($out, $comment, 2), 2, ''); $raw = trim($raw); // skip empty comments if (!$raw) { $comments['number']--; continue; } list($mail, $meta) = array_pad(explode($in, $meta, 2), 2, ''); list($name, $strd) = array_pad(explode(', ', $meta, 2), 2, ''); $date = strtotime($strd); if ($date == -1) { $date = time(); } if ($mail) { list($mail) = array_pad(explode(' |', $mail, 2), 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] = [ 'user' => [ 'name' => hsc($name), 'mail' => hsc($mail)], 'date' => ['created' => $date], 'show' => true, 'raw' => $raw, 'xhtml' => $xhtml, 'replies' => [] ]; } // save the new file io_saveFile($file['new'], serialize($comments)); // remove the old file @unlink($file['old']); return true; }