| Index: chrome/common/extensions/docs/server2/sidenav_data_source.py
|
| diff --git a/chrome/common/extensions/docs/server2/sidenav_data_source.py b/chrome/common/extensions/docs/server2/sidenav_data_source.py
|
| index 06ff272100e95fb656f9e50d087995347d9fd5ae..6d0909317c9a7cba6f283933e35398ef2da35be6 100644
|
| --- a/chrome/common/extensions/docs/server2/sidenav_data_source.py
|
| +++ b/chrome/common/extensions/docs/server2/sidenav_data_source.py
|
| @@ -3,71 +3,80 @@
|
| # found in the LICENSE file.
|
|
|
| import copy
|
| -import json
|
| import logging
|
|
|
| -class SidenavDataSource(object):
|
| - """This class reads in and caches a JSON file representing the side navigation
|
| - menu.
|
| - """
|
| - class Factory(object):
|
| - def __init__(self, compiled_fs_factory, json_path):
|
| - self._cache = compiled_fs_factory.Create(self._CreateSidenavDict,
|
| - SidenavDataSource)
|
| - self._json_path = json_path
|
| -
|
| - def Create(self, path):
|
| - """Create a SidenavDataSource, binding it to |path|. |path| is the url
|
| - of the page that is being rendered. It is used to determine which item
|
| - in the sidenav should be highlighted.
|
| - """
|
| - return SidenavDataSource(self._cache, self._json_path, path)
|
| -
|
| - def _AddLevels(self, items, level):
|
| - """Levels represent how deeply this item is nested in the sidenav. We
|
| - start at 2 because the top <ul> is the only level 1 element.
|
| - """
|
| - for item in items:
|
| - item['level'] = level
|
| - if 'items' in item:
|
| - self._AddLevels(item['items'], level + 1)
|
| -
|
| - def _CreateSidenavDict(self, json_path, json_str):
|
| - items = json.loads(json_str)
|
| - self._AddLevels(items, 2);
|
| - return items
|
| -
|
| - def __init__(self, cache, json_path, path):
|
| - self._cache = cache
|
| - self._json_path = json_path
|
| - self._href = '/' + path
|
| -
|
| - def _AddSelected(self, items):
|
| - for item in items:
|
| - if item.get('href', '') == self._href:
|
| - item['selected'] = True
|
| +from data_source import DataSource
|
| +from third_party.json_schema_compiler.json_parse import Parse
|
| +
|
| +
|
| +def _AddLevels(items, level):
|
| + '''Add a 'level' key to each item in |items|. 'level' corresponds to how deep
|
| + in |items| an item is. |level| sets the starting depth.
|
| + '''
|
| + for item in items:
|
| + item['level'] = level
|
| + if 'items' in item:
|
| + _AddLevels(item['items'], level + 1)
|
| +
|
| +
|
| +def _AddSelected(items, path):
|
| + '''Add 'selected' and 'child_selected' properties to |items| so that the
|
| + sidenav can be expanded to show which menu item has been selected. Returns
|
| + True if an item was marked 'selected'.
|
| + '''
|
| + for item in items:
|
| + if item.get('href', '') == '/' + path:
|
| + item['selected'] = True
|
| + return True
|
| + if 'items' in item:
|
| + if _AddSelected(item['items'], path):
|
| + item['child_selected'] = True
|
| return True
|
| - if 'items' in item:
|
| - if self._AddSelected(item['items']):
|
| - item['child_selected'] = True
|
| - return True
|
| - return False
|
| -
|
| - def _QualifyHrefs(self, items):
|
| - for item in items:
|
| - if 'items' in item:
|
| - self._QualifyHrefs(item['items'])
|
| -
|
| - href = item.get('href')
|
| - if href is not None and not href.startswith(('http://', 'https://')):
|
| - if not href.startswith('/'):
|
| - logging.warn('Paths in sidenav must be qualified. %s is not.' % href)
|
| - href = '/' + href
|
| - item['href'] = href
|
| +
|
| + return False
|
| +
|
| +
|
| +def _QualifyHrefs(items):
|
| + '''Force hrefs in |items| to either be absolute (http://...) or qualified
|
| + (begins with a slash (/)). Other hrefs emit a warning and should be updated.
|
| + '''
|
| + for item in items:
|
| + if 'items' in item:
|
| + _QualifyHrefs(item['items'])
|
| +
|
| + href = item.get('href')
|
| + if href is not None and not href.startswith(('http://', 'https://')):
|
| + if not href.startswith('/'):
|
| + logging.warn('Paths in sidenav must be qualified. %s is not.' % href)
|
| + href = '/' + href
|
| + item['href'] = href
|
| +
|
| +
|
| +def _CreateSidenavDict(_, content):
|
| + items = Parse(content)
|
| + # Start at level 2, the top <ul> element is level 1.
|
| + _AddLevels(items, level=2)
|
| + _QualifyHrefs(items)
|
| + return items
|
| +
|
| +
|
| +class SidenavDataSource(DataSource):
|
| + '''Provides templates with access to JSON files used to create the side
|
| + navigation bar.
|
| + '''
|
| + def __init__(self, server_instance, request):
|
| + self._cache = server_instance.compiled_host_fs_factory.Create(
|
| + _CreateSidenavDict, SidenavDataSource)
|
| + self._json_path = server_instance.sidenav_json_base_path
|
| + self._request = request
|
| +
|
| + def Cron(self):
|
| + for platform in ['apps', 'extensions']:
|
| + self._cache.GetFromFile(
|
| + '%s/%s_sidenav.json' % (self._json_path, platform))
|
|
|
| def get(self, key):
|
| sidenav = copy.deepcopy(self._cache.GetFromFile(
|
| '%s/%s_sidenav.json' % (self._json_path, key)))
|
| - self._AddSelected(sidenav)
|
| - self._QualifyHrefs(sidenav)
|
| + _AddSelected(sidenav, self._request.path)
|
| return sidenav
|
|
|