xref: /plugin/combo/action/qualitymutation.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeauuse ComboStrap\CacheLog;
44cadd4f8SNickeauuse ComboStrap\CacheManager;
54cadd4f8SNickeauuse ComboStrap\Event;
6*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
7*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
8*04fd306cSNickeauuse ComboStrap\ExceptionNotExists;
94cadd4f8SNickeauuse ComboStrap\FileSystems;
104cadd4f8SNickeauuse ComboStrap\LogUtility;
114cadd4f8SNickeauuse ComboStrap\LowQualityCalculatedIndicator;
124cadd4f8SNickeauuse ComboStrap\LowQualityPageOverwrite;
13*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
14*04fd306cSNickeauuse ComboStrap\MarkupPath;
15*04fd306cSNickeauuse ComboStrap\MetadataMutation;
164cadd4f8SNickeauuse ComboStrap\PagePath;
174cadd4f8SNickeauuse ComboStrap\Site;
184cadd4f8SNickeau
194cadd4f8SNickeau
204cadd4f8SNickeau
214cadd4f8SNickeau/**
22*04fd306cSNickeau * Delete the backlinks when there is a page quality mutation
234cadd4f8SNickeau */
244cadd4f8SNickeauclass action_plugin_combo_qualitymutation extends DokuWiki_Action_Plugin
254cadd4f8SNickeau{
264cadd4f8SNickeau
274cadd4f8SNickeau
284cadd4f8SNickeau    public const QUALITY_MUTATION_EVENT_NAME = 'quality_mutation';
294cadd4f8SNickeau    const CANONICAL = "low_quality";
304cadd4f8SNickeau    const DESC = "desc";
314cadd4f8SNickeau
32*04fd306cSNickeau    public static function getQualityMetas(): array
33*04fd306cSNickeau    {
34*04fd306cSNickeau        return [
35*04fd306cSNickeau            LowQualityCalculatedIndicator::getPersistentName(),
36*04fd306cSNickeau            LowQualityPageOverwrite::getPersistentName()
37*04fd306cSNickeau        ];
38*04fd306cSNickeau    }
39*04fd306cSNickeau
404cadd4f8SNickeau
414cadd4f8SNickeau    public function register(Doku_Event_Handler $controller)
424cadd4f8SNickeau    {
434cadd4f8SNickeau
444cadd4f8SNickeau
454cadd4f8SNickeau        /**
464cadd4f8SNickeau         * create the async event
474cadd4f8SNickeau         */
48*04fd306cSNickeau        $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_quality_mutation', array());
494cadd4f8SNickeau
504cadd4f8SNickeau        /**
514cadd4f8SNickeau         * process the Async event
524cadd4f8SNickeau         */
534cadd4f8SNickeau        $controller->register_hook(self::QUALITY_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_quality_mutation');
544cadd4f8SNickeau
554cadd4f8SNickeau
564cadd4f8SNickeau    }
574cadd4f8SNickeau
584cadd4f8SNickeau
594cadd4f8SNickeau    public function handle_quality_mutation(Doku_Event $event, $param)
604cadd4f8SNickeau    {
614cadd4f8SNickeau
624cadd4f8SNickeau
634cadd4f8SNickeau        $data = $event->data;
644cadd4f8SNickeau        $path = $data[PagePath::getPersistentName()];
65*04fd306cSNickeau        $page = MarkupPath::createPageFromAbsoluteId($path);
664cadd4f8SNickeau
674cadd4f8SNickeau        if (!$page->getCanBeOfLowQuality()) {
684cadd4f8SNickeau            return;
694cadd4f8SNickeau        }
704cadd4f8SNickeau
714cadd4f8SNickeau        /**
724cadd4f8SNickeau         * Delete the html document cache to rewrite the links
734cadd4f8SNickeau         *
744cadd4f8SNickeau         */
754cadd4f8SNickeau        foreach ($page->getBacklinks() as $backlink) {
76*04fd306cSNickeau            try {
77*04fd306cSNickeau                $htmlDocument = $backlink->createHtmlFetcherWithItselfAsContextPath();
78*04fd306cSNickeau            } catch (ExceptionNotExists $e) {
79*04fd306cSNickeau                continue;
80*04fd306cSNickeau            }
81*04fd306cSNickeau            try {
82*04fd306cSNickeau                $wikiId = $backlink->getWikiId();
83*04fd306cSNickeau            } catch (ExceptionBadArgument $e) {
84*04fd306cSNickeau                LogUtility::internalError("Backlink should be only for wiki path");
85*04fd306cSNickeau                continue;
86*04fd306cSNickeau            }
874cadd4f8SNickeau            $desc = $data[self::DESC];
884cadd4f8SNickeau            CacheLog::deleteCacheIfExistsAndLog(
894cadd4f8SNickeau                $htmlDocument,
904cadd4f8SNickeau                self::QUALITY_MUTATION_EVENT_NAME,
91*04fd306cSNickeau                "The {$wikiId} of {$path} had its HTML cache deleted ($desc)."
924cadd4f8SNickeau            );
93*04fd306cSNickeau
944cadd4f8SNickeau        }
954cadd4f8SNickeau    }
964cadd4f8SNickeau
974cadd4f8SNickeau
984cadd4f8SNickeau    /**
994cadd4f8SNickeau     */
1004cadd4f8SNickeau    function create_quality_mutation(Doku_Event $event, $params): void
1014cadd4f8SNickeau    {
1024cadd4f8SNickeau
1034cadd4f8SNickeau        if (!Site::isLowQualityProtectionEnable()) {
1044cadd4f8SNickeau            return;
1054cadd4f8SNickeau        }
1064cadd4f8SNickeau
1074cadd4f8SNickeau        /**
1084cadd4f8SNickeau         * If this is not a mutation on references we return.
1094cadd4f8SNickeau         */
1104cadd4f8SNickeau        $data = $event->data;
1114cadd4f8SNickeau        $variableName = $data["name"];
112*04fd306cSNickeau        if (!(in_array($variableName, self::getQualityMetas()))) {
1134cadd4f8SNickeau            return;
1144cadd4f8SNickeau        }
1154cadd4f8SNickeau
116*04fd306cSNickeau        $newValue = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE];
1174cadd4f8SNickeau        $path = $data[PagePath::getPersistentName()];
1184cadd4f8SNickeau        Event::createEvent(
1194cadd4f8SNickeau            self::QUALITY_MUTATION_EVENT_NAME,
1204cadd4f8SNickeau            [
1214cadd4f8SNickeau                PagePath::getPersistentName() => $path,
1224cadd4f8SNickeau                self::DESC => "The variable ($variableName) has the new value ($newValue)"
1234cadd4f8SNickeau            ]
1244cadd4f8SNickeau        );
1254cadd4f8SNickeau
1264cadd4f8SNickeau
1274cadd4f8SNickeau    }
1284cadd4f8SNickeau
1294cadd4f8SNickeau}
1304cadd4f8SNickeau
1314cadd4f8SNickeau
1324cadd4f8SNickeau
133