diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/CharacterEntities.php b/inc/3rdparty/libraries/MOBIClass/CharacterEntities.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/CharacterEntities.php
rename to inc/3rdparty/libraries/MOBIClass/CharacterEntities.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/ContentProvider.php b/inc/3rdparty/libraries/MOBIClass/ContentProvider.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/ContentProvider.php
rename to inc/3rdparty/libraries/MOBIClass/ContentProvider.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/EXTHHelper.php b/inc/3rdparty/libraries/MOBIClass/EXTHHelper.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/EXTHHelper.php
rename to inc/3rdparty/libraries/MOBIClass/EXTHHelper.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileByte.php b/inc/3rdparty/libraries/MOBIClass/FileByte.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileByte.php
rename to inc/3rdparty/libraries/MOBIClass/FileByte.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileDate.php b/inc/3rdparty/libraries/MOBIClass/FileDate.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileDate.php
rename to inc/3rdparty/libraries/MOBIClass/FileDate.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileElement.php b/inc/3rdparty/libraries/MOBIClass/FileElement.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileElement.php
rename to inc/3rdparty/libraries/MOBIClass/FileElement.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileInt.php b/inc/3rdparty/libraries/MOBIClass/FileInt.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileInt.php
rename to inc/3rdparty/libraries/MOBIClass/FileInt.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileObject.php b/inc/3rdparty/libraries/MOBIClass/FileObject.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileObject.php
rename to inc/3rdparty/libraries/MOBIClass/FileObject.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileRecord.php b/inc/3rdparty/libraries/MOBIClass/FileRecord.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileRecord.php
rename to inc/3rdparty/libraries/MOBIClass/FileRecord.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileShort.php b/inc/3rdparty/libraries/MOBIClass/FileShort.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileShort.php
rename to inc/3rdparty/libraries/MOBIClass/FileShort.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileString.php b/inc/3rdparty/libraries/MOBIClass/FileString.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileString.php
rename to inc/3rdparty/libraries/MOBIClass/FileString.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/FileTri.php b/inc/3rdparty/libraries/MOBIClass/FileTri.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/FileTri.php
rename to inc/3rdparty/libraries/MOBIClass/FileTri.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/Http.php b/inc/3rdparty/libraries/MOBIClass/Http.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/Http.php
rename to inc/3rdparty/libraries/MOBIClass/Http.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/ImageHandler.php b/inc/3rdparty/libraries/MOBIClass/ImageHandler.php
similarity index 50%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/ImageHandler.php
rename to inc/3rdparty/libraries/MOBIClass/ImageHandler.php
index f620fc1fb..bcb48e9f1 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/ImageHandler.php
+++ b/inc/3rdparty/libraries/MOBIClass/ImageHandler.php
@@ -11,18 +11,30 @@ class ImageHandler {
$imgFile = @imagecreatefromstring($data);
if($imgFile !== false){
- @imagefilter($imgFile, IMG_FILTER_GRAYSCALE);
-
- ob_start();
- @imagejpeg($imgFile);
- $image = ob_get_contents();
- ob_end_clean();
-
- @imagedestroy($imgFile);
-
- return $image;
+ $result = self::CreateImage($imgFile);
+ imagedestroy($imgFile);
+ return $result;
}
return false;
}
+ /**
+ * Create an image
+ * @param resource $img Create an image created with createimagetruecolor
+ * @return false|string False if failed, else the data of the image (converted to grayscale jpeg)
+ */
+ public static function CreateImage($img){
+ try{
+ imagefilter($img, IMG_FILTER_GRAYSCALE);
+
+ ob_start();
+ imagejpeg($img);
+ $image = ob_get_contents();
+ ob_end_clean();
+
+ return $image;
+ }catch(Exception $e){
+ return false;
+ }
+ }
}
?>
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/MOBI.php b/inc/3rdparty/libraries/MOBIClass/MOBI.php
similarity index 88%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/MOBI.php
rename to inc/3rdparty/libraries/MOBIClass/MOBI.php
index 9532bbf1b..17e718c12 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/MOBI.php
+++ b/inc/3rdparty/libraries/MOBIClass/MOBI.php
@@ -18,11 +18,9 @@ require_once(dirname(__FILE__).'/FileTri.php');
require_once(dirname(__FILE__).'/Http.php');
require_once(dirname(__FILE__).'/http_build_url.php');
require_once(dirname(__FILE__).'/ImageHandler.php');
+require_once(dirname(__FILE__).'/MOBIFile.php');
require_once(dirname(__FILE__).'/OnlineArticle.php');
require_once(dirname(__FILE__).'/PalmRecord.php');
-require_once(dirname(__FILE__).'/PEOFRecord.php');
-require_once(dirname(__FILE__).'/PFCISRecord.php');
-require_once(dirname(__FILE__).'/PFLISRecord.php');
require_once(dirname(__FILE__).'/Prc.php');
require_once(dirname(__FILE__).'/PreprocessedArticle.php');
require_once(dirname(__FILE__).'/RecognizeURL.php');
@@ -43,7 +41,7 @@ require_once(dirname(__FILE__).'/Settings.php');
* $mobi->setFileSource($file); //Load a local file without any extra changes
* $mobi->setData($data); //Load data
*
- * //If you want, you can set some optional settings
+ * //If you want, you can set some optional settings (see Settings.php for all recognized settings)
* $options = array(
* "title"=>"Insert title here",
* "author"=>"Author"
@@ -86,7 +84,7 @@ class MOBI {
*/
public function setContentProvider($content){
$this->setOptions($content->getMetaData());
- $this->images = $content->getImages();
+ $this->setImages($content->getImages());
$this->setData($content->getTextData());
}
@@ -149,16 +147,9 @@ class MOBI {
$mobiHeader = new PalmRecord($settings, $dataRecords, $nRecords, $len, sizeof($this->images));
array_unshift($dataRecords, $mobiHeader);
$dataRecords = array_merge($dataRecords, $this->images);
- $mobiFooter1 = new PFLISRecord($len);
- $mobiFooter2 = new PFCISRecord($len);
- $mobiFooter3 = new PEOFRecord($len);
- $dataRecords[] = $mobiFooter1;
- $dataRecords[] = $mobiFooter2;
- $dataRecords[] = $mobiFooter3;
- /*$dataRecords = array_merge($dataRecords, $mobiFooter);
- *$dataRecords[] = $rec->createFLISRecord();*
+ $dataRecords[] = $rec->createFLISRecord();
$dataRecords[] = $rec->createFCISRecord($len);
- $dataRecords[] = $rec->createEOFRecord();*/
+ $dataRecords[] = $rec->createEOFRecord();
$this->prc = new Prc($settings, $dataRecords);
return $this->prc;
}
@@ -183,7 +174,7 @@ class MOBI {
$length = strlen($data);
if($this->debug) return; //In debug mode, don't start the download
-/*
+
header("Content-Type: application/x-mobipocket-ebook");
header("Content-Disposition: attachment; filename=\"".$name."\"");
header("Content-Transfer-Encoding: binary");
@@ -192,12 +183,8 @@ class MOBI {
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Length: ".$length);
- echo $data;*/
-
- $hh = fopen("D:\hakuna.mobi", "w");
- fwrite($hh, $data);
- fclose($hh);
+ echo $data;
//Finished!
}
diff --git a/inc/3rdparty/libraries/MOBIClass/MOBIFile.php b/inc/3rdparty/libraries/MOBIClass/MOBIFile.php
new file mode 100644
index 000000000..349227ae5
--- /dev/null
+++ b/inc/3rdparty/libraries/MOBIClass/MOBIFile.php
@@ -0,0 +1,157 @@
+ "Unknown Title", "toc" => true);
+ private $parts = array();
+ private $images = array();
+
+ /**
+ * Get the text data (the "html" code)
+ */
+ public function getTextData(){
+ $prefix = "
";
+
+ $title = "".$this->settings["title"]."
";
+
+ list($text, $entries) = $this->generateText();
+
+ if($this->settings["toc"]) {
+ $toc = $this->generateTOC($entries); //Generate TOC to get the right length
+ $toc = $this->generateTOC($entries, strlen($prefix)+strlen($toc)+strlen($title)); //Generate the real TOC
+ }
+
+ $suffix = "";
+
+ return $prefix.$toc.$title.$text.$suffix;
+ }
+
+ /**
+ * Generate the body's text and the chapter entries
+ * @return array($string, $entries) $string is the html data, $entries
+ * contains the level, the title and the position of the titles.
+ */
+ public function generateText(){
+ $str = "";
+ $entries = array();
+
+ for($i = 0; $i < sizeof($this->parts); $i++){
+ list($type, $data) = $this->parts[$i];
+ $id = "title_".$i;
+ switch($type){
+ case self::PARAGRAPH:
+ $str .= "".$data."
";
+ break;
+ case self::PAGEBREAK:
+ $str .= '';
+ break;
+ case self::H2:
+ $entries[] = array("level" => 2, "position" => strlen($str), "title" => $data, "id" => $id);
+ $str .= "".$data."
";
+ break;
+ case self::H3:
+ $entries[] = array("level" => 3, "position" => strlen($str), "title" => $data, "id" => $id);
+ $str .= "".$data."
";
+ break;
+ case self::IMAGE:
+ $str .= "";
+ break;
+ }
+ }
+ return array($str, $entries);
+ }
+
+ /**
+ * Generate a TOC
+ * @param $entries The entries array generated by generateText
+ * @param $base The zero position
+ */
+ public function generateTOC($entries, $base = 0){
+ $toc = "Contents
";
+ $toc .= "";
+ for($i = 0, $len = sizeof($entries); $i < $len; $i++){
+ $entry = $entries[$i];
+ $pos = str_pad($entry["position"]+$base, 10, "0", STR_PAD_LEFT);
+ $toc .= "".$entry["title"]." |
";
+ }
+ return $toc."
";
+ }
+
+ /**
+ * Get the file records of the images
+ */
+ public function getImages(){
+ return $this->images;
+ }
+
+ /**
+ * Get the metadata
+ */
+ public function getMetaData(){
+ return $this->settings;
+ }
+
+ /**
+ * Change the file's settings. For example set("author", "John Doe") or set("title", "The adventures of John Doe").
+ * @param $key Key of the setting to insert.
+ */
+ public function set($key, $value){
+ $this->settings[$key] = $value;
+ }
+
+ /**
+ * Get the file's settings.
+ */
+ public function get($key){
+ return $this->settings[$key];
+ }
+
+ /**
+ * Append a paragraph of text to the file.
+ * @param string $text The text to insert.
+ */
+ public function appendParagraph($text){
+ $this->parts[] = array(self::PARAGRAPH, $text);
+ }
+
+ /**
+ * Append a chapter title (H2)
+ * @param string $title The title to insert.
+ */
+ public function appendChapterTitle($title){
+ $this->parts[] = array(self::H2, $title);
+ }
+
+ /**
+ * Append a section title (H3)
+ * @param string $title The title to insert.
+ */
+ public function appendSectionTitle($title){
+ $this->parts[] = array(self::H3, $title);
+ }
+
+ public function appendPageBreak() {
+ $this->parts[] = array(self::PAGEBREAK, null);
+ }
+
+ /**
+ * Append an image.
+ * @param resource $img An image file (for example, created by `imagecreate`)
+ */
+ public function appendImage($img){
+ $imgIndex = sizeof($this->images);
+ $this->images[] = new FileRecord(new Record(ImageHandler::CreateImage($img)));
+ $this->parts[] = array(self::IMAGE, $imgIndex);
+ }
+}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/MultipleFileHandler.php b/inc/3rdparty/libraries/MOBIClass/MultipleFileHandler.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/MultipleFileHandler.php
rename to inc/3rdparty/libraries/MOBIClass/MultipleFileHandler.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/OnlineArticle.php b/inc/3rdparty/libraries/MOBIClass/OnlineArticle.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/OnlineArticle.php
rename to inc/3rdparty/libraries/MOBIClass/OnlineArticle.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/PalmRecord.php b/inc/3rdparty/libraries/MOBIClass/PalmRecord.php
similarity index 74%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/PalmRecord.php
rename to inc/3rdparty/libraries/MOBIClass/PalmRecord.php
index 29dc978ad..d0de8dfe9 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/PalmRecord.php
+++ b/inc/3rdparty/libraries/MOBIClass/PalmRecord.php
@@ -38,32 +38,19 @@ class PalmRecord extends FileObject {
"huffmanRecordOffset"=>new FileInt(),
"huffmanRecordCount"=>new FileInt(),
"unused3"=>new FileString(8),
- "exthFlags"=>new FileInt(0x50),
+ "exthFlags"=>new FileInt(0x40),
"unknown"=>new FileString(32),
"drmOffset"=>new FileInt(0xFFFFFFFF),
- "drmCount"=>new FileInt(0xFFFFFFFF),
- "drmSize"=>new FileInt(),
+ "drmCount"=>new FileShort(0xFFFFFFFF),
+ "drmSize"=>new FileShort(),
"drmFlags"=>new FileInt(),
- "mobiFiller"=>new FileString(12),
- "offset192"=>new FileShort(0x01),
- "offset194"=>new FileShort(),
- "offset196"=>new FileInt(0x01),
- "offset200"=>new FileInt(),
- "offset204"=>new FileInt(0x01),
- "offset208"=>new FileInt(),
- "offset212"=>new FileInt(0x01),
- "offset216"=>new FileString(8),
- "offset224"=>new FileInt(0xFFFFFFFF),
- "offset228"=>new FileInt(),
- "offset232"=>new FileString(8),
- "offset240"=>new FileInt(0x01),
- "offset244"=>new FileInt(0xFFFFFFFF),
+ "mobiFiller"=>new FileString(72),
//EXTH Header
"exthIdentifier"=>new FileString("EXTH", 4),
"exthHeaderLength"=>new FileInt(),
"exthRecordCount"=>new FileInt(),
"exthRecords"=>new FileElement(),
- "exthPadding"=>new FileString(),//added the 2 extra pad bytes that comes before name/title
+ "exthPadding"=>new FileString(),
//"fullNamePadding"=>new FileString(100),
"fullName"=>new FileString()
));
@@ -96,7 +83,7 @@ class PalmRecord extends FileObject {
}
if($images > 0){
- $this->elements->get("firstImageIndex")->set($textRecords+2);
+ $this->elements->get("firstImageIndex")->set($textRecords+1);
}
$this->elements->get("firstNonBookIndex")->set($textRecords+2+$images);
$this->elements->get("reserved")->set(str_pad("", 40, chr(255), STR_PAD_RIGHT));
@@ -104,21 +91,16 @@ class PalmRecord extends FileObject {
$this->elements->set("exthRecords", $exthElems);
$pad = $l%4;
$pad = (4-$pad)%4;
- $this->elements->get("exthPadding")->set(str_pad("", $pad+2, "\0", STR_PAD_RIGHT));
+ $this->elements->get("exthPadding")->set(str_pad("", $pad, "\0", STR_PAD_RIGHT));
$this->elements->get("exthHeaderLength")->set(12+$l+$pad);
$this->elements->get("recordCount")->set($textRecords);
-
- $this->elements->get("fullNameOffset")->set($this->elements->offsetToEntry("fullName"));//need to be checked
+
+ $this->elements->get("fullNameOffset")->set($this->elements->offsetToEntry("fullName"));
$this->elements->get("fullNameLength")->set(strlen($settings->get("title")));
$this->elements->get("fullName")->set($settings->get("title"));
$this->elements->get("textLength")->set($textLength);
-
- $this->elements->get("offset194")->set($textRecords+2+$images);
- $this->elements->get("offset200")->set($textRecords+4+$images);
- $this->elements->get("offset208")->set($textRecords+3+$images);
- $this->elements->get("offset232")->set(str_pad("", 8, chr(255), STR_PAD_RIGHT));
}
public function getByteLength(){
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/Prc.php b/inc/3rdparty/libraries/MOBIClass/Prc.php
similarity index 97%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/Prc.php
rename to inc/3rdparty/libraries/MOBIClass/Prc.php
index 1507e24b9..c40b58057 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/Prc.php
+++ b/inc/3rdparty/libraries/MOBIClass/Prc.php
@@ -40,7 +40,7 @@ class Prc extends FileElement {
foreach($records as $record){
$offset = new FileInt();
$attr = new FileByte();
- $uniqueID = new FileTri(2*$i);
+ $uniqueID = new FileTri($i);
$this->elements["recordList"]->add("Rec".$i, new FileElement(array(
"offset"=>$offset,
@@ -49,7 +49,7 @@ class Prc extends FileElement {
)));
$this->elements["records"]->add("Rec".$i, $record);
- $i+=1;
+ $i++;
}
$this->updateOffsets($records);
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/PreprocessedArticle.php b/inc/3rdparty/libraries/MOBIClass/PreprocessedArticle.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/PreprocessedArticle.php
rename to inc/3rdparty/libraries/MOBIClass/PreprocessedArticle.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/RecognizeURL.php b/inc/3rdparty/libraries/MOBIClass/RecognizeURL.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/RecognizeURL.php
rename to inc/3rdparty/libraries/MOBIClass/RecognizeURL.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/Record.php b/inc/3rdparty/libraries/MOBIClass/Record.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/Record.php
rename to inc/3rdparty/libraries/MOBIClass/Record.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/RecordFactory.php b/inc/3rdparty/libraries/MOBIClass/RecordFactory.php
similarity index 84%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/RecordFactory.php
rename to inc/3rdparty/libraries/MOBIClass/RecordFactory.php
index 8bf0c97db..12806fe38 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/RecordFactory.php
+++ b/inc/3rdparty/libraries/MOBIClass/RecordFactory.php
@@ -62,21 +62,7 @@ class RecordFactory {
}
public function createFLISRecord(){
-
- $this->elements = new FileElement(array(
- "offsetL0"=>new FileString("FLIS", 4), //FLIS
- "offsetL4"=>new FileInt(0x08),
- "offsetL8"=>new FileShort(0x41),
- "offsetL10"=>new FileTri(),
- "offsetL16"=>new FileInt(0xFFFFFFFF),
- "offsetL20"=>new FileShort(0x01),
- "offsetL22"=>new FileShort(0x03),
- "offsetL24"=>new FileInt(0x03),
- "offsetL28"=>new FileInt(0x01),
- "offsetL32"=>new FileInt(0xFFFFFFFF)
- ));
-
- /*$r = "FLIS";
+ $r = "FLIS";
$r .= $this->asString(8, 4);
$r .= $this->asString(65, 2);
$r .= $this->asString(0, 2);
@@ -87,7 +73,7 @@ class RecordFactory {
$r .= $this->asString(3, 4);
$r .= $this->asString(1, 4);
$r .= $this->asString(-1, 4);
- return new Record($r);*/
+ return new Record($r);
}
private function asString($int, $size){
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/Settings.php b/inc/3rdparty/libraries/MOBIClass/Settings.php
similarity index 92%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/Settings.php
rename to inc/3rdparty/libraries/MOBIClass/Settings.php
index 6bde0ba9a..ddcf2054c 100644
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/Settings.php
+++ b/inc/3rdparty/libraries/MOBIClass/Settings.php
@@ -19,6 +19,7 @@ class Settings {
* be added with a key/value pair format.
*/
public function __construct($additionalSettings = array()) {
+ // Most values shouldn't be changed (the result will be an invalid file)
$this->values = array(
"attributes"=>0,
"version"=>0,
@@ -48,13 +49,14 @@ class Settings {
"minimumVersion"=>6,
"huffmanRecordOffset"=>0,
"huffmanRecordCount"=>0,
- "exthFlags"=>0x50,
+ "exthFlags"=>0x40,
"drmOffset"=>0xFFFFFFFF,
- "drmCount"=>0xFFFFFFFF,
+ "drmCount"=>0,
"drmSize"=>0,
"drmFlags"=>0,
"extraDataFlags"=>0,
"exthIdentifier"=>"EXTH",
+ // These can be changed without any risk
"title"=>"Unknown title",
"author"=>"Unknown author",
"subject"=>"Unknown subject"
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/constants.php b/inc/3rdparty/libraries/MOBIClass/constants.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/constants.php
rename to inc/3rdparty/libraries/MOBIClass/constants.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/downloaders/FanFictionNet.php b/inc/3rdparty/libraries/MOBIClass/downloaders/FanFictionNet.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/downloaders/FanFictionNet.php
rename to inc/3rdparty/libraries/MOBIClass/downloaders/FanFictionNet.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/http_build_url.php b/inc/3rdparty/libraries/MOBIClass/http_build_url.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/http_build_url.php
rename to inc/3rdparty/libraries/MOBIClass/http_build_url.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/readability/JSLikeHTMLElement.php b/inc/3rdparty/libraries/MOBIClass/readability/JSLikeHTMLElement.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/readability/JSLikeHTMLElement.php
rename to inc/3rdparty/libraries/MOBIClass/readability/JSLikeHTMLElement.php
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/readability/Readability.php b/inc/3rdparty/libraries/MOBIClass/readability/Readability.php
similarity index 100%
rename from inc/3rdparty/libraries/send2kindle/MOBIClass/readability/Readability.php
rename to inc/3rdparty/libraries/MOBIClass/readability/Readability.php
diff --git a/inc/3rdparty/libraries/mpdf/mpdf.php b/inc/3rdparty/libraries/mpdf/mpdf.php
index dbe16fef8..f12dfec0d 100644
--- a/inc/3rdparty/libraries/mpdf/mpdf.php
+++ b/inc/3rdparty/libraries/mpdf/mpdf.php
@@ -7451,7 +7451,7 @@ function Output($name='',$dest='')
// don't use length if server using compression
header('Content-Length: '.strlen($this->buffer));
}
- header('Content-disposition: inline; filename="'.$name.'"');
+ header('Content-disposition: attachment; filename="'.$name.'"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/PEOFRecord.php b/inc/3rdparty/libraries/send2kindle/MOBIClass/PEOFRecord.php
deleted file mode 100644
index a2b0fee87..000000000
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/PEOFRecord.php
+++ /dev/null
@@ -1,49 +0,0 @@
-elements = new FileElement(array(
-
- "offset44"=>new FileInt(0xe98e0d0a)
- ));
- }
- public function getByteLength(){
- return $this->getLength();
- }
-
- public function getLength(){
- return $this->elements->getByteLength();
- }
-
- public function get(){
- return $this;
- }
-
- public function set($elements){
- throw new Exception("Unallowed set");
- }
-
- public function serialize() {
- return $this->elements->serialize();
- }
-
- public function unserialize($data) {
- $this->elements->unserialize($data);
- }
-
- public function __toString(){
- $output = "PalmDoc Record (".$this->getByteLength()." bytes):\n";
- $output .= $this->elements;
- return $output;
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/PFCISRecord.php b/inc/3rdparty/libraries/send2kindle/MOBIClass/PFCISRecord.php
deleted file mode 100644
index 9e72cc1c5..000000000
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/PFCISRecord.php
+++ /dev/null
@@ -1,59 +0,0 @@
-elements = new FileElement(array(
- "offset0"=>new FileString("FCIS", 4), //FCIS
- "offset4"=>new FileInt(0x014),
- "offset8"=>new FileInt(0x10),
- "offset12"=>new FileInt(0x01),
- "offset16"=>new FileInt(),
- "offset20"=>new FileInt($leng),
- "offset24"=>new FileInt(),
- "offset28"=>new FileInt(0x20),
- "offset32"=>new FileInt(0x08),
- "offset36"=>new FileShort(0x01),
- "offset38"=>new FileShort(0x01),
- "offset40"=>new FileInt()
- ));
- }
- public function getByteLength(){
- return $this->getLength();
- }
-
- public function getLength(){
- return $this->elements->getByteLength();
- }
-
- public function get(){
- return $this;
- }
-
- public function set($elements){
- throw new Exception("Unallowed set");
- }
-
- public function serialize() {
- return $this->elements->serialize();
- }
-
- public function unserialize($data) {
- $this->elements->unserialize($data);
- }
-
- public function __toString(){
- $output = "PalmDoc Record (".$this->getByteLength()." bytes):\n";
- $output .= $this->elements;
- return $output;
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/MOBIClass/PFLISRecord.php b/inc/3rdparty/libraries/send2kindle/MOBIClass/PFLISRecord.php
deleted file mode 100644
index dbd8ecf5a..000000000
--- a/inc/3rdparty/libraries/send2kindle/MOBIClass/PFLISRecord.php
+++ /dev/null
@@ -1,58 +0,0 @@
-elements = new FileElement(array(
- "offsetL0"=>new FileString("FLIS", 4), //FLIS
- "offsetL4"=>new FileInt(0x08),
- "offsetL8"=>new FileShort(0x41),
- "offsetL10"=>new FileString(6),
- "offsetL16"=>new FileInt(0xFFFFFFFF),
- "offsetL20"=>new FileShort(0x01),
- "offsetL22"=>new FileShort(0x03),
- "offsetL24"=>new FileInt(0x03),
- "offsetL28"=>new FileInt(0x01),
- "offsetL32"=>new FileInt(0xFFFFFFFF)
-
- ));
- }
- public function getByteLength(){
- return $this->getLength();
- }
-
- public function getLength(){
- return $this->elements->getByteLength();
- }
-
- public function get(){
- return $this;
- }
-
- public function set($elements){
- throw new Exception("Unallowed set");
- }
-
- public function serialize() {
- return $this->elements->serialize();
- }
-
- public function unserialize($data) {
- $this->elements->unserialize($data);
- }
-
- public function __toString(){
- $output = "PalmDoc Record (".$this->getByteLength()." bytes):\n";
- $output .= $this->elements;
- return $output;
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/api.php b/inc/3rdparty/libraries/send2kindle/api.php
deleted file mode 100644
index 564c171c0..000000000
--- a/inc/3rdparty/libraries/send2kindle/api.php
+++ /dev/null
@@ -1,234 +0,0 @@
- service = $service;
- }
- /* if ( isset($_SESSION[ $this -> session_var_auth_name ] ) ){
- $this -> auth = $_SESSION[ $this -> session_var_auth_name ];
- echo "Loading";
- } else { */
- $this -> clientLogin( $email, $password );
- $this -> get_token();
- /* } */
- }
-
-
- private function request( $url, $type = 'get', $headers = false, $fields = false, $cookie = false){
-
- $curl = curl_init();
-
- if ( $fields ){
- if ($type == 'get'){
- $url .= '?'.http_build_query( $fields );
- } else {
- curl_setopt($curl, CURLOPT_POST, true);
- curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($fields) );
- }
- }
- if ( $headers ){
- curl_setopt($curl, CURLOPT_HEADER, true);
- curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
- }
- if ( $cookie ){
- curl_setopt($curl, CURLOPT_COOKIE, $cookie);
- }
-
- curl_setopt($curl, CURLOPT_URL, $url);
- if (strpos($url, 'https://') !== false){
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- }
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLINFO_HEADER_OUT, true);
-
- $response = array();
- $response['text'] = curl_exec($curl);
- $response['info'] = curl_getinfo( $curl);
- $response['code'] = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
- $response['body'] = substr( $response['text'], $response['info']['header_size'] );
-
- curl_close( $curl );
- return $response;
- }
-
- private function request2google( $url, $type = 'get', $headers = false, $fields = false ){
- if ( $this -> auth ){
- $headers[] = 'Content-type: application/x-www-form-urlencoded';
- $headers[] = 'Authorization: GoogleLogin auth='.$this -> auth;
-
- if ( strpos( $url, 'http://') === false && strpos( $url, 'https://' ) === false ){
- $url = $this -> reader_api_url.$url;
- }
-
- $response = $this -> request( $url, $type, $headers, $fields);
- if ( $response['code'] == 200 ){
- if ( isset( $fields['output'] ) ){
- switch ($fields['output']){
- case 'xml':
- return (new SimpleXMLElement( $response['body'] ) );
- break;
- case 'json':
- default:
- return json_decode( $response['body'] );
- break;
- }
- } else {
- return $response['body'];
- }
- } else {
- Throw new AutentificationException('Auth error: server response '.$response['code'] );
- }
-
- } else {
- Throw new AutentificationException('Auth error: not finded Auth token');
- }
- }
-
- public function get_tag_list( $output = 'json' ){
- return $this -> request2google('tag/list', "get", false, array(
- 'output' => $output,
- 'ck' => time(),
- 'client' => $this -> client,
- ));
- }
- public function get_subscription_list( $output = 'json' ){
- return $this -> request2google('subscription/list', "get", false, array(
- 'output' => $output,
- 'ck' => time(),
- 'client' => $this -> client,
- ));
- }
- public function get_preference_list( $output = 'json' ){
- return $this -> request2google('preference/list', "get", false, array(
- 'output' => $output,
- 'ck' => time(),
- 'client' => $this -> client,
- ));
- }
- public function get_unread_count( $output = 'json' ){
- return $this -> request2google('unread-count', "get", false, array(
- 'all' => true,
- 'output' => $output,
- 'ck' => time(),
- 'client' => $this -> client,
- ));
- }
- public function get_user_info( $output = 'json' ){
- return $this -> request2google('user-info', "get", false, array(
- 'output' => $output,
- 'ck' => time(),
- 'client' => $this -> client,
- ));
- }
- private function get_token(){
- $this -> token = $this -> request2google('token');
- }
-
- //get contents functions
- /*
- r - order
- r = n - new items
- r = o - old items
- r = a - auto sort
-
- */
- private function get_content( $content_url = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
- $fields = array(
- 'ck' => time(),
- 'client' => $this -> client,
- 'n' => $number,
- 'r' => $order,
- 'output' => 'json',
- );
- if ( !empty($exclude_target) ){$fields['xt'] = $exclude_target;}
- if ( !empty($start_time) ){$fields['ot'] = $start_time;}
- if ( !empty($continuation) ){$fields['c'] = $continuation;}
-
- return $this -> request2google('stream/contents/'.Utils::urlencode( $content_url ), 'get', false, $fields);
- }
-
- public function get_content_feed( $feed_url = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
- return $this -> get_content( $feed_url, $number, $order, $exclude_target, $start_time, $continuation );
- }
- public function get_content_by_label( $label = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
- return $this -> get_content( (strpos($label, '/') === false?'user/-/label/':'').$label, $number, $order, $exclude_target, $start_time, $continuation );
- }
- public function get_content_by_state( $state = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
- return $this -> get_content( (strpos($state, '/') === false?'user/-/state/com.google/':'').$state, $number, $order, $exclude_target, $start_time, $continuation );
- }
-
- public function get_unread( $number = 20, $order = 'n' ){
- return $this ->get_content_by_state('reading-list', $number, $order, 'user/-/state/com.google/read');
- }
-
- public function get_starred($number = 20, $order = 'n'){
- return $this ->get_content_by_state('starred', $number, $order);
- }
-
- /*
- Edit functions
- */
- private function edit_do( $api_function , $post_fields ){
- $post_fields['T'] = $this -> token;
- if ( $this -> request2google( $api_function, "post", false, $post_fields ) == "OK"){
- return true;
- } else {
- return false;
- }
- }
-
- /* public function edit_subscription(
- s return $this -> edit_do( 'subscription/edit',
- } */
- public function set_state( $itemId, $state = 'read'){
- $post_fields = array(
- "i" => $itemId,
- "a" => 'user/-/state/com.google/'.$state,
- );
- //print_r( $post_fields );
- return $this ->edit_do('edit-tag?client='.$this -> client, $post_fields);
- }
-
- private function clientLogin( $email, $password ){
-
- $response = $this -> request( $this -> clientlogin_url, 'post', false, array(
- "accountType" => $this -> account_type,
- "Email" => $email,
- "Passwd" => $password,
- "service" => $this -> service,
- "source" => $this -> source,
- ));
-
- if ( $response['code'] == 200) {
- preg_match("/Auth=([a-z0-9_\-]+)/i", $response['body'], $matches_auth);
- if ($matches_auth[1]){
- $this -> auth = $matches_auth[1];
- $_SESSION[ $this -> session_var_auth_name ] = $this -> auth;
- return true;
- } else {
- Throw new AutentificationException('Auth error: not finded Auth token in response');
- }
- } else {
- Throw new AutentificationException('Auth error: server response '.$response['code'] );
- }
- }
-}
-
-//Exceptions
-class AutentificationException extends Exception {}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/images.php b/inc/3rdparty/libraries/send2kindle/images.php
deleted file mode 100644
index 63f0562a8..000000000
--- a/inc/3rdparty/libraries/send2kindle/images.php
+++ /dev/null
@@ -1,136 +0,0 @@
-_storage = $storage;
- $this->_content = $article_content;
- $this->_images_from_content = $this->_get_images_from_content($article_content);
- }
-
- /**
- * get images from url
- * @param string $content
- * @return array images hashtable
- */
- private function _get_images_from_content($content)
- {
- $result = array();
- preg_match_all('/src=\"([a-zA-Z0-9\.\/\-\_\?\+\%\~\&\;\=\:]+)\"/i', $content, $result);
-
- return $result[1];
- }
-
- /**
- * Start conversion
- * @return string converted content
- */
- public function convert()
- {
- foreach ( $this->_images_from_content as $n => $image_url )
- {
- $image = $this->_get_image($image_url);
- $this->_content = str_replace($image_url, '" recindex="'.(int)basename($image), $this->_content);
- }
-
- return $this->_content;
- }
-
- /**
- * Resize image
- * @param string $file path
- * @param int $new_width max width
- */
- private function _resize($file, $new_width = 500)
- {
- list($width, $height) = getimagesize($file);
-
- $new_height = 0;
-
- //setup the new size of the image
- if( $width > $new_width )
- {
- $ratio = $height/$width;
- $new_height = $new_width * $ratio;
- }
- else
- {
- $new_width = $width;
- $new_height = $height;
- }
-
- // resample the image
- $new_image = imagecreatetruecolor($new_width, $new_height);
-
- $type = exif_imagetype ( $file );
-
- switch ( $type )
- {
- case IMAGETYPE_JPEG:
- $old_image = imagecreatefromjpeg($file);
- imagecopyresampled($new_image, $old_image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
- imagejpeg($new_image, $file, self::JPEG_QUALITY);
- break;
- case IMAGETYPE_PNG:
- $old_image = imagecreatefrompng($file);
- imagecopyresampled($new_image, $old_image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
- imagepng($new_image, $file);
- break;
- case IMAGETYPE_GIF:
- $old_image = imagecreatefromgif($file);
- imagecopyresampled($new_image, $old_image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
- imagegif($new_image, $file);
- break;
- }
- }
-
- /**
- * Resize image
- * @return string image path
- */
- private function _get_image($url)
- {
- $image_data = @file_get_contents($url);
-
- if ( $image_data !== false )
- {
- $image_name = $this->_storage->save_image($image_data);
- $this->_resize($image_name);
-
- return $image_name;
- }
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/io.php b/inc/3rdparty/libraries/send2kindle/io.php
deleted file mode 100644
index 284c08cc9..000000000
--- a/inc/3rdparty/libraries/send2kindle/io.php
+++ /dev/null
@@ -1,250 +0,0 @@
-
- */
-class IO {
-
- /**
- * Max line height
- */
- const COMMAND_LENGTH = 50;
-
- /**
- * args for run screen
- * @var array
- */
- protected static $_args = array
- (
- 'help' => array('value' => FALSE, 'description' => 'show help for news2kindle'),
- 'grab' => array('value' => FALSE, 'description' => 'grab articles from google reader'),
- 'mobi' => array('value' => FALSE, 'description' => 'prepare mobi format'),
- 'send' => array('value' => FALSE, 'description' => 'send articles to kindle'),
- 'login' => array('value' => NULL, 'description' => 'your login to google account *requred'),
- 'password' => array('value' => NULL, 'description' => 'your password to google account *required'),
- 'kindle' => array('value' => NULL, 'description' => 'your kindle email *required'),
- 'items' => array('value' => 100, 'description' => 'max items to grab in run'),
- 'render' => array('value' => 'std', 'description' => 'name of html template for newspapper'),
- //'timeout' => array('value' => FALSE, 'description' => 'timeout is most important than items count'),
- );
-
- /**
- * Write on screen text line
- * @param string $message
- * @param bool $broken_line
- */
- public static function msg($message, $broken_line = TRUE)
- {
- echo ( $broken_line ? "\n" : "" ) . $message;
- }
-
- /**
- * Write command for status
- * @param string $message
- */
- public static function command($message)
- {
- $output_whitespaces = '';
-
- for ($i = strlen($message); $i <= self::COMMAND_LENGTH; ++$i )
- {
- $output_whitespaces .= '-';
- }
-
- self::msg( $message . ' ' . $output_whitespaces.' ' );
- }
-
- /**
- * Status - OK
- */
- public static function ok()
- {
- $colored_string = "\033[1;37m" . "\033[42m" . ' OK ' . "\033[0m";
- self::msg( $colored_string, FALSE );
- }
-
- /**
- * Status - Error
- */
- public static function error($message = NULL)
- {
- $colored_string = "\033[1;37m" . "\033[41m" . ' ERROR ' . "\033[0m";
- self::msg( $colored_string, FALSE );
-
- if ( $message !== NULL )
- {
- self::msg( ' - ' . $message );
- }
- }
-
- /**
- * Get run args
- * @param string $name key config
- * @return mixed config value
- */
- public static function arg($name)
- {
- return self::$_args[$name]['value'];
- }
-
- /**
- * Get config from ini
- * @param string $path
- * @return void
- */
- protected static function _get_config($path)
- {
- $config = parse_ini_file( $path . 'config.ini' );
-
- foreach($config as $key => $value)
- {
- self::$_args[$key]['value'] = $value;
- }
- }
-
- /**
- * Prepare args for script
- * (from http://php.net/manual/en/features.commandline.php)
- * @param array $argv array
- * @param string $path
- * @return bool success or error
- */
- public static function prepare_args($argv, $path)
- {
- self::command('Parse args');
-
- self::_get_config($path);
-
- array_shift($argv);
- $out = array();
-
- foreach ( $argv as $arg )
- {
- if ( substr($arg,0,2) == '--' )
- {
- $eqPos = strpos($arg,'=');
-
- if ( $eqPos === false )
- {
- $key = substr($arg,2);
- $out[$key] = isset($out[$key]) ? $out[$key] : true;
- }
- else
- {
- $key = substr($arg,2,$eqPos-2);
- $out[$key] = substr($arg,$eqPos+1);
- }
-
- }
- else if ( substr($arg,0,1) == '-' )
- {
- if ( substr($arg,2,1) == '=' )
- {
- $key = substr($arg,1,1);
- $out[$key] = substr($arg,3);
- }
- else
- {
- $chars = str_split(substr($arg,1));
-
- foreach ( $chars as $char )
- {
- $key = $char;
- $out[$key] = isset($out[$key]) ? $out[$key] : true;
- }
- }
- }
- else
- {
- $out[] = $arg;
- }
- }
-
- try
- {
- $args = self::_validate_args($out);
-
- foreach ( $args as $key => $value )
- {
- self::$_args[$key]['value'] = $value;
- }
- }
- catch(Exception $e)
- {
- self::error($e->getMessage());
- return false;
- }
-
- self::ok();
-
- return true;
- }
-
- /**
- * Validate args for script
- * (from http://php.net/manual/en/features.commandline.php)
- * @param array $argv array
- * @return array args
- */
- private static function _validate_args($args)
- {
- if( array_key_exists('help', $args) OR array_key_exists('h', $args) )
- {
- $args['grab'] = false;
- $args['mobi'] = false;
- $args['send'] = false;
- $args['login'] = false;
- $args['password'] = false;
- $args['kindle'] = false;
- }
-
- foreach ( $args as $key => $arg )
- {
- if ( strlen($key) === 1 )
- {
- foreach ( self::$_args as $keyA => $argA )
- {
- if($keyA[0] === $key )
- {
- unset( $args[$key] );
- $args[$keyA] = $arg;
- $key = $keyA;
- }
- }
- }
-
- if ( ! array_key_exists($key, self::$_args) )
- {
- throw new Exception('Param "'.$key.'" is invalid!');
- }
- }
-
- foreach ( self::$_args as $key => $arg )
- {
- if( self::$_args[$key]['value'] === NULL AND !array_key_exists($key, $args) )
- {
- throw new Exception('Param "'.$key.'" must be declared!');
- }
- }
-
- return $args;
- }
-
- /**
- * Prepare help
- * @return array
- */
- public static function get_help()
- {
- $output = array();
-
- foreach ( self::$_args as $arg => $item )
- {
- $output[$arg] = $item['description'];
- }
-
- return $output;
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/readability.php b/inc/3rdparty/libraries/send2kindle/readability.php
deleted file mode 100644
index 18c2dbde9..000000000
--- a/inc/3rdparty/libraries/send2kindle/readability.php
+++ /dev/null
@@ -1,249 +0,0 @@
-
- * @date 2011-02-17
- * @link http://www.gracecode.com/
- */
-
-define("READABILITY_VERSION", 0.12);
-
-class Readability2 {
- // 保存判定结果的标记位名称
- const ATTR_CONTENT_SCORE = "contentScore";
-
- // DOM 解析类目前只支持 UTF-8 编码
- const DOM_DEFAULT_CHARSET = "utf-8";
-
- // 当判定失败时显示的内容
- const MESSAGE_CAN_NOT_GET = "Sorry, readability was unable to parse this page for content. \n
- If you feel like it should have been able to,
- please let me know by mail: lucky[at]gracecode.com";
-
- // DOM 解析类(PHP5 已内置)
- protected $DOM = null;
-
- // 需要解析的源代码
- protected $source = "";
-
- // 章节的父元素列表
- private $parentNodes = array();
-
- // 需要删除的标签
- private $junkTags = Array("style", "form", "iframe", "script", "button", "input", "textarea");
-
- // 需要删除的属性
- private $junkAttrs = Array("style", "class", "onclick", "onmouseover", "align", "border", "margin");
-
-
- /**
- * 构造函数
- * @param $input_char 字符串的编码。默认 utf-8,可以省略
- */
- function __construct($source, $input_char = "utf-8") {
- $this->source = $source;
-
- // DOM 解析类只能处理 UTF-8 格式的字符
- $source = mb_convert_encoding($source, 'HTML-ENTITIES', $input_char);
-
- // 预处理 HTML 标签,剔除冗余的标签等
- $source = $this->preparSource($source);
-
- // 生成 DOM 解析类
- $this->DOM = new DOMDocument('1.0', $input_char);
- try {
- //libxml_use_internal_errors(true);
- // 会有些错误信息,不过不要紧 :^)
- if (!@$this->DOM->loadHTML(''.$source)) {
- throw new Exception("Parse HTML Error!");
- }
-
- foreach ($this->DOM->childNodes as $item) {
- if ($item->nodeType == XML_PI_NODE) {
- $this->DOM->removeChild($item); // remove hack
- }
- }
-
- // insert proper
- $this->DOM->encoding = Readability2::DOM_DEFAULT_CHARSET;
- } catch (Exception $e) {
- // ...
- }
- }
-
-
- /**
- * 预处理 HTML 标签,使其能够准确被 DOM 解析类处理
- *
- * @return String
- */
- private function preparSource($string) {
- // 剔除多余的 HTML 编码标记,避免解析出错
- preg_match("/charset=([\w|\-]+);?/", $string, $match);
- if (isset($match[1])) {
- $string = preg_replace("/charset=([\w|\-]+);?/", "", $string, 1);
- }
-
- // Replace all doubled-up
tags with tags, and remove fonts.
- $string = preg_replace("/
[ \r\n\s]*
/i", "
", $string);
- $string = preg_replace("/<\/?font[^>]*>/i", "", $string);
-
- return trim($string);
- }
-
-
- /**
- * 删除 DOM 元素中所有的 $TagName 标签
- *
- * @return DOMDocument
- */
- private function removeJunkTag($RootNode, $TagName) {
- $Tags = $RootNode->getElementsByTagName($TagName);
-
- $i = 0;
- while($Tag = $Tags->item($i++)) {
- $parentNode = $Tag->parentNode;
- $parentNode->removeChild($Tag);
- }
-
- return $RootNode;
- }
-
- /**
- * 删除元素中所有不需要的属性
- */
- private function removeJunkAttr($RootNode, $Attr) {
- $Tags = $RootNode->getElementsByTagName("*");
-
- $i = 0;
- while($Tag = $Tags->item($i++)) {
- $Tag->removeAttribute($Attr);
- }
-
- return $RootNode;
- }
-
- /**
- * 根据评分获取页面主要内容的盒模型
- * 判定算法来自:http://code.google.com/p/arc90labs-readability/
- *
- * @return DOMNode
- */
- private function getTopBox() {
- // 获得页面所有的章节
- $allParagraphs = $this->DOM->getElementsByTagName("p");
-
- // Study all the paragraphs and find the chunk that has the best score.
- // A score is determined by things like: Number of
's, commas, special classes, etc.
- $i = 0;
- while($paragraph = $allParagraphs->item($i++)) {
- $parentNode = $paragraph->parentNode;
- $contentScore = intval($parentNode->getAttribute(Readability2::ATTR_CONTENT_SCORE));
- $className = $parentNode->getAttribute("class");
- $id = $parentNode->getAttribute("id");
-
- // Look for a special classname
- if (preg_match("/(comment|meta|footer|footnote)/i", $className)) {
- $contentScore -= 50;
- } else if(preg_match(
- "/((^|\\s)(post|hentry|entry[-]?(content|text|body)?|article[-]?(content|text|body)?)(\\s|$))/i",
- $className)) {
- $contentScore += 25;
- }
-
- // Look for a special ID
- if (preg_match("/(comment|meta|footer|footnote)/i", $id)) {
- $contentScore -= 50;
- } else if (preg_match(
- "/^(post|hentry|entry[-]?(content|text|body)?|article[-]?(content|text|body)?)$/i",
- $id)) {
- $contentScore += 25;
- }
-
- // Add a point for the paragraph found
- // Add points for any commas within this paragraph
- if (strlen($paragraph->nodeValue) > 10) {
- $contentScore += strlen($paragraph->nodeValue);
- }
-
- // 保存父元素的判定得分
- $parentNode->setAttribute(Readability2::ATTR_CONTENT_SCORE, $contentScore);
-
- // 保存章节的父元素,以便下次快速获取
- array_push($this->parentNodes, $parentNode);
- }
-
- $topBox = $this->DOM->createElement('div', Readability2::MESSAGE_CAN_NOT_GET);
- // Assignment from index for performance.
- // See http://www.peachpit.com/articles/article.aspx?p=31567&seqNum=5
- for ($i = 0, $len = sizeof($this->parentNodes); $i < $len; $i++) {
- $parentNode = $this->parentNodes[$i];
- $contentScore = intval($parentNode->getAttribute(Readability2::ATTR_CONTENT_SCORE));
- $orgContentScore = intval($topBox->getAttribute(Readability2::ATTR_CONTENT_SCORE));
-
- if ($contentScore && $contentScore > $orgContentScore) {
- $topBox = $parentNode;
- }
- }
-
- // 此时,$topBox 应为已经判定后的页面内容主元素
- return $topBox;
- }
-
-
- /**
- * 获取 HTML 页面标题
- *
- * @return String
- */
- public function getTitle() {
- $title = $this->DOM->getElementsByTagName("title");
- return $title->item(0);
- }
-
-
- /**
- * 获取页面的主要内容(Readability 以后的内容)
- *
- * @return Array
- */
- public function getContent() {
- if (!$this->DOM) return false;
-
- // 获取页面标题
- $ContentTitle = $this->getTitle();
-
- // 获取页面主内容
- $ContentBox = $this->getTopBox();
-
- // 复制内容到新的 DOMDocument
- $Target = new DOMDocument;
- $Target->appendChild($Target->importNode($ContentBox, true));
-
- // 删除不需要的标签
- foreach ($this->junkTags as $tag) {
- $Target = $this->removeJunkTag($Target, $tag);
- }
-
- // 删除不需要的属性
- foreach ($this->junkAttrs as $attr) {
- $Target = $this->removeJunkAttr($Target, $attr);
- }
-
- // 多个数据,以数组的形式返回
- return Array(
- 'title' => $ContentTitle ? $ContentTitle->nodeValue : "",
- 'content' => $Target->saveHTML()
- );
- }
-
- function __destruct() { }
-}
diff --git a/inc/3rdparty/libraries/send2kindle/send.php b/inc/3rdparty/libraries/send2kindle/send.php
deleted file mode 100644
index a4861d307..000000000
--- a/inc/3rdparty/libraries/send2kindle/send.php
+++ /dev/null
@@ -1,69 +0,0 @@
-
- */
-class Send {
-
- /**
- * Your kindle email
- * @var string
- */
- private $_kindle_email;
-
- /**
- * Your email (must be added on amazon)
- * @var string
- */
- private $_email;
-
- /**
- * Prepare mail
- * @param string $kindle_email your kindle email
- * @param string $email email for send to kindle
- */
- public function __construct($kindle_email, $email)
- {
- $this->_kindle_email = $kindle_email;
- $this->_email = $email;
- }
-
- /**
- * Send file
- * @param string $file path to file
- * @return bool
- */
- public function send($file)
- {
- //prepare file
- $file_size = filesize($file);
- $filename = basename($file);
- $handle = fopen($file, "r");
- $content = fread($handle, $file_size);
- fclose($handle);
- $content = chunk_split(base64_encode($content));
-
- $uid = md5(uniqid(time()));
-
- //generate header for mail
- $header = "From: News2Kindle <".$this->_email.">\r\n";
- $header .= "MIME-Version: 1.0\r\n";
- $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
- $header .= "This is a multi-part message in MIME format.\r\n";
- $header .= "--".$uid."\r\n";
- $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
- $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
- $header .= "send via News2Kindle script\r\n\r\n";
- $header .= "--".$uid."\r\n";
- $header .= "Content-Type: application/x-mobipocket-ebook; name=\"".$filename."\"\r\n";
- $header .= "Content-Transfer-Encoding: base64\r\n";
- $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
- $header .= $content."\r\n\r\n";
- $header .= "--".$uid."--";
-
- //send mail
- return mail( $this->_kindle_email, '[newsToKindle] ' . $filename, "", $header );
- }
-}
-
-?>
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/storage.php b/inc/3rdparty/libraries/send2kindle/storage.php
deleted file mode 100644
index 5c38ce80b..000000000
--- a/inc/3rdparty/libraries/send2kindle/storage.php
+++ /dev/null
@@ -1,230 +0,0 @@
-
- */
-class Storage {
-
- /**
- * Newspapper name
- * @var string
- */
- private $_name;
-
- /**
- * Default dir
- * @var string
- */
- private $_default_dir = 'data/';
-
- /**
- * Info about newspapper
- * @var array
- */
- private $_info;
-
- /**
- * Prepare storage
- * @param string $newspapper
- * @param string $default_dir
- */
- public function __construct($newspapper, $default_dir = NULL)
- {
- $this->_name = $newspapper;
-
- if ( $default_dir !== NULL )
- {
- $this->_default_dir = $default_dir;
- }
-
- $this->_info = $this->_get_info();
- }
-
- /**
- * save info before exit from script
- */
- public function __destruct()
- {
- $this->_save_info($this->_info);
- }
-
- /**
- * Get path
- * @param bool $newspapper path to newspapper
- * @return string path to repository
- */
- public function get_path($newspapper = true)
- {
- $path = $this->_default_dir;
-
- if ( $newspapper )
- {
- $path .= $this->_name . '/';
- }
-
- return $path;
- }
-
- /**
- * Get info about newspapper
- * @return array newspapper info
- */
- private function _get_info()
- {
- $content = unserialize( $this->_get_file('info.dat') );
-
- if( $content === FALSE )
- {
- $content = (object) array
- (
- 'images_count' => 0,
- 'articles_count' => 0,
- 'images' => array(),
- );
-
- $this->_save_info($content);
- }
-
- return $content;
- }
-
- /**
- * Get info key
- * @param $key
- * @return mixed
- */
- public function info($key)
- {
- return $this->_info->$key;
- }
-
- /**
- * Save info
- * @param array $info info from class
- */
- private function _save_info($info)
- {
- $this->_save_file( 'info.dat', serialize($info) );
- }
-
- /**
- * Save image in storage
- * @param resource $image
- * @param string $name image name, if null create auto name
- * @return string image name
- */
- public function save_image($image, $name = NULL)
- {
- if ( $name === NULL )
- {
- $image_name = (string) $this->_info->images_count;
-
- for ($i=strlen($image_name); $i<6; $i++)
- {
- $image_name = '0'.$image_name;
- }
-
- $this->_info->images_count++;
- $this->_info->images[$this->_info->images_count] = $image_name;
-
- $name = $image_name;
- }
-
- $this->_save_file($name, $image);
-
- return $this->_default_dir . $this->_name . '/' . $name;
- }
-
- /**
- * Get image
- * @param string $name image name
- * @return resource
- */
- public function get_image($name)
- {
- return $this->_get_file($name);
- }
-
- /**
- * Put article contents
- * @param string $id unique id for article
- * @param string $title
- * @param string $content article content
- * @param string $url url for article
- * @param object $website
- */
- public function add_content($id, $title, $content, $url, $website)
- {
- $articles = unserialize( $this->_get_file('articles.dat') );
-
- $articles[$id] = (object) array
- (
- 'id' => $id,
- 'title' => $title,
- 'content' => $content,
- 'url' => $url,
- 'website' => $website,
- );
-
- $this->_save_file( 'articles.dat', serialize($articles) );
- }
-
- /**
- * Get articles contents
- * @param string $file_name
- * @param string $file_content
- */
- public function get_contents()
- {
- return unserialize( $this->_get_file( 'articles.dat' ) );
- }
-
- /**
- * Get file content
- * @param string $file_name
- * @param string $file_content
- */
- private function _save_file($file_name, $file_content)
- {
- if( ! file_exists( $this->_default_dir . $this->_name ) )
- {
- mkdir( $this->_default_dir . $this->_name, 0777, TRUE );
- }
-
- file_put_contents($this->_default_dir . $this->_name . '/' . $file_name, $file_content);
- }
-
- /**
- * Get file content
- * @param string $file_name
- * @param string $default_file_content (if file not exists)
- * @return string file content
- */
- private function _get_file($file_name, $default_file_content = NULL)
- {
- $content = @file_get_contents($this->_default_dir . $this->_name . '/' . $file_name);
-
- if ($content === FALSE)
- {
- return $default_file_content;
- }
-
- return $content;
- }
-
- /**
- * Clean newspapper after convert to mobi
- */
- public function clean()
- {
- $files_to_remove = glob($this->_default_dir . $this->_name . '/*');
-
- foreach ( $files_to_remove as $file )
- {
- unlink( $file );
- }
-
- rmdir( $this->_default_dir . $this->_name );
- }
-
-}
\ No newline at end of file
diff --git a/inc/3rdparty/libraries/send2kindle/utils.php b/inc/3rdparty/libraries/send2kindle/utils.php
deleted file mode 100644
index 87cc3de08..000000000
--- a/inc/3rdparty/libraries/send2kindle/utils.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
- */
-class Utils
-{
- /**
- * URL encode
- * @param string $url
- * @return string $ar_url
- */
- public static function urlencode( $url )
- {
- $ar_url = explode( '/', $url );
-
- foreach ( $ar_url as $key => $val )
- {
- $ar_url[ $key ] = urlencode( $val );
- }
-
- return implode('/', $ar_url );
- }
-
- /**
- * Prepare ID for google rss article
- * @param string $id
- * @return string
- */
- public static function prepare_id($id)
- {
- $char_in = array('/', '.', ',', ':');
- $id = str_replace($char_in, '-', $id);
-
- return $id;
- }
-}
\ No newline at end of file
diff --git a/inc/poche/Routing.class.php b/inc/poche/Routing.class.php
index e01d81291..83eabf198 100644
--- a/inc/poche/Routing.class.php
+++ b/inc/poche/Routing.class.php
@@ -112,12 +112,15 @@ class Routing
$this->wallabag->deleteUser($_POST['password4deletinguser']);
} elseif (isset($_GET['epub'])) {
$epub = new WallabagEpub($this->wallabag, $_GET['method'], $_GET['value']);
+ $epub->prepareData();
$epub->produceEpub();
} elseif (isset($_GET['mobi'])) {
$mobi = new WallabagMobi($this->wallabag, $_GET['method'], $_GET['value']);
+ $mobi->prepareData();
$mobi->produceMobi();
} elseif (isset($_GET['pdf'])) {
$pdf = new WallabagPDF($this->wallabag, $_GET['method'], $_GET['value']);
+ $pdf->prepareData();
$pdf->producePDF();
} elseif (isset($_GET['import'])) {
$import = $this->wallabag->import();
diff --git a/inc/poche/WallabagEBooks.class.php b/inc/poche/WallabagEBooks.class.php
index 147744257..deaf57e21 100644
--- a/inc/poche/WallabagEBooks.class.php
+++ b/inc/poche/WallabagEBooks.class.php
@@ -30,34 +30,35 @@ class WallabagEBooks
case 'id':
$entryID = filter_var($this->value, FILTER_SANITIZE_NUMBER_INT);
$entry = $this->wallabag->store->retrieveOneById($entryID, $this->wallabag->user->getId());
- $entries = array($entry);
- $bookTitle = $entry['title'];
- $bookFileName = substr($bookTitle, 0, 200);
+ $this->entries = array($entry);
+ $this->bookTitle = $entry['title'];
+ $this->bookFileName = substr($this->bookTitle, 0, 200);
break;
case 'all':
- $entries = $this->wallabag->store->retrieveAll($this->wallabag->user->getId());
- $bookTitle = sprintf(_('All my articles on '), date(_('d.m.y'))); #translatable because each country has it's own date format system
- $bookFileName = _('Allarticles') . date(_('dmY'));
+ $this->entries = $this->wallabag->store->retrieveAll($this->wallabag->user->getId());
+ $this->bookTitle = sprintf(_('All my articles on '), date(_('d.m.y'))); #translatable because each country has it's own date format system
+ $this->bookFileName = _('Allarticles') . date(_('dmY'));
break;
case 'tag':
$tag = filter_var($this->value, FILTER_SANITIZE_STRING);
$tags_id = $this->wallabag->store->retrieveAllTags($this->wallabag->user->getId(), $tag);
$tag_id = $tags_id[0]["id"]; // we take the first result, which is supposed to match perfectly. There must be a workaround.
- $entries = $this->wallabag->store->retrieveEntriesByTag($tag_id, $this->wallabag->user->getId());
- $bookTitle = sprintf(_('Articles tagged %s'), $tag);
- $bookFileName = substr(sprintf(_('Tag %s'), $tag), 0, 200);
+ $this->entries = $this->wallabag->store->retrieveEntriesByTag($tag_id, $this->wallabag->user->getId());
+ $this->bookTitle = sprintf(_('Articles tagged %s'), $tag);
+ $this->bookFileName = substr(sprintf(_('Tag %s'), $tag), 0, 200);
break;
case 'category':
$category = filter_var($this->value, FILTER_SANITIZE_STRING);
- $entries = $this->wallabag->store->getEntriesByView($category, $this->wallabag->user->getId());
- $bookTitle = sprintf(_('All articles in category %s'), $category);
- $bookFileName = substr(sprintf(_('Category %s'), $category), 0, 200);
+ $this->entries = $this->wallabag->store->getEntriesByView($category, $this->wallabag->user->getId());
+ $this->bookTitle = sprintf(_('All articles in category %s'), $category);
+ $this->bookFileName = substr(sprintf(_('Category %s'), $category), 0, 200);
break;
case 'search':
$search = filter_var($this->value, FILTER_SANITIZE_STRING);
- $entries = $this->store->search($search, $this->wallabag->user->getId());
- $bookTitle = sprintf(_('All articles for search %s'), $search);
- $bookFileName = substr(sprintf(_('Search %s'), $search), 0, 200);
+ Tools::logm($search);
+ $this->entries = $this->wallabag->store->search($search, $this->wallabag->user->getId());
+ $this->bookTitle = sprintf(_('All articles for search %s'), $search);
+ $this->bookFileName = substr(sprintf(_('Search %s'), $search), 0, 200);
break;
case 'default':
die(_('Uh, there is a problem while generating epub.'));
@@ -94,7 +95,7 @@ class WallabagEpub extends WallabagEBooks
$log->logLine("getCurrentServerURL: " . $book->getCurrentServerURL());
$log->logLine("getCurrentPageURL..: " . $book->getCurrentPageURL());
- $book->setTitle($bookTitle);
+ $book->setTitle($this->bookTitle);
$book->setIdentifier("http://$_SERVER[HTTP_HOST]", EPub::IDENTIFIER_URI); // Could also be the ISBN number, prefered for published books, or a UUID.
//$book->setLanguage("en"); // Not needed, but included for the example, Language is mandatory, but EPub defaults to "en". Use RFC3066 Language codes, such as "en", "da", "fr" etc.
$book->setDescription(_("Some articles saved on my wallabag"));
@@ -111,7 +112,7 @@ class WallabagEpub extends WallabagEBooks
$log->logLine("Add Cover");
- $fullTitle = "
" . $bookTitle . "
\n";
+ $fullTitle = " " . $this->bookTitle . "
\n";
$book->setCoverImage("Cover.png", file_get_contents("themes/baggy/img/apple-touch-icon-152.png"), "image/png", $fullTitle);
@@ -122,7 +123,7 @@ class WallabagEpub extends WallabagEBooks
$book->buildTOC();
- foreach ($entries as $entry) { //set tags as subjects
+ foreach ($this->entries as $entry) { //set tags as subjects
$tags = $this->wallabag->store->retrieveTagsByEntry($entry['id']);
foreach ($tags as $tag) {
$book->setSubject($tag['value']);
@@ -139,97 +140,82 @@ class WallabagEpub extends WallabagEBooks
$book->addChapter("Log", "Log.html", $content_start . $log->getLog() . "\n" . $bookEnd); // log generation
}
$book->finalize();
- $zipData = $book->sendBook($bookFileName);
+ $zipData = $book->sendBook($this->bookFileName);
}
}
class WallabagMobi extends WallabagEBooks
{
/**
- * Adapted from News2Kindle
- * @author Jakub Westfalewski
- *
+ * MOBI Class
+ * @author Sander Kromwijk
*/
- public function produceMobi()
+ public function produceMobi($send = FALSE)
{
- $storage = new Storage('static');
- $this->prepareData();
- foreach ($entries as $i => $item) {
- $content = $item['content'];
- $images = new Images($storage, $content);
- $content = $images->convert();
- $storage->add_content
- (
- md5($item['title']),
- mb_convert_encoding($item['title'], 'HTML-ENTITIES', 'utf-8'),
- $content,
- $item['url']],
- ""
- );
- }
- $articles = $storage->get_contents();
- $toc = array();
- $articles_count = count($articles);
- foreach($articles as $article){
- if(array_key_exists($article->website->title, $toc)){
- $toc[$article->website->title]->articles[] = $article;
- }else{
- $toc[$article->website->title] = (object)array(
- 'articles' => array($article),
- 'title' => $article->website->title,
- 'streamId' => $article->website->streamId,
- 'url' => $article->website->htmlUrl,
- );
- }
+ # Good try
+ $mobi = new MOBI();
+
+ $content = new MOBIFile();
+
+ $content->set("title", $this->bookTitle);
+ $content->set("author", "wallabag");
+
+ # introduction
+ //$content->appendChapterTitle("Cover");
+ $content->appendParagraph('' . _('Produced by wallabag with PHPMobi') . '
'. _('Please open an issue if you have trouble with the display of this E-Book on your device.') . '
');
+ $content->appendImage(imagecreatefrompng("themes/baggy/img/apple-touch-icon-152.png"));
+ $content->appendPageBreak();
+
+ foreach ($this->entries as $item) {
+ $content->appendChapterTitle($item['title']);
+ $content->appendParagraph($item['content']);
+ $content->appendPageBreak();
}
+ $mobi->setContentProvider($content);
- $mobi = new MOBI();
- $mobi->setData($content);
- $mobi->setOptions(array(
- 'title' => 'Articles from '.date('Y-m-d'),
- 'author' => 'wallabag',
- 'subject' => 'Articles from '.date('Y-m-d'),
- ));
-
- $images = array();
-
- //prepare images for mobi format
- foreach ( $storage->info('images') as $n => $image )
- {
- $images[$n] = new FileRecord(new Record(file_get_contents($storage->get_path() . $image)));
- }
-
- $mobi->setImages($images);
- $mobi->save( $storage->get_path(FALSE) . 'articles-' . date('Y-m-d') . '.mobi');
-
- $storage->clean();
-
- if ($send) {
- $files = glob($storage->get_path(FALSE).'*.mobi');
- $mail = new Send(KINDLEMAIL,MAIL);
- foreach ( $files as $file_mobi )
- {
- $mail->send( $file_mobi );
- }
- // clean cache
- foreach ( $files as $file_mobi )
- {
- unlink( $file_mobi );
- }
- }
- }
+ $mobi->download($this->bookFileName.".mobi");
+ }
}
class WallabagPDF extends WallabagEbooks
{
public function producePDF()
{
+ //$this->prepareData();
$mpdf = new mPDF('c');
- $mpdf->WriteHTML($html);
- $mpdf->Output();
- exit;
+ # intro
+
+ $html = '' . $this->bookTitle . '
';
+
+ foreach ($this->entries as $item) {
+ $html .= '' . $item['title'] . '
';
+ $html .= '';
+ $html .= $item['content'];
+ }
+
+ //$mpdf->h2toc = array('H1'=>0);
+
+ # headers
+ $mpdf->SetHeader('{DATE j-m-Y}|{PAGENO}/{nb}|Produced with wallabag');
+ $mpdf->SetFooter('{PAGENO}');
+
+ $mpdf->WriteHTML($html);
+
+ # remove characters that make mpdf bug
+ $char_in = array('/', '.', ',', ':', '|');
+ $pdfExportName = preg_replace('/\s+/', '-', str_replace($char_in, '-', $this->bookFileName . '.pdf'));
+
+ $mpdf->Output('cache/' . $pdfExportName);
+
+ header('Content-Disposition: attachment; filename="' . $pdfExportName . '"');
+
+ header('Content-Transfer-Encoding: base64');
+ header('Content-Type: application/pdf');
+ echo file_get_contents('cache/' . $pdfExportName);
+
+ //exit;
}
}
\ No newline at end of file
diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php
index 1542fbfa7..182f721de 100755
--- a/inc/poche/global.inc.php
+++ b/inc/poche/global.inc.php
@@ -42,11 +42,7 @@ require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPub.php';
require_once INCLUDES . '/3rdparty/libraries/PHPePub/EPubChapterSplitter.php';
# mobi library
-require_once INCLUDES . '/3rdparty/libraries/send2kindle/send.php';
-require_once INCLUDES . '/3rdparty/libraries/send2kindle/images.php';
-require_once INCLUDES . '/3rdparty/libraries/send2kindle/storage.php';
-require_once INCLUDES . '/3rdparty/libraries/send2kindle/MOBIClass/MOBI.php';
-require_once INCLUDES . '/3rdparty/libraries/send2kindle/utils.php';
+require_once INCLUDES . '/3rdparty/libraries/MOBIClass/MOBI.php';
# pdf library
require_once INCLUDES . '/3rdparty/libraries/mpdf/mpdf.php';
diff --git a/themes/baggy/config.twig b/themes/baggy/config.twig
index 46735f074..cd86a4fde 100755
--- a/themes/baggy/config.twig
+++ b/themes/baggy/config.twig
@@ -20,7 +20,7 @@
- {% trans "Bookmarklet: drag & drop this link to your bookmarks bar" %} {% trans "bag it!" %}
+ {% trans "Bookmarklet: drag & drop this link to your bookmarks bar" %} {% trans "bag it!" %}
{% trans "Upgrading wallabag" %}
@@ -126,7 +126,13 @@
{% trans "Click here" %} {% trans "to export your wallabag data." %}
{% trans "Fancy an E-Book ?" %}
- {% trans "Click on this link to get all your articles in one ebook (ePub 3 format)." %}
+
{% trans "Click to get all your articles in one ebook :" %}
+
+
{% trans "This can take a while and can even fail if you have too many articles, depending on your server configuration." %}
{% trans "Cache" %}
diff --git a/themes/baggy/home.twig b/themes/baggy/home.twig
index e788b588f..4f4152200 100755
--- a/themes/baggy/home.twig
+++ b/themes/baggy/home.twig
@@ -43,7 +43,7 @@
{% if entry.content| getReadingTime > 0 %}
{% else %}
-
+
{% endif %}