Completed
Pull Request — master (#41)
by Vladimir
02:38
created

ContentItem::createJail()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 6
ccs 3
cts 3
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace allejo\stakx\Object;
4
5
use allejo\stakx\Engines\Markdown\MarkdownEngine;
6
use allejo\stakx\Engines\PlainTextEngine;
7
use allejo\stakx\Engines\RST\RstEngine;
8
use allejo\stakx\Manager\TwigManager;
9
10
class ContentItem extends FrontMatterObject implements \JsonSerializable
11
{
12
    /**
13
     * The collection this Content Item belongs to
14
     *
15
     * @var string
16
     */
17
    private $parentCollection;
18
19
    /**
20
     * The Page View that will be used to render this Content Item
21
     *
22
     * @var PageView
23
     */
24
    private $parentPageView;
25
26
    /**
27
     * {@inheritdoc}
28
     */
29 32
    public function createJail ()
30
    {
31 32
        return (new JailObject($this, array_merge(self::$whiteListFunctions, array(
32
            'getCollection'
33 32
        )), array('getPageView' => 'getJailedPageView')));
34
    }
35
36 2
    public function getCollection ()
37
    {
38 2
        return $this->parentCollection;
39
    }
40
41 34
    public function setCollection ($collection)
42
    {
43 34
        $this->parentCollection = $collection;
44 34
    }
45
46
    /**
47
     * Return the body of the Content Item parsed as markdown
48
     *
49
     * @return string
50
     */
51 7
    public function getContent ()
52
    {
53 7
        if (!$this->bodyContentEvaluated)
54 7
        {
55 7
            $this->parseTwig();
56
            $this->parseEngines();
57
58
            $this->bodyContentEvaluated = true;
59
        }
60
61
        return (string)$this->bodyContent;
62
    }
63
64
    /**
65
     * Parse the Twig that is embedded inside a ContentItem's body
66
     */
67 7
    private function parseTwig ()
68
    {
69 7
        $twig = TwigManager::getInstance();
70
71 7
        if ($twig instanceof \Twig_Environment)
72 7
        {
73 7
            $template = $twig->createTemplate($this->bodyContent);
74
            $this->bodyContent = $template->render(array());
75
        }
76
    }
77
78
    /**
79
     * Parse the ContentItem's body based on the extension of the file
80
     */
81
    private function parseEngines ()
82
    {
83
        switch ($this->getExtension())
84
        {
85
            case "md":
86
            case "markdown":
87
                $pd = new MarkdownEngine();
88
                break;
89
90
            case "rst":
91
                $pd = new RstEngine();
92
                $pd->setIncludePolicy(true, getcwd());
93
                break;
94
95
            default:
96
                $pd = new PlainTextEngine();
97
                break;
98
        }
99
100
        $this->bodyContent = $pd->parse($this->bodyContent);
101
    }
102
103
    /**
104
     * @return PageView
105
     */
106
    public function &getPageView ()
107
    {
108
        return $this->parentPageView;
109
    }
110
111
    public function getJailedPageView ()
112
    {
113
        return $this->parentPageView->createJail();
114
    }
115
116
    /**
117
     * Set the parent Page View that this Content Item will have be assigned to
118
     *
119
     * @param PageView $pageView
120
     */
121 3
    public function setPageView (&$pageView)
122
    {
123 3
        $this->parentPageView = &$pageView;
124 3
    }
125
126
    /**
127
     * {@inheritdoc}
128
     */
129
    public function jsonSerialize()
130
    {
131
        return array_merge($this->getFrontMatter(), array(
132
            'content' => $this->getContent(),
133
            'permalink' => $this->getPermalink(),
134
            'redirects' => $this->getRedirects()
135
        ));
136
    }
137
}