add script to get le monde as epub
This commit is contained in:
		
							parent
							
								
									cbd517ebb5
								
							
						
					
					
						commit
						3ec36a4dab
					
				|  | @ -0,0 +1,738 @@ | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * TPEpubCreator - PHP EPUB Creator | ||||||
|  |  * | ||||||
|  |  * This PHP class creates e-books using the EPUB standard format. An example can | ||||||
|  |  * be found at ../index.php. | ||||||
|  |  * | ||||||
|  |  * @package  TPEpubCreator | ||||||
|  |  * @author   Luiz Otávio Miranda <contato@tutsup.com> | ||||||
|  |  * @version  $Revision: 1.0.0 $ | ||||||
|  |  * @access   public | ||||||
|  |  * @see      http://www.tutsup.com/  | ||||||
|  |  */ | ||||||
|  | class TPEpubCreator | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * This is the abspath for this file | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $abspath; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the cover img path | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $cover_img; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the content.opf file | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var array | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $opf = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the toc.ncx file | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var array | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $ncx = array(); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * This is the pages array | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var array | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $pages = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the images array | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var array | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $images = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the new images array | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var array | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $new_images = array(); | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is to check if a cover has been added | ||||||
|  |      * | ||||||
|  |      * @access private | ||||||
|  |      * @var bool | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     private $cover; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is our errors output | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $error; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's uuid | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $uuid; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's title | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $title = 'Untitled'; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's creator | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $creator = 'Tutsup.com'; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's language | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $language = 'pt'; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's rights | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $rights = 'Public Domain'; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's publisher | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $publisher = 'http://www.tutsup.com/'; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the book's css | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $css; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the temp folder used to store the book's files before zip it | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $temp_folder; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the path to output the epub file | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $epub_file; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the container.xml file | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var string | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $container; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the key for the pages array | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var int | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $key = 0; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * This is the key for the images array | ||||||
|  |      * | ||||||
|  |      * @access public | ||||||
|  |      * @var int | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      */ | ||||||
|  |     public $image_key = 0; | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Constructor. | ||||||
|  |      * | ||||||
|  |      * This only sets the abspath and uuid | ||||||
|  |      * | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      * @access public | ||||||
|  |      * | ||||||
|  |      */    | ||||||
|  |     public function __construct () { | ||||||
|  |         $this->abspath = dirname( __FILE__ ); | ||||||
|  |         $this->uuid = md5( microtime() ); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Add Image | ||||||
|  |      * | ||||||
|  |      * This stores the images in the images array and set the cover. | ||||||
|  |      * | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      * @access public | ||||||
|  |      * | ||||||
|  |      * @param string $path Image's Path | ||||||
|  |      * @param string $type Image's Mime-type | ||||||
|  |      * @param bool $cover Whether it will or will not be a cover | ||||||
|  |      * | ||||||
|  |      * @return bool false if the image does not exists | ||||||
|  |      */     | ||||||
|  |     public function AddImage( $path = false, $type = false, $cover = 0 ) { | ||||||
|  |         $this->image_key++; | ||||||
|  |          | ||||||
|  |         // Checks if the image exists first
 | ||||||
|  |         /*if ( ! file_exists( $path ) ) { | ||||||
|  |             $this->error = 'Cannot find image ' . $path . '.'; | ||||||
|  |             return; | ||||||
|  |         }*/ | ||||||
|  |          | ||||||
|  |         $this->images[$this->image_key]['path'] = $path; | ||||||
|  |         $this->images[$this->image_key]['type'] = $type; | ||||||
|  |         $this->images[$this->image_key]['cover'] = $cover; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Add Page | ||||||
|  |      * | ||||||
|  |      * This stores the pages in the pages array. It'll store the XHTML content | ||||||
|  |      * for the page, but won't check or parse it. | ||||||
|  |      * | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      * @access public | ||||||
|  |      * | ||||||
|  |      * @param string $content Page content (XHTML) | ||||||
|  |      * @param string $file A file that has the page content (XHTML) | ||||||
|  |      * @param string $title Page's title | ||||||
|  |      * @param bool $download_images Whether to download images from the HTML or not | ||||||
|  |      * | ||||||
|  |      * @return bool false if the image does not exists | ||||||
|  |      */     | ||||||
|  |     public function AddPage(  | ||||||
|  |         $content = null,  | ||||||
|  |         $file = null,  | ||||||
|  |         $title = 'Untitled', | ||||||
|  |         $download_images = false | ||||||
|  |     ) { | ||||||
|  |         // Set the key for the page
 | ||||||
|  |         $this->key++; | ||||||
|  |          | ||||||
|  |         // If nothing to add, nothing to do
 | ||||||
|  |         if ( ! $content && ! $file ) { | ||||||
|  |             $this->error = 'No content or file added.'; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If it's XHTML
 | ||||||
|  |         if ( $content ) { | ||||||
|  |             $this->pages[$this->key]['content'] = $content; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If it's a file
 | ||||||
|  |         if ( $file ) { | ||||||
|  |             // If the file does not exists, won't do anything
 | ||||||
|  |             if ( ! file_exists( $file ) ) { | ||||||
|  |                 $this->error = "File {$file} does not exists."; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             $file = file_get_contents( $file ); | ||||||
|  |             $this->pages[$this->key]['content'] = $file; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If the $download_images param is set to true, we'll try to download
 | ||||||
|  |         // images found and add it to you e-book
 | ||||||
|  |         if ( $download_images ) { | ||||||
|  |             $found_images = preg_match_all( | ||||||
|  |                 '/(\<img.*?src=[\'|"])(.*?)([\'|"].*?\>)/mis',  | ||||||
|  |                 $this->pages[$this->key]['content'],  | ||||||
|  |                 $image_matches | ||||||
|  |             ); | ||||||
|  |              | ||||||
|  |             // Just need the URLs
 | ||||||
|  |             if ( $found_images ) { | ||||||
|  |                 if ( ! empty( $image_matches[2] ) ) { | ||||||
|  |                     foreach ( $image_matches[2] as $img ) { | ||||||
|  |                         $this->AddImage( $img ); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Set the page title
 | ||||||
|  |         $this->pages[$this->key]['title'] = $title;         | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create EPUB | ||||||
|  |      * | ||||||
|  |      * This creates the epub file. It uses lots of other methods to accomplish | ||||||
|  |      * its task. | ||||||
|  |      * | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      * @access public | ||||||
|  |      */         | ||||||
|  |     public function CreateEPUB() { | ||||||
|  |         // Creates all the folders needed
 | ||||||
|  |         $this->CreateFolders(); | ||||||
|  |          | ||||||
|  |         // If there's no error we're good to go
 | ||||||
|  |         if ( $this->error ) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Open the content.opf file
 | ||||||
|  |         $this->OpenOPF(); | ||||||
|  |          | ||||||
|  |         // Open the toc.ncx file
 | ||||||
|  |         $this->OpenNCX(); | ||||||
|  |          | ||||||
|  |         // Open the css.css file
 | ||||||
|  |         $this->OpenCSS(); | ||||||
|  |          | ||||||
|  |         // Variables needed to put everything in the right place
 | ||||||
|  |         $ncx = null; | ||||||
|  |         $opf = null; | ||||||
|  |         $fill_opf_spine = null; | ||||||
|  |          | ||||||
|  |         // Loop the pages array and fill the content.opf and toc.ncx content
 | ||||||
|  |         foreach( $this->pages as $key => $value ) { | ||||||
|  |             // The page
 | ||||||
|  |             $page = 'page' . $key; | ||||||
|  |              | ||||||
|  |             // OPF
 | ||||||
|  |             $opf .= '<item id="' . $page . '" href="' . $page . '.xhtml" media-type="application/xhtml+xml" />' . "\r\n"; | ||||||
|  |              | ||||||
|  |             // NCX
 | ||||||
|  |             $ncx  .= '<navPoint id="' . $page . '" playOrder="' . $key . '">' . "\r\n"; | ||||||
|  |             $ncx .= '<navLabel>' . "\r\n"; | ||||||
|  |             $ncx .= '<text>' . $value['title'] . '</text>' . "\r\n"; | ||||||
|  |             $ncx .= '</navLabel>' . "\r\n"; | ||||||
|  |             $ncx .= '<content src="' . $page . '.xhtml"/>' . "\r\n"; | ||||||
|  |             $ncx .= '</navPoint>' . "\r\n"; | ||||||
|  |              | ||||||
|  |             // Fill the spine
 | ||||||
|  |             $fill_opf_spine .= '<itemref idref="' . $page . '" />' . "\r\n"; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If there are images, loop the values
 | ||||||
|  |         if ( ! empty( $this->images ) ) { | ||||||
|  |             foreach( $this->images as $image_key => $image_value ) { | ||||||
|  |                  | ||||||
|  |                 // New image have the same name as the old one
 | ||||||
|  |                 $new_image  = $this->temp_folder . '/OEBPS/images/'; | ||||||
|  |                 $new_image .= mt_rand(0,9999) . '_'; | ||||||
|  |                 $new_image .= basename( $image_value['path'] ); | ||||||
|  |                  | ||||||
|  |                 // Mime-type
 | ||||||
|  |                 $image_type = $image_value['type']; | ||||||
|  |                  | ||||||
|  |                 // If we don't have a mimetype for the image
 | ||||||
|  |                 // We'll try to get it
 | ||||||
|  |                 if ( ! $image_type ) { | ||||||
|  |                     $image_type = getimagesize( $image_value['path'] ); | ||||||
|  |                     $image_type = $image_type['mime']; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 // Try to copy the image
 | ||||||
|  |                 if ( ! @copy( $image_value['path'], $new_image ) ) { | ||||||
|  |                     $this->error = 'Cannot copy ' . $image_value . '.'; | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 // Set the new images name
 | ||||||
|  |                 $this->new_images[$image_key]['path'] = $new_image; | ||||||
|  |                  | ||||||
|  |                 // If there is a cover, create another ID and XHTML page later
 | ||||||
|  |                 if ( ! empty( $image_value['cover'] ) ) { | ||||||
|  |                     $opf .= '<item id="cover" href="cover.xhtml" media-type="application/xhtml+xml" />' . "\r\n"; | ||||||
|  |                     $opf .= '<item id="cover-image'; | ||||||
|  |                     $this->cover_img = basename( $new_image ); | ||||||
|  |                 } else { | ||||||
|  |                     $opf .= '<item id="img' . $image_key; | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |                 // End the image <item> tag
 | ||||||
|  |                 $opf .= '" href="images/' . basename( $new_image ); | ||||||
|  |                 $opf .= '" media-type="' . $image_type . '" />' . "\r\n"; | ||||||
|  |             }            | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Fill the NCX and OPF
 | ||||||
|  |         $this->ncx[] = $ncx; | ||||||
|  |          | ||||||
|  |         $this->opf[] = $opf; | ||||||
|  |         $this->opf[] = '</manifest><spine toc="ncx">' . "\r\n"; | ||||||
|  |          | ||||||
|  |         // If there's a cover, we'll need an <itemref idref="cover" />
 | ||||||
|  |         if ( $this->cover_img ) { | ||||||
|  |             $this->opf[] = "<itemref idref=\"cover\" />\r\n"; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Fill the spine
 | ||||||
|  |         $this->opf[] = $fill_opf_spine; | ||||||
|  |          | ||||||
|  |         // Closes the OPF and NCX
 | ||||||
|  |         $this->CloseOPF(); | ||||||
|  |         $this->CloseNCX(); | ||||||
|  |          | ||||||
|  |         // Create the OPF and NCX files
 | ||||||
|  |         $this->CreateOPF(); | ||||||
|  |         $this->CreateNCX(); | ||||||
|  |          | ||||||
|  |         // XHTML default page header
 | ||||||
|  |         $page_content  = "<?xml version='1.0' encoding='utf-8'?>" . "\r\n"; | ||||||
|  |         $page_content .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' . "\r\n"; | ||||||
|  |         $page_content .= '<html xmlns="http://www.w3.org/1999/xhtml">' . "\r\n"; | ||||||
|  |         $page_content .= '<head>' . "\r\n"; | ||||||
|  |         $page_content .= '<meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-Type"/>' . "\r\n"; | ||||||
|  |         $page_content .= '<link href="css.css" type="text/css" rel="stylesheet"/>' . "\r\n"; | ||||||
|  |         $page_content .= '</head>' . "\r\n"; | ||||||
|  |         $page_content .= '<body>' . "\r\n"; | ||||||
|  |          | ||||||
|  |         // Loop the pages
 | ||||||
|  |         foreach( $this->pages as $key => $value ) { | ||||||
|  |              | ||||||
|  |             // Page file
 | ||||||
|  |             $page = 'page' . $key . '.xhtml'; | ||||||
|  |              | ||||||
|  |             // Replace unwanted tags (for now scripts and iframes)
 | ||||||
|  |             $value['content'] = preg_replace( | ||||||
|  |                 '/\<(script|iframe)[^>]*\>.*?\<\/(script|iframe)\>/mis',  | ||||||
|  |                 '',  | ||||||
|  |                 $value['content'] | ||||||
|  |             ); | ||||||
|  |              | ||||||
|  |             // Fill the page content and ends the XHTML
 | ||||||
|  |             $value['content']  = $page_content . $value['content']; | ||||||
|  |             $value['content'] .= '</body></html>'; | ||||||
|  |              | ||||||
|  |             // Replace the HTML images to the new images
 | ||||||
|  |             foreach( $this->images as $check_image_key => $check_images ) { | ||||||
|  |                 $value['content'] = str_replace (  | ||||||
|  |                     $check_images['path'], | ||||||
|  |                     'images/' . basename( $this->new_images[$check_image_key]['path'] ), | ||||||
|  |                     $value['content'] | ||||||
|  |                 ); | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Create the file
 | ||||||
|  |             $this->CreateFile( $this->temp_folder . '/OEBPS/' . $page, $value['content'] ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If there's a cover, create its page
 | ||||||
|  |         if ( ! empty( $this->cover_img )  ) { | ||||||
|  |             $cover_page  = $page_content; | ||||||
|  |             $cover_page .= '<img class="cover-image" width="600" height="800" src="images/' . $this->cover_img . '" />' . "\r\n"; | ||||||
|  |             $cover_page .= '</body></html>'; | ||||||
|  |             $this->CreateFile( $this->temp_folder . '/OEBPS/cover.xhtml', $cover_page ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Create the zip file
 | ||||||
|  |         $this->CreateZip(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Open CSS | ||||||
|  |      * | ||||||
|  |      * It will simply fill the $css property | ||||||
|  |      */     | ||||||
|  |     public function OpenCSS() { | ||||||
|  |         if ( ! $this->css ) { | ||||||
|  |             $this->css  = 'body {'; | ||||||
|  |             $this->css .= 'margin-left: .5em;'; | ||||||
|  |             $this->css .= 'margin-right: .5em;'; | ||||||
|  |             $this->css .= 'text-align: left;'; | ||||||
|  |             $this->css .= 'direction: ltr;'; | ||||||
|  |             $this->css .= 'font-family: arial;'; | ||||||
|  |             $this->css .= 'direction: ltr;'; | ||||||
|  |             $this->css .= 'font-size:12pt;'; | ||||||
|  |             $this->css .= 'font-weight:400;'; | ||||||
|  |             $this->css .= '};'; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Open OPF | ||||||
|  |      * | ||||||
|  |      * Fill the content.opf file ($opf property) | ||||||
|  |      */     | ||||||
|  |     private function OpenOPF() { | ||||||
|  |         $this->opf[] = '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookID" version="2.0" >' . "\r\n"; | ||||||
|  |         $this->opf[] = '<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">' . "\r\n"; | ||||||
|  |         $this->opf[] = '<dc:title>' . $this->title . '</dc:title>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<dc:creator opf:file-as="' . $this->creator . '" opf:role="aut">' . $this->creator . '</dc:creator>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<dc:language>' . $this->language . '</dc:language>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<dc:rights>' . $this->rights . '</dc:rights>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<dc:publisher>' . $this->publisher . '</dc:publisher>'; | ||||||
|  |         $this->opf[] = '<dc:identifier id="BookID" opf:scheme="UUID">' . $this->uuid . '</dc:identifier>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<meta name="cover" content="cover" />' . "\r\n"; | ||||||
|  |         $this->opf[] = '</metadata><manifest>' . "\r\n"; | ||||||
|  |         $this->opf[] = '<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />' . "\r\n"; | ||||||
|  |         $this->opf[] = '<item id="style" href="css.css" media-type="text/css" />' . "\r\n"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Close OPF | ||||||
|  |      * | ||||||
|  |      * End of the content.opf file | ||||||
|  |      */     | ||||||
|  |     private function CloseOPF() { | ||||||
|  |         $this->opf[] = '</spine></package>' . "\r\n"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create OPF | ||||||
|  |      * | ||||||
|  |      * Creates the content.opf file | ||||||
|  |      */     | ||||||
|  |     private function CreateOPF() { | ||||||
|  |         $opf = null; | ||||||
|  |          | ||||||
|  |         foreach( $this->opf as $lines ) {  | ||||||
|  |             $opf .= "$lines\r\n"; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $this->CreateFile( $this->temp_folder . '/OEBPS/content.opf', $opf ); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Open NCX | ||||||
|  |      * | ||||||
|  |      * Fill the toc.ncx content ($ncx property) | ||||||
|  |      */     | ||||||
|  |     private function OpenNCX() { | ||||||
|  |         $this->ncx[] = '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<meta name="dtb:uid" content="' . $this->uuid . '"/>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<head>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<meta name="dtb:depth" content="1"/>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<meta name="dtb:totalPageCount" content="0"/>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<meta name="dtb:maxPageNumber" content="0"/>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '</head>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<docTitle><text>' . $this->title . '</text></docTitle>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '<navMap>' . "\r\n"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Close NCX | ||||||
|  |      * | ||||||
|  |      * Closes the toc.ncx file content | ||||||
|  |      */     | ||||||
|  |     private function CloseNCX() { | ||||||
|  |         $this->ncx[] = '</navMap>' . "\r\n"; | ||||||
|  |         $this->ncx[] = '</ncx>' . "\r\n"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create NCX | ||||||
|  |      * | ||||||
|  |      * Creates toc.ncx file | ||||||
|  |      */     | ||||||
|  |     private function CreateNCX() { | ||||||
|  |         $ncx = null; | ||||||
|  |          | ||||||
|  |         foreach( $this->ncx as $lines ) {  | ||||||
|  |             $ncx .= "$lines\r\n"; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $this->CreateFile( $this->temp_folder . '/OEBPS/toc.ncx', $ncx ); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create folders | ||||||
|  |      * | ||||||
|  |      * Create all the temp folders needed | ||||||
|  |      */     | ||||||
|  |     private function CreateFolders() { | ||||||
|  |          | ||||||
|  |         // If the user do not specify a temp folder, we'll assume it.
 | ||||||
|  |         if ( ! $this->temp_folder ) { | ||||||
|  |             $this->temp_folder = preg_replace( '/[^A-Za-z0-9]/is', '', $this->title ); | ||||||
|  |             $this->temp_folder = strtolower( $this->temp_folder ); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Temp folder is the book's uuid
 | ||||||
|  |         $this->temp_folder .= $this->uuid . '/'; | ||||||
|  |          | ||||||
|  |         // Check to see if there's no folder with the same name
 | ||||||
|  |         if( is_dir( $this->temp_folder ) ) { | ||||||
|  |             $this->error = 'Folder already exists.'; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Creates the main temp folder
 | ||||||
|  |         mkdir( $this->temp_folder, 0777 ); | ||||||
|  |          | ||||||
|  |         // Check the folder
 | ||||||
|  |         if ( ! is_dir( $this->temp_folder ) ) { | ||||||
|  |             $this->error = "Cannot create EPUB folder \"{$this->temp_folder}\"."; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Creates the other needed folders
 | ||||||
|  |         mkdir( $this->temp_folder . '/META-INF', 0777 ); | ||||||
|  |         mkdir( $this->temp_folder . '/OEBPS', 0777 ); | ||||||
|  |         mkdir( $this->temp_folder . '/OEBPS/images', 0777 ); | ||||||
|  |          | ||||||
|  |         // Open the CSS
 | ||||||
|  |         $this->OpenCSS(); | ||||||
|  |          | ||||||
|  |         // Creates the container.xml
 | ||||||
|  |         $this->CreateContainer(); | ||||||
|  |          | ||||||
|  |         // Creates the needed epub files
 | ||||||
|  |         $this->CreateFile( $this->temp_folder . '/mimetype', 'application/epub+zip'); | ||||||
|  |         $this->CreateFile( $this->temp_folder . '/OEBPS/css.css', $this->css); | ||||||
|  |         $this->CreateFile( $this->temp_folder . '/META-INF/container.xml', $this->container); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create container | ||||||
|  |      * | ||||||
|  |      * Creates the container.xml file | ||||||
|  |      */     | ||||||
|  |     private function CreateContainer() { | ||||||
|  |         $this->container  = '<?xml version="1.0" encoding="UTF-8" ?>'; | ||||||
|  |         $this->container .= '<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">'; | ||||||
|  |         $this->container .= '<rootfiles>'; | ||||||
|  |         $this->container .= '<rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>'; | ||||||
|  |         $this->container .= '</rootfiles>'; | ||||||
|  |         $this->container .= '</container>'; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create Files | ||||||
|  |      */     | ||||||
|  |     private function CreateFile( $file, $content = null ) { | ||||||
|  |         $handle = fopen( $file, 'w+' ); | ||||||
|  |         $ler = fwrite( $handle, $content ); | ||||||
|  |         fclose($handle); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /** | ||||||
|  |      * Create Zip | ||||||
|  |      * | ||||||
|  |      * This creates the zip file as epub. | ||||||
|  |      * | ||||||
|  |      * @since 1.0.0 | ||||||
|  |      * @access private | ||||||
|  |      */         | ||||||
|  |     private function CreateZip () { | ||||||
|  |         // Checks the zip extension
 | ||||||
|  |         if ( ! extension_loaded('zip') ) { | ||||||
|  |             $this->error('zip extension is not loaded'); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // If the user do not specify the epub file, we'll assume it.
 | ||||||
|  |         if ( ! $this->epub_file ) { | ||||||
|  |             $this->epub_file  = preg_replace( '/[^A-Za-z0-9]/is', '', $this->title ); | ||||||
|  |             $this->epub_file .= '.epub'; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $zip = new ZipArchive(); | ||||||
|  |          | ||||||
|  |         if ( ! $zip->open( $this->epub_file, ZIPARCHIVE::CREATE ) ) { | ||||||
|  |             $this->error('Failed to create zip file.'); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Folders array
 | ||||||
|  |         $folders = array( | ||||||
|  |             $this->temp_folder . '/META-INF',  | ||||||
|  |             $this->temp_folder . '/OEBPS', | ||||||
|  |             $this->temp_folder . '/OEBPS/images', | ||||||
|  |             $this->temp_folder,  | ||||||
|  |         ); | ||||||
|  |          | ||||||
|  |         // Files we'll delete later
 | ||||||
|  |         $files_to_delete = array(); | ||||||
|  |          | ||||||
|  |         // Loop the folders
 | ||||||
|  |         foreach ( $folders as $folder ) { | ||||||
|  |             // The files inside the folders
 | ||||||
|  |             $scan = scandir( $folder ); | ||||||
|  |              | ||||||
|  |             // Loop the files
 | ||||||
|  |             foreach ( $scan as $subfolder ) { | ||||||
|  |                 // Prevent . and .. paths
 | ||||||
|  |                 if ( '.' === $subfolder || '..' === $subfolder ) continue; | ||||||
|  |                  | ||||||
|  |                 $full_path = $folder . '/' . $subfolder; | ||||||
|  |                  | ||||||
|  |                 // We just want files, not directories
 | ||||||
|  |                 if ( is_dir( $full_path ) ) continue; | ||||||
|  |                  | ||||||
|  |                 // Add the file
 | ||||||
|  |                 $zip->addFile( $full_path, str_replace( $this->temp_folder . '/', '', $full_path )  ); | ||||||
|  |                  | ||||||
|  |                 // Fill the array, so we'll know what to delete later
 | ||||||
|  |                 $files_to_delete[] = $full_path; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         $zip->close(); | ||||||
|  |          | ||||||
|  |         // Delete the files
 | ||||||
|  |         foreach ( $files_to_delete as $delete ) unlink( $delete ); | ||||||
|  |          | ||||||
|  |         // Delete folders
 | ||||||
|  |         rmdir( $this->temp_folder . '/META-INF' ); | ||||||
|  |         rmdir( $this->temp_folder . '/OEBPS/images' ); | ||||||
|  |         rmdir( $this->temp_folder . '/OEBPS' ); | ||||||
|  |         rmdir( $this->temp_folder ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -25,6 +25,7 @@ | ||||||
| 		<a href="https://www.lemonde.fr/">Le Monde</a> | 		<a href="https://www.lemonde.fr/">Le Monde</a> | ||||||
| 		- <a href="https://journal.lemonde.fr/">Journal</a> | 		- <a href="https://journal.lemonde.fr/">Journal</a> | ||||||
| 		- <a href="https://nouveau.europresse.com/Pdf/Edition?sourceCode=LM_P">Europress</a> | 		- <a href="https://nouveau.europresse.com/Pdf/Edition?sourceCode=LM_P">Europress</a> | ||||||
|  | 		- <a href="./lemonde.php">Epub</a> | ||||||
| 	</p> | 	</p> | ||||||
| 	<h2>Investigation</h2> | 	<h2>Investigation</h2> | ||||||
| 	<p> | 	<p> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,84 @@ | ||||||
|  | <html> | ||||||
|  | <body> | ||||||
|  | 
 | ||||||
|  | <?php | ||||||
|  | 	 | ||||||
|  | 	$url = ''; | ||||||
|  | 	$coverurl = ''; | ||||||
|  | 	if (isset($_POST['url'])) | ||||||
|  | 	{ | ||||||
|  | 		require('TPEpubCreator.php'); | ||||||
|  | 		 | ||||||
|  | 		$url = $_POST['url']; | ||||||
|  | 	 | ||||||
|  | 		$epub = new TPEpubCreator(); | ||||||
|  | 		$epub->temp_folder = 'temp/'; | ||||||
|  | 		$epub->epub_file = $_POST['epub']; | ||||||
|  | 		$epub->title = $_POST['title']; | ||||||
|  | 		 | ||||||
|  | 		if ($_POST['cover']) | ||||||
|  | 		{ | ||||||
|  | 			$coverurl = $_POST['cover']; | ||||||
|  | 			$coverdata = file_get_contents($coverurl); | ||||||
|  | 			file_put_contents('temp/cover.jpg', $coverdata); | ||||||
|  | 			$epub->AddImage( 'temp/cover.jpg', 'image/jpeg', true ); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		// cache json in case url expires
 | ||||||
|  | 		$tempjsonpath = 'temp/' . hash('md5', $url) . '.json'; | ||||||
|  | 		$json = ''; | ||||||
|  | 		if (file_exists($tempjsonpath)) | ||||||
|  | 		{ | ||||||
|  | 			$json = file_get_contents($tempjsonpath); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			$json = file_get_contents($url); | ||||||
|  | 			file_put_contents($tempjsonpath, $json); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$publication = json_decode($json); | ||||||
|  | 		$content = array_filter($publication->Content, function($item) { return $item->Category == 'Le Monde'; }); | ||||||
|  | 		usort($content, function ($a, $b) { return $a->PageNumber - $b->PageNumber; }); | ||||||
|  | 		 | ||||||
|  | 		foreach ($content as $article) | ||||||
|  | 		{ | ||||||
|  | 			$articlebody = array_filter($article->ContentItem, function($item) { return $item->ContentType == 'text/xml'; })[0]; | ||||||
|  | 			if ($articlebody->Title && $articlebody->HtmlText) | ||||||
|  | 			{ | ||||||
|  | 				$pagecontent = '<h1>'. strip_tags($articlebody->Title) . '</h1>'; | ||||||
|  | 				if ($articlebody->Introduction) | ||||||
|  | 				{ | ||||||
|  | 					$pagecontent .= '<b>' . $articlebody->Introduction . '</b>'; | ||||||
|  | 				} | ||||||
|  | 				$pagecontent .= $articlebody->HtmlText; | ||||||
|  | 				$epub->AddPage($pagecontent, false, strip_tags($articlebody->Title)); | ||||||
|  | 				// echo('<h1>'. strip_tags($articlebody->Title) . '</h1>');
 | ||||||
|  | 				// echo($articlebody->HtmlText);
 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		if ( ! $epub->error ) { | ||||||
|  | 			$epub->CreateEPUB(); | ||||||
|  | 			 | ||||||
|  | 			if ( ! $epub->error ) { | ||||||
|  | 				echo 'Success: Download your book <a href="' . $epub->epub_file . '">here</a>.'; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 		} else { | ||||||
|  | 			echo $epub->error; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | ?>
 | ||||||
|  | 
 | ||||||
|  | <form method="post"> | ||||||
|  | 	<p>Go to <a href="https://journal.lemonde.fr" target="_blank">https://journal.lemonde.fr</a> and hit f12 to get GetPublicationContentItems json and cover jpg urls.</p> | ||||||
|  | 	Json url: <input name="url" value="<?php echo $url; ?>"><br> | ||||||
|  | 	Cover url: <input name="cover" value="<?php echo $coverurl; ?>"><br> | ||||||
|  | 	Title: <input name="title" value="Le Monde"><br> | ||||||
|  | 	Epub file name: <input name="epub" value="lemonde.epub"><br> | ||||||
|  | 	<input type="submit"> | ||||||
|  | </form> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
		Loading…
	
		Reference in New Issue
	
	 quenousimporte
						quenousimporte