changeset 2901:ac10a2e3eaf6

merged
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Fri, 13 Feb 2015 21:14:01 +0100
parents 4e3e60ea3f41 (diff) 61d06217b9bc (current diff)
children 5873b6b31830 6d0f25f9c371 b031a33366c9 54face4c8ae9 86df79fae350 84564fc20d3a 8431d0d48515 b99ff90c7fac 08007ac96dda
files
diffstat 35 files changed, 394 insertions(+), 931 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Tue Feb 10 23:42:38 2015 +0530
+++ b/.hgignore	Fri Feb 13 21:14:01 2015 +0100
@@ -12,6 +12,7 @@
 ^wikiconfig_.+\.py
 ^MoinMoin/translations/.*/LC_MESSAGES/messages.mo$
 ^MoinMoin/_tests/wiki/index/
+^MoinMoin/themes/modernized/static/css/stylus/normalize.css
 ^docs/_build/
 .coverage
 ^.project
--- a/MoinMoin/_tests/test_forms.py	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/_tests/test_forms.py	Fri Feb 13 21:14:01 2015 +0100
@@ -53,6 +53,11 @@
 
 
 def test_validjson():
+    """
+    Tests for changes to metadata when modifying an item.
+
+    Does not apply to usersettings form.
+    """
     app.cfg.namespace_mapping = [(u'', 'default_backend'), (u'ns1/', 'default_backend'), (u'ns1/ns2/', 'other_backend')]
     item = Item.create(u'ns1/ns2/existingname')
     meta = {NAMESPACE: u'ns1/ns2', CONTENTTYPE: u'text/plain;charset=utf-8'}
@@ -61,15 +66,16 @@
 
     valid_itemid = 'a1924e3d0a34497eab18563299d32178'
     # ('names', 'namespace', 'field', 'value', 'result')
-    tests = [([u'somename', u'@revid'], '', '', 'somename', False),
-             ([u'bar', u'ns1'], '', '', 'bar', False),
-             ([u'foo', u'foo', u'bar'], '', '', 'foo', False),
-             ([u'ns1ns2ns3', u'ns1/subitem'], '', '', 'valid', False),
-             ([u'foobar', u'validname'], '', ITEMID, valid_itemid + '8080', False),
-             ([u'barfoo', u'validname'], '', ITEMID, valid_itemid.replace('a', 'y'), False),
-             ([], '', 'itemid', valid_itemid, True),
-             ([u'existingname'], 'ns1/ns2', '', 'existingname', False),
-             ]
+    tests = [([u'somename', u'@revid'], '', '', 'somename', False),  # item names cannot begin with @
+             # TODO for above? - create item @x, get error message, change name in meta to xx, get an item with names @40x and alias of xx
+             ([u'bar', u'ns1'], '', '', 'bar', False),  # item names cannot match namespace names
+             ([u'foo', u'foo', u'bar'], '', '', 'foo', False),  # names in the name list must be unique.
+             ([u'ns1ns2ns3', u'ns1/subitem'], '', '', 'valid', False),  # Item names must not match with existing namespaces; items cannot be in 2 namespaces
+             ([u'foobar', u'validname'], '', ITEMID, valid_itemid + '8080', False),  # attempts to change itemid in meta result in "Item(s) named foobar, validname already exist."
+             ([u'barfoo', u'validname'], '', ITEMID, valid_itemid.replace('a', 'y'), False),  # similar to above
+             ([], '', 'itemid', valid_itemid, True),  # deleting all names from the metadata of an existing item will make it nameless, succeeds
+             ([u'existingname'], 'ns1/ns2', '', 'existingname', False),  # item already exists
+            ]
     for name, namespace, field, value, result in tests:
         meta = {NAME: name, NAMESPACE: namespace}
         x = JSON(json.dumps(meta))
--- a/MoinMoin/apps/admin/templates/user/index_user.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/apps/admin/templates/user/index_user.html	Fri Feb 13 21:14:01 2015 +0100
@@ -15,7 +15,7 @@
         <li><a href="{{ url_for('admin.highlighterhelp') }}">{{ _("Highlighters") }}</a></li>
     </ul>
     <h2>{{ _("Namespaces") }}</h2>
-    <ul class="moin-bcs-subitems">
+    <ul class="moin-namespaces">
         <li><a href="{{ url_for('frontend.global_views') }}">{{ _("all") }}</a></li>
         {% for namespace, root in theme_supp.get_namespaces()|sort -%}
             <li><a href="{{ url_for('frontend.show_item', item_name=root) }}">{{ namespace }}</a></li>
--- a/MoinMoin/converter/_tests/test_include.py	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/converter/_tests/test_include.py	Fri Feb 13 21:14:01 2015 +0100
@@ -8,7 +8,7 @@
 
 from MoinMoin.converter.include import *
 from MoinMoin.items import Item
-from MoinMoin.constants.keys import CONTENTTYPE
+from MoinMoin.constants.keys import CONTENTTYPE, ACL
 from MoinMoin._tests import wikiconfig, update_item
 
 
@@ -73,6 +73,15 @@
         # an error message will follow strong tag
         assert '<strong class="moin-error">' in rendered
 
+    def test_Include_Read_Permission_Denied(self):
+        # attempt to include an item that user cannot read
+        update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8', ACL: u'All:write,create,admin,destroy'}, u'no one can read')
+        update_item(u'page2', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'some text{{page1}}more text')
+        page2 = Item.create(u'page2')
+        rendered = page2.content._render_data()
+        # an error message will follow p tag, similar to: Access Denied, transcluded content suppressed.
+        assert '<div class="warning"><p>' in rendered
+
     def test_ExternalInclude(self):
         # external include
         update_item(u'page1', {CONTENTTYPE: u'text/x.moin.wiki;charset=utf-8'}, u'{{http://moinmo.in}}')
--- a/MoinMoin/converter/include.py	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/converter/include.py	Fri Feb 13 21:14:01 2015 +0100
@@ -102,8 +102,8 @@
 from MoinMoin.util.mime import type_moin_document
 from MoinMoin.util.iri import Iri, IriPath
 from MoinMoin.util.tree import html, moin_page, xinclude, xlink
-
 from MoinMoin.converter.html_out import mark_item_as_transclusion, Attributes
+from MoinMoin.i18n import _, L_, N_
 
 from ._args import Arguments
 
@@ -293,8 +293,16 @@
 
                     link.path = path
 
-                    page = Item.create(unicode(path))
-                    pages = ((page, link), )
+                    if flaskg.user.may.read(unicode(path)):
+                        page = Item.create(unicode(path))
+                        pages = ((page, link), )
+                    else:
+                        # ACLs prevent user from viewing a transclusion - show message
+                        message = moin_page.p(children=(_('Access Denied, transcluded content suppressed.')))
+                        attrib = {html.class_: 'warning'}
+                        div = ET.Element(moin_page.div, attrib, children=(message, ))
+                        container = ET.Element(moin_page.body, children=(div, ))
+                        return [container, 0]  # replace transclusion with container's child
 
                 elif xp_include_pages:
                     # XXX we currently interpret xp_include_pages as wildcard, but it should be regex
@@ -370,7 +378,7 @@
 
                     if ret:
                         # Either child or a descendant of child is a transclusion.
-                        # See top of this script for notes on why these DOM adjustmenta are required.
+                        # See top of this script for notes on why these DOM adjustments are required.
                         if isinstance(ret, ET.Node) and elem.tag.name in NO_BLOCK_CHILDREN:
                             body = ret[0]
                             if len(body) == 0:
@@ -420,7 +428,7 @@
                                 elem[i] = ret
                         elif isinstance(ret, types.ListType):
                             # a container has been returned.
-                            # Note: there are two places where a container may be returned
+                            # Note: there are multiple places where a container may be constructed
                             ret_container, trans_ptr = ret
                             # trans_ptr points to the transclusion within ret_container.
                             # Here the transclusion will always contain a block level element
--- a/MoinMoin/forms.py	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/forms.py	Fri Feb 13 21:14:01 2015 +0100
@@ -121,8 +121,10 @@
     invalid_name_msg = ""
 
     def validate(self, element, state):
-        # Make sure that the other meta is valid before validating the name.
-        # TODO Change/Make sure that the below statement holds good.
+        if state is None:
+            # incoming request is from +usersettings#personal; apps/frontend/views.py will validate changes to user names
+            return True
+        # Make sure that the other meta is valid before validating the name.  TODO: prove the try below is always redundant and remove it.
         try:
             if not element.parent.parent['extra_meta_text'].valid:
                 return False
@@ -239,7 +241,8 @@
         subscriptions = []
         for child in self:
             if child.u.startswith(ITEMID):
-                value = re.sub(r"\(.*\)", "", child.u)
+                # itemid:67155f195938426d82502540493e8acf (creole)
+                value = child.u.split(" ", 1)[0]
                 item = flaskg.storage.document(**{ITEMID: value.split(":")[1]})
                 try:
                     name_ = item.meta['name'][0]
@@ -247,6 +250,7 @@
                     name_ = "This item doesn't exist"
                 value = u"{0} ({1})".format(value, name_)
             else:
+                # name::ExampleItem | tags::demo | nameprefix::jp | namere::.* | name:MyNamespace:ExampleItem
                 value = child.u
             subscriptions.append(value)
         return self.separator.join(subscriptions)
--- a/MoinMoin/static/css/common.css	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/static/css/common.css	Fri Feb 13 21:14:01 2015 +0100
@@ -341,3 +341,28 @@
 .upload-form { display: none; }
 .moin-drag { font-size: .7em; color: #737373; }
 .file_name { word-break:  break-all; word-wrap:  break-word; max-width:  10em; }
+
+/* Forms - User Settings, rename, delete, destroy, register, diff... */
+
+.moin-tabs .moin-tab-titles a{ color: #00008b; }
+.moin-tab-titles{ margin: 0; padding: -10px 0 0; list-style: none; border-bottom: 3px solid #4e7da9; }
+.moin-tab-titles li { display: inline-block; *display: inline; zoom: 1; margin: 10px 0 -3px; padding: 0 5px; border-bottom: 3px solid #4e7da9; }
+.moin-tab-titles a { display: inline-block; padding: 4px; background-color: #eef1f6; border-width: 1px 1px 0; border-style: solid; border-color: #4e7da9; color: #00008b; border-top-left-radius: 7px; border-top-right-radius: 7px; }
+.moin-tab-titles a: hover { background-color: #d8dfe9; text-decoration: none; }
+.moin-tab-titles a.moin-current-tab { background: #d8dfe9; padding-top: 8px; margin-top: -4px; }
+.moin-tab-titles .moin-change-indicator { font-weight: bold; color: #1f9ae0; }
+.moin-current-form h2 { display: none; }
+.moin-settings-head a { color: #000; text-decoration: none; }
+
+.moin-form dd { float: left; width: 70%; margin: .3em 0 .1em 0; }
+.moin-form dd input { width: 75%; }
+.moin-form dt { clear: both; float: left; width: 25%; text-align: right; margin-top: .3em; padding-right: 1%; }
+.moin-form dt label.required: after { content: '*'; color: #000; }
+.moin-form button,
+.moin-form input[type="submit"] { clear: both; display: block; margin: auto; }
+.moin-form dl  { margin-bottom: 2em; }
+.moin-float-fix { clear: both; padding-top: .75em; }
+
+#options dd { width: 10%; }
+#options dt { width: 60%; max-width: 40em; }
+#subscriptions textarea { width: 80%; max-width: 40em; }
--- a/MoinMoin/static/js/basic.js	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/static/js/basic.js	Fri Feb 13 21:14:01 2015 +0100
@@ -5,7 +5,6 @@
     // this depends on the id's used for different tab-panes in modify.html and usersettings.html (Basic Theme)
     "use strict";
     $('#meta, #help').removeClass('active');
-    $('#password, #notification, #personal, #navigation, #options, #acl, #subscriptions').removeClass('active');
     $('textarea').autosize();
     $('div.dropup').removeClass('menu');
     $('ul.dropdown-menu').removeClass('submenu');
--- a/MoinMoin/templates/destroy.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/destroy.html	Fri Feb 13 21:14:01 2015 +0100
@@ -17,7 +17,7 @@
             {{ gen.form.close() }}
         </div>
     {% else %}
-        <h1>{{ _("DESTROY REVISION '%(item_name)s' (rev %(rev_id)s)", item_name=item.name, rev_id=rev_id | shorten_id) }}</h1>
+        <h1>{{ _("DESTROY REVISION '%(item_name)s' (rev %(rev_id)s)", item_name=fqname.value, rev_id=rev_id | shorten_id) }}</h1>
         <div class="moin-form">
             {{ gen.form.open(form, method="post", action=url_for('frontend.destroy_item', item_name=fqname.fullname, rev=rev_id)) }}
                 {{ forms.render_errors(form) }}
--- a/MoinMoin/templates/diff.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/diff.html	Fri Feb 13 21:14:01 2015 +0100
@@ -2,7 +2,6 @@
 {% block content %}
     {% block headline %}
         <h1>{{ _("Diff for '%(item_name)s'", item_name=newrev.item.name) }}</h1>
-        <br>
     {% endblock %}
     {{ diff_html }}
 {% endblock %}
--- a/MoinMoin/templates/forms.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/forms.html	Fri Feb 13 21:14:01 2015 +0100
@@ -15,12 +15,13 @@
   {% endif %}
 {% endmacro %}
 
-{% macro render_hidden(name, value) %}
-  <input type="hidden" name="{{ name }}" value="{{ value }}" />
-{% endmacro %}
-
-{% macro render_submit(form) %}
-  {{ gen.input(type='submit', value=form.submit_label, class='moin-button', **kwargs) }}
+{% macro render_submit(form, name=None, value=None) %}
+    <div class="moin-float-fix"> {# needed to add vertical whitespace below floated element #}
+        {% if name and value %}
+            <input type="hidden" name="{{ name }}" value="{{ value }}" />
+        {% endif %}
+        {{ gen.input(type='submit', value=form.submit_label, class='moin-button', **kwargs) }}
+    </div>
 {% endmacro %}
 
 {% macro render_textcha(gen, form) %}
--- a/MoinMoin/templates/history.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/history.html	Fri Feb 13 21:14:01 2015 +0100
@@ -71,7 +71,7 @@
                                     </div>
                                 </td>
                                 <td class="moin-wordbreak">{{ utils.editor_info(doc) }}</td>
-                                <td class="moin-wordbreak">{{ doc.contenttype }}</td>
+                                <td class="moin-wordbreak">{{ doc.contenttype|shorten_ctype }}</td>
                                 <td class="moin-wordbreak">{{ doc.comment }}</td>
                                 <td><a href="{{ url_for('frontend.show_item', item_name=fqname, rev=doc.revid) }}">{{ _('show') }}</a></td>
                                 <td><a href="{{ url_for('frontend.show_item_meta', item_name=fqname, rev=doc.revid) }}">{{ _('meta') }}</a></td>
--- a/MoinMoin/templates/layout.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/layout.html	Fri Feb 13 21:14:01 2015 +0100
@@ -1,6 +1,8 @@
 {% extends "base.html" %}
 
 {% import "snippets.html" as snippets with context %}
+{% import theme("utils.html") as utils %}
+
 {% set logo = snippets.logo() %}
 {% set before_header = snippets.before_header() %}
 {% set after_header = snippets.after_header() %}
@@ -58,73 +60,13 @@
                 {%- endif %}
             </div>
 
+            {% if cfg.sitename %}
+                <a class="moin-sitename" href="{{ url_for('frontend.show_item', item_name=cfg.item_root) }}">
+                    {{ cfg.sitename }}
+                </a>
+            {% endif %}
 
-            <div id="moin-locationline">
-                {% if cfg.show_interwiki -%}
-                    <span id="moin-interwiki">
-                        <a href="{{ url_for('frontend.show_item', item_name=cfg.root_mapping['']) }}" rel="nofollow">
-                            {% if cfg.interwikiname %}{{ cfg.interwikiname }}{% else %}Self{% endif %}
-                        </a>
-                        <span class="sep">: </span>
-                    </span>
-                {%- endif %}
-                <div id="moin-pagelocation">
-                    <div class="moin-pagepath">
-                        {% block pagepath %}
-                            {% for segment_name, segment_path, exists in theme_supp.location_breadcrumbs(fqname) -%}
-                                {% if loop.first %}
-                                    <ul class="moin-bcs-item">
-                                        <li>
-                                            <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>{{ segment_name|shorten_fqname }}</a>
-                                        </li>
-                                    </ul>
-                                    <span class="sep">/</span>
-                                {% elif not loop.last %}
-                                    <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>{{ segment_name|shorten_fqname }}</a>
-                                    <span class="sep">/</span>
-                                {%- endif %}
-                                {% if loop.last %}
-                                    {% if title_name %}
-                                        {{ title_name }}
-                                    {% else %}
-                                        <ul class="moin-bcs-item">
-                                            <li><a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>
-                                                {{ segment_name }}</a>
-                                                <ul class="moin-bcs-subitems">
-                                                    {% for fq_name in theme_supp.get_fqnames(segment_name) -%}
-                                                        <li><a href="{{ url_for('frontend.show_item', item_name=fq_name) }}">{{ fq_name|shorten_fqname(length=25) }}</a></li>
-                                                    {%- endfor %}
-                                                </ul>
-                                            </li>
-                                        </ul>
-                                    {%- endif %}
-                                {%- endif %}
-                            {%- endfor %}
-                        {% endblock %}
-                    </div>
-                </div>
-            </div>
-
-            {% set trail_items = theme_supp.path_breadcrumbs() %}
-            {% if trail_items %}
-                <div id="moin-pagetrail">
-                    {% for wiki_name, fqname, item_href, exists, err in trail_items %}
-                        {%- if wiki_name -%}
-                            <a href="{{ item_href }}"{{ " " }}
-                               title="{{ wiki_name }}"
-                               class="{% if err %}moin-badinterwiki{% else %}moin-interwiki{% endif %}">
-                               {{ fqname|shorten_fqname }}
-                            </a>
-                        {%- else -%}
-                            <a href="{{ url_for('frontend.show_item', item_name=fqname) }}"{{ " " }}
-                               {% if not exists -%}class="moin-nonexistent"{%- endif -%}>
-                               {{ fqname|shorten_fqname }}
-                            </a>
-                        {%- endif %}
-                        {% if not loop.last %}<span class="sep"> &raquo; </span>{% endif %}
-                    {% endfor %}
-                </div>
-            {% endif %}
+            {{ utils.breadcrumbs(theme_supp.path_breadcrumbs, title_name) }}
 
             {% set navibar_items = theme_supp.navibar(fqname) %}
             {% if navibar_items %}
--- a/MoinMoin/templates/mychanges.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/mychanges.html	Fri Feb 13 21:14:01 2015 +0100
@@ -14,8 +14,8 @@
         </div>
         <h1>{{ _('My Changes') }}</h1>
         <div class="moin-clr"></div>
-        <div id="moin-page-history">
-            <table class="zebra ">
+        <div>
+            <table class="zebra moin-sortable">
                 <thead>
                     <tr>
                         <th>{{ _("Item") }}</th>
@@ -36,7 +36,7 @@
                                     <a href="{{ url_for_item(name, namespace=doc.fqname.namespace, endpoint='frontend.show_item') }}">{{ name }}</a>
                                 {% endfor %}
                             </td>
-                            <td>{{ doc.revid|shorten_id }}</td>
+                            <td class="monospaced">{{ doc.revid|shorten_id }}</td>
                             <td>{{ doc.mtime|datetimeformat }}</td>
                             <td class="moin-integer">{{ doc.size }}</td>
                             <td>
@@ -48,7 +48,7 @@
                                     </form>
                                 </div>
                             </td>
-                            <td class="moin-wordbreak">{{ doc.contenttype }}</td>
+                            <td class="moin-wordbreak">{{ doc.contenttype|shorten_ctype }}</td>
                             <td class="moin-wordbreak">{{ doc.comment }}</td>
                         </tr>
                     {% endfor %}
--- a/MoinMoin/templates/usersettings_forms.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/usersettings_forms.html	Fri Feb 13 21:14:01 2015 +0100
@@ -10,12 +10,10 @@
             {{ forms.render(form['timezone']) }}
             {{ forms.render(form['locale']) }}
         </dl>
-        {{ forms.render_hidden('part', 'personal') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'personal') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
-
 {% macro password(form) %}
     {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
         {{ forms.render_errors(form) }}
@@ -24,8 +22,7 @@
             {{ forms.render(form['password1']) }}
             {{ forms.render(form['password2']) }}
         </dl>
-        {{ forms.render_hidden('part', 'password') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'password') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
@@ -38,8 +35,7 @@
         <dl>
             {{ forms.render(form['email']) }}
         </dl>
-        {{ forms.render_hidden('part', 'notification') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'notification') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
@@ -52,8 +48,7 @@
             {{ forms.render(form['edit_rows']) }}
             {{ forms.render(form['results_per_page']) }}
         </dl>
-        {{ forms.render_hidden('part', 'ui') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'ui') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
@@ -63,8 +58,7 @@
         <dl>
             {# TODO: find a good way to handle quicklinks #}
         </dl>
-        {{ forms.render_hidden('part', 'navigation') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'navigation') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
@@ -78,8 +72,7 @@
             {{ forms.render(form['show_comments']) }}
             {{ forms.render(form['disabled']) }}
         </dl>
-        {{ forms.render_hidden('part', 'options') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'options') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
@@ -89,8 +82,7 @@
         <dl>
             {{ forms.render(form['subscriptions']) }}
         </dl>
-        {{ forms.render_hidden('part', 'subscriptions') }}
-        {{ forms.render_submit(form) }}
+        {{ forms.render_submit(form, 'part', 'subscriptions') }}
     {{ gen.form.close() }}
 {% endmacro %}
 
--- a/MoinMoin/templates/utils.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/templates/utils.html	Fri Feb 13 21:14:01 2015 +0100
@@ -188,3 +188,77 @@
         <li class="list-group-item">Wiki Name: {{ meta['wikiname'] }}</li>
     </ul>
 {% endmacro %}
+
+{% macro alias_list(alias) %}
+    {% if alias %}
+        <ul class="moin-alias">
+            {% for fq_name in alias -%}
+                <li>
+                    <a href="{{ url_for('frontend.show_item', item_name=fq_name) }}">
+                        {{ fq_name|shorten_fqname(length=25) }}
+                    </a>
+                </li>
+            {%- endfor %}
+        </ul>
+    {% endif %}
+{% endmacro %}
+
+{% macro page_trail_link(wiki_name, fqname, exists) %}
+    {%- if wiki_name -%}
+        <a href="{{ item_href }}"{{ " " }}
+            title="{{ wiki_name }}"
+            class="{% if err %}moin-badinterwiki{% else %}moin-interwiki{% endif %}">
+            {{ fqname|shorten_fqname }}
+        </a>
+    {%- else -%}
+        <a href="{{ url_for('frontend.show_item', item_name=fqname) }}"{{ " " }}
+            {% if not exists -%}class="moin-nonexistent"{%- endif -%}>
+            {{ fqname|shorten_fqname }}
+        </a>
+    {%- endif %}
+{% endmacro %}
+
+{% macro breadcrumbs(breadcrumbs, title_name) %}
+    <ul class="moin-breadcrumb">
+        {% set trail_items = breadcrumbs() %}
+        {% if trail_items %}
+            {% for wiki_name, fqname, item_href, exists, err in trail_items %}
+                {% if not loop.last or title_name %}
+                    <li>
+                        {{ page_trail_link(wiki_name, fqname, exists) }}
+                        <i class="fa fa-angle-double-right fa-fw"></i>
+                        {{ alias_list(theme_supp.get_fqnames(fqname)) }}
+                    </li>
+                {% endif %}
+                {% if loop.last %}
+                    <li>
+                        <span class="moin-big">
+                            {% for segment_name, segment_path, exists in theme_supp.location_breadcrumbs(fqname) -%}
+                                {% if loop.first %}
+                                    <small>~ /</small>
+                                {% elif not loop.last %}
+                                    <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>
+                                        {{ segment_name|shorten_fqname }}
+                                    </a>
+                                    <small>/</small>
+                                {%- endif %}
+                                {% if loop.last %}
+                                    {% if title_name %}
+                                        {{ title_name }}
+                                    {% else %}
+                                        <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>
+                                            {{ segment_name }}
+                                        </a>
+                                    {%- endif %}
+                                {%- endif %}
+                            {% endfor %}
+                        </span>
+                        {% if not title_name %}
+                            {{ alias_list(theme_supp.get_fqnames(fqname)) }}
+                        {% endif %}
+                    </li>
+                {% endif %}
+            {% endfor %}
+        {% endif %}
+    </ul>
+{% endmacro %}
--- a/MoinMoin/themes/basic/static/css/theme.css	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/themes/basic/static/css/theme.css	Fri Feb 13 21:14:01 2015 +0100
@@ -6362,28 +6362,6 @@
 .moin-list-heading > a {
   color: #c8ddf1;
 }
-.moin-breadcrumb {
-  padding: 8px 15px;
-  margin-bottom: 20px;
-  list-style: none;
-  background-color: #f5f5f5;
-  border-radius: 4px;
-}
-.moin-breadcrumb > li {
-  display: inline-block;
-}
-.moin-breadcrumb > li + li:before {
-  content: "/\00a0";
-  padding: 0 5px;
-  color: #cccccc;
-}
-.moin-breadcrumb > .active {
-  color: #999999;
-}
-.moin-breadcrumb > li + li:before {
-  content: "\0020";
-  padding: 0px;
-}
 .moin-nav {
   margin-bottom: 0;
   padding-left: 0;
@@ -6701,35 +6679,58 @@
 a.wikilink {
   color: #00417f;
 }
-.moin-bcs-subitems {
+.moin-alias {
   z-index: 500;
 }
-ul.moin-breadcrumb ul.moin-bcs-subitems {
+.moin-breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.moin-breadcrumb > li {
+  display: inline-block;
+}
+.moin-breadcrumb > li + li:before {
+  content: "/\00a0";
+  padding: 0 5px;
+  color: #cccccc;
+}
+.moin-breadcrumb > .active {
+  color: #999999;
+}
+.moin-breadcrumb > li + li:before {
+  content: "\0020";
+  padding: 0px;
+}
+ul.moin-breadcrumb ul.moin-alias {
   background-color: #00417f;
+  border-radius: 6px;
 }
 ul.moin-breadcrumb,
-ul.moin-breadcrumb ul.moin-bcs-subitems {
+ul.moin-breadcrumb ul.moin-alias {
   padding: 0;
   margin: 0;
   display: inline-block;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems li {
+ul.moin-breadcrumb li ul.moin-alias li {
   list-style-type: none;
   display: block;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems li a {
-  padding: 10px;
+ul.moin-breadcrumb li ul.moin-alias li a {
+  padding: 2px 10px;
   display: inline-block;
   color: #ffffff;
 }
 ul.moin-breadcrumb li {
   position: relative;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems {
+ul.moin-breadcrumb li ul.moin-alias {
   display: none;
   position: absolute;
 }
-ul.moin-breadcrumb li:hover ul.moin-bcs-subitems {
+ul.moin-breadcrumb li:hover ul.moin-alias {
   display: block;
 }
 .moin-thead {
--- a/MoinMoin/themes/basic/static/custom-less/theme.less	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/themes/basic/static/custom-less/theme.less	Fri Feb 13 21:14:01 2015 +0100
@@ -126,16 +126,6 @@
   }
 }
 
-.moin-breadcrumb {
-  .breadcrumb;
-  > li {
-    &+li:before {
-      content: "\0020"; // Unicode space which is non-collapsing
-      padding: 0px;
-    }
-  }
-}
-
 .moin-nav {
   .nav;
   margin-bottom: 20px;  // override bottom-margin nav-tabs
@@ -285,34 +275,45 @@
 a.wikilink{
   color: @search_option_bar_color;
 }
-.moin-bcs-subitems{
+.moin-alias{
   z-index: 500;
 }
-ul.moin-breadcrumb ul.moin-bcs-subitems{
+
+.moin-breadcrumb {
+  .breadcrumb;
+  > li {
+    &+li:before {
+      content: "\0020"; // Unicode space which is non-collapsing
+      padding: 0px;
+    }
+  }
+}
+ul.moin-breadcrumb ul.moin-alias{
   background-color: @search_option_bar_color;
+  border-radius: 6px;
 }
-ul.moin-breadcrumb,ul.moin-breadcrumb ul.moin-bcs-subitems{
+ul.moin-breadcrumb,ul.moin-breadcrumb ul.moin-alias{
   padding: 0;
   margin: 0;
   display: inline-block;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems li{
+ul.moin-breadcrumb li ul.moin-alias li{
   list-style-type: none;
   display: block;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems li a{
-  padding: 10px;
+ul.moin-breadcrumb li ul.moin-alias li a{
+  padding: 2px 10px;
   display: inline-block;
   color: @white;
 }
 ul.moin-breadcrumb li {
   position: relative;
 }
-ul.moin-breadcrumb li ul.moin-bcs-subitems{
+ul.moin-breadcrumb li ul.moin-alias{
   display: none;
   position: absolute;
 }
-ul.moin-breadcrumb li:hover ul.moin-bcs-subitems{
+ul.moin-breadcrumb li:hover ul.moin-alias{
   display: block;
 }
 .moin-thead{
--- a/MoinMoin/themes/basic/templates/delete.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-{% import "forms.html" as forms %}
-{% extends theme("show.html") %}
-
-{% set title = _("Delete '%(item_name)s'", item_name=item.name) %}
-
-{% block content %}
-    <h2>{{ title }}</h2>
-    <div class="row">
-        <div class="col-md-5">
-            {{ gen.form.open(form, method="post", action=url_for('frontend.delete_item', item_name=item.name)) }}
-                {{ forms.render_errors(form) }}
-
-                <div class="form-group">
-                    {{ forms.render_textcha(gen, form) }}
-                    {{ gen.input(form['comment'], type="text", class="form-control") }}
-                </div>
-
-                <div class="form-group">
-                    {{ forms.render_submit(form, class='btn btn-primary') }}
-                </div>
-            {{ gen.form.close() }}
-        </div>
-    </div>
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/destroy.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-{% import "forms.html" as forms %}
-{% extends theme("show.html") %}
-
-{% set title = _("DESTROY COMPLETE ITEM '%(item_name)s'", item_name=item.name) %}
-
-{% block content %}
-    {% if rev_id == None %}
-        <h2>{{ title }}</h2>
-        <div class="row">
-            <div class="col-md-5">
-
-                {{ gen.form.open(form, method="post", action=url_for('frontend.destroy_item', item_name=item.name)) }}
-                    {{ forms.render_errors(form) }}
-
-                    <div class="form-group">
-                        {{ forms.render_textcha(gen, form) }}
-                        {{ gen.input(form['comment'], type="text", class="form-control") }}
-                    </div>
-
-                    <div class="form-group">
-                        {{ forms.render_submit(form, class='btn btn-primary') }}
-                    </div>
-                {{ gen.form.close() }}
-            </div>
-        </div>
-    {% else %}
-        <h2>{{ _("DESTROY REVISION '%(item_name)s' (rev %(rev_id)s)", item_name=item.name, rev_id=rev_id | shorten_id) }}</h2>
-        <div class="row">
-            <div class="col-md-5">
-                {{ gen.form.open(form, method="post", action=url_for('frontend.destroy_item', item_name=item.name, rev=rev_id)) }}
-                    {{ forms.render_errors(form) }}
-
-                    <div class="form-group">
-                        {{ gen.label(form['comment']) }}
-                        {{ gen.textarea(form['comment'], rows='1', class='form-control') }}
-                    </div>
-                    {{ forms.render_textcha(gen, form) }}
-
-                    <div class="form-group">
-                        {{ forms.render_submit(form, class='btn btn-primary') }}
-                    </div>
-                {{ gen.form.close() }}
-            </div>
-        </div>
-    {% endif %}
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/diff.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-{% extends theme("layout.html") %}
-{% import theme("itemviews.html") as itemviews with context %}
-
-{% block views %}
-    {{ itemviews }}
-{% endblock %}
-
-{% block content %}
-    {% block headline %}
-        <i class="fa fa-chevron-left">
-            <a href="{{ url_for('frontend.history', item_name=item_name) }}"> {{ _("Back") }} </a>
-        </i>
-        <h2>{{ _("Diff for '%(item_name)s'", item_name=newrev.item.name) }}</h2>
-    {% endblock %}
-    {{ diff_html }}
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/diff_text.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-{% import "utils.html" as utils %}
-
-{% macro show_meta(rev) %}
-    <div class="moin-diff-info moin-diff-info-rev-id">
-        <span class="moin-diff-info-caption">Revision:</span>
-        <span class="moin-diff-info-value">{{ rev.meta['revid'] | shorten_id }}</span>
-    </div>
-    <div class="moin-diff-info moin-diff-info-rev-author">
-        <span class="moin-diff-info-caption">Editor:</span>
-        <span class="moin-diff-info-value">
-            {{ utils.editor_info(rev.meta) }}
-        </span>
-    </div>
-    <div class="moin-diff-info moin-diff-info-rev-size">
-        <span class="moin-diff-info-caption">Size:</span>
-        <span class="moin-diff-info-value">{{ rev.meta['size'] }}</span>
-    </div>
-    <div class="moin-diff-info moin-diff-info-rev-comment">
-        <span class="moin-diff-info-caption">Comment:</span>
-        <span class="moin-diff-info-value">{{ rev.meta['comment'] }}</span>
-    </div>
-{% endmacro %}
-
-<table class="table table-condensed">
-    <tr>
-        <td class="moin-diff-header">
-            {{ show_meta(oldrev) }}
-        </td>
-        <td class="moin-diff-header">
-            {{ show_meta(newrev) }}
-        </td>
-    </tr>
-    <tr>
-        <td class="moin-diff-removed"><span>{{ _('Deletions are marked like this.') }}</span></td>
-        <td class="moin-diff-added"><span>{{ _('Additions are marked like this.') }}</span></td>
-    </tr>
-    {% for llineno, lcontent, rlineno, rcontent in diffs %}
-        <tr class="moin-diff-line-number">
-            <td><a href="#{{ llineno }}">{{ _('Line') }} {{ llineno }}:</a></td>
-            <td><a href="#{{ rlineno }}">{{ _('Line') }} {{ rlineno }}:</a></td>
-        </tr>
-        <tr>
-            <td class="moin-diff-removed">{{ lcontent }}</td>
-            <td class="moin-diff-added">{{ rcontent }}</td>
-        </tr>
-    {% endfor %}
-</table>
--- a/MoinMoin/themes/basic/templates/layout.html	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/themes/basic/templates/layout.html	Fri Feb 13 21:14:01 2015 +0100
@@ -1,6 +1,7 @@
 {% extends theme("base.html") %}
 
 {% import theme("snippets.html") as snippets %}
+{% import theme("utils.html") as utils %}
 
 {% set logo = snippets.logo() %}
 {% set before_header = snippets.before_header() %}
@@ -186,74 +187,7 @@
                 </nav> {# navbar moin-navbar-inverse #}
 
                 {{ after_header }}
-
-                <ul class="moin-breadcrumb">
-                    {% set trail_items = theme_supp.path_breadcrumbs() %}
-                    {% if trail_items %}
-                        {% for wiki_name, fqname, item_href, exists, err in trail_items %}
-                            {% if not loop.last or title_name %}
-                                <li>
-                                    {%- if wiki_name -%}
-                                        <a href="{{ item_href }}"{{ " " }}
-                                            title="{{ wiki_name }}"
-                                            class="{% if err %}moin-badinterwiki{% else %}moin-interwiki{% endif %}">
-                                            {{ fqname|shorten_fqname }}
-                                        </a>
-                                    {%- else -%}
-                                        <a href="{{ url_for('frontend.show_item', item_name=fqname) }}"{{ " " }}
-                                            {% if not exists -%}class="moin-nonexistent"{%- endif -%}>
-                                            {{ fqname|shorten_fqname }}
-                                        </a>
-                                    {%- endif %}
-                                    <i class="fa fa-angle-double-right fa-fw"></i>
-                                    <ul class="moin-bcs-subitems">
-                                        {% for fq_name in theme_supp.get_fqnames(fqname) -%}
-                                            <li>
-                                                <a href="{{ url_for('frontend.show_item', item_name=fq_name) }}">
-                                                    {{ fq_name|shorten_fqname(length=25) }}
-                                                </a>
-                                            </li>
-                                        {%- endfor %}
-                                    </ul>
-                                </li>
-                            {% endif %}
-                            {% if loop.last %}
-                                <li>
-                                    <span class="moin-big moin-location-breadcrumb">
-                                        {% for segment_name, segment_path, exists in theme_supp.location_breadcrumbs(fqname) -%}
-                                            {% if loop.first %}
-                                                <small>~ /</small>
-                                            {% elif not loop.last %}
-                                                <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>
-                                                    {{ segment_name|shorten_fqname }}
-                                                </a>
-                                                <small>/</small>
-                                            {%- endif %}
-                                            {% if loop.last %}
-                                                {% if title_name %}
-                                                    {{ title_name }}
-                                                {% else %}
-                                                    <a href="{{ url_for('frontend.show_item', item_name=segment_path) }}" {% if not exists %}class="moin-nonexistent"{% endif %}>
-                                                        {{ segment_name }}
-                                                    </a>
-                                                {%- endif %}
-                                            {%- endif %}
-                                        {% endfor %}
-                                    </span>
-                                    <ul class="moin-bcs-subitems">
-                                        {% for fq_name in theme_supp.get_fqnames(fqname) -%}
-                                            <li>
-                                                <a href="{{ url_for('frontend.show_item', item_name=fq_name) }}">
-                                                    {{ fq_name|shorten_fqname(length=25) }}
-                                                </a>
-                                            </li>
-                                        {%- endfor %}
-                                    </ul>
-                                </li>
-                            {% endif %}
-                        {% endfor %}
-                    {% endif %}
-                </ul> {# moin-breadcrumb #}
+                {{ utils.breadcrumbs(theme_supp.path_breadcrumbs, title_name) }}
 
                 <div class="moin-content">
                     {# id -> moin-flash is used to add special alerts for ex. for changes to User Settings via JS, see common.js #}
--- a/MoinMoin/themes/basic/templates/register.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-{% extends theme("layout.html") %}
-{% import "forms.html" as forms %}
-
-{% block content %}
-    <h2>{{ _('Create Account') }}</h2>
-    <div class="row">
-        <div class="col-md-4">
-
-            {{ gen.form.open(form, method="post", action=url_for('frontend.register')) }}
-
-                {% if form.errors %}
-                    <div class="moin-flash moin-flash-error">
-                        {% for error in form.errors %}
-                            {{ error }}
-                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
-                        {% endfor %}
-                    </div>
-                {% endif %}
-
-                {% for field, fieldtype in [
-                        ('username', 'text'),
-                        ('password1', 'password'),
-                        ('password2', 'password'),
-                        ('email', 'text'),
-                        ('openid', 'text'),
-                        ] %}
-                    <div class="form-group">
-                        {{ gen.label(form[field]) }}
-                        {{ gen.input(form[field], type=fieldtype, class="form-control") }}
-                    </div>
-                {% endfor %}
-                {{ forms.render_textcha(gen, form) }}
-
-                <div class="form-group">
-                    {{ forms.render_submit(form, class='btn btn-primary') }}
-                </div>
-
-            {{ gen.form.close() }}
-        </div>
-    </div>
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/rename.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-{% import "forms.html" as forms %}
-{% extends theme("show.html") %}
-
-{% set title = _("Rename '%(item_name)s'", item_name=item.name) %}
-
-{% block content %}
-    <h2>{{ title }}</h2>
-    <div class="row">
-        <div class="col-md-5">
-            {{ gen.form.open(form, method="post", action=url_for('frontend.rename_item', item_name=item.name)) }}
-                {{ forms.render_errors(form) }}
-                <div class="form-group">
-                    {{ gen.label(form['target']) }}
-                    {{ gen.input(form['target'], type="text", class="form-control") }}
-                </div>
-
-                <div class="form-group">
-                    {{ forms.render_textcha(gen, form) }}
-                    {{ gen.input(form['comment'], type="text", class="form-control") }}
-                </div>
-
-                <div class="form-group">
-                    {{ forms.render_submit(form, class='btn btn-primary') }}
-                </div>
-            {{ gen.form.close() }}
-        </div>
-    </div>
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/usersettings.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-{% extends theme("layout.html") %}
-{% import theme("usersettings_forms.html") as user_forms %}
-
-{% block content %}
-    <h1>{{ _("User Settings") }}</h1>
-    <ul class="moin-nav nav-tabs moin-shadow">
-        <li class="active"><a href="#ui" data-toggle="tab">{{ _("Appearance") }}</a></li>
-        <li><a href="#password" data-toggle="tab">{{ _("Change Password") }}</a></li>
-        <li><a href="#navigation" data-toggle="tab">{{ _("Navigation") }}</a></li>
-        <li><a href="#notification" data-toggle="tab">{{ _("Notifications") }}</a></li>
-        <li><a href="#options" data-toggle="tab">{{ _("Options") }}</a></li>
-        <li><a href="#personal" data-toggle="tab">{{ _("Personal") }}</a></li>
-        <li><a href="#subscriptions" data-toggle="tab">{{ _("Subscriptions") }}</a></li>
-    </ul>
-    {{ user_forms.all_usersettings_forms(form_objs) }}
-{% endblock %}
--- a/MoinMoin/themes/basic/templates/usersettings_ajax.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-{% import theme("usersettings_forms.html") as user_forms %}
-
-{% if part == 'personal' %}
-    {{ user_forms.personal(form) }}
-{% elif part == 'password' %}
-    {{ user_forms.password(form) }}
-{% elif part == 'notification' %}
-    {{ user_forms.notification(form) }}
-{% elif part == 'ui' %}
-    {{ user_forms.ui(form) }}
-{% elif part == 'navigation' %}
-    {{ user_forms.navigation(form) }}
-{% elif part == 'options' %}
-    {{ user_forms.options(form) }}
-{% elif part == 'subscriptions' %}
-    {{ user_forms.subscriptions(form) }}
-{% endif %}
--- a/MoinMoin/themes/basic/templates/usersettings_forms.html	Tue Feb 10 23:42:38 2015 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-{% import "forms.html" as forms %}
-
-{% macro personal(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings'), role="form") }}
-        {{ forms.render_errors(form) }}
-            {% for e in [
-                    'name',
-                    'display_name',
-                    'openid',
-                    ] %}
-                <div class="form-group">
-                    {{ gen.label(form[e]) }}
-                    {{ gen.input(form[e], type="text", class="form-control") }}
-                </div>
-            {% endfor %}
-
-            {% for e in [
-                    'timezone',
-                    'locale',
-                    ] %}
-                <div class="form-group">
-                    <dl>
-                        <dt>
-                            {{ gen.label(form[e]) }}
-                        </dt>
-                        <dd>
-                            {{ gen.select.open(form[e], class="btn") }}
-                                {% for value, label in form[e].properties['choice_specs'] %}
-                                    {{ gen.option(form[e], value=value, contents=label or value) }}
-                                {% endfor %}
-                            {{ gen.select.close() }}
-                        </dd>
-                    </dl>
-                </div>
-            {% endfor %}
-        {{ forms.render_hidden('part', 'personal') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-
-{% macro password(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {{ forms.render_errors(form) }}
-            {% for e in [
-                    'password_current',
-                    'password1',
-                    'password2',
-                    ] %}
-                <div class="form-group">
-                    {{ gen.label(form[e]) }}
-                    {{ gen.input(form[e], type="password", class="form-control") }}
-                </div>
-            {% endfor %}
-        {{ forms.render_hidden('part', 'password') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{% macro notification(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {% if cfg.user_email_verification %}
-            <p>{{ _("Changing your email address requires you to verify it. A link will be sent to you.") }}</p>
-        {% endif %}
-        {{ forms.render_errors(form) }}
-        <div class="form-group">
-            {{ gen.label(form['email']) }}
-            <div class="input-group">
-                {{ gen.input(form['email'], type="email", class="form-control") }}
-                <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
-            </div>
-        </div>
-        {{ forms.render_hidden('part', 'notification') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{% macro ui(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {{ forms.render_errors(form) }}
-            <div class="form-group">
-                <dl>
-                    <dt>
-                        {{ gen.label(form['theme_name']) }}
-                    </dt>
-                    <dd>
-                        {{ gen.select.open(form['theme_name'], class="btn") }}
-                            {% for value, label in form['theme_name'].properties['choice_specs'] %}
-                                {{ gen.option(form['theme_name'], value=value, contents=label or value) }}
-                            {% endfor %}
-                        {{ gen.select.close() }}
-                    </dd>
-                </dl>
-            </div>
-            {% for e in [
-                    'css_url',
-                    'edit_rows',
-                    'results_per_page'
-                    ] %}
-                <div class="form-group">
-                    {{ gen.label(form[e]) }}
-                    {{ gen.input(form[e], type="text", class="form-control") }}
-                </div>
-            {% endfor %}
-        {{ forms.render_hidden('part', 'ui') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{% macro navigation(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {{ forms.render_errors(form) }}
-        <dl>
-            {# TODO: find a good way to handle quicklinks #}
-        </dl>
-        {{ forms.render_hidden('part', 'navigation') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{% macro options(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {{ forms.render_errors(form) }}
-            {% for e in [
-                    'mailto_author',
-                    'edit_on_doubleclick',
-                    'scroll_page_after_edit',
-                    'show_comments',
-                    'disabled'
-                    ] %}
-                <div class="checkbox">
-                    <label>
-                        {{ gen.input(form[e], type="checkbox") }}
-                        {{ form[e].label }}
-                    </label>
-                </div>
-            {% endfor %}
-        {{ forms.render_hidden('part', 'options') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{% macro subscriptions(form) %}
-    {{ gen.form.open(form, method="post", action=url_for('frontend.usersettings')) }}
-        {{ forms.render_errors(form) }}
-        <div class="form-group">
-            {{ gen.label(form['subscriptions']) }}
-            <div class="input-group">
-                {{ gen.textarea(form['subscriptions'], cols="60", rows="10", class="form-control") }}
-            </div>
-        </div>
-        {{ forms.render_hidden('part', 'subscriptions') }}
-        <div class="form-group">
-            {{ forms.render_submit(form, class='btn btn-primary') }}
-        </div>
-    {{ gen.form.close() }}
-{% endmacro %}
-
-{# javascript functions within basic.js are dependent upon the structure, classes and ids defined here #}
-{% macro all_usersettings_forms(form_objs) %}
-    <div id="moin-usersettings">
-        <div class="row">
-            <div class="col-md-4">
-                <div class="tab-content">
-                    <div id="ui" class="tab-pane active">
-                        {{ ui(form_objs.ui) }}
-                    </div>
-                    <div id="password" class="tab-pane active">
-                        {{ password(form_objs.password) }}
-                    </div>
-                    <div id="navigation" class="tab-pane active">
-                        {{ navigation(form_objs.navigation) }}
-                    </div>
-                    <div id="notification" class="tab-pane active">
-                        {{ notification(form_objs.notification) }}
-                    </div>
-                    <div id="options" class="tab-pane active">
-                        {{ options(form_objs.options) }}
-                    </div>
-                    <div id="personal" class="tab-pane active">
-                        {{ personal(form_objs.personal) }}
-                    </div>
-                    <div id="subscriptions" class="tab-pane active">
-                        {{ subscriptions(form_objs.subscriptions) }}
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-{% endmacro %}
--- a/MoinMoin/themes/modernized/static/css/stylus/theme.styl	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/themes/modernized/static/css/stylus/theme.styl	Fri Feb 13 21:14:01 2015 +0100
@@ -152,31 +152,6 @@
     border-color border_color
     border-width 2px
 
-.moin-form
-    dd
-        float left
-        width 70%
-        margin-bottom 1em
-        margin-left 0
-        input
-            width 75%
-    dt
-        clear both
-        float left
-        width 25%
-        text-align right
-        margin-top .3em
-        padding-right 1%
-        label
-            &.required:after
-                content '*'
-                color font_color
-    button,
-    input[type="submit"]
-        clear both
-        display block
-        margin auto
-
 form[name="delete_item"], form[name="rename_item"], form[name="destroy_item"]
     dd
         input
@@ -201,67 +176,6 @@
 .moin-textcha
     padding-top .2em
 
-#options
-    dd
-        float none
-        width 38%
-        display table-cell
-        padding 1.2em
-    dt
-        margin-left 10%
-        text-align left
-        width 61%
-        margin-top 1.3em
-
-.moin-tabs .moin-tab-titles
-    a
-        color link_color
-
-.moin-tab-titles
-    margin 0
-    padding -10px 0 0
-    list-style none
-    border-bottom 3px solid border_color
-
-.moin-tab-titles li
-    display inline-block
-    *display: inline; // IE7 hack to display title tabs in a row ...
-    zoom: 1; // IE7 hack ... rather than a column
-    margin 10px 0 -3px
-    padding 0 5px
-    border-bottom 3px solid border_color
-
-.moin-tab-titles a
-    display inline-block
-    padding 4px
-    background-color table_bg_color
-    border-width 1px 1px 0
-    border-style solid
-    border-color border_color
-    color link_color
-    border-top-left-radius 7px
-    border-top-right-radius 7px
-
-.moin-tab-titles a:hover
-    background-color table_row_color
-    text-decoration none
-
-.moin-tab-titles a.moin-current-tab
-    background table_row_color
-    padding-top 8px
-    margin-top -4px
-
-.moin-tab-titles .moin-change-indicator
-    font-weight bold
-    color hover_color
-
-.moin-current-form h2
-    display none // bold tab at top of user setting page makes h2 redundant
-
-.moin-settings-head a
-    color font_color
-    text-decoration none
-
 .searchresults dt
     margin-top 1em
     font-weight normal
@@ -535,6 +449,8 @@
     float right
     text-align right
     width 15em
+    div.moin-float-fix
+        display inline
 
 #moin-search-submit
     text-indent -9000%
@@ -569,7 +485,7 @@
 
 #moin-logo
     float left
-    margin 2px 10px
+    margin 2px 10px 8px 10px
     padding 0
     font-size 1.4em
     line-height 1em
@@ -582,10 +498,17 @@
     color heading_color
     text-decoration none
 
+a.moin-sitename
+    font-size 1.5em
+    font-weight bold
+    color white
+    line-height 1.5em
+
 #moin-username
     display block
-    margin 0px 12px 4px 12px
+    margin 6px 4px 4px 4px
     padding 0
+    float right
     font-size 0.82em
     a
         color heading_color
@@ -593,31 +516,45 @@
 #moin-username input:hover
     color hover_color
 
-#moin-locationline
-    padding 0
-    font-size 100%
-    font-weight normal
-    margin 0.3em .75em .3em .75em
-
 #moin-interwiki
     a
         color heading_color
 
-#moin-pagelocation
-    font-size 1.5em
-    letter-spacing 0.05em
-    vertical-align middle
+ul.moin-breadcrumb,
+ul.moin-breadcrumb ul.moin-alias
+    padding 0
+    margin 0
+    margin-bottom 4px
 
-#moin-pagetrail
-    margin 0 0.88em 0.25em .75em
-    padding 0
-    font-size 0.88em
-    a
-        color heading_color
+ul.moin-breadcrumb ul.moin-alias
+    background-color body_color
+    border 1px solid panel_color
+    border-radius 6px
 
-.moin-pagepath
-    a
-        color heading_color !important
+ul.moin-breadcrumb li ul.moin-alias li
+    list-style-type none
+    display block
+
+ul.moin-breadcrumb li ul.moin-alias li a
+    padding 2px 10px
+    display inline-block
+    color hover_color
+
+ul.moin-breadcrumb li
+      position relative
+
+.moin-breadcrumb a
+    color heading_color
+
+ul.moin-breadcrumb li ul.moin-alias
+    display none
+    position absolute
+
+ul.moin-breadcrumb li:hover ul.moin-alias
+    display block
+
+.moin-breadcrumb > li
+    display inline-block
 
 #moin-navibar
     clear both
@@ -839,8 +776,7 @@
         box-shadow none
 
     a.moin-permalink, a.moin-showhide,
-    #moin-header, #moin-sidebar, #moin-footer, #moin-timings, #moin-credits, #moin-interwiki,
-    #moin-pagelocation
+    #moin-header, #moin-sidebar, #moin-footer, #moin-timings, #moin-credits, #moin-interwiki
         display none
 
     #moin-pageinfo
@@ -891,31 +827,5 @@
         padding 2px
 
     #moin-header, #moin-sidebar, #moin-footer, #moin-timings, #moin-credits, #moin-interwiki,
-    #moin-pagelocation, #moin-pageinfo
+    #moin-pageinfo
         display none
-
-ul.moin-bcs-item ul.moin-bcs-subitems
-    background-color panel_color
-
-ul.moin-bcs-item, ul.moin-bcs-item ul.moin-bcs-subitems
-    padding 0
-    margin 0
-    display inline-block
-
-ul.moin-bcs-item li, ul.moin-bcs-item ul.moin-bcs-subitems li
-    list-style-type none
-    display block
-
-ul.moin-bcs-item li ul.moin-bcs-subitems li a
-    padding 5px
-    display inline-block
-
-ul.moin-bcs-item li
-    position relative
-
-ul.moin-bcs-item li ul.moin-bcs-subitems
-    display none
-    position absolute
-
-ul.moin-bcs-item li:hover ul.moin-bcs-subitems
-    display block
--- a/MoinMoin/themes/modernized/static/css/theme.css	Tue Feb 10 23:42:38 2015 +0530
+++ b/MoinMoin/themes/modernized/static/css/theme.css	Fri Feb 13 21:14:01 2015 +0100
@@ -319,11 +319,6 @@
 input,select{padding:3px;background:#fff;border:1px solid #4e7da9;border-radius:2px}
 input[type="text"]{width:96%}
 input.blank{border-color:#4e7da9;border-width:2px}
-.moin-form dd{float:left;width:70%;margin-bottom:1em;margin-left:0;}
-.moin-form dd input{width:75%}
-.moin-form dt{clear:both;float:left;width:25%;text-align:right;margin-top:.3em;padding-right:1%;}
-.moin-form dt label.required:after{content:'*';color:#000}
-.moin-form button,.moin-form input[type="submit"]{clear:both;display:block;margin:auto}
 form[name="delete_item"] dd input,form[name="rename_item"] dd input,form[name="destroy_item"] dd input{width:100%}
 form[name="delete_item"] dt,form[name="rename_item"] dt,form[name="destroy_item"] dt{width:20%}
 #moin-modify dd{width:100%;float:none;}
@@ -332,17 +327,6 @@
 #moin-modify textarea{width:99.5%}
 #moin-modify input[type="submit"]{margin-left:0}
 .moin-textcha{padding-top:.2em}
-#options dd{float:none;width:38%;display:table-cell;padding:1.2em}
-#options dt{margin-left:10%;text-align:left;width:61%;margin-top:1.3em}
-.moin-tabs .moin-tab-titles a{color:#00008b}
-.moin-tab-titles{margin:0;padding:-10px 0 0;list-style:none;border-bottom:3px solid #4e7da9}
-.moin-tab-titles li{display:inline-block;*display:inline;zoom:1;margin:10px 0 -3px;padding:0 5px;border-bottom:3px solid #4e7da9}
-.moin-tab-titles a{display:inline-block;padding:4px;background-color:#eef1f6;border-width:1px 1px 0;border-style:solid;border-color:#4e7da9;color:#00008b;border-top-left-radius:7px;border-top-right-radius:7px}
-.moin-tab-titles a:hover{background-color:#d8dfe9;text-decoration:none}
-.moin-tab-titles a.moin-current-tab{background:#d8dfe9;padding-top:8px;margin-top:-4px}
-.moin-tab-titles .moin-change-indicator{font-weight:bold;color:#1f9ae0}
-.moin-current-form h2{display:none}
-.moin-settings-head a{color:#000;text-decoration:none}
 .searchresults dt{margin-top:1em;font-weight:normal}
 .searchresults dd,.searchresults p{font-size:.85em}
 .searchresults td{border-width:0}
@@ -402,23 +386,29 @@
 a.moin-nonexistent:hover{color:#1f9ae0;text-decoration:underline}
 .current-link{color:inherit !important}
 #moin-header{margin:0;padding:7px 0 10px 0;background:#00417f;color:#fff;line-height:1.12em;border-bottom-left-radius:9px;border-bottom-right-radius:9px}
-#moin-searchform{margin:2px 12px 0 0;padding:0;font-size:.82em;float:right;text-align:right;width:15em}
+#moin-searchform{margin:2px 12px 0 0;padding:0;font-size:.82em;float:right;text-align:right;width:15em;}
+#moin-searchform div.moin-float-fix{display:inline}
 #moin-search-submit{text-indent:-9000%;margin-left:-26px;width:20px;height:16px;background:url("../img/moin-search.png") center center no-repeat;background-size:16px 16px;border:none;overflow:hidden;vertical-align:middle;cursor:pointer;padding:0;box-shadow:none}
 #moin-search-query{padding-right:20px;font-size:100%;vertical-align:middle;color:#000;background-color:#fff;border:1px solid #4e7da9;border-radius:5px}
 #moin-long-searchform{padding:0;font-size:.82em;text-align:left}
 #moin-long-searchform div{margin:0}
-#moin-logo{float:left;margin:2px 10px;padding:0;font-size:1.4em;line-height:1em;font-weight:bold}
+#moin-logo{float:left;margin:2px 10px 8px 10px;padding:0;font-size:1.4em;line-height:1em;font-weight:bold}
 #moin-logo img{vertical-align:middle}
 #moin-logo a{color:#fff;text-decoration:none}
-#moin-username{display:block;margin:0 12px 4px 12px;padding:0;font-size:.82em;}
+a.moin-sitename{font-size:1.5em;font-weight:bold;color:#fff;line-height:1.5em}
+#moin-username{display:block;margin:6px 4px 4px 4px;padding:0;float:right;font-size:.82em;}
 #moin-username a{color:#fff}
 #moin-username input:hover{color:#1f9ae0}
-#moin-locationline{padding:0;font-size:100%;font-weight:normal;margin:.3em .75em .3em .75em}
 #moin-interwiki a{color:#fff}
-#moin-pagelocation{font-size:1.5em;letter-spacing:.05em;vertical-align:middle}
-#moin-pagetrail{margin:0 .88em .25em .75em;padding:0;font-size:.88em;}
-#moin-pagetrail a{color:#fff}
-.moin-pagepath a{color:#fff !important}
+ul.moin-breadcrumb,ul.moin-breadcrumb ul.moin-alias{padding:0;margin:0;margin-bottom:4px}
+ul.moin-breadcrumb ul.moin-alias{background-color:#e6f2fe;border:1px solid #00417f;border-radius:6px}
+ul.moin-breadcrumb li ul.moin-alias li{list-style-type:none;display:block}
+ul.moin-breadcrumb li ul.moin-alias li a{padding:2px 10px;display:inline-block;color:#1f9ae0}
+ul.moin-breadcrumb li{position:relative}
+.moin-breadcrumb a{color:#fff}
+ul.moin-breadcrumb li ul.moin-alias{display:none;position:absolute}
+ul.moin-breadcrumb li:hover ul.moin-alias{display:block}
+.moin-breadcrumb > li{display:inline-block}
 #moin-navibar{clear:both;display:block;margin:0;padding:0 10px;font-size:.82em;color:#008b8b}
 #moin-navibar li{float:left;display:inline;margin:0 2px;padding:2px 5px;border:1px solid #4e7da9;border-bottom:none;white-space:nowrap;font-size:.88em;border-top-left-radius:5px;border-top-right-radius:5px}
 #moin-navibar li.wikilink{background:#eef1f6}
@@ -461,7 +451,7 @@
 a.moin-interwiki img{display:none}
 pre{font-size:10pt}
 div.moin-table-of-contents{box-shadow:none}
-a.moin-permalink,a.moin-showhide,#moin-header,#moin-sidebar,#moin-footer,#moin-timings,#moin-credits,#moin-interwiki,#moin-pagelocation{display:none}
+a.moin-permalink,a.moin-showhide,#moin-header,#moin-sidebar,#moin-footer,#moin-timings,#moin-credits,#moin-interwiki{display:none}
 #moin-pageinfo{color:#737373;font-size:.67em;float:right}
 #moin-pageinfo a{color:#737373}
 .moin-subitem-navigation{display:none}
@@ -476,11 +466,5 @@
 tt,pre{font-size:16pt}
 table.navigation{float:right;margin:2px}
 .navigation td,.navigation a{font-size:10pt;padding:2px}
-#moin-header,#moin-sidebar,#moin-footer,#moin-timings,#moin-credits,#moin-interwiki,#moin-pagelocation,#moin-pageinfo{display:none}
-}ul.moin-bcs-item ul.moin-bcs-subitems{background-color:#00417f}
-ul.moin-bcs-item,ul.moin-bcs-item ul.moin-bcs-subitems{padding:0;margin:0;display:inline-block}
-ul.moin-bcs-item li,ul.moin-bcs-item ul.moin-bcs-subitems li{list-style-type:none;display:block}
-ul.moin-bcs-item li ul.moin-bcs-subitems li a{padding:5px;display:inline-block}
-ul.moin-bcs-item li{position:relative}
-ul.moin-bcs-item li ul.moin-bcs-subitems{display:none;position:absolute}
-ul.moin-bcs-item li:hover ul.moin-bcs-subitems{display:block}
+#moin-header,#moin-sidebar,#moin-footer,#moin-timings,#moin-credits,#moin-interwiki,#moin-pageinfo{display:none}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/devel/api/MoinMoin.script.win.rst	Fri Feb 13 21:14:01 2015 +0100
@@ -0,0 +1,30 @@
+MoinMoin.script.win package
+===========================
+
+Submodules
+----------
+
+MoinMoin.script.win.dos2unix module
+-----------------------------------
+
+.. automodule:: MoinMoin.script.win.dos2unix
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+MoinMoin.script.win.wget module
+-------------------------------
+
+.. automodule:: MoinMoin.script.win.wget
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+Module contents
+---------------
+
+.. automodule:: MoinMoin.script.win
+    :members:
+    :undoc-members:
+    :show-inheritance:
--- a/docs/devel/development.rst	Tue Feb 10 23:42:38 2015 +0530
+++ b/docs/devel/development.rst	Fri Feb 13 21:14:01 2015 +0100
@@ -87,7 +87,7 @@
 
 * install NodeJS and NPM with Linux package manager; Windows users may download both from http://nodejs.org/download/
 
-  * On Ubuntu 14.04 you need to install "npm" and "nodejs-legacy" (to get the "node" command).
+  * On Ubuntu 14.04 or any distribution based on Ubuntu you need to install "npm" and "nodejs-legacy" (to get the "node" command).
 
 * install stylus::
 
--- a/docs/user/moinwiki.rst	Tue Feb 10 23:42:38 2015 +0530
+++ b/docs/user/moinwiki.rst	Fri Feb 13 21:14:01 2015 +0100
@@ -84,7 +84,7 @@
 +-------------------------------------+---------------------------------------+
 | ``,,Sub,,Script``                   | SubScript                             |
 +-------------------------------------+---------------------------------------+
-| ``~-Smaller-~``                     |    Smaller                               |
+| ``~-Smaller-~``                     | Smaller                               |
 +-------------------------------------+---------------------------------------+
 | ``~+Larger+~``                      | Larger                                |
 +-------------------------------------+---------------------------------------+
@@ -100,8 +100,6 @@
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | Markup                                    | Result                                      | Comments                                    |
 +===========================================+=============================================+=============================================+
-| ``ItemName``                              | `ItemName <ItemName>`_                      | Link to an item                             |
-+-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | ``[[ItemName]]``                          | `ItemName <ItemName>`_                      | Link to an item                             |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | ``[[ItemName|Named Item]]``               | `Named Item <ItemName>`_                    | Named link to an internal item              |
@@ -114,15 +112,11 @@
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | ``[[ItemName#AnchorName|Named Item1]]``   | `Named Item1 <ItemName#AnchorName>`_        | Named link to an anchor in an internal item |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
-| ``../SiblingItem``                        | `../SiblingItem <../SiblingItem>`_          | Link to a sibling of the current item       |
-+-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | ``[[../SiblingItem]]``                    | `../SiblingItem <../SiblingItem>`_          | Link to a sibling of the current item       |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
-| ``/SubItem``                              | `/SubItem </SubItem>`_                      | Link to a sub-item                          |
+| ``[[/SubItem]]``                          | `/SubItem </SubItem>`_                      | Link to a sub-item of current item          |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
-| ``[[/SubItem]]``                          | `/SubItem </SubItem>`_                      | Link to a sub-item                          |
-+-------------------------------------------+---------------------------------------------+---------------------------------------------+
-| ``Home/ItemName``                         | `Home/ItemName <Home/ItemName>`_            | Link to an item                             |
+| ``[[Home/ItemName]]``                     | `Home/ItemName <Home/ItemName>`_            | Link to a subitem of Home item              |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
 | ``[[/filename.txt]]``                     | `/filename.txt </filename.txt>`_            | Link to a sub-item called Filename.txt      |
 +-------------------------------------------+---------------------------------------------+---------------------------------------------+
@@ -133,20 +127,17 @@
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
 | Markup                                                         | Result                                                                       | Comments                                 |
 +================================================================+==============================================================================+==========================================+
-| ``http://moinmo.in/``                                          | http://moinmo.in/                                                            | External link                            |
-+----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
 | ``[[http://moinmo.in/]]``                                      | http://moinmo.in/                                                            | External link                            |
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
 | ``[[http://moinmo.in/|MoinMoin Wiki]]``                        | `MoinMoin Wiki <http://moinmo.in/>`_                                         | Named External link                      |
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
-| ``MeatBall:InterWiki``                                         | `MeatBall:InterWiki <http://www.usemod.com/cgi-bin/mb.pl?InterWiki>`_        | Link to an item on an external Wiki      |
+| ``[[MeatBall:InterWiki]]``                                     | `MeatBall:InterWiki <http://www.usemod.com/cgi-bin/mb.pl?InterWiki>`_        | Link to an item on an external Wiki      |
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
 | ``[[MeatBall:InterWiki|InterWiki page on MeatBall]]``          | `InterWiki page on MeatBall <http://www.usemod.com/cgi-bin/mb.pl?InterWiki>`_| Named link to an item on an external Wiki|
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
-| ``user@example.com``                                           | `user@example.com <mailto:user@example.com>`_                                | Mailto link                              |
+| ``[[mailto:user@example.com]]``                                | `mailto:user@example.com <mailto:user@example.com>`_                         | Mailto link                              |
 +----------------------------------------------------------------+------------------------------------------------------------------------------+------------------------------------------+
 
-**MOINTODO**: every syntax above that is not in a double square bracets ( [[]] ) does not work on moin2, it is also not listed to be a valid syntax on the moin2 syntax help page.
 
 Images and Transclusions
 ========================
@@ -334,107 +325,80 @@
 Tables
 ======
 
-Tables
-------
-
-**Markup**: ::
-
- ||'''A'''||'''B'''||'''C'''||
- ||1      ||2      ||3      ||
-
-**Result**:
-
-======= ======= =======
- A       B       C
-======= ======= =======
- 1       2       3
-======= ======= =======
-
-Cell Width
-----------
+Moin wiki markup supports table headers and footers. To indicate the first row(s) of a table is a header, insert a line of 3 or more = characters. To indicate a footer, include a second line of = characters after the body of the table.
 
 **Markup**: ::
 
- ||minimal width ||<99%>maximal width ||
+ ||Head A ||Head B ||Head C ||
+ =============================
+ ||a      ||b      ||c      ||
+ ||x      ||y      ||z      ||
 
 **Result**:
 
-+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| minimal width | maximal width (will take the maximum screen space)                                                                                                           |
-+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
+====== ====== ======
+Head A Head B Head C
+====== ====== ======
+a      b      c
+x      y      z
+====== ====== ======
 
-**Notes**:
- - **MOINTODO:** the cell width does not work in moin 2.
- - reStructuredText does not support percentage cell width so cell has been made long manually. In MoinMoin the second cell will take up the maximum amount of horizontal space.
+Table Styling
+-------------
 
-Spanning Rows and Columns
--------------------------
+To add styling to a table, enclose one or more parameters within angle brackets at the start of any table cell.
+
+================================== ===========================================================
+Markup                             Effect
+================================== ===========================================================
+<tableclass="zebra moin-sortable"> Adds one or more CSS classes to the table
+<rowclass="orange">                Adds one or more CSS classes to the row
+<class="green">                    Adds one or more CSS classes to the cell
+<tablestyle="color: red;">         Add CSS styling to table
+<rowstyle="font-size: 140%; ">     Add CSS styling to row
+<style="text-align: right;">       Add CSS styling to cell
+<80%>                              Set cell width, setting one cell effects entire table column
+<(>                                Align cell contents left
+<)>                                Align cell contents right
+<:>                                Center cell contents
+`<|2>`                             Cell spans 2 rows (omit a cell in next row)
+<-2>                               Cell spans 2 columns (omit a cell in this row)
+<#0000FF>                          Change background color of a table cell
+<rowspan="2">                      Same as `<|2>` above
+<colspan="2">                      Same as <-2> above
+`||||`                             An empty cell has same effect as <-2> above
+================================== ===========================================================
+
+Table Styling Example
+---------------------
 
 **Markup**: ::
 
- ||<|2> cell spanning 2 rows ||cell in the 2nd column ||
- ||cell in the 2nd column of the 2nd row ||
- ||<-2> cell spanning 2 columns ||
- ||||use empty cells as a shorthand ||
+ ||Head A||Head B||
+ ===
+ ||normal text||normal text||
+ ||<|2>cell spanning 2 rows||cell in the 2nd column||
+ ||cell in the 2nd column of the 2nd row||
+ ||<rowstyle="font-weight: bold;" class="monospaced">monospaced text||bold text||
 
 **Result**:
 
+
++----------------------+---------------------------------------+
+|Head A                |Head B                                 |
++======================+=======================================+
+| normal text          |normal text                            |
 +----------------------+---------------------------------------+
 | cell spanning 2 rows | cell in the 2nd column                |
 |                      +---------------------------------------+
 |                      | cell in the 2nd column of the 2nd row |
 +----------------------+---------------------------------------+
-| cell spanning 2 columns                                      |
-+-------------+------------------------------------------------+
-|             | use empty cells as a shorthand                 |
-+-------------+------------------------------------------------+
-
-**Notes**:
- - **MOINTODO:** use empty cells as a shorthand does not work in moin 2.
-
-Alignment of Cell Contents
---------------------------
-
-**Markup**: ::
-
- ||<^|3> Top (Combined) ||<:> Center (Combined) ||<v|3> Bottom (Combined) ||
- ||<)> Right ||
- ||<(> Left ||
-
-**Result**:
+|``monospaced text``   |**bold text**                          |
++----------------------+---------------------------------------+
 
-+----------------+---------------------------------------+-------------------+
-| Top (Combined) |           center (combined)           |                   |
-|                +---------------------------------------+                   |
-|                |                                 Right |                   |
-|                +---------------------------------------+                   |
-|                | Left                                  | Bottom (Combined) |
-+----------------+---------------------------------------+-------------------+
-
-**Notes**:
- - Text cannot be aligned in reStructuredText, but the text will appear as is described when used in MoinMoin.
-
-HTML-like Options for Tables
-----------------------------
-
-**Markup**: ::
-
- ||A ||<rowspan="2"> like <|2> ||
- ||B ||
- ||<colspan="2"> like <-2>||
-
-**Result**:
-
-+----------------+---------------+
-| A              |               |
-+----------------+ like ``<|2>`` |
-| B              |               |
-+----------------+---------------+
-| like <-2>                      |
-+--------------------------------+
 
 Macros
-------
+======
 
  - ``<<Anchor(anchorname)>>`` inserts a link anchor anchorname
  - ``<<BR>>`` inserts a hard line break
--- a/docs/user/rest.rst	Tue Feb 10 23:42:38 2015 +0530
+++ b/docs/user/rest.rst	Fri Feb 13 21:14:01 2015 +0100
@@ -419,6 +419,22 @@
 
 **Note** **RSTTODO** C does not extend fully up to the end of D.
 
+Grid table column widths can be expanded by adding spaces.
+
+**Markup**: ::
+
+ +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
+ | minimal width | maximal width (will take the maximum screen space)                                                                                                           |
+ +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+**Result**:
+
+ +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
+ | minimal width | maximal width (will take the maximum screen space)                                                                                                           |
+ +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
+
+**Note** **RSTTODO** The moin2 ReST parser does not add the <colgroup><col width="9%"><col width="91%"> HTML markup. Tables will always be of minimal width (unless there is CSS styling to set tables larger).
+
 Admonitions
 ===========
 
--- a/setup.py	Tue Feb 10 23:42:38 2015 +0530
+++ b/setup.py	Fri Feb 13 21:14:01 2015 +0100
@@ -92,7 +92,7 @@
         'flatland',  # form handling
         'Jinja2>=2.7',  # template engine
         'pygments>=1.4',  # src code / text file highlighting
-        'Werkzeug>=0.9',  # wsgi toolkit
+        'Werkzeug==0.9.6',  # wsgi toolkit
         'pytest<2.7',  # pytest is needed by unit tests (only tested with 2.5 and 2.6)
         'pytest-pep8<1.1',  # coding style checker (only tested with 1.0.x)
         'whoosh>=2.5.0',  # needed for indexed search