$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) {
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']);
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 = [];
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';