From 64b7270bfcc558761cef6037f75ce9023d7bdb81 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Fri, 10 Mar 2023 09:43:51 +0100 Subject: [PATCH] wip #5798 @1 --- app/Fluidbook/Links.php | 55 +++++++++++++++++++- resources/views/layouts/linkeditor.blade.php | 2 +- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/app/Fluidbook/Links.php b/app/Fluidbook/Links.php index 3d134fe26..5089daba3 100644 --- a/app/Fluidbook/Links.php +++ b/app/Fluidbook/Links.php @@ -144,6 +144,7 @@ class Links $dir = self::getLinksDir($book_id); $file = Files::firstThatExists($dir . '/' . $time . '.links3.gz', $dir . '/' . $time . '.links.gz'); + $metafile = Files::firstThatExists($dir . '/' . $time . '.meta3.gz', $dir . '/' . $time . '.meta.gz'); if ($time === 'latest' && !file_exists($file)) { $versions = self::getLinksVersions($book_id); foreach ($versions as $version => $m) { @@ -163,7 +164,14 @@ class Links return; } - $r = json_decode(gzdecode(file_get_contents($file)), true); + $r = self::_decodegzfile($file); + $meta = array_merge(['version' => 2, 'onepage' => false], self::_decodegzfile($metafile)); + + /** @var FluidbookPublication $fluidbook */ + $fluidbook = FluidbookPublication::find($book_id); + if ($fluidbook->isOnePage() && !$meta['onepage']) { + self::_moveToOnePageLinks($r['links'], $r['rulers'], $fluidbook); + } $links = self::_UID($r['links']); $rulers = self::_UID($r['rulers']); @@ -177,6 +185,46 @@ class Links self::_fixLinks($links); } + protected static function _decodegzfile($file) + { + return json_decode(gzdecode(file_get_contents($file)), true); + } + + /** + * @param $links array[] + * @param $rulers array[] + * @param $fluidbook FluidbookPublication + * @return void + */ + public static function _moveToOnePageLinks(&$links, &$rulers, $fluidbook) + { + $w = $fluidbook->getPageWidth(); + foreach ($links as $k => $link) { + // Si le lien est totalement hors de la page à droite, on le déplace à la page suivante + if ($link['left'] > $w) { + $link['left'] -= $w; + $link['page']++; + } + // Si le lien est totalement hors de la page à gauche, on le déplace à la page précédente + if ($link['left'] + $link['width'] < 0) { + $link['left'] += $w; + $link['page']--; + } + // Si le lien dépasse à droite, on le déplace à la page suivante si la surface qui dépasse est supérieure à 50% de la surface du lien + if ($link['left'] < $w && $link['left'] + $link['width'] > $w && ($w - $link['left']) < ($link['width'] / 2)) { + $link['left'] -= $w; + $link['page']++; + } + // Si le lien dépasse à gauche, on le déplace à la page précédente si la surface qui dépasse est supérieure à 50% de la surface du lien + if ($link['left'] < 0 && $link['left'] < ($link['width'] / -2)) { + $link['left'] += $w; + $link['page']--; + } + + $links[$k] = $link; + } + } + protected static function _UID($items) { $res = []; @@ -337,8 +385,11 @@ class Links public static function saveLinksInFile($book_id, $user_id, $comments, $links, $rulers = [], $specialLinks = [], $specialRulers = []) { + /** @var FluidbookPublication $fluidbook */ + $fluidbook = FluidbookPublication::find($book_id); + $lr = self::mergeLinksAndRulers($links, $rulers, $specialLinks, $specialRulers); - $meta = ['links' => count($lr['links']), 'rulers' => count($lr['rulers']), 'comments' => $comments, 'user' => $user_id]; + $meta = ['links' => count($lr['links']), 'rulers' => count($lr['rulers']), 'comments' => $comments, 'user' => $user_id, 'version' => 3, 'onepage' => $fluidbook->isOnePage()]; $base = self::getLinksDir($book_id) . '/' . time(); $latestLinks = self::getLinksDir($book_id) . '/latest.links3.gz'; $latestMeta = self::getLinksDir($book_id) . '/latest.meta3.gz'; diff --git a/resources/views/layouts/linkeditor.blade.php b/resources/views/layouts/linkeditor.blade.php index 2e78ac56e..1a16f9915 100644 --- a/resources/views/layouts/linkeditor.blade.php +++ b/resources/views/layouts/linkeditor.blade.php @@ -1,5 +1,5 @@ {{-- __('!! Editeur de liens') --}} - + -- 2.39.5