$pdf->Cell(30, $space, $ttcf . ' euros', 0, 1, 'R');\r
\r
if (isset($notes)) {\r
- $pdf->setXY(8, 275);\r
+ $pdf->setXY(8, 268);\r
$pdf->setTextColor(0, 0, 0);\r
$pdf->setFont('Helvetica', '', 8);\r
$pdf->Cell(195, 0, self::escape($notes), 0, 1, 'R');\r
}\r
\r
public static function exportbookExe($args, &$x) {\r
+ fb($_POST);\r
+\r
+ $dest = array('dir' => null, 'file' => null);\r
+ $dest = array_merge($dest, $_POST['destination']);\r
+\r
$exporter = new wsExporter();\r
- $exporter->export($_POST['book_id'], $x, $_POST['action'], $_POST['version'], $_POST['destination']['dir'], $_POST['destination']['file']);\r
+ $exporter->export($_POST['book_id'], $x, $_POST['action'], $_POST['version'], $dest['dir'], $dest['file']);\r
\r
$x->addClosePopup();\r
}\r
protected static function cleanCachesCollection($id) {\r
$os = array('ios', 'android');\r
$files = array('json', 'update');\r
+ $resolutions = array(150, 300);\r
\r
foreach ($os as $_os) {\r
foreach ($files as $f) {\r
- $ff = WS_COLLECTIONS . '/ws/' . $id . '.' . $_os . '.' . $f;\r
- if (file_exists($ff)) {\r
- unlink($ff);\r
+ foreach ($resolutions as $r) {\r
+ $ff = WS_COLLECTIONS . '/ws/' . $id . '.' . $_os . '.' . $r . '.' . $f;\r
+ if (file_exists($ff)) {\r
+ unlink($ff);\r
+ }\r
}\r
}\r
}\r
}\r
\r
}\r
+\r
?>
\ No newline at end of file
global $core;\r
$id = $this->callArgs[0];\r
$os = $this->callArgs[1];\r
- $local = (isset($this->callArgs[2])) ? $this->callArgs[2] : null;\r
+ $resolution = $this->callArgs[2];\r
+ $local = (isset($this->callArgs[3])) ? $this->callArgs[3] : null;\r
\r
$this->outputXML = false;\r
header('Content-type: application/json');\r
\r
- $cache = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.json';\r
- $update = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.update';\r
+ $cache = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.json';\r
+ $update = WS_COLLECTIONS . '/ws/' . $id . '.' . $os . '.' . $resolution . '.update';\r
\r
if (file_exists($update) && filemtime(__FILE__) > filemtime($update)) {\r
unlink($update);\r
}\r
\r
$d = array('id' => $id, 'langs' => $langs, 'langnames' => $langsnames, 'time' => $version, 'datas' => $composition, 'couvertures' => $couvertures, 'traductions' => $traductions, 'contents' => $collection->contents);\r
- $d = array_merge($d, $this->_getManifest($publications, '/fluidbook/collections/versions/' . $id . '/' . $version . '/' . $os, $books));\r
+ $d = array_merge($d, $this->_getManifest($publications, '/fluidbook/collections/versions/' . $id . '/' . $version . '/' . $os, $books, $resolution));\r
\r
$dao = new wsDAOCollection($core->con);\r
$col = $dao->selectById($id);\r
exit;\r
}\r
\r
- protected function _getManifest($publications, $dir, $books) {\r
+ protected function _getManifest($publications, $dir, $books, $resolution) {\r
global $core;\r
$res = array();\r
$res['manifest'] = array('assetRoot' => 'http://workshop.fluidbook.com' . $dir . '/', 'autoDownload' => true);\r
$book = $books[$p];\r
$theme = $daoTheme->selectById($book->theme);\r
$orders = $this->_getBundles($book);\r
- $reg = $this->_getRegExpManifest($r, $book, $theme);\r
+ $regexp = $this->_getRegExpManifest($r, $book, $theme, $resolution);\r
+ $reg = $regexp['reg'];\r
+ $exclude = $regexp['exclude'];\r
\r
$b = array();\r
\r
continue;\r
}\r
$path = str_replace($removeFromRelative, '', $k);\r
+\r
+ foreach ($exclude as $e) {\r
+ if (preg_match('|' . $e . '|', $path)) {\r
+ continue 2;\r
+ }\r
+ }\r
+\r
$order = $this->_inFirstManifest($path, $orders, $reg);\r
\r
if (!isset($b[$order])) {\r
return $res;\r
}\r
\r
- protected function _getRegExpManifest($r, $book, $theme) {\r
+ protected function _getRegExpManifest($r, $book, $theme, $resolution) {\r
$reg = array();\r
$reg['loading'] = array('^' . $r . 'style/(.*).css$', '^' . $r . 'index.html$', '^' . $r . 'data/style/(.*)$', '^' . $r . 'data/(.*).js$', '^' . $r . 'data/images/' . $theme->parametres->logoLoader . '$', '^' . $r . 'style/fonts/(.*).ttf$');\r
$reg['extras'] = array('^' . $r . 'data/links/(.*)$', '^' . $r . 'data/(.*).pdf$', '^' . $r . 'cover.jpg$');\r
$reg['thumbnails'] = array('^' . $r . 'data/thumbnails/p(\d+).jpg$');\r
for ($i = 1; $i <= $book->parametres->pages; $i++) {\r
$var = 'content_' . $i;\r
- $reg[$var] = array('^' . $r . 'data/background/150/t' . $i . '.jpg$', '^' . $r . 'data/contents/p' . $i . '.svg$');\r
+ $reg[$var] = array('^' . $r . 'data/background/\d+/t' . $i . '.jpg$', '^' . $r . 'data/contents/p' . $i . '.svg$');\r
}\r
$reg['urgents'] = array('^' . $r . 'images/(.*)$', '^' . $r . 'data/images/(.*)$');\r
- return $reg;\r
+ $exclude = array();\r
+ if ($resolution == 150) {\r
+ $er = 300;\r
+ } else {\r
+ $er = 150;\r
+ }\r
+ $exclude[] = '^' . $r . 'data/background/' . $er . '/t\d+.jpg$';\r
+ return array('reg' => $reg, 'exclude' => $exclude);\r
}\r
\r
protected function _inFirstManifest($p, $orders, $reg) {\r
-\r
-\r
foreach ($orders as $list) {\r
foreach ($reg[$list] as $v) {\r
if (preg_match('|' . $v . '|', $p)) {\r
- fb($p);\r
- if ($p == '11461/data/background/150/t25.jpg') {\r
- fb($reg[$list]);\r
- fb($v);\r
- }\r
return $list;\r
}\r
}\r
}\r
\r
protected function _getBundles($book) {\r
- $res = array(0 => 'loading', 200001 => 'extras', 20000 => 'thumbnails', 1 => 'urgents');\r
+ $res = array(0 => 'loading', 20001 => 'extras', 20000 => 'thumbnails', 1 => 'urgents');\r
for ($i = 1; $i <= $book->parametres->pages; $i++) {\r
$k = 2 + $i;\r
$res[$k] = 'content_' . $i;\r
if (is_null($in)) {\r
$in = $this->cropped;\r
}\r
+\r
+ $tmp = cubeFiles::tempnam();\r
+\r
$antialiasing = $antialiasing ? 'yes' : 'no';\r
$freetype = $texts ? 'yes' : 'no';\r
$resolution = $resolution;\r
\r
$pdftoppm->setArg('f', $page);\r
$pdftoppm->setArg('l', $page);\r
-\r
$pdftoppm->setArg('-cropbox');\r
$pdftoppm->setArg('-freetype ' . $freetype);\r
- $pdftoppm->setArg('-jpeg');\r
+ $pdftoppm->setArg('-singlefile');\r
$pdftoppm->setArg('-aa ' . $antialiasing);\r
$pdftoppm->setArg('-aaVector ' . $antialiasing);\r
$pdftoppm->setArg('r', $resolution);\r
$pdftoppm->setArg(null, $in);\r
- $pdftoppm->setArg(null, $this->out . 'ppm');\r
+ $pdftoppm->setArg(null, $tmp);\r
$pdftoppm->execute();\r
$this->addToLog($pdftoppm, true, $page);\r
\r
+ $tmp.='.ppm';\r
+\r
$jpegfile = $this->out . $prefix . $page . '.jpg';\r
\r
- $ppmjpgfile = $this->out . 'ppm-' . cubeMath::fill($page, strlen((string) $this->pages)) . '.jpg';\r
- if (file_exists($ppmjpgfile)) {\r
- rename($ppmjpgfile, $jpegfile);\r
- $this->addToLog('Move ' . $ppmjpgfile . ' to ' . $jpegfile, true, $page);\r
+\r
+ if (file_exists($tmp)) {\r
+ $pnmtojpeg = new cubeCommandLine('pnmtojpeg', $jpegfile, false);\r
+ $pnmtojpeg->setArg('-quality ' . $quality);\r
+ $pnmtojpeg->setArg(null, $tmp);\r
+ $pnmtojpeg->execute();\r
+ $this->addToLog($pnmtojpeg, false, $page);\r
+\r
+ unlink($tmp);\r
}\r
}\r
\r
\r
public function makeHTML5Files($page) {\r
// Then make HD background shots\r
- $resolutions = array(150 => 75, 36 => 80);\r
+ $resolutions = array(300 => 85, 150 => 85, 36 => 85);\r
foreach ($resolutions as $r => $q) {\r
$this->makeShotPNM($page, 'html/h' . $r . '-', $r, $q, 4, null, false);\r
$this->makeShotPNM($page, 'html/t' . $r . '-', $r, $q, 4, null, true);\r
}\r
-\r
$this->makeSVGFile($page);\r
}\r
\r
public function makeSVGFile($page) {\r
- $testFile = $this->out . '/html/s' . $page . '.svg';\r
$svgFile = $this->out . '/html/p' . $page . '.svg';\r
- //$svgSimplified = $this->out . '/html/s' . $page . '.svg';\r
$svgOpt = $this->out . '/html/o' . $page . '.svg';\r
\r
$pdftocairo = new cubeCommandLine('pdftocairo');\r
$pdftocairo->execute();\r
$this->addToLog($pdftocairo, true, $page);\r
\r
- /*$pdf2svg = new cubeCommandLine('pdf2svg');\r
- $pdf2svg->setPath(CONVERTER_PATH);\r
- $pdf2svg->setArg(null, $this->cropped);\r
- $pdf2svg->setArg(null, $testFile);\r
- $pdf2svg->setArg(null, $page);\r
- $pdf2svg->execute();\r
- $this->addToLog($pdf2svg, true, $page);\r
- $this->_cleanSVG($testFile);*/\r
-\r
$this->_cleanSVG($svgFile);\r
- \r
}\r
\r
protected function _cleanSVG($svgFile) {\r
// splashs
$splashs = array('320x480' => 'Default~iphone', '640x960' => 'Default@2x~iphone', '1024x748' => 'Default-Landscape~ipad', '768x1004' => 'Default-Portrait~ipad', '2048x1496' => 'Default-Landscape@2x~ipad', '1536x2008' => 'Default-Portrait@2x~ipad', '640x1136' => 'Default-568h@2x~iphone');
- $d = WS_COLLECTIONS . '/resources/' . $collection->collection_id . '/' . $os . '/splash/';
- if (!file_exists($d)) {
- mkdir($d, 0777, true);
- }
+ $langs = array();
+
+ foreach ($langs as $l) {
+ $src = $compiler->wdir . '/' . $collection->theme['splash_' . $l];
+ if (!file_exists($src)) {
+ continue;
+ }
- $src = $compiler->wdir . '/' . $collection->theme['splash'];
- foreach ($splashs as $size => $name) {
- list($width, $height) = explode('x', $size);
+ $d = WS_COLLECTIONS . '/resources/' . $collection->collection_id . '/' . $os . '/splash/' . $l . '.lproj/';
+ if (!file_exists($d)) {
+ mkdir($d, 0777, true);
+ }
- $dest = $d . $name . '.png';
- if (!$this->_testFile($src, $dest)) {
- $it = new cubeImageTools();
- $it->loadImage($src);
- $it->resize($width, $height, 'crop', false, 'C', 'M', 'transparent');
- $it->output('png', $dest);
+ foreach ($splashs as $size => $name) {
+ list($width, $height) = explode('x', $size);
+
+ $dest = $d . $name . '.png';
+
+ if (!$this->_testFile($src, $dest)) {
+ $it = new cubeImageTools();
+ $it->loadImage($src);
+ $it->resize($width, $height, 'crop', false, 'C', 'M', 'transparent');
+ $it->output('png', $dest);
+ }
}
}
$d = '/' . $this->destinationDir;
$packager = new wsPackagerPhonegap($this->book_id, $d, true, false, $this->version);
- $packager->home=true;
+ $packager->home = true;
return $packager->makePackage(false);
}
$commandes = array(
'set ftp:passive-mode ' . $passive,
+ 'set ssl:verify-certificate no',
'mkdir -p ' . $u['dir']
);
$lftp->setArg('e', implode(';', $commandes));
$lftp->setArg(null, $u['host']);
$lftp->execute();
+
+ fb($lftp->commande);
+ fb($lftp->output);
}
protected function _rsync($src, $dest, $erase = false, $chown = null) {
$c[] = '.mview{background-color:' . $menuColor->toCSS() . ';color:' . $textColor->toCSS() . ';}';
# Topbar
- $top = $menuColor->toCSS();
+ $menu = $top = $menuColor->toCSS();
+ $text = $textColor->toCSS();
$bottom = $menuMultiply->toCSS();
$border = $menuMultiply2->setAlpha(0.6)->toCSS();
$caption.='#bar,.mview{color:' . $textColor->toCSS() . '}';
$caption.=".mview .caption a{
border:1px solid $border;
+ color:$text;
}";
+ $svg = array('interface-back-arrow');
+ foreach ($svg as $icon) {
+ wsTools::colorizeAndRasterizeIcon(1, $icon, $text, $this->vdir . '/images/', 4, $w, $h, true);
+ }
+ $textColor->toCSS();
+
$caption.="#bar{border-bottom:1px solid " . $border . "}";
$c[] = $caption;
$bottom = $menuMultiply->setAlpha(0.5)->toCSS();
$border = $menuMultiply2->setAlpha(0.5)->toCSS();
+ $c[] = '.mview{background-color:' . $menu . ';}';
$c[] = ".mview li{
background-image: -moz-linear-gradient(top, $top 0%, $bottom 100%); /* FF3.6+ */
background-image: -webkit-linear-gradient(top, $top 0%,$bottom 100%); /* Chrome10+,Safari5.1+ */
background-image: -ms-linear-gradient(top, $top 0%,$bottom 100%); /* IE10+ */
background-image: linear-gradient(top bottom, $top 0%,$bottom 100%); /* W3C */
border-bottom:1px solid $border;
+ color: $text;
}";
+
+ $c[] = '.mview li a{color:' . $text . ';}';
file_put_contents($this->vdir . '/data/app.css', implode("\n", $c));
}
}
}
- protected static $resolutions = array(150);
+ protected static $resolutions = array(150, 300);
+ protected $maxRes = 300;
protected static $uaPrefixes = array('-moz-', '-webkit-', '-o-', '-ms-', '');
public $jsFiles = array(
'js/libs/fix/ios-orientation.js',
$this->config->videoFormats = $this->getVideosFormats(false);
$this->config->htmlmultimedia = $this->htmlmultimedia;
$this->config->phonegap = $this->phonegap;
+ $this->config->retinaResolution = $this->maxRes;
if ($this->home) {
$this->config->home = '%apphome%';
}
$this->copy($svg, $this->vdir . '/data/contents/p' . $page . '.svg');
}
+
foreach (self::$resolutions as $r) {
- $this->copy(WS_DOCS . '/' . $infos['document_id'] . '/html/' . $srcPrefix . $r . '-' . $infos['document_page'] . '.jpg', $this->vdir . '/data/background/' . $r . '/' . $this->backgroundsPrefix . $page . '.jpg');
+ $ok = $this->copy(WS_DOCS . '/' . $infos['document_id'] . '/html/' . $srcPrefix . $r . '-' . $infos['document_page'] . '.jpg', $this->vdir . '/data/background/' . $r . '/' . $this->backgroundsPrefix . $page . '.jpg');
+ if (!$ok && $r = 300) {
+ $this->maxRes = 150;
+ }
}
$this->copy(WS_DOCS . '/' . $infos['document_id'] . '/p' . $infos['document_page'] . '.jpg', $this->vdir . '/data/thumbnails/p' . $page . '.jpg');
protected function copy($s, $t) {
if (!file_exists($s)) {
fb($s . ' dont exists');
- return;
+ return false;
}
if (file_exists($t) && filemtime($t) >= filemtime($s) && filesize($s) == filesize($t)) {
- return;
+ return true;
}
if (!file_exists(dirname($t))) {
mkdir(dirname($t), 0777, true);
}
- copy($s, $t);
+ $res=copy($s, $t);
touch($t, filemtime($s));
+ return true;
}
protected function writeCSS($file, $links) {
\r
$this->copyOtherFiles($others);\r
\r
- mkdir($this->vdir . '/pages/', 0777, true);\r
+ if (!file_exists($this->vdir . '/pages')) {\r
+ mkdir($this->vdir . '/pages/', 0777, true);\r
+ }\r
\r
$ga = '';\r
if ($this->book->parametres->googleAnalyticsCustom) {\r
$this->daoBook->compile($this->book_id, 'html5');\r
\r
$dest = $this->vdir . 'm';\r
- mkdir($dest, 0777, true);\r
+ if (!file_exists($dest)) {\r
+ mkdir($dest, 0777, true);\r
+ }\r
\r
$cp = new cubeCommandLine('cp');\r
$cp->setPath(CONVERTER_PATH);\r
$cp->setArg(null, $dest);\r
$cp->execute();\r
\r
+ $filesToAdd = array();\r
if ($this->book->parametres->mobileServerConfig) {\r
$filesToAdd = array('.htaccess', 'web.config');\r
}\r
$this->vdir = $this->dir . $this->version . '/';\r
}\r
$this->cleanVdir();\r
- mkdir($this->vdir . '/data', 0777, true);\r
+ if (!file_exists($this->vdir . '/data')) {\r
+ mkdir($this->vdir . '/data', 0777, true);\r
+ }\r
}\r
\r
protected function cleanVdir() {\r