Skip to content

Commit fb10307

Browse files
committed
Added support foo.some_thing === foo.someThing
1 parent f379607 commit fb10307

3 files changed

Lines changed: 60 additions & 4 deletions

File tree

ext/twig/twig.c

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,36 @@ char *TWIG_STRTOLOWER(const char *str, int str_len)
175175
return item_dup;
176176
}
177177

178+
char *TWIG_DECAMELIZE(const char *str)
179+
{
180+
int i, chars = 0, underscored = 0;
181+
char prev, current;
182+
int str_len = strlen(str);
183+
char *retval = emalloc(2*str_len+1);
184+
185+
prev = str[0];
186+
for(i = 1; i < str_len; i++) {
187+
current = str[i];
188+
if (islower(current) && isupper(prev) && i > 1 && !underscored) {
189+
retval[chars++] = '_';
190+
}
191+
underscored = 0;
192+
retval[chars++] = tolower(prev);
193+
if (isupper(current) && (islower(prev) || isdigit(prev))) {
194+
retval[chars++] = '_';
195+
underscored = 1;
196+
} else if (isupper(current) && prev == '_') {
197+
underscored = 1;
198+
}
199+
prev = current;
200+
}
201+
202+
retval[chars++] = prev;
203+
retval[chars++] = '\0';
204+
erealloc(retval, chars);
205+
return retval;
206+
}
207+
178208
zval *TWIG_CALL_USER_FUNC_ARRAY(zval *object, char *function, zval *arguments TSRMLS_DC)
179209
{
180210
zend_fcall_info fci;
@@ -682,11 +712,14 @@ static int twig_add_method_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, v
682712
lMethod = TWIG_STRTOLOWER(method, method_len);
683713

684714
add_assoc_string(retval, lMethod, method, 1);
715+
add_assoc_string(retval, TWIG_DECAMELIZE(method), method, 1);
685716

686717
if (method_len > 3 && 0 == strncmp("get", lMethod, 3)) {
687-
add_assoc_string(retval, estrndup(lMethod + 3, method_len - 3), method, 1);
718+
add_assoc_string(retval, estrndup(lMethod+3, method_len-3), method, 1);
719+
add_assoc_string(retval, TWIG_DECAMELIZE(estrndup(method+3, method_len-3)), method, 1);
688720
} else if (method_len > 2 && 0 == strncmp("is", lMethod, 2)) {
689-
add_assoc_string(retval, estrndup(lMethod + 2, method_len - 2), method, 1);
721+
add_assoc_string(retval, estrndup(lMethod+2, method_len-2), method, 1);
722+
add_assoc_string(retval, TWIG_DECAMELIZE(estrndup(method+2, method_len-2)), method, 1);
690723
}
691724

692725
return 0;

lib/Twig/Template.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,8 +504,9 @@ protected function getCacheForClass($class)
504504
}
505505

506506
$cache = array_combine($methods, $methods);
507-
$keys = preg_replace('/^(?:get|is)(.++)/i', '\\1', $methods);
507+
$keys = array_merge(preg_replace('/^(?:get|is)(.++)$/i', '\\1', $methods), $methods);
508+
$keys = array_merge(preg_replace('/((?<=[a-z]|\d)[A-Z]|(?<!^)[A-Z](?=[a-z]))/', '_\\1', $keys), $keys);
508509

509-
return array('methods' => $cache + array_change_key_case($cache + array_combine($keys, $methods)));
510+
return array('methods' => $cache + array_change_key_case(array_combine($keys, array_merge($methods, $methods, $methods, $methods))));
510511
}
511512
}

test/Twig/Tests/TemplateTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,17 @@ public function getGetAttributeTests()
365365
array(false, null, $methodAndPropObject, 'c', array(), $methodType),
366366
array(false, null, $methodAndPropObject, 'c', array(), $arrayType),
367367

368+
array(true, 'camelcase', $methodAndPropObject, 'camelcase', array(), $anyType),
369+
array(true, 'camelcase', $methodAndPropObject, 'camelcase', array(), $methodType),
370+
371+
array(true, 'camelcase', $methodAndPropObject, 'camelCase', array(), $anyType),
372+
array(true, 'camelcase', $methodAndPropObject, 'camelCase', array(), $methodType),
373+
374+
array(true, 'camelcase', $methodAndPropObject, 'camel_case', array(), $anyType),
375+
array(true, 'camelcase', $methodAndPropObject, 'camel_case', array(), $methodType),
376+
377+
array(true, 'httpresponsecode', $methodAndPropObject, 'http_response_code', array(), $anyType),
378+
array(true, 'httpresponsecode', $methodAndPropObject, 'get_http_response_code', array(), $methodType),
368379
));
369380

370381
// tests when input is not an array or object
@@ -625,6 +636,17 @@ private function getC()
625636
{
626637
return 'c';
627638
}
639+
640+
private $camelCase = 'camelcase_prop';
641+
public function getCamelCase()
642+
{
643+
return 'camelcase';
644+
}
645+
646+
public function GetHTTPResponseCode()
647+
{
648+
return 'httpresponsecode';
649+
}
628650
}
629651

630652
class Twig_TemplateMagicMethodObject

0 commit comments

Comments
 (0)