121913ab3SNickeau<?php 221913ab3SNickeau 3*37748cd8SNickeauuse ComboStrap\DokuPath; 421913ab3SNickeauuse ComboStrap\LinkUtility; 5*37748cd8SNickeauuse ComboStrap\LogUtility; 6*37748cd8SNickeauuse ComboStrap\Page; 721913ab3SNickeauuse ComboStrap\PluginUtility; 821913ab3SNickeau 921913ab3SNickeauif (!defined('DOKU_INC')) die(); 10*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 11*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/LinkUtility.php'); 1221913ab3SNickeau 1321913ab3SNickeau/** 1421913ab3SNickeau * Handle the move of a image 1521913ab3SNickeau */ 1621913ab3SNickeauclass action_plugin_combo_imgmove extends DokuWiki_Action_Plugin 1721913ab3SNickeau{ 1821913ab3SNickeau 1921913ab3SNickeau /** 2021913ab3SNickeau * As explained https://www.dokuwiki.org/plugin:move 2121913ab3SNickeau * @param Doku_Event_Handler $controller 2221913ab3SNickeau */ 2321913ab3SNickeau function register(Doku_Event_Handler $controller) 2421913ab3SNickeau { 2521913ab3SNickeau $controller->register_hook('PLUGIN_MOVE_HANDLERS_REGISTER', 'BEFORE', $this, 'handle_move', array()); 2621913ab3SNickeau } 2721913ab3SNickeau 2821913ab3SNickeau /** 2921913ab3SNickeau * Handle the move of a image 3021913ab3SNickeau * @param Doku_Event $event 3121913ab3SNickeau * @param $params 3221913ab3SNickeau */ 3321913ab3SNickeau function handle_move(Doku_Event $event, $params) 3421913ab3SNickeau { 3521913ab3SNickeau /** 3621913ab3SNickeau * The handlers is the name of the component (ie refers to the {@link syntax_plugin_combo_media} handler) 3721913ab3SNickeau * and 'move_combo_img' to the below method 3821913ab3SNickeau */ 3921913ab3SNickeau $event->data['handlers'][syntax_plugin_combo_media::COMPONENT] = array($this, 'move_combo_img'); 40*37748cd8SNickeau $event->data['handlers'][syntax_plugin_combo_frontmatter::COMPONENT] = array($this, 'move_combo_frontmatter_img'); 4121913ab3SNickeau } 4221913ab3SNickeau 4321913ab3SNickeau /** 4421913ab3SNickeau * 4521913ab3SNickeau * @param $match 4621913ab3SNickeau * @param $state 4721913ab3SNickeau * @param $pos 4821913ab3SNickeau * @param $plugin 4921913ab3SNickeau * @param helper_plugin_move_handler $handler 5021913ab3SNickeau */ 5121913ab3SNickeau public function move_combo_img($match, $state, $pos, $plugin, helper_plugin_move_handler $handler) 5221913ab3SNickeau { 5321913ab3SNickeau /** 5421913ab3SNickeau * The original move method 5521913ab3SNickeau * is {@link helper_plugin_move_handler::media()} 5621913ab3SNickeau * 5721913ab3SNickeau */ 5821913ab3SNickeau $handler->media($match, $state, $pos); 5921913ab3SNickeau 6021913ab3SNickeau } 6121913ab3SNickeau 62*37748cd8SNickeau /** 63*37748cd8SNickeau * 64*37748cd8SNickeau * @param $match 65*37748cd8SNickeau * @param $state 66*37748cd8SNickeau * @param $pos 67*37748cd8SNickeau * @param $plugin 68*37748cd8SNickeau * @param helper_plugin_move_handler $handler 69*37748cd8SNickeau * @return string 70*37748cd8SNickeau */ 71*37748cd8SNickeau public function move_combo_frontmatter_img($match, $state, $pos, $plugin, helper_plugin_move_handler $handler) 72*37748cd8SNickeau { 73*37748cd8SNickeau /** 74*37748cd8SNickeau * The original move method 75*37748cd8SNickeau * is {@link helper_plugin_move_handler::media()} 76*37748cd8SNickeau * 77*37748cd8SNickeau */ 78*37748cd8SNickeau $jsonArray = syntax_plugin_combo_frontmatter::FrontMatterMatchToAssociativeArray($match); 79*37748cd8SNickeau if ($jsonArray === null) { 80*37748cd8SNickeau return $match; 81*37748cd8SNickeau } else { 82*37748cd8SNickeau 83*37748cd8SNickeau if (!isset($jsonArray[Page::IMAGE_META_PROPERTY])) { 84*37748cd8SNickeau return $match; 85*37748cd8SNickeau } 86*37748cd8SNickeau 87*37748cd8SNickeau try { 88*37748cd8SNickeau $images = &$jsonArray[Page::IMAGE_META_PROPERTY]; 89*37748cd8SNickeau if (is_array($images)) { 90*37748cd8SNickeau foreach ($images as &$subImage) { 91*37748cd8SNickeau if (is_array($subImage)) { 92*37748cd8SNickeau foreach($subImage as &$subSubImage){ 93*37748cd8SNickeau if(is_string($subSubImage)) { 94*37748cd8SNickeau $this->moveImage($subSubImage, $handler); 95*37748cd8SNickeau } else { 96*37748cd8SNickeau LogUtility::msg("The image frontmatter value (".hsc(var_export($subSubImage))." is not a string and cannot be therefore moved", LogUtility::LVL_MSG_ERROR,syntax_plugin_combo_frontmatter::METADATA_IMAGE_CANONICAL); 97*37748cd8SNickeau return $match; 98*37748cd8SNickeau } 99*37748cd8SNickeau } 100*37748cd8SNickeau } else { 101*37748cd8SNickeau $this->moveImage( $subImage, $handler); 102*37748cd8SNickeau } 103*37748cd8SNickeau } 104*37748cd8SNickeau } else { 105*37748cd8SNickeau $this->moveImage($images, $handler); 106*37748cd8SNickeau } 107*37748cd8SNickeau } catch(Exception $e){ 108*37748cd8SNickeau // Could not resolve the image, return the data without modification 109*37748cd8SNickeau return $match; 110*37748cd8SNickeau } 111*37748cd8SNickeau 112*37748cd8SNickeau $jsonEncode = json_encode($jsonArray, JSON_PRETTY_PRINT); 113*37748cd8SNickeau if ($jsonEncode === false) { 114*37748cd8SNickeau LogUtility::msg("A move error has occurred while trying to store the modified metadata as json (" . hsc(var_export($images, true)) . ")", LogUtility::LVL_MSG_ERROR); 115*37748cd8SNickeau return $match; 116*37748cd8SNickeau } 117*37748cd8SNickeau $frontmatterStartTag = syntax_plugin_combo_frontmatter::START_TAG; 118*37748cd8SNickeau $frontmatterEndTag = syntax_plugin_combo_frontmatter::END_TAG; 119*37748cd8SNickeau 120*37748cd8SNickeau /** 121*37748cd8SNickeau * All good, 122*37748cd8SNickeau * We don't modify the metadata for the page 123*37748cd8SNickeau * because the handler does not give it unfortunately 124*37748cd8SNickeau */ 125*37748cd8SNickeau 126*37748cd8SNickeau /** 127*37748cd8SNickeau * Return the match modified 128*37748cd8SNickeau */ 129*37748cd8SNickeau return <<<EOF 130*37748cd8SNickeau$frontmatterStartTag 131*37748cd8SNickeau$jsonEncode 132*37748cd8SNickeau$frontmatterEndTag 133*37748cd8SNickeauEOF; 134*37748cd8SNickeau 135*37748cd8SNickeau } 136*37748cd8SNickeau 137*37748cd8SNickeau } 138*37748cd8SNickeau 139*37748cd8SNickeau /** 140*37748cd8SNickeau * Move a single image and update the JSon 141*37748cd8SNickeau * @param $value 142*37748cd8SNickeau * @param helper_plugin_move_handler $handler 143*37748cd8SNickeau * @throws Exception on bad argument 144*37748cd8SNickeau */ 145*37748cd8SNickeau private function moveImage(&$value, $handler) 146*37748cd8SNickeau { 147*37748cd8SNickeau try { 148*37748cd8SNickeau $newId = $handler->resolveMoves($value, "media"); 149*37748cd8SNickeau $value = DokuPath::IdToAbsolutePath($newId); 150*37748cd8SNickeau } catch (Exception $e) { 151*37748cd8SNickeau LogUtility::msg("A move error has occurred while trying to move the image ($value). The target resolution function send the following error message: " . $e->getMessage(), LogUtility::LVL_MSG_ERROR); 152*37748cd8SNickeau throw new RuntimeException(); 153*37748cd8SNickeau } 154*37748cd8SNickeau } 155*37748cd8SNickeau 15621913ab3SNickeau 15721913ab3SNickeau} 158