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