Commit be3b35d2 by Thomas Lottermann

Merge remote-tracking branch 'upstream/master'

parents b7c24ed4 d07ba79a
...@@ -6,6 +6,7 @@ README.rst ...@@ -6,6 +6,7 @@ README.rst
testproject/testproject/whoosh_index/ testproject/testproject/whoosh_index/
testproject/testproject/xapian_index/ testproject/testproject/xapian_index/
#Docs #Docs
docs/_build docs/_build
docs/_build/* docs/_build/*
......
...@@ -15,7 +15,7 @@ WIKI_LANGUAGE = 'markdown' ...@@ -15,7 +15,7 @@ WIKI_LANGUAGE = 'markdown'
EDITOR = getattr( django_settings, 'WIKI_EDITOR', 'wiki.editors.markitup.MarkItUp' ) EDITOR = getattr( django_settings, 'WIKI_EDITOR', 'wiki.editors.markitup.MarkItUp' )
MARKDOWN_KWARGS = { MARKDOWN_KWARGS = {
'extensions': ['footnotes', 'attr_list', 'headerid', 'extra',], 'extensions': ['footnotes', 'attr_list', 'headerid', 'extra', 'codehilite',],
'safe_mode': 'replace', 'safe_mode': 'replace',
'extension_configs': {'toc': {'title': _('Table of Contents')}}, 'extension_configs': {'toc': {'title': _('Table of Contents')}},
} }
......
nothing in here, don't use it!
\ No newline at end of file
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Wikipath Extension for Python-Markdown
======================================
Converts [Link Name](wiki:ArticleName) to relative links pointing to article. Requires Python-Markdown 2.0+
Basic usage:
>>> import markdown
>>> text = "Some text with a [Link Name](wiki:ArticleName)."
>>> html = markdown.markdown(text, ['wikipath(base_url="/wiki/view/")'])
>>> html
u'<p>Some text with a <a class="wikipath" href="/wiki/view/ArticleName/">Link Name</a>.</p>'
Dependencies:
* [Python 2.3+](http://python.org)
* [Markdown 2.0+](http://www.freewisdom.org/projects/python-markdown/)
'''
import markdown
from os import path as os_path
try:
# Markdown 2.1.0 changed from 2.0.3. We try importing the new version first,
# but import the 2.0.3 version if it fails
from markdown.util import etree #@UnusedImport
except ImportError:
from markdown import etree #@UnresolvedImport @Reimport @UnusedImport
class WikiPathExtension(markdown.Extension):
def __init__(self, configs):
# set extension defaults
self.config = {
'base_url' : ['/', 'String to append to beginning of URL.'],
'html_class' : ['wikipath', 'CSS hook. Leave blank for none.'],
'default_level' : [2, 'The level that most articles are created at. Relative links will tend to start at that level.']
}
# Override defaults with user settings
for key, value in configs :
# self.config[key][0] = value
self.setConfig(key, value)
def extendMarkdown(self, md, md_globals):
self.md = md
# append to end of inline patterns
WIKI_RE = r'\[(?P<linkTitle>[^\]]+?)\]\(wiki:(?P<wikiTitle>[a-zA-Z\d\./_-]*?)\)'
wikiPathPattern = WikiPath(WIKI_RE, self.config, markdown_instance=md)
wikiPathPattern.md = md
md.inlinePatterns.add('djangowikipath', wikiPathPattern, "<reference")
class WikiPath(markdown.inlinepatterns.Pattern):
def __init__(self, pattern, config, **kwargs):
markdown.inlinepatterns.Pattern.__init__(self, pattern, **kwargs)
self.config = config
def handleMatch(self, m) :
from wiki import models
article_title = m.group('wikiTitle')
absolute = False
if article_title.startswith("/"):
absolute = True
article_title = article_title.strip("/")
# Use this to calculate some kind of meaningful path
# from the link, regardless of whether or not something can be
# looked up
path_from_link = ""
if absolute:
base_path = self.config['base_url'][0]
path_from_link = os_path.join(base_path, article_title)
urlpath = None
path = path_from_link
try:
urlpath = models.URLPath.get_by_path(article_title)
path = urlpath.get_absolute_url()
except models.URLPath.DoesNotExist:
pass
else:
urlpath = models.URLPath.objects.get(article=self.markdown.article)
source_components = urlpath.path.strip("/").split("/")
# We take the first (self.config['default_level'] - 1) components, so adding
# one more component would make a path of length self.config['default_level']
starting_level = max(0, self.config['default_level'][0] - 1 )
starting_path = "/".join(source_components[ : starting_level ])
path_from_link = os_path.join(starting_path, article_title)
lookup = models.URLPath.objects.none()
if urlpath.parent:
lookup = urlpath.parent.get_descendants().filter(slug=article_title)
else:
lookup = urlpath.get_descendants().filter(slug=article_title)
if lookup.count() > 0:
urlpath = lookup[0]
path = urlpath.get_absolute_url()
else:
urlpath = None
path = self.config['base_url'][0] + path_from_link
label = m.group('linkTitle')
a = etree.Element('a')
a.set('href', path)
if not urlpath:
a.set('class', self.config['html_class'][0] + " linknotfound")
else:
a.set('class', self.config['html_class'][0])
a.text = label
return a
def _getMeta(self):
""" Return meta data or config data. """
base_url = self.config['base_url'][0]
html_class = self.config['html_class'][0]
if hasattr(self.md, 'Meta'):
if self.md.Meta.has_key('wiki_base_url'):
base_url = self.md.Meta['wiki_base_url'][0]
if self.md.Meta.has_key('wiki_html_class'):
html_class = self.md.Meta['wiki_html_class'][0]
return base_url, html_class
def makeExtension(configs=None) :
return WikiPathExtension(configs=configs)
if __name__ == "__main__":
import doctest
doctest.testmod()
# -*- coding: utf-8 -*-
"""
Code modified from:
https://github.com/r0wb0t/markdown-urlize
A more liberal autolinker
Inspired by Django's urlize function.
Positive examples:
>>> import markdown
>>> md = markdown.Markdown(extensions=['urlize'])
>>> md.convert('http://example.com/')
u'<p><a href="http://example.com/">http://example.com/</a></p>'
>>> md.convert('go to http://example.com')
u'<p>go to <a href="http://example.com">http://example.com</a></p>'
>>> md.convert('example.com')
u'<p><a href="http://example.com">example.com</a></p>'
>>> md.convert('example.net')
u'<p><a href="http://example.net">example.net</a></p>'
>>> md.convert('www.example.us')
u'<p><a href="http://www.example.us">www.example.us</a></p>'
>>> md.convert('(www.example.us/path/?name=val)')
u'<p>(<a href="http://www.example.us/path/?name=val">www.example.us/path/?name=val</a>)</p>'
>>> md.convert('go to <http://example.com> now!')
u'<p>go to <a href="http://example.com">http://example.com</a> now!</p>'
Negative examples:
>>> md.convert('del.icio.us')
u'<p>del.icio.us</p>'
"""
import markdown
# Global Vars
URLIZE_RE = '(%s)' % '|'.join([
r'<(?:f|ht)tps?://[^>\'"]*>',
r'\b(?:f|ht)tps?://[^)<>\s\'"]+[^.,)<>\s\'"]',
r'\bwww\.[^)<>\s]+[^.,)<>\s\'"]',
r'[^(<\s\'"]+\.(?:com|net|org)\b',
])
class UrlizePattern(markdown.inlinepatterns.Pattern):
""" Return a link Element given an autolink (`http://example/com`). """
def handleMatch(self, m):
url = m.group(2)
if url.startswith('<'):
url = url[1:-1]
text = url
if not url.split('://')[0] in ('http','https','ftp'):
if '@' in url and not '/' in url:
url = 'mailto:' + url
else:
url = 'http://' + url
icon = markdown.util.etree.Element("span")
icon.set('class', 'icon-globe')
span_text = markdown.util.etree.Element("span")
span_text.text = markdown.util.AtomicString(" " + text)
el = markdown.util.etree.Element("a")
el.set('href', url)
el.set('target', '_blank')
el.append(icon)
el.append(span_text)
return el
class UrlizeExtension(markdown.Extension):
""" Urlize Extension for Python-Markdown. """
def extendMarkdown(self, md, md_globals):
""" Replace autolink with UrlizePattern """
md.inlinePatterns['autolink'] = UrlizePattern(URLIZE_RE, md)
def makeExtension(configs=None):
return UrlizeExtension(configs=configs)
if __name__ == "__main__":
import doctest
doctest.testmod()
\ No newline at end of file
from django.db import models
# Create your models here.
from django.conf import settings as django_settings
LOOKUP_LEVEL = getattr(django_settings, 'WIKI_LINKS_LOOKUP_LEVEL', 2)
{% load i18n sekizai_tags %}
{% load url from future %}
<h4>{% trans "Link to another wiki page" %}</h4>
<p>
{% trans "Type in something from another wiki page's title and auto-complete will help you create a tag for you wiki link. Tags for links look like this:" %}<br />
</p>
<pre>[Title of link](wiki:ArticleSlug)</pre>
<p>
<input type="text" class="page_title_query" id="links_page_title_query" value="" placeholder="Type to search..." style="max-width: 90%;" />
<button type="button" class="btn btn-default" onclick="wikiInsertLink()">
{% trans "Insert" %}
</button>
</p>
<hr />
<h4>{% trans "An external link" %}</h4>
<p>
{% trans "You can link to another website simply by inserting an address example.com or http://example.com or by using the markdown syntax:" %}<br />
</p>
<pre>[Clickable text](http://example.com)</pre>
{% addtoblock "js" %}
<script type="text/javascript">
$('.page_title_query').typeahead({
source: function (query, process) {
return $.get('{% url 'wiki:links_query_urlpath' path=urlpath.path article_id=article.id %}', { query: query }, function (data) {
return process(data);
});
}
});
function wikiInsertLink() {
$('#id_content').insertAtCaret($('#links_page_title_query').val());
}
</script>
{% endaddtoblock %}
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
from wiki.decorators import json_view, get_article
from django.views.generic.base import View
from django.utils.decorators import method_decorator
class QueryUrlPath(View):
# TODO: get_article does not actually support JSON responses
@method_decorator(json_view)
@method_decorator(get_article(can_read=True))
def dispatch(self, request, article, *args, **kwargs):
max_num = kwargs.pop('max_num', 20)
# TODO: Move this import when circularity issue is resolved
# https://github.com/benjaoming/django-wiki/issues/23
from wiki import models
query = request.GET.get('query', None)
if query:
matches = models.URLPath.objects.can_read(request.user).active().filter(
article__current_revision__title__contains=query,
article__current_revision__deleted=False,
)
matches = matches.select_related_common()
return [("[%s](wiki:%s)") % (m.article.current_revision.title, '/'+m.path.strip("/")) for m in matches[:max_num]]
return []
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from django.utils.translation import ugettext as _
from wiki.core.plugins import registry
from wiki.core.plugins.base import BasePlugin
from wiki.plugins.links import views
from wiki.plugins.links import settings
from wiki.plugins.links.mdx.urlize import makeExtension as urlize_makeExtension
from wiki.plugins.links.mdx.djangowikilinks import WikiPathExtension
from django.core.urlresolvers import reverse_lazy
class LinkPlugin(BasePlugin):
slug = 'links'
urlpatterns = {
'article': patterns('',
url(r'^json/query-urlpath/$', views.QueryUrlPath.as_view(), name='links_query_urlpath')
),
}
sidebar = {'headline': _('Links'),
'icon_class': 'icon-bookmark',
'template': 'wiki/plugins/links/sidebar.html',
'form_class': None,
'get_form_kwargs': (lambda a: {})}
wikipath_config = [
('base_url', reverse_lazy('wiki:get', kwargs={'path': ''}) ),
('default_level', settings.LOOKUP_LEVEL ),
]
markdown_extensions = [urlize_makeExtension(), WikiPathExtension(wikipath_config)]
def __init__(self):
pass
registry.register(LinkPlugin)
...@@ -8,12 +8,16 @@ ...@@ -8,12 +8,16 @@
<pre>[Title of link](wiki:ArticleSlug)</pre> <pre>[Title of link](wiki:ArticleSlug)</pre>
<p> <div class="row">
<input type="text" class="page_title_query" id="links_page_title_query" value="" placeholder="Type to search..." style="max-width: 90%;" /> <div class="input-group col-sm-12">
<button type="button" class="btn btn-default" onclick="wikiInsertLink()"> <input type="text" class="page_title_query form-control" id="links_page_title_query" value="" placeholder="Type to search..." />
{% trans "Insert" %} <span class="input-group-btn">
</button> <button type="button" class="btn btn-default" onclick="wikiInsertLink()">
</p> {% trans "Insert" %}
</button>
</span>
</div>
</div>
<hr /> <hr />
...@@ -24,15 +28,15 @@ ...@@ -24,15 +28,15 @@
</p> </p>
<pre>[Clickable text](http://example.com)</pre> <pre>[Clickable text](http://example.com)</pre>
{% addtoblock "js" %}<script type="text/javascript" src="{{ STATIC_URL }}wiki/js/typeahead.min.js"></script>{% endaddtoblock %}
{% addtoblock "js" %} {% addtoblock "js" %}
<script type="text/javascript"> <script type="text/javascript">
$('.page_title_query').typeahead({ $(document).ready(function() {
source: function (query, process) { $('.page_title_query').typeahead({
return $.get('{% url 'wiki:links_query_urlpath' path=urlpath.path article_id=article.id %}', { query: query }, function (data) { remote: "{% url 'wiki:links_query_urlpath' path=urlpath.path article_id=article.id %}?query=%QUERY",
return process(data); dataType: String
}); });
} });
});
function wikiInsertLink() { function wikiInsertLink() {
$('#id_content').insertAtCaret($('#links_page_title_query').val()); $('#id_content').insertAtCaret($('#links_page_title_query').val());
......
...@@ -83,3 +83,12 @@ class MacroPreprocessor(markdown.preprocessors.Preprocessor): ...@@ -83,3 +83,12 @@ class MacroPreprocessor(markdown.preprocessors.Preprocessor):
example_code = _(u'[TOC]'), example_code = _(u'[TOC]'),
args = {} args = {}
) )
def wikilink(self):
return ""
toc.meta = dict(
short_description = _(u'WikiLinks'),
help_text = _(u'Insert a link to another wiki page with a short notation.'),
example_code = _(u'[[WikiLink]]'),
args = {}
)
...@@ -118,11 +118,6 @@ class TocTreeprocessor(markdown.treeprocessors.Treeprocessor): ...@@ -118,11 +118,6 @@ class TocTreeprocessor(markdown.treeprocessors.Treeprocessor):
c.append(anchor) c.append(anchor)
def build_toc_etree(self, div, toc_list): def build_toc_etree(self, div, toc_list):
# Add title to the div
if self.config["title"]:
header = etree.SubElement(div, "span")
header.attrib["class"] = "toctitle"
header.text = self.config["title"]
def build_etree_ul(toc_list, parent): def build_etree_ul(toc_list, parent):
ul = etree.SubElement(parent, "ul") ul = etree.SubElement(parent, "ul")
...@@ -172,7 +167,7 @@ class TocTreeprocessor(markdown.treeprocessors.Treeprocessor): ...@@ -172,7 +167,7 @@ class TocTreeprocessor(markdown.treeprocessors.Treeprocessor):
p[i] = div p[i] = div
break break
marker_found = True marker_found = True
if header_rgx.match(c.tag): if header_rgx.match(c.tag):
# Do not override pre-existing ids # Do not override pre-existing ids
...@@ -233,7 +228,7 @@ class TocExtension(markdown.Extension): ...@@ -233,7 +228,7 @@ class TocExtension(markdown.Extension):
# by the header id extension) if both are used. Same goes for # by the header id extension) if both are used. Same goes for
# attr_list extension. This must come last because we don't want # attr_list extension. This must come last because we don't want
# to redefine ids after toc is created. But we do want toc prettified. # to redefine ids after toc is created. But we do want toc prettified.
md.treeprocessors.add("toc", tocext, "<prettify") md.treeprocessors.add("toc", tocext, ">headerid")
def makeExtension(configs={}): def makeExtension(configs={}):
......
#!/usr/bin/env python
"""
Extend the shipped Markdown extension 'wikilinks'
"""
from markdown.extensions import wikilinks
import markdown
import re
def build_url(label, base, end, md):
""" Build a url from the label, a base, and an end. """
clean_label = re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', label)
urlpaths = md.article.urlpath_set.all()
# Nevermind about the base we are fed, just keep the original
# call pattern from the wikilinks plugin for later...
base='/'
for urlpath in urlpaths:
if urlpath.children.filter(slug=clean_label).exists():
base=''
break
return '%s%s%s'% (base, clean_label, end)
class WikiLinkExtension(wikilinks.WikiLinkExtension):
def __init__(self, configs={}):
# set extension defaults
self.config = {
'base_url' : ['', 'String to append to beginning or URL.'],
'end_url' : ['/', 'String to append to end of URL.'],
'html_class' : ['wiki_wikilink', 'CSS hook. Leave blank for none.'],
'build_url' : [build_url, 'Callable formats URL from label.'],
}
# Override defaults with user settings
for key, value in configs :
self.setConfig(key, value)
def extendMarkdown(self, md, md_globals):
self.md = md
# append to end of inline patterns
WIKILINK_RE = r'\[\[([\w0-9_ -]+)\]\]'
wikilinkPattern = WikiLinks(WIKILINK_RE, self.getConfigs())
wikilinkPattern.md = md
md.inlinePatterns.add('wikilink', wikilinkPattern, "<not_strong")
class WikiLinks(wikilinks.WikiLinks):
def handleMatch(self, m):
if m.group(2).strip():
base_url, end_url, html_class = self._getMeta()
label = m.group(2).strip()
url = self.config['build_url'](label, base_url, end_url, self.md)
a = markdown.util.etree.Element('a')
a.text = label
a.set('href', url)
if html_class:
a.set('class', html_class)
else:
a = ''
return a
...@@ -7,6 +7,7 @@ from wiki.plugins.macros import settings ...@@ -7,6 +7,7 @@ from wiki.plugins.macros import settings
from wiki.plugins.macros.mdx.macro import MacroExtension from wiki.plugins.macros.mdx.macro import MacroExtension
from wiki.plugins.macros.mdx.toc import WikiTocExtension from wiki.plugins.macros.mdx.toc import WikiTocExtension
from wiki.plugins.macros.mdx.wikilinks import WikiLinkExtension
class MacroPlugin(BasePlugin): class MacroPlugin(BasePlugin):
...@@ -18,7 +19,7 @@ class MacroPlugin(BasePlugin): ...@@ -18,7 +19,7 @@ class MacroPlugin(BasePlugin):
'form_class': None, 'form_class': None,
'get_form_kwargs': (lambda a: {})} 'get_form_kwargs': (lambda a: {})}
markdown_extensions = [MacroExtension(), WikiTocExtension()] markdown_extensions = [WikiLinkExtension(), MacroExtension(), WikiTocExtension()]
def __init__(self): def __init__(self):
pass pass
......
...@@ -4403,7 +4403,8 @@ textarea.wiki-form-block select { ...@@ -4403,7 +4403,8 @@ textarea.wiki-form-block select {
border-radius: 3px; border-radius: 3px;
} }
/* General styling, any kind of form input */ /* General styling, any kind of form input */
.wiki-control input { .wiki-control input[type=text],
.wiki-control input[type=password] {
height: 38px; height: 38px;
padding: 8px 12px; padding: 8px 12px;
font-size: 14px; font-size: 14px;
...@@ -4414,6 +4415,7 @@ textarea.wiki-form-block select { ...@@ -4414,6 +4415,7 @@ textarea.wiki-form-block select {
display: inline-block; display: inline-block;
} }
.form-horizontal .wiki-control input[type='text'], .form-horizontal .wiki-control input[type='text'],
.form-horizontal .wiki-control input[type='password'],
.form-horizontal .wiki-control select, .form-horizontal .wiki-control select,
.form-horizontal .wiki-control textarea { .form-horizontal .wiki-control textarea {
display: block; display: block;
...@@ -4435,26 +4437,31 @@ textarea.wiki-form-block select { ...@@ -4435,26 +4437,31 @@ textarea.wiki-form-block select {
display: inline-block; display: inline-block;
} }
.form-horizontal .wiki-control input[type='text']:-moz-placeholder, .form-horizontal .wiki-control input[type='text']:-moz-placeholder,
.form-horizontal .wiki-control input[type='password']:-moz-placeholder,
.form-horizontal .wiki-control select:-moz-placeholder, .form-horizontal .wiki-control select:-moz-placeholder,
.form-horizontal .wiki-control textarea:-moz-placeholder { .form-horizontal .wiki-control textarea:-moz-placeholder {
color: #999999; color: #999999;
} }
.form-horizontal .wiki-control input[type='text']::-moz-placeholder, .form-horizontal .wiki-control input[type='text']::-moz-placeholder,
.form-horizontal .wiki-control input[type='password']::-moz-placeholder,
.form-horizontal .wiki-control select::-moz-placeholder, .form-horizontal .wiki-control select::-moz-placeholder,
.form-horizontal .wiki-control textarea::-moz-placeholder { .form-horizontal .wiki-control textarea::-moz-placeholder {
color: #999999; color: #999999;
} }
.form-horizontal .wiki-control input[type='text']:-ms-input-placeholder, .form-horizontal .wiki-control input[type='text']:-ms-input-placeholder,
.form-horizontal .wiki-control input[type='password']:-ms-input-placeholder,
.form-horizontal .wiki-control select:-ms-input-placeholder, .form-horizontal .wiki-control select:-ms-input-placeholder,
.form-horizontal .wiki-control textarea:-ms-input-placeholder { .form-horizontal .wiki-control textarea:-ms-input-placeholder {
color: #999999; color: #999999;
} }
.form-horizontal .wiki-control input[type='text']::-webkit-input-placeholder, .form-horizontal .wiki-control input[type='text']::-webkit-input-placeholder,
.form-horizontal .wiki-control input[type='password']::-webkit-input-placeholder,
.form-horizontal .wiki-control select::-webkit-input-placeholder, .form-horizontal .wiki-control select::-webkit-input-placeholder,
.form-horizontal .wiki-control textarea::-webkit-input-placeholder { .form-horizontal .wiki-control textarea::-webkit-input-placeholder {
color: #999999; color: #999999;
} }
.form-horizontal .wiki-control input[type='text']:focus, .form-horizontal .wiki-control input[type='text']:focus,
.form-horizontal .wiki-control input[type='password']:focus,
.form-horizontal .wiki-control select:focus, .form-horizontal .wiki-control select:focus,
.form-horizontal .wiki-control textarea:focus { .form-horizontal .wiki-control textarea:focus {
border-color: rgba(82, 168, 236, 0.8); border-color: rgba(82, 168, 236, 0.8);
...@@ -4463,23 +4470,28 @@ textarea.wiki-form-block select { ...@@ -4463,23 +4470,28 @@ textarea.wiki-form-block select {
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
} }
.form-horizontal .wiki-control input[type='text'][disabled], .form-horizontal .wiki-control input[type='text'][disabled],
.form-horizontal .wiki-control input[type='password'][disabled],
.form-horizontal .wiki-control select[disabled], .form-horizontal .wiki-control select[disabled],
.form-horizontal .wiki-control textarea[disabled], .form-horizontal .wiki-control textarea[disabled],
.form-horizontal .wiki-control input[type='text'][readonly], .form-horizontal .wiki-control input[type='text'][readonly],
.form-horizontal .wiki-control input[type='password'][readonly],
.form-horizontal .wiki-control select[readonly], .form-horizontal .wiki-control select[readonly],
.form-horizontal .wiki-control textarea[readonly], .form-horizontal .wiki-control textarea[readonly],
fieldset[disabled] .form-horizontal .wiki-control input[type='text'], fieldset[disabled] .form-horizontal .wiki-control input[type='text'],
fieldset[disabled] .form-horizontal .wiki-control input[type='password'],
fieldset[disabled] .form-horizontal .wiki-control select, fieldset[disabled] .form-horizontal .wiki-control select,
fieldset[disabled] .form-horizontal .wiki-control textarea { fieldset[disabled] .form-horizontal .wiki-control textarea {
cursor: not-allowed; cursor: not-allowed;
background-color: #eeeeee; background-color: #eeeeee;
} }
textarea.form-horizontal .wiki-control input[type='text'], textarea.form-horizontal .wiki-control input[type='text'],
textarea.form-horizontal .wiki-control input[type='password'],
textarea.form-horizontal .wiki-control select, textarea.form-horizontal .wiki-control select,
textarea.form-horizontal .wiki-control textarea { textarea.form-horizontal .wiki-control textarea {
height: auto; height: auto;
} }
.form-horizontal .wiki-control input[type='text'].input-large, .form-horizontal .wiki-control input[type='text'].input-large,
.form-horizontal .wiki-control input[type='password'].input-large,
.form-horizontal .wiki-control select.input-large, .form-horizontal .wiki-control select.input-large,
.form-horizontal .wiki-control textarea.input-large { .form-horizontal .wiki-control textarea.input-large {
height: 56px; height: 56px;
...@@ -4488,6 +4500,7 @@ textarea.form-horizontal .wiki-control textarea { ...@@ -4488,6 +4500,7 @@ textarea.form-horizontal .wiki-control textarea {
border-radius: 6px; border-radius: 6px;
} }
.form-horizontal .wiki-control input[type='text'].input-small, .form-horizontal .wiki-control input[type='text'].input-small,
.form-horizontal .wiki-control input[type='password'].input-small,
.form-horizontal .wiki-control select.input-small, .form-horizontal .wiki-control select.input-small,
.form-horizontal .wiki-control textarea.input-small { .form-horizontal .wiki-control textarea.input-small {
height: 30px; height: 30px;
...@@ -4496,7 +4509,8 @@ textarea.form-horizontal .wiki-control textarea { ...@@ -4496,7 +4509,8 @@ textarea.form-horizontal .wiki-control textarea {
border-radius: 3px; border-radius: 3px;
} }
/* other fields */ /* other fields */
.form-horizontal .wiki-control input { .form-horizontal .wiki-control input[type=text],
.form-horizontal .wiki-control input[type=password] {
width: 280px; width: 280px;
display: inline-block; display: inline-block;
} }
...@@ -6440,3 +6454,85 @@ a .icon-flip-vertical:before { ...@@ -6440,3 +6454,85 @@ a .icon-flip-vertical:before {
font-weight: bold; font-weight: bold;
} }
/* Literal.Number.Integer.Long */ /* Literal.Number.Integer.Long */
/******************************
TWITTER TYPEAHEAD
*******************************/
.twitter-typeahead {
width: 100%;
position: relative;
}
.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
margin-bottom: 0;
width: 100%;
position: absolute;
top: 0;
left: 0;
}
.twitter-typeahead .tt-hint {
color: #a1a1a1;
z-index: 1;
padding: 6px 12px;
border: 1px solid transparent;
}
.twitter-typeahead .tt-query {
z-index: 2;
border-radius: 4px!important;
/* add these 2 statements if you have an appended input group */
border-top-right-radius: 0!important;
border-bottom-right-radius: 0!important;
/* add these 2 statements if you have an prepended input group */
/* border-top-left-radius: 0!important;
border-bottom-left-radius: 0!important; */
}
.tt-dropdown-menu {
min-width: 160px;
margin-top: 2px;
padding: 5px 0;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.tt-suggestion {
display: block;
padding: 3px 20px;
}
.tt-suggestion.tt-is-under-cursor {
color: #fff;
background-color: #0081c2;
background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
background-image: -o-linear-gradient(top, #0088cc, #0077b3);
background-image: linear-gradient(to bottom, #0088cc, #0077b3);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
}
.tt-suggestion.tt-is-under-cursor a {
color: #fff;
}
.tt-suggestion p {
margin: 0;
}
.twitter-typeahead .tt-hint {
display: block;
height: 38px;
padding: 8px 12px;
font-size: 14px;
line-height: 1.428571429;
border: 1px solid transparent;
}
.twitter-typeahead {
width: 100%;
position: relative;
}
.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
margin-bottom: 0;
width:100%;
position: absolute;
top:0;
left:0;
}
.twitter-typeahead .tt-hint {
color:#a1a1a1;
z-index: 1;
padding: 6px 12px;
border:1px solid transparent;
}
.twitter-typeahead .tt-query {
z-index: 2;
border-radius: 4px!important;
/* add these 2 statements if you have an appended input group */
border-top-right-radius: 0!important;
border-bottom-right-radius: 0!important;
/* add these 2 statements if you have an prepended input group */
/* border-top-left-radius: 0!important;
border-bottom-left-radius: 0!important; */
}
.tt-dropdown-menu {
min-width: 160px;
margin-top: 2px;
padding: 5px 0;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
box-shadow: 0 5px 10px rgba(0,0,0,.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.tt-suggestion {
display: block;
padding: 3px 20px;
}
.tt-suggestion.tt-is-under-cursor {
color: #fff;
background-color: #0081c2;
background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
background-image: -o-linear-gradient(top, #0088cc, #0077b3);
background-image: linear-gradient(to bottom, #0088cc, #0077b3);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)
}
.tt-suggestion.tt-is-under-cursor a {
color: #fff;
}
.tt-suggestion p {
margin: 0;
}
.twitter-typeahead .tt-hint {
display: block;
height: 38px;
padding: 8px 12px;
font-size: 14px;
line-height: 1.428571429;
border: 1px solid transparent;
}
...@@ -239,7 +239,8 @@ input[type=file] {float: none; width: auto;} ...@@ -239,7 +239,8 @@ input[type=file] {float: none; width: auto;}
} }
/* General styling, any kind of form input */ /* General styling, any kind of form input */
.wiki-control input .wiki-control input[type=text],
.wiki-control input[type=password]
{ {
display: inline-block; display: inline-block;
height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
...@@ -253,6 +254,7 @@ input[type=file] {float: none; width: auto;} ...@@ -253,6 +254,7 @@ input[type=file] {float: none; width: auto;}
} }
.form-horizontal .wiki-control input[type='text'], .form-horizontal .wiki-control input[type='text'],
.form-horizontal .wiki-control input[type='password'],
.form-horizontal .wiki-control select, .form-horizontal .wiki-control select,
.form-horizontal .wiki-control textarea .form-horizontal .wiki-control textarea
{ {
...@@ -262,7 +264,8 @@ input[type=file] {float: none; width: auto;} ...@@ -262,7 +264,8 @@ input[type=file] {float: none; width: auto;}
} }
/* other fields */ /* other fields */
.form-horizontal .wiki-control input .form-horizontal .wiki-control input[type=text],
.form-horizontal .wiki-control input[type=password]
{ {
width: 280px; width: 280px;
display: inline-block; display: inline-block;
...@@ -364,3 +367,10 @@ input[type=file] {float: none; width: auto;} ...@@ -364,3 +367,10 @@ input[type=file] {float: none; width: auto;}
*******************************/ *******************************/
@import "codehilite.less"; @import "codehilite.less";
/******************************
TWITTER TYPEAHEAD
*******************************/
@import "typeahead.less";
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
<h1>{% trans "Congratulations!" %}</h1> <h1>{% trans "Congratulations!" %}</h1>
<p class="lead"> <p class="lead">
{% trans "You have django-wiki installed... but there are no articles. So it's time to create the first one, the root article. In the beginning, it will only be editable by administrators, but you can define permissions after." %} {% trans "You have django-wiki installed... but there are no articles. So it's time to create the first one, the root article." %}
{% trans "In the beginning, it will only be editable by administrators, but you can define permissions after." %}
</p> </p>
<h2 class="page-header">{% trans "Root article" %}</h2> <h2 class="page-header">{% trans "Root article" %}</h2>
......
{% extends "wiki/create_root.html" %}
{% load i18n %}
{% block wiki_contents %}
<h1>{% trans "Congratulations!" %}</h1>
<p class="lead">
{% trans "You have django-wiki installed... but there are no articles. So it's time to create the first one, the root article." %}
</p>
<p class="lead">
{% trans "In can be created and/or edited only by administrators, but you can define permissions after." %}
</p>
{% endblock %}
...@@ -55,6 +55,7 @@ class WikiURLPatterns(object): ...@@ -55,6 +55,7 @@ class WikiURLPatterns(object):
urlpatterns = patterns('', urlpatterns = patterns('',
url('^$', self.article_view_class.as_view(), name='root', kwargs={'path': ''}), url('^$', self.article_view_class.as_view(), name='root', kwargs={'path': ''}),
url('^create-root/$', article.CreateRootView.as_view(), name='root_create'), url('^create-root/$', article.CreateRootView.as_view(), name='root_create'),
url('^missing-root/$', article.MissingRootView.as_view(), name='root_missing'),
url('^_search/$', get_class_from_str(self.search_view_class).as_view(), name='search'), url('^_search/$', get_class_from_str(self.search_view_class).as_view(), name='search'),
url('^_revision/diff/(?P<revision_id>\d+)/$', self.article_diff_view, name='diff'), url('^_revision/diff/(?P<revision_id>\d+)/$', self.article_diff_view, name='diff'),
) )
......
...@@ -720,8 +720,8 @@ class CreateRootView(FormView): ...@@ -720,8 +720,8 @@ class CreateRootView(FormView):
template_name = 'wiki/create_root.html' template_name = 'wiki/create_root.html'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
if not request.user.is_superuser: if not self.request.user.is_superuser:
return redirect(settings.LOGIN_URL + "?next=" + reverse("wiki:root_create")) return redirect("wiki:root_missing")
try: try:
root = models.URLPath.root() root = models.URLPath.root()
...@@ -748,3 +748,7 @@ class CreateRootView(FormView): ...@@ -748,3 +748,7 @@ class CreateRootView(FormView):
data = super(CreateRootView, self).get_context_data(**kwargs) data = super(CreateRootView, self).get_context_data(**kwargs)
data['editor'] = editors.getEditor() data['editor'] = editors.getEditor()
return data return data
class MissingRootView(TemplateView):
template_name = 'wiki/root_missing.html'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment