{ "info": { "author": "Diederik van der Boor", "author_email": "opensource@edoburu.nl", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. image:: https://img.shields.io/travis/edoburu/django-tag-parser/master.svg?branch=master\n :target: http://travis-ci.org/edoburu/django-tag-parser\n.. image:: https://img.shields.io/pypi/v/django-tag-parser.svg\n :target: https://pypi.python.org/pypi/django-tag-parser/\n.. image:: https://img.shields.io/pypi/l/django-tag-parser.svg\n :target: https://pypi.python.org/pypi/django-tag-parser/\n.. image:: https://img.shields.io/codecov/c/github/edoburu/django-tag-parser/master.svg\n :target: https://codecov.io/github/edoburu/django-tag-parser?branch=master\n\ndjango-tag-parser\n=================\n\nA micro-library to easily write custom Django template tags.\n\nFeatures:\n\n* Functions to parse tags, especially: \"args\", \"kwargs\", and \"as varname\" syntax.\n* Real OOP classes to write custom inclusion tags.\n\nFunctions:\n\n* ``parse_token_kwargs``: split a token into the tag name, args and kwargs.\n* ``parse_as_var``: extract the \"as varname\" from a token.\n\nBase classes (in ``tag_parser.basetags``):\n\n* ``BaseNode``: A template ``Node`` object which features some basic parsing abilities.\n* ``BaseInclusionNode``: a ``Node`` that has ``inclusion_tag`` like behaviour, but allows to override the ``template_name`` dynamically.\n* ``BaseAssignmentNode``: a ``Node`` that returns the value in the context, using the ``as var`` syntax.\n* ``BaseAssignmentOrOutputNode``: a ``Node`` that either displays the value, or inserts it in the context.\n* ``BaseAssignmentOrInclusionNode``: a class that allows a ``{% get_items template=\"...\" %}`` and ``{% get_items as var %}`` syntax.\n\nThe base classes allows to implement ``@register.simple_tag``, ``@register.inclusion_tag`` and ``@register.assignment_tag`` like functionalities,\nwhile still leaving room to extend the parsing, rendering or syntax validation.\nFor example, not all arguments need to be seen as template variables, filters or literal keywords.\n\nAs of v3.0, the ``@template_tag`` decorator is no longer needed.\nUse ``@register.tag(\"name\")`` directly on the class names.\n\n\nInstallation\n============\n\nFirst install the module, preferably in a virtual environment. It can be installed from PyPI:\n\n.. code-block:: bash\n\n pip install django-tag-parser\n\n\nExamples\n========\n\nAt the top of your template tags library, always include the standard\nDjango ``register`` variable and our ``template_tag`` decorator:\n\n.. code-block:: python\n\n from django.template import Library\n from tag_parser import template_tag\n\n register = Library()\n\nArguments and keyword arguments\n-------------------------------\n\nTo parse a syntax like:\n\n.. code-block:: html+django\n\n {% my_tag \"arg1\" keyword1=\"bar\" keyword2=\"foo\" %}\n\nuse:\n\n.. code-block:: python\n\n from django.template import Library\n from tag_parser.basetags import BaseNode\n\n register = Library()\n\n\n @register.tag('my_tag')\n class MyTagNode(BaseNode):\n max_args = 1\n allowed_kwargs = ('keyword1', 'keyword2',)\n\n def render_tag(self, context, *tag_args, **tag_kwargs):\n return \"Tag Output\"\n\nInclusion tags\n--------------\n\nTo create an inclusion tag with overwritable template_name:\n\n.. code-block:: html+django\n\n {% my_include_tag \"foo\" template=\"custom/example.html\" %}\n\nuse:\n\n.. code-block:: python\n\n from django.template import Library\n from tag_parser.basetags import BaseInclusionNode\n\n register = Library()\n\n @register.tag(\"my_include_tag\")\n class MyIncludeTag(BaseInclusionNode):\n template_name = \"mytags/default.html\"\n max_args = 1\n\n def get_context_data(self, parent_context, *tag_args, **tag_kwargs):\n (foo,) = *tag_args\n return {\n 'foo': foo\n }\n\nThe ``get_template_name()`` method can be overwritten too to support dynamic resolving of template names.\nBy default it checks the ``template`` tag_kwarg, and ``template_name`` attribute.\nNote the template nodes are cached afterwards, it's not possible to return random templates at each call.\n\n\nAssignment tags\n---------------\n\nTo create assignment tags that can either render itself, or return context data:\n\n.. code-block:: html+django\n\n {% get_tags template=\"custom/example.html\" %}\n {% get_tags as popular_tags %}\n\nuse:\n\n.. code-block:: python\n\n from django.template import Library\n from tag_parser.basetags import BaseAssignmentOrInclusionNode\n\n register = Library()\n\n\n @register.tag('get_tags')\n class GetPopularTagsNode(BaseAssignmentOrInclusionNode):\n template_name = \"myblog/templatetags/popular_tags.html\"\n context_value_name = 'tags'\n allowed_kwargs = (\n 'order', 'orderby', 'limit',\n )\n\n def get_value(self, context, *tag_args, **tag_kwargs):\n return query_tags(**tag_kwargs) # Something that reads the tags.\n\n\nBlock tags\n----------\n\nTo have a \"begin .. end\" block, define ``end_tag_name`` in the class:\n\n.. code-block:: html+django\n\n {% my_tag keyword1=foo %}\n Tag contents, possibly other tags.\n {% end_my_tag %}\n\nuse:\n\n.. code-block:: python\n\n from django.template import Library\n from tag_parser.basetags import BaseAssignmentOrInclusionNode\n\n register = Library()\n\n\n @register.tag('my_tag')\n class MyTagNode(BaseNode):\n max_args = 1\n allowed_kwargs = ('keyword1', 'keyword2',)\n end_tag_name = 'end_my_tag'\n\n def render_tag(self, context, *tag_args, **tag_kwargs):\n # Render contents inside\n return self.nodelist.render(context)\n\n\nCustom parsing\n--------------\n\nWith the standard ``Node`` class from Django, it's easier to implement custom syntax.\nFor example, to parse:\n\n.. code-block:: html+django\n\n {% getfirstof val1 val2 as val3 %}\n\nuse:\n\n.. code-block:: python\n\n from django.template import Library, Node, TemplateSyntaxError\n from tag_parser import parse_token_kwargs, parse_as_var\n\n register = Library()\n\n\n @register.tag('getfirstof')\n class GetFirstOfNode(Node):\n def __init__(self, options, as_var):\n self.options = options # list of FilterExpression nodes.\n self.as_var = as_var\n\n @classmethod\n def parse(cls, parser, token):\n bits, as_var = parse_as_var(parser, token)\n tag_name, options, _ = parse_token_kwargs(parser, bits, allowed_kwargs=())\n\n if as_var is None or not choices:\n raise TemplateSyntaxError(\"Expected syntax: {{% {0} val1 val2 as val %}}\".format(tag_name))\n\n return cls(options, as_var)\n\n def render(self, context):\n value = None\n for filterexpr in self.options:\n # The ignore_failures argument prevents that the value becomes TEMPLATE_STRING_IF_INVALID.\n value = filterexpr.resolve(context, ignore_failures=True)\n if value is not None:\n break\n\n context[self.as_var] = value\n return ''\n\n\n\nContributing\n------------\n\nThis module is designed to be generic. In case there is anything you didn't like about it,\nor think it's not flexible enough, please let us know. We'd love to improve it!\n\nIf you have any other valuable contribution, suggestion or idea,\nplease let us know as well because we will look into it.\nPull requests are welcome too. :-)", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/edoburu/django-tag-parser/zipball/master", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/edoburu/django-tag-parser", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "django-tag-parser", "package_url": "https://pypi.org/project/django-tag-parser/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-tag-parser/", "project_urls": { "Download": "https://github.com/edoburu/django-tag-parser/zipball/master", "Homepage": "https://github.com/edoburu/django-tag-parser" }, "release_url": "https://pypi.org/project/django-tag-parser/3.1/", "requires_dist": null, "requires_python": "", "summary": "Micro-library to easily write custom Django template tags", "version": "3.1" }, "last_serial": 2548509, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "a0579270e5f12c6079f35f07360fe9e5", "sha256": "7a747112ad7e99b29d5416a5411ddefe9cc7acd19b54ac074a426f8471d7deef" }, "downloads": -1, "filename": "django-tag-parser-1.0.0.tar.gz", "has_sig": false, "md5_digest": "a0579270e5f12c6079f35f07360fe9e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10863, "upload_time": "2013-02-16T17:11:35", "url": "https://files.pythonhosted.org/packages/80/a7/80564f778061f89756efc65d5b43fec12e85c1b1c0c6c699a9cb3026683e/django-tag-parser-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "c816590f8bf98da64e9909e6575edc93", "sha256": "1571741c4ddd5dafc21d3346802dbae41e1a1d53ce6e086abb3874de5de3ce58" }, "downloads": -1, "filename": "django-tag-parser-1.0.1.tar.gz", "has_sig": false, "md5_digest": "c816590f8bf98da64e9909e6575edc93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10901, "upload_time": "2013-08-14T09:47:15", "url": "https://files.pythonhosted.org/packages/b6/db/95b285ae667945bb325a9e2800213ae6a0fdcd3badae9e55547b8193a28b/django-tag-parser-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "f553297f5969b7641b450ed4f0d1c84b", "sha256": "f7f7dec4d331ea50e776a257403bb315d7c898d4371b97853b7e60fe6fb9b5e0" }, "downloads": -1, "filename": "django-tag-parser-1.0.2.tar.gz", "has_sig": false, "md5_digest": "f553297f5969b7641b450ed4f0d1c84b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11101, "upload_time": "2013-09-25T08:19:36", "url": "https://files.pythonhosted.org/packages/a7/fd/54bd32c585717b4d8ece3a014571beb84de77a9dbf2f01b1fc231ab6e684/django-tag-parser-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "64519fad73721dab4e1b3be235561525", "sha256": "a94340c8d7b9f392c5808378f452916b8fded9564324ed799a06dcf1bf844d21" }, "downloads": -1, "filename": "django-tag-parser-1.0.3.tar.gz", "has_sig": false, "md5_digest": "64519fad73721dab4e1b3be235561525", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11513, "upload_time": "2013-10-08T07:58:46", "url": "https://files.pythonhosted.org/packages/49/95/0e473d3323df18843651eb60560c5a9d0428e7564ce0fc6cec40393a80cb/django-tag-parser-1.0.3.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "966e0f3dc127e215d67c0608b69e06b6", "sha256": "7a8d9c1ce0d1f57c75b234c49a7bc101e7dce85aa217dc5bdbf2156949b8f8b9" }, "downloads": -1, "filename": "django-tag-parser-1.1.0.tar.gz", "has_sig": false, "md5_digest": "966e0f3dc127e215d67c0608b69e06b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11718, "upload_time": "2014-05-24T13:52:43", "url": "https://files.pythonhosted.org/packages/58/b4/9e920953f837fa9aa99dbbc49a50744142a11c32d11621754f6c022bf3f3/django-tag-parser-1.1.0.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "66a44d0ffaff13a313aee5a7ea8bad6a", "sha256": "2082a98f470f7d39e7f4fc3072d61ffa246e8d95c345f1479fc2210b851420cd" }, "downloads": -1, "filename": "django_tag_parser-2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "66a44d0ffaff13a313aee5a7ea8bad6a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 11875, "upload_time": "2014-10-14T14:55:04", "url": "https://files.pythonhosted.org/packages/f4/73/021e1e570991b7c6de5e2f389627e2bbea867f1b13d84e143f4810a3f31f/django_tag_parser-2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dcb333572c56d9dab800b296303a7994", "sha256": "e8809942d9fe8edee8ea171d42c0aaa62d4b0f3e7cccbcbdeee9627a27a2191b" }, "downloads": -1, "filename": "django-tag-parser-2.0.tar.gz", "has_sig": false, "md5_digest": "dcb333572c56d9dab800b296303a7994", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12101, "upload_time": "2014-10-14T14:55:02", "url": "https://files.pythonhosted.org/packages/3c/2c/615c079faf6ca09296f17f4641a673ce6b3b5b3e0b824e065b2988d13ca3/django-tag-parser-2.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "a77e4a88277218e8a530c3c1092ceb49", "sha256": "cd05da880d6def9baaf3be7aba9cc58f47fd4c5542ad40ede2e03e0eb84a6335" }, "downloads": -1, "filename": "django_tag_parser-2.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a77e4a88277218e8a530c3c1092ceb49", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12264, "upload_time": "2015-01-26T15:21:02", "url": "https://files.pythonhosted.org/packages/d8/9c/08a066cd18602854e13b3f701cd9593fc9cc57121462720c2b49a89b9abc/django_tag_parser-2.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc2e70f39734d465c0bdb9a5a43fd380", "sha256": "5b3a6ec1a85fe42c47cc9d0ea84b763212e7bb595116820a14777da964a6c830" }, "downloads": -1, "filename": "django-tag-parser-2.0.1.tar.gz", "has_sig": false, "md5_digest": "dc2e70f39734d465c0bdb9a5a43fd380", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12254, "upload_time": "2015-01-26T15:21:00", "url": "https://files.pythonhosted.org/packages/a8/3d/3246b61d9a94df7f104ff2a06095d41bfbae0bfa05b064e1d3f35a7808ff/django-tag-parser-2.0.1.tar.gz" } ], "2.0b1": [ { "comment_text": "", "digests": { "md5": "61debbe6a31ad49cce9c4f01cc91968b", "sha256": "15f054359977ef6d70e24266fb430f4a36e983bb5a2b343c626f888e6380c202" }, "downloads": -1, "filename": "django-tag-parser-2.0b1.tar.gz", "has_sig": false, "md5_digest": "61debbe6a31ad49cce9c4f01cc91968b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12538, "upload_time": "2014-06-28T12:41:35", "url": "https://files.pythonhosted.org/packages/7e/4d/4a07139f941dc78ffcfb1ff1feb9709cd5eb367172cb66797d638c95c2f8/django-tag-parser-2.0b1.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "e2ab499a1955606cacc073e35ba5edb8", "sha256": "84bbb9107ee3e8475f834f913ff0e5bc53bda61fed57777399cc6b0d8389bdd8" }, "downloads": -1, "filename": "django_tag_parser-2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e2ab499a1955606cacc073e35ba5edb8", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12490, "upload_time": "2015-04-13T11:30:50", "url": "https://files.pythonhosted.org/packages/99/1e/47c0de9fc3323c0f68055ea5a664e04e9ab220e82f8492ee9464eb08d347/django_tag_parser-2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5c9d3534df71d5e64d06f73b11e49df", "sha256": "60712ad9fb074d7a1a5f0636757390f71e51ffdd0adf4ddbcf7012f281512b1f" }, "downloads": -1, "filename": "django-tag-parser-2.1.tar.gz", "has_sig": false, "md5_digest": "b5c9d3534df71d5e64d06f73b11e49df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12591, "upload_time": "2015-04-13T11:30:47", "url": "https://files.pythonhosted.org/packages/b4/c2/5f19d24f6e12a82a9d00f062f17924cd2dce8c9f937d41ee188883e52120/django-tag-parser-2.1.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "f1ca8460351c964f7ed85f7421856807", "sha256": "edc01432e2f8222038f68fbf5e59d1b9e659e83b709a81e98036900eac01def5" }, "downloads": -1, "filename": "django_tag_parser-3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f1ca8460351c964f7ed85f7421856807", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16122, "upload_time": "2016-08-20T13:21:49", "url": "https://files.pythonhosted.org/packages/c8/02/d0eab3e7f0417555144542bf1086f8dcc5e01277fb93cee44f185a981708/django_tag_parser-3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eb21b6732ef0d89b9c5676c501688d0c", "sha256": "bf34223cd2db4397ceef570446399fd33e88ff645dceef14ff20aebcc4fb9b4c" }, "downloads": -1, "filename": "django-tag-parser-3.0.tar.gz", "has_sig": false, "md5_digest": "eb21b6732ef0d89b9c5676c501688d0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14854, "upload_time": "2016-08-20T13:21:52", "url": "https://files.pythonhosted.org/packages/b3/b9/e06dcd58f306060ef4033d04fc461706ad3dab243ac526540bd6f973eae4/django-tag-parser-3.0.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "1b1128f5729131c67dd5935a03a02630", "sha256": "eb4ae4a00e662b90e26d40787e19c6195ac648dbc80c264abf5d0d33607cae71" }, "downloads": -1, "filename": "django_tag_parser-3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1b1128f5729131c67dd5935a03a02630", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16085, "upload_time": "2017-01-01T18:39:17", "url": "https://files.pythonhosted.org/packages/53/4b/ea195cb7db19183540f42e74f5fbecd7d4e0bfec7f16d06b55ab613fb406/django_tag_parser-3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba002936132a83bb3b5275fa13b03bff", "sha256": "4ede9ea775101694cb318ed7c74d5bdcdd3671c4f62e420cd44e2e93b098088e" }, "downloads": -1, "filename": "django-tag-parser-3.1.tar.gz", "has_sig": false, "md5_digest": "ba002936132a83bb3b5275fa13b03bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14883, "upload_time": "2017-01-01T18:39:20", "url": "https://files.pythonhosted.org/packages/25/e2/7017cbec1ce2670743a96b36a01b2ac194a4ea5d0f3b7c9a60f61e56af9a/django-tag-parser-3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1b1128f5729131c67dd5935a03a02630", "sha256": "eb4ae4a00e662b90e26d40787e19c6195ac648dbc80c264abf5d0d33607cae71" }, "downloads": -1, "filename": "django_tag_parser-3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1b1128f5729131c67dd5935a03a02630", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16085, "upload_time": "2017-01-01T18:39:17", "url": "https://files.pythonhosted.org/packages/53/4b/ea195cb7db19183540f42e74f5fbecd7d4e0bfec7f16d06b55ab613fb406/django_tag_parser-3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba002936132a83bb3b5275fa13b03bff", "sha256": "4ede9ea775101694cb318ed7c74d5bdcdd3671c4f62e420cd44e2e93b098088e" }, "downloads": -1, "filename": "django-tag-parser-3.1.tar.gz", "has_sig": false, "md5_digest": "ba002936132a83bb3b5275fa13b03bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14883, "upload_time": "2017-01-01T18:39:20", "url": "https://files.pythonhosted.org/packages/25/e2/7017cbec1ce2670743a96b36a01b2ac194a4ea5d0f3b7c9a60f61e56af9a/django-tag-parser-3.1.tar.gz" } ] }