[ADD] github links from doc
authorXavier Morel <xmo@openerp.com>
Wed, 3 Sep 2014 08:18:20 +0000 (10:18 +0200)
committerXavier Morel <xmo@openerp.com>
Wed, 3 Sep 2014 12:53:41 +0000 (14:53 +0200)
doc/_themes/odoodoc/__init__.py
doc/_themes/odoodoc/github.py [new file with mode: 0644]
doc/_themes/odoodoc/layout.html
doc/_themes/odoodoc/static/github-link.png [new file with mode: 0644]
doc/_themes/odoodoc/static/style.css
doc/_themes/odoodoc/static/style.less
doc/conf.py

index fb7908b..f646839 100644 (file)
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 from . import html_domain
+from . import github
 # add Odoo style to pygments
 from . import odoo_pygments
 
@@ -8,6 +9,7 @@ sphinx_monkeypatch.patch()
 
 def setup(app):
     html_domain.setup(app)
+    github.setup(app)
 
     app.add_directive('exercise', Exercise)
     app.add_node(exercise, html=(
diff --git a/doc/_themes/odoodoc/github.py b/doc/_themes/odoodoc/github.py
new file mode 100644 (file)
index 0000000..2e07b67
--- /dev/null
@@ -0,0 +1,71 @@
+import inspect
+import importlib
+import os.path
+from urlparse import urlunsplit
+
+# FIXME: better way to handle this?
+_app = None
+def setup(app):
+    global _app
+    _app = app
+    app.add_config_value('github_user', None, 'env')
+    app.add_config_value('github_project', None, 'env')
+
+def linkcode_resolve(domain, info):
+    # TODO: js?
+    if domain != 'py':
+        return None
+
+    module, fullname = info['module'], info['fullname']
+    # TODO: attributes/properties don't have modules, maybe try to look them
+    # up based on their cached host object?
+    if not module:
+        return None
+
+    obj = importlib.import_module(module)
+    for item in fullname.split('.'):
+        obj = getattr(obj, item, None)
+
+    if obj is None:
+        return None
+
+    # get original from decorated methods
+    try: obj = getattr(obj, '_orig')
+    except AttributeError: pass
+
+    try:
+        obj_source_path = inspect.getsourcefile(obj)
+        _, line = inspect.getsourcelines(obj)
+    except (TypeError, IOError):
+        # obj doesn't have a module, or something
+        return None
+
+    import openerp
+    project_root = os.path.join(os.path.dirname(openerp.__file__), '..')
+    return make_github_link(
+        os.path.relpath(obj_source_path, project_root),
+        line)
+
+def make_github_link(path, line=None, mode="blob"):
+    config = _app.config
+    if not (config.github_user and config.github_project):
+        return None
+
+    urlpath = "/{user}/{project}/{mode}/{branch}/{path}".format(
+        user=config.github_user,
+        project=config.github_project,
+        branch=config.version or 'master',
+        path=path,
+        mode=mode,
+    )
+    return urlunsplit((
+        'https',
+        'github.com',
+        urlpath,
+        '',
+        '' if line is None else 'L%d' % line
+    ))
+
+def github_doc_link(pagename, mode='blob'):
+    return make_github_link(
+        'doc/%s%s' % (pagename, _app.config.source_suffix), mode=mode)
index 00a6370..a803f91 100644 (file)
     <div class="sphinxsidebarwrapper">
       {{ toctree(maxdepth=4, collapse=False, includehidden=True,
                  main_navbar=False, titles_only=False) }}
+    {% if github %}
+      <p><a href="{{ github(pagename) }}" class="github">
+        Edit on GitHub
+      </a></p>
+    {% endif %}
     </div>
   </div>
   {{ super() }}
diff --git a/doc/_themes/odoodoc/static/github-link.png b/doc/_themes/odoodoc/static/github-link.png
new file mode 100644 (file)
index 0000000..f0a6383
Binary files /dev/null and b/doc/_themes/odoodoc/static/github-link.png differ
index e39bead..20164ea 100644 (file)
@@ -6346,6 +6346,31 @@ 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 */
 .sphinxsidebarwrapper {
   width: 100%;
@@ -6518,6 +6543,14 @@ body {
 .headerlink {
   display: none;
 }
+.viewcode-link {
+  font-weight: normal;
+  float: right;
+  display: none;
+}
+dt:hover > a > .viewcode-link {
+  display: inline;
+}
 div.section > h1 {
   padding-bottom: 9px;
   margin: 40px 0 20px;
index b224a1a..7b50804 100644 (file)
@@ -155,6 +155,33 @@ 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 */
@@ -325,6 +352,16 @@ body {
 .headerlink {
   display: none;
 }
+// move [source] link to the right
+.viewcode-link {
+  font-weight: normal;
+  float: right;
+  display: none;
+}
+dt:hover > a > .viewcode-link {
+  display: inline;
+}
+
 // either that or overwrite visit_attribution/depart_attribution
 blockquote p.attribution:extend(blockquote footer) {}
 
index 4dafec1..daec9bb 100644 (file)
@@ -22,6 +22,7 @@ extensions = [
     'sphinx.ext.todo',
     'sphinx.ext.autodoc',
     'sphinx.ext.intersphinx',
+    'sphinx.ext.linkcode',
     'odoodoc',
     'patchqueue'
 ]
@@ -162,3 +163,11 @@ intersphinx_mapping = {
     'python': ('https://docs.python.org/2/', None),
     'werkzeug': ('http://werkzeug.pocoo.org/docs/0.9/', None),
 }
+
+from odoodoc.github import linkcode_resolve, github_doc_link
+github_user = 'odoo'
+github_project = 'odoo'
+
+html_context = {
+    'github': github_doc_link
+}