commit
b9e4e356c7
|
@ -1,3 +1,8 @@
|
||||||
|
0.6.2 -
|
||||||
|
* Added server side rendering for devices like PRS-T2 / Kindle.
|
||||||
|
* Added a configuration item to tweak how thumbnail are handled.
|
||||||
|
*
|
||||||
|
|
||||||
0.6.1 - 20130730
|
0.6.1 - 20130730
|
||||||
* Properly close the lightbox when clicking in a link. Reported by le_.
|
* Properly close the lightbox when clicking in a link. Reported by le_.
|
||||||
* Fix the book by languages list when the language is not found in the resources. Reported by le_.
|
* Fix the book by languages list when the language is not found in the resources. Reported by le_.
|
||||||
|
|
7
base.php
7
base.php
|
@ -6,10 +6,15 @@
|
||||||
* @author Sébastien Lucas <sebastien@slucas.fr>
|
* @author Sébastien Lucas <sebastien@slucas.fr>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
define ("VERSION", "0.6.1");
|
define ("VERSION", "0.6.2");
|
||||||
define ("DB", "db");
|
define ("DB", "db");
|
||||||
date_default_timezone_set($config['default_timezone']);
|
date_default_timezone_set($config['default_timezone']);
|
||||||
|
|
||||||
|
function useServerSideRendering () {
|
||||||
|
global $config;
|
||||||
|
return preg_match("/" . $config['cops_server_side_render'] . "/", $_SERVER['HTTP_USER_AGENT']);
|
||||||
|
}
|
||||||
|
|
||||||
function getURLParam ($name, $default = NULL) {
|
function getURLParam ($name, $default = NULL) {
|
||||||
if (!empty ($_GET) && isset($_GET[$name]) && $_GET[$name] != "") {
|
if (!empty ($_GET) && isset($_GET[$name]) && $_GET[$name] != "") {
|
||||||
return $_GET[$name];
|
return $_GET[$name];
|
||||||
|
|
94
book.php
94
book.php
|
@ -563,3 +563,97 @@ order by substr (upper (sort), 1, 1)");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getJson ($complete = false) {
|
||||||
|
global $config;
|
||||||
|
$page = getURLParam ("page", Base::PAGE_INDEX);
|
||||||
|
$query = getURLParam ("query");
|
||||||
|
$qid = getURLParam ("id");
|
||||||
|
$n = getURLParam ("n", "1");
|
||||||
|
$database = GetUrlParam (DB);
|
||||||
|
|
||||||
|
$currentPage = Page::getPage ($page, $qid, $query, $n);
|
||||||
|
$currentPage->InitializeContent ();
|
||||||
|
|
||||||
|
$out = array ( "title" => $currentPage->title);
|
||||||
|
$entries = array ();
|
||||||
|
foreach ($currentPage->entryArray as $entry) {
|
||||||
|
array_push ($entries, $entry->getContentArray ());
|
||||||
|
}
|
||||||
|
if (!is_null ($currentPage->book)) {
|
||||||
|
$out ["book"] = $currentPage->book->getFullContentArray ();
|
||||||
|
}
|
||||||
|
$out ["databaseId"] = GetUrlParam (DB, "");
|
||||||
|
$out ["databaseName"] = Base::getDbName ();
|
||||||
|
$out ["page"] = $page;
|
||||||
|
$out ["entries"] = $entries;
|
||||||
|
$out ["isPaginated"] = 0;
|
||||||
|
if ($currentPage->isPaginated ()) {
|
||||||
|
$prevLink = $currentPage->getPrevLink ();
|
||||||
|
$nextLink = $currentPage->getNextLink ();
|
||||||
|
$out ["isPaginated"] = 1;
|
||||||
|
$out ["prevLink"] = "";
|
||||||
|
if (!is_null ($prevLink)) {
|
||||||
|
$out ["prevLink"] = $prevLink->hrefXhtml ();
|
||||||
|
}
|
||||||
|
$out ["nextLink"] = "";
|
||||||
|
if (!is_null ($nextLink)) {
|
||||||
|
$out ["nextLink"] = $nextLink->hrefXhtml ();
|
||||||
|
}
|
||||||
|
$out ["maxPage"] = $currentPage->getMaxPage ();
|
||||||
|
$out ["currentPage"] = $currentPage->n;
|
||||||
|
}
|
||||||
|
if (!is_null (getURLParam ("complete")) || $complete) {
|
||||||
|
$out ["const"] = array ("version" => VERSION, "i18n" => array (
|
||||||
|
"coverAlt" => localize("i18n.coversection"),
|
||||||
|
"authorsTitle" => localize("authors.title"),
|
||||||
|
"bookwordTitle" => localize("bookword.title"),
|
||||||
|
"tagsTitle" => localize("tags.title"),
|
||||||
|
"seriesTitle" => localize("series.title"),
|
||||||
|
"customizeTitle" => localize ("customize.title"),
|
||||||
|
"aboutTitle" => localize ("about.title"),
|
||||||
|
"previousAlt" => localize ("paging.previous.alternate"),
|
||||||
|
"nextAlt" => localize ("paging.next.alternate"),
|
||||||
|
"searchAlt" => localize ("search.alternate"),
|
||||||
|
"sortAlt" => localize ("sort.alternate"),
|
||||||
|
"homeAlt" => localize ("home.alternate"),
|
||||||
|
"permalinkAlt" => localize ("permalink.alternate"),
|
||||||
|
"pubdateTitle" => localize("pubdate.title"),
|
||||||
|
"languagesTitle" => localize("language.title"),
|
||||||
|
"contentTitle" => localize("content.summary"),
|
||||||
|
"sortorderAsc" => localize("search.sortorder.asc"),
|
||||||
|
"sortorderDesc" => localize("search.sortorder.desc"),
|
||||||
|
"customizeEmail" => localize("customize.email")),
|
||||||
|
"url" => array (
|
||||||
|
"detailUrl" => "index.php?page=13&id={0}&db={1}",
|
||||||
|
"coverUrl" => "fetch.php?id={0}&db={1}",
|
||||||
|
"thumbnailUrl" => "fetch.php?height=" . $config['cops_html_thumbnail_height'] . "&id={0}&db={1}"),
|
||||||
|
"config" => array (
|
||||||
|
"use_fancyapps" => $config ["cops_use_fancyapps"],
|
||||||
|
"max_item_per_page" => $config['cops_max_item_per_page'],
|
||||||
|
"html_tag_filter" => $config['cops_html_tag_filter']));
|
||||||
|
if ($config['cops_thumbnail_handling'] == "1") {
|
||||||
|
$out ["const"]["url"]["thumbnailUrl"] = $out ["const"]["url"]["coverUrl"];
|
||||||
|
} else if (!empty ($config['cops_thumbnail_handling'])) {
|
||||||
|
$out ["const"]["url"]["thumbnailUrl"] = $config['cops_thumbnail_handling'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$out ["containsBook"] = 0;
|
||||||
|
if ($currentPage->containsBook ()) {
|
||||||
|
$out ["containsBook"] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out["abouturl"] = "index.php" . addURLParameter ("?page=16", DB, $database);
|
||||||
|
|
||||||
|
if ($page == Base::PAGE_ABOUT) {
|
||||||
|
$temp = preg_replace ("/\<h1\>About COPS\<\/h1\>/", "<h1>About COPS " . VERSION . "</h1>", file_get_contents('about.html'));
|
||||||
|
$out ["fullhtml"] = $temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out ["homeurl"] = "index.php";
|
||||||
|
if ($page != Base::PAGE_INDEX && !is_null ($database)) $out ["homeurl"] = $out ["homeurl"] . "?" . addURLParameter ("", DB, $database);
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
/*
|
/*
|
||||||
* Height of thumbnail image for OPDS
|
* Height of thumbnail image for OPDS
|
||||||
*/
|
*/
|
||||||
$config['cops_opds_thumbnail_height'] = "70";
|
$config['cops_opds_thumbnail_height'] = "140";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Height of thumbnail image for HTML
|
* Height of thumbnail image for HTML
|
||||||
|
@ -197,3 +197,19 @@
|
||||||
*/
|
*/
|
||||||
$config['cops_html_tag_filter'] = "0";
|
$config['cops_html_tag_filter'] = "0";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Thumbnails are generated on-the-fly so it can be problematic on servers with slow CPU (Raspberry Pi, Dockstar, Piratebox, ...).
|
||||||
|
* This configuration item allow to customize how thumbnail will be generated
|
||||||
|
* "" : Generate thumbnail (CPU hungry)
|
||||||
|
* "1" : always send the full size image (Network hungry)
|
||||||
|
* any url : Send a constant image as the thumbnail (you can try "images/bookcover.png")
|
||||||
|
*/
|
||||||
|
$config['cops_thumbnail_handling'] = "";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Contains a list of user agent for browsers not compatible with client side rendering
|
||||||
|
* For now : Kindle, Sony PRS-T1
|
||||||
|
* This item is used as regular expression so "." will force server side rendering for all devices
|
||||||
|
*/
|
||||||
|
$config['cops_server_side_render'] = "Kindle|EBRD1101";
|
||||||
|
|
||||||
|
|
8
data.php
8
data.php
|
@ -131,12 +131,20 @@ class Data extends Base {
|
||||||
$height = $config['cops_html_thumbnail_height'];
|
$height = $config['cops_html_thumbnail_height'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($config['cops_thumbnail_handling'] != "1") {
|
||||||
$urlParam = addURLParameter($urlParam, "height", $height);
|
$urlParam = addURLParameter($urlParam, "height", $height);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$urlParam = addURLParameter($urlParam, "id", $book->id);
|
$urlParam = addURLParameter($urlParam, "id", $book->id);
|
||||||
if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB));
|
if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB));
|
||||||
|
if ($config['cops_thumbnail_handling'] != "1" &&
|
||||||
|
!empty ($config['cops_thumbnail_handling']) &&
|
||||||
|
$rel == Link::OPDS_THUMBNAIL_TYPE) {
|
||||||
|
return new Link ($config['cops_thumbnail_handling'], $mime, $rel, $title);
|
||||||
|
} else {
|
||||||
return new Link ("fetch.php?" . $urlParam, $mime, $rel, $title);
|
return new Link ("fetch.php?" . $urlParam, $mime, $rel, $title);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new Link (str_replace('%2F','/',rawurlencode ($book->path."/".$filename)), $mime, $rel, $title);
|
return new Link (str_replace('%2F','/',rawurlencode ($book->path."/".$filename)), $mime, $rel, $title);
|
||||||
|
|
83
getJSON.php
83
getJSON.php
|
@ -17,88 +17,7 @@
|
||||||
require_once ("book.php");
|
require_once ("book.php");
|
||||||
|
|
||||||
header ("Content-Type:application/json;charset=utf-8");
|
header ("Content-Type:application/json;charset=utf-8");
|
||||||
$page = getURLParam ("page", Base::PAGE_INDEX);
|
|
||||||
$query = getURLParam ("query");
|
|
||||||
$qid = getURLParam ("id");
|
|
||||||
$n = getURLParam ("n", "1");
|
|
||||||
$database = GetUrlParam (DB);
|
|
||||||
|
|
||||||
$currentPage = Page::getPage ($page, $qid, $query, $n);
|
|
||||||
$currentPage->InitializeContent ();
|
|
||||||
|
|
||||||
$out = array ( "title" => $currentPage->title);
|
|
||||||
$entries = array ();
|
|
||||||
foreach ($currentPage->entryArray as $entry) {
|
|
||||||
array_push ($entries, $entry->getContentArray ());
|
|
||||||
}
|
|
||||||
if (!is_null ($currentPage->book)) {
|
|
||||||
$out ["book"] = $currentPage->book->getFullContentArray ();
|
|
||||||
}
|
|
||||||
$out ["databaseId"] = GetUrlParam (DB, "");
|
|
||||||
$out ["databaseName"] = Base::getDbName ();
|
|
||||||
$out ["page"] = $page;
|
|
||||||
$out ["entries"] = $entries;
|
|
||||||
$out ["isPaginated"] = 0;
|
|
||||||
if ($currentPage->isPaginated ()) {
|
|
||||||
$prevLink = $currentPage->getPrevLink ();
|
|
||||||
$nextLink = $currentPage->getNextLink ();
|
|
||||||
$out ["isPaginated"] = 1;
|
|
||||||
$out ["prevLink"] = "";
|
|
||||||
if (!is_null ($prevLink)) {
|
|
||||||
$out ["prevLink"] = $prevLink->hrefXhtml ();
|
|
||||||
}
|
|
||||||
$out ["nextLink"] = "";
|
|
||||||
if (!is_null ($nextLink)) {
|
|
||||||
$out ["nextLink"] = $nextLink->hrefXhtml ();
|
|
||||||
}
|
|
||||||
$out ["maxPage"] = $currentPage->getMaxPage ();
|
|
||||||
$out ["currentPage"] = $currentPage->n;
|
|
||||||
}
|
|
||||||
if (!is_null (getURLParam ("complete"))) {
|
|
||||||
$out ["const"] = array ("version" => VERSION, "i18n" => array (
|
|
||||||
"coverAlt" => localize("i18n.coversection"),
|
|
||||||
"authorsTitle" => localize("authors.title"),
|
|
||||||
"bookwordTitle" => localize("bookword.title"),
|
|
||||||
"tagsTitle" => localize("tags.title"),
|
|
||||||
"seriesTitle" => localize("series.title"),
|
|
||||||
"customizeTitle" => localize ("customize.title"),
|
|
||||||
"aboutTitle" => localize ("about.title"),
|
|
||||||
"previousAlt" => localize ("paging.previous.alternate"),
|
|
||||||
"nextAlt" => localize ("paging.next.alternate"),
|
|
||||||
"searchAlt" => localize ("search.alternate"),
|
|
||||||
"sortAlt" => localize ("sort.alternate"),
|
|
||||||
"homeAlt" => localize ("home.alternate"),
|
|
||||||
"permalinkAlt" => localize ("permalink.alternate"),
|
|
||||||
"pubdateTitle" => localize("pubdate.title"),
|
|
||||||
"languagesTitle" => localize("language.title"),
|
|
||||||
"contentTitle" => localize("content.summary"),
|
|
||||||
"sortorderAsc" => localize("search.sortorder.asc"),
|
|
||||||
"sortorderDesc" => localize("search.sortorder.desc"),
|
|
||||||
"customizeEmail" => localize("customize.email")),
|
|
||||||
"url" => array (
|
|
||||||
"detailUrl" => "index.php?page=13&id={0}&db={1}",
|
|
||||||
"coverUrl" => "fetch.php?id={0}&db={1}",
|
|
||||||
"thumbnailUrl" => "fetch.php?height=" . $config['cops_html_thumbnail_height'] . "&id={0}&db={1}"),
|
|
||||||
"config" => array (
|
|
||||||
"use_fancyapps" => $config ["cops_use_fancyapps"],
|
|
||||||
"max_item_per_page" => $config['cops_max_item_per_page'],
|
|
||||||
"html_tag_filter" => $config['cops_html_tag_filter']));
|
|
||||||
}
|
|
||||||
|
|
||||||
$out ["containsBook"] = 0;
|
|
||||||
if ($currentPage->containsBook ()) {
|
|
||||||
$out ["containsBook"] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
$out["abouturl"] = "index.php" . addURLParameter ("?page=16", DB, $database);
|
|
||||||
|
|
||||||
if ($page == Base::PAGE_ABOUT) {
|
|
||||||
$out ["fullhtml"] = file_get_contents('about.html');
|
|
||||||
}
|
|
||||||
|
|
||||||
$out ["homeurl"] = "index.php";
|
|
||||||
if ($page != Base::PAGE_INDEX && !is_null ($database)) $out ["homeurl"] = $out ["homeurl"] . "?" . addURLParameter ("", DB, $database);
|
|
||||||
|
|
||||||
|
|
||||||
echo json_encode ($out);
|
echo json_encode (getJson ());
|
||||||
|
|
||||||
|
|
BIN
images/bookcover.png
Normal file
BIN
images/bookcover.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3 KiB |
27
index.php
27
index.php
|
@ -17,6 +17,7 @@
|
||||||
require_once ("language.php");
|
require_once ("language.php");
|
||||||
require_once ("customcolumn.php");
|
require_once ("customcolumn.php");
|
||||||
require_once ("book.php");
|
require_once ("book.php");
|
||||||
|
require_once ("resources/doT-php/doT.php");
|
||||||
|
|
||||||
// If we detect that an OPDS reader try to connect try to redirect to feed.php
|
// If we detect that an OPDS reader try to connect try to redirect to feed.php
|
||||||
if (preg_match("/(MantanoReader|FBReader|Stanza|Aldiko|Moon+ Reader)/", $_SERVER['HTTP_USER_AGENT'])) {
|
if (preg_match("/(MantanoReader|FBReader|Stanza|Aldiko|Moon+ Reader)/", $_SERVER['HTTP_USER_AGENT'])) {
|
||||||
|
@ -50,11 +51,12 @@
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/lru/lru.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("resources/lru/lru.js") ?>"></script>
|
||||||
<script type="text/javascript" src="<?php echo getUrlWithVersion("util.js") ?>"></script>
|
<script type="text/javascript" src="<?php echo getUrlWithVersion("util.js") ?>"></script>
|
||||||
<link rel="related" href="<?php echo $config['cops_full_url'] ?>feed.php" type="application/atom+xml;profile=opds-catalog" title="<?php echo $config['cops_title_default']; ?>" />
|
<link rel="related" href="<?php echo $config['cops_full_url'] ?>feed.php" type="application/atom+xml;profile=opds-catalog" title="<?php echo $config['cops_title_default']; ?>" />
|
||||||
<link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico" />
|
<link rel="icon" type="image/vnd.microsoft.icon" href="<?php echo $config['cops_icon']; ?>" />
|
||||||
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Open+Sans:400,300italic,800,300,400italic,600,600italic,700,700italic,800italic' />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("resources/normalize/normalize.css") ?>" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("styles/font-awesome.css") ?>" media="screen" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion("styles/font-awesome.css") ?>" media="screen" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
<link rel="stylesheet" type="text/css" href="<?php echo getUrlWithVersion(getCurrentCss ()) ?>" media="screen" />
|
||||||
|
<?php if (!useServerSideRendering ()) { ?>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
@ -97,7 +99,30 @@
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<?php } ?>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<?php
|
||||||
|
if (useServerSideRendering ()) {
|
||||||
|
// Get the templates
|
||||||
|
$header = file_get_contents('templates/default/header.html');
|
||||||
|
$footer = file_get_contents('templates/default/footer.html');
|
||||||
|
$main = file_get_contents('templates/default/main.html');
|
||||||
|
$bookdetail = file_get_contents('templates/default/bookdetail.html');
|
||||||
|
$page = file_get_contents('templates/default/page.html');
|
||||||
|
|
||||||
|
// Get the data
|
||||||
|
$data = getJson (true);
|
||||||
|
|
||||||
|
// Generate the function for the template
|
||||||
|
$template = new doT ();
|
||||||
|
$dot = $template->template ($page, array ("bookdetail" => $bookdetail,
|
||||||
|
"header" => $header,
|
||||||
|
"footer" => $footer,
|
||||||
|
"main" => $main));
|
||||||
|
// Execute the template
|
||||||
|
echo $dot ($data);
|
||||||
|
}
|
||||||
|
?>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
File diff suppressed because one or more lines are too long
|
@ -119,7 +119,9 @@ button.mfp-arrow {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
display: block;
|
display: block;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
z-index: 1046; }
|
z-index: 1046;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none; }
|
||||||
|
|
||||||
button::-moz-focus-inner {
|
button::-moz-focus-inner {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -297,7 +299,7 @@ img.mfp-img {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
color: #f3f3f3;
|
color: #f3f3f3;
|
||||||
word-break: break-word;
|
word-wrap: break-word;
|
||||||
padding-right: 36px; }
|
padding-right: 36px; }
|
||||||
|
|
||||||
.mfp-figure small {
|
.mfp-figure small {
|
||||||
|
|
96
resources/doT-php/doT.php
Normal file
96
resources/doT-php/doT.php
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP renderer for doT templating engine
|
||||||
|
*
|
||||||
|
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
||||||
|
* @author Sébastien Lucas <sebastien@slucas.fr>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class doT {
|
||||||
|
public $functionBody;
|
||||||
|
private $functionCode;
|
||||||
|
private $def;
|
||||||
|
|
||||||
|
private function resolveDefs ($block) {
|
||||||
|
return preg_replace_callback ("/\{\{#([\s\S]+?)\}\}/", function ($m) {
|
||||||
|
$d = $m[1];
|
||||||
|
$d = substr ($d, 4);
|
||||||
|
if (!array_key_exists ($d, $this->def)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (preg_match ("/\{\{#([\s\S]+?)\}\}/", $this->def [$d])) {
|
||||||
|
return $this->resolveDefs ($this->def [$d], $this->def);
|
||||||
|
} else {
|
||||||
|
return $this->def [$d];
|
||||||
|
}
|
||||||
|
}, $block);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleDotNotation ($string) {
|
||||||
|
$out = preg_replace ("/(\w+)\.(.*?)([\s,\)])/", "\$$1[\"$2\"]$3", $string);
|
||||||
|
$out = preg_replace ("/(\w+)\.([\w\.]*?)$/", "\$$1[\"$2\"] ", $out);
|
||||||
|
$out = preg_replace ("/\./", '"]["', $out);
|
||||||
|
|
||||||
|
// Special hideous case : shouldn't be committed
|
||||||
|
$out = preg_replace ("/^i /", ' $i ', $out);
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function template ($string, $def) {
|
||||||
|
$func = preg_replace ("/'|\\\/", "\\$&", $string);
|
||||||
|
|
||||||
|
// deps
|
||||||
|
if (empty ($def)) {
|
||||||
|
$func = preg_replace ("/\{\{#([\s\S]+?)\}\}/", "", $func);
|
||||||
|
} else {
|
||||||
|
$this->def = $def;
|
||||||
|
$func = $this->resolveDefs ($func);
|
||||||
|
}
|
||||||
|
// interpolate
|
||||||
|
$func = preg_replace_callback ("/\{\{=([\s\S]+?)\}\}/", function ($m) {
|
||||||
|
return "' . " . $this->handleDotNotation ($m[1]) . " . '";
|
||||||
|
}, $func);
|
||||||
|
// Conditional
|
||||||
|
$func = preg_replace_callback ("/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/", function ($m) {
|
||||||
|
$elsecase = $m[1];
|
||||||
|
$code = $m[2];
|
||||||
|
if ($elsecase) {
|
||||||
|
if ($code) {
|
||||||
|
return "';} else if (" . $this->handleDotNotation ($code) . ") { $" . "out.='";
|
||||||
|
} else {
|
||||||
|
return "';} else { $" . "out.='";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($code) {
|
||||||
|
return "'; if (" . $this->handleDotNotation ($code) . ") { $" . "out.='";
|
||||||
|
} else {
|
||||||
|
return "';} $" . "out.='";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, $func);
|
||||||
|
// Iterate
|
||||||
|
$func = preg_replace_callback ("/\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/", function ($m) {
|
||||||
|
if (count($m) > 1) {
|
||||||
|
$iterate = $m[1];
|
||||||
|
$vname = $m[2];
|
||||||
|
$iname = $m[3];
|
||||||
|
$iterate = $this->handleDotNotation ($iterate);
|
||||||
|
return "'; for (\$$iname = 0; \$$iname < count($iterate); \$$iname++) { \$$vname = $iterate [\$$iname]; \$out.='";
|
||||||
|
} else {
|
||||||
|
return "';} $" . "out.='";
|
||||||
|
}
|
||||||
|
}, $func);
|
||||||
|
$func = '$out = \'' . $func . '\'; return $out;';
|
||||||
|
|
||||||
|
$this->functionBody = $func;
|
||||||
|
|
||||||
|
//$this->functionCode = create_function ('$it', $func);
|
||||||
|
return create_function ('$it', $func);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute ($data) {
|
||||||
|
return $this->functionCode ($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -15,24 +15,24 @@
|
||||||
<br />
|
<br />
|
||||||
{{~}}
|
{{~}}
|
||||||
</h2>
|
</h2>
|
||||||
<h1><a title="{{=it.const.i18n.permalinkAlt}}" rel="bookmark" href="{{=strformat (it.const.url.detailUrl, it.book.id, it.databaseId)}}"><i class="icon-link"></i></a>{{=htmlEscape (it.title)}}</h1>
|
<h1><a title="{{=it.const.i18n.permalinkAlt}}" rel="bookmark" href="{{=str_format (it.const.url.detailUrl, it.book.id, it.databaseId)}}"><i class="icon-link"></i></a>{{=htmlspecialchars (it.title)}}</h1>
|
||||||
<p class="popupless">
|
<p class="popupless">
|
||||||
<h3>{{=it.const.i18n.authorsTitle}}: </h3>
|
<h3>{{=it.const.i18n.authorsTitle}}: </h3>
|
||||||
{{~it.book.authors:author:j}}
|
{{~it.book.authors:author:i}}
|
||||||
{{? j > 0}}, {{?}}<a href="{{=author.url}}">{{=htmlEscape (author.name)}}</a>
|
{{? i > 0}}, {{?}}<a href="{{=author.url}}">{{=htmlspecialchars (author.name)}}</a>
|
||||||
{{~}}
|
{{~}}
|
||||||
</p>
|
</p>
|
||||||
{{? it.book.tagsName != ""}}
|
{{? it.book.tagsName != ""}}
|
||||||
<p class="popupless">
|
<p class="popupless">
|
||||||
<h3>{{=it.const.i18n.tagsTitle}}: </h3>
|
<h3>{{=it.const.i18n.tagsTitle}}: </h3>
|
||||||
{{~it.book.tags:tag:k}}
|
{{~it.book.tags:tag:i}}
|
||||||
{{? k > 0}}, {{?}}<a href="{{=tag.url}}">{{=htmlEscape (tag.name)}}</a>
|
{{? i > 0}}, {{?}}<a href="{{=tag.url}}">{{=htmlspecialchars (tag.name)}}</a>
|
||||||
{{~}}
|
{{~}}
|
||||||
</p>
|
</p>
|
||||||
{{?}}
|
{{?}}
|
||||||
{{? it.book.seriesName != ""}}
|
{{? it.book.seriesName != ""}}
|
||||||
<p class="popupless">
|
<p class="popupless">
|
||||||
<h3><a href="{{=it.book.seriesurl}}">{{=it.const.i18n.seriesTitle}}</a> : </h3>{{=htmlEscape (it.book.seriesCompleteName)}}
|
<h3><a href="{{=it.book.seriesurl}}">{{=it.const.i18n.seriesTitle}}</a> : </h3>{{=htmlspecialchars (it.book.seriesCompleteName)}}
|
||||||
</p>
|
</p>
|
||||||
{{?}}
|
{{?}}
|
||||||
{{? it.book.pubDate != ""}}
|
{{? it.book.pubDate != ""}}
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
<div style="float: left; width: 50%">
|
<div style="float: left; width: 50%">
|
||||||
<form id="searchForm" action="index.php" method="get">
|
<form id="searchForm" action="index.php" method="get">
|
||||||
<div style="float: right">
|
<div style="float: right">
|
||||||
<!--<label for="submitsearch" class="hicon hicon32"><i class="icon-search"></i></label>
|
|
||||||
<input id="submitsearch" type="submit" value="Go" class="icon- submit" />-->
|
|
||||||
<button title="{{=it.const.i18n.searchAlt}}" type="submit" class="hicon hicon32 submit">
|
<button title="{{=it.const.i18n.searchAlt}}" type="submit" class="hicon hicon32 submit">
|
||||||
<i class="icon-search"></i>
|
<i class="icon-search"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<article>
|
<article>
|
||||||
<div class="frontpage">
|
<div class="frontpage">
|
||||||
{{? entry.navlink != "#"}}<a href="{{=entry.navlink}}">{{?}}
|
{{? entry.navlink != "#"}}<a href="{{=entry.navlink}}">{{?}}
|
||||||
<h2>{{=htmlEscape (entry.title)}}</h2>
|
<h2>{{=htmlspecialchars (entry.title)}}</h2>
|
||||||
<h4>{{=entry.content}}</h4>
|
<h4>{{=entry.content}}</h4>
|
||||||
{{? entry.navlink != "#"}}</a>{{?}}
|
{{? entry.navlink != "#"}}</a>{{?}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,8 +20,8 @@
|
||||||
<article class="books">
|
<article class="books">
|
||||||
<span class="cover">
|
<span class="cover">
|
||||||
{{? entry.book.hasCover == 1}}
|
{{? entry.book.hasCover == 1}}
|
||||||
<a data-fancybox-group="group" class="fancycover" href="{{=strformat (it.const.url.coverUrl, entry.book.id, it.databaseId)}}">
|
<a data-fancybox-group="group" class="fancycover" href="{{=str_format (it.const.url.coverUrl, entry.book.id, it.databaseId)}}">
|
||||||
<img src="{{=strformat (it.const.url.thumbnailUrl, entry.book.id, it.databaseId)}}" alt="{{=it.const.i18n.coverAlt}}" />
|
<img src="{{=str_format (it.const.url.thumbnailUrl, entry.book.id, it.databaseId)}}" alt="{{=it.const.i18n.coverAlt}}" />
|
||||||
</a>
|
</a>
|
||||||
{{?}}
|
{{?}}
|
||||||
</span>
|
</span>
|
||||||
|
@ -30,15 +30,15 @@
|
||||||
<a href="{{=data.url}}">{{=data.name}}</a><br />
|
<a href="{{=data.url}}">{{=data.name}}</a><br />
|
||||||
{{~}}
|
{{~}}
|
||||||
</h2>
|
</h2>
|
||||||
<a class="fancydetail" href="{{=strformat (it.const.url.detailUrl, entry.book.id, it.databaseId)}}">
|
<a class="fancydetail" href="{{=str_format (it.const.url.detailUrl, entry.book.id, it.databaseId)}}">
|
||||||
<div class="fullclickpopup">
|
<div class="fullclickpopup">
|
||||||
<h2><span class="st">{{=htmlEscape (entry.title)}}</span>
|
<h2><span class="st">{{=htmlspecialchars (entry.title)}}</span>
|
||||||
{{? entry.book.pubDate != ""}}<span class="sp">({{=entry.book.pubDate}})</span>{{?}}
|
{{? entry.book.pubDate != ""}}<span class="sp">({{=entry.book.pubDate}})</span>{{?}}
|
||||||
{{? entry.book.rating != ""}}<span class="sr">{{=entry.book.rating}}</span>{{?}}
|
{{? entry.book.rating != ""}}<span class="sr">{{=entry.book.rating}}</span>{{?}}
|
||||||
</h2>
|
</h2>
|
||||||
<h4>{{=it.const.i18n.authorsTitle}} : </h4><span class="sa">{{=htmlEscape (entry.book.authorsName)}}</span><br />
|
<h4>{{=it.const.i18n.authorsTitle}} : </h4><span class="sa">{{=htmlspecialchars (entry.book.authorsName)}}</span><br />
|
||||||
{{? entry.book.tagsName != ""}}<h4>{{=it.const.i18n.tagsTitle}} : </h4><span class="se">{{=htmlEscape (entry.book.tagsName)}}</span><br />{{?}}
|
{{? entry.book.tagsName != ""}}<h4>{{=it.const.i18n.tagsTitle}} : </h4><span class="se">{{=htmlspecialchars (entry.book.tagsName)}}</span><br />{{?}}
|
||||||
{{? entry.book.seriesName != ""}}<h4>{{=it.const.i18n.seriesTitle}} : </h4><span class="ss">{{=htmlEscape (entry.book.seriesName)}} ({{=entry.book.seriesIndex}})</span><br />{{?}}
|
{{? entry.book.seriesName != ""}}<h4>{{=it.const.i18n.seriesTitle}} : </h4><span class="ss">{{=htmlspecialchars (entry.book.seriesName)}} ({{=entry.book.seriesIndex}})</span><br />{{?}}
|
||||||
</div></a>
|
</div></a>
|
||||||
</article>
|
</article>
|
||||||
{{?}}
|
{{?}}
|
||||||
|
|
6
util.js
6
util.js
|
@ -69,7 +69,7 @@ function sendToMailAddress (component, dataid) {
|
||||||
$.ajax ({'url': url, 'type': 'post', 'data': { 'data': dataid, 'email': email }, 'success': retourMail});
|
$.ajax ({'url': url, 'type': 'post', 'data': { 'data': dataid, 'email': email }, 'success': retourMail});
|
||||||
}
|
}
|
||||||
|
|
||||||
function strformat () {
|
function str_format () {
|
||||||
var s = arguments[0];
|
var s = arguments[0];
|
||||||
for (var i = 0; i < arguments.length - 1; i++) {
|
for (var i = 0; i < arguments.length - 1; i++) {
|
||||||
var reg = new RegExp("\\{" + i + "\\}", "gm");
|
var reg = new RegExp("\\{" + i + "\\}", "gm");
|
||||||
|
@ -92,7 +92,7 @@ function getCurrentOption (option) {
|
||||||
return $.cookie (option);
|
return $.cookie (option);
|
||||||
}
|
}
|
||||||
|
|
||||||
function htmlEscape(str) {
|
function htmlspecialchars(str) {
|
||||||
return String(str)
|
return String(str)
|
||||||
.replace(/&/g, '&')
|
.replace(/&/g, '&')
|
||||||
.replace(/"/g, '"')
|
.replace(/"/g, '"')
|
||||||
|
@ -346,7 +346,7 @@ function search_Submitted (event) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
var url = strformat ("index.php?page=9¤t={0}&query={1}&db={2}", currentData.page, $("input[name=query]").val (), currentData.databaseId);
|
var url = str_format ("index.php?page=9¤t={0}&query={1}&db={2}", currentData.page, $("input[name=query]").val (), currentData.databaseId);
|
||||||
navigateTo (url);
|
navigateTo (url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue