예제 #1
0
 /**
  * Inline the CSS before an email is sent.
  *
  * @param \Swift_Events_SendEvent $evt
  */
 public function beforeSendPerformed(\Swift_Events_SendEvent $evt)
 {
     $message = $evt->getMessage();
     if ($message->getContentType() === 'text/html' || $message->getContentType() === 'multipart/alternative' && $message->getBody()) {
         $this->inliner->setHtml($message->getBody());
         $message->setBody($this->inliner->emogrify());
     }
     foreach ($message->getChildren() as $part) {
         if (strpos($part->getContentType(), 'text/html') === 0) {
             $this->inliner->setHtml($part->getBody());
             $message->setBody($this->inliner->emogrify());
         }
     }
 }
예제 #2
0
 private function getContents($pdf_file)
 {
     $this->locked = true;
     // echo $file;
     $info = new Pdf($pdf_file);
     $pdf = new Base($pdf_file, array('singlePage' => true, 'noFrames' => false));
     $pages = $info->getPages();
     // print_r($pages);
     // print_r($pages);
     $random_dir = uniqid();
     $outputDir = Config::get('pdftohtml.output', dirname(__FILE__) . '/../output/' . $random_dir);
     if (!file_exists($outputDir)) {
         mkdir($outputDir, 0777, true);
     }
     $pdf->setOutputDirectory($outputDir);
     $pdf->generate();
     $fileinfo = pathinfo($pdf_file);
     $base_path = $pdf->outputDir . '/' . $fileinfo['filename'];
     $contents = array();
     for ($i = 1; $i <= $pages; $i++) {
         $content = file_get_contents($base_path . '-' . $i . '.html');
         if ($this->inlineCss()) {
             // $content = str_replace(array('<!--','-->'),'',$content);
             $parser = new Emogrifier($content);
             // print_r($parser);
             $content = $parser->emogrify();
         }
         file_put_contents($base_path . '-' . $i . '.html', $content);
         $contents[$i] = file_get_contents($base_path . '-' . $i . '.html');
     }
     $this->contents = $contents;
     $this->goToPage(1);
 }
예제 #3
0
 /**
  * @test
  */
 public function emogrifierNotMapsCssToHtmlIfFeatureIsNotEnabled()
 {
     $css = 'img {float: right;}';
     $this->subject->setHtml($this->html5DocumentType . '<html><body><img></body></html>');
     $this->subject->setCss($css);
     $html = $this->subject->emogrify();
     self::assertNotContains('<img align="right', $html);
 }
예제 #4
0
 /**
  * @test
  * @param string $attribute the class attribute value
  * @dataProvider cssClassesWithWhitespaceDataProvider
  */
 public function emogrifierMapsClassWithWiteSpaceInAttribute($attribute)
 {
     $css = '.test {color: red;}';
     $this->subject->setHtml($this->html5DocumentType . '<html><body><div class="' . $attribute . '"></div></body></html>');
     $this->subject->setCss($css);
     $html = $this->subject->emogrify();
     self::assertContains('style="color: red;"', $html);
 }
예제 #5
0
 /**
  * @test
  */
 public function emptyMediaQueriesAreRemoved()
 {
     $emptyQuery = '@media all and (max-width: 500px) { }';
     $this->subject->setCss($emptyQuery);
     $this->subject->setHtml($this->html5DocumentType . '<html><body><p></p></body></html>');
     $result = $this->subject->emogrify();
     self::assertNotContains($emptyQuery, $result);
 }
예제 #6
0
 /**
  * @test
  * @param string $body          The HTML
  * @param string $css           The complete CSS
  * @param string $tagName       The name of the tag that should be modified
  * @param string $attributes    The attributes that are expected on the element
  *
  * @dataProvider cssToHtmlMappingDataProvider
  */
 public function emogrifierMapsCssToHtml($body, $css, $tagName, $attributes)
 {
     $this->subject->setHtml($this->html5DocumentType . '<html><body>' . $body . '</body></html>');
     $this->subject->setCss($css);
     $this->subject->enableCssToHtmlMapping();
     $html = $this->subject->emogrify();
     self::assertContains('<' . $tagName . ' ' . $attributes, $html);
 }
예제 #7
0
 /**
  * @test
  */
 public function emogrifierAddsCopyOfCssStylesAsStyleNode()
 {
     $this->subject->appendStylesToHead();
     $this->subject->setCss('p { color: blue; }');
     $this->subject->setHtml($this->html5DocumentType . '<html><body><style type="text/css">p { padding: 10px; }</style><p></p></body></html>');
     $result = $this->subject->emogrify();
     self::assertContains('p { color: blue; }', $result);
     self::assertContains('p { padding: 10px; }', $result);
 }
예제 #8
0
 /**
  * @test
  * @param string $dataUriMediaType
  * @dataProvider dataUriMediaTypeDataProvider
  */
 public function dataUrisAreConserved($dataUriMediaType)
 {
     $html = $this->html5DocumentType . '<html></html>';
     $this->subject->setHtml($html);
     $styleRule = 'background-image: url(data:image/png' . $dataUriMediaType . ',iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAABUk' . 'lEQVQ4y81UsY6CQBCdWXBjYWFMjEgAE0piY8c38B9+iX+ksaHCgs5YWEhIrJCQYGJBomiC7lzhVcfqEa+5KXfey3s783bRdd00TR' . 'VFAQAAICJEhN/q8Xjoug7D4RA+qsFgwDjn9QYiTiaT+Xx+OByOx+NqtapjWq0WjEajekPTtCAIiIiIyrKMoqiOMQxDlVqyLMt1XQ' . 'A4nU6z2Wy9XkthEnK/3zdN8znC/X7v+36WZfJ7120vFos4joUQRHS5XDabzXK5bGrbtu1er/dtTFU1TWu3202VHceZTqe3242Itt' . 'ut53nj8bip8m6345wLIQCgKIowDIuikAoz6Wm3233mjHPe6XRe5UROJqImIWPwh/pvZMbYM2GKorx5oUw6m+v1miTJ+XzO8/x+v7' . '+UtizrM8+GYahVVSFik9/jxy6rqlJN02SM1cmI+GbbQghd178AAO2FXws6LwMAAAAASUVORK5CYII=);';
     $this->subject->setCss('html {' . $styleRule . '}');
     $result = $this->subject->emogrify();
     self::assertContains('<html style="' . $styleRule . '">', $result);
 }
예제 #9
0
 /**
  * @test
  */
 public function ignoresWhitespaceAfterImportant()
 {
     $css = 'p { margin: 1px !important' . self::LF . ' ;}';
     $html = $this->html5DocumentType . self::LF . '<html><head</head><body><p style="margin: 2px; ">some content</p></body></html>';
     $expected = '<p style="margin: 1px !important;">';
     $this->subject->setHtml($html);
     $this->subject->setCss($css);
     self::assertContains($expected, $this->subject->emogrify());
 }
예제 #10
0
 /**
  * @test
  */
 public function emogrifyMergesCssWithMixedUnits()
 {
     $css = 'p { margin: 1px; padding-bottom:0;}';
     $html = $this->html5DocumentType . self::LF . '<html><head><style>#topWrap p {margin:0;padding-bottom: 1px;}</style></head>' . '<body><div id="topWrap"><p style="text-align: center;">some content</p></div></body></html>';
     $expected = '<p style="text-align: center; margin: 0; padding-bottom: 1px;">';
     $this->subject->setHtml($html);
     $this->subject->setCss($css);
     $this->assertContains($expected, $this->subject->emogrify());
 }
 /**
  * Replaces the default mail handling with a check for inline styles. If found
  * we run the email through emogrifier to inline the styles.
  * @param bool $isPlain
  * @return $this
  */
 protected function parseVariables($isPlain = false)
 {
     parent::parseVariables($isPlain);
     // if it's an html email, filter it through emogrifier
     if (!$isPlain && preg_match('/<style[^>]*>(?:<\\!--)?(.*)(?:-->)?<\\/style>/ims', $this->body, $match)) {
         $css = $match[1];
         $html = str_replace(array("<p>\n<table>", "</table>\n</p>", '&copy ', $match[0]), array("<table>", "</table>", '', ''), $this->body);
         $emog = new Emogrifier($html, $css);
         $this->body = $emog->emogrify();
     }
     return $this;
 }
 /**
  * Inline both the embedded css, and css from an external file, into html
  *
  * @param  HTML $htmlContent
  * @param string $cssFile path and filename
  * @return HTML with inlined CSS
  */
 public static function convert($htmlContent, $cssfile)
 {
     $emog = new Emogrifier($htmlContent);
     // Apply the css file to Emogrifier
     if ($cssfile) {
         $cssFileLocation = join(DIRECTORY_SEPARATOR, array(Director::baseFolder(), $cssfile));
         $cssFileHandler = fopen($cssFileLocation, 'r');
         $css = fread($cssFileHandler, filesize($cssFileLocation));
         fclose($cssFileHandler);
         $emog->setCss($css);
     }
     return $emog->emogrify();
 }
예제 #13
0
 /**
  * @param string $html
  * @param string $css
  * @param bool $keepHiddenNodes
  * @param bool $disableBackupCssNode
  * @param bool $disableInlineStyleAttributes
  * @param bool $appendStylesToHead
  * @return string
  */
 public function process($html, $css, $keepHiddenNodes = true, $disableBackupCssNode = false, $disableInlineStyleAttributes = false, $appendStylesToHead = false)
 {
     $inliner = new Emogrifier($html, $css);
     if ($keepHiddenNodes) {
         $inliner->disableInvisibleNodeRemoval();
     }
     if ($disableBackupCssNode) {
         $inliner->disableBackupCssNode();
     }
     if ($disableInlineStyleAttributes) {
         $inliner->disableInlineStyleAttributesParsing();
     }
     if ($appendStylesToHead) {
         $inliner->appendStylesToHead();
     }
     return $inliner->emogrify();
 }
예제 #14
0
 /**
  * @param array $data
  *
  * @throws \TijsVerkoyen\CssToInlineStyles\Exception
  */
 protected function setHtml(array $data)
 {
     $html = view('emails.' . $this->template, ['user' => $this->user, 'data' => $data])->render();
     $css = file_get_contents(asset('assets/css/bootstrap.css'));
     libxml_use_internal_errors(true);
     $emogrifier = new Emogrifier();
     $emogrifier->setHtml($html);
     $emogrifier->setCss($css);
     $this->html = $emogrifier->emogrify();
 }
예제 #15
0
 /**
  * The method replaces css class to inline css rules.
  * @param $content
  * @return string
  */
 private function setInlineCss($content)
 {
     $content = str_replace(['<!--', '-->'], '', $content);
     $parser = new Emogrifier($content);
     return $parser->emogrify();
 }