From 0ff98aa982348e6c8a2fa7bbdacd903ea5229a83 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Sat, 25 Jan 2014 15:37:37 +0000 Subject: [PATCH] Use relative URLs everywhere and remove 'base_url' setting --- mkdocs/build.py | 4 ++-- mkdocs/config.py | 6 ------ mkdocs/nav.py | 40 ++++++++++++++++++++++++++++++---------- mkdocs/serve.py | 1 - mkdocs/test.py | 16 ++++++++-------- mkdocs/utils.py | 12 +++++------- 6 files changed, 45 insertions(+), 34 deletions(-) diff --git a/mkdocs/build.py b/mkdocs/build.py index 19c978e8..04af9978 100644 --- a/mkdocs/build.py +++ b/mkdocs/build.py @@ -44,7 +44,7 @@ def build_pages(config): """ Builds all the pages and writes them into the build directory. """ - site_navigation = nav.SiteNavigation(config['pages'], config['base_url'] + '/') + site_navigation = nav.SiteNavigation(config['pages']) loader = jinja2.FileSystemLoader(config['theme_dir']) env = jinja2.Environment(loader=loader) @@ -71,7 +71,7 @@ def build_pages(config): 'config': config, 'url': page.url, - 'base_url': config['base_url'], + 'base_url': site_navigation.url_context.make_relative('/'), 'homepage_url': site_navigation.homepage.url, 'previous_url': page.previous_page and page.previous_page.url, 'next_url': page.next_page and page.next_page.url, diff --git a/mkdocs/config.py b/mkdocs/config.py index 6d87cddb..97b47722 100644 --- a/mkdocs/config.py +++ b/mkdocs/config.py @@ -7,7 +7,6 @@ import yaml DEFAULT_CONFIG = { 'project_name': None, 'pages': None, - 'base_url': '', 'theme': 'bootstrap', @@ -36,9 +35,4 @@ def load_config(filename='mkdocs.yaml', options=None): package_dir = os.path.dirname(__file__) config['theme_dir'] = os.path.join(package_dir, 'themes', config['theme']) - if config['local_files']: - build_dir = os.path.join(os.getcwd(), config['build_dir']) - build_path = build_dir.replace(os.path.pathsep, '/') - config['base_url'] = 'file://%s' % build_path - return config diff --git a/mkdocs/nav.py b/mkdocs/nav.py index 50a5bae1..847334aa 100644 --- a/mkdocs/nav.py +++ b/mkdocs/nav.py @@ -7,12 +7,14 @@ This consists of building a set of interlinked page and header objects. """ from mkdocs import utils +import posixpath class SiteNavigation(object): - def __init__(self, pages_config, base_url='', local_file_urls=False): + def __init__(self, pages_config, local_file_urls=False): + self.url_context = URLContext() self.nav_items, self.pages = \ - _generate_site_navigation(pages_config, base_url, local_file_urls) + _generate_site_navigation(pages_config, self.url_context, local_file_urls) self.homepage = self.pages[0] if self.pages else None def __str__(self): @@ -31,20 +33,34 @@ class SiteNavigation(object): """ page = self.homepage page.set_active() + self.url_context.set_current_url(page.abs_url) yield page while page.next_page: page.set_active(False) page = page.next_page page.set_active() + self.url_context.set_current_url(page.abs_url) yield page page.set_active(False) +class URLContext(object): + def __init__(self): + self.base_path = '/' + + def set_current_url(self, current_url): + self.base_path = posixpath.dirname(current_url) + + def make_relative(self, url): + return posixpath.relpath(url, start=self.base_path) + + class Page(object): - def __init__(self, title, url, path): + def __init__(self, title, url, path, url_context): self.title = title - self.url = url + self.abs_url = url self.active = False + self.url_context = url_context # Relative paths to the input markdown file and output html file. self.input_path = path @@ -55,13 +71,17 @@ class Page(object): self.next_page = None self.ancestors = [] + @property + def url(self): + return self.url_context.make_relative(self.abs_url) + def __str__(self): return self._indent_print() def _indent_print(self, depth=0): indent = ' ' * depth active_marker = ' [*]' if self.active else '' - return '%s%s - %s%s\n' % (indent, self.title, self.url, active_marker) + return '%s%s - %s%s\n' % (indent, self.title, self.abs_url, active_marker) def set_active(self, active=True): self.active = active @@ -86,7 +106,7 @@ class Header(object): return ret -def _generate_site_navigation(pages_config, base_url='', local_file_urls=False): +def _generate_site_navigation(pages_config, url_context, local_file_urls=False): """ Returns a list of Page and Header instances that represent the top level site navigation. @@ -96,23 +116,23 @@ def _generate_site_navigation(pages_config, base_url='', local_file_urls=False): previous = None for path, title in pages_config: - url = utils.get_url_path(path, base_url, local_file_urls) + url = utils.get_url_path(path, local_file_urls) title, sep, child_title = title.partition('/') title = title.strip() child_title = child_title.strip() if not child_title: # New top level page. - page = Page(title=title, url=url, path=path) + page = Page(title=title, url=url, path=path, url_context=url_context) nav_items.append(page) elif not nav_items or (nav_items[-1].title != title): # New second level page. - page = Page(title=child_title, url=url, path=path) + page = Page(title=child_title, url=url, path=path, url_context=url_context) header = Header(title=title, children=[page]) nav_items.append(header) page.ancestors = [header] else: # Additional second level page. - page = Page(title=child_title, url=url, path=path) + page = Page(title=child_title, url=url, path=path, url_context=url_context) header = nav_items[-1] header.children.append(page) page.ancestors = [header] diff --git a/mkdocs/serve.py b/mkdocs/serve.py index 6e1670a8..005ddfa1 100644 --- a/mkdocs/serve.py +++ b/mkdocs/serve.py @@ -73,7 +73,6 @@ def serve(config, options=None): # Create a temporary build directory, and set some options to serve it tempdir = tempfile.mkdtemp() options['build_dir'] = tempdir - options['base_url'] = 'http://%s' % config['dev_addr'] # Perform the initial build config = load_config(options=options) diff --git a/mkdocs/test.py b/mkdocs/test.py index 9bb24aa2..966ee8de 100755 --- a/mkdocs/test.py +++ b/mkdocs/test.py @@ -25,10 +25,10 @@ class UtilsTests(unittest.TestCase): def test_url_path(self): expected_results = { - 'index.md': '', - 'api-guide.md': 'api-guide/', - 'api-guide/index.md': 'api-guide/', - 'api-guide/testing.md': 'api-guide/testing/', + 'index.md': '/', + 'api-guide.md': '/api-guide/', + 'api-guide/index.md': '/api-guide/', + 'api-guide/testing.md': '/api-guide/testing/', } for file_path, expected_html_path in expected_results.items(): html_path = utils.get_url_path(file_path) @@ -136,7 +136,7 @@ class SiteNavigationTests(unittest.TestCase): Home - / About - /about/ """) - site_navigation = nav.SiteNavigation(pages, base_url='/') + site_navigation = nav.SiteNavigation(pages) self.assertEqual(str(site_navigation).strip(), expected) self.assertEqual(len(site_navigation.nav_items), 2) self.assertEqual(len(site_navigation.pages), 2) @@ -160,7 +160,7 @@ class SiteNavigationTests(unittest.TestCase): Release notes - /about/release-notes/ License - /about/license/ """) - site_navigation = nav.SiteNavigation(pages, base_url='/') + site_navigation = nav.SiteNavigation(pages) self.assertEqual(str(site_navigation).strip(), expected) self.assertEqual(len(site_navigation.nav_items), 3) self.assertEqual(len(site_navigation.pages), 6) @@ -180,7 +180,7 @@ class SiteNavigationTests(unittest.TestCase): About - /about/ [*] """) ] - site_navigation = nav.SiteNavigation(pages, base_url='/') + site_navigation = nav.SiteNavigation(pages) for index, page in enumerate(site_navigation.walk_pages()): self.assertEqual(str(site_navigation).strip(), expected[index]) @@ -255,7 +255,7 @@ class SiteNavigationTests(unittest.TestCase): License - /about/license/ [*] """) ] - site_navigation = nav.SiteNavigation(pages, base_url='/') + site_navigation = nav.SiteNavigation(pages) for index, page in enumerate(site_navigation.walk_pages()): self.assertEqual(str(site_navigation).strip(), expected[index]) diff --git a/mkdocs/utils.py b/mkdocs/utils.py index c997d7ae..b6515e54 100644 --- a/mkdocs/utils.py +++ b/mkdocs/utils.py @@ -60,21 +60,19 @@ def get_html_path(path): return os.path.join(path, 'index.html') -def get_url_path(path, base_url='', local_file_urls=False): +def get_url_path(path, local_file_urls=False): """ Map a source file path to an output html path. - Paths like 'index.md' will be converted to '' - Paths like 'about.md' will be converted to 'about/' - Paths like 'api-guide/core.md' will be converted to 'api-guide/core/' - - If `base_url` is set, it will be prepended to the return result. + Paths like 'index.md' will be converted to '/' + Paths like 'about.md' will be converted to '/about/' + Paths like 'api-guide/core.md' will be converted to '/api-guide/core/' If `local_file_urls` is `True`, returned URLs will include the a trailing `index.html` rather than just returning the directory path. """ path = get_html_path(path) - url = base_url + path.replace(os.path.pathsep, '/') + url = '/' + path.replace(os.path.pathsep, '/') if not local_file_urls: return url[:-len('index.html')] return url