From f00bf9a461c59866310aef4ac1a23fdd05137a1c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 3 Sep 2014 10:18:20 +0200 Subject: [PATCH] [ADD] github links from doc --- doc/_themes/odoodoc/__init__.py | 2 + doc/_themes/odoodoc/github.py | 71 +++++++++++++++++++++ doc/_themes/odoodoc/layout.html | 5 ++ doc/_themes/odoodoc/static/github-link.png | Bin 0 -> 604 bytes doc/_themes/odoodoc/static/style.css | 33 ++++++++++ doc/_themes/odoodoc/static/style.less | 37 +++++++++++ doc/conf.py | 9 +++ 7 files changed, 157 insertions(+) create mode 100644 doc/_themes/odoodoc/github.py create mode 100644 doc/_themes/odoodoc/static/github-link.png diff --git a/doc/_themes/odoodoc/__init__.py b/doc/_themes/odoodoc/__init__.py index fb7908bcabb..f646839d95b 100644 --- a/doc/_themes/odoodoc/__init__.py +++ b/doc/_themes/odoodoc/__init__.py @@ -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 index 00000000000..2e07b67e57a --- /dev/null +++ b/doc/_themes/odoodoc/github.py @@ -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) diff --git a/doc/_themes/odoodoc/layout.html b/doc/_themes/odoodoc/layout.html index 00a63702165..a803f913c96 100644 --- a/doc/_themes/odoodoc/layout.html +++ b/doc/_themes/odoodoc/layout.html @@ -27,6 +27,11 @@
{{ toctree(maxdepth=4, collapse=False, includehidden=True, main_navbar=False, titles_only=False) }} + {% if github %} +

+ Edit on GitHub +

+ {% endif %}
{{ super() }} diff --git a/doc/_themes/odoodoc/static/github-link.png b/doc/_themes/odoodoc/static/github-link.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a638362db48a084844e8dfb9f97cdd1ffd78a1 GIT binary patch literal 604 zcmV-i0;BzjP)5n@WYMM}w3=eVt2&ls|o>RgIKDeWX^75C#l{0000E zbW%=J01%~NH`?*>9R=Nc$iVhn(i8vy0nJH7K~#9!m6YL<#SjdIB}f#l_kY_hVN-NF zv**Xt5_(Y&&Ti&`N4I2+}gZ6vnYrX&v6U47Dp@B_8@F!U{m_h1l0kw$Bg{ zb^xTcAz5}wDVggVxCEd#fCQlLGmy#OUy%*UdaU_FDzSpHS%l+;fjSYM>Cp284NWdr z#JZz3cUIE9aiE)!iKyL0)Y_){+9B$jyI&yvo;Mq?$sKwF)3=2<*cpiT03~v=Njqp> z1bJMz0vYCur5T{@@*zd)BMyp5*nbKvdM<_iU;a=Ydhv&{Xz>SMHu .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; diff --git a/doc/_themes/odoodoc/static/style.less b/doc/_themes/odoodoc/static/style.less index b224a1a56c9..7b508045c8d 100644 --- a/doc/_themes/odoodoc/static/style.less +++ b/doc/_themes/odoodoc/static/style.less @@ -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) {} diff --git a/doc/conf.py b/doc/conf.py index 4dafec15ae8..daec9bb28df 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -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 +}