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