xref: /plugin/discussion/convert.php (revision f0fda08aecb1d731a5aee9fa543fdbf11bd942b9)
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