forked from stfalcon/BlogBundle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReadMoreTwigExtension.php
90 lines (80 loc) · 1.92 KB
/
ReadMoreTwigExtension.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
namespace Stfalcon\Bundle\BlogBundle\Extension;
/**
* Cut text. Replace <!--more--> to "Read more"
*
* @author Stepan Tanasiychuk <ceo@stfalcon.com>
*/
class ReadMoreTwigExtension extends \Twig_Extension
{
public static $separator = '<!--more-->';
/**
* Returns a list of filters to add to the existing list.
*
* @return array An array of filters
*/
public function getFilters()
{
return array(
'cutMore' => new \Twig_Filter_Method($this, 'cutMore'),
'moreToSpan' => new \Twig_Filter_Method($this, 'moreToSpan'),
);
}
/**
* Returns a list of functions to add to the existing list.
*
* @return array An array of functions
*/
public function getFunctions()
{
return array(
'hasMore' => new \Twig_Function_Method($this, 'hasMore'),
);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'read_more';
}
/**
* Cut text before "more" tag
*
* @param string $value Full source text
*
* @return string
*/
public function cutMore($value)
{
$posMore = ((int) strpos($value, self::$separator));
if ($posMore) {
return substr($value, 0, $posMore);
}
return $value;
}
/**
* Check or text has "more" tag
*
* @param string $value Full source text
*
* @return boolean
*/
public function hasMore($value)
{
return (bool) substr($value, 0, (int) strpos($value, self::$separator));
}
/**
* Replace <!--more--> to <span id="more"></span>
*
* @param string $value Full source text
*
* @return string
*/
public function moreToSpan($value)
{
return str_replace(self::$separator, '<span id="more"></span>', $value);
}
}