summaryrefslogtreecommitdiff
path: root/lib/plugins/plugin/classes/ap_info.class.php
blob: 44926c035e7e65fd2f128aef635b7a15dbffaeb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php

class ap_info extends ap_manage {

    var $plugin_info = array();        // the plugin itself
    var $details = array();            // any component plugins

    function process() {

        // sanity check
        if (!$this->manager->plugin) { return; }

        $component_list = $this->get_plugin_components($this->manager->plugin);
        usort($component_list, array($this,'component_sort'));


        foreach ($component_list as $component) {
            if (($obj = &plugin_load($component['type'],$component['name'],false,true)) === NULL) continue;

            $compname = explode('_',$component['name']);
            if($compname[1]){
                $compname = '['.$compname[1].']';
            }else{
                $compname = '';
            }

            $this->details[] = array_merge(
                                    $obj->getInfo(),
                                    array(
                                        'type' => $component['type'],
                                        'compname' => $compname
                                    ));
            unset($obj);
        }

        // review details to simplify things
        foreach($this->details as $info) {
            foreach($info as $item => $value) {
                if (!isset($this->plugin_info[$item])) { $this->plugin_info[$item] = $value; continue; }
                if ($this->plugin_info[$item] != $value) $this->plugin_info[$item] = '';
            }
        }
    }

    function html() {

        // output the standard menu stuff
        parent::html();

        // sanity check
        if (!$this->manager->plugin) { return; }

        ptln('<div class="pm_info">');
        ptln("<h2>".$this->manager->getLang('plugin')." {$this->manager->plugin}</h2>");

        // collect pertinent information from the log
        $installed = $this->plugin_readlog($this->manager->plugin, 'installed');
        $source = $this->plugin_readlog($this->manager->plugin, 'url');
        $updated = $this->plugin_readlog($this->manager->plugin, 'updated');
        if (strrpos($updated, "\n") !== false) $updated = substr($updated, strrpos($updated, "\n")+1);

        ptln("<dl>",2);
        ptln("<dt>".$this->manager->getLang('source').'</dt><dd>'.($source ? $source : $this->manager->getLang('unknown'))."</dd>",4);
        ptln("<dt>".$this->manager->getLang('installed').'</dt><dd>'.($installed ? $installed : $this->manager->getLang('unknown'))."</dd>",4);
        if ($updated) ptln("<dt>".$this->manager->getLang('lastupdate').'</dt><dd>'.$updated."</dd>",4);
        ptln("</dl>",2);

        if (count($this->details) == 0) {
            ptln("<p>".$this->manager->getLang('noinfo')."</p>",2);
        } else {

            ptln("<dl>",2);
            if ($this->plugin_info['name']) ptln("<dt>".$this->manager->getLang('name')."</dt><dd>".$this->out($this->plugin_info['name'])."</dd>",4);
            if ($this->plugin_info['date']) ptln("<dt>".$this->manager->getLang('date')."</dt><dd>".$this->out($this->plugin_info['date'])."</dd>",4);
            if ($this->plugin_info['type']) ptln("<dt>".$this->manager->getLang('type')."</dt><dd>".$this->out($this->plugin_info['type'])."</dd>",4);
            if ($this->plugin_info['desc']) ptln("<dt>".$this->manager->getLang('desc')."</dt><dd>".$this->out($this->plugin_info['desc'])."</dd>",4);
            if ($this->plugin_info['author']) ptln("<dt>".$this->manager->getLang('author')."</dt><dd>".$this->manager->email($this->plugin_info['email'], $this->plugin_info['author'])."</dd>",4);
            if ($this->plugin_info['url']) ptln("<dt>".$this->manager->getLang('www')."</dt><dd>".$this->manager->external_link($this->plugin_info['url'], '', 'urlextern')."</dd>",4);
            ptln("</dl>",2);

            if (count($this->details) > 1) {
                ptln("<h3>".$this->manager->getLang('components')."</h3>",2);
                ptln("<div>",2);

                foreach ($this->details as $info) {

                    ptln("<dl>",4);
                    ptln("<dt>".$this->manager->getLang('name')."</dt><dd>".$this->out($info['name'].' '.$info['compname'])."</dd>",6);
                    if (!$this->plugin_info['date']) ptln("<dt>".$this->manager->getLang('date')."</dt><dd>".$this->out($info['date'])."</dd>",6);
                    if (!$this->plugin_info['type']) ptln("<dt>".$this->manager->getLang('type')."</dt><dd>".$this->out($info['type'])."</dd>",6);
                    if (!$this->plugin_info['desc']) ptln("<dt>".$this->manager->getLang('desc')."</dt><dd>".$this->out($info['desc'])."</dd>",6);
                    if (!$this->plugin_info['author']) ptln("<dt>".$this->manager->getLang('author')."</dt><dd>".$this->manager->email($info['email'], $info['author'])."</dd>",6);
                    if (!$this->plugin_info['url']) ptln("<dt>".$this->manager->getLang('www')."</dt><dd>".$this->manager->external_link($info['url'], '', 'urlextern')."</dd>",6);
                    ptln("</dl>",4);

                }
                ptln("</div>",2);
            }
        }
        ptln("</div>");
    }

    // simple output filter, make html entities safe and convert new lines to <br />
    function out($text) {
        return str_replace("\n",'<br />',htmlspecialchars($text));
    }


    /**
     * return a list (name & type) of all the component plugins that make up this plugin
     *
     * @todo can this move to pluginutils?
     */
    function get_plugin_components($plugin) {

        global $plugin_types;

        $components = array();
        $path = DOKU_PLUGIN.plugin_directory($plugin).'/';

        foreach ($plugin_types as $type) {
            if (@file_exists($path.$type.'.php')) { $components[] = array('name'=>$plugin, 'type'=>$type); continue; }

            if ($dh = @opendir($path.$type.'/')) {
                while (false !== ($cp = readdir($dh))) {
                    if ($cp == '.' || $cp == '..' || strtolower(substr($cp,-4)) != '.php') continue;

                    $components[] = array('name'=>$plugin.'_'.substr($cp, 0, -4), 'type'=>$type);
                }
                closedir($dh);
            }
        }

        return $components;
    }

    /**
     * usort callback to sort plugin components
     */
    function component_sort($a, $b) {
        if ($a['name'] == $b['name']) return 0;
        return ($a['name'] < $b['name']) ? -1 : 1;
    }
}