12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- # -*- coding: utf-8 -*-
- """
- :copyright: (c) 2010-2012 Fabien Potencier
- :license: MIT, see LICENSE for more details.
- """
- from sphinx import addnodes
- from sphinx.domains import Domain, ObjType
- from sphinx.locale import l_, _
- from sphinx.directives import ObjectDescription
- from sphinx.domains.python import py_paramlist_re as js_paramlist_re
- from sphinx.roles import XRefRole
- from sphinx.util.nodes import make_refnode
- from sphinx.util.docfields import Field, GroupedField, TypedField
- def setup(app):
- app.add_domain(PHPDomain)
- class PHPXRefRole(XRefRole):
- def process_link(self, env, refnode, has_explicit_title, title, target):
- # basically what sphinx.domains.python.PyXRefRole does
- refnode['php:object'] = env.temp_data.get('php:object')
- if not has_explicit_title:
- title = title.lstrip('\\')
- target = target.lstrip('~')
- if title[0:1] == '~':
- title = title[1:]
- ns = title.rfind('\\')
- if ns != -1:
- title = title[ns+1:]
- if target[0:1] == '\\':
- target = target[1:]
- refnode['refspecific'] = True
- return title, target
- class PHPDomain(Domain):
- """PHP language domain."""
- name = 'php'
- label = 'PHP'
- # if you add a new object type make sure to edit JSObject.get_index_string
- object_types = {
- }
- directives = {
- }
- roles = {
- 'func': PHPXRefRole(fix_parens=True),
- 'class': PHPXRefRole(),
- 'data': PHPXRefRole(),
- 'attr': PHPXRefRole(),
- }
- initial_data = {
- 'objects': {}, # fullname -> docname, objtype
- }
- def clear_doc(self, docname):
- for fullname, (fn, _) in self.data['objects'].items():
- if fn == docname:
- del self.data['objects'][fullname]
- def find_obj(self, env, obj, name, typ, searchorder=0):
- if name[-2:] == '()':
- name = name[:-2]
- objects = self.data['objects']
- newname = None
- if searchorder == 1:
- if obj and obj + '\\' + name in objects:
- newname = obj + '\\' + name
- else:
- newname = name
- else:
- if name in objects:
- newname = name
- elif obj and obj + '\\' + name in objects:
- newname = obj + '\\' + name
- return newname, objects.get(newname)
- def resolve_xref(self, env, fromdocname, builder, typ, target, node,
- contnode):
- objectname = node.get('php:object')
- searchorder = node.hasattr('refspecific') and 1 or 0
- name, obj = self.find_obj(env, objectname, target, typ, searchorder)
- if not obj:
- return None
- return make_refnode(builder, fromdocname, obj[0], name, contnode, name)
- def get_objects(self):
- for refname, (docname, type) in self.data['objects'].iteritems():
- yield refname, refname, type, docname, refname, 1
|