#7806: django.template refactoring
-----------------------------+----------------------------------------------
Reporter: emulbreh | Owner: nobody
Status: new | Milestone:
Component: Template system | Version: SVN
Keywords: tplrf | Stage: Unreviewed
Has_patch: 0 |
-----------------------------+----------------------------------------------
== Why should `django.template` be refactored? ==
Filter and Variable parsing is inconsistent. Many ad hoc parsers in
defaulttags are fragile.
Whitespace handling is ungraceful.
The patch provided splits `__init__.py` into separate modules and
introduces a `TokenStream`
class that allows parsing of literals, vars (called lookups) and filter
expressions. No docs yet,
have a look at the source (it all happens in ~150 loc).
The patch only touches `django.template` and `django.templatetags`.
Tests are separate so you can run them with the old code.
== Modules in `django.template` ==
* `context` (no dependencies)[[BR]]
Untouched.
* `expressions` (no dependencies)[[BR]]
Contains `Lookup`, `Literal`, and `FilterExpression`. All are
subclasses of a marker
class `Expression`. These replace `Variable` and the old
`FilterExpression` class.
A `Variable` equivalent is provided in `compat.Variable`.
* `nodes` (depends on expressions)[[BR]]
Contains `Node`, `NodeList`, `TextNode`, and `ExpressionNode`. The
latter
is the old `VariableNode` renamed. A `VariableNode` alias is
provided in `compat`.
* `compiler` (depends on context, expressions, nodes)[[BR]]
Contains `Parser`, `Lexer`, `Token`, `TemplateSyntaxError`,
`Origin`, `StringOrgin`, and `compile_string()`. Those are mostly
untouched.
Additionally there are `TokenStream`, and `TokenSyntaxError`. Those
provide
a safe way to parse `Tokens` containing expressions.
* `library` (depends on compiler, nodes, context)[[BR]]
Contains `InvalidTemplateLibrary`, `Library`, `get_library()`, and
`add_to_builtins()`.
Mostly untouched. Should be called `libraries` for consistency, but
that would clash
with the legacy dict.
* `loader`[[BR]]
Untouched. Moved `TemplateDoesNotExist` here.
* `utils`[[BR]]
`ConditionalNode`, base class for `IfNode`, `IfEqualNode`.
`EmptyNode`.
Helper functions:
`parse_conditional_nodelists(parser, name)`, `parse_as(bits)`
`parse_args_and_kwargs(bits)`, `resolve_args_and_kwargs(args,
kwargs)`
* `compat`[[BR]]
Provides backwards compatibility for `Variable`, `VariableNode`,
`TokenParser`,
and `resolve_variable()`
* `defaulttags`, `loader_tags`[[BR]]
Mostly refactored to use `TokenStream` where appropriate.
== Tickets ==
* #4746 - allow whitespace before and after filter separator[[BR]]
fixed. tests are there (filter-syntax03, filter-syntax04) but expect
TemplateSyntaxError.
* #5270 - empty string literals[[BR]]
fixed. tests included.
* #5756 - accept filters (almost) everywhere[[BR]]
fixed. a few tests included.
* #5862 - dup of #5756[[BR]]
fixed.
* #5971 - token parser bug[[BR]]
`TokenParser` will be deprecated.
* #6271 - filter arguments with spaces[[BR]]
fixed. test included. (seems to be fixed in trunk already)
* #6296 - expressions for ifequal[[BR]]
fixed. tests included (dup of #5756 ?)
* #6510 - `get_nodes_by_type()` problem[[BR]]
probably fixed.
* #6535 - negative numeric literals[[BR]]
fixed. tests included.
* #7295 - quotes, escaping and translation of string literals handled
inconsistently in templates[[BR]]
fixed.
== Performance ==
Comparing `runtests.py templates` measures, the refactored version is a
bit slower.
== Todo ==
`{% if not %}` is currently valid. The refactored implementation is greedy
and reports a syntax error.
Could be fixed, not sure it's worth it. Broken tests are: if-tag-not02,
if-tag-not03. DDN.
Numeric literals ending with "." are now considered a syntax error.
Broken test: ifequal-numeric07. DDN.
`{% url %}` currently accepts an arbitrary unquoted unicode string for the
view name.
The refactored implementation only accepts bare python identifiers or
quoted string literals.
Broken test: url05. DDN.
`TemplateSyntaxError` messages need some work. Eventually shortcut methods
on `TokenStream`.
Find better names for `TokenSyntaxError` and `TokenStream`.
Provide a decorator that handles the boilerplate
`bits=parser.token_stream(token)`
and `bits.assert_consumed()` calls.
Investigate performance impact.
Docs and more tests.
--
Ticket URL: <http://code.djangoproject.com/ticket/7806>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---