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

ContentItem   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 9

Test Coverage

Coverage 69.57%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 128
ccs 32
cts 46
cp 0.6957
rs 10
c 1
b 0
f 0
wmc 15
lcom 3
cbo 9

10 Methods

Rating   Name   Duplication   Size   Complexity  
A createJail() 0 6 1
A getCollection() 0 4 1
A setCollection() 0 4 1
A getPageView() 0 4 1
A getJailedPageView() 0 4 1
A getContent() 0 12 2
A parseTwig() 0 10 2
A parseEngines() 0 21 4
A setPageView() 0 4 1
A jsonSerialize() 0 8 1
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 1
    public function getCollection ()
37
    {
38 1
        return $this->parentCollection;
39
    }
40
41 30
    public function setCollection ($collection)
42
    {
43 30
        $this->parentCollection = $collection;
44 30
    }
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
        {
55 7
            $this->parseTwig();
56 7
            $this->parseEngines();
57
58 7
            $this->bodyContentEvaluated = true;
59
        }
60
61 7
        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
        {
73
            $template = $twig->createTemplate($this->bodyContent);
74
            $this->bodyContent = $template->render(array());
75
        }
76 7
    }
77
78
    /**
79
     * Parse the ContentItem's body based on the extension of the file
80
     */
81 7
    private function parseEngines ()
82
    {
83 7
        switch ($this->getExtension())
84
        {
85 7
            case "md":
86 5
            case "markdown":
87 2
                $pd = new MarkdownEngine();
88 2
                break;
89
90 5
            case "rst":
91 2
                $pd = new RstEngine();
92 2
                $pd->setIncludePolicy(true, getcwd());
93 2
                break;
94
95
            default:
96 3
                $pd = new PlainTextEngine();
97 3
                break;
98
        }
99
100 7
        $this->bodyContent = $pd->parse($this->bodyContent);
101 7
    }
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
    public function setPageView (&$pageView)
122
    {
123
        $this->parentPageView = &$pageView;
124
    }
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
}