xref: /plugin/combo/action/qualitymutation.php (revision cc61058412fea34c761a0cc9a2fd45c3b979220b)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeauuse ComboStrap\CacheLog;
4*cc610584Sgerardnicouse ComboStrap\DataType;
54cadd4f8SNickeauuse ComboStrap\Event;
604fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
704fd306cSNickeauuse ComboStrap\ExceptionNotExists;
84cadd4f8SNickeauuse ComboStrap\LogUtility;
94cadd4f8SNickeauuse ComboStrap\LowQualityCalculatedIndicator;
104cadd4f8SNickeauuse ComboStrap\LowQualityPageOverwrite;
1104fd306cSNickeauuse ComboStrap\MarkupPath;
1204fd306cSNickeauuse ComboStrap\MetadataMutation;
134cadd4f8SNickeauuse ComboStrap\PagePath;
144cadd4f8SNickeauuse ComboStrap\Site;
154cadd4f8SNickeau
164cadd4f8SNickeau
174cadd4f8SNickeau/**
1804fd306cSNickeau * Delete the backlinks when there is a page quality mutation
194cadd4f8SNickeau */
204cadd4f8SNickeauclass action_plugin_combo_qualitymutation extends DokuWiki_Action_Plugin
214cadd4f8SNickeau{
224cadd4f8SNickeau
234cadd4f8SNickeau
244cadd4f8SNickeau    public const QUALITY_MUTATION_EVENT_NAME = 'quality_mutation';
254cadd4f8SNickeau    const CANONICAL = "low_quality";
264cadd4f8SNickeau    const DESC = "desc";
274cadd4f8SNickeau
2804fd306cSNickeau    public static function getQualityMetas(): array
2904fd306cSNickeau    {
3004fd306cSNickeau        return [
3104fd306cSNickeau            LowQualityCalculatedIndicator::getPersistentName(),
3204fd306cSNickeau            LowQualityPageOverwrite::getPersistentName()
3304fd306cSNickeau        ];
3404fd306cSNickeau    }
3504fd306cSNickeau
364cadd4f8SNickeau
374cadd4f8SNickeau    public function register(Doku_Event_Handler $controller)
384cadd4f8SNickeau    {
394cadd4f8SNickeau
404cadd4f8SNickeau
414cadd4f8SNickeau        /**
424cadd4f8SNickeau         * create the async event
434cadd4f8SNickeau         */
4404fd306cSNickeau        $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_quality_mutation', array());
454cadd4f8SNickeau
464cadd4f8SNickeau        /**
474cadd4f8SNickeau         * process the Async event
484cadd4f8SNickeau         */
494cadd4f8SNickeau        $controller->register_hook(self::QUALITY_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_quality_mutation');
504cadd4f8SNickeau
514cadd4f8SNickeau
524cadd4f8SNickeau    }
534cadd4f8SNickeau
544cadd4f8SNickeau
554cadd4f8SNickeau    public function handle_quality_mutation(Doku_Event $event, $param)
564cadd4f8SNickeau    {
574cadd4f8SNickeau
584cadd4f8SNickeau
594cadd4f8SNickeau        $data = $event->data;
604cadd4f8SNickeau        $path = $data[PagePath::getPersistentName()];
6104fd306cSNickeau        $page = MarkupPath::createPageFromAbsoluteId($path);
624cadd4f8SNickeau
634cadd4f8SNickeau        if (!$page->getCanBeOfLowQuality()) {
644cadd4f8SNickeau            return;
654cadd4f8SNickeau        }
664cadd4f8SNickeau
674cadd4f8SNickeau        /**
684cadd4f8SNickeau         * Delete the html document cache to rewrite the links
694cadd4f8SNickeau         *
704cadd4f8SNickeau         */
714cadd4f8SNickeau        foreach ($page->getBacklinks() as $backlink) {
7204fd306cSNickeau            try {
7304fd306cSNickeau                $htmlDocument = $backlink->createHtmlFetcherWithItselfAsContextPath();
7404fd306cSNickeau            } catch (ExceptionNotExists $e) {
7504fd306cSNickeau                continue;
7604fd306cSNickeau            }
7704fd306cSNickeau            try {
7804fd306cSNickeau                $wikiId = $backlink->getWikiId();
7904fd306cSNickeau            } catch (ExceptionBadArgument $e) {
8004fd306cSNickeau                LogUtility::internalError("Backlink should be only for wiki path");
8104fd306cSNickeau                continue;
8204fd306cSNickeau            }
834cadd4f8SNickeau            $desc = $data[self::DESC];
844cadd4f8SNickeau            CacheLog::deleteCacheIfExistsAndLog(
854cadd4f8SNickeau                $htmlDocument,
864cadd4f8SNickeau                self::QUALITY_MUTATION_EVENT_NAME,
8704fd306cSNickeau                "The {$wikiId} of {$path} had its HTML cache deleted ($desc)."
884cadd4f8SNickeau            );
8904fd306cSNickeau
904cadd4f8SNickeau        }
914cadd4f8SNickeau    }
924cadd4f8SNickeau
934cadd4f8SNickeau
944cadd4f8SNickeau    /**
954cadd4f8SNickeau     */
964cadd4f8SNickeau    function create_quality_mutation(Doku_Event $event, $params): void
974cadd4f8SNickeau    {
984cadd4f8SNickeau
994cadd4f8SNickeau        if (!Site::isLowQualityProtectionEnable()) {
1004cadd4f8SNickeau            return;
1014cadd4f8SNickeau        }
1024cadd4f8SNickeau
1034cadd4f8SNickeau        /**
1044cadd4f8SNickeau         * If this is not a mutation on references we return.
1054cadd4f8SNickeau         */
1064cadd4f8SNickeau        $data = $event->data;
1074cadd4f8SNickeau        $variableName = $data["name"];
10804fd306cSNickeau        if (!(in_array($variableName, self::getQualityMetas()))) {
1094cadd4f8SNickeau            return;
1104cadd4f8SNickeau        }
1114cadd4f8SNickeau
112*cc610584Sgerardnico        $newValue = DataType::toString($data[MetadataMutation::NEW_VALUE_ATTRIBUTE]);
113*cc610584Sgerardnico        $oldValue = DataType::toString($data[MetadataMutation::OLD_VALUE_ATTRIBUTE]);
1144cadd4f8SNickeau        $path = $data[PagePath::getPersistentName()];
1154cadd4f8SNickeau        Event::createEvent(
1164cadd4f8SNickeau            self::QUALITY_MUTATION_EVENT_NAME,
1174cadd4f8SNickeau            [
1184cadd4f8SNickeau                PagePath::getPersistentName() => $path,
119*cc610584Sgerardnico                self::DESC => "The variable ($variableName) has the new value ($newValue) overriding ($oldValue)"
1204cadd4f8SNickeau            ]
1214cadd4f8SNickeau        );
1224cadd4f8SNickeau
1234cadd4f8SNickeau
1244cadd4f8SNickeau    }
1254cadd4f8SNickeau
1264cadd4f8SNickeau}
1274cadd4f8SNickeau
1284cadd4f8SNickeau
1294cadd4f8SNickeau
130