[ADD] support for a version switcher in odoo theme thing
authorXavier Morel <xmo@openerp.com>
Thu, 4 Sep 2014 12:40:20 +0000 (14:40 +0200)
committerXavier Morel <xmo@openerp.com>
Thu, 4 Sep 2014 12:43:55 +0000 (14:43 +0200)
needs beauty input

doc/README.rst
doc/_themes/odoodoc/layout.html
doc/_themes/odoodoc/static/style.css
doc/_themes/odoodoc/static/style.less
doc/conf.py
doc/git.rst

index b9b6d63..0395fa2 100644 (file)
@@ -1,4 +1,4 @@
-.. orphan:: true
+:orphan:
 
 ==================
 Odoo Documentation
@@ -38,6 +38,10 @@ Sphinx Customizations
 Additional features
 -------------------
 
+* versions switcher, uses the ``canonical_root`` setting and an additional
+  ``versions`` setting which should be a space-separated list of available
+  versions. Appends the each version and page name to the root, and displays
+  a list of those links on the current page
 * canonical urls, requires a ``canonical_root`` setting value, and optionally
   a ``canonical_branch`` (default: ``master``)
 * :guilabel:`Edit on github` link in Sphinx pages if ``github_user`` and
index efa9ff7..69f7dbf 100644 (file)
     <div class="sphinxsidebarwrapper">
       {{ toctree(maxdepth=4, collapse=False, includehidden=True,
                  main_navbar=False, titles_only=False) }}
+      {% if versions %}
+        <div class="versions">
+          Documentation version: {{ version }}
+          <ul>
+            {% for name, url in versions %}
+              <li><a href="{{ url }}">{{ name }}</a></li>
+            {% endfor %}
+          </ul>
+        </div>
+      {% endif %}
       {% if github_link %}
         <p><a href="{{ github_link() }}" class="github">
           Edit on GitHub
index fdbf134..20f02ac 100644 (file)
@@ -6346,34 +6346,14 @@ body {
 .sphinxsidebarwrapper > .nav li.current > .nav {
   display: block;
 }
-.sphinxsidebarwrapper > p {
-  margin: 5px 10px 10px;
-}
-.sphinxsidebarwrapper > p a {
-  font-size: 13px;
-}
-.sphinxsidebarwrapper > p a:hover {
-  text-decoration: none;
-}
-.sphinxsidebarwrapper > p a.github {
-  padding-left: 15px;
-  position: relative;
-}
-.sphinxsidebarwrapper > p a.github:before {
-  left: 0;
-  top: 1px;
-  content: '';
-  position: absolute;
-  width: 13px;
-  height: 13px;
-  background: url(github-link.png) left bottom / 13px no-repeat;
-}
-.sphinxsidebarwrapper > p a.github:hover:before {
-  background-position: left top;
-}
 /* Side navigation graphical styling */
+.sphinxsidebar {
+  z-index: 1;
+}
 .sphinxsidebarwrapper {
   width: 100%;
+  font-size: 13px;
+  z-index: 1;
   /* First level of nav */
   /* All levels of nav */
 }
@@ -6397,7 +6377,6 @@ body {
   margin-bottom: 20px;
 }
 .sphinxsidebarwrapper .nav > li > a {
-  font-size: 13px;
   font-weight: bold;
   padding-left: 20px;
 }
@@ -6476,6 +6455,76 @@ body {
 .sphinxsidebarwrapper .nav .nav .nav .nav > .active:focus > a {
   padding-left: 33px;
 }
+/* version switcher */
+.sphinxsidebarwrapper div.versions {
+  padding: 5px 10px 10px;
+  position: relative;
+  display: inline-block;
+  color: #777777;
+  cursor: pointer;
+}
+.sphinxsidebarwrapper div.versions:after {
+  font-family: "Glyphicons Halflings";
+  content: "\e072";
+  font-size: 80%;
+  padding-left: 3px;
+}
+.sphinxsidebarwrapper div.versions ul {
+  display: none;
+  list-style: none;
+  padding: 0;
+  margin: 0 0 0 -5px;
+  white-space: nowrap;
+  background-color: rgba(255, 255, 255, 0.9);
+  position: absolute;
+  top: 0;
+  left: 100%;
+}
+.sphinxsidebarwrapper div.versions ul > li {
+  display: inline-block;
+  margin-left: -1px;
+}
+.sphinxsidebarwrapper div.versions ul > li:first {
+  margin-left: 0;
+}
+.sphinxsidebarwrapper div.versions ul > li a {
+  color: #777777;
+  display: inline-block;
+  padding: 5px;
+}
+.sphinxsidebarwrapper div.versions ul > li a:hover {
+  text-decoration: none;
+  background-color: rgba(85, 85, 85, 0.07);
+}
+.sphinxsidebarwrapper div.versions:hover ul {
+  display: block;
+}
+/* github link for current document */
+.sphinxsidebarwrapper > p {
+  margin: 5px 10px 10px;
+}
+.sphinxsidebarwrapper > p a {
+  font-size: 13px;
+}
+.sphinxsidebarwrapper > p a:hover {
+  text-decoration: none;
+}
+.sphinxsidebarwrapper > p a.github {
+  padding-left: 15px;
+  position: relative;
+}
+.sphinxsidebarwrapper > p a.github:before {
+  left: 0;
+  top: 1px;
+  content: '';
+  position: absolute;
+  width: 13px;
+  height: 13px;
+  background: url(github-link.png) left bottom / 13px no-repeat;
+}
+.sphinxsidebarwrapper > p a.github:hover:before {
+  background-position: left top;
+}
 /* Show and affix the side nav when space allows it */
 @media (min-width: 992px) {
   .sphinxsidebarwrapper {
index f2eaba2..ae7333b 100644 (file)
@@ -155,33 +155,6 @@ body {
       display: block;
     }
   }
-
-  > p {
-    margin: 5px 10px 10px;
-    a {
-      font-size: 13px;
-      &:hover {
-        text-decoration: none;
-      }
-
-      &.github {
-        padding-left: 15px;
-        position: relative;
-        &:before {
-          left: 0;
-          top: 1px;
-          content: '';
-          position: absolute;
-          width: 13px;
-          height: 13px;
-          background: url(github-link.png) left bottom / 13px no-repeat;
-        }
-        &:hover:before {
-          background-position: left top;
-        }
-      }
-    }
-  }
 }
 
 /* Side navigation graphical styling */
@@ -192,8 +165,13 @@ body {
 @nav-current-offset: 2px;
 @nav-current: @nav-spacing - @nav-current-offset;
 
+.sphinxsidebar {
+  z-index: 1;
+}
 .sphinxsidebarwrapper {
   width: 100%;
+  font-size: 13px;
+  z-index: 1;
 
   .hidden-xs();
   .hidden-sm();
@@ -206,7 +184,6 @@ body {
   }
 
   .nav > li > a {
-    font-size: 13px;
     font-weight: bold;
     padding-left: @nav-spacing;
   }
@@ -283,6 +260,81 @@ body {
     }
   }
 }
+/* version switcher */
+.sphinxsidebarwrapper div.versions {
+  // use padding to set up a big hover target
+  padding: 5px 10px 10px;
+
+  position: relative;
+  display: inline-block;
+  color: @gray-light;
+  cursor: pointer;
+  // "▶" to the right of the current version's name
+  &:after {
+    font-family: "Glyphicons Halflings";
+    content: "\e072";
+    font-size: 80%;
+    // space out a bit from the version name
+    padding-left: 3px;
+  }
+
+  ul {
+    display: none;
+    list-style: none;
+    padding: 0;
+    margin: 0 0 0 -5px;
+    white-space: nowrap;
+    background-color: fade(@body-bg, 90%);
+
+    position: absolute;
+    top: 0;
+    left: 100%;
+    > li {
+      display: inline-block;
+      margin-left: -1px;
+      &:first { margin-left: 0;}
+      a {
+        color: @gray-light;
+        display: inline-block;
+        padding: 5px;
+        &:hover {
+          text-decoration: none;
+          background-color: fade(@gray, 7%);
+        }
+      }
+    }
+  }
+  &:hover ul {
+    display: block;
+  }
+}
+/* github link for current document */
+.sphinxsidebarwrapper > p {
+  margin: 5px 10px 10px;
+  a {
+    font-size: 13px;
+    &:hover {
+      text-decoration: none;
+    }
+
+    &.github {
+      padding-left: 15px;
+      position: relative;
+      &:before {
+        left: 0;
+        top: 1px;
+        content: '';
+        position: absolute;
+        width: 13px;
+        height: 13px;
+        background: url(github-link.png) left bottom / 13px no-repeat;
+      }
+      &:hover:before {
+        background-position: left top;
+      }
+    }
+  }
+}
 
 /* Show and affix the side nav when space allows it */
 @media (min-width: @screen-md-min) {
index a55a48c..f563a28 100644 (file)
@@ -177,13 +177,40 @@ def setup(app):
     app.connect('html-page-context', canonicalize)
     app.add_config_value('canonical_root', None, 'env')
     app.add_config_value('canonical_branch', 'master', 'env')
+
+    app.connect('html-page-context', versionize)
+    app.add_config_value('versions', '', 'env')
+
 def canonicalize(app, pagename, templatename, context, doctree):
+    """ Adds a 'canonical' URL for the current document in the rendering
+    context. Requires the ``canonical_root`` setting being set. The canonical
+    branch is ``master`` but can be overridden using ``canonical_branch``.
+    """
     if not app.config.canonical_root:
         return
 
-    context['canonical'] = "{canonical_url}{canonical_branch}/{canonical_page}".format(
-        canonical_url=app.config.canonical_root,
-        canonical_branch=app.config.canonical_branch,
+    context['canonical'] = _build_url(
+        app.config.canonical_root, app.config.canonical_branch, pagename)
+
+def versionize(app, pagename, templatename, context, doctree):
+    """ Adds a version switcher below the menu, requires ``canonical_root``
+    and ``versions`` (an ordered, space-separated lists of all possible
+    versions).
+    """
+    if not (app.config.canonical_root and app.config.versions):
+        return
+
+    context['versions'] = [
+        (vs, _build_url(app.config.canonical_root, vs, pagename))
+        for vs in app.config.versions.split(',')
+        if vs != app.config.version
+    ]
+
+def _build_url(root, branch, pagename):
+    return "{canonical_url}{canonical_branch}/{canonical_page}".format(
+        canonical_url=root,
+        canonical_branch=branch,
         canonical_page=(pagename + '.html').replace('index.html', '')
                                            .replace('index/', ''),
     )
+
index 8f6d87a..5ae8bee 100644 (file)
@@ -1,4 +1,4 @@
-:orphan: true
+:orphan:
 
 =============
 Bazaar to git