| # 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. |
| |
| import os |
| |
| from compiled_file_system import Unicode |
| from data_source import DataSource |
| from docs_server_utils import FormatKey |
| from extensions_paths import INTROS_TEMPLATES, ARTICLES_TEMPLATES |
| from file_system import FileNotFoundError |
| from future import Future |
| from third_party.handlebar import Handlebar |
| |
| |
| |
| # TODO(kalman): rename this HTMLDataSource or other, then have separate intro |
| # article data sources created as instances of it. |
| class IntroDataSource(DataSource): |
| '''This class fetches the intros for a given API. From this intro, a table |
| of contents dictionary is created, which contains the headings in the intro. |
| ''' |
| |
| def __init__(self, server_instance, request): |
| self._request = request |
| self._cache = server_instance.compiled_fs_factory.Create( |
| server_instance.host_file_system_provider.GetTrunk(), |
| self._MakeIntro, |
| IntroDataSource) |
| self._ref_resolver = server_instance.ref_resolver_factory.Create() |
| |
| @Unicode |
| def _MakeIntro(self, intro_path, intro): |
| # Guess the name of the API from the path to the intro. |
| api_name = os.path.splitext(intro_path.split('/')[-1])[0] |
| return Handlebar( |
| self._ref_resolver.ResolveAllLinks(intro, |
| relative_to=self._request.path, |
| namespace=api_name), |
| name=intro_path) |
| |
| def get(self, key): |
| path = FormatKey(key) |
| def get_from_base_path(base_path): |
| return self._cache.GetFromFile('%s/%s' % (base_path, path)).Get() |
| base_paths = (INTROS_TEMPLATES, ARTICLES_TEMPLATES) |
| for base_path in base_paths: |
| try: |
| return get_from_base_path(base_path) |
| except FileNotFoundError: |
| continue |
| # Not found. Do the first operation again so that we get a stack trace - we |
| # know that it'll fail. |
| get_from_base_path(base_paths[0]) |
| raise AssertionError() |
| |
| def Cron(self): |
| # TODO(kalman): Walk through the intros and articles directory. |
| return Future(value=()) |