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