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