summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-30 21:28:24 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-30 21:28:24 -0400
commit4fc5a5f43f7c7900face96e89a2f3791bfc6ff15 (patch)
tree2854caf0b9dcce02f9a59c8b1c20c70777047c3d
parent6181e0faef192126c74d08a2ba6fc7005deb148f (diff)
downloadaskbot-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__.py2
-rw-r--r--askbot/conf/markup.py (renamed from askbot/conf/optional_components.py)30
-rw-r--r--askbot/models/base.py5
-rwxr-xr-xaskbot/skins/default/media/js/wmd/showdown.js24
-rwxr-xr-xaskbot/skins/default/media/js/wmd/wmd.js6
-rw-r--r--askbot/skins/default/templates/answer_edit.html8
-rw-r--r--askbot/skins/default/templates/answer_edit_tips.html20
-rw-r--r--askbot/skins/default/templates/ask.html8
-rw-r--r--askbot/skins/default/templates/question.html7
-rw-r--r--askbot/skins/default/templates/question_edit.html8
-rw-r--r--askbot/skins/default/templates/question_edit_tips.html19
-rw-r--r--askbot/utils/markup.py10
-rw-r--r--askbot/views/readers.py6
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))