From ebd25985962bd1466257385abcf7e8fc0df9ca0f Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Mon, 24 Dec 2012 23:14:06 +0100 Subject: [PATCH] Removed django.contrib.markup. --- django/contrib/markup/__init__.py | 0 django/contrib/markup/models.py | 0 .../contrib/markup/templatetags/__init__.py | 0 django/contrib/markup/templatetags/markup.py | 90 --------------- django/contrib/markup/tests.py | 108 ------------------ .../contributing/writing-code/unit-tests.txt | 10 +- docs/ref/contrib/index.txt | 8 -- docs/ref/contrib/markup.txt | 77 ------------- docs/ref/settings.txt | 14 --- docs/ref/templates/builtins.txt | 10 -- docs/topics/security.txt | 7 -- 11 files changed, 2 insertions(+), 322 deletions(-) delete mode 100644 django/contrib/markup/__init__.py delete mode 100644 django/contrib/markup/models.py delete mode 100644 django/contrib/markup/templatetags/__init__.py delete mode 100644 django/contrib/markup/templatetags/markup.py delete mode 100644 django/contrib/markup/tests.py delete mode 100644 docs/ref/contrib/markup.txt diff --git a/django/contrib/markup/__init__.py b/django/contrib/markup/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/django/contrib/markup/models.py b/django/contrib/markup/models.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/django/contrib/markup/templatetags/__init__.py b/django/contrib/markup/templatetags/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/django/contrib/markup/templatetags/markup.py b/django/contrib/markup/templatetags/markup.py deleted file mode 100644 index 389c919c07..0000000000 --- a/django/contrib/markup/templatetags/markup.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Set of "markup" template filters for Django. These filters transform plain text -markup syntaxes to HTML; currently there is support for: - - * Textile, which requires the PyTextile library available at - http://loopcore.com/python-textile/ - - * Markdown, which requires the Python-markdown library from - http://www.freewisdom.org/projects/python-markdown - - * reStructuredText, which requires docutils from http://docutils.sf.net/ -""" - -from django import template -from django.conf import settings -from django.utils.encoding import force_bytes, force_text -from django.utils.safestring import mark_safe - -register = template.Library() - -@register.filter(is_safe=True) -def textile(value): - try: - import textile - except ImportError: - if settings.DEBUG: - raise template.TemplateSyntaxError("Error in 'textile' filter: The Python textile library isn't installed.") - return force_text(value) - else: - return mark_safe(force_text(textile.textile(force_bytes(value), encoding='utf-8', output='utf-8'))) - -@register.filter(is_safe=True) -def markdown(value, arg=''): - """ - Runs Markdown over a given value, optionally using various - extensions python-markdown supports. - - Syntax:: - - {{ value|markdown:"extension1_name,extension2_name..." }} - - To enable safe mode, which strips raw HTML and only returns HTML - generated by actual Markdown syntax, pass "safe" as the first - extension in the list. - - If the version of Markdown in use does not support extensions, - they will be silently ignored. - - """ - import warnings - warnings.warn('The markdown filter has been deprecated', - category=DeprecationWarning) - try: - import markdown - except ImportError: - if settings.DEBUG: - raise template.TemplateSyntaxError("Error in 'markdown' filter: The Python markdown library isn't installed.") - return force_text(value) - else: - markdown_vers = getattr(markdown, "version_info", 0) - if markdown_vers < (2, 1): - if settings.DEBUG: - raise template.TemplateSyntaxError( - "Error in 'markdown' filter: Django does not support versions of the Python markdown library < 2.1.") - return force_text(value) - else: - extensions = [e for e in arg.split(",") if e] - if extensions and extensions[0] == "safe": - extensions = extensions[1:] - return mark_safe(markdown.markdown( - force_text(value), extensions, safe_mode=True, enable_attributes=False)) - else: - return mark_safe(markdown.markdown( - force_text(value), extensions, safe_mode=False)) - -@register.filter(is_safe=True) -def restructuredtext(value): - import warnings - warnings.warn('The restructuredtext filter has been deprecated', - category=DeprecationWarning) - try: - from docutils.core import publish_parts - except ImportError: - if settings.DEBUG: - raise template.TemplateSyntaxError("Error in 'restructuredtext' filter: The Python docutils library isn't installed.") - return force_text(value) - else: - docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {}) - parts = publish_parts(source=force_bytes(value), writer_name="html4css1", settings_overrides=docutils_settings) - return mark_safe(force_text(parts["fragment"])) diff --git a/django/contrib/markup/tests.py b/django/contrib/markup/tests.py deleted file mode 100644 index 19a3b7e9d0..0000000000 --- a/django/contrib/markup/tests.py +++ /dev/null @@ -1,108 +0,0 @@ -# Quick tests for the markup templatetags (django.contrib.markup) -import re -import warnings - -from django.template import Template, Context -from django import test -from django.utils import unittest -from django.utils.html import escape - -try: - import textile -except ImportError: - textile = None - -try: - import markdown - markdown_version = getattr(markdown, "version_info", 0) -except ImportError: - markdown = None - -try: - import docutils -except ImportError: - docutils = None - -class Templates(test.TestCase): - - textile_content = """Paragraph 1 - -Paragraph 2 with "quotes" and @code@""" - - markdown_content = """Paragraph 1 - -## An h2""" - - rest_content = """Paragraph 1 - -Paragraph 2 with a link_ - -.. _link: http://www.example.com/""" - - def setUp(self): - self.save_warnings_state() - warnings.filterwarnings('ignore', category=DeprecationWarning, module='django.contrib.markup') - - def tearDown(self): - self.restore_warnings_state() - - @unittest.skipUnless(textile, 'textile not installed') - def test_textile(self): - t = Template("{% load markup %}{{ textile_content|textile }}") - rendered = t.render(Context({'textile_content':self.textile_content})).strip() - self.assertEqual(rendered.replace('\t', ''), """

Paragraph 1

- -

Paragraph 2 with “quotes” and code

""") - - @unittest.skipIf(textile, 'textile is installed') - def test_no_textile(self): - t = Template("{% load markup %}{{ textile_content|textile }}") - rendered = t.render(Context({'textile_content':self.textile_content})).strip() - self.assertEqual(rendered, escape(self.textile_content)) - - @unittest.skipUnless(markdown and markdown_version >= (2,1), 'markdown >= 2.1 not installed') - def test_markdown(self): - t = Template("{% load markup %}{{ markdown_content|markdown }}") - rendered = t.render(Context({'markdown_content':self.markdown_content})).strip() - pattern = re.compile("""

Paragraph 1\s*

\s*

\s*An h2

""") - self.assertTrue(pattern.match(rendered)) - - @unittest.skipUnless(markdown and markdown_version >= (2,1), 'markdown >= 2.1 not installed') - def test_markdown_attribute_disable(self): - t = Template("{% load markup %}{{ markdown_content|markdown:'safe' }}") - markdown_content = "{@onclick=alert('hi')}some paragraph" - rendered = t.render(Context({'markdown_content':markdown_content})).strip() - self.assertTrue('@' in rendered) - - @unittest.skipUnless(markdown and markdown_version >= (2,1), 'markdown >= 2.1 not installed') - def test_markdown_attribute_enable(self): - t = Template("{% load markup %}{{ markdown_content|markdown }}") - markdown_content = "{@onclick=alert('hi')}some paragraph" - rendered = t.render(Context({'markdown_content':markdown_content})).strip() - self.assertFalse('@' in rendered) - - @unittest.skipIf(markdown, 'markdown is installed') - def test_no_markdown(self): - t = Template("{% load markup %}{{ markdown_content|markdown }}") - rendered = t.render(Context({'markdown_content':self.markdown_content})).strip() - self.assertEqual(rendered, self.markdown_content) - - @unittest.skipUnless(docutils, 'docutils not installed') - def test_docutils(self): - t = Template("{% load markup %}{{ rest_content|restructuredtext }}") - rendered = t.render(Context({'rest_content':self.rest_content})).strip() - # Different versions of docutils return slightly different HTML - try: - # Docutils v0.4 and earlier - self.assertEqual(rendered, """

Paragraph 1

-

Paragraph 2 with a link

""") - except AssertionError: - # Docutils from SVN (which will become 0.5) - self.assertEqual(rendered, """

Paragraph 1

-

Paragraph 2 with a link

""") - - @unittest.skipIf(docutils, 'docutils is installed') - def test_no_docutils(self): - t = Template("{% load markup %}{{ rest_content|restructuredtext }}") - rendered = t.render(Context({'rest_content':self.rest_content})).strip() - self.assertEqual(rendered, self.rest_content) diff --git a/docs/internals/contributing/writing-code/unit-tests.txt b/docs/internals/contributing/writing-code/unit-tests.txt index afef554a8c..a03951d141 100644 --- a/docs/internals/contributing/writing-code/unit-tests.txt +++ b/docs/internals/contributing/writing-code/unit-tests.txt @@ -145,9 +145,6 @@ If you want to run the full suite of tests, you'll need to install a number of dependencies: * PyYAML_ -* Markdown_ -* Textile_ -* Docutils_ * setuptools_ * memcached_, plus a :ref:`supported Python binding ` * gettext_ (:ref:`gettext_on_windows`) @@ -160,9 +157,6 @@ Each of these dependencies is optional. If you're missing any of them, the associated tests will be skipped. .. _PyYAML: http://pyyaml.org/wiki/PyYAML -.. _Markdown: http://pypi.python.org/pypi/Markdown/1.7 -.. _Textile: http://pypi.python.org/pypi/textile -.. _docutils: http://pypi.python.org/pypi/docutils/0.4 .. _setuptools: http://pypi.python.org/pypi/setuptools/ .. _memcached: http://memcached.org/ .. _gettext: http://www.gnu.org/software/gettext/manual/gettext.html @@ -200,7 +194,7 @@ multiple modules by using a ``tests`` directory in the normal Python way. For the tests to be found, a ``models.py`` file must exist, even if it's empty. If you have URLs that need to be mapped, put them in ``tests/urls.py``. -To run tests for just one contrib app (e.g. ``markup``), use the same +To run tests for just one contrib app (e.g. ``auth``), use the same method as above:: - ./runtests.py --settings=settings markup + ./runtests.py --settings=settings auth diff --git a/docs/ref/contrib/index.txt b/docs/ref/contrib/index.txt index d042fd96ca..e5cea01ead 100644 --- a/docs/ref/contrib/index.txt +++ b/docs/ref/contrib/index.txt @@ -31,7 +31,6 @@ those packages have. formtools/index gis/index humanize - markup messages redirects sitemaps @@ -121,13 +120,6 @@ A set of Django template filters useful for adding a "human touch" to data. See the :doc:`humanize documentation `. -markup -====== - -A collection of template filters that implement common markup languages - -See the :doc:`markup documentation `. - messages ======== diff --git a/docs/ref/contrib/markup.txt b/docs/ref/contrib/markup.txt deleted file mode 100644 index 9215c64f93..0000000000 --- a/docs/ref/contrib/markup.txt +++ /dev/null @@ -1,77 +0,0 @@ -===================== -django.contrib.markup -===================== - -.. module:: django.contrib.markup - :synopsis: A collection of template filters that implement common markup languages. - -.. deprecated:: 1.5 - This module has been deprecated. - -Django provides template filters that implement the following markup -languages: - -* ``textile`` -- implements `Textile`_ -- requires `PyTextile`_ -* ``markdown`` -- implements `Markdown`_ -- requires `Python-markdown`_ (>=2.1) -* ``restructuredtext`` -- implements `reST (reStructured Text)`_ - -- requires `doc-utils`_ - -In each case, the filter expects formatted markup as a string and -returns a string representing the marked-up text. For example, the -``textile`` filter converts text that is marked-up in Textile format -to HTML. - -To activate these filters, add ``'django.contrib.markup'`` to your -:setting:`INSTALLED_APPS` setting. Once you've done that, use -``{% load markup %}`` in a template, and you'll have access to these filters. -For more documentation, read the source code in -:file:`django/contrib/markup/templatetags/markup.py`. - -.. warning:: - - The output of markup filters is marked "safe" and will not be escaped when - rendered in a template. Always be careful to sanitize your inputs and make - sure you are not leaving yourself vulnerable to cross-site scripting or - other types of attacks. - -.. _Textile: http://en.wikipedia.org/wiki/Textile_%28markup_language%29 -.. _Markdown: http://en.wikipedia.org/wiki/Markdown -.. _reST (reStructured Text): http://en.wikipedia.org/wiki/ReStructuredText -.. _PyTextile: http://loopcore.com/python-textile/ -.. _Python-markdown: http://pypi.python.org/pypi/Markdown -.. _doc-utils: http://docutils.sf.net/ - -reStructured Text ------------------ - -When using the ``restructuredtext`` markup filter you can define a -:setting:`RESTRUCTUREDTEXT_FILTER_SETTINGS` in your django settings to -override the default writer settings. See the `restructuredtext writer -settings`_ for details on what these settings are. - -.. warning:: - - reStructured Text has features that allow raw HTML to be included, and that - allow arbitrary files to be included. These can lead to XSS vulnerabilities - and leaking of private information. It is your responsibility to check the - features of this library and configure appropriately to avoid this. See the - `Deploying Docutils Securely - `_ documentation. - -.. _restructuredtext writer settings: http://docutils.sourceforge.net/docs/user/config.html#html4css1-writer - -Markdown --------- - -The Python Markdown library supports options named "safe_mode" and -"enable_attributes". Both relate to the security of the output. To enable both -options in tandem, the markdown filter supports the "safe" argument:: - - {{ markdown_content_var|markdown:"safe" }} - -.. warning:: - - Versions of the Python-Markdown library prior to 2.1 do not support the - optional disabling of attributes. This is a security flaw. Therefore, - ``django.contrib.markup`` has dropped support for versions of - Python-Markdown < 2.1 in Django 1.5. diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 5815062266..bcc2a461c7 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -1502,20 +1502,6 @@ Default: ``()`` (Empty tuple) A tuple of profanities, as strings, that will be forbidden in comments when ``COMMENTS_ALLOW_PROFANITIES`` is ``False``. -.. setting:: RESTRUCTUREDTEXT_FILTER_SETTINGS - -RESTRUCTUREDTEXT_FILTER_SETTINGS --------------------------------- - -Default: ``{}`` - -A dictionary containing settings for the ``restructuredtext`` markup filter from -the :doc:`django.contrib.markup application `. They override -the default writer settings. See the Docutils restructuredtext `writer settings -docs`_ for details. - -.. _writer settings docs: http://docutils.sourceforge.net/docs/user/config.html#html4css1-writer - .. setting:: ROOT_URLCONF ROOT_URLCONF diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 4bbc839bea..867d1e5cc0 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -2356,16 +2356,6 @@ django.contrib.humanize A set of Django template filters useful for adding a "human touch" to data. See :doc:`/ref/contrib/humanize`. -django.contrib.markup -^^^^^^^^^^^^^^^^^^^^^ - -A collection of template filters that implement these common markup languages: - -* Textile -* Markdown -* reST (reStructuredText) - -See the :doc:`markup documentation `. django.contrib.webdesign ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/topics/security.txt b/docs/topics/security.txt index 9c4c4bbd9e..07b8ebcdd2 100644 --- a/docs/topics/security.txt +++ b/docs/topics/security.txt @@ -48,13 +48,6 @@ escaping. You should also be very careful when storing HTML in the database, especially when that HTML is retrieved and displayed. -Markup library --------------- - -If you use :mod:`django.contrib.markup`, you need to ensure that the filters are -only used on trusted input, or that you have correctly configured them to ensure -they do not allow raw HTML output. See the documentation of that module for more -information. Cross site request forgery (CSRF) protection ============================================