[ADD] github links from doc
This commit is contained in:
parent
c0373318d9
commit
f00bf9a461
|
@ -1,5 +1,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from . import html_domain
|
from . import html_domain
|
||||||
|
from . import github
|
||||||
# add Odoo style to pygments
|
# add Odoo style to pygments
|
||||||
from . import odoo_pygments
|
from . import odoo_pygments
|
||||||
|
|
||||||
|
@ -8,6 +9,7 @@ sphinx_monkeypatch.patch()
|
||||||
|
|
||||||
def setup(app):
|
def setup(app):
|
||||||
html_domain.setup(app)
|
html_domain.setup(app)
|
||||||
|
github.setup(app)
|
||||||
|
|
||||||
app.add_directive('exercise', Exercise)
|
app.add_directive('exercise', Exercise)
|
||||||
app.add_node(exercise, html=(
|
app.add_node(exercise, html=(
|
||||||
|
|
|
@ -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)
|
|
@ -27,6 +27,11 @@
|
||||||
<div class="sphinxsidebarwrapper">
|
<div class="sphinxsidebarwrapper">
|
||||||
{{ toctree(maxdepth=4, collapse=False, includehidden=True,
|
{{ toctree(maxdepth=4, collapse=False, includehidden=True,
|
||||||
main_navbar=False, titles_only=False) }}
|
main_navbar=False, titles_only=False) }}
|
||||||
|
{% if github %}
|
||||||
|
<p><a href="{{ github(pagename) }}" class="github">
|
||||||
|
Edit on GitHub
|
||||||
|
</a></p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 604 B |
|
@ -6346,6 +6346,31 @@ body {
|
||||||
.sphinxsidebarwrapper > .nav li.current > .nav {
|
.sphinxsidebarwrapper > .nav li.current > .nav {
|
||||||
display: block;
|
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 */
|
/* Side navigation graphical styling */
|
||||||
.sphinxsidebarwrapper {
|
.sphinxsidebarwrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -6518,6 +6543,14 @@ body {
|
||||||
.headerlink {
|
.headerlink {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.viewcode-link {
|
||||||
|
font-weight: normal;
|
||||||
|
float: right;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
dt:hover > a > .viewcode-link {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
div.section > h1 {
|
div.section > h1 {
|
||||||
padding-bottom: 9px;
|
padding-bottom: 9px;
|
||||||
margin: 40px 0 20px;
|
margin: 40px 0 20px;
|
||||||
|
|
|
@ -155,6 +155,33 @@ body {
|
||||||
display: block;
|
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 */
|
/* Side navigation graphical styling */
|
||||||
|
@ -325,6 +352,16 @@ body {
|
||||||
.headerlink {
|
.headerlink {
|
||||||
display: none;
|
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
|
// either that or overwrite visit_attribution/depart_attribution
|
||||||
blockquote p.attribution:extend(blockquote footer) {}
|
blockquote p.attribution:extend(blockquote footer) {}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ extensions = [
|
||||||
'sphinx.ext.todo',
|
'sphinx.ext.todo',
|
||||||
'sphinx.ext.autodoc',
|
'sphinx.ext.autodoc',
|
||||||
'sphinx.ext.intersphinx',
|
'sphinx.ext.intersphinx',
|
||||||
|
'sphinx.ext.linkcode',
|
||||||
'odoodoc',
|
'odoodoc',
|
||||||
'patchqueue'
|
'patchqueue'
|
||||||
]
|
]
|
||||||
|
@ -162,3 +163,11 @@ intersphinx_mapping = {
|
||||||
'python': ('https://docs.python.org/2/', None),
|
'python': ('https://docs.python.org/2/', None),
|
||||||
'werkzeug': ('http://werkzeug.pocoo.org/docs/0.9/', 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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue