Commit Graph

1126 Commits

Author SHA1 Message Date
Fabien Potencier 85a7a5e8e9 updated NetBeans plugin URL 2011-12-16 16:05:09 +01:00
Fabien Potencier 972a93f85d merged branch arnaud-lb/ext-crash (PR #558)
Commits
-------

c920344 code style
50da1a2 don't modify function name

Discussion
----------

Fix crash in extension

This fixes a crash caused by `php_strtolower()` modifying its input. (Crashes on amd64, but not on x86 for me.)
2011-12-11 16:53:52 +01:00
Arnaud Le Blanc c9203442c5 code style 2011-12-10 14:49:52 +01:00
Arnaud Le Blanc 50da1a2881 don't modify function name 2011-12-10 14:48:20 +01:00
Fabien Potencier 7359f7c956 merged branch JEDIBC/master (PR #556)
Commits
-------

3bb822e . misspell function _twig_convert_encoding -> twig_convert_encoding

Discussion
----------

misspell function _twig_convert_encoding -> twig_convert_encoding

Located in _twig_escape_js_callback, the function call was misspelled and raised a PHP Fatal error:  Call to undefined function _twig_convert_encoding() in ~/www/project/vendors/Twig/Extension/Core.php on line 585
2011-12-09 10:27:23 +01:00
JEDIBC 3bb822ec2f . misspell function _twig_convert_encoding -> twig_convert_encoding 2011-12-09 10:08:13 +01:00
Fabien Potencier 3689745d35 moved some common compiled code to Twig_Template 2011-12-08 19:14:07 +01:00
Fabien Potencier ae250f6b6f fixed the lexer when an operator ending with a letter ends a line 2011-12-08 09:29:20 +01:00
Fabien Potencier b496a2324c added Twig C extension version in phpinfo 2011-12-07 12:18:20 +01:00
Fabien Potencier 822fe3fa19 moved regexes in the lexer to their own array 2011-12-07 11:07:02 +01:00
Fabien Potencier 6e2d7ba1b9 added documentation for the new string interpolation feature 2011-12-07 11:03:00 +01:00
Fabien Potencier 1036f90e79 merged branch arnaud-lb/str-interpolation (PR #515)
Commits
-------

d41d10c simplification
2dbb420 moved hard-coded regexes
61986c1 shortcut for non-interpolated double quoted strings
062ed5c regex optimization
0e63abb integration tests for interpolated strings
773fff5 parser tests for interpolated strings
098634e parser support for interpolated strings
c8bba24 lexer tests for interpolated strings
a203686 lexer support for interpolated strings
0bd63dd stack lexer states

Discussion
----------

String interpolation syntax

This adds support for string interpolation:

```
{{ "foo #{ any expression here } bar" }}
```

I find string interpolation to be often more readable than concatenation, and doesn't have the precedence ambiguity of the concatenation operator:

```
Interpolation:

{{ "foo #{bar} baz" }}
{{ "foo #{1+2} baz" }}
{{ "foo #{1+2} baz"|escape }}

Concatenation:

{{ "foo "~bar~" baz" }}
{{ "foo "~(1+2)~" baz" }} extra parentheses
{{ ("foo "~(1+2)~" baz")|escape }} more extra parentheses
```

---------------------------------------------------------------------------

by nikic at 2011/11/12 12:41:54 -0800

Really nice idea. We should discuss the exact syntax though :) Dart for example uses `${expr}` for interpolation or `$name` if the expression is just a name. I think it makes sense to have a special short syntax for the name case, because it is the most common one.

---------------------------------------------------------------------------

by stof at 2011/11/12 13:06:51 -0800

@nikic could you comment on the PR instead of commenting on each commit individually ? it would make it easier to see what is concerned in the PR.

---------------------------------------------------------------------------

by arnaud-lb at 2011/11/12 14:22:14 -0800

@nikic Thanks for your review, I'll take care of your remarks.

For the syntax, I have no preference. I've taken this one because it has the same semantics. In Ruby and Coffeescript the `#{...}` allows any expression between the brackets. In PHP the expression in the `${...}` must start with a variable name. As you mentioned Dart's `${...}` seems to allow any expression.

---------------------------------------------------------------------------

by nikic at 2011/11/12 15:03:48 -0800

@arnaud-lb If Ruby and Coffeescript use this, the #{...} syntax should be okay. Especially as ${...} might be confusing for PHP developers as it has the semantics of variable variables in PHP.

@stof Thanks, will do so next time.

---------------------------------------------------------------------------

by damianb at 2011/11/12 15:38:31 -0800

@stof he doesn't need to - this is something github handles already. in the PR view, beside the "@nikic commented" bits, there's a set of links that shows where exactly the comment was in the format of commit sha, filename, and line inside the diff.

You can see for yourself right here, upper left:
![pr snapshot](http://i42.tinypic.com/zl6s82.png)

---------------------------------------------------------------------------

by stof at 2011/11/13 01:20:38 -0800

@damianb The comment appears, but not the context in which the comment was. We have to follow each link to see it whereas comments done on the PR appear directly with their context. This is why I said it is easier when comments are on the PR.

---------------------------------------------------------------------------

by nikic at 2011/12/02 15:13:30 -0800

So what about this now?

Btw, `REGEX_STRING` and `REGEX_DQ_STRING_PART` still are hardcoded and do not depend on the specified `interpolation` tags. But this looks hard to change, at least the regexes are quite complicated.

---------------------------------------------------------------------------

by arnaud-lb at 2011/12/02 15:22:45 -0800

I think I've addressed all issues (except hardcoding of `#{` and `}` in `REGEX_STRING` and `REGEX_DQ_STRING_PART`.)

Can this be merged after v1.4 is release if the syntax is accepted ?

---------------------------------------------------------------------------

by nikic at 2011/12/03 01:53:41 -0800

This would be my go for `STRING` and `DQ_STRING_PART` (isn't tested):

```php
<?php
$interpolChar = preg_quote(substr($options['interpolation'][0], 0, 1), '/');
$interpolPart = '[^' . $interpolChar . '"\\\\]*';
if (strlen($options['interpolation'][0]) > 1) {
    $interpolRest = preg_quote(substr($options['interpolation'][0], 1), '/');
    $interpolRegex = $interpolPart . '(?:(?:\\\\.|' . $interpolChar . '(?!' . $interpolRest . '))' . $interpolPart . ')*';

} else {
    $interpolRegex =  $interpolPart . '(?:\\\\.' . $interpolPart . ')*';
}
$this->options['dq_string_part_regex'] = '/' . $interpolRegex . '/As';
$this->options['string_regex'] = '/"' . $interpolRegex . '"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
```

It should allow both a single char interpolation syntax (like `{`) and multichar ones (like `#{`).

By the way, could we maybe move the compiled regexes out of `$this->options` into `$this->regexes`?
2011-12-07 10:09:34 +01:00
Fabien Potencier fd7b34ee78 added the CHANGELOG to the PEAR package 2011-12-07 09:58:16 +01:00
Fabien Potencier 08bda72355 enhanced exceptions for unknown filters, functions, tests, and tags 2011-12-07 09:54:44 +01:00
Fabien Potencier 049f515c54 removed dead code 2011-12-07 09:31:19 +01:00
Fabien Potencier 695bbd276f added a way to get all registered tags 2011-12-07 09:24:13 +01:00
Jonathan Ingram c22c4c6bb8 Removed trailing white spaces 2011-12-07 08:58:57 +01:00
Jonathan Ingram 2c79f494f5 Help the developer when they specify an invalid function by providing some alternatives 2011-12-07 08:58:57 +01:00
Fabien Potencier 55c7ff00b1 merged branch jonathaningram/patch-1 (PR #549)
Commits
-------

989bb22 Removed trailing white spaces
f880bab Help the developer when they specify an invalid filter by providing some alternatives

Discussion
----------

Help the developer when they specify an invalid filter by providing some...

... alternatives.

Bug fix: no
Feature addition: yes
Backwards compatibility break: no

Uses a simple `strpos` search (no fancy diff to determine what the filter could be). There is no impact to runtime performance because this is all happening during template compilation.

Examples:

```jinja
{{ my_entity|json }}
```

Shows exception:

`The filter "json" does not exist. Did you mean "json_encode"?`

```jinja
{{ my_date|dat }}
```

Shows:

`The filter "dat" does not exist. Did you mean "date"?`

```jinja
{{ my_var|f }}
```

Shows:

`The filter "f" does not exist. Did you mean "format", "default", "_default", "format_args", "format_args_as_text", "file_excerpt", "format_file", "format_file_from_text", "file_link"?`

Also good for custom filters created in your own domain `st_`:

```jinja
{{ my_var|st_ }}
```

Shows:

`The filter "st_" does not exist. Did you mean "st_friendly_date", "st_site_test_url"?`

---------------------------------------------------------------------------

by stof at 2011/12/04 16:34:27 -0800

I like the idea to provide help to the developer in case of error. You should probably do the same for functions

---------------------------------------------------------------------------

by Tobion at 2011/12/05 05:56:29 -0800

+1 for a combination of string starts with (suggesting domain specific filters, e.g. st_*) and levenshtein for typos

---------------------------------------------------------------------------

by chucktrukk at 2011/12/05 08:13:10 -0800

+1. This would be really helpful.
2011-12-07 08:19:37 +01:00
Fabien Potencier 460ba4d6c7 bumped version to 1.5.0-DEV 2011-12-07 08:11:23 +01:00
Fabien Potencier 0b7d6dfa0c prepared the 1.4.0 release v1.4.0 2011-12-07 08:09:57 +01:00
Fabien Potencier a6f9f9b5e3 added a unit test test for previous merge 2011-12-06 16:54:43 +01:00
Fabien Potencier f1e5278aea merged branch duo-criativa/master (PR #544)
Commits
-------

11b8689 Refactoring: using && instead of nested if's
7aa6757 Bug correction: Parsing integers large than PHP_INT_MAX was generating trucated token values.
046e4ff Bug correction: Parsing integers large than PHP_INT_MAX was generating trucated token values.

Discussion
----------

Fixed bug that was trucating integers large then PHP_INT_MAX

The following code

{% set sizes = [7077888, 452984832, 28991029248, 1855425871872, 9223372036854775807] %}
{% for i in sizes %}
   {{ i }}
{% endfor %}

was generating the following output

7077888
452984832
2147483647
2147483647
2147483647

With the fix, the output looks like the following on Ubuntu 11.04

7077888
452984832
28991029248
1855425871872
9.2233720368548E+18
2011-12-06 16:49:24 +01:00
Jonathan Ingram 989bb22c8f Removed trailing white spaces 2011-12-05 12:45:22 +11:00
Jonathan Ingram f880bab988 Help the developer when they specify an invalid filter by providing some alternatives 2011-12-05 11:01:25 +11:00
Fabien Potencier 6e3a1c4016 added missing preserveKeys argument to the reverse filter 2011-12-03 08:37:53 +01:00
Fabien Potencier c6917a28ef fixed macros containing filter tag calls 2011-12-03 08:16:26 +01:00
Fabien Potencier b2149e7955 merged branch hason/arrayloader (PR #542)
Commits
-------

16d7800 fixed a crash when an object with __toString() method is passed as template name

Discussion
----------

fixed a crash when an object with __toString() method is passed as templ...

...ate name

---------------------------------------------------------------------------

by fabpot at 2011/12/01 03:58:47 -0800

Not sure about this one as the phpdoc clearly state that the name is a string. Do you have a specific user case in mind?

---------------------------------------------------------------------------

by hason at 2011/12/01 04:26:47 -0800

I use the class "Twig_Loader_Chain" as template loader in Symfony2 application. One of the embeded loaders is "Twig_Loader_Array". In Symfony2 is used "Symfony\Component\Templating\TemplateReferenceInterface" for internal representation of a template and it causes a crash.
2011-12-02 15:11:24 +01:00
Paulo Roberto Ribeiro 11b86893f7 Refactoring: using && instead of nested if's 2011-12-01 20:18:58 -02:00
Paulo Roberto Ribeiro 7aa67572e8 Bug correction: Parsing integers large than PHP_INT_MAX was generating trucated token values. 2011-12-01 18:41:28 -02:00
Paulo Roberto Ribeiro 046e4ffa23 Bug correction: Parsing integers large than PHP_INT_MAX was generating trucated token values. 2011-12-01 17:54:23 -02:00
Martin Hasoň 16d780043f fixed a crash when an object with __toString() method is passed as template name 2011-12-01 12:43:07 +01:00
Fabien Potencier 9a638a4a33 fixed markup in doc 2011-11-29 15:49:51 +01:00
Fabien Potencier 7d56687f8e prepared the 1.4.0-RC2 release v1.4.0-RC2 2011-11-27 20:32:27 +01:00
Fabien Potencier 0a0febc32b merged branch arnaud-lb/twig-escape-filter-opt (PR #537)
Commits
-------

7b8d476 optimized twig_escape_filter

Discussion
----------

Optimized twig_escape_filter

This optimizes the part of twig_escape_filter that checks if the charset is supported by htmlspecialchars.

This uses a static variable to avoid initializing the charsets array each time the function is called; and does a hash lookup instead of array search (saves a function call too).

The optimized version takes 66% less time that the original version on html escaping :) (no difference on js escaping).
2011-11-27 16:46:10 +01:00
Arnaud Le Blanc 7b8d476ea5 optimized twig_escape_filter
uses a static variable to avoid initializing the charsets array each
time the function is called; and does a hash lookup instead of array
search (saves a function call too).
2011-11-27 16:13:43 +01:00
Fabien Potencier fba7f95bd2 simplified the implementation of the replace filter 2011-11-27 14:58:36 +01:00
Fabien Potencier 86214c4601 fixed a crash under certain versions of PHP when an object with a __toString() method is used with htmlspecialchars 2011-11-25 19:36:25 +01:00
Fabien Potencier 620b29a4d5 renamed an internal class 2011-11-23 23:45:02 +01:00
Fabien Potencier c90b3ec97a made a small speed optimization 2011-11-23 15:18:40 +01:00
Fabien Potencier 317f6e4725 fixed unit tests due to a difference between the PHP and C versions of Twig_Template::getAttribute() 2011-11-23 14:24:45 +01:00
Fabien Potencier 8d9e08518e merged branch arnaud-lb/ext (PR #530)
Commits
-------

569f782 fix ZTS build
1606910 Fix undefined behavior
0ce8d3c Convert item argument to string
d807981 don't try to access non public property or method
7e566b8 test twig_template_get_attributes

Discussion
----------

twig_template_get_attributes tests and fixes

This enables testing of twig_template_get_attributes (every TemplateTest test is ran against twig_template_get_attributes too) and fixes some bugs I've found.

There is still 3 failing tests due to a difference of how twig_template_get_attributes and Twig_Template::getAttribute use Twig_Template::$cache.

Twig_Template::getAttribute doesn't cache properties, and twig_template_get_attributes expects $cache[$class]['properties'] to be set if $cache[$class] is set. So twig_template_get_attributes can fail if the cache is already populated by Twig_Template::getAttribute.
2011-11-23 14:14:41 +01:00
Arnaud Le Blanc 569f782ad0 fix ZTS build 2011-11-23 14:01:51 +01:00
Arnaud Le Blanc 1606910a9a Fix undefined behavior
The callbacks are expected to return an integer, and returning void
instead was triggering weird bugs

I've also removed the casts to ensure that the signatures are compatible
2011-11-23 13:47:55 +01:00
Arnaud Le Blanc 0ce8d3c986 Convert item argument to string
This fixes a crash in some cases and repeated conversions
2011-11-23 13:47:48 +01:00
Arnaud Le Blanc d807981bc6 don't try to access non public property or method 2011-11-23 13:38:48 +01:00
Arnaud Le Blanc 7e566b8462 test twig_template_get_attributes 2011-11-23 13:38:48 +01:00
Fabien Potencier fa71922a19 tweaked CHANGELOG 2011-11-23 12:21:50 +01:00
Fabien Potencier bae4246356 updated Twig ext version 2011-11-23 12:19:09 +01:00
Fabien Potencier 7cfb0ecbb8 merged branch arjenjb/master (PR #528)
Commits
-------

c65be3e Pass around the TSRM
09d3095 Moved zval declaration
c941552 Removed globals
ffb2460 Added config.w32 for windows builds

Discussion
----------

Fixed compilation on windows
2011-11-23 12:16:47 +01:00