changeset 2655:bc0f43fecbc7

merged
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Thu, 03 Jul 2014 22:04:50 +0200
parents b27a0c43dad0 (current diff) 5099cf7b32ea (diff)
children c05ad337ac22 772810aa8013 5aeeb1cac5b9
files MoinMoin/apps/frontend/views.py MoinMoin/themes/basic/static/css/basic.css MoinMoin/themes/basic/static/custom-less/basic.less MoinMoin/themes/foobar/static/css/stylus/pygments_default.css MoinMoin/themes/modernized/static/css/stylus/pygments_default.css setup.py
diffstat 58 files changed, 1546 insertions(+), 417 deletions(-) [+]
line wrap: on
line diff
--- a/MoinMoin/apps/frontend/views.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/apps/frontend/views.py	Thu Jul 03 22:04:50 2014 +0200
@@ -38,6 +38,7 @@
 import pytz
 from babel import Locale
 
+from whoosh import sorting
 from whoosh.query import Term, Prefix, And, Or, DateRange, Every
 from whoosh.analysis import StandardAnalyzer
 from whoosh import sorting
@@ -59,6 +60,7 @@
 from MoinMoin.constants.namespaces import *
 from MoinMoin.constants.itemtypes import ITEMTYPE_DEFAULT, ITEMTYPE_TICKET
 from MoinMoin.constants.chartypes import CHARS_UPPER, CHARS_LOWER
+from MoinMoin.constants.contenttypes import *
 from MoinMoin.util import crypto
 from MoinMoin.util.interwiki import url_for_item, split_fqname, CompositeName
 from MoinMoin.search import SearchForm
@@ -267,15 +269,74 @@
         return transcluded_names
 
 
+def add_file_filters(_filter, filetypes):
+    """
+    Add various terms to the filter for the search query for the selected file types
+    in the search options.
+
+    :param _filter: the current filter
+    :param filetypes: list of selected filetypes
+    :returns: the required _filter for the search query
+    """
+    if filetypes:
+        alltypes = "all" in filetypes
+        contenttypes = []
+        files_filter = []
+        if alltypes or "markup" in filetypes:
+            contenttypes.append(CONTENTTYPE_MARKUP)
+        if alltypes or "text" in filetypes:
+            contenttypes.append(CONTENTTYPE_TEXT)
+        if alltypes or "image" in filetypes:
+            contenttypes.append(CONTENTTYPE_IMAGE)
+        if alltypes or "audio" in filetypes:
+            contenttypes.append(CONTENTTYPE_AUDIO)
+        if alltypes or "video" in filetypes:
+            contenttypes.append(CONTENTTYPE_VIDEO)
+        if alltypes or "drawing" in filetypes:
+            contenttypes.append(CONTENTTYPE_DRAWING)
+        if alltypes or "other" in filetypes:
+            contenttypes.append(CONTENTTYPE_OTHER)
+        for ctype in contenttypes:
+            for itemtype in ctype:
+                files_filter.append(Term("contenttype", itemtype))
+        files_filter = Or(files_filter)
+        _filter.append(files_filter)
+        _filter = And(_filter)
+    return _filter
+
+
+def add_facets(facets, time_sorting):
+    """
+    Adds various facets for the search features.
+
+    :param facets: current facets
+    :param time_sorting: defines the sorting order and can have one of the following 3 values :
+                     1. default - default search
+                     2. old - sort old items first
+                     3. new - sort new items first
+    :returns: required facets for the search query
+    """
+    if time_sorting == "new":
+        facets.append(sorting.FieldFacet("mtime", reverse=True))
+    elif time_sorting == "old":
+        facets.append(sorting.FieldFacet("mtime", reverse=False))
+    return facets
+
+
 @frontend.route('/+search/<itemname:item_name>', methods=['GET', 'POST'])
 @frontend.route('/+search', defaults=dict(item_name=u''), methods=['GET', 'POST'])
 def search(item_name):
     search_form = SearchForm.from_flat(request.values)
     ajax = True if request.args.get('boolajax') else False
     valid = search_form.validate()
+    time_sorting = False
+    filetypes = []
     if ajax:
         query = request.args.get('q')
-        history = request.args.get('history')
+        history = request.args.get('history') == "true"
+        time_sorting = request.args.get('time_sorting')
+        filetypes = request.args.get('filetypes')
+        filetypes = filetypes.split(',')[:-1]  # To remove the extra u'' at the end of the list
     else:
         query = search_form['q'].value
         history = bool(request.values.get('history'))
@@ -289,7 +350,8 @@
         qp = flaskg.storage.query_parser([NAME_EXACT, NAME, SUMMARY, CONTENT, CONTENTNGRAM], idx_name=idx_name)
         q = qp.parse(query)
 
-        _filter = None
+        _filter = []
+        _filter = add_file_filters(_filter, filetypes)
         if item_name:  # Only search this item and subitems
             prefix_name = item_name + u'/'
             terms = [Term(NAME_EXACT, item_name), Prefix(NAME_EXACT, prefix_name), ]
@@ -319,8 +381,10 @@
 
         with flaskg.storage.indexer.ix[idx_name].searcher() as searcher:
             # terms is set to retrieve list of terms which matched, in the searchtemplate, for highlight.
+            facets = []
+            facets = add_facets(facets, time_sorting)
             flaskg.clock.start('search')
-            results = searcher.search(q, filter=_filter, limit=100, terms=True)
+            results = searcher.search(q, filter=_filter, limit=100, terms=True, sortedby=facets)
             flaskg.clock.stop('search')
             flaskg.clock.start('search suggestions')
             name_suggestions = [word for word, score in results.key_terms(NAME, docs=20, numterms=10)]
@@ -835,7 +899,7 @@
     for g in content_registry.group_names:
         description = u', '.join([e.display_name for e in content_registry.groups[g]])
         yield g, None, description
-    yield u'unknown items', None, u'Items of contenttype unknown to MoinMoin'
+    yield u'Unknown Items', None, u'Items of contenttype unknown to MoinMoin'
 
 ContenttypeGroup = MultiSelect.of(Enum.out_of(contenttype_selects_gen())).using(optional=True)
 
--- a/MoinMoin/constants/contenttypes.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/constants/contenttypes.py	Thu Jul 03 22:04:50 2014 +0200
@@ -21,13 +21,98 @@
 CONTENTTYPE_DEFAULT = u'application/octet-stream'
 CONTENTTYPE_NONEXISTENT = u'application/x-nonexistent'
 
+CONTENTTYPE_MARKUP = [
+    u'text/x.moin.wiki;charset=utf-8',
+    u'text/x-mediawiki;charset=utf-8',
+    u'text/x.moin.creole;charset=utf-8',
+    u'text/x-markdown;charset=utf-8',
+    u'text/x-rst;charset=utf-8',
+    u'text/html;charset=utf-8',
+    u'application/docbook+xml;charset=utf-8',
+]
 
-GROUP_MARKUP_TEXT = 'markup text items'
-GROUP_OTHER_TEXT = 'other text items'
-GROUP_IMAGE = 'image items'
-GROUP_AUDIO = 'audio items'
-GROUP_VIDEO = 'video items'
-GROUP_DRAWING = 'drawing items'
-GROUP_OTHER = 'other items'
+CONTENTTYPE_TEXT = [
+    u'text/plain;charset=utf-8',
+    u'text/x-diff;charset=utf-8',
+    u'text/x-python;charset=utf-8',
+    u'text/csv;charset=utf-8',
+    u'text/x-irclog;charset=utf-8',
+]
+
+CONTENTTYPE_IMAGE = [
+    u'image/svg+xml',
+    u'image/png',
+    u'image/jpeg',
+    u'image/gif',
+]
+
+CONTENTTYPE_AUDIO = [
+    u'audio/wave',
+    u'audio/ogg',
+    u'audio/mpeg',
+    u'audio/webm',
+]
+
+CONTENTTYPE_VIDEO = [
+    u'video/ogg',
+    u'video/webm',
+    u'video/mp4',
+]
+
+CONTENTTYPE_DRAWING = [
+    u'application/x-twikidraw',
+    u'application/x-anywikidraw',
+    u'application/x-svgdraw',
+]
+
+CONTENTTYPE_OTHER = [
+    u'application/octet-stream',
+    u'application/x-tar',
+    u'application/x-gtar',
+    u'application/zip',
+    u'application/pdf',
+]
+
+CONTENTTYPES_MAP = {
+    u'text/x.moin.wiki;charset=utf-8': 'Wiki (Moinmoin)',
+    u'text/x-mediawiki;charset=utf-8': 'Wiki (MediaWiki)',
+    u'text/x.moin.creole;charset=utf-8': 'Wiki (Creole)',
+    u'text/x-markdown;charset=utf-8': 'Markdown',
+    u'text/x-rst;charset=utf-8': 'ReST',
+    u'text/html;charset=utf-8': 'HTML',
+    u'application/docbook+xml;charset=utf-8': 'DocBook',
+    u'text/plain;charset=utf-8': 'Plain Text',
+    u'text/x-diff;charset=utf-8': 'Diff/Patch',
+    u'text/x-python;charset=utf-8': 'Python Code',
+    u'text/csv;charset=utf-8': 'CSV',
+    u'text/x-irclog;charset=utf-8': 'IRC Log',
+    u'image/svg+xml': 'SVG Image',
+    u'image/png': 'PNG Image',
+    u'image/jpeg': 'JPEG Image',
+    u'image/gif': 'GIF Image',
+    u'audio/wave': 'WAV Audio',
+    u'audio/ogg': 'OGG Audio',
+    u'audio/mpeg': 'MP3 Audio',
+    u'audio/webm': 'WebM Audio',
+    u'video/ogg': 'OGG Video',
+    u'video/webm': 'WebM Video',
+    u'video/mp4': 'MP4 Video',
+    u'application/x-twikidraw': 'TDRAW',
+    u'application/x-anywikidraw': 'ADRAW',
+    u'application/x-svgdraw': 'SVGDRAW',
+    u'application/octet-stream': 'Binary File',
+    u'application/x-tar': 'TAR',
+    u'application/x-gtar': 'TGZ',
+    u'application/zip': 'ZIP',
+    u'application/pdf': 'PDF',
+}
+
+GROUP_MARKUP_TEXT = 'Markup Text Items'
+GROUP_OTHER_TEXT = 'Other Text Items'
+GROUP_IMAGE = 'Image Items'
+GROUP_AUDIO = 'Audio Items'
+GROUP_VIDEO = 'Video Items'
+GROUP_DRAWING = 'Drawing Items'
+GROUP_OTHER = 'Other Items'
 
 DRAWING_EXTENSIONS = ['.tdraw', '.adraw', '.svg', '.png', '.jpg', '.jpeg', '.gif', ]
--- a/MoinMoin/items/__init__.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/items/__init__.py	Thu Jul 03 22:04:50 2014 +0200
@@ -247,7 +247,7 @@
         return form
 
 
-UNKNOWN_ITEM_GROUP = "unknown items"
+UNKNOWN_ITEM_GROUP = "Unknown Items"
 
 
 def _build_contenttype_query(groups):
--- a/MoinMoin/items/_tests/test_Item.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/items/_tests/test_Item.py	Thu Jul 03 22:04:50 2014 +0200
@@ -124,7 +124,7 @@
         assert files == build_index(basename, [u'ab'])
 
         # check filtered index when contenttype_groups is passed
-        ctgroups = ["other text items"]
+        ctgroups = ["Other Text Items"]
         dirs, files = baseitem.get_index(selected_groups=ctgroups)
         assert dirs == build_index(basename, [u'cd', u'ij'])
         assert files == build_index(basename, [u'ab', u'gh', u'ij'])
--- a/MoinMoin/items/content.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/items/content.py	Thu Jul 03 22:04:50 2014 +0200
@@ -411,7 +411,7 @@
     Fallback Content for uploaded file of unknown contenttype.
     """
     contenttype = 'application/octet-stream'
-    display_name = 'binary file'
+    display_name = 'Binary File'
 
 
 class RenderableBinary(Binary):
@@ -1037,31 +1037,31 @@
 @register
 class PlainText(Text):
     contenttype = 'text/plain'
-    display_name = 'plain text'
+    display_name = 'Plain Text'
 
 
 @register
 class Diff(Text):
     contenttype = 'text/x-diff'
-    display_name = 'diff/patch'
+    display_name = 'Diff/Patch'
 
 
 @register
 class PythonCode(Text):
     contenttype = 'text/x-python'
-    display_name = 'python code'
+    display_name = 'Python Code'
 
 
 @register
 class CSV(Text):
     contenttype = 'text/csv'
-    display_name = 'csv'
+    display_name = 'CSV'
 
 
 @register
 class IRCLog(Text):
     contenttype = 'text/x-irclog'
-    display_name = 'IRC log'
+    display_name = 'IRC Log'
 
 
 class Draw(TarMixin, Image):
--- a/MoinMoin/search/__init__.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/search/__init__.py	Thu Jul 03 22:04:50 2014 +0200
@@ -28,7 +28,6 @@
 
 class SearchForm(Form):
     q = Search
-    history = InlineCheckbox.using(label=L_('search all revisions'))
     submit_label = L_('Search')
 
     validators = [ValidSearch()]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/static/css/common.css	Thu Jul 03 22:04:50 2014 +0200
@@ -0,0 +1,51 @@
+/*
+    Add all the css definitions common to the themes here, in order to
+    avoid duplication of code at many places. Also if there are minor
+    differences between the definitions for the different themes,
+    add a definition here and make suitable minor adjustments in the
+    individual css definitions of each theme.
+*/
+.moin-suggestions {
+  color: #FF9900;
+  display: inline;
+}
+.moin-suggestion-terms {
+  font-style: italic;
+  display: inline;
+}
+.moin-wordbreak {
+  font-size: 1.4em;
+}
+.moin-search-meta {
+  color: green;
+}
+.searchstats {
+  color: gray;
+}
+#moin-search-query {
+  width: 70%;
+  border-radius: 5px;
+}
+.searchhitinfobar {
+  display: inline;
+}
+.moin-rights-info {
+  display: inline;
+  float: right;
+}
+.moin-searchoptions > table {
+  table-layout: fixed;
+}
+.moin-searchoptions > table > tbody > tr > th {
+  padding: 5px;
+  text-decoration: underline;
+}
+.moin-searchoptions > table > tbody > tr > td {
+  valign: top;
+  padding-right: 20px;
+  width: 20%;
+}
+.hidden {
+  display: none;
+  visibility: hidden;
+}
--- a/MoinMoin/static/js/index_action.js	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/static/js/index_action.js	Thu Jul 03 22:04:50 2014 +0200
@@ -126,9 +126,15 @@
         if ($(this).hasClass("allitem-toselect")) {
             $(".moin-item-index div").removeClass().addClass("selected-item");
             $(this).removeClass("allitem-toselect").addClass("allitem-selected");
+            $(".moin-select-item > input[type='checkbox']").each(function () {
+                $(this).prop('checked', true);
+            });
         } else {
             $(this).removeClass("allitem-selected").addClass("allitem-toselect");
             $(".moin-item-index div").removeClass();
+            $(".moin-select-item > input[type='checkbox']").each(function () {
+                $(this).prop('checked', false);
+            });
         }
     });
 
@@ -272,6 +278,7 @@
     // add click handlers to all items shown on global index page
     $(".moin-select-item").click(function () {
         // toggle selection classes
+        $(this > "input[type='checkbox']").prop('checked', !$(this > "input[type='checkbox']").is(':checked'));
         if ($(this).parent().hasClass("selected-item")) {
             $(this).parent().removeClass("selected-item");
             if ($(".moin-select-allitem").hasClass("allitem-selected")) {
--- a/MoinMoin/static/js/search.js	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/static/js/search.js	Thu Jul 03 22:04:50 2014 +0200
@@ -5,23 +5,39 @@
         return false;
     });
 
-    // hide form submit button
-    $('#moin-long-searchform .button').hide();
+    $(document).on("click", "#moin-long-searchform .button", (function(){
+        $('#moin-search-query').keyup();
+    }));
 
-    function ajaxify(query, allrevs) {
+    $(document).on("click", "label", (function(){
+        $('#moin-search-query').keyup();
+    }));
+
+    $(document).on("click", ".moin-search-option-bar", (function(){
+        $('.moin-searchoptions').toggleClass('hidden');
+    }));
+
+    $('.moin-loginsettings').addClass('navbar-right');
+
+    function ajaxify(query, allrevs, time_sorting, filetypes) {
         $.ajax({
             type: "GET",
             url: "/+search",
-            data: { q: query, history: allrevs, boolajax: true }
+            data: { q: query, history: allrevs, time_sorting: time_sorting, filetypes: filetypes, boolajax: true }
         }).done(function( html ) {
             $('#finalresults').html(html)
         });
     }
+
     $('#moin-search-query').keyup(function() {
-        var allrev = false;
-        if($('[name="history"]').prop('checked')){
-            allrev = true;
-        }
-        ajaxify($(this).val(), allrev);
+        var allrev;
+        var mtime = false;
+        var filetypes= '';
+        allrev = $('[name="history"]:checked').val() === "all";
+        time_sorting = $('[name="modified_time"]:checked').val();
+        $('[name="itemtype"]:checked').each(function() {
+            filetypes += $(this).val() + ',';
+        });
+        ajaxify($(this).val(), allrev, time_sorting, filetypes);
     });
 });
--- a/MoinMoin/templates/ajaxsearch.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/templates/ajaxsearch.html	Thu Jul 03 22:04:50 2014 +0200
@@ -1,40 +1,40 @@
-<br/>
-{% if omitted_words %}
-  <p>{{ _("common words in query: %(termlist)s", termlist=omitted_words) }}</p>
-{% endif %}
-<br/>
 {% if results is defined %}
-    <p class="searchstats">
-        {% if results %}
-        {{ _("%(result_len)d results found (%(runtime).3f secs).",
-              result_len=results|length, runtime=results.runtime
-            )
-        }}
-        {% else %}
-        {{ _("No results found (%(runtime).3f secs).", runtime=results.runtime) }}
-        {% endif %}
-    </p>
+    {% if omitted_words %}
+        <p>{{ _("Common words in query: %(termlist)s", termlist=omitted_words) }}</p>
     {% endif %}
-
     {% if results is defined %}
         {% if word_suggestions %}
-            <p>{{ _("input suggestions: %(termlist)s", termlist=word_suggestions) }}</p>
+            <p class="moin-suggestions">{{ _("Input suggestions : ") }}</p><p class="moin-suggestion-terms">{{ _(" %(termlist)s", termlist=word_suggestions) }}</p><br>
         {% endif %}
         {% if name_suggestions or content_suggestions %}
-            <p>{{ _("name term suggestions: %(termlist)s", termlist=name_suggestions) }}</p>
-            <p>{{ _("content term suggestions: %(termlist)s", termlist=content_suggestions) }}</p>
+            <p class="moin-suggestions">{{ _("Name term suggestions : ") }}</p><p class="moin-suggestion-terms">{{ _( " %(termlist)s", termlist=name_suggestions) }}</p><br>
+            <p class="moin-suggestions">{{ _("Content term suggestions : ") }}</p><p class="moin-suggestion-terms">{{ _(" %(termlist)s", termlist=content_suggestions) }}</p><br><br>
         {% endif %}
+        <p class="searchstats">
+            {% if results %}
+            {{ _("%(result_len)d results found (%(runtime).3f secs).",
+                  result_len=results|length, runtime=results.runtime
+                )
+            }}
+            {% else %}
+            {{ _("No results found (%(runtime).3f secs).", runtime=results.runtime) }}
+            {% endif %}
+        </p>
         {% if results %}
             <div class="searchresults">
                 <table>
                     {% for result in results %}
                         {% if result['wikiname'] == cfg.interwikiname %}
                             <tr>
-                                <td class="moin-wordbreak">{{ result.pos + 1 }}
-                                    {% if history %}
-                                        <a href="{{ url_for_item(item_name=result['revid'], wiki_name='Self', namespace=result['namespace'], field='revid') }}"><b>{{ result['name'] | join(' | ')}}</b></a>
+                                <td class="moin-wordbreak">
+                                    {% if result['name'] %}
+                                        {% if history %}
+                                            <a href="{{ url_for_item(item_name=result['revid'], wiki_name='Self', namespace=result['namespace'], field='revid') }}"><b>{{ result['name'] | join(' | ')}}</b></a>
+                                        {% else %}
+                                            <a href="{{ url_for_item(item_name=result['name'][0], wiki_name='Self', namespace=result['namespace']) }}"><b>{{ result['name'] | join(' | ')}}</b></a>
+                                        {% endif %}
                                     {% else %}
-                                        <a href="{{ url_for_item(item_name=result['name'][0], wiki_name='Self', namespace=result['namespace']) }}"><b>{{ result['name'] | join(' | ')}}</b></a>
+                                        <a href="{{ url_for_item(item_name=result['revid'], wiki_name='Self', namespace=result['namespace'], field='revid') }}"><b>Item ID : {{ result['itemid'] }}</b></a>
                                     {% endif %}
                                 </td>
                             </tr>
@@ -45,23 +45,23 @@
                                     </td>
                                 </tr>
                             {% endif %}
-                            <tr>
+                            <tr class="moin-search-meta">
                                 <td>
-                                    <p class="info searchhitinfobar">{{ _("Revision: %(revid)s Last Change: %(mtime)s", revid=result['revid']|shorten_id, mtime=result['mtime']|datetimeformat) }}</p>
+                                    <p class="info searchhitinfobar">{{ _("Revision: %(revid)s - %(size)s - %(mtime)s - %(type)s", type=(result['contenttype']|shorten_ctype), mtime=result['mtime']|datetimeformat, size=result['size']|filesizeformat, revid=result['revid']|shorten_id) }}</p>
                                 </td>
                             </tr>
                             <tr>
                                 <td>
-                                    {% if user.may.read(result['name']) %}
-                                        <p class="info foundtext">{{ result.highlights('content')|safe }}</p>
+                                    {% if user.may.read(get_fqname(item_name=results['itemid'],field='ITEMID',namespace=results['namespace'])) %}
+                                        <p class="info foundtext">{{ result.highlights('content')|safe }}</p><br>
                                     {% else %}
-                                        <p class="info foundtext">{{ _("You don't have read permission for this item.") }}</p>
+                                        <p class="info foundtext">{{ _("You don't have read permission for this item.") }}</p><br>
                                     {% endif %}
                                 </td>
                             </tr>
                         {% else %}
                             <tr>
-                                <td class="moin-wordbreak">{{ result.pos + 1 }}
+                                <td class="moin-wordbreak">
                                 <a class="moin-interwiki" href="{{ url_for_item(item_name=result['name'], wiki_name=result['wikiname'], rev=result['revid']) }}"><b>{{ "%s:%s" % (result['wikiname'], result['name']) }}</b></a>
                                 </td>
                             </tr>
@@ -70,4 +70,5 @@
                 </table>
             </div>
         {% endif %}
+    {% endif %}
 {% endif %}
--- a/MoinMoin/templates/base.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/templates/base.html	Thu Jul 03 22:04:50 2014 +0200
@@ -53,6 +53,7 @@
 
     {% block theme_stylesheets %}
     <link media="all" rel="stylesheet" href="{{ theme_static('css/common.css') }}" />
+    <link media="all" rel="stylesheet" href="{{ url_for('static', filename='css/common.css') }}" />
     {% endblock %}
     {{ stylesheets }}
     {% if user.valid and user.css_url -%}
--- a/MoinMoin/templates/index.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/templates/index.html	Thu Jul 03 22:04:50 2014 +0200
@@ -89,7 +89,9 @@
 
 {% macro render_file_entry(e) %}
     <div>
-        <span class="moin-select-item">&nbsp;</span>
+        <span class="moin-select-item">
+            <input type="checkbox"></input>
+        </span>
         {% set mimetype = "application/x.moin.download" %}
         <a href="{{ url_for('.download_item', item_name=e.fullname, mimetype=mimetype) }}" class="moin-download-link">
         </a>
--- a/MoinMoin/templates/search.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/templates/search.html	Thu Jul 03 22:04:50 2014 +0200
@@ -10,13 +10,53 @@
 {% endblock %}
 
 {% block content %}
+    <h1>{{_("Search")}}</h1>
     {{ gen.form.open(medium_search_form, id='moin-long-searchform', method='get', action=url_for('frontend.search', item_name=item_name)) }}
         <p>
         {{ forms.render(medium_search_form['q']) }}
         {{ forms.render_submit(medium_search_form) }}
         </p>
+        <div class="moin-search-option-bar"><h4 style="display:inline-block">Search Options</h4><span class="icon-chevron-down"></span></div>
+        <div class="moin-searchoptions hidden">
+            <table>
+                <tr colspan="4">
+                    <th width="20%">Revisions</td>
+                    <th width="20%">Sort By Time</td>
+                    <th width="60%" colspan="3">Content Types</td>
+                </tr>
+                <tr>
+                    <td>
+                        <label id="moin-option"><input type="radio" name="history" value="latest" checked="checked"> Latest</label><br>
+                        <label id="moin-option"><input type="radio" name="history" value="all"> All</label><br>
+                    </td>
+                    <td>
+                        <form>
+                            <label id="moin-option"><input type="radio" name="modified_time" value="default" checked="checked"> Default</label><br>
+                            <label id="moin-option"><input type="radio" name="modified_time" value="old"> Older First</label><br>
+                            <label id="moin-option"><input type="radio" name="modified_time" value="new"> Newer First</label><br>
+                        </form>
+                    </td>
+                    <form>
+                        <td>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="markup"> Markup Text</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="text"> Other Text</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="image"> Image</label><br>
+                        </td>
+                        <td>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="audio"> Audio</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="video"> Video</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="drawing"> Drawing</label><br>
+                        </td>
+                        <td>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="other"> Other</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="unknown"> Unknown</label><br>
+                            <label id="moin-option"><input type="checkbox" name="itemtype" value="all" checked="checked"> All</label><br>
+                        </td>
+                   </form>
+                </tr>
+            </table>
+        </div>
         <p>
-        {{ forms.render(medium_search_form['history']) }}
         {{ forms.render_errors(medium_search_form) }}
         </p>
     {{ gen.form.close() }}
--- a/MoinMoin/themes/__init__.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/__init__.py	Thu Jul 03 22:04:50 2014 +0200
@@ -23,9 +23,10 @@
 from MoinMoin.i18n import _, L_, N_
 from MoinMoin import wikiutil, user
 from MoinMoin.constants.keys import USERID, ADDRESS, HOSTNAME, REVID, ITEMID, NAME_EXACT
+from MoinMoin.constants.contenttypes import CONTENTTYPES_MAP
 from MoinMoin.constants.namespaces import NAMESPACE_DEFAULT, NAMESPACE_USERPROFILES, NAMESPACE_ALL
 from MoinMoin.search import SearchForm
-from MoinMoin.util.interwiki import split_interwiki, getInterwikiHome, is_local_wiki, is_known_wiki, url_for_item, CompositeName, split_fqname
+from MoinMoin.util.interwiki import split_interwiki, getInterwikiHome, is_local_wiki, is_known_wiki, url_for_item, CompositeName, split_fqname, get_fqname
 from MoinMoin.util.crypto import cache_key
 from MoinMoin.util.forms import make_generator
 from MoinMoin.util.clock import timed
@@ -573,24 +574,6 @@
 }
 
 
-# TODO: Update dictionary with more content-types
-def shorten_content_type(contenttype):
-    """
-    Shorten content-types
-
-    Shortens the content-type to terms that normal users understand.
-
-    :param name: contenttype, unicode
-    :rtype: unicode
-    :returns: shortened version of contenttype
-    """
-    ctype = contenttype.split(';')[0]
-    if ctype in CONTENTTYPE_SHORTEN:
-        return CONTENTTYPE_SHORTEN[ctype]
-    else:
-        return "Unknown"
-
-
 def shorten_id(name, length=7):
     """
     Shorten IDs to specified length
@@ -639,13 +622,24 @@
     return timegm(dt.timetuple())
 
 
+def shorten_ctype(contenttype):
+    """
+    Returns user understandable terms for contenttype.
+
+    :param contenttype: contains the long form of the contenttype
+    :rtype: unicode
+    :returns: user understandable version of contenttype
+    """
+    return CONTENTTYPES_MAP.get(contenttype, "Unknown")
+
+
 def setup_jinja_env():
     app.jinja_env.filters['shorten_fqname'] = shorten_fqname
     app.jinja_env.filters['shorten_item_name'] = shorten_item_name
     app.jinja_env.filters['shorten_id'] = shorten_id
     app.jinja_env.filters['contenttype_to_class'] = contenttype_to_class
     app.jinja_env.filters['json_dumps'] = dumps
-    app.jinja_env.filters['shorten_ctype'] = shorten_content_type
+    app.jinja_env.filters['shorten_ctype'] = shorten_ctype
     # please note that these filters are installed by flask-babel:
     # datetimeformat, dateformat, timeformat, timedeltaformat
 
@@ -664,6 +658,7 @@
         'cfg': app.cfg,
         'item_name': u'@NONAMEGIVEN',  # XXX can we just use u'' ?
         'url_for_item': url_for_item,
+        'get_fqname': get_fqname,
         'get_editor_info': lambda meta: get_editor_info(meta),
         'utctimestamp': lambda dt: utctimestamp(dt),
         'gen': make_generator(),
--- a/MoinMoin/themes/basic/static/css/basic.css	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/basic/static/css/basic.css	Thu Jul 03 22:04:50 2014 +0200
@@ -5785,6 +5785,281 @@
     display: none !important;
   }
 }
+.hll {
+  background-color: #ffffcc;
+}
+.c {
+  color: #888888;
+}
+/* Comment */
+.err {
+  color: #FF0000;
+  background-color: #ffaaaa;
+}
+/* Error */
+.k {
+  color: #008800;
+  font-weight: bold;
+}
+/* Keyword */
+.o {
+  color: #333333;
+}
+/* Operator */
+.cm {
+  color: #888888;
+}
+/* Comment.Multiline */
+.cp {
+  color: #557799;
+}
+/* Comment.Preproc */
+.c1 {
+  color: #888888;
+}
+/* Comment.Single */
+.cs {
+  color: #cc0000;
+  font-weight: bold;
+}
+/* Comment.Special */
+.gd {
+  color: #a00000;
+}
+/* Generic.Deleted */
+.ge {
+  font-style: italic;
+}
+/* Generic.Emph */
+.gr {
+  color: #ff0000;
+}
+/* Generic.Error */
+.gh {
+  color: #000080;
+  font-weight: bold;
+}
+/* Generic.Heading */
+.gi {
+  color: #00a000;
+}
+/* Generic.Inserted */
+.go {
+  color: #888888;
+}
+/* Generic.Output */
+.gp {
+  color: #c65d09;
+  font-weight: bold;
+}
+/* Generic.Prompt */
+.gs {
+  font-weight: bold;
+}
+/* Generic.Strong */
+.gu {
+  color: #800080;
+  font-weight: bold;
+}
+/* Generic.Subheading */
+.gt {
+  color: #0044dd;
+}
+/* Generic.Traceback */
+.kc {
+  color: #008800;
+  font-weight: bold;
+}
+/* Keyword.Constant */
+.kd {
+  color: #008800;
+  font-weight: bold;
+}
+/* Keyword.Declaration */
+.kn {
+  color: #008800;
+  font-weight: bold;
+}
+/* Keyword.Namespace */
+.kp {
+  color: #003388;
+  font-weight: bold;
+}
+/* Keyword.Pseudo */
+.kr {
+  color: #008800;
+  font-weight: bold;
+}
+/* Keyword.Reserved */
+.kt {
+  color: #333399;
+  font-weight: bold;
+}
+/* Keyword.Type */
+.m {
+  color: #6600EE;
+  font-weight: bold;
+}
+/* Literal.Number */
+.s {
+  background-color: #fff0f0;
+}
+/* Literal.String */
+.na {
+  color: #0000cc;
+}
+/* Name.Attribute */
+.nb {
+  color: #007020;
+}
+/* Name.Builtin */
+.nc {
+  color: #BB0066;
+  font-weight: bold;
+}
+/* Name.Class */
+.no {
+  color: #003366;
+  font-weight: bold;
+}
+/* Name.Constant */
+.nd {
+  color: #555555;
+  font-weight: bold;
+}
+/* Name.Decorator */
+.ni {
+  color: #880000;
+  font-weight: bold;
+}
+/* Name.Entity */
+.ne {
+  color: #FF0000;
+  font-weight: bold;
+}
+/* Name.Exception */
+.nf {
+  color: #0066BB;
+  font-weight: bold;
+}
+/* Name.Function */
+.nl {
+  color: #997700;
+  font-weight: bold;
+}
+/* Name.Label */
+.nn {
+  color: #0e84b5;
+  font-weight: bold;
+}
+/* Name.Namespace */
+.nt {
+  color: #007700;
+}
+/* Name.Tag */
+.nv {
+  color: #996633;
+}
+/* Name.Variable */
+.ow {
+  color: #000000;
+  font-weight: bold;
+}
+/* Operator.Word */
+.w {
+  color: #bbbbbb;
+}
+/* Text.Whitespace */
+.mf {
+  color: #6600EE;
+  font-weight: bold;
+}
+/* Literal.Number.Float */
+.mh {
+  color: #005588;
+  font-weight: bold;
+}
+/* Literal.Number.Hex */
+.mi {
+  color: #0000DD;
+  font-weight: bold;
+}
+/* Literal.Number.Integer */
+.mo {
+  color: #4400EE;
+  font-weight: bold;
+}
+/* Literal.Number.Oct */
+.sb {
+  background-color: #fff0f0;
+}
+/* Literal.String.Backtick */
+.sc {
+  color: #0044dd;
+}
+/* Literal.String.Char */
+.sd {
+  color: #dd4422;
+}
+/* Literal.String.Doc */
+.s2 {
+  background-color: #fff0f0;
+}
+/* Literal.String.Double */
+.se {
+  color: #666666;
+  font-weight: bold;
+  background-color: #fff0f0;
+}
+/* Literal.String.Escape */
+.sh {
+  background-color: #fff0f0;
+}
+/* Literal.String.Heredoc */
+.si {
+  background-color: #eeeeee;
+}
+/* Literal.String.Interpol */
+.sx {
+  color: #DD2200;
+  background-color: #fff0f0;
+}
+/* Literal.String.Other */
+.sr {
+  color: #000000;
+  background-color: #fff0ff;
+}
+/* Literal.String.Regex */
+.s1 {
+  background-color: #fff0f0;
+}
+/* Literal.String.Single */
+.ss {
+  color: #aa6600;
+}
+/* Literal.String.Symbol */
+.bp {
+  color: #007020;
+}
+/* Name.Builtin.Pseudo */
+.vc {
+  color: #336699;
+}
+/* Name.Variable.Class */
+.vg {
+  color: #dd7700;
+  font-weight: bold;
+}
+/* Name.Variable.Global */
+.vi {
+  color: #3333bb;
+}
+/* Name.Variable.Instance */
+.il {
+  color: #0000DD;
+  font-weight: bold;
+}
+/* Literal.Number.Integer.Long */
 @media screen and (min-width: 992px) {
   .moin-pull-right {
     float: right !important;
@@ -6332,18 +6607,323 @@
 .moin-thead {
   background-color: silver;
 }
+html,
+body {
+  height: 100%;
+}
+#filter-btn {
+  background-color: #428bca;
+  border-radius: 3px;
+  display: inline;
+  padding: 10px;
+  color: #ffffff;
+  margin-bottom: 10px;
+}
+.moin-contenttypes-wrapper div {
+  cursor: pointer;
+  display: block;
+}
+.moin-contenttypes-wrapper form {
+  display: none;
+}
+.moin-contenttypes-wrapper form ul {
+  -webkit-padding-start: 0px;
+  -moz-padding-start: 0px;
+  overflow: hidden;
+}
+.moin-contenttypes-wrapper form li {
+  list-style-type: none;
+  float: left;
+  width: 50%;
+  border-radius: 5px;
+  display: inline;
+  padding: 5px;
+  margin-top: 5px;
+}
+.moin-contenttypes-wrapper form li label {
+  cursor: pointer;
+  display: inline;
+  line-height: 1.5em;
+  vertical-align: middle;
+  color: #1e90ff;
+}
+.moin-contenttypes-wrapper form li span {
+  font-size: .8em;
+  display: block;
+}
+.moin-contenttypes-wrapper form .filters {
+  background-color: white;
+  border: none;
+  margin-top: 1em;
+  float: none;
+  display: block;
+}
+.moin-contenttypes-wrapper form .filters .filter-toggle,
+.moin-contenttypes-wrapper form .filters .filter-more {
+  font-size: 1em;
+  background-color: #eeeeee;
+  border: 1px solid #dddddd;
+  padding: 0.5em;
+  border-radius: 0.5em;
+  margin: 0.2em;
+  text-decoration: none;
+}
+.moin-item-index div .moin-select-item {
+  display: inline-block;
+  width: 17px;
+  cursor: default;
+  margin-top: 1em;
+}
+.moin-download-link {
+  display: none;
+}
+.moin-index-message {
+  width: 50%;
+  margin: 1em auto;
+  text-align: center;
+  display: none;
+}
+.moin-index-message span {
+  padding: 4px;
+  background-color: #007cef;
+  color: #ffffff;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+}
+.moin-index-path {
+  margin-left: .5em;
+}
+.moin-index-path:before {
+  content: icon-folder-close;
+  margin: 0.3em;
+}
+.moin-clr {
+  clear: both;
+}
+.moin-item-index {
+  width: 100%;
+  margin-left: 0.5em;
+}
+.moin-item-index div {
+  float: left;
+  width: 16.5em;
+}
+.moin-item-index div .moin-select-item {
+  display: inline-block;
+  width: 17px;
+  cursor: default;
+  margin-top: 1em;
+}
+.moin-index-separator {
+  clear: both;
+  border-top: 1px dashed #ccc;
+  display: none;
+}
+.popup-container {
+  margin: 0;
+  border: 5px solid #428bca;
+  border-radius: 6px 6px 0 0;
+}
+.popup-header {
+  background-color: #428bca;
+  color: #ffffff;
+  padding: 10px;
+  margin: 0;
+}
+input[value="X"] {
+  padding: 0.1px;
+  margin: -0.2em;
+  width: 19px;
+  border-radius: 2em;
+  float: right;
+}
+input[value="X"]:hover {
+  background: #f4f4f4;
+}
+input[type="text"] {
+  width: 96%;
+}
+input[type="submit"],
+input[type="button"],
+input button {
+  font-weight: bold;
+  font-size: .75em;
+  background: #d6d5d0;
+  padding: 4px 15px;
+  border: 1px solid #ccc;
+  border-radius: 6px;
+  box-shadow: 1px 1px 2px #9d9d9b;
+  cursor: pointer;
+}
+input:hover {
+  box-shadow: 1px 1px 2px #000;
+}
+input:active {
+  position: relative;
+  top: 1px;
+}
+input,
+select {
+  padding: 3px;
+  background: #f4f4f4;
+  border: 1px solid #ccc;
+  border-radius: 2px;
+}
+.popup-body {
+  clear: both;
+  background-color: #f4f4f4;
+  color: #000000;
+  padding: 10px;
+  margin: 0;
+}
+.popup-body label {
+  margin: 5px;
+}
+.popup-body input {
+  margin: 8px 5px;
+}
+#moin-initials {
+  width: 90%;
+  margin: 5px auto;
+  text-align: center;
+}
+#moin-initials a {
+  display: inline-block;
+  margin: 0;
+  padding: 4px 5px;
+}
+#moin-initials a:hover,
+#moin-initials a.selected {
+  background: #428bca;
+  border-radius: 5px;
+  color: #ffffff;
+  text-decoration: none;
+}
+#popup {
+  background: transparent;
+  padding: 5px;
+  width: 40%;
+  position: absolute;
+  top: 10%;
+  left: 30%;
+  display: none;
+  z-index: 10;
+}
+.moin-error {
+  color: #ff2727;
+  background: #d6d5d0;
+  padding: 4px;
+  margin: 1em;
+  text-align: center;
+  list-style-type: none;
+  border-radius: 5px;
+}
+.moin-textcha {
+  padding-top: .2em;
+}
+#moin-upload-cont {
+  min-height: 10px;
+}
+#file_upload {
+  margin-top: 2em;
+}
+form.upload_file {
+  background-color: #d6d5d0;
+  border: 1px solid #ccc;
+  cursor: pointer;
+  direction: ltr;
+  font-weight: bold;
+  height: 2.5em;
+  line-height: 2.5em;
+  overflow: hidden;
+  position: relative;
+  text-align: center;
+  width: 15em;
+  display: block;
+  box-shadow: 0 0 5px #9d9d9b;
+}
+form.upload_file:hover {
+  box-shadow: 0 0 5px #000;
+}
+form.upload_file input {
+  cursor: pointer;
+  height: 100%;
+  margin: 0;
+  opacity: 0;
+  position: absolute;
+}
+form.upload_file button {
+  display: none;
+}
+.file_upload_template .file_upload_start {
+  visibility: hidden;
+  border-width: 0;
+  padding: 0;
+}
+.file_upload_template .file_upload_start button {
+  width: 0;
+}
+.file_name {
+  word-break: break-all;
+  word-wrap: break-word;
+  max-width: 10em;
+}
+.upload-form {
+  display: none;
+}
+.moin-drag {
+  font-size: .7em;
+  color: #9d9d9b;
+}
+#lightbox {
+  background: #f4f4f4;
+  opacity: .7;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 9;
+  margin: 0;
+  display: none;
+}
+.moin-content {
+  padding-bottom: 100px;
+}
+.moin-footer {
+  bottom: 0;
+  position: absolute;
+  width: 100%;
+}
+.moin-search-option-bar {
+  padding-left: 10px;
+  border: 1px solid #555555;
+  background-color: #1b436d;
+  color: #c8ddf1;
+  border-radius: 5px;
+}
+.moin-search-option-bar > span {
+  float: right;
+  padding: 10px;
+}
 @media (min-width: 768px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
 @media (min-width: 992px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
 @media (min-width: 1200px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
--- a/MoinMoin/themes/basic/static/custom-less/basic.less	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/basic/static/custom-less/basic.less	Thu Jul 03 22:04:50 2014 +0200
@@ -1,6 +1,7 @@
 @import "notice.less";
 @import "bootstrap.less";
 @import "moin-variables.less";
+@import (less) "colorful.css";
 
 // ---- Customising the top navbar breakpoint
 @grid-float-breakpoint: @screen-md;
@@ -305,19 +306,354 @@
 .moin-thead{
     background-color: silver;
 }
+html, body {
+  height: 100%;
+}
+// CSS definitions for Index UI borrowed from foobar and modernized theme
+#filter-btn { 
+  background-color: #428bca;
+  border-radius: 3px;
+  display: inline;
+  padding: 10px;
+  color: #ffffff;
+  margin-bottom: 10px;
+}
+.moin-contenttypes-wrapper { 
+
+  div {
+    cursor: pointer;
+    display: block;
+  }
+
+  form {
+    display: none;
+
+    ul {
+      -webkit-padding-start: 0px;
+      -moz-padding-start: 0px;
+      overflow: hidden;
+    }
+   
+    li {
+
+      list-style-type: none;
+      float: left;
+      width: 50%;
+      border-radius: 5px;
+      display: inline;
+      padding: 5px;
+      margin-top: 5px;
+
+      label {
+        cursor:  pointer;
+        display: inline;
+        line-height: 1.5em;
+        vertical-align: middle;
+        color: #1e90ff;
+      }
+
+      span {
+        font-size: .8em;
+        display: block;
+      }
+
+    }
+
+    .filters {
+      background-color: white;
+      border: none;
+      margin-top: 1em;
+      float: none;
+      display: block;
+
+      .filter-toggle, .filter-more { 
+        font-size: 1em;
+        background-color: #eeeeee;
+        border: 1px solid #dddddd;
+        padding: 0.5em;
+        border-radius: 0.5em;
+        margin: 0.2em;
+        text-decoration: none;
+      }
+    }
+  }
+}
+.moin-item-index div {
+
+  .moin-select-item {
+    display: inline-block;
+    width: 17px;
+    cursor: default;
+    margin-top: 1em;
+  }
+}
+.moin-download-link {
+  display: none;
+}
+.moin-index-message {
+  width: 50%;
+  margin: 1em auto;
+  text-align: center;
+  display: none;
+
+  span {
+    padding: 4px;
+    background-color: #007cef;
+    color: #ffffff;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+  }
+}
+.moin-index-path {
+  margin-left: .5em;
+
+  &:before {
+    content: icon-folder-close;
+    margin: 0.3em
+  }
+}
+.moin-clr {
+  clear: both;
+}
+.moin-item-index {
+  width: 100%;
+  margin-left: 0.5em;
+
+  div {
+    float: left;
+    width: 16.5em;
+
+    .moin-select-item {
+      display: inline-block;
+      width: 17px;
+      cursor: default;
+      margin-top: 1em;
+    }
+  }
+}
+.moin-index-separator {
+  clear: both;
+  border-top: 1px dashed #ccc;
+  display: none;
+}
+.popup-container {
+  margin: 0;
+  border: 5px solid #428bca;
+  border-radius: 6px 6px 0 0;
+}
+.popup-header {
+  background-color: #428bca;
+  color: #ffffff;
+  padding: 10px;
+  margin: 0;
+}
+input {
+
+  &[value="X"] {
+    padding: 0.1px;
+    margin: -.2em;
+    width: 19px;
+    border-radius: 2em;
+    float: right;
+
+    &:hover {
+      background: #f4f4f4;
+    }
+  }
+
+  &[type="text"] {
+    width: 96%;
+  }
+
+  &[type="submit"],&[type="button"],button {
+    font-weight: bold;
+    font-size: .75em;
+    background: #d6d5d0;
+    padding: 4px 15px;
+    border: 1px solid #ccc;
+    border-radius: 6px;
+    box-shadow: 1px 1px 2px #9d9d9b;
+    cursor: pointer;
+  }
+
+  &:hover {
+    box-shadow: 1px 1px 2px #000;
+  }
+
+  &:active {
+    position: relative;
+    top: 1px;
+  }
+}
+input,select {
+  padding: 3px;
+  background: #f4f4f4;
+  border: 1px solid #ccc;
+  border-radius: 2px;
+}
+.popup-body {
+  clear: both;
+  background-color: #f4f4f4;
+  color: #000000;
+  padding: 10px;
+  margin: 0;
+
+  label {
+    margin: 5px;
+  }
+
+  input {
+    margin: 8px 5px;
+  }
+}
+#moin-initials {
+  width: 90%;
+  margin: 5px auto;
+  text-align: center;
+
+  a {
+    display: inline-block;
+    margin: 0;
+    padding: 4px 5px;
+
+    &:hover,&.selected {
+      background: #428bca;
+      border-radius: 5px;
+      color: #ffffff;
+      text-decoration: none
+    }
+  }
+}
+#popup {
+  background: transparent;
+  padding: 5px;
+  width: 40%;
+  position: absolute;
+  top: 10%;
+  left: 30%;
+  display: none;
+  z-index: 10;
+}
+.moin-error {
+  color: #ff2727;
+  background: #d6d5d0;
+  padding: 4px;
+  margin: 1em;
+  text-align: center;
+  list-style-type: none;
+  border-radius: 5px;
+}
+.moin-textcha {
+  padding-top: .2em;
+}
+#moin-upload-cont {
+  min-height: 10px;
+}
+#file_upload {
+  margin-top: 2em;
+}
+form.upload_file {
+  background-color: #d6d5d0;
+  border: 1px solid #ccc;
+ cursor: pointer;
+  direction: ltr;
+  font-weight: bold;
+  height: 2.5em;
+  line-height: 2.5em;
+  overflow: hidden;
+  position: relative;
+  text-align: center;
+  width: 15em;
+  display: block;
+  box-shadow: 0 0 5px #9d9d9b;
+
+  &:hover {
+    box-shadow: 0 0 5px #000;
+  }
+
+  input {
+    cursor: pointer;
+    height: 100%;
+    margin: 0;
+    opacity: 0;
+    position: absolute;
+  }
+
+  button {
+    display: none
+  }
+}
+.file_upload_template .file_upload_start {
+  visibility: hidden;
+  border-width: 0;
+  padding: 0;
+
+  button {
+    width: 0;
+  }
+}
+.file_name {
+  word-break: break-all;
+  word-wrap: break-word;
+  max-width: 10em;
+}
+.upload-form {
+  display: none;
+}
+.moin-drag {
+  font-size: .7em;
+  color: #9d9d9b;
+}
+#lightbox {
+  background: #f4f4f4;
+  opacity: .7;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 9;
+  margin: 0;
+  display: none
+}
+.moin-content {
+  padding-bottom: 100px;
+}
+.moin-footer {
+  bottom: 0;
+  position: absolute;
+  width: 100%;
+}
+.moin-search-option-bar {
+  padding-left: 10px;
+  border: 1px solid @gray;
+  background-color: @search_option_bar_color;
+  color: @search_option_bar_text_color;
+  border-radius: 5px;
+  > span {
+    float: right;
+    padding: 10px;
+  }
+}
 // set min-width to prevent search box from floating off window to right
 @media (min-width: 768px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
 @media (min-width: 992px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
 @media (min-width: 1200px) {
   .container {
+    min-height: 100%;
+    position: relative;
     width: auto;
   }
 }
--- a/MoinMoin/themes/basic/static/custom-less/moin-variables.less	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/basic/static/custom-less/moin-variables.less	Thu Jul 03 22:04:50 2014 +0200
@@ -23,3 +23,9 @@
 
 // Darker-Navbar and List heading background
 @navbar-bg: #eee;
+
+// Search
+// -------------------------
+@searchstats_color:              #808080;
+@search_option_bar_color:        #1b436d;
+@search_option_bar_text_color:   #c8ddf1;
Binary file MoinMoin/themes/basic/static/img/admonitions/caution.png has changed
Binary file MoinMoin/themes/basic/static/img/admonitions/important.png has changed
Binary file MoinMoin/themes/basic/static/img/admonitions/note.png has changed
Binary file MoinMoin/themes/basic/static/img/admonitions/tip.png has changed
Binary file MoinMoin/themes/basic/static/img/admonitions/warning.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/alert.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/angry.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/attention.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/biggrin.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/checkmark.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/devil.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/frown.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/icon-error.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/icon-info.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/idea.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/ohwell.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/prio1.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/prio2.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/prio3.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/redface.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/sad.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/smile.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/smile2.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/smile3.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/smile4.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/star_off.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/star_on.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/thumbs-up.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/tired.png has changed
Binary file MoinMoin/themes/basic/static/img/smileys/tongue.png has changed
--- a/MoinMoin/themes/basic/templates/index.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/basic/templates/index.html	Thu Jul 03 22:04:50 2014 +0200
@@ -6,61 +6,74 @@
     {{ itemviews }}
 {% endblock %}
 
-{% if item_name %}
-    {% set title = _("Index of subitems of '%(item_name)s'", item_name=item_name) %}
-{% else %}
-    {% set title = _("Global Index") %}
-{% endif %}
-
 {% block action_bars_inner %}
-    <ul>
-        {% if dirs or files %}
-        <li class="action-bar">
-        <div class="moin-select-all">
-            <span class="moin-select-allitem allitem-toselect" title="{{ _("Select All") }}">{{ _("Select All") }}</span>
-        </div>
-        </li>
-        {% endif %}
-        <li class="action-bar">
-        <div class="moin-select-actions">
-            <div>
-                <span class="show-action">Actions</span>
+    <nav class="navbar navbar-default" role="navigation">
+        <div class="container-fluid">
+            <div class="navbar-header">
+                {% if item_name %}
+                    {% set title = _("Index of subitems of '%(item_name)s'", item_name=item_name) %}
+                {% else %}
+                    {% set title = _("Global Index ") %}
+                {% endif %}
+                <a class="navbar-brand" href="#">{{ title }}</a>
             </div>
-            <ul>
-                <li id="moin-create-newitem">{{ _("New item") }}</li>
-                {% if dirs or files %}
-                <li id="moin-download-trigger">{{ _("Download") }}</li>
-                <li class="moin-action-tab"
-                    id="moin-delete-trigger"
-                    data-actionurl="{{ url_for('frontend.ajaxdelete', item_name=item_name) }}">
-                    {{ _("Delete") }}
-                </li>
-                <li class="moin-action-tab"
-                    id="moin-destroy-trigger"
-                    data-actionurl="{{ url_for('frontend.ajaxdestroy', item_name=item_name) }}">
-                    {{ _("Destroy") }}
-                </li>
-                {% endif %}
-            </ul>
+            <div class="collapse navbar-collapse">
+                <ul class="nav navbar-nav">
+                    {% if dirs or files %}
+                        <li class="moin-select-all"><a href="#" class="moin-select-allitem allitem-toselect">
+                           <span class="icon-ok"></span>
+                           {{ _("Select All") }}</a>
+                        </li>
+                    {% endif %}
+                    <li class="moin-select-actions"><a id="moin-create-newitem" href="#">
+                           <span class="icon-file"></span>
+                           {{ _("New Item") }}</a>
+                    </li>
+                    {% if dirs or files %}
+                    <li><a id="moin-download-trigger" href="#">
+                           <span class="icon-download-alt"></span>
+                           {{ _("Download") }}</a>
+                    </li>
+                    <li><a class="moin-action-tab"
+                           id="moin-delete-trigger"
+                           data-actionurl="{{ url_for('frontend.ajaxdelete', item_name=item_name) }}" href="#">
+                           <span class="icon-minus-sign"></span>
+                           {{ _("Delete") }}</a>
+                    </li>
+                    <li><a class="moin-action-tab"
+                           id="moin-destroy-trigger"
+                           data-actionurl="{{ url_for('frontend.ajaxdestroy', item_name=item_name) }}" href="#">
+                           <span class="icon-remove-sign"></span>
+                           {{ _("Destroy") }}</a>
+                    </li>
+                   {% endif %}
+                </ul>
+            </div>
         </div>
-        </li>
-        <li class="action-bar">
-        <div class="moin-contenttypes-wrapper">
-            <div class="ct-hide">{{ _("Filter by content type") }}</div>
-            {% set unknown_items_label = _("items having unknown mime types") %}
-            {{ gen.form.open(form, method="get", action=url_for('frontend.index', item_name=item_name)) }}
-            <ul>
-                <li>
-                    <a href="#" class="filter-toggle">&raquo; {{ _("Toggle") }}</a>
-                    <a href="#" class="filter-more">&raquo; {{ _("More") }}</a>
-                </li>
-                {{ forms.render(form['contenttype']) }}
-            </ul>
-            {{ forms.render_submit(form) }}
-            {{ gen.form.close() }}
+    </nav>
+    <div class="moin-contenttypes-wrapper">
+        <div class="ct-hide" id="filter-btn">
+            <span class="icon-filter"></span>
+            {{ _("Filter by content type") }}
         </div>
-        </li>
-    </ul>
+        {% set unknown_items_label = _("items having unknown mime types") %}
+        {{ gen.form.open(form, method="get", action=url_for('frontend.index', item_name=item_name)) }}
+        <ul>
+            <li class="filters">
+                <a href="#" class="filter-toggle">
+                    <span class="icon-refresh" style="display:inline;"></span>
+                    {{ _("Toggle") }}
+                </a>
+                <a href="#" class="filter-more">
+                    <span class="icon-plus" style="display:inline;"></span>
+                    {{ _("More") }}
+                </a>
+            </li>
+            {{ forms.render(form['contenttype']) }}
+        </ul>
+        {{ forms.render_submit(form) }}
+        {{ gen.form.close() }}
+    </div>
 {% endblock %}
 
 {% block action_bars %}
@@ -78,7 +91,6 @@
 {% macro render_dir_entry(e) %}
     <div>
         <a href="{{ url_for('.index', item_name=e.fullname) }}"
-           name="{{ entry_anchor('dir', e) }}"
            {# TODO .moin-dir-item class is not styled yet #}
            class="moin-dir-item"
            title="{{ e.relname }}">
@@ -94,12 +106,13 @@
 
 {% macro render_file_entry(e) %}
     <div>
-        <span class="moin-select-item">&nbsp;</span>
+        <span class="moin-select-item">
+            <input type="checkbox">
+        </span>
         {% set mimetype = "application/x.moin.download" %}
         <a href="{{ url_for('.download_item', item_name=e.fullname, mimetype=mimetype) }}" class="moin-download-link">
         </a>
         <a href="{{ url_for('.show_item', item_name=e.fullname) }}"
-           name="{{ entry_anchor('file', e) }}"
            {# TODO .moin-itemtype-* classes are not styled yet #}
            class="{{ e.meta['contenttype']|contenttype_to_class }} moin-itemtype-{{ e.meta['itemtype'] }} moin-item"
            title="{{ e.relname }}">
@@ -120,6 +133,7 @@
     {% if item_name: %}
         <h1>{{ title }}</h1>
         <div class="moin-index-path">
+            <span class="icon icon-folder-close"></span>
             <a href="{{ url_for('frontend.index') }}" title="{{ _("Global Index") }}">{{ ("..") }}</a>
             <span class="moin-path-separator">{{ ("/") }}</span>
             {% for i in range(0, item_names|count) %}
@@ -144,9 +158,15 @@
     {% if files or dirs %}
     <div id="moin-initials">
         {% if not startswith %}
-            <a class="selected" href="{{ url_for('frontend.index', item_name=item_name) }}">{{ _("All") }}</a>
+            <a class="selected" href="{{ url_for('frontend.index', item_name=item_name) }}">
+                <span class="icon-th"></span>
+                {{ _("Show All") }}
+            </a>
         {% else %}
-            <a href="{{ url_for('frontend.index', item_name=item_name) }}">{{ _("All") }}</a>
+            <a href="{{ url_for('frontend.index', item_name=item_name) }}">
+                <span class="icon-th"></span>
+                {{ _("Show All") }}
+            </a>
         {% endif %}
         {% for initial in initials %}
             {% if startswith == initial %}
--- a/MoinMoin/themes/basic/templates/layout.html	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/basic/templates/layout.html	Thu Jul 03 22:04:50 2014 +0200
@@ -50,7 +50,7 @@
 
 {% block layout %}
     <div class="container">
-        <div class="row">
+        <div class="row moin-header">
             <div class="col-lg-2 moin-logo">
                 {% if logo %}
                 <a href="{{ url_for('frontend.show_item', item_name=cfg.item_root) }}">
@@ -78,7 +78,7 @@
                                         {% endif %}
                                     </div>
                                 </div>
-                                <div class="col-lg-6">
+                                <div class="col-lg-6 moin-loginsettings">
                                     <div class="moin-navbar-collapse navbar-collapse collapse in" id="target">
                                         <ul class="nav navbar-nav moin-pull-right">
 
@@ -209,7 +209,7 @@
             </div> <!-- col-lg-10 -->
         </div> <!-- row-topnavbar -->
 
-        <div class="row">
+        <div class="row moin-content">
             <div class="col-lg-2">
                 <div class="row">
                     <div class="col-lg-12">
@@ -296,7 +296,7 @@
         </div> <!--/row sidebar, tabs, content - main-->
 
         {% block footer %}
-        <div class="row">
+        <div class="row moin-footer">
             <div class="col-lg-12">
                 <div class="navbar"> <!--footer-->
                     {{ footer_logos }}
--- a/MoinMoin/themes/foobar/static/css/common.css	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/foobar/static/css/common.css	Thu Jul 03 22:04:50 2014 +0200
@@ -38,66 +38,66 @@
 input, select { vertical-align: middle; }
 /* end HTML5 reset */
 .hll { background-color: #ffffcc }
-.c { color: #408080; font-style: italic } /* Comment */
-.err { border: 1px solid #FF0000 } /* Error */
-.k { color: #008000; font-weight: bold } /* Keyword */
-.o { color: #666666 } /* Operator */
-.cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.cp { color: #BC7A00 } /* Comment.Preproc */
-.c1 { color: #408080; font-style: italic } /* Comment.Single */
-.cs { color: #408080; font-style: italic } /* Comment.Special */
+.c { color: #888888 } /* Comment */
+.err { color: #FF0000; background-color: #FFAAAA } /* Error */
+.k { color: #008800; font-weight: bold } /* Keyword */
+.o { color: #333333 } /* Operator */
+.cm { color: #888888 } /* Comment.Multiline */
+.cp { color: #557799 } /* Comment.Preproc */
+.c1 { color: #888888 } /* Comment.Single */
+.cs { color: #cc0000; font-weight: bold } /* Comment.Special */
 .gd { color: #A00000 } /* Generic.Deleted */
 .ge { font-style: italic } /* Generic.Emph */
 .gr { color: #FF0000 } /* Generic.Error */
 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .gi { color: #00A000 } /* Generic.Inserted */
-.go { color: #808080 } /* Generic.Output */
-.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.go { color: #888888 } /* Generic.Output */
+.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
 .gs { font-weight: bold } /* Generic.Strong */
 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.gt { color: #0040D0 } /* Generic.Traceback */
-.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
-.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #008000 } /* Keyword.Pseudo */
-.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #B00040 } /* Keyword.Type */
-.m { color: #666666 } /* Literal.Number */
-.s { color: #BA2121 } /* Literal.String */
-.na { color: #7D9029 } /* Name.Attribute */
-.nb { color: #008000 } /* Name.Builtin */
-.nc { color: #0000FF; font-weight: bold } /* Name.Class */
-.no { color: #880000 } /* Name.Constant */
-.nd { color: #AA22FF } /* Name.Decorator */
-.ni { color: #999999; font-weight: bold } /* Name.Entity */
-.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
-.nf { color: #0000FF } /* Name.Function */
-.nl { color: #A0A000 } /* Name.Label */
-.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
-.nt { color: #008000; font-weight: bold } /* Name.Tag */
-.nv { color: #19177C } /* Name.Variable */
-.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.gt { color: #0044DD } /* Generic.Traceback */
+.kc { color: #008800; font-weight: bold } /* Keyword.Constant */
+.kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */
+.kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #333399; font-weight: bold } /* Keyword.Type */
+.m { color: #6600EE; font-weight: bold } /* Literal.Number */
+.s { background-color: #fff0f0 } /* Literal.String */
+.na { color: #0000CC } /* Name.Attribute */
+.nb { color: #007020 } /* Name.Builtin */
+.nc { color: #BB0066; font-weight: bold } /* Name.Class */
+.no { color: #003366; font-weight: bold } /* Name.Constant */
+.nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.ni { color: #880000; font-weight: bold } /* Name.Entity */
+.ne { color: #FF0000; font-weight: bold } /* Name.Exception */
+.nf { color: #0066BB; font-weight: bold } /* Name.Function */
+.nl { color: #997700; font-weight: bold } /* Name.Label */
+.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.nt { color: #007700 } /* Name.Tag */
+.nv { color: #996633 } /* Name.Variable */
+.ow { color: #000000; font-weight: bold } /* Operator.Word */
 .w { color: #bbbbbb } /* Text.Whitespace */
-.mf { color: #666666 } /* Literal.Number.Float */
-.mh { color: #666666 } /* Literal.Number.Hex */
-.mi { color: #666666 } /* Literal.Number.Integer */
-.mo { color: #666666 } /* Literal.Number.Oct */
-.sb { color: #BA2121 } /* Literal.String.Backtick */
-.sc { color: #BA2121 } /* Literal.String.Char */
-.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
-.s2 { color: #BA2121 } /* Literal.String.Double */
-.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
-.sh { color: #BA2121 } /* Literal.String.Heredoc */
-.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
-.sx { color: #008000 } /* Literal.String.Other */
-.sr { color: #BB6688 } /* Literal.String.Regex */
-.s1 { color: #BA2121 } /* Literal.String.Single */
-.ss { color: #19177C } /* Literal.String.Symbol */
-.bp { color: #008000 } /* Name.Builtin.Pseudo */
-.vc { color: #19177C } /* Name.Variable.Class */
-.vg { color: #19177C } /* Name.Variable.Global */
-.vi { color: #19177C } /* Name.Variable.Instance */
-.il { color: #666666 } /* Literal.Number.Integer.Long */
+.mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */
+.mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */
+.mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
+.mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */
+.sb { background-color: #fff0f0 } /* Literal.String.Backtick */
+.sc { color: #0044DD } /* Literal.String.Char */
+.sd { color: #DD4422 } /* Literal.String.Doc */
+.s2 { background-color: #fff0f0 } /* Literal.String.Double */
+.se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
+.sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
+.si { background-color: #eeeeee } /* Literal.String.Interpol */
+.sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */
+.sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
+.s1 { background-color: #fff0f0 } /* Literal.String.Single */
+.ss { color: #AA6600 } /* Literal.String.Symbol */
+.bp { color: #007020 } /* Name.Builtin.Pseudo */
+.vc { color: #336699 } /* Name.Variable.Class */
+.vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */
+.vi { color: #3333BB } /* Name.Variable.Instance */
+.il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
 /* smileys -- <span class="moin-text-icon moin-smile">:-)</span> */
 .moin-text-icon { font-size: 0; color: transparent; }
 .moin-alert:before { content: url('../img/smileys/alert.png'); }
@@ -251,9 +251,7 @@
 #moin-initials a:hover,#moin-initials a.selected{background:#1e90ff;border-radius:5px;color:#fff;text-decoration:none}
 .moin-item-index{width:100%;margin-left:.5em;}
 .moin-item-index div{float:left;width:16.5em;}
-.moin-item-index div .moin-select-item{visibility:hidden;display:inline-block;width:17px;cursor:default;background:transparent url("../img/moin-checkbox-off.png") no-repeat;margin-top:1em}
-.moin-item-index div.selected-item .moin-select-item,.moin-item-index div:hover .moin-select-item{visibility:visible}
-.moin-item-index div.selected-item .moin-select-item{background-image:url("../img/moin-checkbox-on.png")}
+.moin-item-index div .moin-select-item{display:inline-block;width:17px;cursor:default;margin-top:1em}
 #lightbox{background:#f4f4f4;opacity:.7;position:absolute;left:0;top:0;width:100%;height:100%;z-index:9;margin:0;display:none}
 .filter-toggle{margin:0 .2em;font-size:.9em}
 .moin-more-index{background:transparent url("../img/moin-expand.png") no-repeat;display:inline-block;width:20px;}
@@ -354,10 +352,9 @@
 .searchresults dt{margin-top:1em;font-weight:normal}
 .searchresults dd,.searchresults p{font-size:.85em}
 .searchresults td{border-width:0}
-.searchresults p.info{margin-left:2%}
-.searchresults .searchhitinfobar{margin-left:15px;margin-top:0}
-.searchresults .foundtext{margin-left:15px;margin-top:0}
-p.searchstats{font-size:.8em;text-align:right;width:100%;padding:2px}
+.searchresults .searchhitinfobar{margin-top:0;display:inline}
+.searchresults .foundtext{margin-top:0}
+p.searchstats{font-size:.8em;width:100%;padding-left:14px}
 p.searchhint{background-color:#f4f4f4;border:1px solid #9d9d9b;padding:2px}
 .searchpages{margin-left:auto;margin-right:auto;}
 .searchpages tr,.searchpages td{border:0;padding:5px;margin:0;text-align:center;vertical-align:middle;color:#000;font-weight:bold;font-size:1.05em}
@@ -449,5 +446,12 @@
 .moin-big{font-size:1.17em}
 .moin-small{font-size:.83em}
 .moin-integer{text-align:right;padding-right:1em;width:2%}
+html,body{height:100%}
+#moin-main-container{min-height:100%;position:relative}
+#moin-main-box{margin-bottom:60px}
+#moin-footer{position:absolute;bottom:5px;width:98%}
+.moin-search-option-bar{width:75%;padding-left:14px;}
+.moin-search-option-bar span{float:right;padding:10px}
+.moin-suggestions{padding-left:14px}
 @media print{#moin-global-tray,#moin-local-panel,#moin-footer,#moin-searchform{display:none}
 }
--- a/MoinMoin/themes/foobar/static/css/stylus/main.styl	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/foobar/static/css/stylus/main.styl	Thu Jul 03 22:04:50 2014 +0200
@@ -8,8 +8,8 @@
 // reset all browser-specific default to have common defaults everywhere
 @import "reset.css"
 
-// auto-generated by pygmentize -S default -f html >pygments_default.css
-@import "pygments_default.css"
+// pygments css - colorful theme
+@import "colorful.css"
 
 // smileys used by moin wiki parser (and maybe others)
 @import "smileys.css"
@@ -361,17 +361,10 @@
         float left
         width 16.5em
         .moin-select-item
-            visibility hidden
             display inline-block
             width 17px
             cursor default
-            background transparent url("../img/moin-checkbox-off.png") no-repeat
             margin-top 1em
-        &.selected-item .moin-select-item,
-        &:hover .moin-select-item
-            visibility visible
-        &.selected-item .moin-select-item
-            background-image url("../img/moin-checkbox-on.png")
 
 #lightbox
     background page_color
@@ -800,22 +793,18 @@
         font-size 0.85em
     td
         border-width 0
-    p.info
-        margin-left 2%
 
 .searchresults .searchhitinfobar
-    margin-left 15px
     margin-top 0
+    display inline
 
 .searchresults .foundtext
-    margin-left 15px
     margin-top 0
 
 p.searchstats
     font-size 0.8em
-    text-align right
     width 100%
-    padding 2px
+    padding-left 14px
 
 p.searchhint
     background-color page_color
@@ -1155,6 +1144,32 @@
     padding-right 1em
     width 2%
 
+html,
+body
+    height 100%
+
+#moin-main-container
+    min-height 100%
+    position relative
+
+#moin-main-box
+    margin-bottom 60px
+
+#moin-footer
+    position absolute
+    bottom 5px
+    width 98%
+
+.moin-search-option-bar
+    width 75%
+    padding-left 14px
+    span
+        float right
+        padding 10px
+
+.moin-suggestions
+    padding-left 14px
+
 /* fix tests -- currently checking <big> and <small> */
 @media print
     #moin-global-tray
--- a/MoinMoin/themes/foobar/static/css/stylus/pygments_default.css	Thu Jul 03 22:01:38 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-.hll { background-color: #ffffcc }
-.c { color: #408080; font-style: italic } /* Comment */
-.err { border: 1px solid #FF0000 } /* Error */
-.k { color: #008000; font-weight: bold } /* Keyword */
-.o { color: #666666 } /* Operator */
-.cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.cp { color: #BC7A00 } /* Comment.Preproc */
-.c1 { color: #408080; font-style: italic } /* Comment.Single */
-.cs { color: #408080; font-style: italic } /* Comment.Special */
-.gd { color: #A00000 } /* Generic.Deleted */
-.ge { font-style: italic } /* Generic.Emph */
-.gr { color: #FF0000 } /* Generic.Error */
-.gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.gi { color: #00A000 } /* Generic.Inserted */
-.go { color: #808080 } /* Generic.Output */
-.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
-.gs { font-weight: bold } /* Generic.Strong */
-.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.gt { color: #0040D0 } /* Generic.Traceback */
-.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
-.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #008000 } /* Keyword.Pseudo */
-.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #B00040 } /* Keyword.Type */
-.m { color: #666666 } /* Literal.Number */
-.s { color: #BA2121 } /* Literal.String */
-.na { color: #7D9029 } /* Name.Attribute */
-.nb { color: #008000 } /* Name.Builtin */
-.nc { color: #0000FF; font-weight: bold } /* Name.Class */
-.no { color: #880000 } /* Name.Constant */
-.nd { color: #AA22FF } /* Name.Decorator */
-.ni { color: #999999; font-weight: bold } /* Name.Entity */
-.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
-.nf { color: #0000FF } /* Name.Function */
-.nl { color: #A0A000 } /* Name.Label */
-.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
-.nt { color: #008000; font-weight: bold } /* Name.Tag */
-.nv { color: #19177C } /* Name.Variable */
-.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
-.w { color: #bbbbbb } /* Text.Whitespace */
-.mf { color: #666666 } /* Literal.Number.Float */
-.mh { color: #666666 } /* Literal.Number.Hex */
-.mi { color: #666666 } /* Literal.Number.Integer */
-.mo { color: #666666 } /* Literal.Number.Oct */
-.sb { color: #BA2121 } /* Literal.String.Backtick */
-.sc { color: #BA2121 } /* Literal.String.Char */
-.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
-.s2 { color: #BA2121 } /* Literal.String.Double */
-.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
-.sh { color: #BA2121 } /* Literal.String.Heredoc */
-.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
-.sx { color: #008000 } /* Literal.String.Other */
-.sr { color: #BB6688 } /* Literal.String.Regex */
-.s1 { color: #BA2121 } /* Literal.String.Single */
-.ss { color: #19177C } /* Literal.String.Symbol */
-.bp { color: #008000 } /* Name.Builtin.Pseudo */
-.vc { color: #19177C } /* Name.Variable.Class */
-.vg { color: #19177C } /* Name.Variable.Global */
-.vi { color: #19177C } /* Name.Variable.Instance */
-.il { color: #666666 } /* Literal.Number.Integer.Long */
--- a/MoinMoin/themes/modernized/static/css/common.css	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/modernized/static/css/common.css	Thu Jul 03 22:04:50 2014 +0200
@@ -131,66 +131,66 @@
 .moin-diff-removed{background-color:#ffffe0;vertical-align:top;width:50%;white-space:pre-wrap;word-wrap:break-word;font-family:monospace;}
 .moin-diff-removed span{background-color:#ffff80}
 .hll { background-color: #ffffcc }
-.c { color: #408080; font-style: italic } /* Comment */
-.err { border: 1px solid #FF0000 } /* Error */
-.k { color: #008000; font-weight: bold } /* Keyword */
-.o { color: #666666 } /* Operator */
-.cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.cp { color: #BC7A00 } /* Comment.Preproc */
-.c1 { color: #408080; font-style: italic } /* Comment.Single */
-.cs { color: #408080; font-style: italic } /* Comment.Special */
+.c { color: #888888 } /* Comment */
+.err { color: #FF0000; background-color: #FFAAAA } /* Error */
+.k { color: #008800; font-weight: bold } /* Keyword */
+.o { color: #333333 } /* Operator */
+.cm { color: #888888 } /* Comment.Multiline */
+.cp { color: #557799 } /* Comment.Preproc */
+.c1 { color: #888888 } /* Comment.Single */
+.cs { color: #cc0000; font-weight: bold } /* Comment.Special */
 .gd { color: #A00000 } /* Generic.Deleted */
 .ge { font-style: italic } /* Generic.Emph */
 .gr { color: #FF0000 } /* Generic.Error */
 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .gi { color: #00A000 } /* Generic.Inserted */
-.go { color: #808080 } /* Generic.Output */
-.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.go { color: #888888 } /* Generic.Output */
+.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
 .gs { font-weight: bold } /* Generic.Strong */
 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.gt { color: #0040D0 } /* Generic.Traceback */
-.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
-.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #008000 } /* Keyword.Pseudo */
-.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #B00040 } /* Keyword.Type */
-.m { color: #666666 } /* Literal.Number */
-.s { color: #BA2121 } /* Literal.String */
-.na { color: #7D9029 } /* Name.Attribute */
-.nb { color: #008000 } /* Name.Builtin */
-.nc { color: #0000FF; font-weight: bold } /* Name.Class */
-.no { color: #880000 } /* Name.Constant */
-.nd { color: #AA22FF } /* Name.Decorator */
-.ni { color: #999999; font-weight: bold } /* Name.Entity */
-.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
-.nf { color: #0000FF } /* Name.Function */
-.nl { color: #A0A000 } /* Name.Label */
-.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
-.nt { color: #008000; font-weight: bold } /* Name.Tag */
-.nv { color: #19177C } /* Name.Variable */
-.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.gt { color: #0044DD } /* Generic.Traceback */
+.kc { color: #008800; font-weight: bold } /* Keyword.Constant */
+.kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */
+.kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #333399; font-weight: bold } /* Keyword.Type */
+.m { color: #6600EE; font-weight: bold } /* Literal.Number */
+.s { background-color: #fff0f0 } /* Literal.String */
+.na { color: #0000CC } /* Name.Attribute */
+.nb { color: #007020 } /* Name.Builtin */
+.nc { color: #BB0066; font-weight: bold } /* Name.Class */
+.no { color: #003366; font-weight: bold } /* Name.Constant */
+.nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.ni { color: #880000; font-weight: bold } /* Name.Entity */
+.ne { color: #FF0000; font-weight: bold } /* Name.Exception */
+.nf { color: #0066BB; font-weight: bold } /* Name.Function */
+.nl { color: #997700; font-weight: bold } /* Name.Label */
+.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.nt { color: #007700 } /* Name.Tag */
+.nv { color: #996633 } /* Name.Variable */
+.ow { color: #000000; font-weight: bold } /* Operator.Word */
 .w { color: #bbbbbb } /* Text.Whitespace */
-.mf { color: #666666 } /* Literal.Number.Float */
-.mh { color: #666666 } /* Literal.Number.Hex */
-.mi { color: #666666 } /* Literal.Number.Integer */
-.mo { color: #666666 } /* Literal.Number.Oct */
-.sb { color: #BA2121 } /* Literal.String.Backtick */
-.sc { color: #BA2121 } /* Literal.String.Char */
-.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
-.s2 { color: #BA2121 } /* Literal.String.Double */
-.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
-.sh { color: #BA2121 } /* Literal.String.Heredoc */
-.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
-.sx { color: #008000 } /* Literal.String.Other */
-.sr { color: #BB6688 } /* Literal.String.Regex */
-.s1 { color: #BA2121 } /* Literal.String.Single */
-.ss { color: #19177C } /* Literal.String.Symbol */
-.bp { color: #008000 } /* Name.Builtin.Pseudo */
-.vc { color: #19177C } /* Name.Variable.Class */
-.vg { color: #19177C } /* Name.Variable.Global */
-.vi { color: #19177C } /* Name.Variable.Instance */
-.il { color: #666666 } /* Literal.Number.Integer.Long */
+.mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */
+.mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */
+.mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
+.mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */
+.sb { background-color: #fff0f0 } /* Literal.String.Backtick */
+.sc { color: #0044DD } /* Literal.String.Char */
+.sd { color: #DD4422 } /* Literal.String.Doc */
+.s2 { background-color: #fff0f0 } /* Literal.String.Double */
+.se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
+.sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
+.si { background-color: #eeeeee } /* Literal.String.Interpol */
+.sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */
+.sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
+.s1 { background-color: #fff0f0 } /* Literal.String.Single */
+.ss { color: #AA6600 } /* Literal.String.Symbol */
+.bp { color: #007020 } /* Name.Builtin.Pseudo */
+.vc { color: #336699 } /* Name.Variable.Class */
+.vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */
+.vi { color: #3333BB } /* Name.Variable.Instance */
+.il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
 html{color:#000;font-family:Helvetica,Arial,sans-serif}
 p{margin:1em 0;font-size:1em;line-height:1.3em}
 sub{vertical-align:sub}
@@ -306,10 +306,9 @@
 .searchresults dt{margin-top:1em;font-weight:normal}
 .searchresults dd,.searchresults p{font-size:.85em}
 .searchresults td{border-width:0}
-.searchresults p.info{margin-left:2%}
-.searchresults .searchhitinfobar{margin-left:15px;margin-top:0}
-.searchresults .foundtext{margin-left:15px;margin-top:0}
-p.searchstats{font-size:.8em;text-align:right;width:100%;padding:2px}
+.searchresults .searchhitinfobar{margin-top:0;display:inline}
+.searchresults .foundtext{margin-top:0}
+p.searchstats{font-size:.8em;width:100%;padding-left:14px}
 p.searchhint{background-color:#eef1f6;border:1px solid #4e7da9;padding:2px}
 .searchpages{margin-left:auto;margin-right:auto}
 .searchpages tr,.searchpages td{border:0;padding:5px;margin:0;text-align:center;vertical-align:middle;color:#000;font-weight:bold;font-size:1.05em}
@@ -373,9 +372,7 @@
 #moin-initials a:hover,#moin-initials a.selected{background:#00008b;border-radius:5px;color:#fff;text-decoration:none}
 .moin-item-index{width:99%;margin-left:.5%}
 .moin-item-index div{float:left;width:15em}
-.moin-item-index div .moin-select-item{visibility:hidden;display:inline-block;width:17px;cursor:default;background:transparent url("../img/moin-checkbox-off.png") no-repeat}
-.moin-item-index div.selected-item .moin-select-item,.moin-item-index div:hover .moin-select-item{visibility:visible}
-.moin-item-index div.selected-item .moin-select-item{background-image:url("../img/moin-checkbox-on.png")}
+.moin-item-index div .moin-select-item{display:inline-block;width:17px;cursor:default}
 .moin-align-right{text-align:right;float:right}
 .moin-align-right ul{margin:0;padding:0}
 .moin-align-right ul li.action-bar{list-style-type:none;display:inline-block;*display:inline;zoom:1}
@@ -516,6 +513,13 @@
 a.moin-permalink{display:none;cursor:pointer;margin-left:.1em;color:#939393;}
 a.moin-permalink:hover.moin-permalink{color:#1f62ad}
 h1:hover .moin-permalink,h2:hover .moin-permalink,h3:hover .moin-permalink,h4:hover .moin-permalink,h5:hover .moin-permalink,h6:hover .moin-permalink{display:inline;text-decoration:none}
+html,body{height:100%}
+#moin-main-wrapper{position:relative;min-height:100%}
+#moin-page{padding-bottom:105px}
+#moin-footer{position:absolute;width:100%;bottom:0}
+.moin-search-option-bar{width:75%;padding-left:14px;}
+.moin-search-option-bar span{float:right;padding:10px}
+.moin-suggestions{padding-left:14px}
 @media print{html{font-family:serif;font-size:12pt;width:100%}
 body,#moin-page,#moin-content-data{margin:0;padding:0}
 a,a:visited,a.moin-nonexistent{color:#939393;text-decoration:none}
--- a/MoinMoin/themes/modernized/static/css/stylus/main.styl	Thu Jul 03 22:01:38 2014 +0200
+++ b/MoinMoin/themes/modernized/static/css/stylus/main.styl	Thu Jul 03 22:04:50 2014 +0200
@@ -26,8 +26,8 @@
 // moin diff styling
 @import "moin_diff"
 
-// auto-generated by pygmentize -S default -f html >pygments_default.css
-@import "pygments_default.css"
+// pygments css - colorful theme
+@import "colorful.css"
 
 html
     color font_color
@@ -511,22 +511,17 @@
 .searchresults td
     border-width 0
 
-.searchresults p.info
-    margin-left 2%
-
 .searchresults .searchhitinfobar
-    margin-left 15px
     margin-top 0
+    display inline
 
 .searchresults .foundtext
-    margin-left 15px
     margin-top 0
 
 p.searchstats
     font-size 0.8em
-    text-align right
     width 100%
-    padding 2px
+    padding-left 14px
 
 p.searchhint
     background-color table_bg_color
@@ -817,18 +812,9 @@
     width 15em
 
 .moin-item-index div .moin-select-item
-    visibility hidden
     display inline-block
     width 17px
     cursor default
-    background transparent url("../img/moin-checkbox-off.png") no-repeat
-
-.moin-item-index div.selected-item .moin-select-item,
-.moin-item-index div:hover .moin-select-item
-    visibility visible
-
-.moin-item-index div.selected-item .moin-select-item
-    background-image url("../img/moin-checkbox-on.png")
 
 .moin-align-right
     text-align right
@@ -1540,6 +1526,32 @@
     display inline
     text-decoration none
 
+html,
+body
+    height 100%
+
+#moin-main-wrapper
+    position relative
+    min-height 100%
+
+#moin-page
+    padding-bottom 105px
+
+#moin-footer
+    position absolute
+    width 100%
+    bottom 0
+
+.moin-search-option-bar
+    width 75%
+    padding-left 14px
+    span
+        float right
+        padding 10px
+
+.moin-suggestions
+    padding-left 14px
+
 @media print
     html
         font-family serif
--- a/MoinMoin/themes/modernized/static/css/stylus/pygments_default.css	Thu Jul 03 22:01:38 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-.hll { background-color: #ffffcc }
-.c { color: #408080; font-style: italic } /* Comment */
-.err { border: 1px solid #FF0000 } /* Error */
-.k { color: #008000; font-weight: bold } /* Keyword */
-.o { color: #666666 } /* Operator */
-.cm { color: #408080; font-style: italic } /* Comment.Multiline */
-.cp { color: #BC7A00 } /* Comment.Preproc */
-.c1 { color: #408080; font-style: italic } /* Comment.Single */
-.cs { color: #408080; font-style: italic } /* Comment.Special */
-.gd { color: #A00000 } /* Generic.Deleted */
-.ge { font-style: italic } /* Generic.Emph */
-.gr { color: #FF0000 } /* Generic.Error */
-.gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.gi { color: #00A000 } /* Generic.Inserted */
-.go { color: #808080 } /* Generic.Output */
-.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
-.gs { font-weight: bold } /* Generic.Strong */
-.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.gt { color: #0040D0 } /* Generic.Traceback */
-.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
-.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #008000 } /* Keyword.Pseudo */
-.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #B00040 } /* Keyword.Type */
-.m { color: #666666 } /* Literal.Number */
-.s { color: #BA2121 } /* Literal.String */
-.na { color: #7D9029 } /* Name.Attribute */
-.nb { color: #008000 } /* Name.Builtin */
-.nc { color: #0000FF; font-weight: bold } /* Name.Class */
-.no { color: #880000 } /* Name.Constant */
-.nd { color: #AA22FF } /* Name.Decorator */
-.ni { color: #999999; font-weight: bold } /* Name.Entity */
-.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
-.nf { color: #0000FF } /* Name.Function */
-.nl { color: #A0A000 } /* Name.Label */
-.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
-.nt { color: #008000; font-weight: bold } /* Name.Tag */
-.nv { color: #19177C } /* Name.Variable */
-.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
-.w { color: #bbbbbb } /* Text.Whitespace */
-.mf { color: #666666 } /* Literal.Number.Float */
-.mh { color: #666666 } /* Literal.Number.Hex */
-.mi { color: #666666 } /* Literal.Number.Integer */
-.mo { color: #666666 } /* Literal.Number.Oct */
-.sb { color: #BA2121 } /* Literal.String.Backtick */
-.sc { color: #BA2121 } /* Literal.String.Char */
-.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
-.s2 { color: #BA2121 } /* Literal.String.Double */
-.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
-.sh { color: #BA2121 } /* Literal.String.Heredoc */
-.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
-.sx { color: #008000 } /* Literal.String.Other */
-.sr { color: #BB6688 } /* Literal.String.Regex */
-.s1 { color: #BA2121 } /* Literal.String.Single */
-.ss { color: #19177C } /* Literal.String.Symbol */
-.bp { color: #008000 } /* Name.Builtin.Pseudo */
-.vc { color: #19177C } /* Name.Variable.Class */
-.vg { color: #19177C } /* Name.Variable.Global */
-.vi { color: #19177C } /* Name.Variable.Instance */
-.il { color: #666666 } /* Literal.Number.Integer.Long */
--- a/make.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/make.py	Thu Jul 03 22:04:50 2014 +0200
@@ -188,6 +188,12 @@
     return subprocess.check_output(command, shell=True)
 
 
+def get_pygments_data_location():
+    """Return the virtualenv site-packages/xstatic/pkg/pygments/data location."""
+    command = ACTIVATE + 'python -c "from xstatic.pkg.pygments import BASE_DIR; print BASE_DIR"'
+    return subprocess.check_output(command, shell=True)
+
+
 class Commands(object):
     """Each cmd_ method processes a choice on the menu."""
     def __init__(self):
@@ -350,10 +356,12 @@
         """run Stylus and lessc to update CSS files"""
         print 'Running Stylus to update Modernized theme CSS files...'
         # Note: we use / here to specify directory offsets; this works as used below in Windows XP, 2000, 7, 8
-        command = 'cd {0}{1}stylus --include-css --compress < main.styl > ../common.css'.format('MoinMoin/themes/modernized/static/css/stylus', SEP)
+        bootstrap_loc = get_bootstrap_data_location().strip() + '/less'
+        pygments_loc = get_pygments_data_location().strip() + '/css'
+        command = 'cd {0}{1}stylus --include {2} --include-css --compress < main.styl > ../common.css'.format('MoinMoin/themes/modernized/static/css/stylus', SEP, pygments_loc)
         result = subprocess.call(command, shell=True)
         print 'Running Stylus to update Foobar theme CSS files...'
-        command = 'cd {0}{1} stylus --include-css --compress < main.styl > ../common.css'.format('MoinMoin/themes/foobar/static/css/stylus', SEP)
+        command = 'cd {0}{1} stylus --include {2} --include-css --compress < main.styl > ../common.css'.format('MoinMoin/themes/foobar/static/css/stylus', SEP, pygments_loc)
         result2 = subprocess.call(command, shell=True)
         if result == 0 and result2 == 0:
             print 'Success: Modernized and Foobar CSS files updated.'
@@ -366,8 +374,11 @@
             print 'Error: failure running coding_std.py against modernized css files'
 
         print 'Running lessc to update Basic theme CSS files...'
-        data_loc = get_bootstrap_data_location().strip()
-        include = '--include-path=' + data_loc + '/less'
+        if WINDOWS_OS:
+            data_loc = '{0};{1}'.format(bootstrap_loc, pygments_loc)
+        else:
+            data_loc = '{0}:{1}'.format(bootstrap_loc, pygments_loc)
+        include = '--include-path=' + data_loc
         command = 'cd MoinMoin/themes/basic/static/custom-less{0}lessc {1} basic.less ../css/basic.css'.format(SEP, include)
         result = subprocess.call(command, shell=True)
         if result == 0:
--- a/setup.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/setup.py	Thu Jul 03 22:04:50 2014 +0200
@@ -113,6 +113,7 @@
         'XStatic-AnyWikiDraw>=0.14.2',
         'XStatic-svg-edit-moin>=2012.11.15.1',
         'XStatic-JQuery.TableSorter>=2.14.5.1',
+        'XStatic-Pygments>=1.6.0.1',
     ],
     # optional features and their list of requirements
     extras_require={
--- a/wikiconfig.py	Thu Jul 03 22:01:38 2014 +0200
+++ b/wikiconfig.py	Thu Jul 03 22:04:50 2014 +0200
@@ -69,6 +69,7 @@
         'autosize',
         'svgedit_moin', 'twikidraw_moin', 'anywikidraw',
         'jquery_tablesorter',
+        'pygments',
     ]
     pkg = __import__('xstatic.pkg', fromlist=mod_names)
     for mod_name in mod_names: