X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FHelper%2FEntriesExport.php;h=6ecdf019672a65ac003f28ab320f145c7ddf7e13;hb=abc329453be6381bcf4d1b0dfd9f698312ed3b16;hp=806319b1a28e24778f21d5640930ead4565b241e;hpb=add597bad95b30dbecab3aecc8362a1ccd427976;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Helper/EntriesExport.php b/src/Wallabag/CoreBundle/Helper/EntriesExport.php index 806319b1..6ecdf019 100644 --- a/src/Wallabag/CoreBundle/Helper/EntriesExport.php +++ b/src/Wallabag/CoreBundle/Helper/EntriesExport.php @@ -2,10 +2,17 @@ namespace Wallabag\CoreBundle\Helper; +use JMS\Serializer; +use JMS\Serializer\SerializationContext; +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. + */ class EntriesExport { private $wallabagUrl; @@ -21,12 +28,12 @@ class EntriesExport wallabagUrl = $wallabagUrl; + $this->wallabagUrl = $craueConfig->get('wallabag_url'); $this->logoPath = $logoPath; } @@ -86,6 +93,15 @@ class EntriesExport case 'csv': return $this->produceCSV(); + + case 'json': + return $this->produceJSON(); + + case 'xml': + return $this->produceXML(); + + case 'txt': + return $this->produceTXT(); } throw new \InvalidArgumentException(sprintf('The format "%s" is not yet supported.', $format)); @@ -170,7 +186,7 @@ class EntriesExport 'Content-Disposition' => 'attachment; filename="'.$this->title.'.epub"', 'Content-Transfer-Encoding' => 'binary', ) - )->send(); + ); } /** @@ -220,7 +236,7 @@ class EntriesExport 'Content-Disposition' => 'attachment; filename="'.$this->title.'.mobi"', 'Content-Transfer-Encoding' => 'binary', ) - )->send(); + ); } /** @@ -274,7 +290,7 @@ class EntriesExport 'Content-Disposition' => 'attachment; filename="'.$this->title.'.pdf"', 'Content-Transfer-Encoding' => 'binary', ) - )->send(); + ); } /** @@ -294,7 +310,8 @@ class EntriesExport array( $entry->getTitle(), $entry->getURL(), - $entry->getContent(), + // remove new line to avoid crazy results + str_replace(array("\r\n", "\r", "\n"), '', $entry->getContent()), implode(', ', $entry->getTags()->toArray()), $entry->getMimetype(), $entry->getLanguage(), @@ -316,7 +333,69 @@ class EntriesExport 'Content-Disposition' => 'attachment; filename="'.$this->title.'.csv"', 'Content-Transfer-Encoding' => 'UTF-8', ) - )->send(); + ); + } + + private function produceJSON() + { + return Response::create( + $this->prepareSerializingContent('json'), + 200, + array( + 'Content-type' => 'application/json', + 'Content-Disposition' => 'attachment; filename="'.$this->title.'.json"', + 'Content-Transfer-Encoding' => 'UTF-8', + ) + ); + } + + private function produceXML() + { + return Response::create( + $this->prepareSerializingContent('xml'), + 200, + array( + 'Content-type' => 'application/xml', + 'Content-Disposition' => 'attachment; filename="'.$this->title.'.xml"', + 'Content-Transfer-Encoding' => 'UTF-8', + ) + ); + } + + 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"; + } + + return Response::create( + $content, + 200, + array( + 'Content-type' => 'text/plain', + 'Content-Disposition' => 'attachment; filename="'.$this->title.'.txt"', + 'Content-Transfer-Encoding' => 'UTF-8', + ) + ); + } + + /** + * Return a Serializer object for producing processes that need it (JSON & XML). + * + * @return Serializer + */ + private function prepareSerializingContent($format) + { + $serializer = SerializerBuilder::create()->build(); + + return $serializer->serialize( + $this->entries, + $format, + SerializationContext::create()->setGroups(array('entries_for_user')) + ); } /**