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