aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php
blob: b7da08980646e85920544cc4f79210f2ade53318 (plain) (blame)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
/**
 * Smarty plugin
 *
 * @package    Smarty
 * @subpackage PluginsModifier
 */
/**
 * Smarty capitalize modifier plugin
 * Type:     modifier
 * Name:     capitalize
 * Purpose:  capitalize words in the string
 * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
 *
 * @param string  $string    string to capitalize
 * @param boolean $uc_digits also capitalize "x123" to "X123"
 * @param boolean $lc_rest   capitalize first letters, lowercase all following letters "aAa" to "Aaa"
 *
 * @return string capitalized string
 * @author Monte Ohrt <monte at ohrt dot com>
 * @author Rodney Rehm
 */
function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
{
	$string = (string) $string;

    if (Smarty::$_MBSTRING) {
        if ($lc_rest) {
            // uppercase (including hyphenated words)
            $upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
        } else {
            // uppercase word breaks
            $upper_string = preg_replace_callback(
                "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
                'smarty_mod_cap_mbconvert_cb',
                $string
            );
        }
        // check uc_digits case
        if (!$uc_digits) {
            if (preg_match_all(
                "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
                $string,
                $matches,
                PREG_OFFSET_CAPTURE
            )
            ) {
                foreach ($matches[ 1 ] as $match) {
                    $upper_string =
                        substr_replace(
                            $upper_string,
                            mb_strtolower($match[ 0 ], Smarty::$_CHARSET),
                            $match[ 1 ],
                            strlen($match[ 0 ])
                        );
                }
            }
        }
        $upper_string =
            preg_replace_callback(
                "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
                'smarty_mod_cap_mbconvert2_cb',
                $upper_string
            );
        return $upper_string;
    }
    // lowercase first
    if ($lc_rest) {
        $string = strtolower($string);
    }
    // uppercase (including hyphenated words)
    $upper_string =
        preg_replace_callback(
            "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
            'smarty_mod_cap_ucfirst_cb',
            $string
        );
    // check uc_digits case
    if (!$uc_digits) {
        if (preg_match_all(
            "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
            $string,
            $matches,
            PREG_OFFSET_CAPTURE
        )
        ) {
            foreach ($matches[ 1 ] as $match) {
                $upper_string =
                    substr_replace($upper_string, strtolower($match[ 0 ]), $match[ 1 ], strlen($match[ 0 ]));
            }
        }
    }
    $upper_string = preg_replace_callback(
        "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
        'smarty_mod_cap_ucfirst2_cb',
        $upper_string
    );
    return $upper_string;
}

/**
 *
 * Bug: create_function() use exhausts memory when used in long loops
 * Fix: use declared functions for callbacks instead of using create_function()
 * Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
 *
 * @author Kyle Renfrow
 */
/**
 * @param $matches
 *
 * @return string
 */
function smarty_mod_cap_mbconvert_cb($matches)
{
    return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}

/**
 * @param $matches
 *
 * @return string
 */
function smarty_mod_cap_mbconvert2_cb($matches)
{
    return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
}

/**
 * @param $matches
 *
 * @return string
 */
function smarty_mod_cap_ucfirst_cb($matches)
{
    return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
}

/**
 * @param $matches
 *
 * @return string
 */
function smarty_mod_cap_ucfirst2_cb($matches)
{
    return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
}