108ca4f85Sgerardnico<?php 208ca4f85Sgerardnico 308ca4f85Sgerardnicouse ComboStrap\Analytics; 4a6bf47aaSNickeauuse ComboStrap\Identity; 58aa9d0e6Sgerardnicouse ComboStrap\Message; 608ca4f85Sgerardnicouse ComboStrap\Page; 708ca4f85Sgerardnicouse ComboStrap\PluginUtility; 808ca4f85Sgerardnico 908ca4f85Sgerardnicoif (!defined('DOKU_INC')) die(); 1008ca4f85Sgerardnicoif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 1108ca4f85Sgerardnico 1208ca4f85Sgerardnico 13*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 1408ca4f85Sgerardnico 1508ca4f85Sgerardnico/** 1608ca4f85Sgerardnico * 1708ca4f85Sgerardnico * Show a quality message 1808ca4f85Sgerardnico * 1908ca4f85Sgerardnico * 2008ca4f85Sgerardnico * 2108ca4f85Sgerardnico */ 2208ca4f85Sgerardnicoclass action_plugin_combo_qualitymessage extends DokuWiki_Action_Plugin 2308ca4f85Sgerardnico{ 2408ca4f85Sgerardnico 2508ca4f85Sgerardnico // a class can not start with a number 2608ca4f85Sgerardnico const QUALITY_BOX_CLASS = "quality-message"; 2708ca4f85Sgerardnico 28aa3cb38fSgerardnico /** 29aa3cb38fSgerardnico * The quality rules that will not show 30aa3cb38fSgerardnico * up in the messages 31aa3cb38fSgerardnico */ 32aa3cb38fSgerardnico const CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING = "excludedQualityRulesFromDynamicMonitoring"; 335f891b7eSNickeau /** 345f891b7eSNickeau * Disable the message totally 355f891b7eSNickeau */ 365f891b7eSNickeau const CONF_DISABLE_QUALITY_MONITORING = "disableDynamicQualityMonitoring"; 37aa3cb38fSgerardnico 38eee76a3dSgerardnico /** 39eee76a3dSgerardnico * Key in the frontmatter that disable the message 40eee76a3dSgerardnico */ 41eee76a3dSgerardnico const DISABLE_INDICATOR = "dynamic_quality_monitoring"; 42eee76a3dSgerardnico 4308ca4f85Sgerardnico 4408ca4f85Sgerardnico function __construct() 4508ca4f85Sgerardnico { 4608ca4f85Sgerardnico // enable direct access to language strings 4708ca4f85Sgerardnico // ie $this->lang 4808ca4f85Sgerardnico $this->setupLocale(); 4908ca4f85Sgerardnico } 5008ca4f85Sgerardnico 5108ca4f85Sgerardnico 5208ca4f85Sgerardnico function register(Doku_Event_Handler $controller) 5308ca4f85Sgerardnico { 5408ca4f85Sgerardnico 555f891b7eSNickeau if(!$this->getConf(self::CONF_DISABLE_QUALITY_MONITORING)) { 5608ca4f85Sgerardnico $controller->register_hook( 5708ca4f85Sgerardnico 'TPL_ACT_RENDER', 5808ca4f85Sgerardnico 'BEFORE', 5908ca4f85Sgerardnico $this, 6008ca4f85Sgerardnico '_displayQualityMessage', 6108ca4f85Sgerardnico array() 6208ca4f85Sgerardnico ); 635f891b7eSNickeau } 6408ca4f85Sgerardnico 6508ca4f85Sgerardnico 6608ca4f85Sgerardnico } 6708ca4f85Sgerardnico 6808ca4f85Sgerardnico 6908ca4f85Sgerardnico /** 7008ca4f85Sgerardnico * Main function; dispatches the visual comment actions 7108ca4f85Sgerardnico * @param $event Doku_Event 7208ca4f85Sgerardnico */ 7308ca4f85Sgerardnico function _displayQualityMessage(&$event, $param) 7408ca4f85Sgerardnico { 7508ca4f85Sgerardnico if ($event->data == 'show') { 76d262537cSgerardnico 77d262537cSgerardnico /** 78d262537cSgerardnico * Quality is just for the writers 79d262537cSgerardnico */ 80a6bf47aaSNickeau if (!Identity::isWriter()) { 81d262537cSgerardnico return; 82d262537cSgerardnico } 83d262537cSgerardnico 84ef295d81Sgerardnico $note = $this->createQualityNote(PluginUtility::getPageId(), $this); 85d262537cSgerardnico if ($note != null) { 86531e725cSNickeau ptln($note->toHtml()); 87d262537cSgerardnico } 88d262537cSgerardnico } 89d262537cSgerardnico 90d262537cSgerardnico } 91d262537cSgerardnico 92d262537cSgerardnico /** 93d262537cSgerardnico * @param $pageId 94d262537cSgerardnico * @param $plugin - Plugin 958aa9d0e6Sgerardnico * @return Message|null 96d262537cSgerardnico */ 97ef295d81Sgerardnico static public function createQualityNote($pageId, $plugin) 98d262537cSgerardnico { 9985e82846SNickeau $page = Page::createPageFromId($pageId); 100aa3cb38fSgerardnico 101531e725cSNickeau if ($page->isSlot()) { 102aa3cb38fSgerardnico return null; 103aa3cb38fSgerardnico } 1049b9e6d1fSgerardnico 105eee76a3dSgerardnico if (!$page->isQualityMonitored()) { 106eee76a3dSgerardnico return null; 107eee76a3dSgerardnico } 108eee76a3dSgerardnico 10985e82846SNickeau if ($page->exists()) { 11008ca4f85Sgerardnico $analytics = $page->getAnalyticsFromFs(); 111aa3cb38fSgerardnico $rules = $analytics[Analytics::QUALITY][Analytics::RULES]; 11208ca4f85Sgerardnico 113e68157ebSgerardnico 114e68157ebSgerardnico /** 115e68157ebSgerardnico * We may got null 116e68157ebSgerardnico * array_key_exists() expects parameter 2 to be array, 117e68157ebSgerardnico * null given in /opt/www/datacadamia.com/lib/plugins/combo/action/qualitymessage.php on line 113 118e68157ebSgerardnico */ 119e68157ebSgerardnico if ($rules==null){ 120e68157ebSgerardnico return null; 121e68157ebSgerardnico } 122e68157ebSgerardnico 123aa3cb38fSgerardnico /** 124aa3cb38fSgerardnico * If there is no info, nothing to show 125aa3cb38fSgerardnico */ 126aa3cb38fSgerardnico if (!array_key_exists(Analytics::INFO, $rules)) { 127aa3cb38fSgerardnico return null; 128aa3cb38fSgerardnico } 129aa3cb38fSgerardnico 130aa3cb38fSgerardnico /** 131aa3cb38fSgerardnico * The error info 132aa3cb38fSgerardnico */ 133aa3cb38fSgerardnico $qualityInfoRules = $rules[Analytics::INFO]; 134aa3cb38fSgerardnico 135aa3cb38fSgerardnico /** 136aa3cb38fSgerardnico * Excluding the excluded rules 137aa3cb38fSgerardnico */ 138aa3cb38fSgerardnico global $conf; 139aa3cb38fSgerardnico $excludedRulesConf = $conf['plugin'][PluginUtility::PLUGIN_BASE_NAME][self::CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING]; 140aa3cb38fSgerardnico $excludedRules = preg_split("/,/", $excludedRulesConf); 141aa3cb38fSgerardnico foreach ($excludedRules as $excludedRule) { 142aa3cb38fSgerardnico if (array_key_exists($excludedRule, $qualityInfoRules)) { 143aa3cb38fSgerardnico unset($qualityInfoRules[$excludedRule]); 14408ca4f85Sgerardnico } 14508ca4f85Sgerardnico } 14608ca4f85Sgerardnico 14708ca4f85Sgerardnico if (sizeof($qualityInfoRules) > 0) { 14808ca4f85Sgerardnico 14908ca4f85Sgerardnico $qualityScore = $analytics[Analytics::QUALITY][renderer_plugin_combo_analytics::SCORING][renderer_plugin_combo_analytics::SCORE]; 1508aa9d0e6Sgerardnico $message = new Message($plugin); 151d262537cSgerardnico $message->addContent("<p>Well played, you got a " . PluginUtility::getUrl("quality:score", "quality score") . " of {$qualityScore} !</p>"); 152722648eaSgerardnico if ($page->isLowQualityPage()) { 153722648eaSgerardnico $analytics = $page->getAnalyticsFromFs(true); 154722648eaSgerardnico $mandatoryFailedRules = $analytics[Analytics::QUALITY][Analytics::FAILED_MANDATORY_RULES]; 155722648eaSgerardnico $rulesUrl = PluginUtility::getUrl("quality:rule", "rules"); 156722648eaSgerardnico $lqPageUrl = PluginUtility::getUrl("low_quality_page", "low quality page"); 157722648eaSgerardnico $message->addContent("<div class='alert alert-info'>This is a {$lqPageUrl} because it has failed the following mandatory {$rulesUrl}:"); 158722648eaSgerardnico $message->addContent("<ul style='margin-bottom: 0'>"); 159fa5961eaSgerardnico /** 160fa5961eaSgerardnico * A low quality page should have 161fa5961eaSgerardnico * failed mandatory rules 162fa5961eaSgerardnico * but due to the asycn nature, sometimes 163fa5961eaSgerardnico * we don't have an array 164fa5961eaSgerardnico */ 165fa5961eaSgerardnico if (is_array($mandatoryFailedRules)) { 166722648eaSgerardnico foreach ($mandatoryFailedRules as $mandatoryFailedRule) { 167ef295d81Sgerardnico $message->addContent("<li>" . PluginUtility::getUrl("quality:rule#list", $mandatoryFailedRule) . "</li>"); 168722648eaSgerardnico } 169fa5961eaSgerardnico } 170722648eaSgerardnico $message->addContent("</ul>"); 171722648eaSgerardnico $message->addContent("</div>"); 172722648eaSgerardnico } 17308ca4f85Sgerardnico $message->addContent("<p>You can still win a couple of points.</p>"); 17408ca4f85Sgerardnico $message->addContent("<ul>"); 17508ca4f85Sgerardnico foreach ($qualityInfoRules as $qualityRule => $qualityInfo) { 17608ca4f85Sgerardnico $message->addContent("<li>"); 17708ca4f85Sgerardnico $message->addContent($qualityInfo); 17808ca4f85Sgerardnico $message->addContent("</li>"); 17908ca4f85Sgerardnico } 18008ca4f85Sgerardnico $message->addContent("</ul>"); 18108ca4f85Sgerardnico 182d262537cSgerardnico $message->setSignatureCanonical("quality:dynamic_monitoring"); 183d262537cSgerardnico $message->setSignatureName("Quality Dynamic Monitoring Feature"); 1848aa9d0e6Sgerardnico $message->setType(Message::TYPE_CLASSIC); 18508ca4f85Sgerardnico $message->setClass(self::QUALITY_BOX_CLASS); 186d262537cSgerardnico return $message; 18708ca4f85Sgerardnico 18808ca4f85Sgerardnico 18908ca4f85Sgerardnico } 19008ca4f85Sgerardnico } 191d262537cSgerardnico return null; 19208ca4f85Sgerardnico } 19308ca4f85Sgerardnico 19408ca4f85Sgerardnico 19508ca4f85Sgerardnico} 196