1. Thomas Waldmann
  2. moin-2.0

Commits

Thomas Waldmann  committed bc0f43f Merge

merged

  • Participants
  • Parent commits b27a0c4, 5099cf7
  • Branches default

Comments (0)

Files changed (58)

File MoinMoin/apps/frontend/views.py

View file
  • Ignore whitespace
 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
 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
         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'))
         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), ]
 
         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)]
     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)
 

File MoinMoin/constants/contenttypes.py

View file
  • Ignore whitespace
 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', ]

File MoinMoin/items/__init__.py

View file
  • Ignore whitespace
         return form
 
 
-UNKNOWN_ITEM_GROUP = "unknown items"
+UNKNOWN_ITEM_GROUP = "Unknown Items"
 
 
 def _build_contenttype_query(groups):

File MoinMoin/items/_tests/test_Item.py

View file
  • Ignore whitespace
         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'])

File MoinMoin/items/content.py

View file
  • Ignore whitespace
     Fallback Content for uploaded file of unknown contenttype.
     """
     contenttype = 'application/octet-stream'
-    display_name = 'binary file'
+    display_name = 'Binary File'
 
 
 class RenderableBinary(Binary):
 @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):

File MoinMoin/search/__init__.py

View file
  • Ignore whitespace
 
 class SearchForm(Form):
     q = Search
-    history = InlineCheckbox.using(label=L_('search all revisions'))
     submit_label = L_('Search')
 
     validators = [ValidSearch()]

File MoinMoin/static/css/common.css

View file
  • Ignore whitespace
+/*
+    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;
+}

File MoinMoin/static/js/index_action.js

View file
  • Ignore whitespace
         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);
+            });
         }
     });
 
     // 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")) {

File MoinMoin/static/js/search.js

View file
  • Ignore whitespace
         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);
     });
 });

File MoinMoin/templates/ajaxsearch.html

View file
  • Ignore whitespace
-<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>
                                     </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>
                 </table>
             </div>
         {% endif %}
+    {% endif %}
 {% endif %}

File MoinMoin/templates/base.html

View file
  • Ignore whitespace
 
     {% 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 -%}

File MoinMoin/templates/index.html

View file
  • Ignore whitespace
 
 {% 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>

File MoinMoin/templates/search.html

View file
  • Ignore whitespace
 {% 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() }}

File MoinMoin/themes/__init__.py

View file
  • Ignore whitespace
 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
 }
 
 
-# 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
     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
 
         '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(),

File MoinMoin/themes/basic/static/css/basic.css

View file
  • Ignore whitespace
     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;
 .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;
   }
 }

File MoinMoin/themes/basic/static/custom-less/basic.less

View file
  • Ignore whitespace
 @import "notice.less";
 @import "bootstrap.less";
 @import "moin-variables.less";
+@import (less) "colorful.css";
 
 // ---- Customising the top navbar breakpoint
 @grid-float-breakpoint: @screen-md;
 .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;
   }
 }

File MoinMoin/themes/basic/static/custom-less/moin-variables.less

View file
  • Ignore whitespace
 
 // Darker-Navbar and List heading background
 @navbar-bg: #eee;
+
+// Search
+// -------------------------
+@searchstats_color:              #808080;
+@search_option_bar_color:        #1b436d;
+@search_option_bar_text_color:   #c8ddf1;

File MoinMoin/themes/basic/static/img/admonitions/caution.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/admonitions/important.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/admonitions/note.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/admonitions/tip.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/admonitions/warning.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/alert.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/angry.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/attention.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/biggrin.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/checkmark.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/devil.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/frown.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/icon-error.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/icon-info.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/idea.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/ohwell.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/prio1.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/prio2.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/prio3.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/redface.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/sad.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/smile.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/smile2.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/smile3.png

  • Ignore whitespace
Added
New image

File MoinMoin/themes/basic/static/img/smileys/smile4.png

  • Ignore whitespace