Dan Brown

Started page transclusion system

...@@ -156,15 +156,19 @@ class PageController extends Controller ...@@ -156,15 +156,19 @@ class PageController extends Controller
156 return redirect($page->getUrl()); 156 return redirect($page->getUrl());
157 } 157 }
158 158
159 +
159 $this->checkOwnablePermission('page-view', $page); 160 $this->checkOwnablePermission('page-view', $page);
160 161
162 + $pageContent = $this->entityRepo->renderPage($page);
161 $sidebarTree = $this->entityRepo->getBookChildren($page->book); 163 $sidebarTree = $this->entityRepo->getBookChildren($page->book);
162 $pageNav = $this->entityRepo->getPageNav($page); 164 $pageNav = $this->entityRepo->getPageNav($page);
163 165
164 Views::add($page); 166 Views::add($page);
165 $this->setPageTitle($page->getShortName()); 167 $this->setPageTitle($page->getShortName());
166 - return view('pages/show', ['page' => $page, 'book' => $page->book, 168 + return view('pages/show', [
167 - 'current' => $page, 'sidebarTree' => $sidebarTree, 'pageNav' => $pageNav]); 169 + 'page' => $page,'book' => $page->book,
170 + 'current' => $page, 'sidebarTree' => $sidebarTree,
171 + 'pageNav' => $pageNav, 'pageContent' => $pageContent]);
168 } 172 }
169 173
170 /** 174 /**
......
...@@ -13,6 +13,7 @@ use Carbon\Carbon; ...@@ -13,6 +13,7 @@ use Carbon\Carbon;
13 use DOMDocument; 13 use DOMDocument;
14 use DOMXPath; 14 use DOMXPath;
15 use Illuminate\Support\Collection; 15 use Illuminate\Support\Collection;
16 +use Symfony\Component\DomCrawler\Crawler;
16 17
17 class EntityRepo 18 class EntityRepo
18 { 19 {
...@@ -796,6 +797,44 @@ class EntityRepo ...@@ -796,6 +797,44 @@ class EntityRepo
796 return $html; 797 return $html;
797 } 798 }
798 799
800 +
801 + /**
802 + * Render the page for viewing, Parsing and performing features such as page transclusion.
803 + * @param Page $page
804 + * @return mixed|string
805 + */
806 + public function renderPage(Page $page)
807 + {
808 + libxml_use_internal_errors(true);
809 + $doc = new DOMDocument();
810 + $doc->loadHTML(mb_convert_encoding('<body>'.$page->html.'</body>', 'HTML-ENTITIES', 'UTF-8'));
811 + $xpath = new DOMXpath($doc);
812 +
813 + $bsElems = $xpath->query('body/div[@bs-embed-page]');
814 + if (is_null($bsElems)) return $page->html;
815 + foreach ($bsElems as $bsElem) {
816 + $pageId = intval($bsElem->getAttribute('bs-embed-page'));
817 + $embeddedPage = $this->getById('page', $pageId);
818 + if ($embeddedPage !== null) {
819 + $innerPage = $doc->createDocumentFragment();
820 + $innerPage->appendXML($embeddedPage->html);
821 + // Empty div then append in child content
822 + foreach ($bsElem->childNodes as $child) {
823 + $bsElem->removeChild($child);
824 + }
825 + $bsElem->appendChild($innerPage);
826 + }
827 + }
828 +
829 + $body = $doc->getElementsByTagName('body')->item(0);
830 + $html = '';
831 + foreach ($body->childNodes as $node) {
832 + $html .= $doc->saveHTML($node);
833 + }
834 +
835 + return $html;
836 + }
837 +
799 /** 838 /**
800 * Get a new draft page instance. 839 * Get a new draft page instance.
801 * @param Book $book 840 * @param Book $book
......
...@@ -7,6 +7,6 @@ ...@@ -7,6 +7,6 @@
7 @if (isset($diff) && $diff) 7 @if (isset($diff) && $diff)
8 {!! $diff !!} 8 {!! $diff !!}
9 @else 9 @else
10 - {!! $page->html !!} 10 + {!! isset($pageContent) ? $pageContent : $page->html !!}
11 @endif 11 @endif
12 </div> 12 </div>
...\ No newline at end of file ...\ No newline at end of file
......