diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-08-30 21:28:24 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2010-08-30 21:28:24 -0400 |
commit | 4fc5a5f43f7c7900face96e89a2f3791bfc6ff15 (patch) | |
tree | 2854caf0b9dcce02f9a59c8b1c20c70777047c3d | |
parent | 6181e0faef192126c74d08a2ba6fc7005deb148f (diff) | |
download | askbot-4fc5a5f43f7c7900face96e89a2f3791bfc6ff15.tar.gz askbot-4fc5a5f43f7c7900face96e89a2f3791bfc6ff15.tar.bz2 askbot-4fc5a5f43f7c7900face96e89a2f3791bfc6ff15.zip |
made wmd editor respect code-friendly mode - ignore underscores per separate option and enabling mathjax
-rw-r--r-- | askbot/conf/__init__.py | 2 | ||||
-rw-r--r-- | askbot/conf/markup.py (renamed from askbot/conf/optional_components.py) | 30 | ||||
-rw-r--r-- | askbot/models/base.py | 5 | ||||
-rwxr-xr-x | askbot/skins/default/media/js/wmd/showdown.js | 24 | ||||
-rwxr-xr-x | askbot/skins/default/media/js/wmd/wmd.js | 6 | ||||
-rw-r--r-- | askbot/skins/default/templates/answer_edit.html | 8 | ||||
-rw-r--r-- | askbot/skins/default/templates/answer_edit_tips.html | 20 | ||||
-rw-r--r-- | askbot/skins/default/templates/ask.html | 8 | ||||
-rw-r--r-- | askbot/skins/default/templates/question.html | 7 | ||||
-rw-r--r-- | askbot/skins/default/templates/question_edit.html | 8 | ||||
-rw-r--r-- | askbot/skins/default/templates/question_edit_tips.html | 19 | ||||
-rw-r--r-- | askbot/utils/markup.py | 10 | ||||
-rw-r--r-- | askbot/views/readers.py | 6 |
13 files changed, 120 insertions, 33 deletions
diff --git a/askbot/conf/__init__.py b/askbot/conf/__init__.py index 3798fd3d..67ff56a9 100644 --- a/askbot/conf/__init__.py +++ b/askbot/conf/__init__.py @@ -10,7 +10,7 @@ import askbot.conf.external_keys import askbot.conf.skin_counter_settings import askbot.conf.skin_general_settings import askbot.conf.user_settings -import askbot.conf.optional_components +import askbot.conf.markup #import main settings object from askbot.conf.settings_wrapper import settings diff --git a/askbot/conf/optional_components.py b/askbot/conf/markup.py index d09e433b..df0ad590 100644 --- a/askbot/conf/optional_components.py +++ b/askbot/conf/markup.py @@ -1,6 +1,7 @@ """ -External service key settings +Settings that modify processing of user text input """ + from askbot.conf.settings_wrapper import settings from askbot.deps.livesettings import ConfigurationGroup from askbot.deps.livesettings import BooleanValue, StringValue @@ -9,9 +10,9 @@ import askbot from askbot import const import os -OPTIONAL_COMPONENTS = ConfigurationGroup( - 'OPTIONAL_COMPONENTS', - _('Optional components') +MARKUP = ConfigurationGroup( + 'MARKUP', + _('Input markup formatting') ) mathjax_dir = os.path.join( @@ -23,7 +24,24 @@ mathjax_dir = os.path.join( settings.register( BooleanValue( - OPTIONAL_COMPONENTS, + MARKUP, + 'MARKUP_CODE_FRIENDLY', + description = _('Enable code-friendly Markdown'), + help_text = _( + 'If checked, underscore characters will not ' + 'trigger italic or bold formatting - ' + 'bold and italic text can still be marked up ' + 'with asterisks. Note that "MathJax support" ' + 'implicitly turns this feature on, because ' + 'underscores are heavily used in LaTeX input.' + ), + default = False + ) +) + +settings.register( + BooleanValue( + MARKUP, 'ENABLE_MATHJAX', description=_('Mathjax support (rendering of LaTeX)'), help_text=_( @@ -40,7 +58,7 @@ settings.register( settings.register( StringValue( - OPTIONAL_COMPONENTS, + MARKUP, 'MATHJAX_BASE_URL', description=_('Base url of MathJax deployment'), help_text=_( diff --git a/askbot/models/base.py b/askbot/models/base.py index e1701298..c54d344d 100644 --- a/askbot/models/base.py +++ b/askbot/models/base.py @@ -9,9 +9,6 @@ from askbot.utils import markup from askbot.utils.html import sanitize_html from django.utils import html import logging -from markdown2 import Markdown - -markdowner = Markdown(html4tags=True) #todo: following methods belong to a future common post class def parse_post_text(post): @@ -36,7 +33,7 @@ def parse_post_text(post): text = html.urlize(text) if post._use_markdown: - text = sanitize_html(markdowner.convert(text)) + text = sanitize_html(markup.get_parser().convert(text)) #todo, add markdown parser call conditional on #post.use_markdown flag diff --git a/askbot/skins/default/media/js/wmd/showdown.js b/askbot/skins/default/media/js/wmd/showdown.js index 3f4b9947..e2c6fb61 100755 --- a/askbot/skins/default/media/js/wmd/showdown.js +++ b/askbot/skins/default/media/js/wmd/showdown.js @@ -396,7 +396,6 @@ var _RunSpanGamut = function(text) { // Do hard breaks: text = text.replace(/ +\n/g," <br />\n"); - return text; } @@ -980,14 +979,23 @@ var _EncodeCode = function(text) { var _DoItalicsAndBold = function(text) { - // <strong> must go first: - text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\1/g, - "<strong>$2</strong>"); + // <strong> must go first: + if (codeFriendlyMarkdown === true){ + text = text.replace(/(\*\*)(?=\S)([^\r]*?\S[\*]*)\1/g, + "<strong>$2</strong>"); - text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, - "<em>$2</em>"); + text = text.replace(/(\*)(?=\S)([^\r]*?\S)\1/g, + "<em>$2</em>"); + } + else { + text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\1/g, + "<strong>$2</strong>"); - return text; + text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, + "<em>$2</em>"); + } + + return text; } @@ -1306,4 +1314,4 @@ var Showdown = Attacklab.showdown; // If anyone's interested, tell the world that this file's been loaded if (Attacklab.fileLoaded) { Attacklab.fileLoaded("showdown.js"); -}
\ No newline at end of file +} diff --git a/askbot/skins/default/media/js/wmd/wmd.js b/askbot/skins/default/media/js/wmd/wmd.js index e4ed2764..51eff35d 100755 --- a/askbot/skins/default/media/js/wmd/wmd.js +++ b/askbot/skins/default/media/js/wmd/wmd.js @@ -72,7 +72,7 @@ Attacklab.wmdBase = function(){ var helpLink = "http://wmd-editor.com/"; var helpHoverTitle = "WMD website"; var helpTarget = "_blank"; - + // ------------------------------------------------------------------- // END OF YOUR CHANGES // ------------------------------------------------------------------- @@ -1237,11 +1237,13 @@ Attacklab.wmdBase = function(){ var callback = function(){ inputBox.value = text; + //value is assigned here }; if (!/markdown/.test(wmd.wmd_env.output.toLowerCase())) { if (markdownConverter) { inputBox.value = markdownConverter.makeHtml(text); + //value is assigned here top.setTimeout(callback, 0); } } @@ -1391,6 +1393,7 @@ Attacklab.wmdBase = function(){ if (stateObj.text !== undefined && stateObj.text != inputArea.value) { inputArea.value = stateObj.text; + //value is assigned here } this.setInputAreaSelection(); inputArea.scrollTop = stateObj.scrollTop; @@ -1952,6 +1955,7 @@ Attacklab.wmdBase = function(){ // The value property is only defined if the output is a textarea. if (wmd.panels.output.value !== undefined) { wmd.panels.output.value = text; + //value is assigned here wmd.panels.output.readOnly = true; } // Otherwise we are just replacing the text in a div. diff --git a/askbot/skins/default/templates/answer_edit.html b/askbot/skins/default/templates/answer_edit.html index 9d46bb17..406591e6 100644 --- a/askbot/skins/default/templates/answer_edit.html +++ b/askbot/skins/default/templates/answer_edit.html @@ -2,11 +2,19 @@ <!-- template answer_edit.html --> {% load i18n %} {% load extra_tags %} +{% load smart_if %} {% block title %}{% spaceless %}{% trans "Edit answer" %}{% endspaceless %}{% endblock %} {% block forejs %} <script type='text/javascript' src='{% media "/js/com.cnprog.editor.js" %}'></script> <script type='text/javascript' src='{% media "/js/com.cnprog.post.js" %}'></script> <script type='text/javascript' src='{% media "/js/jquery.validate.pack.js" %}'></script> + <script type='text/javascript'> + {% if settings.ENABLE_MATHJAX or settings.MARKUP_CODE_FRIENDLY %} + var codeFriendlyMarkdown = true; + {% else %} + var codeFriendlyMarkdown = false; + {% endif %} + </script> <script type='text/javascript' src='{% media "/js/wmd/showdown.js" %}'></script> <script type='text/javascript' src='{% media "/js/wmd/wmd.js" %}'></script> <link rel="stylesheet" type="text/css" href="{% media "/js/wmd/wmd.css" %}" /> diff --git a/askbot/skins/default/templates/answer_edit_tips.html b/askbot/skins/default/templates/answer_edit_tips.html index c390da06..b0b4ae43 100644 --- a/askbot/skins/default/templates/answer_edit_tips.html +++ b/askbot/skins/default/templates/answer_edit_tips.html @@ -1,5 +1,6 @@ <!-- template answer_edit_tips.html --> {% load i18n %} +{% load smart_if %} <div class="boxC"> <p class="subtitle darkred">{% trans "answer tips" %}</p> <div> @@ -13,7 +14,7 @@ {% trans "please try to provide details" %} </li> <li> - {% trans "be clear and concise" %} + {% trans "be clear and concise" %} </li> </ul> <p class='info-box-follow-up-links'> @@ -25,12 +26,21 @@ <div class="boxC"> <p class="subtitle">{% trans "Markdown tips" %}</p> <ul class="list-item"> + {% if settings.MARKUP_CODE_FRIENDLY or settings.ENABLE_MATHJAX %} <li> - {% trans "*italic* or __italic__" %} + {% trans "*italic*" %} </li> <li> - {% trans "**bold** or __bold__" %} + {% trans "**bold**" %} </li> + {% else %} + <li> + {% trans "*italic* or _italic_" %} + </li> + <li> + {% trans "**bold** or __bold__" %} + </li> + {% endif %} <li> <b>{% trans "link" %}</b>:[{% trans "text" %}](http://url.com/ "{% trans "title" %}") @@ -40,12 +50,12 @@ </li> <li> - {% trans "numbered list:" %} + {% trans "numbered list:" %} 1. Foo 2. Bar </li> <li> - {% trans "basic HTML tags are also supported" %} + {% trans "basic HTML tags are also supported" %} </li> </ul> <p class='info-box-follow-up-links'> diff --git a/askbot/skins/default/templates/ask.html b/askbot/skins/default/templates/ask.html index 122cc286..7c314aa5 100644 --- a/askbot/skins/default/templates/ask.html +++ b/askbot/skins/default/templates/ask.html @@ -2,11 +2,19 @@ <!-- template ask.html --> {% load i18n %} {% load extra_tags %} +{% load smart_if %} {% block title %}{% spaceless %}{% trans "Ask a question" %}{% endspaceless %}{% endblock %} {% block forejs %} <script type='text/javascript' src='{% media "/js/com.cnprog.editor.js" %}'></script> <script type='text/javascript' src='{% media "/js/com.cnprog.post.js" %}'></script> <script type='text/javascript' src='{% media "/js/jquery.validate.pack.js" %}'></script> + <script type='text/javascript'> + {% if settings.ENABLE_MATHJAX or settings.MARKUP_CODE_FRIENDLY %} + var codeFriendlyMarkdown = true; + {% else %} + var codeFriendlyMarkdown = false; + {% endif %} + </script> <script type='text/javascript' src='{% media "/js/wmd/showdown.js" %}'></script> <script type='text/javascript' src='{% media "/js/wmd/wmd.js" %}'></script> <link rel="stylesheet" type="text/css" href="{% media "/js/wmd/wmd.css" %}" /> diff --git a/askbot/skins/default/templates/question.html b/askbot/skins/default/templates/question.html index 881a36f0..d7bc42fb 100644 --- a/askbot/skins/default/templates/question.html +++ b/askbot/skins/default/templates/question.html @@ -15,6 +15,13 @@ <link rel="canonical" href="{{settings.APP_URL}}{{question.get_absolute_url}}" /> {% if not question.closed %} <script type='text/javascript' src='{% media "/js/com.cnprog.editor.js" %}'></script> + <script type='text/javascript'> + {% if settings.ENABLE_MATHJAX or settings.MARKUP_CODE_FRIENDLY %} + var codeFriendlyMarkdown = true; + {% else %} + var codeFriendlyMarkdown = false; + {% endif %} + </script> <script type='text/javascript' src='{% media "/js/wmd/showdown.js" %}'></script> <script type='text/javascript' src='{% media "/js/wmd/wmd.js" %}'></script> <link rel="stylesheet" type="text/css" href="{% media "/js/wmd/wmd.css" %}" /> diff --git a/askbot/skins/default/templates/question_edit.html b/askbot/skins/default/templates/question_edit.html index aba4c3e5..47f6f349 100644 --- a/askbot/skins/default/templates/question_edit.html +++ b/askbot/skins/default/templates/question_edit.html @@ -2,11 +2,19 @@ <!-- question_edit.html --> {% load i18n %} {% load extra_tags %} +{% load smart_if %} {% block title %}{% spaceless %}{% trans "Edit question" %}{% endspaceless %}{% endblock %} {% block forejs %} <script type='text/javascript' src='{% media "/js/com.cnprog.editor.js" %}'></script> <script type='text/javascript' src='{% media "/js/com.cnprog.post.js" %}'></script> <script type='text/javascript' src='{% media "/js/jquery.validate.pack.js" %}'></script> + <script type='text/javascript'> + {% if settings.ENABLE_MATHJAX or settings.MARKUP_CODE_FRIENDLY %} + var codeFriendlyMarkdown = true; + {% else %} + var codeFriendlyMarkdown = false; + {% endif %} + </script> <script type='text/javascript' src='{% media "/js/wmd/showdown.js" %}'></script> <script type='text/javascript' src='{% media "/js/wmd/wmd.js" %}'></script> <link rel="stylesheet" type="text/css" href="{% media "/js/wmd/wmd.css" %}" /> diff --git a/askbot/skins/default/templates/question_edit_tips.html b/askbot/skins/default/templates/question_edit_tips.html index 4cabea79..9085fe1e 100644 --- a/askbot/skins/default/templates/question_edit_tips.html +++ b/askbot/skins/default/templates/question_edit_tips.html @@ -10,7 +10,7 @@ {% trans "please try provide enough details" %} </li> <li> - {% trans "be clear and concise" %} + {% trans "be clear and concise" %} </li> </ul> <p class='info-box-follow-up-links'> @@ -22,12 +22,21 @@ <div class="boxC"> <p class="subtitle">{% trans "Markdown tips" %}</p> <ul class="list-item"> + {% if settings.MARKDUP_CODE_FRIENDLY or settings.ENABLE_MATHJAX %} <li> - {% trans "*italic* or __italic__" %} + {% trans "*italic*" %} </li> <li> - {% trans "**bold** or __bold__" %} + {% trans "**bold**" %} </li> + {% else %} + <li> + {% trans "*italic* or _italic_" %} + </li> + <li> + {% trans "**bold** or __bold__" %} + </li> + {% endif %} <li> <b>{% trans "link" %}</b>:[{% trans "text" %}](http://url.com/ "{% trans "title" %}") @@ -38,12 +47,12 @@ </li> <li> - {% trans "numbered list:" %} + {% trans "numbered list:" %} 1. Foo 2. Bar </li> <li> - {% trans "basic HTML tags are also supported" %} + {% trans "basic HTML tags are also supported" %} </li> </ul> <p class='info-box-follow-up-links'> diff --git a/askbot/utils/markup.py b/askbot/utils/markup.py index 85e37393..86c4c3b8 100644 --- a/askbot/utils/markup.py +++ b/askbot/utils/markup.py @@ -1,4 +1,14 @@ from askbot import const +from askbot.conf import settings as askbot_settings +from markdown2 import Markdown + +def get_parser(): + if askbot_settings.ENABLE_MATHJAX or \ + askbot_settings.MARKUP_CODE_FRIENDLY: + return Markdown(html4tags=True, extras=['code-friendly',]) + else: + return Markdown(html4tags=True) + def format_mention_in_html(mentioned_user): url = mentioned_user.get_profile_url() diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 7cf7038f..e2380e85 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -24,13 +24,13 @@ from django.views.decorators.cache import cache_page from django.core import exceptions as django_exceptions from askbot.utils.html import sanitize_html -from markdown2 import Markdown #from lxml.html.diff import htmldiff from askbot.utils.diff import textDiff as htmldiff from askbot.forms import * from askbot.models import * from askbot import const from askbot import auth +from askbot.utils import markup from askbot.utils.forms import get_next_url from askbot.utils.functions import not_a_robot_request from askbot.utils.decorators import profile @@ -47,8 +47,6 @@ DEFAULT_PAGE_SIZE = 60 # used in answers ANSWERS_PAGE_SIZE = 10 -markdowner = Markdown(html4tags=True) - #system to display main content def _get_tags_cache_json():#service routine used by views requiring tag list in the javascript space """returns list of all tags in json format @@ -393,6 +391,7 @@ def question_revisions(request, id): post = get_object_or_404(Question, id=id) revisions = list(post.revisions.all()) revisions.reverse() + markdowner = markup.get_parser() for i, revision in enumerate(revisions): revision.html = QUESTION_REVISION_TEMPLATE % { 'title': revision.title, @@ -422,6 +421,7 @@ def answer_revisions(request, id): post = get_object_or_404(Answer, id=id) revisions = list(post.revisions.all()) revisions.reverse() + markdowner = markup.get_parser() for i, revision in enumerate(revisions): revision.html = ANSWER_REVISION_TEMPLATE % { 'html': sanitize_html(markdowner.convert(revision.text)) |