| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852 |
- import unittest
- import os
- import sys
- from unittest import mock
- from tempfile import TemporaryDirectory
- from mkdocs.structure.pages import Page
- from mkdocs.structure.files import File, Files
- from mkdocs.tests.base import load_config, dedent
- class PageTests(unittest.TestCase):
- DOCS_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../integration/subpages/docs')
- def test_homepage(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- self.assertIsNone(fl.page)
- pg = Page('Foo', fl, cfg)
- self.assertEqual(fl.page, pg)
- self.assertEqual(pg.url, '')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertTrue(pg.is_homepage)
- self.assertTrue(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_nested_index_page(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('sub1/index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- pg.parent = 'foo'
- self.assertEqual(pg.url, 'sub1/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertTrue(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertFalse(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, 'foo')
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_nested_index_page_no_parent(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('sub1/index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- pg.parent = None # non-homepage at nav root level; see #1919.
- self.assertEqual(pg.url, 'sub1/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertTrue(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_nested_index_page_no_parent_no_directory_urls(self):
- cfg = load_config(docs_dir=self.DOCS_DIR, use_directory_urls=False)
- fl = File('sub1/index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- pg.parent = None # non-homepage at nav root level; see #1919.
- self.assertEqual(pg.url, 'sub1/index.html')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertTrue(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_nested_nonindex_page(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('sub1/non-index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- pg.parent = 'foo'
- self.assertEqual(pg.url, 'sub1/non-index/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertFalse(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, 'foo')
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_page_defaults(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertRegex(pg.update_date, r'\d{4}-\d{2}-\d{2}')
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_page_no_directory_url(self):
- cfg = load_config(use_directory_urls=False)
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'testing.html')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_page_canonical_url(self):
- cfg = load_config(site_url='http://example.com')
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, '/testing/')
- self.assertEqual(pg.canonical_url, 'http://example.com/testing/')
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_page_canonical_url_nested(self):
- cfg = load_config(site_url='http://example.com/foo/')
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, '/foo/testing/')
- self.assertEqual(pg.canonical_url, 'http://example.com/foo/testing/')
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_page_canonical_url_nested_no_slash(self):
- cfg = load_config(site_url='http://example.com/foo')
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, '/foo/testing/')
- self.assertEqual(pg.canonical_url, 'http://example.com/foo/testing/')
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertEqual(pg.markdown, None)
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Foo')
- self.assertEqual(pg.toc, [])
- def test_predefined_page_title(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Page Title', fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('# Welcome to MkDocs\n'))
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Page Title')
- self.assertEqual(pg.toc, [])
- def test_page_title_from_markdown(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('# Welcome to MkDocs\n'))
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Welcome to MkDocs')
- self.assertEqual(pg.toc, [])
- def test_page_title_from_meta(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('metadata.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, 'metadata/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('# Welcome to MkDocs\n'))
- self.assertEqual(pg.meta, {'title': 'A Page Title'})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'A Page Title')
- self.assertEqual(pg.toc, [])
- def test_page_title_from_filename(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('page-title.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, 'page-title/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('Page content.\n'))
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Page title')
- self.assertEqual(pg.toc, [])
- def test_page_title_from_capitalized_filename(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('pageTitle.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, 'pageTitle/')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertFalse(pg.is_homepage)
- self.assertFalse(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('Page content.\n'))
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'pageTitle')
- self.assertEqual(pg.toc, [])
- def test_page_title_from_homepage_filename(self):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fl = File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.url, '')
- self.assertEqual(pg.abs_url, None)
- self.assertEqual(pg.canonical_url, None)
- self.assertEqual(pg.edit_url, None)
- self.assertEqual(pg.file, fl)
- self.assertEqual(pg.content, None)
- self.assertTrue(pg.is_homepage)
- self.assertTrue(pg.is_index)
- self.assertTrue(pg.is_page)
- self.assertFalse(pg.is_section)
- self.assertTrue(pg.is_top_level)
- self.assertTrue(pg.markdown.startswith('## Test'))
- self.assertEqual(pg.meta, {})
- self.assertEqual(pg.next_page, None)
- self.assertEqual(pg.parent, None)
- self.assertEqual(pg.previous_page, None)
- self.assertEqual(pg.title, 'Home')
- self.assertEqual(pg.toc, [])
- def test_page_eq(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertTrue(pg == Page('Foo', fl, cfg))
- def test_page_ne(self):
- cfg = load_config()
- f1 = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- f2 = File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', f1, cfg)
- # Different Title
- self.assertTrue(pg != Page('Bar', f1, cfg))
- # Different File
- self.assertTrue(pg != Page('Foo', f2, cfg))
- def test_BOM(self):
- md_src = '# An UTF-8 encoded file with a BOM'
- with TemporaryDirectory() as docs_dir:
- # We don't use mkdocs.tests.base.tempdir decorator here due to uniqueness of this test.
- cfg = load_config(docs_dir=docs_dir)
- fl = File('index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page(None, fl, cfg)
- # Create an UTF-8 Encoded file with BOM (as Micorsoft editors do). See #1186
- with open(fl.abs_src_path, 'w', encoding='utf-8-sig') as f:
- f.write(md_src)
- # Now read the file.
- pg.read_source(cfg)
- # Ensure the BOM (`\ufeff`) is removed
- self.assertNotIn('\ufeff', pg.markdown)
- self.assertEqual(pg.markdown, md_src)
- self.assertEqual(pg.meta, {})
- def test_page_edit_url(self):
- configs = [
- {
- 'repo_url': 'http://github.com/mkdocs/mkdocs'
- },
- {
- 'repo_url': 'https://github.com/mkdocs/mkdocs/'
- }, {
- 'repo_url': 'http://example.com'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': 'edit/master'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '?query=edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '?query=edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '#edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '#edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '' # Set to blank value
- }, {
- # Nothing defined
- }
- ]
- expected = [
- 'http://github.com/mkdocs/mkdocs/edit/master/docs/testing.md',
- 'https://github.com/mkdocs/mkdocs/edit/master/docs/testing.md',
- None,
- 'http://example.com/edit/master/testing.md',
- 'http://example.com/edit/master/testing.md',
- 'http://example.com/edit/master/testing.md',
- 'http://example.com/edit/master/testing.md',
- 'http://example.com/edit/master/testing.md',
- 'http://example.com/foo/edit/master/testing.md',
- 'http://example.com/foo/edit/master/testing.md',
- 'http://example.com?query=edit/master/testing.md',
- 'http://example.com/?query=edit/master/testing.md',
- 'http://example.com#edit/master/testing.md',
- 'http://example.com/#edit/master/testing.md',
- None,
- None
- ]
- for i, c in enumerate(configs):
- cfg = load_config(**c)
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'testing/')
- self.assertEqual(pg.edit_url, expected[i])
- def test_nested_page_edit_url(self):
- configs = [
- {
- 'repo_url': 'http://github.com/mkdocs/mkdocs'
- },
- {
- 'repo_url': 'https://github.com/mkdocs/mkdocs/'
- }, {
- 'repo_url': 'http://example.com'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': 'edit/master'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '?query=edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '?query=edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '#edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '#edit/master/'
- }
- ]
- expected = [
- 'http://github.com/mkdocs/mkdocs/edit/master/docs/sub1/non-index.md',
- 'https://github.com/mkdocs/mkdocs/edit/master/docs/sub1/non-index.md',
- None,
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/foo/edit/master/sub1/non-index.md',
- 'http://example.com/foo/edit/master/sub1/non-index.md',
- 'http://example.com?query=edit/master/sub1/non-index.md',
- 'http://example.com/?query=edit/master/sub1/non-index.md',
- 'http://example.com#edit/master/sub1/non-index.md',
- 'http://example.com/#edit/master/sub1/non-index.md'
- ]
- for i, c in enumerate(configs):
- c['docs_dir'] = self.DOCS_DIR
- cfg = load_config(**c)
- fl = File('sub1/non-index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'sub1/non-index/')
- self.assertEqual(pg.edit_url, expected[i])
- @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
- def test_nested_page_edit_url_windows(self):
- configs = [
- {
- 'repo_url': 'http://github.com/mkdocs/mkdocs'
- },
- {
- 'repo_url': 'https://github.com/mkdocs/mkdocs/'
- }, {
- 'repo_url': 'http://example.com'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': 'edit/master'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': '/edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': '/edit/master'
- }, {
- 'repo_url': 'http://example.com/foo/',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com/foo',
- 'edit_uri': 'edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '?query=edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '?query=edit/master/'
- }, {
- 'repo_url': 'http://example.com',
- 'edit_uri': '#edit/master'
- }, {
- 'repo_url': 'http://example.com/',
- 'edit_uri': '#edit/master/'
- }
- ]
- expected = [
- 'http://github.com/mkdocs/mkdocs/edit/master/docs/sub1/non-index.md',
- 'https://github.com/mkdocs/mkdocs/edit/master/docs/sub1/non-index.md',
- None,
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/edit/master/sub1/non-index.md',
- 'http://example.com/foo/edit/master/sub1/non-index.md',
- 'http://example.com/foo/edit/master/sub1/non-index.md',
- 'http://example.com?query=edit/master/sub1/non-index.md',
- 'http://example.com/?query=edit/master/sub1/non-index.md',
- 'http://example.com#edit/master/sub1/non-index.md',
- 'http://example.com/#edit/master/sub1/non-index.md'
- ]
- for i, c in enumerate(configs):
- c['docs_dir'] = self.DOCS_DIR
- cfg = load_config(**c)
- fl = File('sub1\\non-index.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.url, 'sub1/non-index/')
- self.assertEqual(pg.edit_url, expected[i])
- def test_page_render(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- pg.read_source(cfg)
- self.assertEqual(pg.content, None)
- self.assertEqual(pg.toc, [])
- pg.render(cfg, [fl])
- self.assertTrue(pg.content.startswith(
- '<h1 id="welcome-to-mkdocs">Welcome to MkDocs</h1>\n'
- ))
- self.assertEqual(str(pg.toc).strip(), dedent("""
- Welcome to MkDocs - #welcome-to-mkdocs
- Commands - #commands
- Project layout - #project-layout
- """))
- def test_missing_page(self):
- cfg = load_config()
- fl = File('missing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertRaises(OSError, pg.read_source, cfg)
- class SourceDateEpochTests(unittest.TestCase):
- def setUp(self):
- self.default = os.environ.get('SOURCE_DATE_EPOCH', None)
- os.environ['SOURCE_DATE_EPOCH'] = '0'
- def test_source_date_epoch(self):
- cfg = load_config()
- fl = File('testing.md', cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls'])
- pg = Page('Foo', fl, cfg)
- self.assertEqual(pg.update_date, '1970-01-01')
- def tearDown(self):
- if self.default is not None:
- os.environ['SOURCE_DATE_EPOCH'] = self.default
- else:
- del os.environ['SOURCE_DATE_EPOCH']
- class RelativePathExtensionTests(unittest.TestCase):
- DOCS_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../integration/subpages/docs')
- def get_rendered_result(self, files):
- cfg = load_config(docs_dir=self.DOCS_DIR)
- fs = []
- for f in files:
- fs.append(File(f.replace('/', os.sep), cfg['docs_dir'], cfg['site_dir'], cfg['use_directory_urls']))
- pg = Page('Foo', fs[0], cfg)
- pg.read_source(cfg)
- pg.render(cfg, Files(fs))
- return pg.content
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](non-index.md)'))
- def test_relative_html_link(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'non-index.md']),
- '<p><a href="non-index/">link</a></p>' # No trailing /
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](index.md)'))
- def test_relative_html_link_index(self):
- self.assertEqual(
- self.get_rendered_result(['non-index.md', 'index.md']),
- '<p><a href="..">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](sub2/index.md)'))
- def test_relative_html_link_sub_index(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'sub2/index.md']),
- '<p><a href="sub2/">link</a></p>' # No trailing /
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](sub2/non-index.md)'))
- def test_relative_html_link_sub_page(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'sub2/non-index.md']),
- '<p><a href="sub2/non-index/">link</a></p>' # No trailing /
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](file%20name.md)'))
- def test_relative_html_link_with_encoded_space(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'file name.md']),
- '<p><a href="file%20name/">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](file name.md)'))
- def test_relative_html_link_with_unencoded_space(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'file name.md']),
- '<p><a href="file%20name/">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](../index.md)'))
- def test_relative_html_link_parent_index(self):
- self.assertEqual(
- self.get_rendered_result(['sub2/non-index.md', 'index.md']),
- '<p><a href="../..">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](non-index.md#hash)'))
- def test_relative_html_link_hash(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'non-index.md']),
- '<p><a href="non-index/#hash">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](sub2/index.md#hash)'))
- def test_relative_html_link_sub_index_hash(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'sub2/index.md']),
- '<p><a href="sub2/#hash">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](sub2/non-index.md#hash)'))
- def test_relative_html_link_sub_page_hash(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'sub2/non-index.md']),
- '<p><a href="sub2/non-index/#hash">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](#hash)'))
- def test_relative_html_link_hash_only(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><a href="#hash">link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data=''))
- def test_relative_image_link_from_homepage(self):
- self.assertEqual(
- self.get_rendered_result(['index.md', 'image.png']),
- '<p><img alt="image" src="image.png" /></p>' # no opening ./
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data=''))
- def test_relative_image_link_from_subpage(self):
- self.assertEqual(
- self.get_rendered_result(['sub2/non-index.md', 'image.png']),
- '<p><img alt="image" src="../../image.png" /></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data=''))
- def test_relative_image_link_from_sibling(self):
- self.assertEqual(
- self.get_rendered_result(['non-index.md', 'image.png']),
- '<p><img alt="image" src="../image.png" /></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='*__not__ a link*.'))
- def test_no_links(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><em><strong>not</strong> a link</em>.</p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[link](non-existant.md)'))
- def test_bad_relative_html_link(self):
- with self.assertLogs('mkdocs', level='WARNING') as cm:
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><a href="non-existant.md">link</a></p>'
- )
- self.assertEqual(
- cm.output,
- ["WARNING:mkdocs.structure.pages:Documentation file 'index.md' contains a link "
- "to 'non-existant.md' which is not found in the documentation files."]
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[external](http://example.com/index.md)'))
- def test_external_link(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><a href="http://example.com/index.md">external</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[absolute link](/path/to/file.md)'))
- def test_absolute_link(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><a href="/path/to/file.md">absolute link</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='[absolute local path](\\image.png)'))
- def test_absolute_win_local_path(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- '<p><a href="\\image.png">absolute local path</a></p>'
- )
- @mock.patch('mkdocs.structure.pages.open', mock.mock_open(read_data='<mail@example.com>'))
- def test_email_link(self):
- self.assertEqual(
- self.get_rendered_result(['index.md']),
- # Markdown's default behavior is to obscure email addresses by entity-encoding them.
- # The following is equivalent to: '<p><a href="mailto:mail@example.com">mail@example.com</a></p>'
- '<p><a href="mailto:mail@e'
- 'xample.com">mail@'
- 'example.com</a></p>'
- )
|