xref: /template/strap/action/qualitymessage.php (revision fa5961ea4325ceccaa7001876a4a705e0e4ad21b)
108ca4f85Sgerardnico<?php
208ca4f85Sgerardnico
308ca4f85Sgerardnicouse ComboStrap\Analytics;
4d262537cSgerardnicouse ComboStrap\Auth;
508ca4f85Sgerardnicouse ComboStrap\LogUtility;
6d262537cSgerardnicouse ComboStrap\Note;
708ca4f85Sgerardnicouse ComboStrap\Page;
808ca4f85Sgerardnicouse ComboStrap\PagesIndex;
908ca4f85Sgerardnicouse ComboStrap\PluginUtility;
1008ca4f85Sgerardnico
1108ca4f85Sgerardnicoif (!defined('DOKU_INC')) die();
1208ca4f85Sgerardnicoif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
1308ca4f85Sgerardnico
1408ca4f85Sgerardnico
1508ca4f85Sgerardnicorequire_once(__DIR__ . '/../class/Page.php');
16d262537cSgerardnicorequire_once(__DIR__ . '/../class/Note.php');
1708ca4f85Sgerardnico
1808ca4f85Sgerardnico/**
1908ca4f85Sgerardnico *
2008ca4f85Sgerardnico * Show a quality message
2108ca4f85Sgerardnico *
2208ca4f85Sgerardnico *
2308ca4f85Sgerardnico *
2408ca4f85Sgerardnico */
2508ca4f85Sgerardnicoclass action_plugin_combo_qualitymessage extends DokuWiki_Action_Plugin
2608ca4f85Sgerardnico{
2708ca4f85Sgerardnico
2808ca4f85Sgerardnico    // a class can not start with a number
2908ca4f85Sgerardnico    const QUALITY_BOX_CLASS = "quality-message";
3008ca4f85Sgerardnico
31aa3cb38fSgerardnico    /**
32aa3cb38fSgerardnico     * The quality rules that will not show
33aa3cb38fSgerardnico     * up in the messages
34aa3cb38fSgerardnico     */
35aa3cb38fSgerardnico    const CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING = "excludedQualityRulesFromDynamicMonitoring";
36aa3cb38fSgerardnico
37eee76a3dSgerardnico    /**
38eee76a3dSgerardnico     * Key in the frontmatter that disable the message
39eee76a3dSgerardnico     */
40eee76a3dSgerardnico    const DISABLE_INDICATOR = "dynamic_quality_monitoring";
41eee76a3dSgerardnico
4208ca4f85Sgerardnico
4308ca4f85Sgerardnico    function __construct()
4408ca4f85Sgerardnico    {
4508ca4f85Sgerardnico        // enable direct access to language strings
4608ca4f85Sgerardnico        // ie $this->lang
4708ca4f85Sgerardnico        $this->setupLocale();
4808ca4f85Sgerardnico    }
4908ca4f85Sgerardnico
5008ca4f85Sgerardnico
5108ca4f85Sgerardnico    function register(Doku_Event_Handler $controller)
5208ca4f85Sgerardnico    {
5308ca4f85Sgerardnico
5408ca4f85Sgerardnico        $controller->register_hook(
5508ca4f85Sgerardnico            'TPL_ACT_RENDER',
5608ca4f85Sgerardnico            'BEFORE',
5708ca4f85Sgerardnico            $this,
5808ca4f85Sgerardnico            '_displayQualityMessage',
5908ca4f85Sgerardnico            array()
6008ca4f85Sgerardnico        );
6108ca4f85Sgerardnico
6208ca4f85Sgerardnico
6308ca4f85Sgerardnico    }
6408ca4f85Sgerardnico
6508ca4f85Sgerardnico
6608ca4f85Sgerardnico    /**
6708ca4f85Sgerardnico     * Main function; dispatches the visual comment actions
6808ca4f85Sgerardnico     * @param   $event Doku_Event
6908ca4f85Sgerardnico     */
7008ca4f85Sgerardnico    function _displayQualityMessage(&$event, $param)
7108ca4f85Sgerardnico    {
7208ca4f85Sgerardnico        if ($event->data == 'show') {
73d262537cSgerardnico
74d262537cSgerardnico            /**
75d262537cSgerardnico             * Quality is just for the writers
76d262537cSgerardnico             */
77d262537cSgerardnico            if (!Auth::isWriter()) {
78d262537cSgerardnico                return;
79d262537cSgerardnico            }
80d262537cSgerardnico
81ef295d81Sgerardnico            $note = $this->createQualityNote(PluginUtility::getPageId(), $this);
82d262537cSgerardnico            if ($note != null) {
83d262537cSgerardnico                ptln($note->getHtml());
84d262537cSgerardnico            }
85d262537cSgerardnico        }
86d262537cSgerardnico
87d262537cSgerardnico    }
88d262537cSgerardnico
89d262537cSgerardnico    /**
90d262537cSgerardnico     * @param $pageId
91d262537cSgerardnico     * @param $plugin - Plugin
92d262537cSgerardnico     * @return Note|null
93d262537cSgerardnico     */
94ef295d81Sgerardnico    static public function createQualityNote($pageId, $plugin)
95d262537cSgerardnico    {
96d262537cSgerardnico        $page = new Page($pageId);
97aa3cb38fSgerardnico
98aa3cb38fSgerardnico        if ($page->isBar()) {
99aa3cb38fSgerardnico            return null;
100aa3cb38fSgerardnico        }
1019b9e6d1fSgerardnico
102eee76a3dSgerardnico        if (!$page->isQualityMonitored()) {
103eee76a3dSgerardnico            return null;
104eee76a3dSgerardnico        }
105eee76a3dSgerardnico
106d262537cSgerardnico        if ($page->existInFs()) {
10708ca4f85Sgerardnico            $analytics = $page->getAnalyticsFromFs();
108aa3cb38fSgerardnico            $rules = $analytics[Analytics::QUALITY][Analytics::RULES];
10908ca4f85Sgerardnico
110aa3cb38fSgerardnico            /**
111aa3cb38fSgerardnico             * If there is no info, nothing to show
112aa3cb38fSgerardnico             */
113aa3cb38fSgerardnico            if (!array_key_exists(Analytics::INFO, $rules)) {
114aa3cb38fSgerardnico                return null;
115aa3cb38fSgerardnico            }
116aa3cb38fSgerardnico
117aa3cb38fSgerardnico            /**
118aa3cb38fSgerardnico             * The error info
119aa3cb38fSgerardnico             */
120aa3cb38fSgerardnico            $qualityInfoRules = $rules[Analytics::INFO];
121aa3cb38fSgerardnico
122aa3cb38fSgerardnico            /**
123aa3cb38fSgerardnico             * Excluding the excluded rules
124aa3cb38fSgerardnico             */
125aa3cb38fSgerardnico            global $conf;
126aa3cb38fSgerardnico            $excludedRulesConf = $conf['plugin'][PluginUtility::PLUGIN_BASE_NAME][self::CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING];
127aa3cb38fSgerardnico            $excludedRules = preg_split("/,/", $excludedRulesConf);
128aa3cb38fSgerardnico            foreach ($excludedRules as $excludedRule) {
129aa3cb38fSgerardnico                if (array_key_exists($excludedRule, $qualityInfoRules)) {
130aa3cb38fSgerardnico                    unset($qualityInfoRules[$excludedRule]);
13108ca4f85Sgerardnico                }
13208ca4f85Sgerardnico            }
13308ca4f85Sgerardnico
13408ca4f85Sgerardnico            if (sizeof($qualityInfoRules) > 0) {
13508ca4f85Sgerardnico
13608ca4f85Sgerardnico                $qualityScore = $analytics[Analytics::QUALITY][renderer_plugin_combo_analytics::SCORING][renderer_plugin_combo_analytics::SCORE];
137d262537cSgerardnico                $message = new Note($plugin);
138d262537cSgerardnico                $message->addContent("<p>Well played, you got a " . PluginUtility::getUrl("quality:score", "quality score") . " of {$qualityScore} !</p>");
139722648eaSgerardnico                if ($page->isLowQualityPage()) {
140722648eaSgerardnico                    $analytics = $page->getAnalyticsFromFs(true);
141722648eaSgerardnico                    $mandatoryFailedRules = $analytics[Analytics::QUALITY][Analytics::FAILED_MANDATORY_RULES];
142722648eaSgerardnico                    $rulesUrl = PluginUtility::getUrl("quality:rule", "rules");
143722648eaSgerardnico                    $lqPageUrl = PluginUtility::getUrl("low_quality_page", "low quality page");
144722648eaSgerardnico                    $message->addContent("<div class='alert alert-info'>This is a {$lqPageUrl} because it has failed the following mandatory {$rulesUrl}:");
145722648eaSgerardnico                    $message->addContent("<ul style='margin-bottom: 0'>");
146*fa5961eaSgerardnico                    /**
147*fa5961eaSgerardnico                     * A low quality page should have
148*fa5961eaSgerardnico                     * failed mandatory rules
149*fa5961eaSgerardnico                     * but due to the asycn nature, sometimes
150*fa5961eaSgerardnico                     * we don't have an array
151*fa5961eaSgerardnico                     */
152*fa5961eaSgerardnico                    if (is_array($mandatoryFailedRules)) {
153722648eaSgerardnico                        foreach ($mandatoryFailedRules as $mandatoryFailedRule) {
154ef295d81Sgerardnico                            $message->addContent("<li>" . PluginUtility::getUrl("quality:rule#list", $mandatoryFailedRule) . "</li>");
155722648eaSgerardnico                        }
156*fa5961eaSgerardnico                    }
157722648eaSgerardnico                    $message->addContent("</ul>");
158722648eaSgerardnico                    $message->addContent("</div>");
159722648eaSgerardnico                }
16008ca4f85Sgerardnico                $message->addContent("<p>You can still win a couple of points.</p>");
16108ca4f85Sgerardnico                $message->addContent("<ul>");
16208ca4f85Sgerardnico                foreach ($qualityInfoRules as $qualityRule => $qualityInfo) {
16308ca4f85Sgerardnico                    $message->addContent("<li>");
16408ca4f85Sgerardnico                    $message->addContent($qualityInfo);
16508ca4f85Sgerardnico                    $message->addContent("</li>");
16608ca4f85Sgerardnico                }
16708ca4f85Sgerardnico                $message->addContent("</ul>");
16808ca4f85Sgerardnico
169d262537cSgerardnico                $message->setSignatureCanonical("quality:dynamic_monitoring");
170d262537cSgerardnico                $message->setSignatureName("Quality Dynamic Monitoring Feature");
171d262537cSgerardnico                $message->setType(Note::TYPE_CLASSIC);
17208ca4f85Sgerardnico                $message->setClass(self::QUALITY_BOX_CLASS);
173d262537cSgerardnico                return $message;
17408ca4f85Sgerardnico
17508ca4f85Sgerardnico
17608ca4f85Sgerardnico            }
17708ca4f85Sgerardnico        }
178d262537cSgerardnico        return null;
17908ca4f85Sgerardnico    }
18008ca4f85Sgerardnico
18108ca4f85Sgerardnico
18208ca4f85Sgerardnico}
183