xref: /template/strap/action/imgmove.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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