xref: /plugin/combo/action/metaprocessing.php (revision 14735bf43557de9315964a8fb50c4a40fa47cd3b)
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeau
404fd306cSNickeauuse ComboStrap\ExceptionNotFound;
504fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
604fd306cSNickeauuse ComboStrap\ExecutionContext;
704fd306cSNickeauuse ComboStrap\LogUtility;
804fd306cSNickeauuse ComboStrap\MarkupPath;
904fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
1004fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem;
1104fd306cSNickeauuse ComboStrap\MetadataDokuWikiArrayStore;
1204fd306cSNickeauuse ComboStrap\MetadataFrontmatterStore;
1304fd306cSNickeauuse ComboStrap\MetadataMutation;
1404fd306cSNickeauuse ComboStrap\Meta\Field\PageImages;
1504fd306cSNickeauuse ComboStrap\PluginUtility;
1604fd306cSNickeauuse ComboStrap\References;
1704fd306cSNickeau
1804fd306cSNickeau/**
1904fd306cSNickeau *
2004fd306cSNickeau * Handle meta rendering processing
2104fd306cSNickeau * * notifiy of changes
2204fd306cSNickeau * * and other
2304fd306cSNickeau *
2404fd306cSNickeau *
2504fd306cSNickeau * The changes notification takes place at the document level
2604fd306cSNickeau * because we want to notify modication on array level (such as references, images)
2704fd306cSNickeau * and not only on scalar.
2804fd306cSNickeau */
2904fd306cSNickeauclass action_plugin_combo_metaprocessing extends DokuWiki_Action_Plugin
3004fd306cSNickeau{
3104fd306cSNickeau
3204fd306cSNickeau
3304fd306cSNickeau    private array $beforeMetaArray;
3404fd306cSNickeau
3504fd306cSNickeau    public function register(Doku_Event_Handler $controller)
3604fd306cSNickeau    {
3704fd306cSNickeau        /**
3804fd306cSNickeau         * https://www.dokuwiki.org/devel:event:parser_metadata_render
3904fd306cSNickeau         */
4004fd306cSNickeau        $controller->register_hook('PARSER_METADATA_RENDER', 'BEFORE', $this, 'metadataProcessingBefore', array());
4104fd306cSNickeau        $controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'metadataProcessingAfter', array());
4204fd306cSNickeau
4304fd306cSNickeau
4404fd306cSNickeau    }
4504fd306cSNickeau
4604fd306cSNickeau
4704fd306cSNickeau    function metadataProcessingBefore($event)
4804fd306cSNickeau    {
4904fd306cSNickeau
5004fd306cSNickeau        /**
5104fd306cSNickeau         * Capture the before state
5204fd306cSNickeau         */
5304fd306cSNickeau        if (isset($this->beforeMetaArray)) {
5404fd306cSNickeau            throw new ExceptionRuntimeInternal("The before variable should be unset in the after method");
5504fd306cSNickeau        }
5604fd306cSNickeau        $this->beforeMetaArray = $event->data;
5704fd306cSNickeau    }
5804fd306cSNickeau
5904fd306cSNickeau    function metadataProcessingAfter($event)
6004fd306cSNickeau    {
6104fd306cSNickeau
6204fd306cSNickeau        $afterMetaArray = &$event->data;
6304fd306cSNickeau        $beforeMetaArray = $this->beforeMetaArray;
6404fd306cSNickeau        unset($this->beforeMetaArray);
6504fd306cSNickeau
6604fd306cSNickeau        $afterId = $afterMetaArray["page"];
6704fd306cSNickeau        $beforeId = $beforeMetaArray["page"];
6804fd306cSNickeau        if ($afterId !== $beforeId) {
6904fd306cSNickeau            LogUtility::internalError("The before ($beforeId) and after id ($afterId) are not the same", get_class($this));
7004fd306cSNickeau            return;
7104fd306cSNickeau        }
7204fd306cSNickeau
7304fd306cSNickeau        /**
7404fd306cSNickeau         * To avoid
7504fd306cSNickeau         * Console Info: slot_footer.xhtml: Cache (1681473480)
7604fd306cSNickeau         * is older than dependent C:\Users\GERARD~1\AppData\Local\Temp\dwtests-1681473476.2836\data\meta\cache_manager_slot_test.meta (1681473480), cache is not usable
7704fd306cSNickeau         * See {@link \ComboStrap\Test\TestUtility::WaitToCreateCacheFile1SecLater()}
7804fd306cSNickeau         */
7904fd306cSNickeau        if(PluginUtility::isDevOrTest()){
8004fd306cSNickeau            sleep(1);
8104fd306cSNickeau        }
8204fd306cSNickeau
8304fd306cSNickeau        $page = MarkupPath::createMarkupFromId($afterId);
8404fd306cSNickeau
8504fd306cSNickeau        $primaryMetas = action_plugin_combo_pageprimarymetamutation::PRIMARY_METAS;
8604fd306cSNickeau        $referencesAttributes = [References::getPersistentName()];
8704fd306cSNickeau        $qualityMetadata = action_plugin_combo_qualitymutation::getQualityMetas();
8804fd306cSNickeau        $attributes = array_merge($primaryMetas, $referencesAttributes, $qualityMetadata);
8904fd306cSNickeau
9004fd306cSNickeau        $beforeStore = MetadataDokuWikiArrayStore::getOrCreateFromResource($page, $beforeMetaArray);
9104fd306cSNickeau        $afterStore = MetadataDokuWikiArrayStore::getOrCreateFromResource($page, $afterMetaArray);
9204fd306cSNickeau        /**
9304fd306cSNickeau         * The data should be formatted as if it was for the frontmatter
9404fd306cSNickeau         * TODO: make it a default for the mutation system ??
9504fd306cSNickeau         */
9604fd306cSNickeau        $targetStoreFormat = MetadataFrontmatterStore::class;
9704fd306cSNickeau        foreach ($attributes as $attribute) {
9804fd306cSNickeau
9904fd306cSNickeau            try {
10004fd306cSNickeau                $beforeMeta = MetadataSystem::getForName($attribute)
10104fd306cSNickeau                    ->setReadStore($beforeStore)
10204fd306cSNickeau                    ->setWriteStore($targetStoreFormat)
10304fd306cSNickeau                    ->setResource($page);
10404fd306cSNickeau                $afterMeta = MetadataSystem::getForName($attribute)
10504fd306cSNickeau                    ->setReadStore($afterStore)
10604fd306cSNickeau                    ->setWriteStore($targetStoreFormat)
10704fd306cSNickeau                    ->setResource($page);
10804fd306cSNickeau            } catch (ExceptionNotFound $e) {
10904fd306cSNickeau                LogUtility::internalError("The metadata was not found for the attribute ($attribute)");
11004fd306cSNickeau                continue;
11104fd306cSNickeau            }
11204fd306cSNickeau
113*14735bf4Sgerardnico            try {
114*14735bf4Sgerardnico                $beforeMeta->getValue();
11504fd306cSNickeau                $valueBefore = $beforeMeta->toStoreValue();
116*14735bf4Sgerardnico            } catch (Exception $e) {
117*14735bf4Sgerardnico                // first value
118*14735bf4Sgerardnico                $valueBefore = null;
119*14735bf4Sgerardnico            }
12004fd306cSNickeau
121*14735bf4Sgerardnico            $valueAfter = $afterMeta->toStoreValue();
12204fd306cSNickeau            MetadataMutation::notifyMetadataMutation($attribute, $valueBefore, $valueAfter, $page);
123*14735bf4Sgerardnico
12404fd306cSNickeau        }
12504fd306cSNickeau
12604fd306cSNickeau        /**
12704fd306cSNickeau         * Trick, don't know if this is always true
12804fd306cSNickeau         */
12904fd306cSNickeau        PageImages::createForPage($page)->modifyMetaDokuWikiArray($event->data);
13004fd306cSNickeau
13104fd306cSNickeau    }
13204fd306cSNickeau
13304fd306cSNickeau}
134