1*f0fda08aSwikidesign<?php 2*f0fda08aSwikidesign/** 3*f0fda08aSwikidesign * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 4*f0fda08aSwikidesign * @author Esther Brunner <wikidesign@gmail.com> 5*f0fda08aSwikidesign */ 6*f0fda08aSwikidesign 7*f0fda08aSwikidesign/* ----- Settings ----- */ 8*f0fda08aSwikidesign 9*f0fda08aSwikidesigndefine('DOKU_INC', realpath(dirname(__FILE__).'/../../../').'/'); 10*f0fda08aSwikidesigndefine('DISCUSSION_NS', 'discussion'); 11*f0fda08aSwikidesign 12*f0fda08aSwikidesign/* ----- Main ----- */ 13*f0fda08aSwikidesign 14*f0fda08aSwikidesign// conversion script should only be run once 15*f0fda08aSwikidesignif (@file_exists(dirname(__FILE__).'/convert_completed')) 16*f0fda08aSwikidesign die('Conversion already completed.'); 17*f0fda08aSwikidesign 18*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/init.php'); 19*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/common.php'); 20*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/io.php'); 21*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/search.php'); 22*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/pageutils.php'); 23*f0fda08aSwikidesignrequire_once(DOKU_INC.'inc/parserutils.php'); 24*f0fda08aSwikidesign 25*f0fda08aSwikidesign$files = getDiscussionPages(); 26*f0fda08aSwikidesign$n = 0; 27*f0fda08aSwikidesign 28*f0fda08aSwikidesignforeach ($files as $file){ 29*f0fda08aSwikidesign if (convertDiscussionPage($file)){ 30*f0fda08aSwikidesign echo $file['id'].'<br />'; 31*f0fda08aSwikidesign $n++; 32*f0fda08aSwikidesign } 33*f0fda08aSwikidesign} 34*f0fda08aSwikidesign 35*f0fda08aSwikidesignif ($n > 0){ 36*f0fda08aSwikidesign io_saveFile(dirname(__FILE__).'/convert_completed', ''); 37*f0fda08aSwikidesign echo '<br />Successfully converted '.$n.' discussion pages to new comments meta files.'; 38*f0fda08aSwikidesign} else { 39*f0fda08aSwikidesign echo 'No discussion pages found.'; 40*f0fda08aSwikidesign} 41*f0fda08aSwikidesign 42*f0fda08aSwikidesign/* ----- Functions ----- */ 43*f0fda08aSwikidesign 44*f0fda08aSwikidesign/** 45*f0fda08aSwikidesign * returns a list of all discussion pages in the wiki 46*f0fda08aSwikidesign */ 47*f0fda08aSwikidesignfunction getDiscussionPages(){ 48*f0fda08aSwikidesign global $conf; 49*f0fda08aSwikidesign 50*f0fda08aSwikidesign $data = array(); 51*f0fda08aSwikidesign search($data, $conf['datadir'], 'search_discussionpages', array()); 52*f0fda08aSwikidesign return $data; 53*f0fda08aSwikidesign} 54*f0fda08aSwikidesign 55*f0fda08aSwikidesign/** 56*f0fda08aSwikidesign * function for the search callback 57*f0fda08aSwikidesign */ 58*f0fda08aSwikidesignfunction search_discussionpages(&$data, $base, $file, $type, $lvl, $opts){ 59*f0fda08aSwikidesign global $conf; 60*f0fda08aSwikidesign 61*f0fda08aSwikidesign if ($type == 'd') return true; // recurse into directories 62*f0fda08aSwikidesign if (!preg_match('#'.preg_quote('/'.DISCUSSION_NS.'/', '#').'#u', $file)) return false; 63*f0fda08aSwikidesign if (!preg_match('#\.txt$#', $file)) return false; 64*f0fda08aSwikidesign 65*f0fda08aSwikidesign $id = pathID(str_replace(DISCUSSION_NS.'/', '', $file)); 66*f0fda08aSwikidesign $data[] = array( 67*f0fda08aSwikidesign 'id' => $id, 68*f0fda08aSwikidesign 'old' => $conf['datadir'].$file, 69*f0fda08aSwikidesign 'new' => metaFN($id, '.comments') 70*f0fda08aSwikidesign ); 71*f0fda08aSwikidesign return true; 72*f0fda08aSwikidesign} 73*f0fda08aSwikidesign 74*f0fda08aSwikidesign/** 75*f0fda08aSwikidesign * this converts individual discussion pages to .comment meta files 76*f0fda08aSwikidesign */ 77*f0fda08aSwikidesignfunction convertDiscussionPage($file){ 78*f0fda08aSwikidesign 79*f0fda08aSwikidesign // read the old file 80*f0fda08aSwikidesign $data = io_readFile($file['old'], false); 81*f0fda08aSwikidesign 82*f0fda08aSwikidesign // handle file with no comments yet 83*f0fda08aSwikidesign if (trim($data) == ''){ 84*f0fda08aSwikidesign io_saveFile($file['new'], serialize(array('status' => 1, 'number' => 0))); 85*f0fda08aSwikidesign @unlink($file['old']); 86*f0fda08aSwikidesign return true; 87*f0fda08aSwikidesign } 88*f0fda08aSwikidesign 89*f0fda08aSwikidesign // break it up into pieces 90*f0fda08aSwikidesign $old = explode('----', $data); 91*f0fda08aSwikidesign 92*f0fda08aSwikidesign // merge with possibly already existing (newer) comments 93*f0fda08aSwikidesign $comments = array(); 94*f0fda08aSwikidesign if (@file_exists($file['new'])) 95*f0fda08aSwikidesign $comments = unserialize(io_readFile($file['old'], false)); 96*f0fda08aSwikidesign 97*f0fda08aSwikidesign // set general info 98*f0fda08aSwikidesign if (!isset($comments['status'])) $comments['status'] = 1; 99*f0fda08aSwikidesign $comments['number'] += count($old); 100*f0fda08aSwikidesign 101*f0fda08aSwikidesign foreach ($old as $comment){ 102*f0fda08aSwikidesign 103*f0fda08aSwikidesign // prepare comment data 104*f0fda08aSwikidesign if (strpos($comment, '<sub>') !== false){ 105*f0fda08aSwikidesign $in = '<sub>'; 106*f0fda08aSwikidesign $out = ':</sub>'; 107*f0fda08aSwikidesign } else { 108*f0fda08aSwikidesign $in = '//'; 109*f0fda08aSwikidesign $out = ': //'; 110*f0fda08aSwikidesign } 111*f0fda08aSwikidesign list($meta, $raw) = explode($out, $comment, 2); 112*f0fda08aSwikidesign $raw = trim($raw); 113*f0fda08aSwikidesign 114*f0fda08aSwikidesign // skip empty comments 115*f0fda08aSwikidesign if (!$raw){ 116*f0fda08aSwikidesign $comments['number']--; 117*f0fda08aSwikidesign continue; 118*f0fda08aSwikidesign } 119*f0fda08aSwikidesign 120*f0fda08aSwikidesign list($mail, $meta) = explode($in, $meta, 2); 121*f0fda08aSwikidesign list($name, $strd) = explode(', ', $meta, 2); 122*f0fda08aSwikidesign $date = strtotime($strd); 123*f0fda08aSwikidesign if ($date == -1) $date = time(); 124*f0fda08aSwikidesign if ($mail){ 125*f0fda08aSwikidesign list($mail) = explode(' |', $mail, 2); 126*f0fda08aSwikidesign $mail = substr(strrchr($mail, '>'), 1); 127*f0fda08aSwikidesign } 128*f0fda08aSwikidesign $cid = md5($name.$date); 129*f0fda08aSwikidesign 130*f0fda08aSwikidesign // render comment 131*f0fda08aSwikidesign $xhtml = p_render('xhtml', p_get_instructions($raw), $info); 132*f0fda08aSwikidesign 133*f0fda08aSwikidesign // fill in the converted comment 134*f0fda08aSwikidesign $comments['comments'][$cid] = array( 135*f0fda08aSwikidesign 'user' => '', 136*f0fda08aSwikidesign 'name' => htmlspecialchars($name), 137*f0fda08aSwikidesign 'mail' => htmlspecialchars($mail), 138*f0fda08aSwikidesign 'date' => $date, 139*f0fda08aSwikidesign 'show' => true, 140*f0fda08aSwikidesign 'raw' => $raw, 141*f0fda08aSwikidesign 'xhtml' => $xhtml, 142*f0fda08aSwikidesign 'replies' => array() 143*f0fda08aSwikidesign ); 144*f0fda08aSwikidesign } 145*f0fda08aSwikidesign 146*f0fda08aSwikidesign // save the new file 147*f0fda08aSwikidesign io_saveFile($file['new'], serialize($comments)); 148*f0fda08aSwikidesign 149*f0fda08aSwikidesign // remove the old file 150*f0fda08aSwikidesign @unlink($file['old']); 151*f0fda08aSwikidesign 152*f0fda08aSwikidesign return true; 153*f0fda08aSwikidesign} 154*f0fda08aSwikidesign 155*f0fda08aSwikidesign//Setup VIM: ex: et ts=4 enc=utf-8 : 156