+++ /dev/null
-..
- This file is part of m.css.
-
- Copyright © 2017 Vladimír Vondruš <mosra@centrum.cz>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-..
-
-Test
-####
-
-:save_as: pelican/theme/test/index.html
-:breadcrumb: {filename}/pelican.rst Pelican
- {filename}/pelican/theme.rst Theme
-:css: {filename}/static/dummy.css
- {filename}/static/dummy.css
-:summary: um
-:highlight: pelican/theme
-:header:
- .. note-warning::
-
- This is a page header with an `internal link <{filename}/pelican.rst>`_.
- This shouldn't be wrapped in a ``<p>``.
-:footer:
- .. note-danger::
-
- This is a page footer with an `internal link <{filename}/pelican.rst>`_.
- This shouldn't be wrapped in a ``<p>``.
-
-This page should have a breadcrumb, summary in a meta tag, header and a footer
-and also two additional links to ``/static/dummy.css``. It should also
-highlight the Pelican Theme menu item in the top navbar.
}
MinimalTestCase.run_pelican(self, {**implicit_settings, **settings})
+class PageTestCase(BaseTestCase):
+ def run_pelican(self, settings):
+ implicit_settings = {
+ 'M_FINE_PRINT': None,
+ 'PAGE_PATHS': ['.'],
+ 'PAGE_SAVE_AS': '{slug}.html',
+ 'PAGE_URL': '{slug}.html',
+ 'ARTICLE_PATHS': ['articles'], # doesn't exist
+ 'DIRECT_TEMPLATES': []
+ }
+ BaseTestCase.run_pelican(self, {**implicit_settings, **settings})
+
class BlogTestCase(BaseTestCase):
def run_pelican(self, settings):
implicit_settings = {
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta name="description" content="Page description for the fake SEO believers." />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta property="og:description" content="Page description for the social people." />
+ <meta name="twitter:description" content="Page description for the social people." />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>A page</h1>
+<!-- content -->
+<p>Page content for those who actually read.</p>
+<!-- /content -->
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+A page
+######
+
+:description: Page description for the fake SEO believers.
+:summary: Page description for the social people.
+
+Page content for those who actually read.
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Index page » A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>
+ <span class="m-breadcrumb">
+ <a href="./index.html">Index page</a> »
+ </span>
+ A page
+ </h1>
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
--- /dev/null
+A page
+######
+
+:breadcrumb:
+ {index} Index page
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Index page » A page » Subpage | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="Subpage" />
+ <meta name="twitter:title" content="Subpage" />
+ <meta property="og:url" content="subpage.html" />
+ <meta name="twitter:url" content="subpage.html" />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>
+ <span class="m-breadcrumb">
+ <a href="./index.html">Index page</a> »
+ <a href="./page.html">A page</a> »
+ </span>
+ Subpage
+ </h1>
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
--- /dev/null
+Subpage
+#######
+
+:breadcrumb:
+ {index} Index page
+ {filename}/page.rst A page
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <link rel="stylesheet" href="static/m-debug.css" />
+ <link rel="stylesheet" href="static/m-grid.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>A page</h1>
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
--- /dev/null
+A page
+######
+
+:css: static/m-debug.css
+ static/m-grid.css
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta property="og:description" content="Page content." />
+ <meta name="twitter:description" content="Page content." />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1 m-nopadb">
+<!-- header -->
+<p>Page header. With multiple lines.
+Linking to <a href="./page.html">self</a>.</p>
+<!-- /header -->
+ </div>
+ </div>
+</div>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>A page</h1>
+<!-- content -->
+<p>Page content.</p>
+<!-- /content -->
+ </div>
+ </div>
+ </div>
+</article>
+<div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1 m-nopadt">
+<!-- footer -->
+<p>Page footer. Linking to <a href="./page.html">self</a>.</p>
+<!-- /footer -->
+ </div>
+ </div>
+</div>
+</main>
+</body>
+</html>
--- /dev/null
+A page
+######
+
+:header: Page header. With multiple lines.
+ Linking to `self <{filename}/page.rst>`_.
+:footer: Page footer. Linking to `self <{filename}/page.rst>`_.
+
+Page content.
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="hide-navbar-brand.html" />
+ <meta name="twitter:url" content="hide-navbar-brand.html" />
+ <meta property="og:description" content="Page text." />
+ <meta name="twitter:description" content="Page text." />
+ <meta property="og:image" content="./ship.jpg" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:image" content="./ship.jpg" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation" class="m-navbar-landing">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m m-navbar-brand-hidden">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div id="m-landing-image" style="background-image: url('./ship.jpg');">
+ <div id="m-landing-cover">
+ <div class="m-container">
+<!-- landing -->
+<div class="m-row">
+<div class="m-col-m-6 m-push-m-3">
+Landing text.</div>
+</div>
+<!-- /landing -->
+ </div>
+ </div>
+ </div>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+<!-- content -->
+<p>Page text.</p>
+<!-- /content -->
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
--- /dev/null
+A page
+######
+
+:cover: {filename}/ship.jpg
+:hide_navbar_brand: True
+:landing:
+ .. container:: m-row
+
+ .. container:: m-col-m-6 m-push-m-3
+
+ Landing text.
+
+Page text.
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page title that displays only in title | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page title that displays only in title" />
+ <meta name="twitter:title" content="A page title that displays only in title" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta property="og:description" content="Some page text." />
+ <meta name="twitter:description" content="Some page text." />
+ <meta property="og:image" content="./ship.jpg" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:image" content="./ship.jpg" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation" class="m-navbar-landing">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div id="m-landing-image" style="background-image: url('./ship.jpg');">
+ <div id="m-landing-cover">
+ <div class="m-container">
+<!-- landing -->
+<div class="m-row">
+<div class="m-col-l-6 m-push-l-1 m-col-m-7 m-nopadb">
+<h1>A page title that displays on page</h1><p>Some text. Linking <a href="./page.html">to self</a>.</p>
+</div>
+</div>
+<!-- /landing -->
+ </div>
+ </div>
+ </div>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+<!-- content -->
+<p>Some page text.</p>
+<!-- /content -->
+ </div>
+ </div>
+ </div>
+</article>
+<div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1 m-nopadt">
+<!-- footer -->
+This is visible on the bottom.
+<!-- /footer -->
+ </div>
+ </div>
+</div>
+</main>
+</body>
+</html>
--- /dev/null
+A page title that displays only in title
+########################################
+
+:cover: {filename}/ship.jpg
+:header: This shouldn't be visible anywhere.
+:footer: This is visible on the bottom.
+:landing:
+ .. container:: m-row
+
+ .. container:: m-col-l-6 m-push-l-1 m-col-m-7 m-nopadb
+
+ .. raw:: html
+
+ <h1>A page title that displays on page</h1>
+
+ Some text. Linking `to self <{filename}/page.rst>`_.
+
+Some page text.
--- /dev/null
+../../../doc/static/ship.jpg
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>A page | A Pelican Blog</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="A page" />
+ <meta name="twitter:title" content="A page" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">A Pelican Blog</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>A page</h1>
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+A page
+######
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <title>Site name</title>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,400i,600%7CSource+Sans+Pro:400,400i,600,600i" />
+ <link rel="stylesheet" href="static/m-dark.css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta property="og:title" content="Site name" />
+ <meta name="twitter:title" content="Site name" />
+ <meta property="og:url" content="page.html" />
+ <meta name="twitter:url" content="page.html" />
+ <meta name="twitter:card" content="summary" />
+ <meta property="og:type" content="website" />
+</head>
+<body>
+<header><nav id="navigation">
+ <div class="m-container">
+ <div class="m-row">
+ <a href="./" id="m-navbar-brand" class="m-col-t-9 m-col-m-none m-left-m">Site name</a>
+ </div>
+ </div>
+</nav></header>
+<main>
+<article>
+ <div class="m-container m-container-inflatable">
+ <div class="m-row">
+ <div class="m-col-l-10 m-push-l-1">
+ <h1>Site name</h1>
+ </div>
+ </div>
+ </div>
+</article>
+</main>
+</body>
+</html>
--- /dev/null
+Site name
+#########
--- /dev/null
+from test import PageTestCase
+
+class Page(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, '', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({
+ 'FORMATTED_FIELDS': ['summary', 'description']
+ })
+
+ # The content and summary meta tag shouldn't be there at all
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+
+class Minimal(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'minimal', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({})
+
+ # The content and summary meta tag shouldn't be there at all
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+
+class Breadcrumb(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'breadcrumb', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({})
+
+ # Internal links should work and guide the user from one page to
+ # another
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+ self.assertEqual(*self.actual_expected_contents('subpage.html'))
+
+class ExtraCss(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'extra_css', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({})
+
+ # The page should contain two extra CSS links
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+
+class HeaderFooter(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'header_footer', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({
+ 'FORMATTED_FIELDS': ['header', 'footer']
+ })
+
+ # The header and footer should have the links expanded
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+
+class Landing(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'landing', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({
+ 'STATIC_PATHS': ['ship.jpg'],
+ 'FORMATTED_FIELDS': ['landing']
+ })
+
+ # The landing field should have the links expanded, header should not
+ # be shown, footer should be. Navbar brand should be hidden in the
+ # second case.
+ self.assertEqual(*self.actual_expected_contents('page.html'))
+ self.assertEqual(*self.actual_expected_contents('hide-navbar-brand.html'))
+
+class TitleSitenameAlias(PageTestCase):
+ def __init__(self, *args, **kwargs):
+ super().__init__(__file__, 'title_sitename_alias', *args, **kwargs)
+
+ def test(self):
+ self.run_pelican({
+ 'SITENAME': "Site name"
+ })
+
+ # The page title should be just one name, not both
+ self.assertEqual(*self.actual_expected_contents('page.html'))