121913ab3SNickeau<?php 221913ab3SNickeau 337748cd8SNickeauuse ComboStrap\DokuPath; 4*c3437056SNickeauuse ComboStrap\ExceptionCombo; 5*c3437056SNickeauuse ComboStrap\ExceptionComboRuntime; 637748cd8SNickeauuse ComboStrap\LogUtility; 7*c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore; 8*c3437056SNickeauuse ComboStrap\MetadataFrontmatterStore; 937748cd8SNickeauuse ComboStrap\Page; 10*c3437056SNickeauuse ComboStrap\Metadata; 11*c3437056SNickeauuse ComboStrap\PageImages; 12*c3437056SNickeauuse ComboStrap\PageImageUsage; 1321913ab3SNickeauuse ComboStrap\PluginUtility; 1421913ab3SNickeau 1537748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 1621913ab3SNickeau 1721913ab3SNickeau/** 1821913ab3SNickeau * Handle the move of a image 1921913ab3SNickeau */ 2021913ab3SNickeauclass action_plugin_combo_imgmove extends DokuWiki_Action_Plugin 2121913ab3SNickeau{ 22*c3437056SNickeau const CANONICAL = "move"; 2321913ab3SNickeau 2421913ab3SNickeau /** 2521913ab3SNickeau * As explained https://www.dokuwiki.org/plugin:move 2621913ab3SNickeau * @param Doku_Event_Handler $controller 2721913ab3SNickeau */ 2821913ab3SNickeau function register(Doku_Event_Handler $controller) 2921913ab3SNickeau { 3021913ab3SNickeau $controller->register_hook('PLUGIN_MOVE_HANDLERS_REGISTER', 'BEFORE', $this, 'handle_move', array()); 31*c3437056SNickeau 32*c3437056SNickeau 33*c3437056SNickeau $controller->register_hook('PLUGIN_MOVE_MEDIA_RENAME', 'AFTER', $this, 'fileSystemStoreUpdate', array()); 34*c3437056SNickeau } 35*c3437056SNickeau 36*c3437056SNickeau /** 37*c3437056SNickeau * Update the metadatas 38*c3437056SNickeau * @param Doku_Event $event 39*c3437056SNickeau * @param $params 40*c3437056SNickeau */ 41*c3437056SNickeau function fileSystemStoreUpdate(Doku_Event $event, $params) 42*c3437056SNickeau { 43*c3437056SNickeau 44*c3437056SNickeau $affectedPagesId = $event->data["affected_pages"]; 45*c3437056SNickeau $sourceImageId = $event->data["src_id"]; 46*c3437056SNickeau $targetImageId = $event->data["dst_id"]; 47*c3437056SNickeau foreach ($affectedPagesId as $affectedPageId) { 48*c3437056SNickeau $affectedPage = Page::createPageFromId($affectedPageId) 49*c3437056SNickeau ->setReadStore(MetadataDokuWikiStore::class); 50*c3437056SNickeau 51*c3437056SNickeau $pageImages = PageImages::createForPage($affectedPage); 52*c3437056SNickeau 53*c3437056SNickeau $sourceImagePath = ":$sourceImageId"; 54*c3437056SNickeau $row = $pageImages->getRow($sourceImagePath); 55*c3437056SNickeau 56*c3437056SNickeau if ($row === null) { 57*c3437056SNickeau // This is a move of an image in the markup 58*c3437056SNickeau continue; 59*c3437056SNickeau } 60*c3437056SNickeau $pageImages->remove($sourceImagePath); 61*c3437056SNickeau try { 62*c3437056SNickeau $imageUsage = $row[PageImageUsage::getPersistentName()]; 63*c3437056SNickeau $imageUsageValue = null; 64*c3437056SNickeau if ($imageUsage !== null) { 65*c3437056SNickeau $imageUsageValue = $imageUsage->getValue(); 66*c3437056SNickeau } 67*c3437056SNickeau $pageImages 68*c3437056SNickeau ->addImage($targetImageId, $imageUsageValue) 69*c3437056SNickeau ->persist(); 70*c3437056SNickeau } catch (ExceptionCombo $e) { 71*c3437056SNickeau LogUtility::log2file($e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical()); 72*c3437056SNickeau } 73*c3437056SNickeau 74*c3437056SNickeau 75*c3437056SNickeau } 76*c3437056SNickeau 7721913ab3SNickeau } 7821913ab3SNickeau 7921913ab3SNickeau /** 8021913ab3SNickeau * Handle the move of a image 8121913ab3SNickeau * @param Doku_Event $event 8221913ab3SNickeau * @param $params 8321913ab3SNickeau */ 8421913ab3SNickeau function handle_move(Doku_Event $event, $params) 8521913ab3SNickeau { 8621913ab3SNickeau /** 8721913ab3SNickeau * The handlers is the name of the component (ie refers to the {@link syntax_plugin_combo_media} handler) 8821913ab3SNickeau * and 'move_combo_img' to the below method 8921913ab3SNickeau */ 9021913ab3SNickeau $event->data['handlers'][syntax_plugin_combo_media::COMPONENT] = array($this, 'move_combo_img'); 9137748cd8SNickeau $event->data['handlers'][syntax_plugin_combo_frontmatter::COMPONENT] = array($this, 'move_combo_frontmatter_img'); 92*c3437056SNickeau 9321913ab3SNickeau } 9421913ab3SNickeau 9521913ab3SNickeau /** 9621913ab3SNickeau * 9721913ab3SNickeau * @param $match 9821913ab3SNickeau * @param $state 9921913ab3SNickeau * @param $pos 10021913ab3SNickeau * @param $plugin 10121913ab3SNickeau * @param helper_plugin_move_handler $handler 10221913ab3SNickeau */ 10321913ab3SNickeau public function move_combo_img($match, $state, $pos, $plugin, helper_plugin_move_handler $handler) 10421913ab3SNickeau { 10521913ab3SNickeau /** 10621913ab3SNickeau * The original move method 10721913ab3SNickeau * is {@link helper_plugin_move_handler::media()} 108*c3437056SNickeau * Rewrite the media links match 109*c3437056SNickeau * from {@link syntax_plugin_combo_media} 11021913ab3SNickeau */ 11121913ab3SNickeau $handler->media($match, $state, $pos); 11221913ab3SNickeau 11321913ab3SNickeau } 11421913ab3SNickeau 11537748cd8SNickeau /** 11637748cd8SNickeau * 11737748cd8SNickeau * @param $match 11837748cd8SNickeau * @param $state 11937748cd8SNickeau * @param $pos 12037748cd8SNickeau * @param $plugin 12137748cd8SNickeau * @param helper_plugin_move_handler $handler 12237748cd8SNickeau * @return string 12337748cd8SNickeau */ 12437748cd8SNickeau public function move_combo_frontmatter_img($match, $state, $pos, $plugin, helper_plugin_move_handler $handler) 12537748cd8SNickeau { 12637748cd8SNickeau /** 12737748cd8SNickeau * The original move method 12837748cd8SNickeau * is {@link helper_plugin_move_handler::media()} 12937748cd8SNickeau */ 130*c3437056SNickeau $page = Page::createPageFromId("move-fake-id"); 131*c3437056SNickeau try { 132*c3437056SNickeau $metadataFrontmatterStore = MetadataFrontmatterStore::createFromFrontmatterString($page, $match); 133*c3437056SNickeau } catch (ExceptionCombo $e) { 134*c3437056SNickeau LogUtility::msg("The frontmatter could not be loaded. " . $e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical()); 13537748cd8SNickeau return $match; 136*c3437056SNickeau } 137*c3437056SNickeau $pageImagesObject = PageImages::createForPage($page) 138*c3437056SNickeau ->setReadStore($metadataFrontmatterStore); 139*c3437056SNickeau $images = $pageImagesObject->getValueAsPageImages(); 140*c3437056SNickeau if ($images === null) { 14137748cd8SNickeau return $match; 14237748cd8SNickeau } 14337748cd8SNickeau 14437748cd8SNickeau try { 145*c3437056SNickeau 146*c3437056SNickeau foreach ($images as $image) { 147*c3437056SNickeau $path = $image->getImage()->getPath(); 148*c3437056SNickeau if (!($path instanceof DokuPath)) { 149*c3437056SNickeau continue; 15037748cd8SNickeau } 151*c3437056SNickeau $imageId = $path->toAbsolutePath()->toString(); 152*c3437056SNickeau $before = $imageId; 153*c3437056SNickeau $this->moveImage($imageId, $handler); 154*c3437056SNickeau if ($before != $imageId) { 155*c3437056SNickeau $pageImagesObject->remove($before); 156*c3437056SNickeau $pageImagesObject->addImage($imageId, $image->getUsages()); 15737748cd8SNickeau } 15837748cd8SNickeau } 15937748cd8SNickeau 160*c3437056SNickeau $pageImagesObject->sendToWriteStore(); 161*c3437056SNickeau 162*c3437056SNickeau } catch (ExceptionCombo $e) { 163*c3437056SNickeau // Could not resolve the image, image does not exist, ... return the data without modification 164*c3437056SNickeau if (PluginUtility::isDevOrTest()) { 165*c3437056SNickeau throw new ExceptionComboRuntime($e->getMessage(), $e->getCanonical(), 0, $e); 166*c3437056SNickeau } else { 167*c3437056SNickeau LogUtility::log2file($e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical()); 168*c3437056SNickeau } 16937748cd8SNickeau return $match; 17037748cd8SNickeau } 17137748cd8SNickeau 17237748cd8SNickeau /** 17337748cd8SNickeau * All good, 174*c3437056SNickeau * We don't modify the file system metadata for the page 17537748cd8SNickeau * because the handler does not give it unfortunately 17637748cd8SNickeau */ 177*c3437056SNickeau return $metadataFrontmatterStore->toFrontmatterString(); 17837748cd8SNickeau 17937748cd8SNickeau } 18037748cd8SNickeau 18137748cd8SNickeau /** 18237748cd8SNickeau * Move a single image and update the JSon 183*c3437056SNickeau * @param $relativeOrAbsoluteWikiId 18437748cd8SNickeau * @param helper_plugin_move_handler $handler 185*c3437056SNickeau * @throws ExceptionCombo on bad argument 18637748cd8SNickeau */ 187*c3437056SNickeau private function moveImage(&$relativeOrAbsoluteWikiId, helper_plugin_move_handler $handler) 18837748cd8SNickeau { 18937748cd8SNickeau try { 190*c3437056SNickeau $newId = $handler->resolveMoves($relativeOrAbsoluteWikiId, "media"); 191*c3437056SNickeau $relativeOrAbsoluteWikiId = DokuPath::IdToAbsolutePath($newId); 19237748cd8SNickeau } catch (Exception $e) { 193*c3437056SNickeau throw new ExceptionCombo("A move error has occurred while trying to move the image ($relativeOrAbsoluteWikiId). The target resolution function send the following error message: " . $e->getMessage(), self::CANONICAL); 19437748cd8SNickeau } 19537748cd8SNickeau } 19637748cd8SNickeau 19721913ab3SNickeau 19821913ab3SNickeau} 199