| OLD | NEW |
| (Empty) | |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 from file_system import FileNotFoundError |
| 6 |
| 7 def _ClassifySchemaNode(node_name, api): |
| 8 if '.' in node_name: |
| 9 node_name, rest = node_name.split('.', 1) |
| 10 else: |
| 11 rest = None |
| 12 for key, group in [('types', 'type'), |
| 13 ('functions', 'method'), |
| 14 ('events', 'event'), |
| 15 ('properties', 'property')]: |
| 16 for item in api.get(key, []): |
| 17 if item['name'] == node_name: |
| 18 if rest is not None: |
| 19 ret = _ClassifySchemaNode(rest, item) |
| 20 if ret is not None: |
| 21 return ret |
| 22 else: |
| 23 return group |
| 24 return None |
| 25 |
| 26 class ReferenceResolver(object): |
| 27 """Resolves references to $ref's by searching through the APIs to find the |
| 28 correct node. |
| 29 """ |
| 30 class Factory(object): |
| 31 def __init__(self, api_data_source, api_list_data_source): |
| 32 self._api_data_source = api_data_source |
| 33 self._api_list_data_source = api_list_data_source |
| 34 |
| 35 def Create(self): |
| 36 return ReferenceResolver(self._api_data_source, |
| 37 self._api_list_data_source) |
| 38 |
| 39 def __init__(self, api_data_source, api_list_data_source): |
| 40 self._api_data_source = api_data_source |
| 41 self._api_list_data_source = api_list_data_source |
| 42 |
| 43 def GetLink(self, namespace_name, ref): |
| 44 # Try to resolve the ref in the current namespace first. |
| 45 try: |
| 46 api = self._api_data_source.get(namespace_name) |
| 47 category = _ClassifySchemaNode(ref, api) |
| 48 if category is not None: |
| 49 return { |
| 50 'href': '#%s-%s' % (category, ref.replace('.', '-')), |
| 51 'text': ref |
| 52 } |
| 53 except FileNotFoundError: |
| 54 pass |
| 55 parts = ref.split('.') |
| 56 api_list = self._api_list_data_source.GetAllNames() |
| 57 for i, part in enumerate(parts): |
| 58 if '.'.join(parts[:i]) not in api_list: |
| 59 continue |
| 60 try: |
| 61 api_name = '.'.join(parts[:i]) |
| 62 api = self._api_data_source.get(api_name) |
| 63 except FileNotFoundError: |
| 64 continue |
| 65 name = '.'.join(parts[i:]) |
| 66 category = _ClassifySchemaNode(name, api) |
| 67 if category is None: |
| 68 continue |
| 69 text = ref |
| 70 if text.startswith('%s.' % namespace_name): |
| 71 text = text[len('%s.' % namespace_name):] |
| 72 return { |
| 73 'href': '%s.html#%s-%s' % (api_name, category, name.replace('.', '-')), |
| 74 'text': text |
| 75 } |
| 76 return None |
| OLD | NEW |