diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2c8066c68..a984354e1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -81,7 +81,9 @@ jobs:
- run: |
pip install -r requirements.txt
pip install .
- pip install mkdocs-minify-plugin>=0.2
+ pip install \
+ mkdocs-minify-plugin>=0.3 \
+ mkdocs-redirects>=1.0
# Build documentation
- env:
diff --git a/CHANGELOG b/CHANGELOG
index 25eb708ec..cafad008b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,7 +10,7 @@ mkdocs-material-5.3.3 (2020-06-24)
mkdocs-material-5.3.2 (2020-06-21)
- * Improved search type-ahead experience with non-Latin characters
+ * Improved search typeahead experience with non-Latin characters
* Fixed #1753: Japanese search doesn't work anymore
mkdocs-material-5.3.1 (2020-06-20)
diff --git a/MANIFEST.in b/MANIFEST.in
index 50ff2bbc9..7ac8c7116 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,6 @@
recursive-include material *.js *.css *.map *.html *.svg *.png *.yml
recursive-include material *.ttf *.woff *.woff2 LICENSE*
+recursive-exclude material/assets overrides*
recursive-exclude material/overrides *
recursive-exclude site *
recursive-exclude src *
diff --git a/docs/assets/creating-your-site.png b/docs/assets/creating-your-site.png
new file mode 100644
index 000000000..0243b6192
Binary files /dev/null and b/docs/assets/creating-your-site.png differ
diff --git a/docs/assets/screenshots/creating-your-site.png b/docs/assets/screenshots/creating-your-site.png
new file mode 100644
index 000000000..0243b6192
Binary files /dev/null and b/docs/assets/screenshots/creating-your-site.png differ
diff --git a/docs/releases/changelog.md b/docs/changelog.md
similarity index 99%
rename from docs/releases/changelog.md
rename to docs/changelog.md
index 3b23ace37..aa8bb8361 100644
--- a/docs/releases/changelog.md
+++ b/docs/changelog.md
@@ -2,21 +2,9 @@
template: overrides/main.html
---
-# Upgrading
+# Changelog
-To upgrade to the latest version:
-
-``` sh
-pip install --upgrade mkdocs-material
-```
-
-To inspect the currently installed version:
-
-``` sh
-pip show mkdocs-material
-```
-
-## Changelog
+## Release notes
### 5.4.0 _ June 29, 2020
@@ -30,7 +18,7 @@ pip show mkdocs-material
### 5.3.2 _ June 21, 2020
-* Improved search type-ahead experience with non-Latin characters
+* Improved search typeahead experience with non-Latin characters
* Fixed #1753: Japanese search doesn't work anymore
### 5.3.1 _ June 20, 2020
diff --git a/docs/contributing.md b/docs/contributing.md
deleted file mode 100644
index 89103b76b..000000000
--- a/docs/contributing.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-template: overrides/main.html
----
-
---8<-- "CONTRIBUTING.md"
diff --git a/docs/creating-your-site.md b/docs/creating-your-site.md
new file mode 100644
index 000000000..6c5a5c09e
--- /dev/null
+++ b/docs/creating-your-site.md
@@ -0,0 +1,140 @@
+---
+template: overrides/main.html
+---
+
+# Creating your site
+
+After you've [installed][1] Material for MkDocs, you can bootstrap your project
+documentation using the `mkdocs` executable. Go to the directory where you want
+your project to be located and enter:
+
+``` sh
+mkdocs new .
+```
+
+Alternatively, if you're running Material for MkDocs from within Docker, use:
+
+=== "Unix"
+
+ ```
+ docker run --rm -it -v ${PWD}:/docs squidfunk/mkdocs-material new .
+ ```
+
+=== "Windows"
+
+ ```
+ docker run --rm -it -v "%cd%":/docs squidfunk/mkdocs-material new .
+ ```
+
+This will create the following structure:
+
+```
+.
+├─ docs/
+│ └─ index.md
+└─ mkdocs.yml
+```
+
+ [1]: getting-started.md
+
+## Configuration
+
+### Minimal configuration
+
+Depending on your [installation method][2], you can now add the following lines
+to `mkdocs.yml` in your project root. If you installed Material for MkDocs using
+`pip` or `docker`, add:
+
+``` yaml
+theme:
+ name: material
+```
+
+If you cloned Material for MkDocs from GitHub, add:
+
+``` yaml
+theme:
+ name: null
+ custom_dir: mkdocs-material/material
+```
+
+### Advanced configuration
+
+Material for MkDocs comes with a lot of configuration options. The _guides_
+section explains in great detail how to configure and customize colors, fonts,
+icons and much more:
+
+* [Changing the colors][3]
+* [Changing the fonts][4]
+* [Changing the language][5]
+* [Changing the logo and icons][6]
+* [Setting up navigation][7]
+* [Setting up site search][8]
+* [Setting up site analytics][9]
+* [Adding social links][10]
+* [Adding a git repository][11]
+* [Adding a comment system][12]
+
+
+
+ [2]: getting-started.md#installation
+ [3]: setup/changing-the-colors.md
+ [4]: setup/changing-the-fonts.md
+ [5]: setup/changing-the-language.md
+ [6]: setup/changing-the-logo-and-icons.md
+ [7]: setup/setting-up-navigation.md
+ [8]: setup/setting-up-site-search.md
+ [9]: setup/setting-up-site-analytics.md
+ [10]: setup/adding-social-links.md
+ [11]: setup/adding-a-git-repository.md
+ [12]: setup/adding-a-comment-system.md
+
+
+
+## Previewing as you write
+
+MkDocs includes a live preview server, so you can preview your changes as you
+write your documentation. The server will automatically rebuild the site upon
+saving. Start it with:
+
+```
+mkdocs serve
+```
+
+If you're running Material for MkDocs from within Docker, use:
+
+=== "Unix"
+
+ ```
+ docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material
+ ```
+
+=== "Windows"
+
+ ```
+ docker run --rm -it -p 8000:8000 -v "%cd%":/docs squidfunk/mkdocs-material
+ ```
+
+Point your browser to [localhost:8000][15] and you should see:
+
+[![Creating your site][16]][15]
+
+ [15]: http://localhost:8000
+ [16]: assets/creating-your-site.png
+
+## Building your site
+
+When you're finished editing, you can build a static site from your Markdown
+files with:
+
+```
+mkdocs build
+```
+
+The contents of this directory make up your project documentation. There's no
+need for operating a database or server, as it is completely self-contained.
+The site can be hosted on [GitHub Pages][17], [GitLab Pages][18], a CDN of your
+choice or your private web space.
+
+ [17]: publishing-your-site.md#github-pages
+ [18]: publishing-your-site.md#gitlab-pages
diff --git a/docs/customization.md b/docs/customization.md
index ed94c444d..e74774733 100644
--- a/docs/customization.md
+++ b/docs/customization.md
@@ -4,8 +4,6 @@ template: overrides/main.html
# Customization
-## A great starting point
-
Project documentation is as diverse as the projects themselves and Material for
MkDocs is a good starting point for making it look great. However, as you write
your documentation, you may reach a point where some small adjustments are
@@ -13,9 +11,9 @@ necessary to preserve your brand's style.
## Adding assets
-[MkDocs][1] provides several ways to interfere with themes. In order to make a
-few tweaks to an existing theme, you can just add your stylesheets and
-JavaScript files to the `docs` directory.
+[MkDocs][1] provides several ways to customize a theme. In order to make a few
+tweaks to an existing theme, you can just add your stylesheets and JavaScript
+files to the `docs` directory.
[1]: https://www.mkdocs.org
@@ -23,58 +21,59 @@ JavaScript files to the `docs` directory.
If you want to tweak some colors or change the spacing of certain elements,
you can do this in a separate stylesheet. The easiest way is by creating a
-new stylesheet file in your `docs` directory:
+new stylesheet file in the `docs` directory:
``` sh
mkdir docs/stylesheets
touch docs/stylesheets/extra.css
```
-Then, add the following line to your `mkdocs.yml`:
+Then, add the following line to `mkdocs.yml`:
``` yaml
extra_css:
- stylesheets/extra.css
```
-Spin up the development server with `mkdocs serve` and start typing your
-changes in your additional stylesheet file – you can see them instantly after
-saving, as the MkDocs development server supports live reloading.
+Spin up the [live preview server][2] and start typing your changes in your
+additional stylesheet file – you should see them almost instantly after saving.
+
+ [2]: creating-your-site.md#previewing-as-you-write
### Additional JavaScript
The same is true for additional JavaScript. If you want to integrate another
syntax highlighter or add some custom logic to your theme, create a new
-JavaScript file in your `docs` directory:
+JavaScript file in the `docs` directory:
``` sh
mkdir docs/javascripts
touch docs/javascripts/extra.js
```
-Then, add the following line to your `mkdocs.yml`:
+Then, add the following line to `mkdocs.yml`:
``` yaml
extra_javascript:
- javascripts/extra.js
```
-Further assistance can be found in the [MkDocs documentation][2].
+Further assistance can be found in the [MkDocs documentation][3].
- [2]: https://www.mkdocs.org/user-guide/styling-your-docs/#customizing-a-theme
+ [3]: https://www.mkdocs.org/user-guide/styling-your-docs/#customizing-a-theme
## Extending the theme
If you want to alter the HTML source (e.g. add or remove some part), you can
-extend the theme. MkDocs supports [theme extension][3], an easy way to override
+extend the theme. MkDocs supports [theme extension][4], an easy way to override
parts of a theme without forking and changing the main theme.
- [3]: https://www.mkdocs.org/user-guide/styling-your-docs/#using-the-theme-custom_dir
+ [4]: https://www.mkdocs.org/user-guide/styling-your-docs/#using-the-theme-custom_dir
### Setup and theme structure
-Reference the Material theme as usual in your `mkdocs.yml`, and create a
-new folder for `overrides` which you reference using `custom_dir`:
+Reference the original theme as usual in `mkdocs.yml`, and create a new folder
+for `overrides` which you reference using `custom_dir`:
``` yaml
theme:
@@ -84,9 +83,9 @@ theme:
!!! warning "Theme extension prerequisites"
- As the `custom_dir` variable is used for the theme extension process, the
+ As the `custom_dir` variable is used for the theme extension process,
Material for MkDocs needs to be installed via `pip` and referenced with the
- `name` parameter in your `mkdocs.yml`.
+ `name` parameter in `mkdocs.yml`. It will not work when cloning from `git`.
The structure in the `overrides` directory must mirror the directory structure
of the original theme, as any file in the `overrides` directory will replace the
@@ -97,28 +96,33 @@ The directory layout of the theme is as follows:
``` sh
.
+├─ .icons/ # Bundled icon sets
├─ assets/
│ ├─ images/ # Images and icons
│ ├─ javascripts/ # JavaScript
│ └─ stylesheets/ # Stylesheets
├─ partials/
-│ ├─ integrations/ # 3rd-party integrations
+│ ├─ integrations/ # Third-party integrations
+│ │ ├─ analytics.html # - Google Analytics
+│ │ └─ disqus.html # - Disqus
│ ├─ language/ # Localized languages
│ ├─ footer.html # Footer bar
│ ├─ header.html # Header bar
│ ├─ hero.html # Hero teaser
│ ├─ language.html # Localized labels
-│ ├─ nav-item.html # Main navigation item
+│ ├─ logo.html # Logo in header and sidebar
│ ├─ nav.html # Main navigation
+│ ├─ nav-item.html # Main navigation item
+│ ├─ palette.html # Color palette
│ ├─ search.html # Search box
│ ├─ social.html # Social links
+│ ├─ source.html # Repository information
│ ├─ source-date.html # Last updated date
│ ├─ source-link.html # Link to source file
-│ ├─ source.html # Repository information
-│ ├─ tabs-item.html # Tabs navigation item
│ ├─ tabs.html # Tabs navigation
-│ ├─ toc-item.html # Table of contents item
-│ └─ toc.html # Table of contents
+│ ├─ tabs-item.html # Tabs navigation item
+│ ├─ toc.html # Table of contents
+│ └─ toc-item.html # Table of contents item
├─ 404.html # 404 error page
├─ base.html # Base template
└─ main.html # Default page
@@ -131,12 +135,12 @@ our own partial. To do this, create the file `partials/footer.html` in the
`overrides` directory. MkDocs will now use the new partial when rendering the
theme. This can be done with any file.
-### Overriding template blocks
+### Overriding blocks
-Besides overriding partials, one can also override so called *template blocks*,
-which are defined inside the templates and wrap specific features. To override a
-template block, create a `main.html` inside the `overrides` directory and define
-the block, e.g.:
+Besides overriding partials, it's also possible to override (and extend) so
+called _blocks_, which are defined inside the templates and wrap specific
+features. To override a block, create a `main.html` inside the `overrides`
+directory and define the block, e.g.:
``` jinja
{% extends "base.html" %}
@@ -151,12 +155,12 @@ Material for MkDocs provides the following template blocks:
| Block name | Wrapped contents |
| ------------ | ----------------------------------------------- |
| `analytics` | Wraps the Google Analytics integration |
-| `announce` | Wraps the Announcement bar |
+| `announce` | Wraps the announcement bar |
| `config` | Wraps the JavaScript application config |
| `content` | Wraps the main content |
-| `disqus` | Wraps the disqus integration |
-| `extrahead` | Empty block to define additional meta tags |
-| `fonts` | Wraps the webfont definitions |
+| `disqus` | Wraps the Disqus integration |
+| `extrahead` | Empty block to add custom meta tags |
+| `fonts` | Wraps the font definitions |
| `footer` | Wraps the footer with navigation and copyright |
| `header` | Wraps the fixed header bar |
| `hero` | Wraps the hero teaser (if available) |
@@ -169,24 +173,24 @@ Material for MkDocs provides the following template blocks:
| `styles` | Wraps the stylesheets (also extra sources) |
| `tabs` | Wraps the tabs navigation (if available) |
-For more on this topic refer to the [MkDocs documentation][4]
+For more on this topic refer to the [MkDocs documentation][5].
- [4]: https://www.mkdocs.org/user-guide/styling-your-docs/#overriding-template-blocks
+ [5]: https://www.mkdocs.org/user-guide/styling-your-docs/#overriding-template-blocks
## Theme development
-Material for MkDocs uses [Webpack][5] as a build tool to leverage modern web
-technologies like [TypeScript][6] and [SASS][7]. If you want to make more
+Material for MkDocs uses [Webpack][6] as a build tool to leverage modern web
+technologies like [TypeScript][7] and [SASS][8]. If you want to make more
fundamental changes, it may be necessary to make the adjustments directly in
-the source of the theme and recompile it. This is fairly easy.
+the source of the theme and recompile it.
- [5]: https://webpack.js.org/
- [6]: https://www.typescriptlang.org/
- [7]: https://sass-lang.com
+ [6]: https://webpack.js.org/
+ [7]: https://www.typescriptlang.org/
+ [8]: https://sass-lang.com
### Environment setup
-In order to start development on Material for MkDocs, a [Node.js][8] version of
+In order to start development on Material for MkDocs, a [Node.js][9] version of
at least 12 is required. First, clone the repository:
``` sh
@@ -198,10 +202,11 @@ Next, all dependencies need to be installed, which is done with:
``` sh
cd mkdocs-material
pip install -r requirements.txt
+pip install mkdocs-minify-plugin
npm install
```
- [8]: https://nodejs.org
+ [9]: https://nodejs.org
### Development mode
@@ -217,7 +222,8 @@ Then, in a second session, start the MkDocs server with:
mkdocs serve
```
-Point your browser to [localhost:8000][9] and you should see this documentation in front of you.
+Point your browser to [localhost:8000][10] and you should see this documentation
+in front of you.
!!! warning "Automatically generated files"
@@ -225,11 +231,11 @@ Point your browser to [localhost:8000][9] and you should see this documentation
directory are automatically generated from the `src` directory and will be
overridden when the theme is built.
- [9]: http://localhost:8000
+ [10]: http://localhost:8000
-### Build process
+### Building the theme
-When you've finished making your changes, you can build the theme by invoking:
+When you're finished making your changes, you can build the theme by invoking:
``` sh
npm run build
@@ -238,7 +244,7 @@ npm run build
This triggers the production-level compilation and minification of all
stylesheets and JavaScript sources. When the command exits, the final files are
located in the `material` directory. Add the `theme_dir` variable pointing to
-the aforementioned directory in your original `mkdocs.yml`.
+the aforementioned directory in the original `mkdocs.yml`.
Now you can run `mkdocs build` and you should see your documentation with your
changes to the original theme.
diff --git a/docs/data-privacy.md b/docs/data-privacy.md
index a28ffca54..42e070806 100644
--- a/docs/data-privacy.md
+++ b/docs/data-privacy.md
@@ -25,14 +25,14 @@ theme:
font: false
```
-When Google Fonts are disabled, Material for MkDocs will default to **Helvetica
-Neue** and **Monaco** with their corresponding fall backs, relying on system
+When Google Fonts are disabled, Material for MkDocs will default to __Helvetica
+Neue__ and __Monaco__ with their corresponding fall backs, relying on system
fonts. You can easily include your own, self-hosted webfont by [overriding][4]
the `fonts` block.
- [2]: getting-started.md#fonts
+ [2]: setup/changing-the-fonts.md
[3]: https://github.com/google/fonts/issues/1495
- [4]: customization.md#overriding-template-blocks
+ [4]: customization.md#overriding-blocks
### Google Analytics and Disqus
diff --git a/docs/extensions/admonition.md b/docs/extensions/admonition.md
deleted file mode 100644
index 7edf96888..000000000
--- a/docs/extensions/admonition.md
+++ /dev/null
@@ -1,459 +0,0 @@
----
-template: overrides/main.html
----
-
-# Admonition
-
-[Admonition][1] is an extension included in the standard Markdown library that
-makes it possible to add block-styled side content to your documentation, e.g.
-summaries, notes, hints or warnings.
-
- [1]: https://python-markdown.github.io/extensions/admonition/
-
-## Configuration
-
-Add the following lines to `mkdocs.yml`:
-
-``` yaml
-markdown_extensions:
- - admonition
-```
-
-## Usage
-
-Admonitions follow a simple syntax: every block is started with `!!!`, followed
-by a single keyword which is used as the [type qualifier][2] of the block. The
-content of the block then follows on the next line, indented by four spaces.
-
-Example:
-
-``` markdown
-!!! note
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! note
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
- [2]: #types
-
-### Changing the title
-
-By default, the Admonition title will equal the type qualifier in titlecase.
-However, it can be changed by adding a quoted string after the type qualifier.
-
-Example:
-
-``` markdown
-!!! note "Phasellus posuere in sem ut cursus"
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! note "Phasellus posuere in sem ut cursus"
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-### Removing the title
-
-Similar to [changing the title][3], the icon and title can be omitted by
-providing an empty string after the type qualifier:
-
-Example:
-
-``` markdown
-!!! note ""
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! note ""
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
- [3]: #changing-the-title
-
-### Embedded content
-
-Admonitions can contain all kinds of text content, including headlines, lists,
-paragraphs and other blocks – except code blocks, because the parser from the
-standard Markdown library does not account for those.
-
-The [PyMdown Extensions][4] package adds an extension called [SuperFences][5],
-which makes it possible to nest code blocks within other blocks, respectively
-Admonition blocks.
-
- [4]: https://facelessuser.github.io/pymdown-extensions
- [5]: https://facelessuser.github.io/pymdown-extensions/extensions/superfences/
-
-Example:
-
-!!! note
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
- ``` mysql
- SELECT
- Employees.EmployeeID,
- Employees.Name,
- Employees.Salary,
- Manager.Name AS Manager
- FROM
- Employees
- LEFT JOIN
- Employees AS Manager
- ON
- Employees.ManagerID = Manager.EmployeeID
- WHERE
- Employees.EmployeeID = '087652';
- ```
-
- Nunc eu odio eleifend, blandit leo a, volutpat sapien. Phasellus posuere in
- sem ut cursus. Nullam sit amet tincidunt ipsum, sit amet elementum turpis.
- Etiam ipsum quam, mattis in purus vitae, lacinia fermentum enim.
-
-### Collapsible blocks
-
-The [Details][6] extension which is also part of the [PyMdown Extensions][4]
-package adds support for rendering collapsible Admonition blocks. This is
-useful for FAQs or content that is of secondary nature.
-
-Example:
-
-``` markdown
-??? note "Phasellus posuere in sem ut cursus"
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-??? note "Phasellus posuere in sem ut cursus"
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-By adding a `+` sign directly after the start marker, blocks can be rendered
-open by default.
-
- [6]: https://facelessuser.github.io/pymdown-extensions/extensions/details/
-
-## Types
-
-Admonition supports user-defined type qualifiers which may influence the style
-of the inserted block. Following is a list of type qualifiers provided by
-Material for MkDocs, whereas the default type, and thus fallback for unknown
-type qualifiers, is `note`.
-
-### Note
-
-Example:
-
-``` markdown
-!!! note
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! note
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `note`
-* `seealso`
-
-### Abstract
-
-Example:
-
-``` markdown
-!!! abstract
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! abstract
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `abstract`
-* `summary`
-* `tldr`
-
-### Info
-
-Example:
-
-``` markdown
-!!! info
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! info
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `info`
-* `todo`
-
-### Tip
-
-Example:
-
-``` markdown
-!!! tip
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! tip
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `tip`
-* `hint`
-* `important`
-
-### Success
-
-Example:
-
-``` markdown
-!!! success
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! success
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `success`
-* `check`
-* `done`
-
-### Question
-
-Example:
-
-``` markdown
-!!! question
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! question
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `question`
-* `help`
-* `faq`
-
-### Warning
-
-Example:
-
-``` markdown
-!!! warning
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! warning
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `warning`
-* `caution`
-* `attention`
-
-### Failure
-
-Example:
-
-``` markdown
-!!! failure
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! failure
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `failure`
-* `fail`
-* `missing`
-
-### Danger
-
-Example:
-
-``` markdown
-!!! danger
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! danger
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `danger`
-* `error`
-
-### Bug
-
-Example:
-
-``` markdown
-!!! bug
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! bug
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `bug`
-
-### Example
-
-Example:
-
-``` markdown
-!!! example
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! example
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `example`
-
-### Quote
-
-Example:
-
-``` markdown
-!!! quote
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-```
-
-Result:
-
-!!! quote
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla et euismod
- nulla. Curabitur feugiat, tortor non consequat finibus, justo purus auctor
- massa, nec semper lorem quam in massa.
-
-Qualifiers:
-
-* `quote`
-* `cite`
diff --git a/docs/extensions/codehilite.md b/docs/extensions/codehilite.md
deleted file mode 100644
index 4640389a5..000000000
--- a/docs/extensions/codehilite.md
+++ /dev/null
@@ -1,966 +0,0 @@
----
-template: overrides/main.html
----
-
-# CodeHilite
-
-[CodeHilite][1] is an extension that adds syntax highlighting to code blocks
-and is included in the standard Markdown library. It uses [Pygments][2] during
-the compilation of the Markdown file to provide syntax highlighting for over
-[300 languages][3] and has no JavaScript runtime dependency.
-
- [1]: https://python-markdown.github.io/extensions/code_hilite/
- [2]: https://pygments.org
- [3]: http://pygments.org/languages
-
-## Configuration
-
-Add the following lines to `mkdocs.yml`:
-
-``` yaml
-markdown_extensions:
- - codehilite
-```
-
-## Usage
-
-### Specifying the language
-
-The CodeHilite extension uses the same syntax as regular Markdown code blocks,
-but needs to know the language of the code block. This can be done in three
-different ways.
-
-#### via Markdown syntax recommended
-
-In Markdown, code blocks can be opened and closed by writing three backticks on
-separate lines. To add code highlighting to those blocks, the easiest way is
-to specify the language identifier directly after the opening block.
-
-Example:
-
-```` markdown
-``` python
-import tensorflow as tf
-```
-````
-
-Result:
-
-``` python
-import tensorflow as tf
-```
-
-#### via Shebang
-
-Alternatively, if the first line of a code block contains a shebang, the
-language is derived from the path referenced in the shebang. This will only
-work for code blocks that are indented using four spaces, not for those
-encapsulated in three backticks.
-
-Example:
-
-```` markdown
- #!/usr/bin/python
- import tensorflow as tf
-````
-
-Result:
-
-``` python
-#!/usr/bin/python
-import tensorflow as tf
-```
-
-#### via three colons
-
-If the first line starts with three colons followed by a language identifier,
-the first line is stripped. This will only work for code blocks that are
-indented using four spaces, not for those encapsulated in three backticks.
-
-Example:
-
-``` markdown
- :::python
- import tensorflow as tf
-```
-
-Result:
-
- :::python
- import tensorflow as tf
-
-### Adding line numbers
-
-Line numbers can be added to a code block by enabling the `linenums` flag in
-`mkdocs.yml` or adding `linenums=1` right after the language identifier:
-
-``` yaml
-markdown_extensions:
- - codehilite:
- linenums: true
-```
-
-Example:
-
-```` markdown
-``` python linenums="1"
-""" Bubble sort """
-def bubble_sort(items):
- for i in range(len(items)):
- for j in range(len(items) - 1 - i):
- if items[j] > items[j + 1]:
- items[j], items[j + 1] = items[j + 1], items[j]
-```
-````
-
-Result:
-
-``` python linenums="1"
-""" Bubble sort """
-def bubble_sort(items):
- for i in range(len(items)):
- for j in range(len(items) - 1 - i):
- if items[j] > items[j + 1]:
- items[j], items[j + 1] = items[j + 1], items[j]
-```
-
-### Grouping code blocks
-
-The [Tabbed][4] extension which is part of the [PyMdown Extensions][5]
-package adds support for grouping Markdown blocks with tabs. This is especially
-useful for documenting projects with multiple language bindings.
-
-Add the Tabbed and SuperFences extensions to `mkdocs.yml`:
-
-``` yaml
-markdown_extensions:
- - codehilite
- - pymdownx.tabbed
- - pymdownx.superfences
-```
-
-Add your tabbed code to your markdown file. Example:
-
-````
-=== "Bash"
- ``` bash
- #!/bin/bash
-
- echo "Hello world!"
- ```
-
-=== "C"
- ``` c
- #include
-
- int main(void) {
- printf("Hello world!\n");
- return 0;
- }
- ```
-
-=== "C++"
- ``` c++
- #include
-
- int main(void) {
- std::cout << "Hello world!" << std::endl;
- return 0;
- }
- ```
-
-=== "C#"
- ``` c#
- using System;
-
- class Program {
- static void Main(string[] args) {
- Console.WriteLine("Hello world!");
- }
- }
- ```
-````
-
-Result:
-
-=== "Bash"
- ``` bash
- #!/bin/bash
-
- echo "Hello world!"
- ```
-
-=== "C"
- ``` c
- #include
-
- int main(void) {
- printf("Hello world!\n");
- return 0;
- }
- ```
-
-=== "C++"
- ``` c++
- #include
-
- int main(void) {
- std::cout << "Hello world!" << std::endl;
- return 0;
- }
- ```
-
-=== "C#"
- ``` c#
- using System;
-
- class Program {
- static void Main(string[] args) {
- Console.WriteLine("Hello world!");
- }
- }
- ```
-
- [4]: https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/
- [5]: https://facelessuser.github.io/pymdown-extensions
-
-### Highlighting specific lines
-
-Specific lines can be highlighted by passing the line numbers to the `hl_lines`
-argument placed right after the language identifier. Line counts start at 1.
-
-Example:
-
-```` markdown
-``` python hl_lines="3 4"
-""" Bubble sort """
-def bubble_sort(items):
- for i in range(len(items)):
- for j in range(len(items) - 1 - i):
- if items[j] > items[j + 1]:
- items[j], items[j + 1] = items[j + 1], items[j]
-```
-````
-
-Result:
-
-``` python linenums="1" hl_lines="3 4"
-""" Bubble sort """
-def bubble_sort(items):
- for i in range(len(items)):
- for j in range(len(items) - 1 - i):
- if items[j] > items[j + 1]:
- items[j], items[j + 1] = items[j + 1], items[j]
-```
-
-## Supported languages excerpt
-
-CodeHilite uses [Pygments][2], a generic syntax highlighter with support for
-over [300 languages][3], so the following list of examples is just an excerpt.
-
-### Bash
-
-``` bash
-#!/bin/bash
-
-for OPT in "$@"
-do
- case "$OPT" in
- '-f' ) canonicalize=1 ;;
- '-n' ) switchlf="-n" ;;
- esac
-done
-
-# readlink -f
-function __readlink_f {
- target="$1"
- while test -n "$target"; do
- filepath="$target"
- cd `dirname "$filepath"`
- target=`readlink "$filepath"`
- done
- /bin/echo $switchlf `pwd -P`/`basename "$filepath"`
-}
-
-if [ ! "$canonicalize" ]; then
- readlink $switchlf "$@"
-else
- for file in "$@"
- do
- case "$file" in
- -* ) ;;
- * ) __readlink_f "$file" ;;
- esac
- done
-fi
-
-exit $?
-```
-
-### C
-
-``` c
-extern size_t
-pb_varint_scan(const uint8_t data[], size_t left) {
- assert(data && left);
- left = left > 10 ? 10 : left;
-
-#ifdef __SSE2__
-
- /* Mapping: remaining bytes ==> bitmask */
- static const int mask_map[] = {
- 0x0000, 0x0001, 0x0003, 0x0007,
- 0x000F, 0x001F, 0x003F, 0x007F,
- 0x00FF, 0x01FF, 0x03FF
- };
-
- /* Load buffer into 128-bit integer and create high-bit mask */
- __m128i temp = _mm_loadu_si128((const __m128i *)data);
- __m128i high = _mm_set1_epi8(0x80);
-
- /* Intersect and extract mask with high-bits set */
- int mask = _mm_movemask_epi8(_mm_and_si128(temp, high));
- mask = (mask & mask_map[left]) ^ mask_map[left];
-
- /* Count trailing zeroes */
- return mask ? __builtin_ctz(mask) + 1 : 0;
-
-#else
-
- /* Linear scan */
- size_t size = 0;
- while (data[size++] & 0x80)
- if (!--left)
- return 0;
- return size;
-
-#endif /* __SSE2__ */
-
-}
-```
-
-### C++
-
-``` cpp
-Extension::
-Extension(const Descriptor *descriptor, const Descriptor *scope) :
- descriptor_(descriptor),
- scope_(scope) {
-
- /* Extract full name for signature */
- variables_["signature"] = descriptor_->full_name();
-
- /* Prepare message symbol */
- variables_["message"] = StringReplace(
- variables_["signature"], ".", "_", true);
- LowerString(&(variables_["message"]));
-
- /* Suffix scope to identifiers, if given */
- string suffix ("");
- if (scope_) {
- suffix = scope_->full_name();
-
- /* Check if the base and extension types are in the same package */
- if (!scope_->file()->package().compare(descriptor_->file()->package()))
- suffix = StripPrefixString(suffix,
- scope_->file()->package() + ".");
-
- /* Append to signature */
- variables_["signature"] += ".[" + suffix +"]";
- suffix = "_" + suffix;
- }
-
- /* Prepare extension symbol */
- variables_["extension"] = StringReplace(
- suffix, ".", "_", true);
- LowerString(&(variables_["extension"]));
-}
-```
-
-### C#
-
-``` csharp
-public static void Send(
- Socket socket, byte[] buffer, int offset, int size, int timeout) {
- int startTickCount = Environment.TickCount;
- int sent = 0;
- do {
- if (Environment.TickCount > startTickCount + timeout)
- throw new Exception("Timeout.");
- try {
- sent += socket.Send(buffer, offset + sent,
- size - sent, SocketFlags.None);
- } catch (SocketException ex) {
- if (ex.SocketErrorCode == SocketError.WouldBlock ||
- ex.SocketErrorCode == SocketError.IOPending ||
- ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) {
- /* Socket buffer is probably full, wait and try again */
- Thread.Sleep(30);
- } else {
- throw ex;
- }
- }
- } while (sent < size);
-}
-```
-
-### Clojure
-
-``` clojure
-(clojure-version)
-
-(defn partition-when
- [f]
- (fn [rf]
- (let [a (java.util.ArrayList.)
- fval (volatile! false)]
- (fn
- ([] (rf))
- ([result]
- (let [result (if (.isEmpty a)
- result
- (let [v (vec (.toArray a))]
- ;; Clear first
- (.clear a)
- (unreduced (rf result v))))]
- (rf result)))
- ([result input]
- (if-not (and (f input) @fval)
- (do
- (vreset! fval true)
- (.add a input)
- result)
- (let [v (vec (.toArray a))]
- (.clear a)
- (let [ret (rf result v)]
- (when-not (reduced? ret)
- (.add a input))
- ret))))))))
-
-
-(into [] (partition-when
- #(.startsWith % ">>"))
- ["1d" "33" ">> 1" ">> 2" "22" ">> 3"])
-```
-
-### Diff
-
-``` diff
-Index: grunt.js
-===================================================================
---- grunt.js (revision 31200)
-+++ grunt.js (working copy)
-@@ -12,6 +12,7 @@
-
- module.exports = function (grunt) {
-
-+ console.log('hello world');
- // Project configuration.
- grunt.initConfig({
- lint: {
-@@ -19,10 +20,6 @@
- 'packages/services.web/{!(test)/**/,}*.js',
- 'packages/error/**/*.js'
- ],
-- scripts: [
-- 'grunt.js',
-- 'db/**/*.js'
-- ],
- browser: [
- 'packages/web/server.js',
- 'packages/web/server/**/*.js',
-```
-
-### Docker
-
-``` docker
-FROM ubuntu
-
-# Install vnc, xvfb in order to create a 'fake' display and firefox
-RUN apt-get update && apt-get install -y x11vnc xvfb firefox
-RUN mkdir ~/.vnc
-
-# Setup a password
-RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
-
-# Autostart firefox (might not be the best way, but it does the trick)
-RUN bash -c 'echo "firefox" >> /.bashrc'
-
-EXPOSE 5900
-CMD ["x11vnc", "-forever", "-usepw", "-create"]
-```
-
-### Elixir
-
-``` elixir
-require Logger
-
-def accept(port) do
- {:ok, socket} = :gen_tcp.listen(port,
- [:binary, packet: :line, active: false, reuseaddr: true])
- Logger.info "Accepting connections on port #{port}"
- loop_acceptor(socket)
-end
-
-defp loop_acceptor(socket) do
- {:ok, client} = :gen_tcp.accept(socket)
- serve(client)
- loop_acceptor(socket)
-end
-
-defp serve(socket) do
- socket
- |> read_line()
- |> write_line(socket)
-
- serve(socket)
-end
-
-defp read_line(socket) do
- {:ok, data} = :gen_tcp.recv(socket, 0)
- data
-end
-
-defp write_line(line, socket) do
- :gen_tcp.send(socket, line)
-end
-```
-
-### Erlang
-
-``` erlang
-circular(Defs) ->
- [ { { Type, Base }, Fields } ||
- { { Type, Base }, Fields } <- Defs, Type == msg, circular(Base, Defs) ].
-
-circular(Base, Defs) ->
- Fields = proplists:get_value({ msg, Base }, Defs),
- circular(Defs, Fields, [Base]).
-
-circular(_Defs, [], _Path) ->
- false;
-circular(Defs, [Field | Fields], Path) ->
- case Field#field.type of
- { msg, Type } ->
- case lists:member(Type, Path) of
- false ->
- Children = proplists:get_value({ msg, Type }, Defs),
- case circular(Defs, Children, [Type | Path]) of
- false -> circular(Defs, Fields, Path);
- true -> true
- end;
- true ->
- Type == lists:last(Path) andalso
- (length(Path) == 1 orelse not is_tree(Path))
- end;
- _ ->
- circular(Defs, Fields, Path)
- end.
-```
-
-### F#
-
-``` fsharp
-/// Asynchronously download retangles from the server
-/// and decode the JSON format to F# Rectangle record
-let [] getRectangles () : Async = async {
- let req = XMLHttpRequest()
- req.Open("POST", "/get", true)
- let! resp = req.AsyncSend()
- return JSON.parse(resp) }
-
-/// Repeatedly update rectangles after 0.5 sec
-let [] updateLoop () = async {
- while true do
- do! Async.Sleep(500)
- let! rects = getRectangles()
- cleanRectangles()
- rects |> Array.iter createRectangle }
-```
-
-### Go
-
-``` go
-package main
-
-import "fmt"
-
-func counter(id int, channel chan int, closer bool) {
- for i := 0; i < 10000000; i++ {
- fmt.Println("process", id," send", i)
- channel <- 1
- }
- if closer { close(channel ) }
-}
-
-func main() {
- channel := make(chan int)
- go counter(1, channel, false)
- go counter(2, channel, true)
-
- x := 0
-
- // receiving data from channel
- for i := range channel {
- fmt.Println("receiving")
- x += i
- }
-
- fmt.Println(x)
-}
-```
-
-### HTML
-
-``` html
-
-
-
-
-
- HTML5 Boilerplate
-
-
-
-
-
-
-
-
-
-
Hello world! This is HTML5 Boilerplate.
-
-
-```
-
-### Java
-
-``` java
-import java.util.LinkedList;
-import java.lang.reflect.Array;
-
-public class UnsortedHashSet {
-
- private static final double LOAD_FACTOR_LIMIT = 0.7;
-
- private int size;
- private LinkedList[] con;
-
- public UnsortedHashSet() {
- con = (LinkedList[])(new LinkedList[10]);
- }
-
- public boolean add(E obj) {
- int oldSize = size;
- int index = Math.abs(obj.hashCode()) % con.length;
- if (con[index] == null)
- con[index] = new LinkedList();
- if (!con[index].contains(obj)) {
- con[index].add(obj);
- size++;
- }
- if (1.0 * size / con.length > LOAD_FACTOR_LIMIT)
- resize();
- return oldSize != size;
- }
-
- private void resize() {
- UnsortedHashSet temp = new UnsortedHashSet();
- temp.con = (LinkedList[])(new LinkedList[con.length * 2 + 1]);
- for (int i = 0; i < con.length; i++) {
- if (con[i] != null)
- for (E e : con[i])
- temp.add(e);
- }
- con = temp.con;
- }
-
- public int size() {
- return size;
- }
-}
-```
-
-### JavaScript
-
-``` javascript
-var Math = require('lib/math');
-
-var _extends = function (target) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
- for (var key in source) {
- target[key] = source[key];
- }
- }
-
- return target;
-};
-
-var e = exports.e = 2.71828182846;
-exports['default'] = function (x) {
- return Math.exp(x);
-};
-
-module.exports = _extends(exports['default'], exports);
-```
-
-### JSON
-
-``` json
-{
- "name": "mkdocs-material",
- "version": "0.2.4",
- "description": "A Material Design theme for MkDocs",
- "homepage": "http://squidfunk.github.io/mkdocs-material/",
- "authors": [
- "squidfunk "
- ],
- "license": "MIT",
- "main": "Gulpfile.js",
- "scripts": {
- "start": "./node_modules/.bin/gulp watch --mkdocs",
- "build": "./node_modules/.bin/gulp build --production"
- }
- ...
-}
-```
-
-### Julia
-
-``` julia
-using MXNet
-
-mlp = @mx.chain mx.Variable(:data) =>
- mx.FullyConnected(name=:fc1, num_hidden=128) =>
- mx.Activation(name=:relu1, act_type=:relu) =>
- mx.FullyConnected(name=:fc2, num_hidden=64) =>
- mx.Activation(name=:relu2, act_type=:relu) =>
- mx.FullyConnected(name=:fc3, num_hidden=10) =>
- mx.SoftmaxOutput(name=:softmax)
-
-# data provider
-batch_size = 100
-include(Pkg.dir("MXNet", "examples", "mnist", "mnist-data.jl"))
-train_provider, eval_provider = get_mnist_providers(batch_size)
-
-# setup model
-model = mx.FeedForward(mlp, context=mx.cpu())
-
-# optimization algorithm
-optimizer = mx.SGD(lr=0.1, momentum=0.9)
-
-# fit parameters
-mx.fit(model, optimizer, train_provider, n_epoch=20, eval_data=eval_provider)
-```
-
-### Lua
-
-``` lua
-local ffi = require("ffi")
-
-ffi.cdef[[
- void Sleep(int ms);
- int poll(struct pollfd *fds, unsigned long nfds, int timeout);
-]]
-
-local sleep
-if ffi.os == "Windows" then
- function sleep(s)
- ffi.C.Sleep(s*1000)
- end
-else
- function sleep(s)
- ffi.C.poll(nil, 0, s * 1000)
- end
-end
-
-for i = 1,160 do
- io.write("."); io.flush()
- sleep(0.01)
-end
-io.write("\n")
-```
-
-### MySQL
-
-``` mysql
-SELECT
- Employees.EmployeeID,
- Employees.Name,
- Employees.Salary,
- Manager.Name AS Manager
-FROM
- Employees
-LEFT JOIN
- Employees AS Manager
-ON
- Employees.ManagerID = Manager.EmployeeID
-WHERE
- Employees.EmployeeID = '087652';
-```
-
-### PHP
-
-``` php
-Lucky number: '.$number.'