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