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