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