]> BookStack Code Mirror - bookstack/commitdiff
Started page transclusion system
authorDan Brown <redacted>
Mon, 16 Jan 2017 21:24:48 +0000 (21:24 +0000)
committerDan Brown <redacted>
Mon, 16 Jan 2017 21:24:48 +0000 (21:24 +0000)
app/Http/Controllers/PageController.php
app/Repos/EntityRepo.php
resources/views/pages/page-display.blade.php

index 6ed9fc30c79c8e6d037d06c1ca727448152ff0b9..276665e52c403a3197719dde6c11e1469f596bcd 100644 (file)
@@ -156,15 +156,19 @@ class PageController extends Controller
             return redirect($page->getUrl());
         }
 
+
         $this->checkOwnablePermission('page-view', $page);
 
+        $pageContent = $this->entityRepo->renderPage($page);
         $sidebarTree = $this->entityRepo->getBookChildren($page->book);
         $pageNav = $this->entityRepo->getPageNav($page);
         
         Views::add($page);
         $this->setPageTitle($page->getShortName());
-        return view('pages/show', ['page' => $page, 'book' => $page->book,
-                                   'current' => $page, 'sidebarTree' => $sidebarTree, 'pageNav' => $pageNav]);
+        return view('pages/show', [
+            'page' => $page,'book' => $page->book,
+            'current' => $page, 'sidebarTree' => $sidebarTree,
+            'pageNav' => $pageNav, 'pageContent' => $pageContent]);
     }
 
     /**
index 6eaf0169ab8ed3c8bd3d3588b44b015644746399..312e3536ecad99338165bd4e322eb4255d6d3e44 100644 (file)
@@ -13,6 +13,7 @@ use Carbon\Carbon;
 use DOMDocument;
 use DOMXPath;
 use Illuminate\Support\Collection;
+use Symfony\Component\DomCrawler\Crawler;
 
 class EntityRepo
 {
@@ -796,6 +797,44 @@ class EntityRepo
         return $html;
     }
 
+
+    /**
+     * Render the page for viewing, Parsing and performing features such as page transclusion.
+     * @param Page $page
+     * @return mixed|string
+     */
+    public function renderPage(Page $page)
+    {
+        libxml_use_internal_errors(true);
+        $doc = new DOMDocument();
+        $doc->loadHTML(mb_convert_encoding('<body>'.$page->html.'</body>', 'HTML-ENTITIES', 'UTF-8'));
+        $xpath = new DOMXpath($doc);
+
+        $bsElems = $xpath->query('body/div[@bs-embed-page]');
+        if (is_null($bsElems)) return $page->html;
+        foreach ($bsElems as $bsElem) {
+            $pageId = intval($bsElem->getAttribute('bs-embed-page'));
+            $embeddedPage = $this->getById('page', $pageId);
+            if ($embeddedPage !== null) {
+                $innerPage = $doc->createDocumentFragment();
+                $innerPage->appendXML($embeddedPage->html);
+                // Empty div then append in child content
+                foreach ($bsElem->childNodes as $child) {
+                    $bsElem->removeChild($child);
+                }
+                $bsElem->appendChild($innerPage);
+            }
+        }
+
+        $body = $doc->getElementsByTagName('body')->item(0);
+        $html = '';
+        foreach ($body->childNodes as $node) {
+            $html .= $doc->saveHTML($node);
+        }
+
+        return $html;
+    }
+
     /**
      * Get a new draft page instance.
      * @param Book $book
index fb6ca30451e35df171ac5b843612d1d347a5b102..6eb927687cc765df7976746f502be7bb1b1f4b67 100644 (file)
@@ -7,6 +7,6 @@
     @if (isset($diff) && $diff)
         {!! $diff !!}
     @else
-        {!! $page->html !!}
+        {!! isset($pageContent) ? $pageContent : $page->html !!}
     @endif
 </div>
\ No newline at end of file