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