143 lines
4.9 KiB
PHP
143 lines
4.9 KiB
PHP
<?php
|
|
|
|
class Books implements IWebsiteModule
|
|
{
|
|
/** @var Website */
|
|
private $site;
|
|
|
|
/** @var array */
|
|
private $staticData;
|
|
|
|
public function __construct(Website $site)
|
|
{
|
|
$this->site = $site;
|
|
$this->load();
|
|
}
|
|
|
|
private function load()
|
|
{
|
|
$all = require (__DIR__ . '/../../statics/books/__all.php');
|
|
|
|
$this->staticData = array_map(function($a){return self::readSingle($a);}, $all);
|
|
}
|
|
|
|
private static function readSingle($a)
|
|
{
|
|
$a['imgfront_url'] = '/data/images/book_img/' . $a['id'] . '_front.png';
|
|
$a['imgfront_path'] = __DIR__ . '/../../data/images/book_img/' . $a['id'] . '_front.png';
|
|
|
|
$a['imgfull_url'] = '/data/images/book_img/' . $a['id'] . '_full.png';
|
|
$a['imgfull_path'] = __DIR__ . '/../../data/images/book_img/' . $a['id'] . '_full.png';
|
|
|
|
$a['preview_url'] = '/data/dynamic/bookprev_' . $a['id'] . '.png';
|
|
$a['preview_path'] = __DIR__ . '/../../data/dynamic/bookprev_' . $a['id'] . '.png';
|
|
|
|
$a['file_readme'] = (__DIR__ . '/../../statics/books/' . $a['id'] . '.md');
|
|
|
|
$a['url'] = '/books/view/' . $a['id'] . '/' . destructiveUrlEncode($a['title']);
|
|
|
|
$a['extraimages_urls'] = [];
|
|
$a['extraimages_paths'] = [];
|
|
|
|
for ($i=1; $i <= $a['imagecount']; $i++)
|
|
{
|
|
$a['extraimages_urls'] []= '/data/images/book_img/' . $a['id'] . '_img' . $i . '.jpg';
|
|
$a['extraimages_paths'] []= __DIR__ . '/../../data/images/book_img/' . $a['id'] . '_img' . $i . '.jpg';
|
|
}
|
|
|
|
$a['book_count'] = is_array($a['pdf']) ? count($a['pdf']) : 1;
|
|
|
|
return $a;
|
|
}
|
|
|
|
public function listAll()
|
|
{
|
|
return $this->staticData;
|
|
}
|
|
|
|
public function listAllNewestFirst()
|
|
{
|
|
$data = $this->staticData;
|
|
usort($data, function($a, $b) { return strcasecmp($b['date'], $a['date']); });
|
|
return $data;
|
|
}
|
|
|
|
public function checkConsistency()
|
|
{
|
|
$warn = null;
|
|
|
|
$this->load();
|
|
|
|
$ids = [];
|
|
|
|
foreach ($this->staticData as $book)
|
|
{
|
|
if (in_array($book['id'], $ids)) return ['result'=>'err', 'message' => 'Duplicate id ' . $book['id']];
|
|
$ids []= $book['id'];
|
|
|
|
if (!file_exists($book['imgfront_path'])) return ['result'=>'err', 'message' => 'Image (Front) not found ' . $book['title_short']];
|
|
if (!file_exists($book['imgfull_path'])) return ['result'=>'err', 'message' => 'Image (Full) not found ' . $book['title_short']];
|
|
|
|
foreach ($book['extraimages_paths'] as $eipath)
|
|
{
|
|
if (!file_exists($eipath)) return ['result'=>'err', 'message' => 'Extra-Image not found ' . $book['title_short']];
|
|
}
|
|
|
|
if ($book['book_count'] <= 0) return ['result'=>'err', 'message' => 'BookCount must be greater than zero ' . $book['title_short']];
|
|
|
|
if ($book['book_count'] > 1 && !is_array($book['pdf'])) return ['result'=>'err', 'message' => 'Attribute [pdf] must be an array ' . $book['title_short']];
|
|
if ($book['book_count'] > 1 && count($book['pdf']) !== $book['book_count']) return ['result'=>'err', 'message' => 'Attribute [pdf] must be the correct size ' . $book['title_short']];
|
|
if ($book['book_count'] === 1 && !is_string($book['pdf'])) return ['result'=>'err', 'message' => 'Attribute [pdf] must be an string ' . $book['title_short']];
|
|
|
|
if ($book['book_count'] > 1 && !is_array($book['pages'])) return ['result'=>'err', 'message' => 'Attribute [pages] must be an array ' . $book['title_short']];
|
|
if ($book['book_count'] > 1 && count($book['pages']) !== $book['book_count']) return ['result'=>'err', 'message' => 'Attribute [pages] must be the correct size ' . $book['title_short']];
|
|
if ($book['book_count'] === 1 && !is_string($book['pages'])) return ['result'=>'err', 'message' => 'Attribute [pages] must be an string ' . $book['title_short']];
|
|
|
|
if (!file_exists($book['file_readme'])) return ['result'=>'err', 'message' => 'Readme not found ' . $book['title_short']];
|
|
|
|
if (!file_exists($book['preview_path'])) $warn = ['result'=>'warn', 'message' => 'Preview not found ' . $book['title_short']];
|
|
}
|
|
|
|
if ($warn != null) return $warn;
|
|
return ['result'=>'ok', 'message' => ''];
|
|
}
|
|
|
|
public function createPreview($prog)
|
|
{
|
|
$src = $prog['imgfront_path'];
|
|
$dst = $prog['preview_path'];
|
|
|
|
if ($this->site->config['use_magick'])
|
|
magick_resize_image($src, 200, 0, $dst);
|
|
else
|
|
smart_resize_image($src, 200, 0, true, $dst);
|
|
|
|
}
|
|
|
|
public function getBook($id)
|
|
{
|
|
foreach (self::listAll() as $book) {
|
|
if ($book['id'] == $id) return $book;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function getRepositoryHost($book)
|
|
{
|
|
$r = $book['repository'];
|
|
if (startsWith($r, "http://")) $r = substr($r, strlen("http://"));
|
|
if (startsWith($r, "https://")) $r = substr($r, strlen("https://"));
|
|
if (startsWith($r, "www.")) $r = substr($r, strlen("www."));
|
|
|
|
if (startsWith(strtolower($r), "gitlab")) return "Gitlab";
|
|
if (startsWith(strtolower($r), "github")) return "Github";
|
|
if (startsWith(strtolower($r), "bitbucket")) return "Bitbucket";
|
|
|
|
return "Online";
|
|
}
|
|
|
|
public function getREADME($book)
|
|
{
|
|
return file_get_contents($book['file_readme']);
|
|
}
|
|
} |