]> BookStack Code Mirror - bookstack/blob - app/Services/ExportService.php
replace GPL diff lib with MIT lib
[bookstack] / app / Services / ExportService.php
1 <?php namespace BookStack\Services;
2
3
4 use BookStack\Page;
5
6 class ExportService
7 {
8
9     /**
10      * Convert a page to a self-contained HTML file.
11      * Includes required CSS & image content. Images are base64 encoded into the HTML.
12      * @param Page $page
13      * @return mixed|string
14      */
15     public function pageToContainedHtml(Page $page)
16     {
17         $cssContent = file_get_contents(public_path('/css/export-styles.css'));
18         $pageHtml = view('pages/export', ['page' => $page, 'css' => $cssContent])->render();
19         return $this->containHtml($pageHtml);
20     }
21
22     /**
23      * Convert a page to a pdf file.
24      * @param Page $page
25      * @return mixed|string
26      */
27     public function pageToPdf(Page $page)
28     {
29         $cssContent = file_get_contents(public_path('/css/export-styles.css'));
30         $pageHtml = view('pages/pdf', ['page' => $page, 'css' => $cssContent])->render();
31         $containedHtml = $this->containHtml($pageHtml);
32         $pdf = \PDF::loadHTML($containedHtml);
33         return $pdf->output();
34     }
35
36     /**
37      * Bundle of the contents of a html file to be self-contained.
38      * @param $htmlContent
39      * @return mixed|string
40      */
41     protected function containHtml($htmlContent)
42     {
43         $imageTagsOutput = [];
44         preg_match_all("/\<img.*src\=(\'|\")(.*?)(\'|\").*?\>/i", $htmlContent, $imageTagsOutput);
45
46         // Replace image src with base64 encoded image strings
47         if (isset($imageTagsOutput[0]) && count($imageTagsOutput[0]) > 0) {
48             foreach ($imageTagsOutput[0] as $index => $imgMatch) {
49                 $oldImgString = $imgMatch;
50                 $srcString = $imageTagsOutput[2][$index];
51                 if (strpos(trim($srcString), 'http') !== 0) {
52                     $pathString = public_path($srcString);
53                 } else {
54                     $pathString = $srcString;
55                 }
56                 $imageContent = file_get_contents($pathString);
57                 $imageEncoded = 'data:image/' . pathinfo($pathString, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageContent);
58                 $newImageString = str_replace($srcString, $imageEncoded, $oldImgString);
59                 $htmlContent = str_replace($oldImgString, $newImageString, $htmlContent);
60             }
61         }
62
63         $linksOutput = [];
64         preg_match_all("/\<a.*href\=(\'|\")(.*?)(\'|\").*?\>/i", $htmlContent, $linksOutput);
65
66         // Replace image src with base64 encoded image strings
67         if (isset($linksOutput[0]) && count($linksOutput[0]) > 0) {
68             foreach ($linksOutput[0] as $index => $linkMatch) {
69                 $oldLinkString = $linkMatch;
70                 $srcString = $linksOutput[2][$index];
71                 if (strpos(trim($srcString), 'http') !== 0) {
72                     $newSrcString = url($srcString);
73                     $newLinkString = str_replace($srcString, $newSrcString, $oldLinkString);
74                     $htmlContent = str_replace($oldLinkString, $newLinkString, $htmlContent);
75                 }
76             }
77         }
78
79         // Replace any relative links with system domain
80         return $htmlContent;
81     }
82
83     /**
84      * Converts the page contents into simple plain text.
85      * This method filters any bad looking content to
86      * provide a nice final output.
87      * @param Page $page
88      * @return mixed
89      */
90     public function pageToPlainText(Page $page)
91     {
92         $text = $page->text;
93         // Replace multiple spaces with single spaces
94         $text = preg_replace('/\ {2,}/', ' ', $text);
95         // Reduce multiple horrid whitespace characters.
96         $text = preg_replace('/(\x0A|\xA0|\x0A|\r|\n){2,}/su', "\n\n", $text);
97         $text = html_entity_decode($text);
98         // Add title
99         $text = $page->name . "\n\n" . $text;
100         return $text;
101     }
102
103 }
104
105
106
107
108
109
110
111
112
113
114
115