1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeauuse ComboStrap\Api\QualityMessageHandler; 6*04fd306cSNickeauuse renderer_plugin_combo_analytics; 7*04fd306cSNickeau 8*04fd306cSNickeauclass QualityTag 9*04fd306cSNickeau{ 10*04fd306cSNickeau 11*04fd306cSNickeau public const MARKUP_TAG = "quality"; 12*04fd306cSNickeau const CANONICAL = ":dynamic-quality-monitoring"; 13*04fd306cSNickeau 14*04fd306cSNickeau /** 15*04fd306cSNickeau * @param WikiPath $wikiPath 16*04fd306cSNickeau * @return Message 17*04fd306cSNickeau */ 18*04fd306cSNickeau public static function createQualityReport(WikiPath $wikiPath): Message 19*04fd306cSNickeau { 20*04fd306cSNickeau 21*04fd306cSNickeau if (!FileSystems::exists($wikiPath)) { 22*04fd306cSNickeau return Message::createInfoMessage("The resource ($wikiPath) does not exist, no quality report can be computed."); 23*04fd306cSNickeau } 24*04fd306cSNickeau 25*04fd306cSNickeau try { 26*04fd306cSNickeau $path = MarkupPath::createPageFromPathObject($wikiPath)->fetchAnalyticsPath(); 27*04fd306cSNickeau $analyticsArray = Json::createFromPath($path)->toArray(); 28*04fd306cSNickeau } catch (ExceptionCompile $e) { 29*04fd306cSNickeau return Message::createErrorMessage("Error while trying to read the JSON analytics document. {$e->getMessage()}") 30*04fd306cSNickeau ->setStatus(HttpResponseStatus::INTERNAL_ERROR); 31*04fd306cSNickeau } 32*04fd306cSNickeau 33*04fd306cSNickeau $rules = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::RULES]; 34*04fd306cSNickeau 35*04fd306cSNickeau /** 36*04fd306cSNickeau * We may got null 37*04fd306cSNickeau * array_key_exists() expects parameter 2 to be array, 38*04fd306cSNickeau * null given in /opt/www/datacadamia.com/lib/plugins/combo/action/qualitymessage.php on line 113 39*04fd306cSNickeau */ 40*04fd306cSNickeau if ($rules == null) { 41*04fd306cSNickeau return Message::createInfoMessage("No rules found in the analytics document"); 42*04fd306cSNickeau } 43*04fd306cSNickeau 44*04fd306cSNickeau /** 45*04fd306cSNickeau * If there is no info, nothing to show 46*04fd306cSNickeau */ 47*04fd306cSNickeau if (!array_key_exists(renderer_plugin_combo_analytics::INFO, $rules)) { 48*04fd306cSNickeau return Message::createInfoMessage("No quality rules information to show"); 49*04fd306cSNickeau } 50*04fd306cSNickeau 51*04fd306cSNickeau /** 52*04fd306cSNickeau * The error info 53*04fd306cSNickeau */ 54*04fd306cSNickeau $qualityInfoRules = $rules[renderer_plugin_combo_analytics::INFO]; 55*04fd306cSNickeau 56*04fd306cSNickeau /** 57*04fd306cSNickeau * Excluding the excluded rules 58*04fd306cSNickeau */ 59*04fd306cSNickeau 60*04fd306cSNickeau $excludedRulesConf =ExecutionContext::getActualOrCreateFromEnv()->getConfig()->getValue(QualityMessageHandler::CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING); 61*04fd306cSNickeau $excludedRules = preg_split("/,/", $excludedRulesConf); 62*04fd306cSNickeau foreach ($excludedRules as $excludedRule) { 63*04fd306cSNickeau if (array_key_exists($excludedRule, $qualityInfoRules)) { 64*04fd306cSNickeau unset($qualityInfoRules[$excludedRule]); 65*04fd306cSNickeau } 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau if (sizeof($qualityInfoRules) <= 0) { 69*04fd306cSNickeau return Message::createInfoMessage("No quality rules information to show"); 70*04fd306cSNickeau } 71*04fd306cSNickeau 72*04fd306cSNickeau $qualityScore = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::SCORING][renderer_plugin_combo_analytics::SCORE]; 73*04fd306cSNickeau $message = "<p>The page has a " . PluginUtility::getDocumentationHyperLink("quality:score", "quality score") . " of {$qualityScore}.</p>"; 74*04fd306cSNickeau 75*04fd306cSNickeau $lowQuality = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::LOW]; 76*04fd306cSNickeau if ($lowQuality) { 77*04fd306cSNickeau 78*04fd306cSNickeau $mandatoryFailedRules = $analyticsArray[renderer_plugin_combo_analytics::QUALITY][renderer_plugin_combo_analytics::FAILED_MANDATORY_RULES]; 79*04fd306cSNickeau $rulesUrl = PluginUtility::getDocumentationHyperLink("quality:rule", "rules"); 80*04fd306cSNickeau $lqPageUrl = PluginUtility::getDocumentationHyperLink("low_quality_page", "low quality page"); 81*04fd306cSNickeau $message .= "<div class='alert alert-warning'>This is a {$lqPageUrl} because it has failed the following mandatory {$rulesUrl}:"; 82*04fd306cSNickeau $message .= "<ul style='margin-bottom: 0'>"; 83*04fd306cSNickeau /** 84*04fd306cSNickeau * A low quality page should have 85*04fd306cSNickeau * failed mandatory rules 86*04fd306cSNickeau * but due to the asycn nature, sometimes 87*04fd306cSNickeau * we don't have an array 88*04fd306cSNickeau */ 89*04fd306cSNickeau if (is_array($mandatoryFailedRules)) { 90*04fd306cSNickeau foreach ($mandatoryFailedRules as $mandatoryFailedRule) { 91*04fd306cSNickeau $message .= "<li>" . PluginUtility::getDocumentationHyperLink("quality:rule#list", $mandatoryFailedRule) . "</li>"; 92*04fd306cSNickeau } 93*04fd306cSNickeau } 94*04fd306cSNickeau $message .= "</ul>"; 95*04fd306cSNickeau $message .= "</div>"; 96*04fd306cSNickeau } 97*04fd306cSNickeau $message .= "<p>You can still win a couple of points.</p>"; 98*04fd306cSNickeau $message .= "<ul>"; 99*04fd306cSNickeau foreach ($qualityInfoRules as $qualityRule => $qualityInfo) { 100*04fd306cSNickeau $message .= "<li>$qualityInfo</li>"; 101*04fd306cSNickeau } 102*04fd306cSNickeau $message .= "</ul>"; 103*04fd306cSNickeau 104*04fd306cSNickeau $page = MarkupPath::createPageFromPathObject($wikiPath); 105*04fd306cSNickeau $qualityMonitoringIndicator = QualityDynamicMonitoringOverwrite::createFromPage($page)->getValueOrDefault(); 106*04fd306cSNickeau if (!$qualityMonitoringIndicator) { 107*04fd306cSNickeau $docLink = PluginUtility::getDocumentationHyperLink(self::CANONICAL, "configuration"); 108*04fd306cSNickeau $message .= "<p>This page is not quality monitored due its $docLink.</p>"; 109*04fd306cSNickeau } 110*04fd306cSNickeau return Message::createInfoMessage($message); 111*04fd306cSNickeau 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau public static function renderXhtml(TagAttributes $tagAttributes): string 115*04fd306cSNickeau { 116*04fd306cSNickeau $pageId = $tagAttributes->getComponentAttributeValue("page-id"); 117*04fd306cSNickeau if (empty($pageId)) { 118*04fd306cSNickeau $contextPath = ExecutionContext::getActualOrCreateFromEnv()->getContextPath(); 119*04fd306cSNickeau } else { 120*04fd306cSNickeau $contextPath = WikiPath::createMarkupPathFromId($pageId); 121*04fd306cSNickeau } 122*04fd306cSNickeau $message = QualityTag::createQualityReport($contextPath); 123*04fd306cSNickeau return $message->getContent(); 124*04fd306cSNickeau 125*04fd306cSNickeau 126*04fd306cSNickeau } 127*04fd306cSNickeau} 128