@ -26,7 +26,3 @@
|
|||||||
# Files used and generated by flow
|
# Files used and generated by flow
|
||||||
/lib/declarations
|
/lib/declarations
|
||||||
/tmp
|
/tmp
|
||||||
|
|
||||||
# Files generated by visual tests
|
|
||||||
/gemini-report
|
|
||||||
/tests/visual/data
|
|
||||||
|
5
.gitignore
vendored
@ -35,11 +35,6 @@
|
|||||||
# Files generated by flow typechecker
|
# Files generated by flow typechecker
|
||||||
/tmp
|
/tmp
|
||||||
|
|
||||||
# Files generated by visual tests
|
|
||||||
/gemini-report
|
|
||||||
/tests/visual/baseline/local
|
|
||||||
/tests/visual/data
|
|
||||||
|
|
||||||
# Distribution files
|
# Distribution files
|
||||||
/dist
|
/dist
|
||||||
/mkdocs_material.egg-info
|
/mkdocs_material.egg-info
|
||||||
|
@ -50,6 +50,6 @@ install:
|
|||||||
- yarn install --ignore-optional
|
- yarn install --ignore-optional
|
||||||
- pip install --user -r requirements.txt
|
- pip install --user -r requirements.txt
|
||||||
|
|
||||||
# Perform build, tests and release
|
# Perform build and release
|
||||||
script:
|
script:
|
||||||
- yarn run travis
|
- yarn run travis
|
||||||
|
10
CHANGELOG
@ -1,3 +1,11 @@
|
|||||||
|
mkdocs-material-1.6.2 (2017-05-15)
|
||||||
|
|
||||||
|
* Fixed #316: Fatal error for git clone on Windows
|
||||||
|
* Fixed #320: Chrome 58 creates double underline for abbr tags
|
||||||
|
* Fixed #323: Ligatures rendered inside code blocks
|
||||||
|
* Fixed miscalculated sidebar height due to missing margin collapse
|
||||||
|
* Changed deprecated MathJax CDN to Cloudflare
|
||||||
|
|
||||||
mkdocs-material-1.6.1 (2017-04-23)
|
mkdocs-material-1.6.1 (2017-04-23)
|
||||||
|
|
||||||
* Fixed following of active/focused element if search input is focused
|
* Fixed following of active/focused element if search input is focused
|
||||||
@ -8,7 +16,7 @@ mkdocs-material-1.6.0 (2017-04-22)
|
|||||||
* Added build test for Docker image on Travis
|
* Added build test for Docker image on Travis
|
||||||
* Added search overlay for better user experience (focus)
|
* Added search overlay for better user experience (focus)
|
||||||
* Added language from localizations to html tag
|
* Added language from localizations to html tag
|
||||||
* Fixed #270: source links broken for absolute URLs
|
* Fixed #270: Source links broken for absolute URLs
|
||||||
* Fixed missing top spacing for first targeted element in content
|
* Fixed missing top spacing for first targeted element in content
|
||||||
* Fixed too small footnote divider when using larger font sizes
|
* Fixed too small footnote divider when using larger font sizes
|
||||||
|
|
||||||
|
@ -38,9 +38,6 @@ const config = {
|
|||||||
build: "material/assets" /* Target directory for assets */
|
build: "material/assets" /* Target directory for assets */
|
||||||
},
|
},
|
||||||
lib: "lib", /* Libraries and tasks */
|
lib: "lib", /* Libraries and tasks */
|
||||||
tests: {
|
|
||||||
visual: "tests/visual" /* Base directory for visual tests */
|
|
||||||
},
|
|
||||||
views: {
|
views: {
|
||||||
src: "src", /* Source directory for views */
|
src: "src", /* Source directory for views */
|
||||||
build: "material" /* Target directory for views */
|
build: "material" /* Target directory for views */
|
||||||
@ -64,9 +61,6 @@ let args = yargs
|
|||||||
.command("help", chalk.grey("display this message"))
|
.command("help", chalk.grey("display this message"))
|
||||||
.command("lint", chalk.grey("lint sources"))
|
.command("lint", chalk.grey("lint sources"))
|
||||||
.command("start", chalk.grey("start development server"))
|
.command("start", chalk.grey("start development server"))
|
||||||
.command("test:visual:run", chalk.grey("run visual tests"))
|
|
||||||
.command("test:visual:session", chalk.grey("start test server"))
|
|
||||||
.command("test:visual:update", chalk.grey("update reference images"))
|
|
||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
.group([
|
.group([
|
||||||
@ -109,19 +103,6 @@ let args = yargs
|
|||||||
global: true
|
global: true
|
||||||
})
|
})
|
||||||
|
|
||||||
/* Test options */
|
|
||||||
.group([
|
|
||||||
"grep", "browser"
|
|
||||||
], chalk.yellow("Test Options:"))
|
|
||||||
.option("grep", {
|
|
||||||
describe: chalk.grey("only execute tests matching a regex"),
|
|
||||||
global: true
|
|
||||||
})
|
|
||||||
.option("browser", {
|
|
||||||
describe: chalk.grey("only execute tests for the given browser"),
|
|
||||||
global: true
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Example commands */
|
/* Example commands */
|
||||||
.example("yarn run build")
|
.example("yarn run build")
|
||||||
.example("yarn run build -- --no-optimize")
|
.example("yarn run build -- --no-optimize")
|
||||||
@ -129,20 +110,6 @@ let args = yargs
|
|||||||
.example("yarn run flow")
|
.example("yarn run flow")
|
||||||
.example("yarn run lint")
|
.example("yarn run lint")
|
||||||
.example("yarn run start")
|
.example("yarn run start")
|
||||||
.example("yarn run test:visual:run")
|
|
||||||
.example("yarn run test:visual:run -- --no-clean")
|
|
||||||
.example("yarn run test:visual:run -- --grep nav")
|
|
||||||
.example("yarn run test:visual:run -- --browser ie11")
|
|
||||||
.example("yarn run test:visual:session")
|
|
||||||
.example("yarn run test:visual:update")
|
|
||||||
|
|
||||||
/* Document Environment variables */
|
|
||||||
.epilogue(
|
|
||||||
`${chalk.yellow("Environment:")}\n` +
|
|
||||||
` SAUCE=${chalk.grey("<true|false)>")}\n` +
|
|
||||||
` SAUCE_USERNAME=${chalk.grey("<username>")}\n` +
|
|
||||||
` SAUCE_ACCESS_KEY=${chalk.grey("<key>")}`
|
|
||||||
)
|
|
||||||
|
|
||||||
/* Apply to process.argv */
|
/* Apply to process.argv */
|
||||||
.argv
|
.argv
|
||||||
@ -391,46 +358,6 @@ gulp.task("mkdocs:clean",
|
|||||||
gulp.task("mkdocs:serve",
|
gulp.task("mkdocs:serve",
|
||||||
load("mkdocs/serve"))
|
load("mkdocs/serve"))
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generate visual tests
|
|
||||||
*/
|
|
||||||
gulp.task("tests:visual:generate", [
|
|
||||||
args.clean ? "tests:visual:clean" : false,
|
|
||||||
args.clean ? "assets:build" : false,
|
|
||||||
args.clean ? "views:build" : false
|
|
||||||
].filter(t => t),
|
|
||||||
load("tests/visual/generate"))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Run visual tests
|
|
||||||
*/
|
|
||||||
gulp.task("tests:visual:run", [
|
|
||||||
"tests:visual:generate"
|
|
||||||
], load("tests/visual/run"))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update reference images for visual tests
|
|
||||||
*/
|
|
||||||
gulp.task("tests:visual:update",
|
|
||||||
load("tests/visual/update"))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Clean files generated by visual tests
|
|
||||||
*/
|
|
||||||
gulp.task("tests:visual:clean",
|
|
||||||
load("tests/visual/clean"))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open a SauceConnect session for manual testing
|
|
||||||
*/
|
|
||||||
gulp.task("tests:visual:session", [
|
|
||||||
"tests:visual:generate"
|
|
||||||
], load("tests/visual/session"))
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
* Interface
|
* Interface
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
@ -186,7 +186,7 @@ tags on separate lines and adding new lines between the tags and the content.
|
|||||||
|
|
||||||
### Arithmatex <small>MathJax</small>
|
### Arithmatex <small>MathJax</small>
|
||||||
|
|
||||||
<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML"></script>
|
||||||
|
|
||||||
[Arithmatex][20] integrates Material with [MathJax][21] which parses
|
[Arithmatex][20] integrates Material with [MathJax][21] which parses
|
||||||
block-style and inline equations written in TeX markup and outputs them in
|
block-style and inline equations written in TeX markup and outputs them in
|
||||||
@ -199,7 +199,7 @@ runtime needs to be included. This must be done with
|
|||||||
|
|
||||||
``` yaml
|
``` yaml
|
||||||
extra_javascript:
|
extra_javascript:
|
||||||
- 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML'
|
- 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML'
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to override the default MathJax configuration, you can do this by
|
If you want to override the default MathJax configuration, you can do this by
|
||||||
@ -234,7 +234,7 @@ In your `mkdocs.yml`, include it with:
|
|||||||
``` yaml
|
``` yaml
|
||||||
extra_javascript:
|
extra_javascript:
|
||||||
- 'javascripts/extra.js'
|
- 'javascripts/extra.js'
|
||||||
- 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML'
|
- 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML'
|
||||||
```
|
```
|
||||||
|
|
||||||
[20]: https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/
|
[20]: https://facelessuser.github.io/pymdown-extensions/extensions/arithmatex/
|
||||||
|
@ -286,6 +286,15 @@ Additionally, for GitHub, the number of stars and forks is shown.
|
|||||||
|
|
||||||
[15]: http://www.mkdocs.org/user-guide/configuration/#edit_uri
|
[15]: http://www.mkdocs.org/user-guide/configuration/#edit_uri
|
||||||
|
|
||||||
|
### Adding a favicon
|
||||||
|
|
||||||
|
Adding a favicon to your site is very easy. Simply set the following variable
|
||||||
|
via your project's `mkdocs.yml`:
|
||||||
|
|
||||||
|
``` yaml
|
||||||
|
site_favicon: 'images/favicon.ico'
|
||||||
|
```
|
||||||
|
|
||||||
### Adding a logo
|
### Adding a logo
|
||||||
|
|
||||||
Material makes it easy to add your logo. Your logo should have rectangular
|
Material makes it easy to add your logo. Your logo should have rectangular
|
||||||
|
@ -12,11 +12,21 @@ To determine the currently installed version, use the following command:
|
|||||||
|
|
||||||
``` sh
|
``` sh
|
||||||
pip show mkdocs-material | grep -E ^Version
|
pip show mkdocs-material | grep -E ^Version
|
||||||
# Version 1.6.1
|
# Version 1.6.2
|
||||||
```
|
```
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
* Fixed [#316][316]: Fatal error for git clone on Windows
|
||||||
|
* Fixed [#320][320]: Chrome 58 creates double underline for `abbr` tags
|
||||||
|
* Fixed [#323][323]: Ligatures rendered inside code blocks
|
||||||
|
* Fixed miscalculated sidebar height due to missing margin collapse
|
||||||
|
* Changed deprecated MathJax CDN to Cloudflare
|
||||||
|
|
||||||
|
[316]: https://github.com/squidfunk/mkdocs-material/issues/316
|
||||||
|
[320]: https://github.com/squidfunk/mkdocs-material/issues/320
|
||||||
|
[323]: https://github.com/squidfunk/mkdocs-material/issues/323
|
||||||
|
|
||||||
### 1.6.1 <small> _ April 23, 2017</small>
|
### 1.6.1 <small> _ April 23, 2017</small>
|
||||||
|
|
||||||
* Fixed following of active/focused element if search input is focused
|
* Fixed following of active/focused element if search input is focused
|
||||||
@ -42,7 +52,7 @@ pip show mkdocs-material | grep -E ^Version
|
|||||||
### 1.5.4 <small> _ April 8, 2017</small>
|
### 1.5.4 <small> _ April 8, 2017</small>
|
||||||
|
|
||||||
* Fixed broken highlighting for two or more search terms
|
* Fixed broken highlighting for two or more search terms
|
||||||
* Fixed missing search results when only a h1 is present
|
* Fixed missing search results when only a `h1` is present
|
||||||
* Fixed unresponsive overlay on Android
|
* Fixed unresponsive overlay on Android
|
||||||
|
|
||||||
### 1.5.3 <small> _ April 7, 2017</small>
|
### 1.5.3 <small> _ April 7, 2017</small>
|
||||||
|
@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import ecstatic from "ecstatic"
|
|
||||||
import * as http from "http"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Locals
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* Static file server */
|
|
||||||
let server = null
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Functions
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start static file server
|
|
||||||
*
|
|
||||||
* @param {string} directory - Directory to serve
|
|
||||||
* @param {number} port - Port to listen on
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const start = (directory, port, done) => {
|
|
||||||
server = http.createServer(ecstatic({
|
|
||||||
root: directory
|
|
||||||
}))
|
|
||||||
|
|
||||||
/* Listen and register signal handlers */
|
|
||||||
server.listen(port, "127.0.0.1", done)
|
|
||||||
for (const signal of ["SIGTERM", "SIGINT", "exit"])
|
|
||||||
process.on(signal, stop)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop static file server
|
|
||||||
*
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const stop = done => {
|
|
||||||
if (server) {
|
|
||||||
server.close(done)
|
|
||||||
server = null
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import launcher from "sauce-connect-launcher"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Locals
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* SauceConnect process */
|
|
||||||
let server = null
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Functions
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open SauceConnect tunnel
|
|
||||||
*
|
|
||||||
* @param {string} id - Unique identifier
|
|
||||||
* @param {string} username - SauceConnect username
|
|
||||||
* @param {string} accesskey - SauceConnect accesskey
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const start = (id, username, accesskey, done) => {
|
|
||||||
launcher({
|
|
||||||
username,
|
|
||||||
accessKey: accesskey,
|
|
||||||
tunnelIdentifier: id
|
|
||||||
}, (err, proc) => {
|
|
||||||
if (err)
|
|
||||||
throw new Error(err)
|
|
||||||
server = proc
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Register signal handlers */
|
|
||||||
for (const signal of ["SIGTERM", "SIGINT", "exit"])
|
|
||||||
process.on(signal, stop)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close SauceConnect tunnel
|
|
||||||
*
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const stop = done => {
|
|
||||||
if (server) {
|
|
||||||
server.close(done)
|
|
||||||
server = null
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import selenium from "selenium-standalone"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Locals
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* Selenium server */
|
|
||||||
let server = null
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Definition
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start Selenium
|
|
||||||
*
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const start = done => {
|
|
||||||
selenium.start({}, (err, proc) => {
|
|
||||||
|
|
||||||
/* Register signal handlers */
|
|
||||||
for (const signal of ["SIGTERM", "SIGINT", "exit"])
|
|
||||||
process.on(signal, stop)
|
|
||||||
if (err) {
|
|
||||||
|
|
||||||
/* Install selenium, if not present */
|
|
||||||
if (/^Missing(.*)chromedriver$/.test(err.message)) {
|
|
||||||
new Promise(resolve => {
|
|
||||||
selenium.install({}, resolve)
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Start selenium again */
|
|
||||||
.then(() => {
|
|
||||||
selenium.start({}, (err_, proc_) => {
|
|
||||||
server = proc_
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Otherwise, throw error */
|
|
||||||
} else {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remember process handle */
|
|
||||||
server = proc
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop Selenium
|
|
||||||
*
|
|
||||||
* @param {Function} done - Resolve callback
|
|
||||||
*/
|
|
||||||
export const stop = done => {
|
|
||||||
if (server) {
|
|
||||||
if (typeof done === "function")
|
|
||||||
server.on("exit", done)
|
|
||||||
server.kill()
|
|
||||||
server = null
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import path from "path"
|
|
||||||
import { Server, stopper } from "karma"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: start karma test runner
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default () => {
|
|
||||||
return done => {
|
|
||||||
new Server({
|
|
||||||
configFile: path.join(process.cwd(), "tests/karma.conf.js")
|
|
||||||
}, done).start()
|
|
||||||
|
|
||||||
/* Register signal handler for all relevant events */
|
|
||||||
for (const signal of ["SIGTERM", "SIGINT", "exit"])
|
|
||||||
process.on(signal, () => {
|
|
||||||
return stopper.stop({
|
|
||||||
port: 9876,
|
|
||||||
logLevel: "OFF"
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import clean from "del"
|
|
||||||
import vinyl from "vinyl-paths"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: clean files generated by visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default (gulp, config) => {
|
|
||||||
return () => {
|
|
||||||
return gulp.src([
|
|
||||||
`${config.tests.visual}/data`,
|
|
||||||
"./gemini-report"
|
|
||||||
])
|
|
||||||
.pipe(vinyl(clean))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import child from "child_process"
|
|
||||||
import path from "path"
|
|
||||||
import through from "through2"
|
|
||||||
import util from "gulp-util"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: generate visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default (gulp, config) => {
|
|
||||||
const theme = path.resolve(process.cwd(), config.views.build)
|
|
||||||
return () => {
|
|
||||||
return gulp.src(`${config.tests.visual}/suites/**/mkdocs.yml`)
|
|
||||||
.pipe(
|
|
||||||
through.obj(function(file, enc, done) {
|
|
||||||
if (file.isNull() || file.isStream())
|
|
||||||
return done()
|
|
||||||
|
|
||||||
/* Resolve test name and destination */
|
|
||||||
const name = path.relative(`${config.tests.visual}/suites`,
|
|
||||||
path.dirname(file.path))
|
|
||||||
const site = path.resolve(process.cwd(),
|
|
||||||
`${config.tests.visual}/data`, name, "_")
|
|
||||||
|
|
||||||
/* Generate test fixtures with freshly built theme */
|
|
||||||
const proc = child.spawnSync("mkdocs", [
|
|
||||||
"build", "--site-dir", site, "--theme-dir", theme
|
|
||||||
], {
|
|
||||||
cwd: path.dirname(file.path)
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Emit error, if any */
|
|
||||||
if (proc.status)
|
|
||||||
this.emit("error", new util.PluginError("mkdocs",
|
|
||||||
`Terminated with errors: ${proc.stderr.toString()}`))
|
|
||||||
|
|
||||||
/* Terminate */
|
|
||||||
done()
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,166 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import moniker from "moniker"
|
|
||||||
import path from "path"
|
|
||||||
import * as ecstatic from "~/lib/servers/ecstatic"
|
|
||||||
import * as sauce from "~/lib/servers/sauce-connect"
|
|
||||||
import * as selenium from "~/lib/servers/selenium"
|
|
||||||
|
|
||||||
import Gemini from "gemini"
|
|
||||||
import SauceLabs from "saucelabs"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Locals
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* SauceLabs job name */
|
|
||||||
const id = process.env.TRAVIS
|
|
||||||
? `Travis #${process.env.TRAVIS_BUILD_NUMBER}`
|
|
||||||
: `Local #${moniker.choose()}`
|
|
||||||
|
|
||||||
/* SauceLabs test results */
|
|
||||||
const passed = {}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: run visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default (gulp, config, args) => {
|
|
||||||
return done => {
|
|
||||||
|
|
||||||
/* Start static file server */
|
|
||||||
let error = false
|
|
||||||
new Promise(resolve => {
|
|
||||||
ecstatic.start(`${config.tests.visual}/data`, 8000, resolve)
|
|
||||||
|
|
||||||
/* Create and start test runner */
|
|
||||||
}).then(() => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
|
|
||||||
/* Start SauceConnect tunnel */
|
|
||||||
if (process.env.CI || process.env.SAUCE) {
|
|
||||||
if (!process.env.SAUCE_USERNAME ||
|
|
||||||
!process.env.SAUCE_ACCESS_KEY)
|
|
||||||
throw new Error(
|
|
||||||
"SauceConnect: please provide SAUCE_USERNAME " +
|
|
||||||
"and SAUCE_ACCESS_KEY")
|
|
||||||
|
|
||||||
/* Start tunnel, if credentials are given */
|
|
||||||
sauce.start(
|
|
||||||
id,
|
|
||||||
process.env.SAUCE_USERNAME,
|
|
||||||
process.env.SAUCE_ACCESS_KEY,
|
|
||||||
err => {
|
|
||||||
return err ? reject(err) : resolve(sauce)
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Start Selenium */
|
|
||||||
} else {
|
|
||||||
selenium.start(() => resolve(selenium))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Setup and run Gemini */
|
|
||||||
.then(runner => {
|
|
||||||
const setup = require(
|
|
||||||
path.join(process.cwd(), `${config.tests.visual}/config`,
|
|
||||||
process.env.CI || process.env.SAUCE
|
|
||||||
? "gemini.sauce-connect.json"
|
|
||||||
: "gemini.selenium.json"))
|
|
||||||
|
|
||||||
/* Add dynamic configuration to capabilities */
|
|
||||||
for (const key of Object.keys(setup.browsers)) {
|
|
||||||
const caps = setup.browsers[key].desiredCapabilities
|
|
||||||
caps.tunnelIdentifier = id
|
|
||||||
caps.public = "private"
|
|
||||||
caps.name = id
|
|
||||||
|
|
||||||
/* Adjust configuration for Travis CI */
|
|
||||||
if (process.env.CI && process.env.TRAVIS)
|
|
||||||
caps.public = "public"
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup Gemini and test listeners */
|
|
||||||
const gemini = new Gemini(setup)
|
|
||||||
if (process.env.CI || process.env.SAUCE) {
|
|
||||||
|
|
||||||
/* Initialize test run */
|
|
||||||
gemini.on(gemini.events.START_BROWSER, job => {
|
|
||||||
passed[job.sessionId] = true
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Update state of test run */
|
|
||||||
gemini.on(gemini.events.TEST_RESULT, job => {
|
|
||||||
passed[job.sessionId] = passed[job.sessionId] && job.equal
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run tests */
|
|
||||||
return gemini.test(`${config.tests.visual}/suites`, {
|
|
||||||
reporters: ["flat", "html"],
|
|
||||||
browsers: args.browser ? [].concat(args.browser) : null
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Return runner for graceful stop */
|
|
||||||
.then(status => {
|
|
||||||
error = status.failed + status.errored > 0
|
|
||||||
return runner
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Stop test runner */
|
|
||||||
.then(runner => {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
runner.stop(resolve)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Update SauceLabs jobs with test results */
|
|
||||||
.then(() => {
|
|
||||||
const saucelabs = new SauceLabs({
|
|
||||||
username: process.env.SAUCE_USERNAME,
|
|
||||||
password: process.env.SAUCE_ACCESS_KEY
|
|
||||||
})
|
|
||||||
const updates = Object.keys(passed).map(sessionId => {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
saucelabs.updateJob(sessionId, {
|
|
||||||
passed: passed[sessionId]
|
|
||||||
}, resolve)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
return Promise.all(updates)
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Stop static file server */
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
ecstatic.stop(() => {
|
|
||||||
return error
|
|
||||||
? done(new Error("Gemini terminated with errors"))
|
|
||||||
: done()
|
|
||||||
})
|
|
||||||
}, err => {
|
|
||||||
return done(new Error(err))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import moniker from "moniker"
|
|
||||||
import * as ecstatic from "~/lib/servers/ecstatic"
|
|
||||||
import * as sauce from "~/lib/servers/sauce-connect"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: run visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default (gulp, config) => {
|
|
||||||
return done => {
|
|
||||||
|
|
||||||
/* Start static file server */
|
|
||||||
new Promise(resolve => {
|
|
||||||
ecstatic.start(`${config.tests.visual}/data`, 8000, resolve)
|
|
||||||
|
|
||||||
/* Open SauceConnect tunnel */
|
|
||||||
}).then(() => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
|
|
||||||
/* Start SauceConnect tunnel */
|
|
||||||
if (process.env.CI || process.env.SAUCE) {
|
|
||||||
if (!process.env.SAUCE_USERNAME ||
|
|
||||||
!process.env.SAUCE_ACCESS_KEY)
|
|
||||||
throw new Error(
|
|
||||||
"SauceConnect: please provide SAUCE_USERNAME " +
|
|
||||||
"and SAUCE_ACCESS_KEY")
|
|
||||||
|
|
||||||
/* Open tunnel */
|
|
||||||
sauce.start(
|
|
||||||
`Local #${moniker.choose()}`,
|
|
||||||
process.env.SAUCE_USERNAME,
|
|
||||||
process.env.SAUCE_ACCESS_KEY,
|
|
||||||
err => {
|
|
||||||
return err ? reject(err) : resolve(sauce)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
resolve()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Close tunnel on CTRL-C */
|
|
||||||
.then(runner => {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
process.on("SIGINT", () => {
|
|
||||||
return runner
|
|
||||||
? runner.stop(resolve)
|
|
||||||
: resolve()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
/* Stop static file server */
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
ecstatic.stop(done)
|
|
||||||
}, err => {
|
|
||||||
return done(err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
*
|
|
||||||
* 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 NON-INFRINGEMENT. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import fs from "fs"
|
|
||||||
import path from "path"
|
|
||||||
import through from "through2"
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
|
||||||
* Task: update reference images for visual tests
|
|
||||||
* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
export default (gulp, config) => {
|
|
||||||
return () => {
|
|
||||||
const base = path.join(
|
|
||||||
process.cwd(), `${config.tests.visual}/config`)
|
|
||||||
|
|
||||||
/* Read Gemini configs and map browsers to screenshot directories */
|
|
||||||
const mapping = fs.readdirSync(base)
|
|
||||||
.reduce((result, filename) => {
|
|
||||||
return Object.assign(result, (gemini => {
|
|
||||||
return Object.keys(gemini.browsers)
|
|
||||||
.reduce((browsers, name) => {
|
|
||||||
browsers[name] = gemini.screenshotsDir
|
|
||||||
return browsers
|
|
||||||
}, {})
|
|
||||||
})(require(path.join(base, filename))))
|
|
||||||
}, {})
|
|
||||||
|
|
||||||
/* Prepare filenames */
|
|
||||||
const dest = path.join(process.cwd(), `${config.tests.visual}/baseline`)
|
|
||||||
return gulp.src("gemini-report/images/**/*~current.png")
|
|
||||||
.pipe(
|
|
||||||
through.obj(function(file, enc, done) {
|
|
||||||
if (file.isNull() || file.isStream())
|
|
||||||
return done()
|
|
||||||
|
|
||||||
/* Remove the state from the filename */
|
|
||||||
file.path = file.path.replace("~current", "")
|
|
||||||
|
|
||||||
/* Retrieve the folder for the environment of the baseline */
|
|
||||||
const folder = path.relative(dest,
|
|
||||||
mapping[path.basename(file.path, ".png")])
|
|
||||||
file.path = file.path.replace("images", `images/${folder}`)
|
|
||||||
|
|
||||||
/* Push file to next stage */
|
|
||||||
this.push(file)
|
|
||||||
done()
|
|
||||||
}))
|
|
||||||
|
|
||||||
/* Update reference images */
|
|
||||||
.pipe(gulp.dest(dest))
|
|
||||||
}
|
|
||||||
}
|
|
1
material/assets/stylesheets/application-e2807e330f.css
Normal file
@ -23,7 +23,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<link rel="shortcut icon" href="{{ base_url }}/assets/images/favicon.png">
|
<link rel="shortcut icon" href="{{ base_url }}/assets/images/favicon.png">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-1.6.1">
|
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-1.6.2">
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block htmltitle %}
|
{% block htmltitle %}
|
||||||
{% if page and page.meta.title %}
|
{% if page and page.meta.title %}
|
||||||
@ -38,7 +38,7 @@
|
|||||||
<script src="{{ base_url }}/assets/javascripts/modernizr-56ade86843.js"></script>
|
<script src="{{ base_url }}/assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block styles %}
|
{% block styles %}
|
||||||
<link rel="stylesheet" href="{{ base_url }}/assets/stylesheets/application-4d0d3f2fbf.css">
|
<link rel="stylesheet" href="{{ base_url }}/assets/stylesheets/application-e2807e330f.css">
|
||||||
{% if config.extra.palette %}
|
{% if config.extra.palette %}
|
||||||
<link rel="stylesheet" href="{{ base_url }}/assets/stylesheets/application-f78e5cb881.palette.css">
|
<link rel="stylesheet" href="{{ base_url }}/assets/stylesheets/application-f78e5cb881.palette.css">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
21
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mkdocs-material",
|
"name": "mkdocs-material",
|
||||||
"version": "1.6.1",
|
"version": "1.6.2",
|
||||||
"description": "A Material Design theme for MkDocs",
|
"description": "A Material Design theme for MkDocs",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"mkdocs",
|
"mkdocs",
|
||||||
@ -38,7 +38,7 @@
|
|||||||
"escape-string-regexp": "^1.0.5"
|
"escape-string-regexp": "^1.0.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^6.7.3",
|
"autoprefixer": "^7.0.1",
|
||||||
"babel-core": "^6.23.0",
|
"babel-core": "^6.23.0",
|
||||||
"babel-eslint": "^7.1.1",
|
"babel-eslint": "^7.1.1",
|
||||||
"babel-loader": "^7.0.0",
|
"babel-loader": "^7.0.0",
|
||||||
@ -50,13 +50,12 @@
|
|||||||
"babel-root-import": "^4.1.5",
|
"babel-root-import": "^4.1.5",
|
||||||
"chalk": "^1.1.3",
|
"chalk": "^1.1.3",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"css-mqpacker": "^5.0.1",
|
"css-mqpacker": "^6.0.0",
|
||||||
"custom-event-polyfill": "^0.3.0",
|
"custom-event-polyfill": "^0.3.0",
|
||||||
"del": "^2.2.2",
|
"del": "^2.2.2",
|
||||||
"ecstatic": "^2.1.0",
|
|
||||||
"eslint": "^3.16.0",
|
"eslint": "^3.16.0",
|
||||||
"fastclick": "^1.0.6",
|
"fastclick": "^1.0.6",
|
||||||
"flow-bin": "^0.44.0",
|
"flow-bin": "^0.46.0",
|
||||||
"flow-jsdoc": "^0.3.0",
|
"flow-jsdoc": "^0.3.0",
|
||||||
"git-hooks": "^1.1.7",
|
"git-hooks": "^1.1.7",
|
||||||
"gulp": "^3.9.1",
|
"gulp": "^3.9.1",
|
||||||
@ -68,7 +67,7 @@
|
|||||||
"gulp-ignore": "^2.0.2",
|
"gulp-ignore": "^2.0.2",
|
||||||
"gulp-modernizr": "1.0.0-alpha",
|
"gulp-modernizr": "1.0.0-alpha",
|
||||||
"gulp-plumber": "^1.1.0",
|
"gulp-plumber": "^1.1.0",
|
||||||
"gulp-postcss": "^6.2.0",
|
"gulp-postcss": "^7.0.0",
|
||||||
"gulp-remove-empty-lines": "0.0.8",
|
"gulp-remove-empty-lines": "0.0.8",
|
||||||
"gulp-replace": "^0.5.4",
|
"gulp-replace": "^0.5.4",
|
||||||
"gulp-rev": "^7.1.2",
|
"gulp-rev": "^7.1.2",
|
||||||
@ -95,15 +94,7 @@
|
|||||||
"webpack": "^2.2.1",
|
"webpack": "^2.2.1",
|
||||||
"webpack-stream": "^3.2.0",
|
"webpack-stream": "^3.2.0",
|
||||||
"whatwg-fetch": "^2.0.1",
|
"whatwg-fetch": "^2.0.1",
|
||||||
"yargs": "^7.0.2"
|
"yargs": "^8.0.1"
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"eslint-plugin-mocha": "^4.8.0",
|
|
||||||
"gemini": "^4.14.3",
|
|
||||||
"moniker": "^0.1.2",
|
|
||||||
"sauce-connect-launcher": "^1.2.0",
|
|
||||||
"saucelabs": "^1.4.0",
|
|
||||||
"selenium-standalone": "^6.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 5.0.0"
|
"node": ">= 5.0.0"
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
|
|
||||||
# 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 NON-INFRINGEMENT. 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.
|
|
||||||
|
|
||||||
# Check if "yarn install" was executed
|
|
||||||
if [[ ! -d "$(yarn bin)" ]]; then
|
|
||||||
echo "\"node_modules\" not found:"
|
|
||||||
echo "yarn install"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run command
|
|
||||||
"$(yarn bin)"/gulp tests:visual:run --clean --no-optimize "$@"
|
|
@ -1,31 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
|
|
||||||
# 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 NON-INFRINGEMENT. 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.
|
|
||||||
|
|
||||||
# Check if "yarn install" was executed
|
|
||||||
if [[ ! -d "$(yarn bin)" ]]; then
|
|
||||||
echo "\"node_modules\" not found:"
|
|
||||||
echo "yarn install"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run command
|
|
||||||
"$(yarn bin)"/gulp tests:visual:session "$@"
|
|
@ -1,31 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright (c) 2016-2017 Martin Donath <martin.donath@squidfunk.com>
|
|
||||||
|
|
||||||
# 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 NON-INFRINGEMENT. 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.
|
|
||||||
|
|
||||||
# Check if "yarn install" was executed
|
|
||||||
if [[ ! -d "$(yarn bin)" ]]; then
|
|
||||||
echo "\"node_modules\" not found:"
|
|
||||||
echo "yarn install"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run command
|
|
||||||
"$(yarn bin)"/gulp tests:visual:update "$@"
|
|
@ -44,7 +44,7 @@ pre,
|
|||||||
code,
|
code,
|
||||||
kbd {
|
kbd {
|
||||||
color: $md-color-black;
|
color: $md-color-black;
|
||||||
font-feature-settings: "kern", "liga";
|
font-feature-settings: "kern";
|
||||||
font-family: "Courier New", Courier, monospace;
|
font-family: "Courier New", Courier, monospace;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
@ -285,6 +285,7 @@ kbd {
|
|||||||
// Abbreviations
|
// Abbreviations
|
||||||
abbr {
|
abbr {
|
||||||
border-bottom: 0.1rem dotted $md-color-black--light;
|
border-bottom: 0.1rem dotted $md-color-black--light;
|
||||||
|
text-decoration: none;
|
||||||
cursor: help;
|
cursor: help;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ $md-toggle__drawer--checked:
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Stretch container to viewport and set base font-size to 10px for simple
|
// Stretch container to viewport and set base font-size to 10px for simple
|
||||||
// calculations base on relative ems (rems).
|
// calculations base on relative ems (rems)
|
||||||
html {
|
html {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
font-size: 62.5%;
|
font-size: 62.5%;
|
||||||
@ -49,7 +49,7 @@ html {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stretch body to container and leave room for footer.
|
// Stretch body to container and leave room for footer
|
||||||
body {
|
body {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -96,7 +96,7 @@ hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Content wrapper - use display: table to make variable-height sticky footers
|
// Content wrapper - use display: table to make variable-height sticky footers
|
||||||
// work and fixed table-layout for IE, taken from http://bit.ly/2hZohXL
|
// work and fixed table-layout for IE, see http://bit.ly/2hZohXL
|
||||||
.md-container {
|
.md-container {
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -114,6 +114,10 @@ hr {
|
|||||||
&__inner {
|
&__inner {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
padding-top: 2.4rem + 0.6rem;
|
padding-top: 2.4rem + 0.6rem;
|
||||||
|
// Hack: induce margin-collapse, because otherwise the sidebar height is
|
||||||
|
// not calculated correctly and the overflow property on this element must
|
||||||
|
// be left in initial state for targetted link offsets to work properly
|
||||||
|
padding-bottom: 0.1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"globals": {
|
|
||||||
"gemini": true
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"no-loop-func": 0
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.1 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.0 KiB |