X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FHelper%2FEntriesExport.php;h=cd74cc4f866a8e6e2b2a3d7e5b7fa63fe52008d0;hb=f808b01692a835673f328d7221ba8c212caa9b61;hp=6ecdf019672a65ac003f28ab320f145c7ddf7e13;hpb=f898102c85e8b2d6a979e91ae2f16278b41d60b6;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Helper/EntriesExport.php b/src/Wallabag/CoreBundle/Helper/EntriesExport.php index 6ecdf019..cd74cc4f 100644 --- a/src/Wallabag/CoreBundle/Helper/EntriesExport.php +++ b/src/Wallabag/CoreBundle/Helper/EntriesExport.php @@ -8,7 +8,6 @@ use JMS\Serializer\SerializerBuilder; use PHPePub\Core\EPub; use PHPePub\Core\Structure\OPF\DublinCore; use Symfony\Component\HttpFoundation\Response; -use Craue\ConfigBundle\Util\Config; /** * This class doesn't have unit test BUT it's fully covered by a functional test with ExportControllerTest. @@ -18,22 +17,21 @@ class EntriesExport private $wallabagUrl; private $logoPath; private $title = ''; - private $entries = array(); - private $authors = array('wallabag'); + private $entries = []; + private $authors = ['wallabag']; private $language = ''; - private $tags = array(); private $footerTemplate = '

Produced by wallabag with %EXPORT_METHOD%

Please open an issue if you have trouble with the display of this E-Book on your device.

- '; /** - * @param Config $craueConfig CraueConfig instance to get wallabag instance url from database + * @param string $wallabagUrl Wallabag instance url * @param string $logoPath Path to the logo FROM THE BUNDLE SCOPE */ - public function __construct(Config $craueConfig, $logoPath) + public function __construct($wallabagUrl, $logoPath) { - $this->wallabagUrl = $craueConfig->get('wallabag_url'); + $this->wallabagUrl = $wallabagUrl; $this->logoPath = $logoPath; } @@ -41,20 +39,18 @@ class EntriesExport * Define entries. * * @param array|Entry $entries An array of entries or one entry + * + * @return EntriesExport */ public function setEntries($entries) { if (!is_array($entries)) { $this->language = $entries->getLanguage(); - $entries = array($entries); + $entries = [$entries]; } $this->entries = $entries; - foreach ($entries as $entry) { - $this->tags[] = $entry->getTags(); - } - return $this; } @@ -62,10 +58,12 @@ class EntriesExport * Sets the category of which we want to get articles, or just one entry. * * @param string $method Method to get articles + * + * @return EntriesExport */ public function updateTitle($method) { - $this->title = $method.' articles'; + $this->title = $method . ' articles'; if ('entry' === $method) { $this->title = $this->entries[0]->getTitle(); @@ -78,37 +76,28 @@ class EntriesExport * Sets the output format. * * @param string $format + * + * @return Response */ public function exportAs($format) { - switch ($format) { - case 'epub': - return $this->produceEpub(); - - case 'mobi': - return $this->produceMobi(); - - case 'pdf': - return $this->producePDF(); - - case 'csv': - return $this->produceCSV(); - - case 'json': - return $this->produceJSON(); - - case 'xml': - return $this->produceXML(); - - case 'txt': - return $this->produceTXT(); + $functionName = 'produce' . ucfirst($format); + if (method_exists($this, $functionName)) { + return $this->$functionName(); } throw new \InvalidArgumentException(sprintf('The format "%s" is not yet supported.', $format)); } + public function exportJsonData() + { + return $this->prepareSerializingContent('json'); + } + /** * Use PHPePub to dump a .epub file. + * + * @return Response */ private function produceEpub() { @@ -117,12 +106,12 @@ class EntriesExport */ $content_start = "\n" - ."\n" - .'' - ."\n" - ."wallabag articles book\n" - ."\n" - ."\n"; + . "\n" + . '' + . "\n" + . "wallabag articles book\n" + . "\n" + . "\n"; $bookEnd = "\n\n"; @@ -159,8 +148,6 @@ class EntriesExport $book->setCoverImage('Cover.png', file_get_contents($this->logoPath), 'image/png'); } - $book->addChapter('Notices', 'Cover2.html', $content_start.$this->getExportInformation('PHPePub').$bookEnd); - $book->buildTOC(); /* @@ -169,28 +156,36 @@ class EntriesExport // set tags as subjects foreach ($this->entries as $entry) { - foreach ($this->tags as $tag) { - $book->setSubject($tag['value']); + foreach ($entry->getTags() as $tag) { + $book->setSubject($tag->getLabel()); } - $chapter = $content_start.$entry->getContent().$bookEnd; - $book->addChapter($entry->getTitle(), htmlspecialchars($entry->getTitle()).'.html', $chapter, true, EPub::EXTERNAL_REF_ADD); + // the reader in Kobo Devices doesn't likes special caracters + // in filenames, we limit to A-z/0-9 + $filename = preg_replace('/[^A-Za-z0-9\-]/', '', $entry->getTitle()); + + $chapter = $content_start . $entry->getContent() . $bookEnd; + $book->addChapter($entry->getTitle(), htmlspecialchars($filename) . '.html', $chapter, true, EPub::EXTERNAL_REF_ADD); } + $book->addChapter('Notices', 'Cover2.html', $content_start . $this->getExportInformation('PHPePub') . $bookEnd); + return Response::create( $book->getBook(), 200, - array( + [ 'Content-Description' => 'File Transfer', 'Content-type' => 'application/epub+zip', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.epub"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.epub"', 'Content-Transfer-Encoding' => 'binary', - ) + ] ); } /** * Use PHPMobi to dump a .mobi file. + * + * @return Response */ private function produceMobi() { @@ -229,20 +224,22 @@ class EntriesExport return Response::create( $mobi->toString(), 200, - array( + [ 'Accept-Ranges' => 'bytes', 'Content-Description' => 'File Transfer', 'Content-type' => 'application/x-mobipocket-ebook', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.mobi"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.mobi"', 'Content-Transfer-Encoding' => 'binary', - ) + ] ); } /** * Use TCPDF to dump a .pdf file. + * + * @return Response */ - private function producePDF() + private function producePdf() { $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); @@ -259,7 +256,7 @@ class EntriesExport * Front page */ $pdf->AddPage(); - $intro = '

'.$this->title.'

'.$this->getExportInformation('tcpdf'); + $intro = '

' . $this->title . '

' . $this->getExportInformation('tcpdf'); $pdf->writeHTMLCell(0, 0, '', '', $intro, 0, 1, 0, true, '', true); @@ -267,12 +264,12 @@ class EntriesExport * Adding actual entries */ foreach ($this->entries as $entry) { - foreach ($this->tags as $tag) { - $pdf->SetKeywords($tag['value']); + foreach ($entry->getTags() as $tag) { + $pdf->SetKeywords($tag->getLabel()); } $pdf->AddPage(); - $html = '

'.$entry->getTitle().'

'; + $html = '

' . $entry->getTitle() . '

'; $html .= $entry->getContent(); $pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true); @@ -284,38 +281,41 @@ class EntriesExport return Response::create( $pdf->Output('', 'S'), 200, - array( + [ 'Content-Description' => 'File Transfer', 'Content-type' => 'application/pdf', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.pdf"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.pdf"', 'Content-Transfer-Encoding' => 'binary', - ) + ] ); } /** * Inspired from CsvFileDumper. + * + * @return Response */ - private function produceCSV() + private function produceCsv() { $delimiter = ';'; $enclosure = '"'; $handle = fopen('php://memory', 'rb+'); - fputcsv($handle, array('Title', 'URL', 'Content', 'Tags', 'MIME Type', 'Language'), $delimiter, $enclosure); + fputcsv($handle, ['Title', 'URL', 'Content', 'Tags', 'MIME Type', 'Language', 'Creation date'], $delimiter, $enclosure); foreach ($this->entries as $entry) { fputcsv( $handle, - array( + [ $entry->getTitle(), $entry->getURL(), // remove new line to avoid crazy results - str_replace(array("\r\n", "\r", "\n"), '', $entry->getContent()), + str_replace(["\r\n", "\r", "\n"], '', $entry->getContent()), implode(', ', $entry->getTags()->toArray()), $entry->getMimetype(), $entry->getLanguage(), - ), + $entry->getCreatedAt()->format('d/m/Y h:i:s'), + ], $delimiter, $enclosure ); @@ -328,63 +328,80 @@ class EntriesExport return Response::create( $output, 200, - array( + [ 'Content-type' => 'application/csv', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.csv"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.csv"', 'Content-Transfer-Encoding' => 'UTF-8', - ) + ] ); } - private function produceJSON() + /** + * Dump a JSON file. + * + * @return Response + */ + private function produceJson() { return Response::create( $this->prepareSerializingContent('json'), 200, - array( + [ 'Content-type' => 'application/json', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.json"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.json"', 'Content-Transfer-Encoding' => 'UTF-8', - ) + ] ); } - private function produceXML() + /** + * Dump a XML file. + * + * @return Response + */ + private function produceXml() { return Response::create( $this->prepareSerializingContent('xml'), 200, - array( + [ 'Content-type' => 'application/xml', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.xml"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.xml"', 'Content-Transfer-Encoding' => 'UTF-8', - ) + ] ); } - private function produceTXT() + /** + * Dump a TXT file. + * + * @return Response + */ + private function produceTxt() { $content = ''; $bar = str_repeat('=', 100); foreach ($this->entries as $entry) { - $content .= "\n\n".$bar."\n\n".$entry->getTitle()."\n\n".$bar."\n\n"; - $content .= trim(preg_replace('/\s+/S', ' ', strip_tags($entry->getContent())))."\n\n"; + $content .= "\n\n" . $bar . "\n\n" . $entry->getTitle() . "\n\n" . $bar . "\n\n"; + $content .= trim(preg_replace('/\s+/S', ' ', strip_tags($entry->getContent()))) . "\n\n"; } return Response::create( $content, 200, - array( + [ 'Content-type' => 'text/plain', - 'Content-Disposition' => 'attachment; filename="'.$this->title.'.txt"', + 'Content-Disposition' => 'attachment; filename="' . $this->title . '.txt"', 'Content-Transfer-Encoding' => 'UTF-8', - ) + ] ); } /** * Return a Serializer object for producing processes that need it (JSON & XML). * + * @param string $format + * * @return Serializer */ private function prepareSerializingContent($format) @@ -394,7 +411,7 @@ class EntriesExport return $serializer->serialize( $this->entries, $format, - SerializationContext::create()->setGroups(array('entries_for_user')) + SerializationContext::create()->setGroups(['entries_for_user']) ); } @@ -410,7 +427,7 @@ class EntriesExport $info = str_replace('%EXPORT_METHOD%', $type, $this->footerTemplate); if ('tcpdf' === $type) { - return str_replace('%IMAGE%', '', $info); + return str_replace('%IMAGE%', '', $info); } return str_replace('%IMAGE%', '', $info);