Chromium Code Reviews| Index: chrome/common/extensions/docs/server2/reference_resolver.py | 
| diff --git a/chrome/common/extensions/docs/server2/reference_resolver.py b/chrome/common/extensions/docs/server2/reference_resolver.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..10b6010a94f8b8303a0a9a71849526d7704f38c4 | 
| --- /dev/null | 
| +++ b/chrome/common/extensions/docs/server2/reference_resolver.py | 
| @@ -0,0 +1,65 @@ | 
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| +# Use of this source code is governed by a BSD-style license that can be | 
| +# found in the LICENSE file. | 
| + | 
| +from file_system import FileNotFoundError | 
| + | 
| +def _ClassifySchemaNode(node_name, api): | 
| + if '.' in node_name: | 
| + node_name, rest = node_name.split('.', 1) | 
| + else: | 
| + rest = None | 
| + for key, group in [('types', 'type'), | 
| + ('functions', 'method'), | 
| + ('events', 'event'), | 
| + ('properties', 'property')]: | 
| + for item in api.get(key, []): | 
| + if item['name'] == node_name: | 
| + if rest is not None: | 
| + ret = _ClassifySchemaNode(rest, item) | 
| + if ret is not None: | 
| + return ret | 
| + else: | 
| + return group | 
| + return None | 
| + | 
| +class ReferenceResolver(object): | 
| + """Resolves references to $ref's by searching through the APIs to find the | 
| + correct node. | 
| + """ | 
| + def __init__(self, api_data_source, api_list_data_source): | 
| + self._api_data_source = api_data_source | 
| + self._api_list_data_source = api_list_data_source | 
| + | 
| + def GetLinkToRefType(self, namespace_name, ref_type): | 
| 
 
not at google - send to devlin
2012/11/02 17:26:48
The "type" seems incorrect now that we're resolvin
 
cduvall
2012/11/03 01:30:05
Done.
 
 | 
| + if ref_type.startswith('%s.' % namespace_name): | 
| + ref_type = ref_type[len('%s.' % namespace_name):] | 
| + if '.' not in ref_type: | 
| + try: | 
| + category = _ClassifySchemaNode( | 
| + ref_type, | 
| + self._api_data_source[namespace_name]) | 
| 
 
not at google - send to devlin
2012/11/02 17:26:48
General comment: do we need all these __getitem__
 
cduvall
2012/11/03 01:30:05
Took out the __getitem__ stuff.
 
 | 
| + except FileNotFoundError: | 
| + return None | 
| + if category is None: | 
| + return None | 
| + return { 'href': '#%s-%s' % (category, ref_type), 'text': ref_type } | 
| + parts = ref_type.split('.') | 
| + api_list = self._api_list_data_source.GetAllNames() | 
| + for i, part in enumerate(parts): | 
| + if '.'.join(parts[:i]) not in api_list: | 
| + continue | 
| + try: | 
| + api_name = '.'.join(parts[:i]) | 
| + api = self._api_data_source[api_name] | 
| + except FileNotFoundError: | 
| + continue | 
| + name = '.'.join(parts[i:]) | 
| + category = _ClassifySchemaNode(name, api) | 
| + if category is None: | 
| + continue | 
| + return { | 
| + 'href': '%s.html#%s-%s' % (api_name, category, name.replace('.', '-')), | 
| + 'text': ref_type | 
| + } | 
| + return None |