From b6793b61796fceedc0d86c0caebb5c0fcc38b2a7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2019 06:13:59 +0000 Subject: [PATCH 01/95] Bump symfony/process from 4.3.4 to 4.3.5 Bumps [symfony/process](https://github.com/symfony/process) from 4.3.4 to 4.3.5. - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/process/compare/v4.3.4...v4.3.5) Signed-off-by: dependabot-preview[bot] --- composer.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/composer.lock b/composer.lock index dffd4ef..0290e2a 100644 --- a/composer.lock +++ b/composer.lock @@ -543,18 +543,18 @@ "authors": [ { "name": "Geert Bergman", - "role": "Project Author", - "homepage": "http://www.scrivo.org/" + "homepage": "http://www.scrivo.org/", + "role": "Project Author" }, { "name": "Vladimir Jimenez", - "role": "Contributor", - "homepage": "https://allejo.io" + "homepage": "https://allejo.io", + "role": "Contributor" }, { "name": "Martin Folkers", - "role": "Contributor", - "homepage": "https://twobrain.io" + "homepage": "https://twobrain.io", + "role": "Contributor" } ], "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", @@ -1183,16 +1183,16 @@ }, { "name": "symfony/process", - "version": "v4.3.4", + "version": "v4.3.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a" + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/e89969c00d762349f078db1128506f7f3dcc0d4a", - "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a", + "url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b", + "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b", "shasum": "" }, "require": { @@ -1228,7 +1228,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-08-26T08:26:39+00:00" + "time": "2019-09-26T21:17:10+00:00" }, { "name": "symfony/service-contracts", @@ -1570,8 +1570,8 @@ "authors": [ { "name": "Frank Kleine", - "role": "Developer", - "homepage": "http://frankkleine.de/" + "homepage": "http://frankkleine.de/", + "role": "Developer" } ], "description": "Virtual file system to mock the real file system in unit tests.", @@ -2085,8 +2085,8 @@ "authors": [ { "name": "Sebastian Bergmann", - "role": "lead", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], "description": "Utility class for timing", From edfc9f0cc0e5f23fe590cbbd2604070ede7b921d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2019 06:13:39 +0000 Subject: [PATCH 02/95] Bump symfony/console from 4.3.4 to 4.3.5 Bumps [symfony/console](https://github.com/symfony/console) from 4.3.4 to 4.3.5. - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/console/compare/v4.3.4...v4.3.5) Signed-off-by: dependabot-preview[bot] --- composer.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index 0290e2a..e49d6f3 100644 --- a/composer.lock +++ b/composer.lock @@ -569,16 +569,16 @@ }, { "name": "symfony/console", - "version": "v4.3.4", + "version": "v4.3.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "de63799239b3881b8a08f8481b22348f77ed7b36" + "reference": "929ddf360d401b958f611d44e726094ab46a7369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/de63799239b3881b8a08f8481b22348f77ed7b36", - "reference": "de63799239b3881b8a08f8481b22348f77ed7b36", + "url": "https://api.github.com/repos/symfony/console/zipball/929ddf360d401b958f611d44e726094ab46a7369", + "reference": "929ddf360d401b958f611d44e726094ab46a7369", "shasum": "" }, "require": { @@ -640,7 +640,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-08-26T08:26:39+00:00" + "time": "2019-10-07T12:36:49+00:00" }, { "name": "symfony/http-foundation", @@ -1232,16 +1232,16 @@ }, { "name": "symfony/service-contracts", - "version": "v1.1.6", + "version": "v1.1.7", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3" + "reference": "ffcde9615dc5bb4825b9f6aed07716f1f57faae0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ea7263d6b6d5f798b56a45a5b8d686725f2719a3", - "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffcde9615dc5bb4825b9f6aed07716f1f57faae0", + "reference": "ffcde9615dc5bb4825b9f6aed07716f1f57faae0", "shasum": "" }, "require": { @@ -1286,7 +1286,7 @@ "interoperability", "standards" ], - "time": "2019-08-20T14:44:19+00:00" + "time": "2019-09-17T11:12:18+00:00" }, { "name": "symfony/yaml", From d79030ab2cd777280ce1e645961d6ba939b10b82 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2019 06:13:20 +0000 Subject: [PATCH 03/95] Bump symfony/http-foundation from 4.3.4 to 4.3.5 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.3.4 to 4.3.5. - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.3.4...v4.3.5) Signed-off-by: dependabot-preview[bot] --- composer.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index e49d6f3..81612a8 100644 --- a/composer.lock +++ b/composer.lock @@ -644,16 +644,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.3.4", + "version": "v4.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d804bea118ff340a12e22a79f9c7e7eb56b35adc" + "reference": "76590ced16d4674780863471bae10452b79210a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d804bea118ff340a12e22a79f9c7e7eb56b35adc", - "reference": "d804bea118ff340a12e22a79f9c7e7eb56b35adc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/76590ced16d4674780863471bae10452b79210a5", + "reference": "76590ced16d4674780863471bae10452b79210a5", "shasum": "" }, "require": { @@ -695,7 +695,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-08-26T08:55:16+00:00" + "time": "2019-10-04T19:48:13+00:00" }, { "name": "symfony/intl", @@ -774,16 +774,16 @@ }, { "name": "symfony/mime", - "version": "v4.3.4", + "version": "v4.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "987a05df1c6ac259b34008b932551353f4f408df" + "reference": "32f71570547b91879fdbd9cf50317d556ae86916" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/987a05df1c6ac259b34008b932551353f4f408df", - "reference": "987a05df1c6ac259b34008b932551353f4f408df", + "url": "https://api.github.com/repos/symfony/mime/zipball/32f71570547b91879fdbd9cf50317d556ae86916", + "reference": "32f71570547b91879fdbd9cf50317d556ae86916", "shasum": "" }, "require": { @@ -829,7 +829,7 @@ "mime", "mime-type" ], - "time": "2019-08-22T08:16:11+00:00" + "time": "2019-09-19T17:00:15+00:00" }, { "name": "symfony/polyfill-ctype", From 0d7323225073cd6100f3bfb4c07caad605acce6f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2019 06:11:25 +0000 Subject: [PATCH 04/95] Bump guzzlehttp/guzzle from 6.3.3 to 6.4.1 Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 6.3.3 to 6.4.1. - [Release notes](https://github.com/guzzle/guzzle/releases) - [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md) - [Commits](https://github.com/guzzle/guzzle/compare/6.3.3...6.4.1) Signed-off-by: dependabot-preview[bot] --- composer.lock | 57 ++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/composer.lock b/composer.lock index 81612a8..f746144 100644 --- a/composer.lock +++ b/composer.lock @@ -8,27 +8,28 @@ "packages": [ { "name": "guzzlehttp/guzzle", - "version": "6.3.3", + "version": "6.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + "reference": "0895c932405407fd3a7368b6910c09a24d26db11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0895c932405407fd3a7368b6910c09a24d26db11", + "reference": "0895c932405407fd3a7368b6910c09a24d26db11", "shasum": "" }, "require": { + "ext-json": "*", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", + "guzzlehttp/psr7": "^1.6.1", "php": ">=5.5" }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" + "psr/log": "^1.1" }, "suggest": { "psr/log": "Required for using the Log middleware" @@ -40,12 +41,12 @@ } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\": "src/" - } + }, + "files": [ + "src/functions_include.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -69,7 +70,7 @@ "rest", "web service" ], - "time": "2018-04-22T15:46:56+00:00" + "time": "2019-10-23T15:58:00+00:00" }, { "name": "guzzlehttp/promises", @@ -124,33 +125,37 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.5.2", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "9f83dded91781a01c63574e387eaa769be769115" + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", - "reference": "9f83dded91781a01c63574e387eaa769be769115", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "" }, "require": { "php": ">=5.4.0", "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5" + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { + "ext-zlib": "*", "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -187,7 +192,7 @@ "uri", "url" ], - "time": "2018-12-04T20:46:45+00:00" + "time": "2019-07-01T23:21:34+00:00" }, { "name": "league/commonmark", @@ -462,24 +467,24 @@ }, { "name": "ralouphie/getallheaders", - "version": "2.0.5", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~3.7.0", - "satooshi/php-coveralls": ">=1.0" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { @@ -498,7 +503,7 @@ } ], "description": "A polyfill for getallheaders.", - "time": "2016-02-11T07:05:27+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { "name": "scrivo/highlight.php", From d6661c3cffdbb5859f4a56bc3c43aeba7dba302b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 06:35:13 +0000 Subject: [PATCH 05/95] Bump phpunit/phpunit from 7.5.16 to 7.5.17 Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 7.5.16 to 7.5.17. - [Release notes](https://github.com/sebastianbergmann/phpunit/releases) - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/7.5.17/ChangeLog-7.5.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/7.5.16...7.5.17) Signed-off-by: dependabot-preview[bot] --- composer.lock | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/composer.lock b/composer.lock index f746144..2a05820 100644 --- a/composer.lock +++ b/composer.lock @@ -1837,22 +1837,22 @@ }, { "name": "phpspec/prophecy", - "version": "1.8.1", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76" + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76", - "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, @@ -1896,7 +1896,7 @@ "spy", "stub" ], - "time": "2019-06-13T12:50:23+00:00" + "time": "2019-10-03T11:07:50+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2103,16 +2103,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a" + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e899757bb3df5ff6e95089132f32cd59aac2220a", - "reference": "e899757bb3df5ff6e95089132f32cd59aac2220a", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", "shasum": "" }, "require": { @@ -2148,20 +2148,20 @@ "keywords": [ "tokenizer" ], - "time": "2019-07-25T05:29:42+00:00" + "time": "2019-09-17T06:23:10+00:00" }, { "name": "phpunit/phpunit", - "version": "7.5.16", + "version": "7.5.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "316afa6888d2562e04aeb67ea7f2017a0eb41661" + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/316afa6888d2562e04aeb67ea7f2017a0eb41661", - "reference": "316afa6888d2562e04aeb67ea7f2017a0eb41661", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4c92a15296e58191a4cd74cff3b34fc8e374174a", + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a", "shasum": "" }, "require": { @@ -2232,7 +2232,7 @@ "testing", "xunit" ], - "time": "2019-09-14T09:08:39+00:00" + "time": "2019-10-28T10:37:36+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", From 94767de31a3f94edf48bc32e8604495de68f1198 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Mon, 28 Oct 2019 11:22:12 -0400 Subject: [PATCH 06/95] Add user of custom theme to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e4bfc27..3ae19f7 100755 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ This is a list of sites using Daux.io: * [Soisy](https://doc.soisy.it/) * [Vulkan Tutorial](https://vulkan-tutorial.com) * [3Q](https://docs.3q.video/) + * [The Advanced RSS Environment](https://thearsse.com/manual/) - With the default Theme * [Daux.io](https://daux.io/) * [DoctrineWatcher](https://dsentker.github.io/WatcherDocumentation/) From 8cbe53097dab7af1718ae47689dae86359215653 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2019 12:50:56 +0000 Subject: [PATCH 07/95] Bump mikey179/vfsstream from 1.6.7 to 1.6.8 Bumps [mikey179/vfsstream](https://github.com/bovigo/vfsStream) from 1.6.7 to 1.6.8. - [Release notes](https://github.com/bovigo/vfsStream/releases) - [Changelog](https://github.com/bovigo/vfsStream/blob/v1.6.8/CHANGELOG.md) - [Commits](https://github.com/bovigo/vfsStream/compare/v1.6.7...v1.6.8) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 2a05820..b79c696 100644 --- a/composer.lock +++ b/composer.lock @@ -1539,16 +1539,16 @@ }, { "name": "mikey179/vfsstream", - "version": "v1.6.7", + "version": "v1.6.8", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", - "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb" + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb", - "reference": "2b544ac3a21bcc4dde5d90c4ae8d06f4319055fb", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", + "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", "shasum": "" }, "require": { @@ -1581,7 +1581,7 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2019-08-01T01:38:37+00:00" + "time": "2019-10-30T15:31:00+00:00" }, { "name": "phar-io/manifest", From 097ebbf555cb27a669ec2c6fe4167a867dd66e52 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2019 12:49:15 +0000 Subject: [PATCH 08/95] Bump flexsearch from 0.6.30 to 0.6.32 Bumps [flexsearch](https://github.com/nextapps-de/flexsearch) from 0.6.30 to 0.6.32. - [Release notes](https://github.com/nextapps-de/flexsearch/releases) - [Changelog](https://github.com/nextapps-de/flexsearch/blob/master/CHANGELOG.md) - [Commits](https://github.com/nextapps-de/flexsearch/commits) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d6ae45b..53cacf3 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "@swissquote/crafty-preset-postcss": "^1.8.0", "@swissquote/crafty-runner-gulp": "^1.8.0", "@swissquote/crafty-runner-rollup": "^1.8.0", - "flexsearch": "^0.6.30", + "flexsearch": "^0.6.32", "preact": "^10.0.0-rc.3" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index 21f4681..3c6242e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3470,10 +3470,10 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= -flexsearch@^0.6.30: - version "0.6.30" - resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.6.30.tgz#d3f14389c9a4e5758b12290b3bafcd383cdc53de" - integrity sha512-zDBhMWbM65TsJJPBYoxV+MENufDylNtMz38e6MLTShwwuHeRNBxRYGAxR0DlwSkC4u+X2S8mlcdROWXMDleNwQ== +flexsearch@^0.6.32: + version "0.6.32" + resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.6.32.tgz#1e20684d317af65baa445cdd9864a5f5b320f510" + integrity sha512-EF1BWkhwoeLtbIlDbY/vDSLBen/E5l/f1Vg7iX5CDymQCamcx1vhlc3tIZxIDplPjgi0jhG37c67idFbjg+v+Q== flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" From 6f6b0df4a541de87a6c1347e6bd9d56db47c6dc4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2019 12:33:06 +0000 Subject: [PATCH 09/95] Bump symfony/http-foundation from 4.3.5 to 4.3.6 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.3.5 to 4.3.6. - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.3.5...v4.3.6) Signed-off-by: dependabot-preview[bot] --- composer.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index b79c696..d0c669c 100644 --- a/composer.lock +++ b/composer.lock @@ -649,16 +649,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.3.5", + "version": "v4.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "76590ced16d4674780863471bae10452b79210a5" + "reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/76590ced16d4674780863471bae10452b79210a5", - "reference": "76590ced16d4674780863471bae10452b79210a5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/38f63e471cda9d37ac06e76d14c5ea2ec5887051", + "reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051", "shasum": "" }, "require": { @@ -700,7 +700,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-10-04T19:48:13+00:00" + "time": "2019-10-30T12:58:49+00:00" }, { "name": "symfony/intl", @@ -779,16 +779,16 @@ }, { "name": "symfony/mime", - "version": "v4.3.5", + "version": "v4.3.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "32f71570547b91879fdbd9cf50317d556ae86916" + "reference": "3c0e197529da6e59b217615ba8ee7604df88b551" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/32f71570547b91879fdbd9cf50317d556ae86916", - "reference": "32f71570547b91879fdbd9cf50317d556ae86916", + "url": "https://api.github.com/repos/symfony/mime/zipball/3c0e197529da6e59b217615ba8ee7604df88b551", + "reference": "3c0e197529da6e59b217615ba8ee7604df88b551", "shasum": "" }, "require": { @@ -834,7 +834,7 @@ "mime", "mime-type" ], - "time": "2019-09-19T17:00:15+00:00" + "time": "2019-10-30T12:58:49+00:00" }, { "name": "symfony/polyfill-ctype", From c62eeca2d8582c59ea291e692e227a85f9afb7dc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2019 12:33:09 +0000 Subject: [PATCH 10/95] Bump symfony/process from 4.3.5 to 4.3.6 Bumps [symfony/process](https://github.com/symfony/process) from 4.3.5 to 4.3.6. - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/process/compare/v4.3.5...v4.3.6) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index d0c669c..7fed3d3 100644 --- a/composer.lock +++ b/composer.lock @@ -1188,16 +1188,16 @@ }, { "name": "symfony/process", - "version": "v4.3.5", + "version": "v4.3.6", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b" + "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/50556892f3cc47d4200bfd1075314139c4c9ff4b", - "reference": "50556892f3cc47d4200bfd1075314139c4c9ff4b", + "url": "https://api.github.com/repos/symfony/process/zipball/3b2e0cb029afbb0395034509291f21191d1a4db0", + "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0", "shasum": "" }, "require": { @@ -1233,7 +1233,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-09-26T21:17:10+00:00" + "time": "2019-10-28T17:07:32+00:00" }, { "name": "symfony/service-contracts", From 1c060ce7f79fa73239ce717644c1b2a3b0fbba1f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2019 12:31:47 +0000 Subject: [PATCH 11/95] Bump symfony/console from 4.3.5 to 4.3.6 Bumps [symfony/console](https://github.com/symfony/console) from 4.3.5 to 4.3.6. - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/console/compare/v4.3.5...v4.3.6) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 7fed3d3..51523ba 100644 --- a/composer.lock +++ b/composer.lock @@ -574,16 +574,16 @@ }, { "name": "symfony/console", - "version": "v4.3.5", + "version": "v4.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "929ddf360d401b958f611d44e726094ab46a7369" + "reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/929ddf360d401b958f611d44e726094ab46a7369", - "reference": "929ddf360d401b958f611d44e726094ab46a7369", + "url": "https://api.github.com/repos/symfony/console/zipball/136c4bd62ea871d00843d1bc0316de4c4a84bb78", + "reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78", "shasum": "" }, "require": { @@ -645,7 +645,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-10-07T12:36:49+00:00" + "time": "2019-10-30T12:58:49+00:00" }, { "name": "symfony/http-foundation", From 622313e962f350e6017d46cf1473ec66e8319c06 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2019 06:19:41 +0000 Subject: [PATCH 12/95] Bump symfony/console from 4.3.6 to 4.3.7 Bumps [symfony/console](https://github.com/symfony/console) from 4.3.6 to 4.3.7. - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/console/compare/v4.3.6...v4.3.7) Signed-off-by: dependabot-preview[bot] --- composer.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index 51523ba..bf8d2f0 100644 --- a/composer.lock +++ b/composer.lock @@ -574,16 +574,16 @@ }, { "name": "symfony/console", - "version": "v4.3.6", + "version": "v4.3.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78" + "reference": "d2e39dbddae68560fa6be0c576da6ad4e945b90d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/136c4bd62ea871d00843d1bc0316de4c4a84bb78", - "reference": "136c4bd62ea871d00843d1bc0316de4c4a84bb78", + "url": "https://api.github.com/repos/symfony/console/zipball/d2e39dbddae68560fa6be0c576da6ad4e945b90d", + "reference": "d2e39dbddae68560fa6be0c576da6ad4e945b90d", "shasum": "" }, "require": { @@ -645,7 +645,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-10-30T12:58:49+00:00" + "time": "2019-11-05T15:00:49+00:00" }, { "name": "symfony/http-foundation", @@ -1237,16 +1237,16 @@ }, { "name": "symfony/service-contracts", - "version": "v1.1.7", + "version": "v1.1.8", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "ffcde9615dc5bb4825b9f6aed07716f1f57faae0" + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffcde9615dc5bb4825b9f6aed07716f1f57faae0", - "reference": "ffcde9615dc5bb4825b9f6aed07716f1f57faae0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", "shasum": "" }, "require": { @@ -1291,7 +1291,7 @@ "interoperability", "standards" ], - "time": "2019-09-17T11:12:18+00:00" + "time": "2019-10-14T12:27:06+00:00" }, { "name": "symfony/yaml", From 0d8ca1663e8937e1e757c5ea3b06fce9efe541c7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2019 06:19:15 +0000 Subject: [PATCH 13/95] Bump symfony/process from 4.3.6 to 4.3.7 Bumps [symfony/process](https://github.com/symfony/process) from 4.3.6 to 4.3.7. - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/process/compare/v4.3.6...v4.3.7) Signed-off-by: dependabot-preview[bot] --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index bf8d2f0..52814b5 100644 --- a/composer.lock +++ b/composer.lock @@ -1188,7 +1188,7 @@ }, { "name": "symfony/process", - "version": "v4.3.6", + "version": "v4.3.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", From f584868db30626c6eb5c999c6fc04ff0adbb3dbc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2019 06:18:49 +0000 Subject: [PATCH 14/95] Bump symfony/http-foundation from 4.3.6 to 4.3.7 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.3.6 to 4.3.7. - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.3.6...v4.3.7) Signed-off-by: dependabot-preview[bot] --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 52814b5..c4a6bc6 100644 --- a/composer.lock +++ b/composer.lock @@ -649,16 +649,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.3.6", + "version": "v4.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051" + "reference": "514e5bbcbc783465c6fce5a7b2e28657f2e114b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/38f63e471cda9d37ac06e76d14c5ea2ec5887051", - "reference": "38f63e471cda9d37ac06e76d14c5ea2ec5887051", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/514e5bbcbc783465c6fce5a7b2e28657f2e114b7", + "reference": "514e5bbcbc783465c6fce5a7b2e28657f2e114b7", "shasum": "" }, "require": { @@ -700,7 +700,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-10-30T12:58:49+00:00" + "time": "2019-11-05T14:48:09+00:00" }, { "name": "symfony/intl", @@ -779,7 +779,7 @@ }, { "name": "symfony/mime", - "version": "v4.3.6", + "version": "v4.3.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", From 7b73df9a8c21d8fe024b78ec3eef0969ea57d82e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2019 11:02:43 +0000 Subject: [PATCH 15/95] [Security] Bump symfony/mime from 4.3.7 to 4.3.8 Bumps [symfony/mime](https://github.com/symfony/mime) from 4.3.7 to 4.3.8. **This update includes a security fix.** - [Release notes](https://github.com/symfony/mime/releases) - [Changelog](https://github.com/symfony/mime/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/mime/compare/v4.3.7...v4.3.8) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index c4a6bc6..ec1be60 100644 --- a/composer.lock +++ b/composer.lock @@ -779,16 +779,16 @@ }, { "name": "symfony/mime", - "version": "v4.3.7", + "version": "v4.3.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "3c0e197529da6e59b217615ba8ee7604df88b551" + "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/3c0e197529da6e59b217615ba8ee7604df88b551", - "reference": "3c0e197529da6e59b217615ba8ee7604df88b551", + "url": "https://api.github.com/repos/symfony/mime/zipball/22aecf6b11638ef378fab25d6c5a2da8a31a1448", + "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448", "shasum": "" }, "require": { @@ -834,7 +834,7 @@ "mime", "mime-type" ], - "time": "2019-10-30T12:58:49+00:00" + "time": "2019-11-12T13:10:02+00:00" }, { "name": "symfony/polyfill-ctype", From a9f15674b325a8931dc9bd7421289393c40aa10c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2019 11:32:16 +0000 Subject: [PATCH 16/95] [Security] Bump symfony/http-foundation from 4.3.7 to 4.3.8 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.3.7 to 4.3.8. **This update includes a security fix.** - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.3.7...v4.3.8) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index ec1be60..a15d2d0 100644 --- a/composer.lock +++ b/composer.lock @@ -649,16 +649,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.3.7", + "version": "v4.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "514e5bbcbc783465c6fce5a7b2e28657f2e114b7" + "reference": "cabe67275034e173350e158f3b1803d023880227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/514e5bbcbc783465c6fce5a7b2e28657f2e114b7", - "reference": "514e5bbcbc783465c6fce5a7b2e28657f2e114b7", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cabe67275034e173350e158f3b1803d023880227", + "reference": "cabe67275034e173350e158f3b1803d023880227", "shasum": "" }, "require": { @@ -700,7 +700,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-11-05T14:48:09+00:00" + "time": "2019-11-12T13:07:20+00:00" }, { "name": "symfony/intl", From b413b7d72ea8ccb721735715216461be1d37734f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 06:26:17 +0000 Subject: [PATCH 17/95] Bump symfony/process from 4.3.7 to 4.3.8 Bumps [symfony/process](https://github.com/symfony/process) from 4.3.7 to 4.3.8. - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/process/compare/v4.3.7...v4.3.8) Signed-off-by: dependabot-preview[bot] --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index a15d2d0..c807936 100644 --- a/composer.lock +++ b/composer.lock @@ -1188,7 +1188,7 @@ }, { "name": "symfony/process", - "version": "v4.3.7", + "version": "v4.3.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", From 2d89e13f8eca24265ddbfb1a6da8a7e71e7a410e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 06:25:53 +0000 Subject: [PATCH 18/95] Bump symfony/console from 4.3.7 to 4.3.8 Bumps [symfony/console](https://github.com/symfony/console) from 4.3.7 to 4.3.8. - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/console/compare/v4.3.7...v4.3.8) Signed-off-by: dependabot-preview[bot] --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index c807936..bd85110 100644 --- a/composer.lock +++ b/composer.lock @@ -574,16 +574,16 @@ }, { "name": "symfony/console", - "version": "v4.3.7", + "version": "v4.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d2e39dbddae68560fa6be0c576da6ad4e945b90d" + "reference": "831424efae0a1fe6642784bd52aae14ece6538e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d2e39dbddae68560fa6be0c576da6ad4e945b90d", - "reference": "d2e39dbddae68560fa6be0c576da6ad4e945b90d", + "url": "https://api.github.com/repos/symfony/console/zipball/831424efae0a1fe6642784bd52aae14ece6538e6", + "reference": "831424efae0a1fe6642784bd52aae14ece6538e6", "shasum": "" }, "require": { @@ -645,7 +645,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-11-05T15:00:49+00:00" + "time": "2019-11-13T07:29:07+00:00" }, { "name": "symfony/http-foundation", From bac07a17e8c899697bcbdd7829c2e78111f3000e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 14 Nov 2019 08:17:17 +0100 Subject: [PATCH 19/95] Add GitHub Actions --- .github/workflows/php.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/php.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml new file mode 100644 index 0000000..d3ecd50 --- /dev/null +++ b/.github/workflows/php.yml @@ -0,0 +1,20 @@ +name: CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run test suite + run: composer run-script test From 0397d700707b19ef0c912fe3e4f0831792b08779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 14 Nov 2019 08:19:32 +0100 Subject: [PATCH 20/95] Add cache for vendor --- .github/workflows/php.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d3ecd50..36e0007 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -13,6 +13,15 @@ jobs: - name: Validate composer.json and composer.lock run: composer validate + - name: Cache vendor + uses: actions/cache@v1 + with: + path: node_modules + key: ${{ runner.OS }}-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.OS }}-build-${{ env.cache-name }}- + ${{ runner.OS }}-build- + - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest From 2b259e9f2bff7d2ffcbfabef6f73556d9f82ca81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 14 Nov 2019 08:26:13 +0100 Subject: [PATCH 21/95] Multiple OS and PHP Versions --- .github/workflows/php.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 36e0007..601533d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -4,12 +4,25 @@ on: [push] jobs: build: + strategy: + max-parallel: 15 + matrix: + operating-system: [ubuntu-latest, windows-latest, macOS-latest] + php-versions: ['7.1', '7.2', '7.3'] - runs-on: ubuntu-latest + name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} + runs-on: ${{ matrix.operating-system }} steps: - uses: actions/checkout@v1 + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extension-csv: mbstring, xdebug + coverage: xdebug + - name: Validate composer.json and composer.lock run: composer validate @@ -17,9 +30,10 @@ jobs: uses: actions/cache@v1 with: path: node_modules - key: ${{ runner.OS }}-build-${{ hashFiles('**/composer.lock') }} + key: ${{ runner.OS }}-build-${{ matrix.php-versions }}-${{ hashFiles('**/composer.lock') }} restore-keys: | - ${{ runner.OS }}-build-${{ env.cache-name }}- + ${{ runner.OS }}-build-${{ matrix.php-versions }}-${{ env.cache-name }}- + ${{ runner.OS }}-build-${{ matrix.php-versions }}- ${{ runner.OS }}-build- - name: Install dependencies From bb8065ade1ae1ad82016a4855e6edefdebb41cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 14 Nov 2019 08:30:21 +0100 Subject: [PATCH 22/95] Use vendors caching correctly --- .github/workflows/php.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 601533d..b392ade 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -7,7 +7,8 @@ jobs: strategy: max-parallel: 15 matrix: - operating-system: [ubuntu-latest, windows-latest, macOS-latest] + # TODO : enable tests on windows + operating-system: [ubuntu-latest, macOS-latest] php-versions: ['7.1', '7.2', '7.3'] name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} @@ -23,18 +24,19 @@ jobs: extension-csv: mbstring, xdebug coverage: xdebug + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Validate composer.json and composer.lock run: composer validate - name: Cache vendor uses: actions/cache@v1 with: - path: node_modules - key: ${{ runner.OS }}-build-${{ matrix.php-versions }}-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.OS }}-build-${{ matrix.php-versions }}-${{ env.cache-name }}- - ${{ runner.OS }}-build-${{ matrix.php-versions }}- - ${{ runner.OS }}-build- + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest From c68ffa5b083cf825a1f9d5c85587598eb6134609 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2019 06:40:50 +0000 Subject: [PATCH 23/95] Bump symfony/process from 4.3.8 to 4.4.0 Bumps [symfony/process](https://github.com/symfony/process) from 4.3.8 to 4.4.0. - [Release notes](https://github.com/symfony/process/releases) - [Changelog](https://github.com/symfony/process/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/process/compare/v4.3.8...v4.4.0) Signed-off-by: dependabot-preview[bot] --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index bd85110..41d3f1d 100644 --- a/composer.lock +++ b/composer.lock @@ -1188,16 +1188,16 @@ }, { "name": "symfony/process", - "version": "v4.3.8", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0" + "reference": "75ad33d9b6f25325ebc396d68ad86fd74bcfbb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3b2e0cb029afbb0395034509291f21191d1a4db0", - "reference": "3b2e0cb029afbb0395034509291f21191d1a4db0", + "url": "https://api.github.com/repos/symfony/process/zipball/75ad33d9b6f25325ebc396d68ad86fd74bcfbb06", + "reference": "75ad33d9b6f25325ebc396d68ad86fd74bcfbb06", "shasum": "" }, "require": { @@ -1206,7 +1206,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -1233,7 +1233,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-10-28T17:07:32+00:00" + "time": "2019-10-28T20:30:34+00:00" }, { "name": "symfony/service-contracts", From 605668bb81901b6be058a3ce441f0be984060655 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2019 06:41:17 +0000 Subject: [PATCH 24/95] Bump symfony/http-foundation from 4.3.8 to 4.4.0 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.3.8 to 4.4.0. - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.3.8...v4.4.0) Signed-off-by: dependabot-preview[bot] --- composer.lock | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/composer.lock b/composer.lock index 41d3f1d..a6f0b11 100644 --- a/composer.lock +++ b/composer.lock @@ -649,31 +649,31 @@ }, { "name": "symfony/http-foundation", - "version": "v4.3.8", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "cabe67275034e173350e158f3b1803d023880227" + "reference": "502040dd2b0cf0a292defeb6145f4d7a4753c99c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cabe67275034e173350e158f3b1803d023880227", - "reference": "cabe67275034e173350e158f3b1803d023880227", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/502040dd2b0cf0a292defeb6145f4d7a4753c99c", + "reference": "502040dd2b0cf0a292defeb6145f4d7a4753c99c", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/mime": "^4.3", + "symfony/mime": "^4.3|^5.0", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "~3.4|~4.0" + "symfony/expression-language": "^3.4|^4.0|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -700,7 +700,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-11-12T13:07:20+00:00" + "time": "2019-11-17T10:10:42+00:00" }, { "name": "symfony/intl", @@ -779,16 +779,16 @@ }, { "name": "symfony/mime", - "version": "v4.3.8", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448" + "reference": "89da7b68b7149aab065c09b97f938753ab52831f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/22aecf6b11638ef378fab25d6c5a2da8a31a1448", - "reference": "22aecf6b11638ef378fab25d6c5a2da8a31a1448", + "url": "https://api.github.com/repos/symfony/mime/zipball/89da7b68b7149aab065c09b97f938753ab52831f", + "reference": "89da7b68b7149aab065c09b97f938753ab52831f", "shasum": "" }, "require": { @@ -796,14 +796,17 @@ "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, + "conflict": { + "symfony/mailer": "<4.4" + }, "require-dev": { "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "~3.4|^4.1" + "symfony/dependency-injection": "^3.4|^4.1|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -834,7 +837,7 @@ "mime", "mime-type" ], - "time": "2019-11-12T13:10:02+00:00" + "time": "2019-11-13T07:39:40+00:00" }, { "name": "symfony/polyfill-ctype", From a99c4a4a46e8dca5958048de423456adc50a8d29 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2019 06:41:43 +0000 Subject: [PATCH 25/95] Bump symfony/console from 4.3.8 to 4.4.0 Bumps [symfony/console](https://github.com/symfony/console) from 4.3.8 to 4.4.0. - [Release notes](https://github.com/symfony/console/releases) - [Changelog](https://github.com/symfony/console/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/console/compare/v4.3.8...v4.4.0) Signed-off-by: dependabot-preview[bot] --- composer.lock | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index a6f0b11..f7f244e 100644 --- a/composer.lock +++ b/composer.lock @@ -574,27 +574,28 @@ }, { "name": "symfony/console", - "version": "v4.3.8", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "831424efae0a1fe6642784bd52aae14ece6538e6" + "reference": "35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/831424efae0a1fe6642784bd52aae14ece6538e6", - "reference": "831424efae0a1fe6642784bd52aae14ece6538e6", + "url": "https://api.github.com/repos/symfony/console/zipball/35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8", + "reference": "35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8", "shasum": "" }, "require": { "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/service-contracts": "^1.1" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", "symfony/process": "<3.3" }, "provide": { @@ -602,12 +603,12 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/event-dispatcher": "^4.3", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0", - "symfony/var-dumper": "^4.3" + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -618,7 +619,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -645,7 +646,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-11-13T07:29:07+00:00" + "time": "2019-11-13T07:39:40+00:00" }, { "name": "symfony/http-foundation", From b2bd23005f78ec31232b636b81c7af8b6d03dd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Tue, 26 Nov 2019 21:18:55 +0100 Subject: [PATCH 26/95] Update dependencies --- daux_libraries/search.min.js | 2 +- daux_libraries/search.min.js.map | 2 +- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/daux_libraries/search.min.js b/daux_libraries/search.min.js index 0caa4ef..dc3af87 100644 --- a/daux_libraries/search.min.js +++ b/daux_libraries/search.min.js @@ -1,2 +1,2 @@ -function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var n=0;n3)for(n=[n],i=3;i=i&&(this.u=this.g),this.u===this.g&&(this.cache&&this.j.set(e,this.o),this.F&&this.F(this.o))),this}function r(t,e){const n=t.length,i=m(e),r=[];for(let s=0,o=0;s=o&&((t=(t=t[l-(r+.5>>0)])[n]||(t[n]=[]))[t.length]=i),r)}function u(t,e){if(t){const n=Object.keys(t);for(let i=0,r=n.length;i(t=t.length-e.length)?1:t?-1:0}function p(t,e){return(t=t[T])<(e=e[T])?-1:t>e?1:0}function d(t,e){const n=T.length;for(let i=0;ie?1:0}function _(t,e,n){return t?{page:t,next:e?""+e:null,result:n}:n}function g(t,e,n,i,r,s,o){let l,h=[];if(!0===n){n="0";var c=""}else c=n&&n.split(":");const u=t.length;if(1o&&(c=0),(l=(c=c||0)+e)=this.m.length&&(this.C=0),this.m[this.C].postMessage({add:!0,id:t,content:e}),this.c[o]=""+this.C,n&&n(),this;if(!s){if(this.async&&"function"!=typeof importScripts){let r=this;return o=new Promise((function(n){setTimeout((function(){r.add(t,e,null,i,!0),r=null,n()}))})),n?(o.then(n),this):o}if(n)return this.add(t,e,null,i,!0),n(),this}if(!(e=this.encode(e)).length)return this;s=m(n=this.f)?n(e):e.split(this.split),this.filter&&(s=r(s,this.filter));const p=x();p._ctx=x();const d=s.length,_=this.threshold,g=this.depth,y=this.b,v=this.i,b=this.D;for(let e=0;ef;n--)c(v,p,a=l.substring(f,n),t,e,u,_,y-1)}break;default:if(h=c(v,p,l,t,1,u,_,y-1),g&&1=_)for(h=p._ctx[l]||(p._ctx[l]=x()),l=this.h[l]||(this.h[l]=k(y-(_||0))),0>(u=e-g)&&(u=0),(a=e+g+1)>d&&(a=d);ur;n--)i=s[n-1],s[n]=i,e[i]=n;s[r]=t,e[t]=r}}}return e},t}();return n}(function(){const t={},e="undefined"!=typeof Blob&&"undefined"!=typeof URL&&URL.createObjectURL;return function(n,i,r,s,o){return r=e?URL.createObjectURL(new Blob(["("+r.toString()+")()"],{type:"text/javascript"})):n+".min.js",t[n+="-"+i]||(t[n]=[]),t[n][o]=new Worker(r),t[n][o].onmessage=s,t[n][o]}}()),M)})),W=window.searchTranslation,B=W.Link_previous,F=W.Link_next,z=W.Search_no_results,H=W.Search_one_character_or_more,q=W.Search_one_result,G=W.Search_results,$=W.Search_should_be_x_or_more,J=W.Search_too_short,V=B,K=F,Q=z,X=H,Y=q,Z=G,tt=$,et=J;function nt(t){var e,n=t.counter,i=t.start,r=t.settings,s=t.onPageSelect,o=Math.ceil(n/r.show),l=i/r.show;e=l<=2?Math.min(o,3):Math.min(o,l+2);for(var h=[],c=function(t){t===l?h.push(v("li",{className:"current"},t+1)):h.push(v("li",null,v("a",{className:"SearchResults__footer__link",onClick:function(){return s(t*r.show)}},t+1)))},u=0;u0&&v("li",{className:"Pager--prev"},v("a",{className:"SearchResults__footer__link",onClick:function(){return s(i-r.show)}},V)),h,l+1!==o&&v("li",{className:"Pager--next"},v("a",{className:"SearchResults__footer__link",onClick:function(){return s(i+r.show)}},K))))}function it(t){var e,n=t.settings,i=t.item;return i.text&&(e=i.text.split(" ").slice(0,n.descriptiveWords).join(" "),i.text.length=e&&ie.show&&v(nt,{counter:r,start:o,settings:e,onPageSelect:this.handlePaginate})))}}]),i}(),st=document.title;function ot(t){var e=new RegExp("[?|&]".concat(t,"=([^&;]+?)(&|#|;|$)")).exec(window.location.search);return decodeURIComponent((e&&e[1]||"").replace(/\+/g,"%20"))||null}var lt=function(){function e(n){var s=this;t(this,e),this.keyUpHandler=function(t){27===t.which&&s.handleClose()},this.handleClose=function(){document.title=st,document.removeEventListener("keyup",s.keyUpHandler),document.body.classList.remove("with-search"),I(null,s.resultContainer),s.resultContainer=null},this.settings=function(t){for(var e=1;e3)for(n=[n],i=3;i=i&&(this.u=this.g),this.u===this.g&&(this.cache&&this.j.set(e,this.o),this.F&&this.F(this.o))),this}function r(t,e){const n=t.length,i=m(e),r=[];for(let s=0,o=0;s=o&&((t=(t=t[l-(r+.5>>0)])[n]||(t[n]=[]))[t.length]=i),r)}function u(t,e){if(t){const n=Object.keys(t);for(let i=0,r=n.length;i(t=t.length-e.length)?1:t?-1:0}function d(t,e){return(t=t[T])<(e=e[T])?-1:t>e?1:0}function p(t,e){const n=T.length;for(let i=0;ie?1:0}function _(t,e,n){return t?{page:t,next:e?""+e:null,result:n}:n}function g(t,e,n,i,r,s,o){let l,h=[];if(!0===n){n="0";var c=""}else c=n&&n.split(":");const u=t.length;if(1o&&(c=0),(l=(c=c||0)+e)=this.m.length&&(this.C=0),this.m[this.C].postMessage({add:!0,id:t,content:e}),this.c[o]=""+this.C,n&&n(),this;if(!s){if(this.async&&"function"!=typeof importScripts){let r=this;return o=new Promise((function(n){setTimeout((function(){r.add(t,e,null,i,!0),r=null,n()}))})),n?(o.then(n),this):o}if(n)return this.add(t,e,null,i,!0),n(),this}if(!(e=this.encode(e)).length)return this;s=m(n=this.f)?n(e):e.split(this.split),this.filter&&(s=r(s,this.filter));const d=x();d._ctx=x();const p=s.length,_=this.threshold,g=this.depth,y=this.b,v=this.i,b=this.D;for(let e=0;ef;n--)c(v,d,a=l.substring(f,n),t,e,u,_,y-1)}break;default:if(h=c(v,d,l,t,1,u,_,y-1),g&&1=_)for(h=d._ctx[l]||(d._ctx[l]=x()),l=this.h[l]||(this.h[l]=k(y-(_||0))),0>(u=e-g)&&(u=0),(a=e+g+1)>p&&(a=p);ur;n--)i=s[n-1],s[n]=i,e[i]=n;s[r]=t,e[t]=r}}}return e},t}();return n}(function(){const t={},e="undefined"!=typeof Blob&&"undefined"!=typeof URL&&URL.createObjectURL;return function(n,i,r,s,o){return r=e?URL.createObjectURL(new Blob(["("+r.toString()+")()"],{type:"text/javascript"})):n+".min.js",t[n+="-"+i]||(t[n]=[]),t[n][o]=new Worker(r),t[n][o].onmessage=s,t[n][o]}}()),A)})),B=window.searchTranslation,F=B.Link_previous,z=B.Link_next,H=B.Search_no_results,q=B.Search_one_character_or_more,G=B.Search_one_result,$=B.Search_results,J=B.Search_should_be_x_or_more,V=B.Search_too_short,K=F,Q=z,X=H,Y=q,Z=G,tt=$,et=J,nt=V;function it(t){var e,n=t.counter,i=t.start,r=t.settings,s=t.onPageSelect,o=Math.ceil(n/r.show),l=i/r.show;e=l<=2?Math.min(o,3):Math.min(o,l+2);for(var h=[],c=function(t){t===l?h.push(v("li",{className:"current"},t+1)):h.push(v("li",null,v("a",{className:"SearchResults__footer__link",onClick:function(){return s(t*r.show)}},t+1)))},u=0;u0&&v("li",{className:"Pager--prev"},v("a",{className:"SearchResults__footer__link",onClick:function(){return s(i-r.show)}},K)),h,l+1!==o&&v("li",{className:"Pager--next"},v("a",{className:"SearchResults__footer__link",onClick:function(){return s(i+r.show)}},Q))))}function rt(t){var e,n=t.settings,i=t.item;return i.text&&(e=i.text.split(" ").slice(0,n.descriptiveWords).join(" "),i.text.length=e&&ie.show&&v(it,{counter:r,start:o,settings:e,onPageSelect:this.handlePaginate})))}}]),i}(),ot=document.title;function lt(t){var e=new RegExp("[?|&]".concat(t,"=([^&;]+?)(&|#|;|$)")).exec(window.location.search);return decodeURIComponent((e&&e[1]||"").replace(/\+/g,"%20"))||null}var ht=function(){function e(n){var s=this;t(this,e),this.keyUpHandler=function(t){27===t.which&&s.handleClose()},this.handleClose=function(){document.title=ot,document.removeEventListener("keyup",s.keyUpHandler),document.body.classList.remove("with-search"),M(null,s.resultContainer),s.resultContainer=null},this.settings=function(t){for(var e=1;e3)for(u=[u],t=3;t2&&(l.children=e.slice.call(arguments,2)),v(n.type,l,l.key||n.key,l.ref||n.ref)}function O(n){var l={},u={__c:\"__cC\"+o++,__p:n,Consumer:function(n,l){return this.shouldComponentUpdate=function(n,u,t){return t!==l},n.children(l)},Provider:function(n){var t,i=this;return this.getChildContext||(t=[],this.getChildContext=function(){return l[u.__c]=i,l},this.shouldComponentUpdate=function(n){t.some(function(l){l.__P&&(l.context=n.value,k(l))})},this.sub=function(n){t.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){t.splice(t.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Consumer.contextType=u,u}n={},l=function(n){return null!=n&&void 0===n.constructor},m.prototype.setState=function(n,l){var u=this.__s!==this.state&&this.__s||(this.__s=s({},this.state));(\"function\"!=typeof n||(n=n(u,this.props)))&&s(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),k(this))},m.prototype.forceUpdate=function(n){var l,u,t,i=this.__v,r=this.__v.__e,o=this.__P;o&&(l=!1!==n,u=[],t=$(o,i,s({},i),this.__n,void 0!==o.ownerSVGElement,null,u,l,null==r?w(i):r),j(u,i),t!=r&&g(i)),n&&n()},m.prototype.render=y,u=[],t=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,i=n.debounceRendering,n.__e=function(n,l,u){for(var t;l=l.__p;)if((t=l.__c)&&!t.__p)try{if(t.constructor&&null!=t.constructor.getDerivedStateFromError)t.setState(t.constructor.getDerivedStateFromError(n));else{if(null==t.componentDidCatch)continue;t.componentDidCatch(n)}return k(t.__E=t)}catch(l){n=l}throw n},r=f,o=0;export{I as render,L as hydrate,h as createElement,h,y as Fragment,p as createRef,l as isValidElement,m as Component,M as cloneElement,O as createContext,x as toChildArray,D as _unmount,n as options};\n//# sourceMappingURL=preact.module.js.map\n","/*\r\n FlexSearch v0.6.30\r\n Copyright 2019 Nextapps GmbH\r\n Author: Thomas Wilkerling\r\n Released under the Apache 2.0 Licence\r\n https://github.com/nextapps-de/flexsearch\r\n*/\r\n'use strict';(function(K,R,w){let L;(L=w.define)&&L.amd?L([],function(){return R}):(L=w.modules)?L[K.toLowerCase()]=R:\"object\"===typeof exports?module.exports=R:w[K]=R})(\"FlexSearch\",function ma(K){function w(a,c){const b=c?c.id:a&&a.id;this.id=b||0===b?b:na++;this.init(a,c);fa(this,\"index\",function(){return this.a?Object.keys(this.a.index[this.a.keys[0]].c):Object.keys(this.c)});fa(this,\"length\",function(){return this.index.length})}function L(a,c,b,d){this.u!==this.g&&(this.o=this.o.concat(b),this.u++,\r\nd&&this.o.length>=d&&(this.u=this.g),this.u===this.g&&(this.cache&&this.j.set(c,this.o),this.F&&this.F(this.o)));return this}function S(a){const c=B();for(const b in a)if(a.hasOwnProperty(b)){const d=a[b];F(d)?c[b]=d.slice(0):G(d)?c[b]=S(d):c[b]=d}return c}function W(a,c){const b=a.length,d=O(c),e=[];for(let g=0,f=0;g=f&&(a=a[h-(e+.5>>0)],a=a[b]||(a[b]=[]),\r\na[a.length]=d);return e}function ba(a,c){if(a){const b=Object.keys(a);for(let d=0,e=b.length;da?1:a?-1:0}function pa(a,c){a=a[M];c=c[M];return ac?1:0}function oa(a,c){const b=M.length;for(let d=0;dc?1:0}function T(a,c,b){return a?{page:a,next:c?\"\"+c:null,result:b}:b}function ha(a,c,b,d,e,g,f){let h,k=[];if(!0===b){b=\"0\";var l=\"\"}else l=b&&b.split(\":\");const n=a.length;if(1f&&(l=0),l=l||0,h=l+c,h=this.m.length&&(this.C=0),this.m[this.C].postMessage({add:!0,id:a,\r\ncontent:c}),this.c[g]=\"\"+this.C,b&&b(),this;if(!e){if(this.async&&\"function\"!==typeof importScripts){let t=this;g=new Promise(function(v){setTimeout(function(){t.add(a,c,null,d,!0);t=null;v()})});if(b)g.then(b);else return g;return this}if(b)return this.add(a,c,null,d,!0),b(),this}c=this.encode(c);if(!c.length)return this;b=this.f;e=O(b)?b(c):c.split(this.split);this.filter&&(e=W(e,this.filter));const p=B();p._ctx=B();const m=e.length,u=this.threshold,q=this.depth,A=this.b,z=this.i,y=this.D;for(let t=\r\n0;tn;x--)l=f.substring(n,x),V(z,p,l,a,v,k,u,A-1)}break;default:if(h=V(z,p,f,a,1,k,u,A-1),q&&1=u)for(h=p._ctx[f]||(p._ctx[f]=B()),f=this.h[f]||(this.h[f]=ia(A-(u||0))),k=t-q,l=t+q+1,0>k&&(k=0),l>\r\nm&&(l=m);kf;d--)e=h[d-1],h[d]=e,g[e]=d;h[f]=c;g[c]=f}}}return b};return a}();return w}(function(){const K={},R=\"undefined\"!==typeof Blob&&\"undefined\"!==typeof URL&&URL.createObjectURL;return function(w,L,S,W,P){S=R?URL.createObjectURL(new Blob([\"(\"+S.toString()+\")()\"],{type:\"text/javascript\"})):w+\".min.js\";w+=\"-\"+L;K[w]||(K[w]=[]);K[w][P]=new Worker(S);K[w][P].onmessage=W;return K[w][P]}}()),this);\r\n","/* eslint-disable camelcase */\nconst {\n Link_previous,\n Link_next,\n Search_no_results,\n Search_one_character_or_more,\n Search_one_result,\n Search_results,\n Search_should_be_x_or_more,\n Search_too_short\n} = window.searchTranslation;\n\nconst textLinkPrevious = Link_previous;\nconst textLinkNext = Link_next;\nconst textSearchNoResults = Search_no_results;\nconst textSearchOneCharacterOrMore = Search_one_character_or_more;\nconst textSearchOneResult = Search_one_result;\nconst textSearchResults = Search_results;\nconst textSearchShouldBeXOrMore = Search_should_be_x_or_more;\nconst textSearchTooShort = Search_too_short;\n/* eslint-enable camelcase */\n\nexport {\n textLinkPrevious,\n textLinkNext,\n textSearchNoResults,\n textSearchOneCharacterOrMore,\n textSearchOneResult,\n textSearchResults,\n textSearchShouldBeXOrMore,\n textSearchTooShort\n};\n","import * as preact from \"preact\";\nimport { textLinkPrevious, textLinkNext } from \"./translation\";\n/** @jsx preact.h */\n\nexport default function Pagination({ counter, start, settings, onPageSelect }) {\n const pages = Math.ceil(counter / settings.show);\n const page = start / settings.show;\n\n let displayedPages;\n if (page <= 2) {\n // Display max three pages\n displayedPages = Math.min(pages, 3);\n } else {\n // Display two more pages, but don't overflow\n displayedPages = Math.min(pages, page + 2);\n }\n\n const items = [];\n\n for (let f = 0; f < displayedPages; f++) {\n if (f === page) {\n items.push(
  • {f + 1}
  • );\n } else {\n items.push(\n
  • \n onPageSelect(f * settings.show)}\n >\n {f + 1}\n \n
  • \n );\n }\n }\n\n return (\n
    \n
      \n {start > 0 && (\n
    • \n onPageSelect(start - settings.show)}\n >\n {textLinkPrevious}\n \n
    • \n )}\n {items}\n {page + 1 !== pages && (\n
    • \n onPageSelect(start + settings.show)}\n >\n {textLinkNext}\n \n
    • \n )}\n
    \n
    \n );\n}\n","import * as preact from \"preact\";\n/** @jsx preact.h */\n\n// TODO :: restore highlight\n/*function highlightText(search, text) {\n if (settings.highlightTerms) {\n var pattern = new RegExp(\n `(${search})`,\n settings.highlightEveryTerm ? \"gi\" : \"i\"\n );\n text = text.replace(\n pattern,\n '$1'\n );\n }\n\n return text;\n}*/\n\nexport default function Result({ settings, item }) {\n let text;\n if (item.text) {\n text = item.text\n .split(\" \")\n .slice(0, settings.descriptiveWords)\n .join(\" \");\n if (\n item.text.length < text.length &&\n text.charAt(text.length - 1) !== \".\"\n ) {\n text += \" ...\";\n }\n }\n\n return (\n
    \n \n {settings.showURL && (\n \n )}\n {text &&
    {text}
    }\n
    \n );\n}\n","import * as preact from \"preact\";\n\nimport Pagination from \"./Pagination\";\nimport Result from \"./Result\";\nimport {\n textSearchNoResults,\n textSearchOneCharacterOrMore,\n textSearchOneResult,\n textSearchResults,\n textSearchShouldBeXOrMore,\n textSearchTooShort\n} from \"./translation\";\n\n/** @jsx preact.h */\n\nexport default class Search extends preact.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n search: this.props.settings.field.value || \"\",\n start: 0\n };\n }\n\n // \"click\", \".SearchResults__close\"\n handleClose = () => {\n this.props.onClose();\n };\n\n scrollTop = () => {\n if (this.resultRef) {\n this.resultRef.scrollTop = 0;\n }\n };\n\n handlePaginate = start => {\n this.setState({ start }, this.scrollTop);\n };\n\n handleChange = event => {\n this.setState({ search: event.target.value, start: 0 }, this.scrollTop);\n\n this.props.settings.field.value = event.target.value;\n };\n\n getResults() {\n const { settings } = this.props;\n const { start } = this.state;\n\n const warnings = [];\n let counter = 0;\n let results = [];\n\n if (this.state.search.length < settings.minimumLength) {\n warnings.push(textSearchTooShort);\n warnings.push(\n settings.minimumLength === 1\n ? textSearchOneCharacterOrMore\n : textSearchShouldBeXOrMore.replace(\n \"!min\",\n settings.minimumLength\n )\n );\n\n return { warnings, counter, results, start };\n }\n\n const found = this.props.onSearch(this.state.search);\n\n counter = found.length;\n\n if (counter === 0) {\n warnings.push(textSearchNoResults);\n return { warnings, counter, results, start };\n }\n\n if (settings.showTitleCount) {\n this.props.onTitleChange(`(${counter})`);\n }\n\n results = found.filter(\n (item, itemNumber) =>\n itemNumber >= start && itemNumber < settings.show + start\n );\n\n return { warnings, counter, results, start };\n }\n\n render() {\n const { settings } = this.props;\n const { warnings, counter, results, start } = this.getResults();\n\n return (\n
    \n
    \n (this.resultRef = el)}\n >\n \n \n ×\n \n
    \n {counter === 1\n ? textSearchOneResult\n : textSearchResults.replace(\"!count\", counter)}\n
    \n {warnings.map(warning => (\n
    \n {warning}\n
    \n ))}\n {results.map(result => (\n \n ))}\n {counter > settings.show && (\n \n )}\n
    \n
    \n );\n }\n}\n","import * as preact from \"preact\";\nimport FlexSearch from \"flexsearch\";\n\nimport Search from \"./Search\";\n\n/** @jsx preact.h */\n\nconst originalTitle = document.title;\n\nfunction getURLP(name) {\n const elements = new RegExp(`[?|&]${name}=([^&;]+?)(&|#|;|$)`).exec(\n window.location.search\n );\n\n return (\n decodeURIComponent(\n ((elements && elements[1]) || \"\").replace(/\\+/g, \"%20\")\n ) || null\n );\n}\n\nclass SearchEngine {\n constructor(options) {\n this.settings = {\n field: document.getElementById(\"search_input\"),\n show: 10,\n showURL: true,\n showTitleCount: true,\n minimumLength: 3,\n descriptiveWords: 25,\n highlightTerms: true,\n highlightEveryTerm: false,\n contentLocation: \"daux_search_index.json\",\n ...options\n };\n\n this.searchIndex = {\n pages: []\n };\n }\n\n loadData() {\n if (!this.loadingPromise) {\n this.loadingPromise = fetch(\n this.settings.base_url + this.settings.contentLocation\n )\n .then(data => data.json())\n .then(json => {\n this.searchIndex = new FlexSearch({\n doc: {\n id: \"url\",\n field: [\"title\", \"text\", \"tags\"]\n }\n });\n\n let pages = json.pages;\n\n // Only keep the pages related to the current language\n if (window.searchLanguage) {\n const pagePrefix = `${window.searchLanguage}/`;\n pages = pages.filter(\n item => item.url.indexOf(pagePrefix) === 0\n );\n }\n\n this.searchIndex.add(pages);\n });\n }\n\n return this.loadingPromise;\n }\n\n run() {\n if (getURLP(\"q\")) {\n this.settings.field.value = getURLP(\"q\");\n\n this.loadData().then(() => {\n this.displaySearch();\n });\n }\n\n this.settings.field.addEventListener(\"keyup\", event => {\n // Start loading index once the user types text in the field, not before\n this.loadData();\n\n if (parseInt(event.keyCode, 10) === 13) {\n this.loadData().then(() => {\n this.displaySearch();\n });\n }\n });\n }\n\n keyUpHandler = e => {\n if (e.which === 27) {\n //escape\n this.handleClose();\n }\n };\n\n handleClose = () => {\n document.title = originalTitle;\n\n document.removeEventListener(\"keyup\", this.keyUpHandler);\n\n document.body.classList.remove(\"with-search\");\n preact.render(null, this.resultContainer);\n this.resultContainer = null;\n };\n\n displaySearch() {\n if (!this.resultContainer) {\n this.resultContainer = document.createElement(\"div\");\n document.body.appendChild(this.resultContainer);\n }\n\n document.addEventListener(\"keyup\", this.keyUpHandler);\n\n preact.render(\n this.searchIndex.search(term)}\n onClose={this.handleClose}\n onTitleChange={title => {\n document.title = `${title} ${originalTitle}`;\n }}\n settings={this.settings}\n />,\n this.resultContainer\n );\n\n document.body.classList.add(\"with-search\");\n document.body.scrollTop = 0;\n }\n}\n\n// Main containers\n\nfunction search(options) {\n const instance = new SearchEngine(options);\n instance.run();\n}\n\n// Declare globally\nwindow.search = search;\n"],"names":["n","u","t","i","r","f","e","c","s","l","a","parentNode","removeChild","h","o","arguments","length","push","children","defaultProps","key","ref","v","type","props","__k","__p","__b","__e","__c","constructor","vnode","y","m","this","context","w","indexOf","k","__d","debounceRendering","_","sort","__v","pop","forceUpdate","b","p","d","g","x","$","appendChild","nextSibling","insertBefore","value","D","A","Array","isArray","P","setProperty","test","N","style","cssText","replace","toLowerCase","slice","addEventListener","T","removeEventListener","removeAttributeNS","setAttributeNS","removeAttribute","setAttribute","event","C","contextType","__E","prototype","render","H","sub","state","__n","__h","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","componentWillUpdate","__r","__P","getChildContext","getSnapshotBeforeUpdate","base","call","componentDidUpdate","z","diffed","j","nodeType","localName","document","createTextNode","createElementNS","createElement","data","childNodes","dangerouslySetInnerHTML","__html","innerHTML","checked","current","unmount","componentWillUnmount","I","ownerSVGElement","setState","Promise","then","bind","resolve","setTimeout","getDerivedStateFromError","componentDidCatch","K","R","L","define","amd","modules","module","ma","id","na","init","fa","Object","keys","index","concat","cache","set","F","W","O","ha","page","next","result","where","M","split","oa","pa","defineProperty","get","RegExp","Q","V","ba","splice","G","ca","qa","B","da","X","ea","Y","E","parseInt","J","ra","q","Z","ia","create","sa","self","onmessage","search","content","threshold","limit","postMessage","add","update","remove","clear","info","worker","console","log","register","options","async","Function","substring","lastIndexOf","ta","cursor","suggest","toString","encode","depth","ja","memory","speed","match","score","balance","fast","aa","ka","la","registerMatcher","hasOwnProperty","registerEncoder","U","registerLanguage","filter","stemmer","preset","Worker","tokenize","rtl","resolution","matcher","addMatcher","lang","doc","S","field","tag","store","ua","importScripts","_ctx","query","callback","bool","all","apply","find","items","contextual","destroy","export","serialize","JSON","stringify","import","parse","va","icase","simple","advanced","extra","join","count","Blob","URL","createObjectURL","window","searchTranslation","Link_previous","Link_next","Search_no_results","Search_one_character_or_more","Search_one_result","Search_results","Search_should_be_x_or_more","Search_too_short","textLinkPrevious","textLinkNext","textSearchNoResults","textSearchOneCharacterOrMore","textSearchOneResult","textSearchResults","textSearchShouldBeXOrMore","textSearchTooShort","Pagination","displayedPages","counter","start","settings","onPageSelect","pages","Math","ceil","show","min","preact.h","className","onClick","Result","text","item","descriptiveWords","charAt","href","base_url","url","title","showURL","Search","handleClose","onClose","scrollTop","_this","resultRef","handlePaginate","handleChange","target","preact","warnings","results","minimumLength","found","onSearch","showTitleCount","onTitleChange","itemNumber","getResults","el","_this2","placeholder","autoComplete","autoSave","onInput","map","warning","originalTitle","getURLP","name","elements","exec","location","decodeURIComponent","SearchEngine","keyUpHandler","which","body","classList","resultContainer","getElementById","highlightTerms","highlightEveryTerm","contentLocation","searchIndex","loadingPromise","fetch","json","FlexSearch","searchLanguage","pagePrefix","loadData","_this3","displaySearch","keyCode","term","_this4","run"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"search.min.js.map","sources":["../node_modules/preact/dist/preact.module.js","../node_modules/flexsearch/dist/flexsearch.min.js","../src/js/search/translation.js","../src/js/search/Pagination.js","../src/js/search/Result.js","../src/js/search/Search.js","../src/js/search/index.js"],"sourcesContent":["var n,l,u,t,i,o,r,f={},e=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a(n){var l=n.parentNode;l&&l.removeChild(n)}function h(n,l,u){var t,i,o,r,f=arguments;if(l=s({},l),arguments.length>3)for(u=[u],t=3;t2&&(l.children=e.slice.call(arguments,2)),v(n.type,l,l.key||n.key,l.ref||n.ref)}function L(n){var l={},u={__c:\"__cC\"+r++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var t,i=this;return this.getChildContext||(t=[],this.getChildContext=function(){return l[u.__c]=i,l},this.shouldComponentUpdate=function(l){n.value!==l.value&&t.some(function(n){n.context=l.value,g(n)})},this.sub=function(n){t.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){t.splice(t.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Consumer.contextType=u,u}n={__e:function(n,l){for(var u;l=l.__;)if((u=l.__c)&&!u.__)try{if(u.constructor&&null!=u.constructor.getDerivedStateFromError)u.setState(u.constructor.getDerivedStateFromError(n));else{if(null==u.componentDidCatch)continue;u.componentDidCatch(n)}return g(u.__E=u)}catch(l){n=l}throw n}},l=function(n){return null!=n&&void 0===n.constructor},y.prototype.setState=function(n,l){var u;u=this.__s!==this.state?this.__s:this.__s=s({},this.state),\"function\"==typeof n&&(n=n(u,this.props)),n&&s(u,n),null!=n&&this.__v&&(this.__e=!1,l&&this.__h.push(l),g(this))},y.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),g(this))},y.prototype.render=d,u=[],t=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=f,r=0;export{E as render,H as hydrate,h as createElement,h,d as Fragment,p as createRef,l as isValidElement,y as Component,I as cloneElement,L as createContext,b as toChildArray,A as _unmount,n as options};\n//# sourceMappingURL=preact.module.js.map\n","/*\n FlexSearch v0.6.30\n Copyright 2019 Nextapps GmbH\n Author: Thomas Wilkerling\n Released under the Apache 2.0 Licence\n https://github.com/nextapps-de/flexsearch\n*/\n'use strict';(function(K,R,w){let L;(L=w.define)&&L.amd?L([],function(){return R}):(L=w.modules)?L[K.toLowerCase()]=R:\"object\"===typeof exports?module.exports=R:w[K]=R})(\"FlexSearch\",function ma(K){function w(a,c){const b=c?c.id:a&&a.id;this.id=b||0===b?b:na++;this.init(a,c);fa(this,\"index\",function(){return this.a?Object.keys(this.a.index[this.a.keys[0]].c):Object.keys(this.c)});fa(this,\"length\",function(){return this.index.length})}function L(a,c,b,d){this.u!==this.g&&(this.o=this.o.concat(b),this.u++,\nd&&this.o.length>=d&&(this.u=this.g),this.u===this.g&&(this.cache&&this.j.set(c,this.o),this.F&&this.F(this.o)));return this}function S(a){const c=B();for(const b in a)if(a.hasOwnProperty(b)){const d=a[b];F(d)?c[b]=d.slice(0):G(d)?c[b]=S(d):c[b]=d}return c}function W(a,c){const b=a.length,d=O(c),e=[];for(let f=0,h=0;f=h&&(a=a[g-(e+.5>>0)],a=a[b]||(a[b]=[]),\na[a.length]=d);return e}function ba(a,c){if(a){const b=Object.keys(a);for(let d=0,e=b.length;da?1:a?-1:0}function pa(a,c){a=a[M];c=c[M];return ac?1:0}function oa(a,c){const b=M.length;for(let d=0;dc?1:0}function T(a,c,b){return a?{page:a,next:c?\"\"+c:null,result:b}:b}function ha(a,c,b,d,e,f,h){let g,k=[];if(!0===b){b=\"0\";var l=\"\"}else l=b&&b.split(\":\");const p=a.length;if(1h&&(l=0),l=l||0,g=l+c,g=this.m.length&&(this.C=0),this.m[this.C].postMessage({add:!0,id:a,\ncontent:c}),this.c[f]=\"\"+this.C,b&&b(),this;if(!e){if(this.async&&\"function\"!==typeof importScripts){let t=this;f=new Promise(function(v){setTimeout(function(){t.add(a,c,null,d,!0);t=null;v()})});if(b)f.then(b);else return f;return this}if(b)return this.add(a,c,null,d,!0),b(),this}c=this.encode(c);if(!c.length)return this;b=this.f;e=O(b)?b(c):c.split(this.split);this.filter&&(e=W(e,this.filter));const n=B();n._ctx=B();const m=e.length,u=this.threshold,q=this.depth,A=this.b,z=this.i,y=this.D;for(let t=\n0;tp;x--)l=h.substring(p,x),V(z,n,l,a,v,k,u,A-1)}break;default:if(g=V(z,n,h,a,1,k,u,A-1),q&&1=u)for(g=n._ctx[h]||(n._ctx[h]=B()),h=this.h[h]||(this.h[h]=ia(A-(u||0))),k=t-q,l=t+q+1,0>k&&(k=0),l>\nm&&(l=m);kh;d--)e=g[d-1],g[d]=e,f[e]=d;g[h]=c;f[c]=h}}}return b};return a}();return w}(function(){const K={},R=\"undefined\"!==typeof Blob&&\n\"undefined\"!==typeof URL&&URL.createObjectURL;return function(w,L,S,W,P){S=R?URL.createObjectURL(new Blob([\"(\"+S.toString()+\")()\"],{type:\"text/javascript\"})):w+\".min.js\";w+=\"-\"+L;K[w]||(K[w]=[]);K[w][P]=new Worker(S);K[w][P].onmessage=W;return K[w][P]}}()),this);\n","/* eslint-disable camelcase */\nconst {\n Link_previous,\n Link_next,\n Search_no_results,\n Search_one_character_or_more,\n Search_one_result,\n Search_results,\n Search_should_be_x_or_more,\n Search_too_short\n} = window.searchTranslation;\n\nconst textLinkPrevious = Link_previous;\nconst textLinkNext = Link_next;\nconst textSearchNoResults = Search_no_results;\nconst textSearchOneCharacterOrMore = Search_one_character_or_more;\nconst textSearchOneResult = Search_one_result;\nconst textSearchResults = Search_results;\nconst textSearchShouldBeXOrMore = Search_should_be_x_or_more;\nconst textSearchTooShort = Search_too_short;\n/* eslint-enable camelcase */\n\nexport {\n textLinkPrevious,\n textLinkNext,\n textSearchNoResults,\n textSearchOneCharacterOrMore,\n textSearchOneResult,\n textSearchResults,\n textSearchShouldBeXOrMore,\n textSearchTooShort\n};\n","import * as preact from \"preact\";\nimport { textLinkPrevious, textLinkNext } from \"./translation\";\n/** @jsx preact.h */\n\nexport default function Pagination({ counter, start, settings, onPageSelect }) {\n const pages = Math.ceil(counter / settings.show);\n const page = start / settings.show;\n\n let displayedPages;\n if (page <= 2) {\n // Display max three pages\n displayedPages = Math.min(pages, 3);\n } else {\n // Display two more pages, but don't overflow\n displayedPages = Math.min(pages, page + 2);\n }\n\n const items = [];\n\n for (let f = 0; f < displayedPages; f++) {\n if (f === page) {\n items.push(
  • {f + 1}
  • );\n } else {\n items.push(\n
  • \n onPageSelect(f * settings.show)}\n >\n {f + 1}\n \n
  • \n );\n }\n }\n\n return (\n
    \n
      \n {start > 0 && (\n
    • \n onPageSelect(start - settings.show)}\n >\n {textLinkPrevious}\n \n
    • \n )}\n {items}\n {page + 1 !== pages && (\n
    • \n onPageSelect(start + settings.show)}\n >\n {textLinkNext}\n \n
    • \n )}\n
    \n
    \n );\n}\n","import * as preact from \"preact\";\n/** @jsx preact.h */\n\n// TODO :: restore highlight\n/*function highlightText(search, text) {\n if (settings.highlightTerms) {\n var pattern = new RegExp(\n `(${search})`,\n settings.highlightEveryTerm ? \"gi\" : \"i\"\n );\n text = text.replace(\n pattern,\n '$1'\n );\n }\n\n return text;\n}*/\n\nexport default function Result({ settings, item }) {\n let text;\n if (item.text) {\n text = item.text\n .split(\" \")\n .slice(0, settings.descriptiveWords)\n .join(\" \");\n if (\n item.text.length < text.length &&\n text.charAt(text.length - 1) !== \".\"\n ) {\n text += \" ...\";\n }\n }\n\n return (\n
    \n \n {settings.showURL && (\n \n )}\n {text &&
    {text}
    }\n
    \n );\n}\n","import * as preact from \"preact\";\n\nimport Pagination from \"./Pagination\";\nimport Result from \"./Result\";\nimport {\n textSearchNoResults,\n textSearchOneCharacterOrMore,\n textSearchOneResult,\n textSearchResults,\n textSearchShouldBeXOrMore,\n textSearchTooShort\n} from \"./translation\";\n\n/** @jsx preact.h */\n\nexport default class Search extends preact.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n search: this.props.settings.field.value || \"\",\n start: 0\n };\n }\n\n // \"click\", \".SearchResults__close\"\n handleClose = () => {\n this.props.onClose();\n };\n\n scrollTop = () => {\n if (this.resultRef) {\n this.resultRef.scrollTop = 0;\n }\n };\n\n handlePaginate = start => {\n this.setState({ start }, this.scrollTop);\n };\n\n handleChange = event => {\n this.setState({ search: event.target.value, start: 0 }, this.scrollTop);\n\n this.props.settings.field.value = event.target.value;\n };\n\n getResults() {\n const { settings } = this.props;\n const { start } = this.state;\n\n const warnings = [];\n let counter = 0;\n let results = [];\n\n if (this.state.search.length < settings.minimumLength) {\n warnings.push(textSearchTooShort);\n warnings.push(\n settings.minimumLength === 1\n ? textSearchOneCharacterOrMore\n : textSearchShouldBeXOrMore.replace(\n \"!min\",\n settings.minimumLength\n )\n );\n\n return { warnings, counter, results, start };\n }\n\n const found = this.props.onSearch(this.state.search);\n\n counter = found.length;\n\n if (counter === 0) {\n warnings.push(textSearchNoResults);\n return { warnings, counter, results, start };\n }\n\n if (settings.showTitleCount) {\n this.props.onTitleChange(`(${counter})`);\n }\n\n results = found.filter(\n (item, itemNumber) =>\n itemNumber >= start && itemNumber < settings.show + start\n );\n\n return { warnings, counter, results, start };\n }\n\n render() {\n const { settings } = this.props;\n const { warnings, counter, results, start } = this.getResults();\n\n return (\n
    \n
    \n (this.resultRef = el)}\n >\n \n \n ×\n \n
    \n {counter === 1\n ? textSearchOneResult\n : textSearchResults.replace(\"!count\", counter)}\n
    \n {warnings.map(warning => (\n
    \n {warning}\n
    \n ))}\n {results.map(result => (\n \n ))}\n {counter > settings.show && (\n \n )}\n
    \n
    \n );\n }\n}\n","import * as preact from \"preact\";\nimport FlexSearch from \"flexsearch\";\n\nimport Search from \"./Search\";\n\n/** @jsx preact.h */\n\nconst originalTitle = document.title;\n\nfunction getURLP(name) {\n const elements = new RegExp(`[?|&]${name}=([^&;]+?)(&|#|;|$)`).exec(\n window.location.search\n );\n\n return (\n decodeURIComponent(\n ((elements && elements[1]) || \"\").replace(/\\+/g, \"%20\")\n ) || null\n );\n}\n\nclass SearchEngine {\n constructor(options) {\n this.settings = {\n field: document.getElementById(\"search_input\"),\n show: 10,\n showURL: true,\n showTitleCount: true,\n minimumLength: 3,\n descriptiveWords: 25,\n highlightTerms: true,\n highlightEveryTerm: false,\n contentLocation: \"daux_search_index.json\",\n ...options\n };\n\n this.searchIndex = {\n pages: []\n };\n }\n\n loadData() {\n if (!this.loadingPromise) {\n this.loadingPromise = fetch(\n this.settings.base_url + this.settings.contentLocation\n )\n .then(data => data.json())\n .then(json => {\n this.searchIndex = new FlexSearch({\n doc: {\n id: \"url\",\n field: [\"title\", \"text\", \"tags\"]\n }\n });\n\n let pages = json.pages;\n\n // Only keep the pages related to the current language\n if (window.searchLanguage) {\n const pagePrefix = `${window.searchLanguage}/`;\n pages = pages.filter(\n item => item.url.indexOf(pagePrefix) === 0\n );\n }\n\n this.searchIndex.add(pages);\n });\n }\n\n return this.loadingPromise;\n }\n\n run() {\n if (getURLP(\"q\")) {\n this.settings.field.value = getURLP(\"q\");\n\n this.loadData().then(() => {\n this.displaySearch();\n });\n }\n\n this.settings.field.addEventListener(\"keyup\", event => {\n // Start loading index once the user types text in the field, not before\n this.loadData();\n\n if (parseInt(event.keyCode, 10) === 13) {\n this.loadData().then(() => {\n this.displaySearch();\n });\n }\n });\n }\n\n keyUpHandler = e => {\n if (e.which === 27) {\n //escape\n this.handleClose();\n }\n };\n\n handleClose = () => {\n document.title = originalTitle;\n\n document.removeEventListener(\"keyup\", this.keyUpHandler);\n\n document.body.classList.remove(\"with-search\");\n preact.render(null, this.resultContainer);\n this.resultContainer = null;\n };\n\n displaySearch() {\n if (!this.resultContainer) {\n this.resultContainer = document.createElement(\"div\");\n document.body.appendChild(this.resultContainer);\n }\n\n document.addEventListener(\"keyup\", this.keyUpHandler);\n\n preact.render(\n this.searchIndex.search(term)}\n onClose={this.handleClose}\n onTitleChange={title => {\n document.title = `${title} ${originalTitle}`;\n }}\n settings={this.settings}\n />,\n this.resultContainer\n );\n\n document.body.classList.add(\"with-search\");\n document.body.scrollTop = 0;\n }\n}\n\n// Main containers\n\nfunction search(options) {\n const instance = new SearchEngine(options);\n instance.run();\n}\n\n// Declare globally\nwindow.search = search;\n"],"names":["n","u","t","i","o","f","e","c","s","l","a","parentNode","removeChild","h","r","arguments","length","push","children","defaultProps","key","ref","v","type","props","__k","__","__b","__e","__d","__c","constructor","vnode","d","y","this","context","m","indexOf","w","base","g","debounceRendering","k","sort","__v","pop","__P","T","__n","ownerSVGElement","$","_","p","b","appendChild","nextSibling","insertBefore","value","A","z","Array","isArray","C","setProperty","test","P","style","cssText","replace","toLowerCase","slice","addEventListener","N","removeEventListener","removeAttributeNS","setAttributeNS","removeAttribute","setAttribute","event","x","contextType","__E","prototype","render","D","sub","state","__h","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","componentWillUpdate","componentDidUpdate","__r","getChildContext","getSnapshotBeforeUpdate","j","diffed","some","call","nodeType","localName","document","createTextNode","createElementNS","createElement","data","childNodes","dangerouslySetInnerHTML","attributes","name","__html","innerHTML","checked","current","unmount","componentWillUnmount","E","getDerivedStateFromError","setState","componentDidCatch","forceUpdate","Promise","then","bind","resolve","setTimeout","K","R","L","define","amd","modules","module","ma","id","na","init","fa","Object","keys","index","concat","cache","set","F","W","O","ha","page","next","result","where","M","split","oa","pa","defineProperty","get","RegExp","Q","V","ba","splice","G","ca","qa","B","I","da","X","ea","Y","parseInt","J","ra","q","Z","ia","create","sa","self","onmessage","search","content","threshold","limit","postMessage","add","update","remove","clear","info","worker","console","log","register","options","async","Function","substring","lastIndexOf","ta","cursor","suggest","toString","H","encode","depth","ja","memory","speed","match","score","balance","fast","aa","ka","la","registerMatcher","hasOwnProperty","registerEncoder","U","registerLanguage","filter","stemmer","preset","Worker","tokenize","rtl","resolution","matcher","addMatcher","lang","doc","S","field","tag","store","ua","importScripts","_ctx","query","callback","bool","all","apply","find","items","contextual","destroy","export","serialize","JSON","stringify","import","parse","va","icase","simple","advanced","extra","join","count","Blob","URL","createObjectURL","window","searchTranslation","Link_previous","Link_next","Search_no_results","Search_one_character_or_more","Search_one_result","Search_results","Search_should_be_x_or_more","Search_too_short","textLinkPrevious","textLinkNext","textSearchNoResults","textSearchOneCharacterOrMore","textSearchOneResult","textSearchResults","textSearchShouldBeXOrMore","textSearchTooShort","Pagination","displayedPages","counter","start","settings","onPageSelect","pages","Math","ceil","show","min","preact.h","className","onClick","Result","text","item","descriptiveWords","charAt","href","base_url","url","title","showURL","Search","handleClose","onClose","scrollTop","_this","resultRef","handlePaginate","handleChange","target","preact","warnings","results","minimumLength","found","onSearch","showTitleCount","onTitleChange","itemNumber","getResults","el","_this2","placeholder","autoComplete","autoSave","onInput","map","warning","originalTitle","getURLP","elements","exec","location","decodeURIComponent","SearchEngine","keyUpHandler","which","body","classList","resultContainer","getElementById","highlightTerms","highlightEveryTerm","contentLocation","searchIndex","loadingPromise","fetch","json","FlexSearch","searchLanguage","pagePrefix","loadData","_this3","displaySearch","keyCode","term","_this4","run"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 53cacf3..22009c1 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "@swissquote/crafty-runner-gulp": "^1.8.0", "@swissquote/crafty-runner-rollup": "^1.8.0", "flexsearch": "^0.6.32", - "preact": "^10.0.0-rc.3" + "preact": "^10.0.5" }, "scripts": { "build": "crafty run", diff --git a/yarn.lock b/yarn.lock index 3c6242e..084b45f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6274,10 +6274,10 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.10, postcss@^6.0.18, postcss@^6.0.2 source-map "^0.6.1" supports-color "^5.4.0" -preact@^10.0.0-rc.3: - version "10.0.0-rc.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.0.0-rc.3.tgz#258d1bbf11744e0460b8681422cd6a0c18200df7" - integrity sha512-IvDc2AGvHJncEtORciLDzpluDF2MsZqf9eo6xHt7HVY4E6OvxZzAePYJtv3siVdEntxmB9NciQpbToT1APqJYQ== +preact@^10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.0.5.tgz#16f0bcd77241693e710778069e703217dd497867" + integrity sha512-62+J+GTrv3Uhp6DefqZTel6VYcdUA1zqHO7gjQSKdOwkU2sNOp/Vl6Zf2A3hIWV5EBgjeDA8gsOn6dmB3I1Dvg== prelude-ls@~1.1.2: version "1.1.2" From 98acc7323f43d2aa6d49fe0208f9d3bab51f6bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Tue, 26 Nov 2019 22:08:18 +0100 Subject: [PATCH 27/95] Fix bug reported in #169 --- libs/DauxHelper.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 845121c..a6a73cf 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -189,8 +189,6 @@ class DauxHelper continue; } - $node = DauxHelper::slug(urldecode($node)); - // if the node exists in the current request tree, // change the $tree variable to reference the new // node and proceed to the next url part @@ -199,6 +197,13 @@ class DauxHelper continue; } + // We try a second time by decoding the url + $node = DauxHelper::slug(urldecode($node)); + if (isset($tree->getEntries()[$node])) { + $tree = $tree->getEntries()[$node]; + continue; + } + // if the node doesn't exist, we can try // two variants of the requested file: // with and w/o the .html extension From f62b2bec96668498208ee748f581c830a697fb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Tue, 26 Nov 2019 22:43:12 +0100 Subject: [PATCH 28/95] Output logs from serve in verbose mode #171 --- libs/Console/Serve.php | 1 + libs/Server/Server.php | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/Console/Serve.php b/libs/Console/Serve.php index 242fc4a..e8de8d6 100755 --- a/libs/Console/Serve.php +++ b/libs/Console/Serve.php @@ -37,6 +37,7 @@ class Serve extends DauxCommand chdir(__DIR__ . '/../../'); + putenv('DAUX_VERBOSITY=' . $output->getVerbosity()); putenv('DAUX_SOURCE=' . $daux->getParams()->getDocumentationDirectory()); putenv('DAUX_THEME=' . $daux->getParams()->getThemesPath()); putenv('DAUX_CONFIGURATION=' . $daux->getParams()->getConfigurationOverrideFile()); diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 6f3c726..cafc627 100755 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -1,6 +1,6 @@ initializeConfiguration(); From e04335abeba5fb18fce26e1d7d04d0994bd9cde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 22:36:26 +0100 Subject: [PATCH 29/95] Update dependencies, min PHP 7.2 --- .github/workflows/php.yml | 27 +- .gitignore | 1 + .travis.yml | 28 +- README.md | 2 +- composer.json | 17 +- composer.lock | 530 ++++++++++-------- docs/00_Getting_Started.md | 2 +- .../Markdown/CommonMarkConverter.php | 5 +- libs/ContentTypes/Markdown/LinkRenderer.php | 19 +- .../ContentTypes/Markdown/TableOfContents.php | 16 +- .../Markdown/TableOfContentsParser.php | 6 +- .../Markdown/CommonMarkConverter.php | 11 +- .../ContentTypes/Markdown/ImageRenderer.php | 22 +- .../Markdown/CommonMarkConverter.php | 10 +- .../ContentTypes/Markdown/TOC/Processor.php | 9 +- libs/Server/ExtensionMimeTypeGuesser.php | 29 +- libs/Server/Server.php | 3 +- tests/Tree/BuilderIntegrationTest.php | 2 +- 18 files changed, 409 insertions(+), 330 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b392ade..ed5e506 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -9,7 +9,7 @@ jobs: matrix: # TODO : enable tests on windows operating-system: [ubuntu-latest, macOS-latest] - php-versions: ['7.1', '7.2', '7.3'] + php-versions: ['7.2', '7.3', '7.4'] name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} runs-on: ${{ matrix.operating-system }} @@ -21,8 +21,7 @@ jobs: uses: shivammathur/setup-php@master with: php-version: ${{ matrix.php-versions }} - extension-csv: mbstring, xdebug - coverage: xdebug + extension-csv: mbstring - name: Get Composer Cache Directory id: composer-cache @@ -43,3 +42,25 @@ jobs: - name: Run test suite run: composer run-script test + + sonarcloud: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + steps: + - uses: actions/checkout@v1 + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: 7.4 + extension-csv: mbstring, xdebug + coverage: xdebug + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run test suite + run: composer run-script test -- --coverage-clover=coverage.clover + + - run: wget https://scrutinizer-ci.com/ocular.phar + - name: Upload code coverage + run: php ocular.phar code-coverage:upload --format=php-clover coverage.clover \ No newline at end of file diff --git a/.gitignore b/.gitignore index a2fd533..b500700 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ node_modules static /vendor +.phpunit.result.cache /prettier.config.js /.eslintrc.js diff --git a/.travis.yml b/.travis.yml index f12c7eb..71fbe79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,7 @@ language: php php: - - '7.1' - - '7.2' - - '7.3' + - '7.4' - nightly matrix: @@ -11,27 +9,7 @@ matrix: - php: nightly before_script: - - composer install --dev --prefer-source + - composer install --prefer-dist --no-progress --no-suggest script: - - vendor/bin/phpunit --coverage-clover=coverage.clover - -after_script: - - wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover coverage.clover - -jobs: - include: - - stage: "Deploy Documentation" - php: "7.3" - script: skip - before_deploy: - - composer install - - bin/daux generate - deploy: - provider: pages - local_dir: static - skip_cleanup: true - github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard - on: - branch: master + - vendor/bin/phpunit diff --git a/README.md b/README.md index 3ae19f7..fab2957 100755 --- a/README.md +++ b/README.md @@ -234,7 +234,7 @@ You can then point your browser to http://localhost:8086 ## PHP Requirements -Daux.io is compatible with PHP 7.1.3 and up. +Daux.io is compatible with PHP 7.2.0 and up. The reason is because some dependencies we have (mainly Symfony and Guzzle) do not support PHP 5.6 anymore. diff --git a/composer.json b/composer.json index 24c5592..c30694a 100644 --- a/composer.json +++ b/composer.json @@ -17,18 +17,19 @@ ], "bin": ["bin/daux"], "require": { - "php": ">=7.1.3", + "php": ">=7.2", "guzzlehttp/guzzle": "~6.0", - "league/commonmark": "^0.18", + "league/commonmark": "^1.0.0", + "league/commonmark-ext-table": "^2.0.0", "league/plates": "~3.1", "myclabs/deep-copy": "^1.5", - "symfony/console": "^4.0", - "symfony/http-foundation": "^4.0", + "symfony/console": "^5.0", + "symfony/http-foundation": "^5.0", "symfony/polyfill-intl-icu": "^1.10", - "symfony/process": "^4.0", - "webuni/commonmark-table-extension": "0.9.*", + "symfony/process": "^5.0", "webuni/front-matter": "^1.0.0", - "scrivo/highlight.php": "^9.15" + "scrivo/highlight.php": "^9.15", + "symfony/mime": "^5.0" }, "suggest":{ "ext-intl": "Allows to translate the modified at date" @@ -42,7 +43,7 @@ "justinwalsh/daux.io": "*" }, "require-dev": { - "phpunit/phpunit": "~7.4", + "phpunit/phpunit": "^8.0", "mikey179/vfsstream": "^1.6" }, "scripts": { diff --git a/composer.lock b/composer.lock index f7f244e..0340af2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3df8e368fea890f0e123788f898cddc9", + "content-hash": "24a4b0892dabafe6c29fa4674558d300", "packages": [ { "name": "guzzlehttp/guzzle", @@ -196,34 +196,36 @@ }, { "name": "league/commonmark", - "version": "0.18.5", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "f94e18d68260f43a7d846279cad88405854b1306" + "reference": "d74654d85954e3b9451d67faaebacd210fc70252" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f94e18d68260f43a7d846279cad88405854b1306", - "reference": "f94e18d68260f43a7d846279cad88405854b1306", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d74654d85954e3b9451d67faaebacd210fc70252", + "reference": "d74654d85954e3b9451d67faaebacd210fc70252", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=5.6.5" + "php": "^7.1" }, "replace": { "colinodell/commonmark-php": "*" }, "require-dev": { "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.28", + "commonmark/commonmark.js": "0.29.0", "erusev/parsedown": "~1.0", + "ext-json": "*", "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.2", - "phpunit/phpunit": "^5.7.27|^6.5.14", - "scrutinizer/ocular": "^1.1", - "symfony/finder": "^3.0|^4.0" + "mikehaertl/php-shellcommand": "^1.4", + "phpstan/phpstan-shim": "^0.11.5", + "phpunit/phpunit": "^7.5", + "scrutinizer/ocular": "^1.5", + "symfony/finder": "^4.2" }, "suggest": { "league/commonmark-extras": "Library of useful extensions including smart punctuation" @@ -234,12 +236,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.19-dev" + "dev-master": "1.2-dev" } }, "autoload": { "psr-4": { - "League\\CommonMark\\": "src/" + "League\\CommonMark\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -255,13 +257,78 @@ } ], "description": "PHP Markdown parser based on the CommonMark spec", - "homepage": "https://github.com/thephpleague/commonmark", + "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", "markdown", "parser" ], - "time": "2019-03-28T13:52:31+00:00" + "time": "2019-11-11T22:23:29+00:00" + }, + { + "name": "league/commonmark-ext-table", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark-ext-table.git", + "reference": "3228888ea69636e855efcf6636ff8e6316933fe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark-ext-table/zipball/3228888ea69636e855efcf6636ff8e6316933fe7", + "reference": "3228888ea69636e855efcf6636ff8e6316933fe7", + "shasum": "" + }, + "require": { + "league/commonmark": "~0.19.3|^1.0", + "php": "^7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "phpstan/phpstan": "~0.11", + "phpunit/phpunit": "^7.0|^8.0", + "symfony/var-dumper": "^4.0", + "vimeo/psalm": "^3.0" + }, + "type": "commonmark-extension", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\Ext\\Table\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Hasoň", + "email": "martin.hason@gmail.com" + }, + { + "name": "Webuni s.r.o.", + "homepage": "https://www.webuni.cz" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Table extension for league/commonmark", + "homepage": "https://github.com/thephpleague/commonmark-ext-table", + "keywords": [ + "commonmark", + "extension", + "markdown", + "table" + ], + "time": "2019-09-26T13:28:33+00:00" }, { "name": "league/plates", @@ -574,41 +641,41 @@ }, { "name": "symfony/console", - "version": "v4.4.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8" + "reference": "1ece22ce0c2d54572dafcd114cc08c0031cc0ac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8", - "reference": "35d9077f495c6d184d9930f7a7ecbd1ad13c7ab8", + "url": "https://api.github.com/repos/symfony/console/zipball/1ece22ce0c2d54572dafcd114cc08c0031cc0ac3", + "reference": "1ece22ce0c2d54572dafcd114cc08c0031cc0ac3", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.5", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/service-contracts": "^1.1|^2" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -619,7 +686,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -646,35 +713,35 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-11-13T07:39:40+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "502040dd2b0cf0a292defeb6145f4d7a4753c99c" + "reference": "c5c226b6f164ae4f95c4bffbe940c81050940eda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/502040dd2b0cf0a292defeb6145f4d7a4753c99c", - "reference": "502040dd2b0cf0a292defeb6145f4d7a4753c99c", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c5c226b6f164ae4f95c4bffbe940c81050940eda", + "reference": "c5c226b6f164ae4f95c4bffbe940c81050940eda", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/mime": "^4.3|^5.0", + "php": "^7.2.5", + "symfony/mime": "^4.4|^5.0", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" + "symfony/expression-language": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -701,28 +768,28 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-11-17T10:10:42+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { "name": "symfony/intl", - "version": "v4.3.3", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "741376a9127841ffae39f197f8bd0ab2d4772157" + "reference": "1a700ae25f25f1f7b2201da020184bff5a8912c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/741376a9127841ffae39f197f8bd0ab2d4772157", - "reference": "741376a9127841ffae39f197f8bd0ab2d4772157", + "url": "https://api.github.com/repos/symfony/intl/zipball/1a700ae25f25f1f7b2201da020184bff5a8912c0", + "reference": "1a700ae25f25f1f7b2201da020184bff5a8912c0", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.5", "symfony/polyfill-intl-icu": "~1.0" }, "require-dev": { - "symfony/filesystem": "~3.4|~4.0" + "symfony/filesystem": "^4.4|^5.0" }, "suggest": { "ext-intl": "to use the component with locales other than \"en\"" @@ -730,7 +797,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -776,24 +843,24 @@ "l10n", "localization" ], - "time": "2019-07-24T14:47:54+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { "name": "symfony/mime", - "version": "v4.4.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "89da7b68b7149aab065c09b97f938753ab52831f" + "reference": "76f3c09b7382bf979af7bcd8e6f8033f1324285e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/89da7b68b7149aab065c09b97f938753ab52831f", - "reference": "89da7b68b7149aab065c09b97f938753ab52831f", + "url": "https://api.github.com/repos/symfony/mime/zipball/76f3c09b7382bf979af7bcd8e6f8033f1324285e", + "reference": "76f3c09b7382bf979af7bcd8e6f8033f1324285e", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.5", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -802,12 +869,12 @@ }, "require-dev": { "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^3.4|^4.1|^5.0" + "symfony/dependency-injection": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -838,20 +905,20 @@ "mime", "mime-type" ], - "time": "2019-11-13T07:39:40+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "550ebaac289296ce228a706d0867afc34687e3f4" + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", - "reference": "550ebaac289296ce228a706d0867afc34687e3f4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", "shasum": "" }, "require": { @@ -863,7 +930,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -896,20 +963,20 @@ "polyfill", "portable" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "66810b9d6eb4af54d543867909d65ab9af654d7e" + "reference": "b3dffd68afa61ca70f2327f2dd9bbeb6aa53d70b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/66810b9d6eb4af54d543867909d65ab9af654d7e", - "reference": "66810b9d6eb4af54d543867909d65ab9af654d7e", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/b3dffd68afa61ca70f2327f2dd9bbeb6aa53d70b", + "reference": "b3dffd68afa61ca70f2327f2dd9bbeb6aa53d70b", "shasum": "" }, "require": { @@ -922,7 +989,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -954,20 +1021,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", "shasum": "" }, "require": { @@ -981,7 +1048,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -1016,20 +1083,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", - "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", "shasum": "" }, "require": { @@ -1041,7 +1108,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -1075,20 +1142,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T14:18:11+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "04ce3335667451138df4307d6a9b61565560199e" + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", - "reference": "04ce3335667451138df4307d6a9b61565560199e", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", "shasum": "" }, "require": { @@ -1097,7 +1164,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -1130,20 +1197,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188" + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/2ceb49eaccb9352bff54d22570276bb75ba4a188", - "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", "shasum": "" }, "require": { @@ -1152,7 +1219,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -1188,29 +1255,29 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2019-11-27T16:25:15+00:00" }, { "name": "symfony/process", - "version": "v4.4.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "75ad33d9b6f25325ebc396d68ad86fd74bcfbb06" + "reference": "110f98bed214a007eb440c7bb14088fed96f847f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/75ad33d9b6f25325ebc396d68ad86fd74bcfbb06", - "reference": "75ad33d9b6f25325ebc396d68ad86fd74bcfbb06", + "url": "https://api.github.com/repos/symfony/process/zipball/110f98bed214a007eb440c7bb14088fed96f847f", + "reference": "110f98bed214a007eb440c7bb14088fed96f847f", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.2.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1237,24 +1304,24 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-10-28T20:30:34+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { "name": "symfony/service-contracts", - "version": "v1.1.8", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" + "reference": "9d99e1556417bf227a62e14856d630672bf10eaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/9d99e1556417bf227a62e14856d630672bf10eaf", + "reference": "9d99e1556417bf227a62e14856d630672bf10eaf", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.9", "psr/container": "^1.0" }, "suggest": { @@ -1263,7 +1330,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1295,20 +1362,20 @@ "interoperability", "standards" ], - "time": "2019-10-14T12:27:06+00:00" + "time": "2019-11-09T09:18:34+00:00" }, { "name": "symfony/yaml", - "version": "v4.2.9", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6712daf03ee25b53abb14e7e8e0ede1a770efdb1" + "reference": "76de473358fe802578a415d5bb43c296cf09d211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6712daf03ee25b53abb14e7e8e0ede1a770efdb1", - "reference": "6712daf03ee25b53abb14e7e8e0ede1a770efdb1", + "url": "https://api.github.com/repos/symfony/yaml/zipball/76de473358fe802578a415d5bb43c296cf09d211", + "reference": "76de473358fe802578a415d5bb43c296cf09d211", "shasum": "" }, "require": { @@ -1319,7 +1386,7 @@ "symfony/console": "<3.4" }, "require-dev": { - "symfony/console": "~3.4|~4.0" + "symfony/console": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -1327,7 +1394,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -1354,66 +1421,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-03-30T15:58:42+00:00" - }, - { - "name": "webuni/commonmark-table-extension", - "version": "0.9.0", - "source": { - "type": "git", - "url": "https://github.com/webuni/commonmark-table-extension.git", - "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/94bc98d802d0b706e748716854e5fa0bd3644df3", - "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3", - "shasum": "" - }, - "require": { - "league/commonmark": "^0.16|^0.17|^0.18", - "php": "^5.6|^7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^5.4|^6.0", - "symfony/var-dumper": "^3.0|^4.0", - "vimeo/psalm": "~0.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9-dev" - } - }, - "autoload": { - "psr-4": { - "Webuni\\CommonMark\\TableExtension\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Martin Hasoň", - "email": "martin.hason@gmail.com" - }, - { - "name": "Webuni s.r.o.", - "homepage": "https://www.webuni.cz" - } - ], - "description": "The table extension for CommonMark PHP implementation", - "homepage": "https://github.com/webuni/commonmark-table-extension", - "keywords": [ - "commonmark", - "markdown", - "table" - ], - "abandoned": "league/commonmark-ext-table", - "time": "2018-11-28T11:29:11+00:00" + "time": "2019-11-12T14:51:11+00:00" }, { "name": "webuni/front-matter", @@ -1487,16 +1495,16 @@ "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "a2c590166b2133a4633738648b6b064edae0814a" + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", - "reference": "a2c590166b2133a4633738648b6b064edae0814a", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", "shasum": "" }, "require": { @@ -1539,7 +1547,7 @@ "constructor", "instantiate" ], - "time": "2019-03-17T17:37:11+00:00" + "time": "2019-10-21T16:45:58+00:00" }, { "name": "mikey179/vfsstream", @@ -1904,40 +1912,40 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.1.4", + "version": "7.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", + "phpunit/php-token-stream": "^3.1.1", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", + "sebastian/environment": "^4.2.2", "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" + "theseer/tokenizer": "^1.1.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^8.2.2" }, "suggest": { - "ext-xdebug": "^2.6.0" + "ext-xdebug": "^2.7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "7.0-dev" } }, "autoload": { @@ -1963,7 +1971,7 @@ "testing", "xunit" ], - "time": "2018-10-31T16:06:48+00:00" + "time": "2019-11-20T13:55:58+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2156,53 +2164,52 @@ }, { "name": "phpunit/phpunit", - "version": "7.5.17", + "version": "8.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a" + "reference": "67f9e35bffc0dd52d55d565ddbe4230454fd6a4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4c92a15296e58191a4cd74cff3b34fc8e374174a", - "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/67f9e35bffc0dd52d55d565ddbe4230454fd6a4e", + "reference": "67f9e35bffc0dd52d55d565ddbe4230454fd6a4e", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.1", + "doctrine/instantiator": "^1.2.0", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.2", + "phpspec/prophecy": "^1.8.1", + "phpunit/php-code-coverage": "^7.0.7", + "phpunit/php-file-iterator": "^2.0.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^4.0", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.2", + "sebastian/exporter": "^3.1.1", + "sebastian/global-state": "^3.0.0", "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", "sebastian/version": "^2.0.1" }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" - }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-soap": "*", "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" + "phpunit/php-invoker": "^2.0.0" }, "bin": [ "phpunit" @@ -2210,7 +2217,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.5-dev" + "dev-master": "8.4-dev" } }, "autoload": { @@ -2236,7 +2243,7 @@ "testing", "xunit" ], - "time": "2019-10-28T10:37:36+00:00" + "time": "2019-11-06T09:42:23+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -2405,16 +2412,16 @@ }, { "name": "sebastian/environment", - "version": "4.2.2", + "version": "4.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", - "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", "shasum": "" }, "require": { @@ -2454,7 +2461,7 @@ "environment", "hhvm" ], - "time": "2019-05-05T09:05:15+00:00" + "time": "2019-11-20T08:46:58+00:00" }, { "name": "sebastian/exporter", @@ -2525,23 +2532,26 @@ }, { "name": "sebastian/global-state", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "ext-dom": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { "ext-uopz": "*" @@ -2549,7 +2559,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2572,7 +2582,7 @@ "keywords": [ "global state" ], - "time": "2017-04-27T15:39:26+00:00" + "time": "2019-02-01T05:30:01+00:00" }, { "name": "sebastian/object-enumerator", @@ -2761,6 +2771,52 @@ "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "time": "2018-10-04T04:07:39+00:00" }, + { + "name": "sebastian/type", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "time": "2019-07-02T08:10:15+00:00" + }, { "name": "sebastian/version", "version": "2.0.1", @@ -2846,31 +2902,29 @@ }, { "name": "webmozart/assert", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", - "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", + "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0", "symfony/polyfill-ctype": "^1.8" }, + "conflict": { + "vimeo/psalm": "<3.6.0" + }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -2892,7 +2946,7 @@ "check", "validate" ], - "time": "2019-08-24T08:43:50+00:00" + "time": "2019-11-24T13:36:37+00:00" } ], "aliases": [], @@ -2901,7 +2955,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.1.3" + "php": ">=7.2" }, "platform-dev": [] } diff --git a/docs/00_Getting_Started.md b/docs/00_Getting_Started.md index a3dc07b..de22c26 100644 --- a/docs/00_Getting_Started.md +++ b/docs/00_Getting_Started.md @@ -145,7 +145,7 @@ Now that you got the basics, you can also [see what you can configure](05_Config ## PHP Requirements -Daux.io is compatible with PHP 7.1.3 and up. +Daux.io is compatible with PHP 7.2.0 and up. The reason is because some dependencies we have (mainly Symfony and Guzzle) do not support PHP 5.6 anymore. diff --git a/libs/ContentTypes/Markdown/CommonMarkConverter.php b/libs/ContentTypes/Markdown/CommonMarkConverter.php index 4c1a479..3f80bbe 100644 --- a/libs/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/ContentTypes/Markdown/CommonMarkConverter.php @@ -3,8 +3,9 @@ use League\CommonMark\DocParser; use League\CommonMark\Environment; use League\CommonMark\HtmlRenderer; +use League\CommonMark\Ext\Table\TableExtension; +use League\CommonMark\Inline\Element as InlineElement; use Todaymade\Daux\Config; -use Webuni\CommonMark\TableExtension\TableExtension; class CommonMarkConverter extends \League\CommonMark\CommonMarkConverter { @@ -39,6 +40,6 @@ class CommonMarkConverter extends \League\CommonMark\CommonMarkConverter protected function extendEnvironment(Environment $environment, Config $config) { - $environment->addInlineRenderer('Link', $this->getLinkRenderer($environment)); + $environment->addInlineRenderer(InlineElement\Link::class, $this->getLinkRenderer($environment)); } } diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index 13018b7..9e32ede 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -4,12 +4,15 @@ use League\CommonMark\ElementRendererInterface; use League\CommonMark\HtmlElement; use League\CommonMark\Inline\Element\AbstractInline; use League\CommonMark\Inline\Element\Link; +use League\CommonMark\Inline\Renderer\InlineRendererInterface; +use League\CommonMark\Util\ConfigurationAwareInterface; +use League\CommonMark\Util\ConfigurationInterface; use Todaymade\Daux\Config; use Todaymade\Daux\DauxHelper; use Todaymade\Daux\Exception\LinkNotFoundException; use Todaymade\Daux\Tree\Entry; -class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer +class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterface { /** * @var Config @@ -66,6 +69,7 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer protected function isExternalUrl($url) { return preg_match('#^(?:[a-z]+:)?//|^mailto:#', $url); + $this->parent = new \League\CommonMark\Inline\Renderer\LinkRenderer(); } /** @@ -87,7 +91,7 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer ); } - $element = parent::render($inline, $htmlRenderer); + $element = $this->parent->render($inline, $htmlRenderer); $url = $inline->getUrl(); @@ -116,7 +120,7 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer $url = DauxHelper::getRelativePath($this->daux->getCurrentPage()->getUrl(), $file->getUrl()); } catch (LinkNotFoundException $e) { - + // For some reason, the filename could contain a # and thus the link needs to resolve to that. try { @@ -148,4 +152,13 @@ class LinkRenderer extends \League\CommonMark\Inline\Renderer\LinkRenderer return $element; } + + /** + * @param ConfigurationInterface $configuration + */ + public function setConfiguration(ConfigurationInterface $configuration) + { + $this->config = $configuration; + $this->parent->setConfiguration($configuration); + } } diff --git a/libs/ContentTypes/Markdown/TableOfContents.php b/libs/ContentTypes/Markdown/TableOfContents.php index 81384e4..f52cf0c 100644 --- a/libs/ContentTypes/Markdown/TableOfContents.php +++ b/libs/ContentTypes/Markdown/TableOfContents.php @@ -12,17 +12,7 @@ class TableOfContents extends AbstractBlock * * @return bool */ - public function canContain(AbstractBlock $block) - { - return false; - } - - /** - * Returns true if block type can accept lines of text - * - * @return bool - */ - public function acceptsLines() + public function canContain(AbstractBlock $block): bool { return false; } @@ -32,7 +22,7 @@ class TableOfContents extends AbstractBlock * * @return bool */ - public function isCode() + public function isCode(): bool { return false; } @@ -42,7 +32,7 @@ class TableOfContents extends AbstractBlock * * @return bool */ - public function matchesNextLine(Cursor $cursor) + public function matchesNextLine(Cursor $cursor): bool { return false; } diff --git a/libs/ContentTypes/Markdown/TableOfContentsParser.php b/libs/ContentTypes/Markdown/TableOfContentsParser.php index 73a2a5d..f082492 100644 --- a/libs/ContentTypes/Markdown/TableOfContentsParser.php +++ b/libs/ContentTypes/Markdown/TableOfContentsParser.php @@ -1,10 +1,10 @@ isIndented()) { return false; diff --git a/libs/Format/Confluence/ContentTypes/Markdown/CommonMarkConverter.php b/libs/Format/Confluence/ContentTypes/Markdown/CommonMarkConverter.php index 39ae5f1..1c2f166 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/CommonMarkConverter.php @@ -1,7 +1,10 @@ addBlockRenderer('Todaymade\Daux\ContentTypes\Markdown\TableOfContents', new TOCRenderer()); + $environment->addBlockRenderer(TableOfContents::class, new TOCRenderer()); //Add code renderer - $environment->addBlockRenderer('FencedCode', new FencedCodeRenderer()); - $environment->addBlockRenderer('IndentedCode', new IndentedCodeRenderer()); + $environment->addBlockRenderer(BlockElement\FencedCode::class, new FencedCodeRenderer()); + $environment->addBlockRenderer(BlockElement\IndentedCode::class, new IndentedCodeRenderer()); - $environment->addInlineRenderer('Image', new ImageRenderer()); + $environment->addInlineRenderer(InlineElement\Image::class, new ImageRenderer()); } } diff --git a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php index a135565..288670e 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php @@ -4,9 +4,20 @@ use League\CommonMark\ElementRendererInterface; use League\CommonMark\HtmlElement; use League\CommonMark\Inline\Element\AbstractInline; use League\CommonMark\Inline\Element\Image; +use League\CommonMark\Util\ConfigurationAwareInterface; +use League\CommonMark\Util\ConfigurationInterface; -class ImageRenderer extends \League\CommonMark\Inline\Renderer\ImageRenderer +class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterface { + /** + * @var ConfigurationInterface + */ + protected $config; + + public function __construct() { + $this->parent = new \League\CommonMark\Inline\Renderer\ImageRenderer(); + } + /** * @param Image $inline * @param ElementRendererInterface $htmlRenderer @@ -30,4 +41,13 @@ class ImageRenderer extends \League\CommonMark\Inline\Renderer\ImageRenderer return parent::render($inline, $htmlRenderer); } + + /** + * @param ConfigurationInterface $configuration + */ + public function setConfiguration(ConfigurationInterface $configuration) + { + $this->config = $configuration; + $this->parent->setConfiguration($configuration); + } } diff --git a/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php b/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php index 96d8f37..8d2a123 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php @@ -1,7 +1,10 @@ addBlockRenderer('FencedCode', new FencedCodeRenderer()); + $environment->addBlockRenderer(BlockElement\FencedCode::class, new FencedCodeRenderer()); - $environment->addDocumentProcessor(new TOC\Processor($config)); - $environment->addBlockRenderer('Todaymade\Daux\ContentTypes\Markdown\TableOfContents', new TOC\Renderer($config)); + $processor = new TOC\Processor($config); + $environment->addEventListener(DocumentParsedEvent::class, [$processor, 'onDocumentParsed']); + $environment->addBlockRenderer(TableOfContents::class, new TOC\Renderer($config)); } } diff --git a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php index 1989d87..100ab42 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php +++ b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php @@ -7,7 +7,7 @@ use League\CommonMark\Block\Element\ListBlock; use League\CommonMark\Block\Element\ListData; use League\CommonMark\Block\Element\ListItem; use League\CommonMark\Block\Element\Paragraph; -use League\CommonMark\DocumentProcessorInterface; +use League\CommonMark\Event\DocumentParsedEvent; use League\CommonMark\Inline\Element\Link; use League\CommonMark\Inline\Element\Text; use League\CommonMark\Node\Node; @@ -15,7 +15,7 @@ use ReflectionMethod; use Todaymade\Daux\Config; use Todaymade\Daux\ContentTypes\Markdown\TableOfContents; -class Processor implements DocumentProcessorInterface +class Processor { protected $config; @@ -30,12 +30,13 @@ class Processor implements DocumentProcessorInterface } /** - * @param Document $document + * @param DocumentParsedEvent $event * * @return void */ - public function processDocument(Document $document) + public function onDocumentParsed(DocumentParsedEvent $event) { + $document = $event->getDocument(); /** @var TableOfContents[] $tocs */ $tocs = []; diff --git a/libs/Server/ExtensionMimeTypeGuesser.php b/libs/Server/ExtensionMimeTypeGuesser.php index 1dff5d8..e8c8610 100644 --- a/libs/Server/ExtensionMimeTypeGuesser.php +++ b/libs/Server/ExtensionMimeTypeGuesser.php @@ -1,29 +1,12 @@ guess($path); + $extension = pathinfo($path,PATHINFO_EXTENSION); + + if ($extension == "css") { + return "text/css"; + } + + if ($extension == "js") { + return "application/javascript"; + } } } diff --git a/libs/Server/Server.php b/libs/Server/Server.php index cafc627..3a34ea3 100755 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -97,7 +97,8 @@ class Server * @return Response */ public function createResponse(Page $page) { - + // Add a custom MimeType guesser in case the default ones are not available + // This makes sure that at least CSS and JS work fine. $mimeTypes = MimeTypes::getDefault(); $mimeTypes->registerGuesser(new ExtensionMimeTypeGuesser()); diff --git a/tests/Tree/BuilderIntegrationTest.php b/tests/Tree/BuilderIntegrationTest.php index dcea5fd..479c67f 100644 --- a/tests/Tree/BuilderIntegrationTest.php +++ b/tests/Tree/BuilderIntegrationTest.php @@ -14,7 +14,7 @@ class BuilderIntegrationTest extends TestCase */ private $root; - public function setUp() + public function setUp(): void { $structure = [ 'Contents' => [ From 4c7f3816f8b6fb9d06f052c8e7b671986ce32384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 22:41:53 +0100 Subject: [PATCH 30/95] Fix small issues --- libs/Console/ClearCache.php | 2 ++ libs/Console/Generate.php | 2 ++ libs/Console/Serve.php | 2 ++ libs/ContentTypes/Markdown/LinkRenderer.php | 2 +- libs/Server/ExtensionMimeTypeGuesser.php | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/Console/ClearCache.php b/libs/Console/ClearCache.php index b8a2087..04a7317 100644 --- a/libs/Console/ClearCache.php +++ b/libs/Console/ClearCache.php @@ -19,5 +19,7 @@ class ClearCache extends SymfonyCommand $output->writeln("Clearing cache at '" . Cache::getDirectory() ."'"); Cache::clear(); $output->writeln("Cache cleared"); + + return 0; } } diff --git a/libs/Console/Generate.php b/libs/Console/Generate.php index 158ef9d..3101bef 100755 --- a/libs/Console/Generate.php +++ b/libs/Console/Generate.php @@ -54,6 +54,8 @@ class Generate extends DauxCommand // Generate the documentation $daux->getGenerator()->generateAll($input, $output, $width); + + return 0; } protected function prepareProcessor(Daux $daux, InputInterface $input, OutputInterface $output, $width) diff --git a/libs/Console/Serve.php b/libs/Console/Serve.php index e8de8d6..8e1465e 100755 --- a/libs/Console/Serve.php +++ b/libs/Console/Serve.php @@ -49,5 +49,7 @@ class Serve extends DauxCommand echo "Daux development server started on http://{$host}:{$port}/\n"; passthru("{$binary} -S {$host}:{$port} {$base}/index.php"); + + return 0; } } diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index 9e32ede..2cf6f21 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -22,6 +22,7 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa public function __construct($daux) { $this->daux = $daux; + $this->parent = new \League\CommonMark\Inline\Renderer\LinkRenderer(); } /** @@ -69,7 +70,6 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa protected function isExternalUrl($url) { return preg_match('#^(?:[a-z]+:)?//|^mailto:#', $url); - $this->parent = new \League\CommonMark\Inline\Renderer\LinkRenderer(); } /** diff --git a/libs/Server/ExtensionMimeTypeGuesser.php b/libs/Server/ExtensionMimeTypeGuesser.php index e8c8610..e6ac395 100644 --- a/libs/Server/ExtensionMimeTypeGuesser.php +++ b/libs/Server/ExtensionMimeTypeGuesser.php @@ -29,5 +29,7 @@ class ExtensionMimeTypeGuesser implements MimeTypeGuesserInterface if ($extension == "js") { return "application/javascript"; } + + return null; } } From 56efd83f2cbdddf3d204be140e0dd74b88650c1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 22:46:35 +0100 Subject: [PATCH 31/95] Add dom extension --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index ed5e506..4f31803 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -21,7 +21,7 @@ jobs: uses: shivammathur/setup-php@master with: php-version: ${{ matrix.php-versions }} - extension-csv: mbstring + extension-csv: mbstring, dom - name: Get Composer Cache Directory id: composer-cache @@ -52,7 +52,7 @@ jobs: uses: shivammathur/setup-php@master with: php-version: 7.4 - extension-csv: mbstring, xdebug + extension-csv: mbstring, xdebug, dom coverage: xdebug - name: Install dependencies From 13be1805826630301fa2d83d88cbfb4edff2f6c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 23:32:33 +0100 Subject: [PATCH 32/95] Fix lots of scrutinizer warnings, remove Travis --- .github/workflows/php.yml | 30 +++++++++++-------- .travis.yml | 15 ---------- README.md | 2 +- libs/Cache.php | 21 +++++++------ libs/ContentTypes/Markdown/LinkRenderer.php | 6 +++- .../Markdown/FencedCodeRenderer.php | 4 +-- .../ContentTypes/Markdown/ImageRenderer.php | 6 +++- .../Markdown/IndentedCodeRenderer.php | 2 +- libs/Format/HTML/ContentPage.php | 5 ++++ .../Markdown/FencedCodeRenderer.php | 13 +++++--- .../ContentTypes/Markdown/TOC/Renderer.php | 5 ++++ libs/Format/HTML/Generator.php | 3 ++ .../Markdown/CommonMarkConverter.php | 1 - libs/Format/HTMLFile/Generator.php | 5 +++- libs/Tree/Content.php | 14 ++++----- libs/Tree/ContentAbstract.php | 4 +-- libs/Tree/Directory.php | 21 ++++++------- libs/Tree/Entry.php | 14 ++++----- libs/Tree/Root.php | 6 ++-- 19 files changed, 97 insertions(+), 80 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 4f31803..9e439fc 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -23,27 +23,16 @@ jobs: php-version: ${{ matrix.php-versions }} extension-csv: mbstring, dom - - name: Get Composer Cache Directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - name: Validate composer.json and composer.lock run: composer validate - - name: Cache vendor - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest - name: Run test suite run: composer run-script test - sonarcloud: + scrutinizer-ci: runs-on: ubuntu-latest if: github.event_name != 'pull_request' steps: @@ -63,4 +52,19 @@ jobs: - run: wget https://scrutinizer-ci.com/ocular.phar - name: Upload code coverage - run: php ocular.phar code-coverage:upload --format=php-clover coverage.clover \ No newline at end of file + run: php ocular.phar code-coverage:upload --format=php-clover coverage.clover + + documentation: + runs-on: ubuntu-latest + if: github.repository == 'dauxio/daux.io' && github.event_name != 'pull_request' && github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v1 + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + - name: Generate documentation + run: vendor/bin/daux generate + - uses: JamesIves/github-pages-deploy-action@2.0.3 + env: + FOLDER: "static" + BRANCH: gh-pages + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 71fbe79..0000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: php - -php: - - '7.4' - - nightly - -matrix: - allow_failures: - - php: nightly - -before_script: - - composer install --prefer-dist --no-progress --no-suggest - -script: - - vendor/bin/phpunit diff --git a/README.md b/README.md index fab2957..42f639c 100755 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Latest Version](https://img.shields.io/github/release/dauxio/daux.io.svg?style=flat-square)](https://github.com/dauxio/daux.io/releases) [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://github.com/dauxio/daux.io/blob/master/LICENSE.md) -[![Build Status](https://img.shields.io/travis/dauxio/daux.io/master.svg?style=flat-square)](https://travis-ci.org/dauxio/daux.io) +[![Build Status](https://github.com/dauxio/daux.io/workflows/CI/badge.svg)](https://github.com/dauxio/daux.io/actions) [![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/dauxio/daux.io.svg?style=flat-square)](https://scrutinizer-ci.com/g/dauxio/daux.io/code-structure) [![Quality Score](https://img.shields.io/scrutinizer/g/dauxio/daux.io.svg?style=flat-square)](https://scrutinizer-ci.com/g/dauxio/daux.io) [![Total Downloads](https://img.shields.io/packagist/dt/daux/daux.io.svg?style=flat-square)](https://packagist.org/packages/daux/daux.io) diff --git a/libs/Cache.php b/libs/Cache.php index e1f88bc..4fc7eb3 100644 --- a/libs/Cache.php +++ b/libs/Cache.php @@ -5,10 +5,9 @@ use Todaymade\Daux\Daux; class Cache { - static $printed = false; - public static function getDirectory() + public static function getDirectory(): string { $dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "dauxio" . DIRECTORY_SEPARATOR; @@ -24,10 +23,10 @@ class Cache * Store an item in the cache for a given number of minutes. * * @param string $key - * @param mixed $value + * @param string $value * @return void */ - public static function put($key, $value) + public static function put(string $key, string $value): void { Cache::ensureCacheDirectoryExists($path = Cache::path($key)); file_put_contents($path, $value); @@ -39,7 +38,7 @@ class Cache * @param string $path * @return void */ - protected static function ensureCacheDirectoryExists($path) + protected static function ensureCacheDirectoryExists(string $path): void { $parent = dirname($path); @@ -54,7 +53,7 @@ class Cache * @param string $key * @return bool */ - public static function forget($key) + public static function forget(string $key): bool { $path = Cache::path($key); @@ -68,10 +67,10 @@ class Cache /** * Retrieve an item from the cache by key. * - * @param string|array $key + * @param string $key * @return mixed */ - public static function get($key) + public static function get(string $key): ?string { $path = Cache::path($key); @@ -88,18 +87,18 @@ class Cache * @param string $key * @return string */ - protected static function path($key) + protected static function path(string $key): string { $parts = array_slice(str_split($hash = sha1($key), 2), 0, 2); return Cache::getDirectory() . '/' . implode('/', $parts) . '/' . $hash; } - public static function clear() + public static function clear(): void { Cache::rrmdir(Cache::getDirectory()); } - protected static function rrmdir($dir) + protected static function rrmdir(string $dir): void { if (is_dir($dir)) { $objects = scandir($dir); diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index 2cf6f21..b5bc7d9 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -19,6 +19,11 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa */ protected $daux; + /** + * @var \League\CommonMark\Inline\Renderer\LinkRenderer + */ + protected $parent; + public function __construct($daux) { $this->daux = $daux; @@ -158,7 +163,6 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa */ public function setConfiguration(ConfigurationInterface $configuration) { - $this->config = $configuration; $this->parent->setConfiguration($configuration); } } diff --git a/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php index 5d50682..b39d5aa 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php @@ -37,7 +37,7 @@ class FencedCodeRenderer extends CodeRenderer /** * @param AbstractBlock $block - * @param HtmlRendererInterface $htmlRenderer + * @param ElementRendererInterface $htmlRenderer * @param bool $inTightList * * @return HtmlElement|string @@ -59,7 +59,7 @@ class FencedCodeRenderer extends CodeRenderer return false; } - $language = Xml::escape($infoWords[0], true); + $language = Xml::escape($infoWords[0]); if (array_key_exists($language, $this->known_conversions)) { $language = $this->known_conversions[$language]; diff --git a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php index 288670e..8d994d1 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php @@ -14,6 +14,11 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf */ protected $config; + /** + * @var \League\CommonMark\Inline\Renderer\LinkRenderer + */ + protected $parent; + public function __construct() { $this->parent = new \League\CommonMark\Inline\Renderer\ImageRenderer(); } @@ -47,7 +52,6 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf */ public function setConfiguration(ConfigurationInterface $configuration) { - $this->config = $configuration; $this->parent->setConfiguration($configuration); } } diff --git a/libs/Format/Confluence/ContentTypes/Markdown/IndentedCodeRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/IndentedCodeRenderer.php index 5e3cb09..3e04fb7 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/IndentedCodeRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/IndentedCodeRenderer.php @@ -9,7 +9,7 @@ class IndentedCodeRenderer extends CodeRenderer { /** * @param AbstractBlock $block - * @param HtmlRendererInterface $htmlRenderer + * @param ElementRendererInterface $htmlRenderer * @param bool $inTightList * * @return HtmlElement diff --git a/libs/Format/HTML/ContentPage.php b/libs/Format/HTML/ContentPage.php index 5ad705b..79e9da1 100644 --- a/libs/Format/HTML/ContentPage.php +++ b/libs/Format/HTML/ContentPage.php @@ -7,6 +7,11 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage private $language; private $homepage; + /** + * @var Template + */ + public $templateRenderer; + private function isHomepage() { // If the current page isn't the index, no chance it is the landing page diff --git a/libs/Format/HTML/ContentTypes/Markdown/FencedCodeRenderer.php b/libs/Format/HTML/ContentTypes/Markdown/FencedCodeRenderer.php index 44f0d0a..e1710e1 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/FencedCodeRenderer.php +++ b/libs/Format/HTML/ContentTypes/Markdown/FencedCodeRenderer.php @@ -10,13 +10,18 @@ use League\CommonMark\Util\Xml; class FencedCodeRenderer implements BlockRendererInterface { - function __construct() { + /** + * @var Highlighter + */ + private $hl; + + public function __construct() { $this->hl = new Highlighter(); } /** * @param AbstractBlock $block - * @param HtmlRendererInterface $htmlRenderer + * @param ElementRendererInterface $htmlRenderer * @param bool $inTightList * * @return HtmlElement|string @@ -43,7 +48,7 @@ class FencedCodeRenderer implements BlockRendererInterface $highlighted = $this->hl->highlight($language, $content); $content = $highlighted->value; $attrs['class'] .= 'hljs ' . $highlighted->language; - } catch (Exception $e) { + } catch (\Exception $e) { $attrs['class'] .= 'language-' . $language; } } @@ -65,6 +70,6 @@ class FencedCodeRenderer implements BlockRendererInterface return false; } - return Xml::escape($infoWords[0], true); + return Xml::escape($infoWords[0]); } } diff --git a/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php b/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php index 7ad8c98..e9b348d 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php +++ b/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php @@ -7,6 +7,11 @@ use Todaymade\Daux\Config; class Renderer implements BlockRendererInterface { + /** + * @var Config + */ + private $config; + public function __construct(Config $config) { $this->config = $config; diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index 3a8c14e..dbf46c0 100755 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -21,6 +21,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator /** @var Daux */ protected $daux; + /** @var Template */ + protected $templateRenderer; + protected $indexed_pages = []; /** diff --git a/libs/Format/HTMLFile/ContentTypes/Markdown/CommonMarkConverter.php b/libs/Format/HTMLFile/ContentTypes/Markdown/CommonMarkConverter.php index cf97727..4f3dd3a 100644 --- a/libs/Format/HTMLFile/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/Format/HTMLFile/ContentTypes/Markdown/CommonMarkConverter.php @@ -7,7 +7,6 @@ class CommonMarkConverter extends \Todaymade\Daux\Format\HTML\ContentTypes\Markd { protected function getLinkRenderer(Environment $environment) { - var_dump(LinkRenderer::class); return new LinkRenderer($environment->getConfig('daux')); } } diff --git a/libs/Format/HTMLFile/Generator.php b/libs/Format/HTMLFile/Generator.php index 4d4f27b..77d7110 100644 --- a/libs/Format/HTMLFile/Generator.php +++ b/libs/Format/HTMLFile/Generator.php @@ -15,6 +15,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator /** @var Daux */ protected $daux; + /** @var Template */ + protected $templateRenderer; + /** * @param Daux $daux */ @@ -52,7 +55,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $this->runAction( 'Cleaning destination folder ...', $width, - function() use ($destination, $params) { + function() use ($destination) { $this->ensureEmptyDestination($destination); } ); diff --git a/libs/Tree/Content.php b/libs/Tree/Content.php index 7259e16..b02073d 100644 --- a/libs/Tree/Content.php +++ b/libs/Tree/Content.php @@ -43,7 +43,7 @@ class Content extends ContentAbstract /** * @return string */ - public function getContent() + public function getContent(): string { if ($this->attributes === null) { $this->parseAttributes(); @@ -55,7 +55,7 @@ class Content extends ContentAbstract /** * @param string $content */ - public function setContent($content) + public function setContent(string $content): void { $this->manuallySetContent = true; $this->content = $content; @@ -64,7 +64,7 @@ class Content extends ContentAbstract /** * @return Content */ - public function getPrevious() + public function getPrevious(): ?Content { return $this->previous; } @@ -72,7 +72,7 @@ class Content extends ContentAbstract /** * @param Content $previous */ - public function setPrevious($previous) + public function setPrevious(Content $previous) { $this->previous = $previous; } @@ -80,7 +80,7 @@ class Content extends ContentAbstract /** * @return Content */ - public function getNext() + public function getNext(): ?Content { return $this->next; } @@ -88,7 +88,7 @@ class Content extends ContentAbstract /** * @param Content $next */ - public function setNext($next) + public function setNext(Content $next) { $this->next = $next; } @@ -102,7 +102,7 @@ class Content extends ContentAbstract return $this->name == 'index' || $this->name == '_index'; } - public function getTitle() + public function getTitle(): string { if ($title = $this->getAttribute('title')) { return $title; diff --git a/libs/Tree/ContentAbstract.php b/libs/Tree/ContentAbstract.php index 6636645..1571499 100644 --- a/libs/Tree/ContentAbstract.php +++ b/libs/Tree/ContentAbstract.php @@ -8,7 +8,7 @@ abstract class ContentAbstract extends Entry /** * @return string */ - public function getContent() + public function getContent(): string { return $this->content; } @@ -16,7 +16,7 @@ abstract class ContentAbstract extends Entry /** * @param string $content */ - public function setContent($content) + public function setContent(string $content): void { $this->content = $content; } diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 958f1d6..86955d1 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -2,6 +2,7 @@ use ArrayIterator; use RuntimeException; +use Todaymade\Daux\Config; class Directory extends Entry implements \ArrayAccess, \IteratorAggregate { @@ -103,20 +104,20 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate return $this->children; } - public function addChild(Entry $entry) + public function addChild(Entry $entry): void { $this->children[$entry->getUri()] = $entry; } - public function removeChild(Entry $entry) + public function removeChild(Entry $entry): void { unset($this->children[$entry->getUri()]); } /** - * @return \Todaymade\Daux\Config + * @return Config */ - public function getConfig() + public function getConfig(): Config { if (!$this->parent) { throw new \RuntimeException('Could not retrieve configuration. Are you sure that your tree has a Root ?'); @@ -138,7 +139,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate /** * @return Content|null */ - public function getIndexPage() + public function getIndexPage(): ?Content { $index_key = $this->getConfig()['index_key']; @@ -157,7 +158,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate * Seek the first available page from descendants * @return Content|null */ - public function seekFirstPage() + public function seekFirstPage(): ?Content { if ($this instanceof self) { $index_key = $this->getConfig()['index_key']; @@ -182,7 +183,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate /** * @return Content|null */ - public function getFirstPage() + public function getFirstPage(): ?Content { if ($this->first_page) { return $this->first_page; @@ -217,7 +218,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate /** * @param Content $first_page */ - public function setFirstPage($first_page) + public function setFirstPage(Content $first_page) { $this->first_page = $first_page; } @@ -228,7 +229,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate * * @return bool */ - public function hasContent() + public function hasContent(): bool { foreach ($this->getEntries() as $node) { if ($node instanceof Content) { @@ -262,7 +263,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate * @param mixed $offset An offset to check for. * @return bool true on success or false on failure. */ - public function offsetExists($offset) + public function offsetExists($offset): bool { return array_key_exists($offset, $this->children); } diff --git a/libs/Tree/Entry.php b/libs/Tree/Entry.php index 7543041..5821f50 100644 --- a/libs/Tree/Entry.php +++ b/libs/Tree/Entry.php @@ -81,7 +81,7 @@ abstract class Entry /** * @return string */ - public function getTitle() + public function getTitle(): string { return $this->title; } @@ -89,7 +89,7 @@ abstract class Entry /** * @param string $title */ - public function setTitle($title) + public function setTitle(string $title) { $this->title = $title; } @@ -97,7 +97,7 @@ abstract class Entry /** * @return Directory */ - public function getParent() + public function getParent(): ?Directory { return $this->parent; } @@ -134,7 +134,7 @@ abstract class Entry /** * @return string */ - public function getPath() + public function getPath(): string { return $this->path; } @@ -144,7 +144,7 @@ abstract class Entry * * @return string */ - public function getRelativePath() + public function getRelativePath(): string { $root = $this; while ($root->getParent() != null) { @@ -157,7 +157,7 @@ abstract class Entry /** * @return SplFileInfo */ - public function getFileinfo() + public function getFileinfo(): SplFileInfo { return $this->info; } @@ -165,7 +165,7 @@ abstract class Entry /** * @return string */ - public function getUrl() + public function getUrl(): string { $url = ''; diff --git a/libs/Tree/Root.php b/libs/Tree/Root.php index b286ade..4148987 100644 --- a/libs/Tree/Root.php +++ b/libs/Tree/Root.php @@ -24,7 +24,7 @@ class Root extends Directory /** * @return Config */ - public function getConfig() + public function getConfig(): Config { return $this->config; } @@ -32,12 +32,12 @@ class Root extends Directory /** * @param Config $config */ - public function setConfig($config) + public function setConfig(Config $config) { $this->config = $config; } - public function isHotPath(Entry $node = null) { + public function isHotPath(Entry $node = null): bool { if ($node == null) { return true; } From 780b22417554e375f33ae82a2a88f2e6a7ddd432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 23:41:53 +0100 Subject: [PATCH 33/95] fix small oopsies --- .github/workflows/php.yml | 5 ++++- .../Confluence/ContentTypes/Markdown/ImageRenderer.php | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 9e439fc..0255b33 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -10,6 +10,9 @@ jobs: # TODO : enable tests on windows operating-system: [ubuntu-latest, macOS-latest] php-versions: ['7.2', '7.3', '7.4'] + exclude: + - os: macos-latest + php-versions: 7.4 name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} runs-on: ${{ matrix.operating-system }} @@ -62,7 +65,7 @@ jobs: - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest - name: Generate documentation - run: vendor/bin/daux generate + run: bin/daux generate - uses: JamesIves/github-pages-deploy-action@2.0.3 env: FOLDER: "static" diff --git a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php index 8d994d1..90c5225 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php @@ -15,7 +15,7 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf protected $config; /** - * @var \League\CommonMark\Inline\Renderer\LinkRenderer + * @var \League\CommonMark\Inline\Renderer\ImageRenderer */ protected $parent; From 7ab15cfc48cd4c1ed39aff49240fd03219a091ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 28 Nov 2019 23:44:24 +0100 Subject: [PATCH 34/95] time to go to sleep --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 0255b33..0ba54f7 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -11,7 +11,7 @@ jobs: operating-system: [ubuntu-latest, macOS-latest] php-versions: ['7.2', '7.3', '7.4'] exclude: - - os: macos-latest + - operating-system: macos-latest php-versions: 7.4 name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} From 639cab7c9229dee11a937a8c98e83938b97257f0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 30 Nov 2019 12:58:20 +0000 Subject: [PATCH 35/95] Add renovate.json --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..f45d8f1 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From 9cb935dc53e8e40372e839f128e6f25eb0e927ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 13:59:59 +0100 Subject: [PATCH 36/95] Group minor updates --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index f45d8f1..e47e663 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,6 @@ { "extends": [ - "config:base" + "config:base", + "group:allNonMajor" ] } From 6fe7a0bbd7d77a360305a359d82ec758a3d800e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 14:05:24 +0100 Subject: [PATCH 37/95] Update Schedule --- renovate.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/renovate.json b/renovate.json index e47e663..4595227 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,7 @@ { "extends": [ "config:base", - "group:allNonMajor" - ] + "group:allNonMajor", + ], + "schedule": "every weekend" } From f55a4ce091793f2999f4fb855b3cc633134bc787 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 30 Nov 2019 13:02:02 +0000 Subject: [PATCH 38/95] Update all non-major dependencies Docker tags --- Dockerfile | 2 +- docker/docker-compose.7.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0da44df..909d9d5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM composer:1.7.2 AS composer +FROM composer:1.9.1 AS composer FROM php:7-stretch diff --git a/docker/docker-compose.7.yml b/docker/docker-compose.7.yml index 65d6149..41153cb 100644 --- a/docker/docker-compose.7.yml +++ b/docker/docker-compose.7.yml @@ -12,7 +12,7 @@ services: - phpserver phpserver: - image: php:7.0-fpm + image: php:7.4-fpm working_dir: /var/www/ volumes: - ../:/var/www/ From 7acf4e5b552960eeaa968bf30e1e685b4446e5fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 14:27:39 +0100 Subject: [PATCH 39/95] Don't pin dependencies --- renovate.json | 1 + 1 file changed, 1 insertion(+) diff --git a/renovate.json b/renovate.json index 4595227..9e51376 100644 --- a/renovate.json +++ b/renovate.json @@ -2,6 +2,7 @@ "extends": [ "config:base", "group:allNonMajor", + ":preserveSemverRanges" ], "schedule": "every weekend" } From 727c5c015eb2ddc422a0ac459c71127faea84489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 20:40:42 +0100 Subject: [PATCH 40/95] Add custom image renderer to fix relative links to images #78 --- .../Markdown/CommonMarkConverter.php | 3 +- libs/ContentTypes/Markdown/LinkRenderer.php | 58 +------------ libs/DauxHelper.php | 49 +++++++++++ .../ContentTypes/Markdown/LinkRenderer.php | 3 +- .../Markdown/CommonMarkConverter.php | 3 + .../ContentTypes/Markdown/ImageRenderer.php | 87 +++++++++++++++++++ .../ContentTypes/Markdown/LinkRenderer.php | 2 +- 7 files changed, 147 insertions(+), 58 deletions(-) create mode 100644 libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php diff --git a/libs/ContentTypes/Markdown/CommonMarkConverter.php b/libs/ContentTypes/Markdown/CommonMarkConverter.php index 3f80bbe..d145c34 100644 --- a/libs/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/ContentTypes/Markdown/CommonMarkConverter.php @@ -29,8 +29,7 @@ class CommonMarkConverter extends \League\CommonMark\CommonMarkConverter $config['daux']['processor_instance']->extendCommonMarkEnvironment($environment); } - $this->docParser = new DocParser($environment); - $this->htmlRenderer = new HtmlRenderer($environment); + parent::__construct($config, $environment); } protected function getLinkRenderer(Environment $environment) diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index b5bc7d9..38b3a07 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -30,53 +30,6 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa $this->parent = new \League\CommonMark\Inline\Renderer\LinkRenderer(); } - /** - * @param string $url - * @return Entry - * @throws LinkNotFoundException - */ - protected function resolveInternalFile($url) - { - $triedAbsolute = false; - - // Legacy absolute paths could start with - // "!" In this case we will try to find - // the file starting at the root - if ($url[0] == '!' || $url[0] == '/') { - $url = ltrim($url, '!/'); - - if ($file = DauxHelper::getFile($this->daux['tree'], $url)) { - return $file; - } - - $triedAbsolute = true; - } - - // Seems it's not an absolute path or not found, - // so we'll continue with the current folder - if ($file = DauxHelper::getFile($this->daux->getCurrentPage()->getParent(), $url)) { - return $file; - } - - // If we didn't already try it, we'll - // do a pass starting at the root - if (!$triedAbsolute && $file = DauxHelper::getFile($this->daux['tree'], $url)) { - return $file; - } - - throw new LinkNotFoundException("Could not locate file '$url'"); - } - - protected function isValidUrl($url) - { - return !empty($url) && $url[0] != '#'; - } - - protected function isExternalUrl($url) - { - return preg_match('#^(?:[a-z]+:)?//|^mailto:#', $url); - } - /** * @param AbstractInline|Link $inline * @param ElementRendererInterface $htmlRenderer @@ -102,12 +55,12 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa // empty urls and anchors should // not go through the url resolver - if (!$this->isValidUrl($url)) { + if (!DauxHelper::isValidUrl($url)) { return $element; } // Absolute urls, shouldn't either - if ($this->isExternalUrl($url)) { + if (DauxHelper::isExternalUrl($url)) { $element->setAttribute('class', 'Link--external'); return $element; @@ -121,16 +74,13 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa $foundWithHash = false; try { - $file = $this->resolveInternalFile($url); + $file = DauxHelper::resolveInternalFile($this->daux, $url); $url = DauxHelper::getRelativePath($this->daux->getCurrentPage()->getUrl(), $file->getUrl()); } catch (LinkNotFoundException $e) { - - - // For some reason, the filename could contain a # and thus the link needs to resolve to that. try { if (strlen($urlAndHash[1] ?? "") > 0) { - $file = $this->resolveInternalFile($url . '#' . $urlAndHash[1]); + $file = DauxHelper::resolveInternalFile($this->daux, $url . '#' . $urlAndHash[1]); $url = DauxHelper::getRelativePath($this->daux->getCurrentPage()->getUrl(), $file->getUrl()); $foundWithHash = true; } diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index a6a73cf..f10ea20 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -1,5 +1,6 @@ getCurrentPage()->getParent(), $url)) { + return $file; + } + + // If we didn't already try it, we'll + // do a pass starting at the root + if (!$triedAbsolute && $file = DauxHelper::getFile($config['tree'], $url)) { + return $file; + } + + throw new LinkNotFoundException("Could not locate file '$url'"); + } + + public static function isValidUrl($url) + { + return !empty($url) && $url[0] != '#'; + } + + public static function isExternalUrl($url) + { + return preg_match('#^(?:[a-z]+:)?//|^mailto:#', $url); + } } diff --git a/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php index 42217d0..b8b5257 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php @@ -4,6 +4,7 @@ use League\CommonMark\ElementRendererInterface; use League\CommonMark\HtmlElement; use League\CommonMark\Inline\Element\AbstractInline; use League\CommonMark\Inline\Element\Link; +use Todaymade\Daux\DauxHelper; class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer { @@ -38,7 +39,7 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer } //Internal links - $file = $this->resolveInternalFile($url); + $file = DauxHelper::resolveInternalFile($this->daux, $url); $link_props = [ 'ri:content-title' => trim(trim($this->daux['confluence']['prefix']) . ' ' . $file->getTitle()), diff --git a/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php b/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php index 8d2a123..7ab3e13 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/Format/HTML/ContentTypes/Markdown/CommonMarkConverter.php @@ -2,6 +2,7 @@ use League\CommonMark\Environment; use League\CommonMark\Block\Element as BlockElement; +use League\CommonMark\Inline\Element as InlineElement; use League\CommonMark\Event\DocumentParsedEvent; use Todaymade\Daux\Config; use Todaymade\Daux\ContentTypes\Markdown\TableOfContents; @@ -17,5 +18,7 @@ class CommonMarkConverter extends \Todaymade\Daux\ContentTypes\Markdown\CommonMa $processor = new TOC\Processor($config); $environment->addEventListener(DocumentParsedEvent::class, [$processor, 'onDocumentParsed']); $environment->addBlockRenderer(TableOfContents::class, new TOC\Renderer($config)); + + $environment->addInlineRenderer(InlineElement\Image::class, new ImageRenderer($config)); } } diff --git a/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php b/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php new file mode 100644 index 0000000..26ef57e --- /dev/null +++ b/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php @@ -0,0 +1,87 @@ +daux = $daux; + $this->parent = new \League\CommonMark\Inline\Renderer\ImageRenderer(); + } + + /** + * Relative URLs can be done using either the folder with + * number prefix or the final name (with prefix stripped). + * This ensures that we always use the final name when generating. + */ + protected function getCleanUrl(Image $element) + { + $url = $element->getUrl(); + + // empty urls and anchors should + // not go through the url resolver + if (!DauxHelper::isValidUrl($url)) { + return $url; + } + + // Absolute urls, shouldn't either + if (DauxHelper::isExternalUrl($url)) { + return $url; + } + + try { + $file = DauxHelper::resolveInternalFile($this->daux, $url); + return DauxHelper::getRelativePath($this->daux->getCurrentPage()->getUrl(), $file->getUrl()); + } catch (LinkNotFoundException $e) { + if ($this->daux->isStatic()) { + throw $e; + } + + $element->setAttribute('class', 'Link--broken'); + } + + return $url; + } + + /** + * @param Image $inline + * @param ElementRendererInterface $htmlRenderer + * + * @return HtmlElement + */ + public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) + { + $original = $inline->getUrl(); + $inline->setUrl($this->getCleanUrl($inline)); + + return $this->parent->render($inline, $htmlRenderer); + } + + /** + * @param ConfigurationInterface $configuration + */ + public function setConfiguration(ConfigurationInterface $configuration) + { + $this->config = $configuration; + $this->parent->setConfiguration($configuration); + } +} diff --git a/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php b/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php index f4ccc67..22e7d73 100644 --- a/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php @@ -56,7 +56,7 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer } try { - $file = $this->resolveInternalFile($url); + $file = DauxHelper::resolveInternalFile($this->daux, $url); $url = $file->getUrl(); } catch (LinkNotFoundException $e) { if ($this->daux->isStatic()) { From abaf36bec61455cafc92960ce9059f426be983ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 21:46:58 +0100 Subject: [PATCH 41/95] Lazy load CommonMark converter, speeds up generation in serve mode when file is cached (~ -10ms) --- libs/ContentTypes/Markdown/ContentType.php | 17 ++++++++++++++--- .../ContentTypes/Markdown/ContentType.php | 6 ++---- .../HTML/ContentTypes/Markdown/ContentType.php | 6 ++---- .../ContentTypes/Markdown/ContentType.php | 6 ++---- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/libs/ContentTypes/Markdown/ContentType.php b/libs/ContentTypes/Markdown/ContentType.php index 07f5636..2687684 100644 --- a/libs/ContentTypes/Markdown/ContentType.php +++ b/libs/ContentTypes/Markdown/ContentType.php @@ -12,12 +12,23 @@ class ContentType implements \Todaymade\Daux\ContentTypes\ContentType protected $config; /** @var CommonMarkConverter */ - protected $converter; + private $converter; public function __construct(Config $config) { $this->config = $config; - $this->converter = new CommonMarkConverter(['daux' => $config]); + } + + protected function createConverter() { + return new CommonMarkConverter(['daux' => $this->config]); + } + + protected function getConverter() { + if (!$this->converter) { + $this->converter = $this->createConverter(); + } + + return $this->converter; } /** @@ -31,7 +42,7 @@ class ContentType implements \Todaymade\Daux\ContentTypes\ContentType protected function doConversion($raw) { Daux::writeln("Running conversion", OutputInterface::VERBOSITY_VERBOSE); - return $this->converter->convertToHtml($raw); + return $this->getConverter()->convertToHtml($raw); } public function convert($raw, Content $node) diff --git a/libs/Format/Confluence/ContentTypes/Markdown/ContentType.php b/libs/Format/Confluence/ContentTypes/Markdown/ContentType.php index e1f2410..0ff703a 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/ContentType.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/ContentType.php @@ -4,9 +4,7 @@ use Todaymade\Daux\Config; class ContentType extends \Todaymade\Daux\ContentTypes\Markdown\ContentType { - public function __construct(Config $config) - { - $this->config = $config; - $this->converter = new CommonMarkConverter(['daux' => $config]); + protected function createConverter() { + return new CommonMarkConverter(['daux' => $this->config]); } } diff --git a/libs/Format/HTML/ContentTypes/Markdown/ContentType.php b/libs/Format/HTML/ContentTypes/Markdown/ContentType.php index 96930eb..037106e 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/ContentType.php +++ b/libs/Format/HTML/ContentTypes/Markdown/ContentType.php @@ -4,9 +4,7 @@ use Todaymade\Daux\Config; class ContentType extends \Todaymade\Daux\ContentTypes\Markdown\ContentType { - public function __construct(Config $config) - { - $this->config = $config; - $this->converter = new CommonMarkConverter(['daux' => $config]); + protected function createConverter() { + return new CommonMarkConverter(['daux' => $this->config]); } } diff --git a/libs/Format/HTMLFile/ContentTypes/Markdown/ContentType.php b/libs/Format/HTMLFile/ContentTypes/Markdown/ContentType.php index 00e2157..934d84a 100644 --- a/libs/Format/HTMLFile/ContentTypes/Markdown/ContentType.php +++ b/libs/Format/HTMLFile/ContentTypes/Markdown/ContentType.php @@ -4,9 +4,7 @@ use Todaymade\Daux\Config; class ContentType extends \Todaymade\Daux\ContentTypes\Markdown\ContentType { - public function __construct(Config $config) - { - $this->config = $config; - $this->converter = new CommonMarkConverter(['daux' => $config]); + protected function createConverter() { + return new CommonMarkConverter(['daux' => $this->config]); } } From 688de1d5b9058a96c2a2de9267a6472c6e97af4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Sat, 30 Nov 2019 22:24:10 +0100 Subject: [PATCH 42/95] Fix warnings and errors reported by Scrutinizer --- libs/Console/RunAction.php | 2 +- libs/ContentTypes/Markdown/LinkRenderer.php | 11 ++-------- libs/DauxHelper.php | 1 + .../ContentTypes/Markdown/LinkRenderer.php | 13 +++-------- .../ContentTypes/Markdown/TOCRenderer.php | 5 +++++ libs/Format/Confluence/Publisher.php | 12 +++++----- .../ContentTypes/Markdown/ImageRenderer.php | 22 +++++++++++++------ .../ContentTypes/Markdown/TOC/Processor.php | 2 +- .../ContentTypes/Markdown/TOC/Renderer.php | 5 +++++ libs/Format/HTML/Template.php | 6 ++--- libs/Format/HTMLFile/ContentPage.php | 6 +++-- .../ContentTypes/Markdown/LinkRenderer.php | 15 ++++--------- templates/home.php | 8 +++---- templates/layout/00_layout.php | 2 +- templates/partials/search_script.php | 2 +- 15 files changed, 56 insertions(+), 56 deletions(-) diff --git a/libs/Console/RunAction.php b/libs/Console/RunAction.php index 66cfe11..26e3a2b 100644 --- a/libs/Console/RunAction.php +++ b/libs/Console/RunAction.php @@ -19,7 +19,7 @@ trait RunAction $padding = $width - $this->getLength($title) - 10; try { - $response = $closure(function ($content) use (&$padding, $verbose) { + $response = $closure(function($content) use (&$padding, $verbose) { $padding -= $this->getLength($content); Daux::write($content, $verbose); }); diff --git a/libs/ContentTypes/Markdown/LinkRenderer.php b/libs/ContentTypes/Markdown/LinkRenderer.php index 38b3a07..67f5b54 100644 --- a/libs/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/ContentTypes/Markdown/LinkRenderer.php @@ -38,15 +38,8 @@ class LinkRenderer implements InlineRendererInterface, ConfigurationAwareInterfa */ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) { - // This can't be in the method type as - // the method is an abstract and should - // have the same interface - if (!$inline instanceof Link) { - throw new \RuntimeException( - 'Wrong type passed to ' . __CLASS__ . '::' . __METHOD__ . - " the expected type was 'League\\CommonMark\\Inline\\Element\\Link' but '" . - get_class($inline) . "' was provided" - ); + if (!($inline instanceof Link)) { + throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline)); } $element = $this->parent->render($inline, $htmlRenderer); diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index f10ea20..0b54fea 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -3,6 +3,7 @@ use Todaymade\Daux\Exception\LinkNotFoundException; use Todaymade\Daux\Tree\Builder; use Todaymade\Daux\Tree\Directory; +use Todaymade\Daux\Tree\Entry; class DauxHelper { diff --git a/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php index b8b5257..8c0cf22 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php @@ -16,15 +16,8 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer */ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) { - // This can't be in the method type as - // the method is an abstract and should - // have the same interface - if (!$inline instanceof Link) { - throw new \RuntimeException( - 'Wrong type passed to ' . __CLASS__ . '::' . __METHOD__ . - " the expected type was 'League\\CommonMark\\Inline\\Element\\Link' but '" . - get_class($inline) . "' was provided" - ); + if (!($inline instanceof Link)) { + throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline)); } // Default handling @@ -34,7 +27,7 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer // empty urls, anchors and absolute urls // should not go through the url resolver - if (!$this->isValidUrl($url) || $this->isExternalUrl($url)) { + if (!DauxHelper::isValidUrl($url) || DauxHelper::isExternalUrl($url)) { return $element; } diff --git a/libs/Format/Confluence/ContentTypes/Markdown/TOCRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/TOCRenderer.php index 9e5ee90..6d2a3ef 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/TOCRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/TOCRenderer.php @@ -3,11 +3,16 @@ use League\CommonMark\Block\Element\AbstractBlock; use League\CommonMark\Block\Renderer\BlockRendererInterface; use League\CommonMark\ElementRendererInterface; +use Todaymade\Daux\ContentTypes\Markdown\TableOfContents; class TOCRenderer implements BlockRendererInterface { public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, $inTightList = false) { + if (!($block instanceof TableOfContents)) { + throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block)); + } + return ''; } } diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index 94a4832..ec13a4e 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -54,7 +54,7 @@ class Publisher $this->run( 'Getting already published pages...', - function () use (&$published) { + function() use (&$published) { if ($published != null) { $published['children'] = $this->client->getList($published['id'], true); } @@ -63,7 +63,7 @@ class Publisher $published = $this->run( "Create placeholder pages...", - function () use ($tree, $published) { + function() use ($tree, $published) { return $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); } ); @@ -143,7 +143,7 @@ class Publisher protected function createRecursive($parent_id, $entry, $published) { - $callback = function ($parent_id, $entry, $published) { + $callback = function($parent_id, $entry, $published) { // nothing to do if the ID already exists if (array_key_exists('id', $published)) { return $published; @@ -164,7 +164,7 @@ class Publisher protected function updateRecursive($parent_id, $entry, $published) { - $callback = function ($parent_id, $entry, $published) { + $callback = function($parent_id, $entry, $published) { if (array_key_exists('id', $published) && array_key_exists('page', $entry)) { $this->updatePage($parent_id, $entry, $published); } @@ -182,7 +182,7 @@ class Publisher $this->run( '- ' . PublisherUtilities::niceTitle($entry['file']->getUrl()), - function () use ($entry, $published, $parent_id, $updateThreshold) { + function() use ($entry, $published, $parent_id, $updateThreshold) { $generated_content = $entry['page']->getContent(); if (PublisherUtilities::shouldUpdate($entry['page'], $generated_content, $published, $updateThreshold)) { $this->client->updatePage( @@ -200,7 +200,7 @@ class Publisher foreach ($entry['page']->attachments as $attachment) { $this->run( " With attachment: $attachment[filename]", - function ($write) use ($published, $attachment) { + function($write) use ($published, $attachment) { $this->client->uploadAttachment($published['id'], $attachment, $write); } ); diff --git a/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php b/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php index 26ef57e..79181aa 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php +++ b/libs/Format/HTML/ContentTypes/Markdown/ImageRenderer.php @@ -9,6 +9,7 @@ use League\CommonMark\Util\ConfigurationAwareInterface; use League\CommonMark\Util\ConfigurationInterface; use Todaymade\Daux\Config; use Todaymade\Daux\DauxHelper; +use Todaymade\Daux\Exception\LinkNotFoundException; class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterface { @@ -22,6 +23,11 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf */ protected $config; + /** + * @var \League\CommonMark\Inline\Renderer\ImageRenderer + */ + protected $parent; + public function __construct($daux) { $this->daux = $daux; @@ -32,11 +38,10 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf * Relative URLs can be done using either the folder with * number prefix or the final name (with prefix stripped). * This ensures that we always use the final name when generating. + * @throws LinkNotFoundException */ - protected function getCleanUrl(Image $element) + protected function getCleanUrl($url) { - $url = $element->getUrl(); - // empty urls and anchors should // not go through the url resolver if (!DauxHelper::isValidUrl($url)) { @@ -55,8 +60,6 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf if ($this->daux->isStatic()) { throw $e; } - - $element->setAttribute('class', 'Link--broken'); } return $url; @@ -67,11 +70,16 @@ class ImageRenderer implements InlineRendererInterface, ConfigurationAwareInterf * @param ElementRendererInterface $htmlRenderer * * @return HtmlElement + * + * @throws LinkNotFoundException */ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) { - $original = $inline->getUrl(); - $inline->setUrl($this->getCleanUrl($inline)); + if (!($inline instanceof Image)) { + throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline)); + } + + $inline->setUrl($this->getCleanUrl($inline->getUrl())); return $this->parent->render($inline, $htmlRenderer); } diff --git a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php index 100ab42..995ad56 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php +++ b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php @@ -140,7 +140,7 @@ class Processor } } - $node->data['attributes']['id'] = $this->getUniqueId($document,'page_'. $this->escaped($text)); + $node->data['attributes']['id'] = $this->getUniqueId($document, 'page_'. $this->escaped($text)); } /** diff --git a/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php b/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php index e9b348d..14853a0 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php +++ b/libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php @@ -4,6 +4,7 @@ use League\CommonMark\Block\Element\AbstractBlock; use League\CommonMark\Block\Renderer\BlockRendererInterface; use League\CommonMark\ElementRendererInterface; use Todaymade\Daux\Config; +use Todaymade\Daux\ContentTypes\Markdown\TableOfContents; class Renderer implements BlockRendererInterface { @@ -19,6 +20,10 @@ class Renderer implements BlockRendererInterface public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, $inTightList = false) { + if (!($block instanceof TableOfContents)) { + throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block)); + } + $content = $htmlRenderer->renderBlocks($block->children()); return $this->config->templateRenderer ->getEngine($this->config) diff --git a/libs/Format/HTML/Template.php b/libs/Format/HTML/Template.php index 2d133a0..1ab8ce9 100644 --- a/libs/Format/HTML/Template.php +++ b/libs/Format/HTML/Template.php @@ -77,13 +77,13 @@ class Template protected function registerFunctions($engine) { - $engine->registerFunction('get_navigation', function ($tree, $path, $current_url, $base_page, $mode) { + $engine->registerFunction('get_navigation', function($tree, $path, $current_url, $base_page, $mode) { $nav = $this->buildNavigation($tree, $path, $current_url, $base_page, $mode); return $this->renderNavigation($nav); }); - $engine->registerFunction('translate', function ($key) { + $engine->registerFunction('translate', function($key) { $language = $this->params['language']; if (isset($this->engine->getData('page')['page'])) { @@ -106,7 +106,7 @@ class Template return "Unknown key $key"; }); - $engine->registerFunction('get_breadcrumb_title', function ($page, $base_page) { + $engine->registerFunction('get_breadcrumb_title', function($page, $base_page) { $title = ''; $breadcrumb_trail = $page['breadcrumb_trail']; $separator = $this->getSeparator($page['breadcrumb_separator']); diff --git a/libs/Format/HTMLFile/ContentPage.php b/libs/Format/HTMLFile/ContentPage.php index e9825f6..a672b6f 100644 --- a/libs/Format/HTMLFile/ContentPage.php +++ b/libs/Format/HTMLFile/ContentPage.php @@ -11,19 +11,21 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage { $content = parent::generatePage(); - //Embed images + // Embed images // We do it after generation so we can catch the images that were in html already $content = (new EmbedImages($this->params['tree'])) ->embed( $content, $this->file, function($src, array $attributes, Raw $file) { - $content = base64_encode(file_get_contents($file->getPath())); + // TODO :: ignore absolute paths + $content = base64_encode(file_get_contents($file->getPath())); $attr = ''; foreach ($attributes as $name => $value) { $attr .= ' ' . $name . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"'; } + // TODO :: handle other formats than PNG as well return ""; } ); diff --git a/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php b/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php index 22e7d73..3685f82 100644 --- a/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php +++ b/libs/Format/HTMLFile/ContentTypes/Markdown/LinkRenderer.php @@ -19,15 +19,8 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer */ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) { - // This can't be in the method type as - // the method is an abstract and should - // have the same interface - if (!$inline instanceof Link) { - throw new \RuntimeException( - 'Wrong type passed to ' . __CLASS__ . '::' . __METHOD__ . - " the expected type was 'League\\CommonMark\\Inline\\Element\\Link' but '" . - get_class($inline) . "' was provided" - ); + if (!($inline instanceof Link)) { + throw new \InvalidArgumentException('Incompatible inline type: ' . \get_class($inline)); } $element = parent::render($inline, $htmlRenderer); @@ -36,12 +29,12 @@ class LinkRenderer extends \Todaymade\Daux\ContentTypes\Markdown\LinkRenderer // empty urls and anchors should // not go through the url resolver - if (!$this->isValidUrl($url)) { + if (!DauxHelper::isValidUrl($url)) { return $element; } // Absolute urls, shouldn't either - if ($this->isExternalUrl($url)) { + if (DauxHelper::isExternalUrl($url)) { $element->setAttribute('class', 'Link--external'); return $element; diff --git a/templates/home.php b/templates/home.php index e253793..0da40f7 100755 --- a/templates/home.php +++ b/templates/home.php @@ -10,11 +10,11 @@
    - ' . $params['tagline'] . '' : '' ?> + ' . $params['tagline'] . '' : '' ?>
    - ' : '' ?> + ' : '' ?>
    @@ -27,8 +27,8 @@ foreach ($page['entry_page'] as $key => $node) { echo '' . str_replace("__VIEW_DOCUMENTATION__", $view_doc, $key) . ''; } - if(isset($params['html']['buttons']) && is_array($params['html']['buttons'])) { - foreach ($params['html']['buttons'] as $name => $link ) { + if (isset($params['html']['buttons']) && is_array($params['html']['buttons'])) { + foreach ($params['html']['buttons'] as $name => $link) { echo '' . $name . ''; } } diff --git a/templates/layout/00_layout.php b/templates/layout/00_layout.php index 4aa7d8d..e730533 100755 --- a/templates/layout/00_layout.php +++ b/templates/layout/00_layout.php @@ -1,7 +1,7 @@ - <?= $page['title']; ?> <?= ($page['title'] != $params['title'])? '- ' . $params['title'] : "" ?> + <?= $page['title']; ?> <?= ($page['title'] != $params['title']) ? '- ' . $params['title'] : "" ?> \n"; diff --git a/templates/partials/search_script.php b/templates/partials/search_script.php index 6f6b428..e31f57e 100644 --- a/templates/partials/search_script.php +++ b/templates/partials/search_script.php @@ -13,7 +13,7 @@ "Link_next", ]; $search_translations = []; - foreach($search_strings as $key) { + foreach ($search_strings as $key) { $search_translations[$key] = $this->translate($key); } ?> From b5633e93c7ecccd70f66c1d424a803da8770ad1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Goetz?= Date: Thu, 5 Dec 2019 21:25:58 +0100 Subject: [PATCH 43/95] #171 Redo the configuration layer to add a ConfigBuilder and group configuration parts --- libs/BaseConfig.php | 15 + libs/Config.php | 250 ++++++++++----- libs/ConfigBuilder.php | 288 ++++++++++++++++++ libs/Console/DauxCommand.php | 92 +++--- libs/Console/Generate.php | 38 ++- libs/Console/Serve.php | 24 +- .../Markdown/CommonMarkConverter.php | 4 +- libs/ContentTypes/Markdown/ContentType.php | 15 +- libs/Daux.php | 200 +++--------- libs/DauxHelper.php | 93 +----- libs/Format/Base/ContentPage.php | 18 +- libs/Format/Base/LiveGenerator.php | 4 +- libs/Format/Confluence/Config.php | 66 ++++ libs/Format/Confluence/ContentPage.php | 7 +- .../Markdown/FencedCodeRenderer.php | 4 +- libs/Format/Confluence/Generator.php | 30 +- libs/Format/Confluence/Publisher.php | 27 +- libs/Format/Confluence/PublisherDelete.php | 3 +- libs/Format/HTML/Config.php | 148 ++++++++- libs/Format/HTML/ContentPage.php | 42 +-- .../ContentTypes/Markdown/TOC/Processor.php | 10 +- libs/Format/HTML/Generator.php | 54 ++-- libs/Format/HTML/Template.php | 35 ++- libs/Format/HTML/Theme.php | 26 ++ libs/Format/HTMLFile/ContentPage.php | 2 +- libs/Format/HTMLFile/Generator.php | 22 +- libs/FormatDate.php | 4 +- libs/Server/ErrorPage.php | 14 +- libs/Server/Server.php | 39 ++- libs/Tree/Builder.php | 6 +- libs/Tree/Directory.php | 6 +- libs/bootstrap.php | 2 + templates/content.php | 11 +- templates/home.php | 22 +- templates/layout/00_layout.php | 30 +- templates/layout/05_page.php | 19 +- templates/partials/navbar_content.php | 9 +- templates/partials/search_script.php | 7 +- templates/partials/twitter_buttons.php | 7 +- .../Markdown/LinkRendererTest.php | 51 ++-- tests/DauxHelperTest.php | 9 +- tests/Format/Template/TranslateTest.php | 67 ++-- tests/Server/ServerTest.php | 11 +- tests/Tree/BuilderIntegrationTest.php | 11 +- tests/Tree/BuilderTest.php | 33 +- tests/Tree/ContentTest.php | 5 +- tests/Tree/DirectoryTest.php | 7 +- 47 files changed, 1177 insertions(+), 710 deletions(-) create mode 100644 libs/ConfigBuilder.php create mode 100644 libs/Format/Confluence/Config.php create mode 100644 libs/Format/HTML/Theme.php diff --git a/libs/BaseConfig.php b/libs/BaseConfig.php index 7a867dc..6e1ec4d 100644 --- a/libs/BaseConfig.php +++ b/libs/BaseConfig.php @@ -36,4 +36,19 @@ class BaseConfig extends ArrayObject } } } + + public function hasValue($key) + { + return array_key_exists($key, $this); + } + + public function getValue($key) + { + return $this[$key]; + } + + public function setValue($key, $value) + { + $this[$key] = $value; + } } diff --git a/libs/Config.php b/libs/Config.php index 31b5a22..560ea56 100644 --- a/libs/Config.php +++ b/libs/Config.php @@ -2,91 +2,96 @@ use Todaymade\Daux\Tree\Content; use Todaymade\Daux\Format\HTML\Config as HTMLConfig; +use Todaymade\Daux\Format\HTML\Theme as Theme; +use Todaymade\Daux\Format\Confluence\Config as ConfluenceConfig; class Config extends BaseConfig { - public function getTitle() - { - return $this['title']; + public function getTitle() { + return $this->getValue('title'); } - public function getCurrentPage() - { - return $this['current_page']; + public function hasAuthor(): bool { + return $this->hasValue('author'); } - public function setCurrentPage(Content $entry) - { - $this['current_page'] = $entry; + public function getAuthor() { + return $this->getValue('author'); } - public function getDocumentationDirectory() - { - return $this['docs_directory']; + public function hasTagline(): bool { + return $this->hasValue('tagline'); } - public function setDocumentationDirectory($documentationPath) - { - $this['docs_directory'] = $documentationPath; + public function getTagline() { + return $this->getValue('tagline'); } - public function getThemesDirectory() - { - return $this['themes_directory']; + public function getCurrentPage() { + return $this->getValue('current_page'); } - public function setThemesDirectory($directory) - { - $this['themes_directory'] = $directory; + public function setCurrentPage(Content $entry) { + $this->setValue('current_page', $entry); } - public function setThemesPath($themePath) - { - $this['themes_path'] = $themePath; + public function getDocumentationDirectory() { + return $this->getValue('docs_directory'); } - public function getThemesPath() - { - return $this['themes_path']; + public function getThemesDirectory() { + return $this->getValue('themes_directory'); } - public function setFormat($format) - { - $this['format'] = $format; + public function getThemesPath() { + return $this->getValue('themes_path'); } - public function getFormat() - { - return $this['format']; + public function getFormat() { + return $this->getValue('format'); } - public function hasTimezone() - { + public function hasTimezone(): bool { return isset($this['timezone']); } - public function getTimezone() - { - return $this['timezone']; + public function getTimezone() { + return $this->getValue('timezone'); } - public function isMultilanguage() - { - return array_key_exists('languages', $this) && !empty($this['languages']); + public function getTree() { + return $this->getValue('tree'); } - public function isLive() - { - return $this['mode'] == Daux::LIVE_MODE; + public function setTree($tree) { + $this->setValue('tree', $tree); } - public function isStatic() - { - return $this['mode'] == Daux::STATIC_MODE; + public function isMultilanguage(): bool { + return $this->hasValue('languages') && !empty($this->getValue('languages')); } - public function shouldInheritIndex() - { + public function getLanguages(): array { + return $this->getValue('languages'); + } + + public function getLanguage(): string { + return $this->getValue('language'); + } + + public function getMode() { + return $this->getValue('mode'); + } + + public function isLive() { + return $this->getValue('mode') == Daux::LIVE_MODE; + } + + public function isStatic() { + return $this->getValue('mode') == Daux::STATIC_MODE; + } + + public function shouldInheritIndex() { // As the global configuration is always present, we // need to test for the existence of the legacy value // first. Then use the current value. @@ -97,41 +102,43 @@ class Config extends BaseConfig return $this['html']['inherit_index']; } - public function setConfigurationOverrideFile($override_file) - { - $this['override_file'] = $override_file; + public function getIndexKey() { + return $this->getValue('mode') == Daux::STATIC_MODE ? 'index.html' : 'index'; } - public function getConfigurationOverrideFile() - { - if (array_key_exists('override_file', $this)) { - return $this['override_file']; - } - - return null; + public function getProcessor() { + return $this->getValue('processor'); } - public function getConfluenceConfiguration() - { - return $this['confluence']; + public function getConfluenceConfiguration(): ConfluenceConfig { + return new ConfluenceConfig($this->hasValue('confluence') ? $this->getValue('confluence') : []); } - public function getHTML() - { - return new HTMLConfig($this['html']); + public function getHTML(): HTMLConfig { + return new HTMLConfig($this->hasValue('html') ? $this->getValue('html') : []); } - public function canCache() - { - if (array_key_exists('cache', $this)) { - return $this['cache']; + public function getTheme(): ?Theme { + return $this->hasValue('theme') ? new Theme($this->getValue('theme')) : null; + } + + public function getValidContentExtensions() { + return $this->getValue('valid_content_extensions'); + } + + public function setValidContentExtensions(array $value) { + $this->setValue('valid_content_extensions', $value); + } + + public function canCache() { + if ($this->hasValue('cache')) { + return $this->getValue('cache'); } return false; } - public function getCacheKey() - { + public function getCacheKey() { $cloned = []; foreach ($this as $key => $value) { $cloned[$key] = ($value instanceof Entry) ? $value->dump() : $value; @@ -139,4 +146,105 @@ class Config extends BaseConfig return sha1(json_encode($cloned)); } + + public function hasTranslationKey($language, $key): bool { + return array_key_exists($language, $this['strings']) && array_key_exists($key, $this['strings'][$language]); + } + + public function getTranslationKey($language, $key) { + return $this['strings'][$language][$key]; + } + + public function hasImage(): bool { + return $this->hasValue('image'); + } + + public function getImage() { + return $this->getValue('image'); + } + + public function setImage($value) { + return $this->setValue('image', $value); + } + + public function getLocalBase() { + return $this->getValue('local_base'); + } + + public function getTemplates() { + return $this->getValue('templates'); + } + + public function getBaseUrl() { + return $this->getValue('base_url'); + } + + public function getBasePage() { + + if ($this->isLive()) { + $value = '//' . $this->getBaseUrl(); + if (!$this['live']['clean_urls']) { + $value .= 'index.php/'; + } + + return $value; + } + return $this->getBaseUrl(); + } + + public function hasEntryPage(): bool { + return $this->hasValue('entry_page') && !empty($this->getValue('entry_page')); + } + + public function getEntryPage() { + return $this->getValue('entry_page'); + } + + public function setEntryPage($value) { + return $this->setValue('entry_page', $value); + } + + public function hasRequest(): bool { + return $this->hasValue('request') && !empty($this->getValue('request')); + } + + public function getRequest() { + return $this->getValue('request'); + } + + public function setRequest($value) { + return $this->setValue('request', $value); + } + + public function getIndex() { + return $this->getValue('index'); + } + + public function setIndex($value) { + return $this->setValue('index', $value); + } + + public function hasProcessorInstance() { + return $this->hasValue('processor_instance'); + } + + public function getProcessorInstance() { + return $this->getValue('processor_instance'); + } + + public function setProcessorInstance($value) { + return $this->setValue('processor_instance', $value); + } + + public function getIgnore() { + return $this->getValue('ignore'); + } + + public function hasHost() { + return $this->hasValue('host'); + } + + public function getHost() { + return $this->getValue('host'); + } } diff --git a/libs/ConfigBuilder.php b/libs/ConfigBuilder.php new file mode 100644 index 0000000..7bc33dc --- /dev/null +++ b/libs/ConfigBuilder.php @@ -0,0 +1,288 @@ +config = new Config(); + $this->config['mode'] = $mode; + $this->config['local_base'] = dirname(__DIR__); + } + + static function fromFile($file): Config { + return unserialize(file_get_contents($file)); + } + + static function withMode($mode = Daux::STATIC_MODE): ConfigBuilder { + $builder = new ConfigBuilder($mode); + $builder->loadBaseConfiguration(); + return $builder; + } + + public function with(array $values): ConfigBuilder { + $this->config->merge($values); + return $this; + } + + private function setValue(&$array, $key, $value) { + if (is_null($key)) { + return $array = $value; + } + $keys = explode('.', $key); + while (count($keys) > 1) { + $key = array_shift($keys); + if (!isset($array[$key]) || !is_array($array[$key])) { + $array[$key] = []; + } + $array = &$array[$key]; + } + $array[array_shift($keys)] = $value; + return $array; + } + + public function withValues(array $values): ConfigBuilder { + foreach ($values as $value) { + $this->setValue($this->config, $value[0], $value[1]); + } + return $this; + } + + public function withDocumentationDirectory($dir): ConfigBuilder { + $this->config['docs_directory'] = $dir; + return $this; + } + + public function withValidContentExtensions(array $value): ConfigBuilder { + $this->config['valid_content_extensions'] = $value; + return $this; + } + + public function withThemesPath($themePath): ConfigBuilder { + $this->config['themes_path'] = $themePath; + return $this; + } + + public function withThemesDirectory($directory): ConfigBuilder { + $this->config['themes_directory'] = $directory; + return $this; + } + + public function withCache(bool $value): ConfigBuilder { + $this->config['cache'] = $value; + return $this; + } + + public function withFormat($format): ConfigBuilder { + $this->config['format'] = $format; + return $this; + } + + public function withConfigurationOverride($file): ConfigBuilder { + $this->configuration_override_file = $file; + return $this; + } + + public function withProcessor($value): ConfigBuilder { + $this->config['processor'] = $value; + return $this; + } + + public function withSearch($value): ConfigBuilder { + $this->config['html']['search'] = $value; + return $this; + } + + public function withConfluenceDelete($value): ConfigBuilder { + $this->config['confluence']['delete'] = $value; + return $this; + } + + function build(): Config { + $this->initializeConfiguration(); + + return $this->config; + } + + private function resolveThemeVariant() { + $theme = $this->config->getHTML()->getTheme(); + $themesPath = $this->config->getThemesPath() . DIRECTORY_SEPARATOR; + + // If theme directory exists, we're good with that + if (is_dir(realpath(($themesPath . $theme)))) { + return [$theme, '']; + } + + $themePieces = explode('-', $theme); + $variant = ''; + + // Do we have a variant or only a theme ? + if (count($themePieces) > 1) { + $variant = array_pop($themePieces); + $theme = implode('-', $themePieces); + } + + if (!is_dir(realpath($themesPath . $theme))) { + throw new \RuntimeException("Theme '{$theme}' not found"); + } + + return [$theme, $variant]; + } + + /** + * @param string $override_file + * @throws Exception + */ + private function initializeConfiguration() { + // Validate and set theme path + $docs_path = $this->normalizeDocumentationPath($this->config->getDocumentationDirectory()); + $this->config['docs_directory'] = $docs_path; + + // Read documentation overrides + $this->loadConfiguration($docs_path . DIRECTORY_SEPARATOR . 'config.json'); + + // Read command line overrides + $override_file = $this->getConfigurationOverride($this->configuration_override_file); + if ($override_file !== null) { + $this->loadConfiguration($override_file); + } + + // Validate and set theme path + $this->withThemesPath($this->normalizeThemePath($this->config->getThemesDirectory())); + + // Resolve variant once + $theme = $this->resolveThemeVariant(); + $this->config['html']['theme'] = $theme[0]; + $this->config['html']['theme-variant'] = $theme[1]; + + // Set a valid default timezone + if ($this->config->hasTimezone()) { + date_default_timezone_set($this->config->getTimezone()); + } elseif (!ini_get('date.timezone')) { + date_default_timezone_set('GMT'); + } + + // Text search would be too slow on live server + if ($this->config->isLive()) { + $this->config['html']['search'] = false; + } + } + + private function normalizeThemePath($path) { + $validPath = $this->findLocation($path, $this->config->getLocalBase(), 'dir'); + + if (!$validPath) { + throw new Exception('The Themes directory does not exist. Check the path again : ' . $path); + } + + return $validPath; + } + + private function normalizeDocumentationPath($path) { + $validPath = $this->findLocation($path, $this->config->getLocalBase(), 'dir'); + + if (!$validPath) { + throw new Exception('The Docs directory does not exist. Check the path again : ' . $path); + } + + return $validPath; + } + + /** + * Load and validate the global configuration + * + * @throws Exception + */ + private function loadBaseConfiguration() { + // Set the default configuration + $this->config->merge([ + 'docs_directory' => 'docs', + 'valid_content_extensions' => ['md', 'markdown'], + + //Paths and tree + 'templates' => 'templates', + + 'base_url' => '', + ]); + + // Load the global configuration + $this->loadConfiguration($this->config->getLocalBase() . DIRECTORY_SEPARATOR . 'global.json', false); + } + + /** + * @param string $config_file + * @param bool $optional + * @throws Exception + */ + private function loadConfiguration($config_file, $optional = true) { + if (!file_exists($config_file)) { + if ($optional) { + return; + } + + throw new Exception('The configuration file is missing. Check path : ' . $config_file); + } + + $config = json_decode(file_get_contents($config_file), true); + if (!isset($config)) { + throw new Exception('The configuration file "' . $config_file . '" is corrupt. Is your JSON well-formed ?'); + } + $this->config->merge($config); + } + + /** + * Get the file requested for configuration overrides + * + * @param string|null $path + * @return string|null the path to a file to load for configuration overrides + * @throws Exception + */ + private function getConfigurationOverride($path) { + $validPath = $this->findLocation($path, $this->config->getLocalBase(), 'file'); + + if ($validPath === null) { + return null; + } + + if (!$validPath) { + throw new Exception('The configuration override file does not exist. Check the path again : ' . $path); + } + + return $validPath; + } + + /** + * @param string|null $path + * @param string $basedir + * @param "dir"|"file" $type + * @return false|null|string + */ + private function findLocation($path, $basedir, $type) { + // If Path is explicitly null, it's useless to go further + if ($path == null) { + return null; + } + + // VFS, used only in tests + if (substr($path, 0, 6) == "vfs://") { + return $path; + } + + + // Check if it's relative to the current directory or an absolute path + if (DauxHelper::is($path, $type)) { + return DauxHelper::getAbsolutePath($path); + } + + // Check if it exists relative to Daux's root + $newPath = $basedir . DIRECTORY_SEPARATOR . $path; + if (DauxHelper::is($newPath, $type)) { + return $newPath; + } + + return false; + } +} \ No newline at end of file diff --git a/libs/Console/DauxCommand.php b/libs/Console/DauxCommand.php index b207e07..defe0f1 100644 --- a/libs/Console/DauxCommand.php +++ b/libs/Console/DauxCommand.php @@ -4,6 +4,7 @@ use Symfony\Component\Console\Command\Command as SymfonyCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Todaymade\Daux\ConfigBuilder; use Todaymade\Daux\Daux; class DauxCommand extends SymfonyCommand @@ -12,78 +13,55 @@ class DauxCommand extends SymfonyCommand { $this ->addOption('configuration', 'c', InputOption::VALUE_REQUIRED, 'Configuration file') - ->addOption('value', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Set different configuration values') ->addOption('source', 's', InputOption::VALUE_REQUIRED, 'Where to take the documentation from') ->addOption('processor', 'p', InputOption::VALUE_REQUIRED, 'Manipulations on the tree') - ->addOption('no-cache', null, InputOption::VALUE_NONE, 'Disable Cache'); - - // HTML Format only - $this->addOption('themes', 't', InputOption::VALUE_REQUIRED, 'Set a different themes directory'); + ->addOption('no-cache', null, InputOption::VALUE_NONE, 'Disable Cache') + ->addOption('themes', 't', InputOption::VALUE_REQUIRED, 'Set a different themes directory (Used by HTML format only)') + ->addOption('value', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Set different configuration values'); } - private function setValue(&$array, $key, $value) + protected function prepareConfig($mode, InputInterface $input, OutputInterface $output): ConfigBuilder { - if (is_null($key)) { - return $array = $value; - } - $keys = explode('.', $key); - while (count($keys) > 1) { - $key = array_shift($keys); - if (!isset($array[$key]) || !is_array($array[$key])) { - $array[$key] = []; - } - $array = &$array[$key]; - } - $array[array_shift($keys)] = $value; - return $array; - } + $builder = ConfigBuilder::withMode($mode); - private function applyConfiguration(array $options, Daux $daux) - { - $values = array_map( - function($value) { - return array_map("trim", explode('=', $value)); - }, - $options - ); - - foreach ($values as $value) { - $this->setValue($daux->options, $value[0], $value[1]); - } - } - - protected function prepareDaux(InputInterface $input, OutputInterface $output) - { - $daux = new Daux(Daux::STATIC_MODE, $output); - - // Set the format if requested - if ($input->hasOption('format') && $input->getOption('format')) { - $daux->getParams()->setFormat($input->getOption('format')); + if ($input->getOption('configuration')) { + $builder->withConfigurationOverride($input->getOption('configuration')); } - // Set the source directory if ($input->getOption('source')) { - $daux->getParams()->setDocumentationDirectory($input->getOption('source')); + $builder->withDocumentationDirectory($input->getOption('source')); } - if ($input->getOption('themes')) { - $daux->getParams()->setThemesDirectory($input->getOption('themes')); - } - - $daux->initializeConfiguration($input->getOption('configuration')); - - if ($input->hasOption('delete') && $input->getOption('delete')) { - $daux->getParams()['confluence']['delete'] = true; - } - - if ($input->hasOption('value')) { - $this->applyConfiguration($input->getOption('value'), $daux); + if ($input->getOption('processor')) { + $builder->withProcessor($input->getOption('processor')); } if ($input->getOption('no-cache')) { - $daux->getParams()['cache'] = false; + $builder->withCache(false); } - return $daux; + if ($input->getOption('themes')) { + $builder->withThemesDirectory($input->getOption('themes')); + } + + if ($input->hasOption('value')) { + $values = array_map( + function($value) { + return array_map("trim", explode('=', $value)); + }, + $input->getOption('value') + ); + $builder->withValues($values); + } + + return $builder; + } + + protected function prepareProcessor(Daux $daux, $width) + { + $class = $daux->getProcessorClass(); + if (!empty($class)) { + $daux->setProcessor(new $class($daux, $output, $width)); + } } } diff --git a/libs/Console/Generate.php b/libs/Console/Generate.php index 3101bef..e1e8a65 100755 --- a/libs/Console/Generate.php +++ b/libs/Console/Generate.php @@ -7,6 +7,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Terminal; use Todaymade\Daux\Daux; +use Todaymade\Daux\ConfigBuilder; class Generate extends DauxCommand { @@ -29,6 +30,26 @@ class Generate extends DauxCommand ->addOption('search', null, InputOption::VALUE_NONE, 'Generate full text search'); } + protected function prepareConfig($mode, InputInterface $input, OutputInterface $output): ConfigBuilder + { + $builder = parent::prepareConfig($mode, $input, $output); + + // Set the format if requested + if ($input->hasOption('format') && $input->getOption('format')) { + $builder->withFormat($input->getOption('format')); + } + + if ($input->hasOption('delete') && $input->getOption('delete')) { + $builder->withConfluenceDelete(true); + } + + if ($input->hasOption('search')) { + $builder->withSearch($input->getOption('search')); + } + + return $builder; + } + protected function execute(InputInterface $input, OutputInterface $output) { // When used as a default command, @@ -42,12 +63,13 @@ class Generate extends DauxCommand $input = new ArgvInput($argv, $this->getDefinition()); } - $daux = $this->prepareDaux($input, $output); + $builder = $this->prepareConfig(Daux::STATIC_MODE, $input, $output); + $daux = new Daux($builder->build(), $output); $width = (new Terminal)->getWidth(); // Instiantiate the processor if one is defined - $this->prepareProcessor($daux, $input, $output, $width); + $this->prepareProcessor($daux, $width); // Generate the tree $daux->generateTree(); @@ -57,16 +79,4 @@ class Generate extends DauxCommand return 0; } - - protected function prepareProcessor(Daux $daux, InputInterface $input, OutputInterface $output, $width) - { - if ($input->getOption('processor')) { - $daux->getParams()['processor'] = $input->getOption('processor'); - } - - $class = $daux->getProcessorClass(); - if (!empty($class)) { - $daux->setProcessor(new $class($daux, $output, $width)); - } - } } diff --git a/libs/Console/Serve.php b/libs/Console/Serve.php index 8e1465e..cf8e738 100755 --- a/libs/Console/Serve.php +++ b/libs/Console/Serve.php @@ -6,6 +6,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\ProcessUtils; +use Symfony\Component\Console\Terminal; use Todaymade\Daux\Daux; use Todaymade\Daux\Server\Server; @@ -19,8 +20,6 @@ class Serve extends DauxCommand ->setName('serve') ->setDescription('Serve documentation') - // Serve the current documentation - ->addOption('serve', null, InputOption::VALUE_NONE, 'Serve the current directory') ->addOption('host', null, InputOption::VALUE_REQUIRED, 'The host to serve on', 'localhost') ->addOption('port', null, InputOption::VALUE_REQUIRED, 'The port to serve on', 8085); } @@ -30,17 +29,27 @@ class Serve extends DauxCommand $host = $input->getOption('host'); $port = $input->getOption('port'); - $daux = $this->prepareDaux($input, $output); + $builder = $this->prepareConfig(Daux::LIVE_MODE, $input, $output); // Daux can only serve HTML - $daux->getParams()->setFormat('html'); + $builder->withFormat('html'); + + $daux = new Daux($builder->build(), $output); + + $width = (new Terminal)->getWidth(); + + // Instiantiate the processor if one is defined + $this->prepareProcessor($daux, $width); + + // Write the current configuration to a file to read it from the other serving side + $file = tmpfile(); + $path = stream_get_meta_data($file)['uri']; + fwrite($file, serialize($daux->getConfig())); chdir(__DIR__ . '/../../'); + putenv('DAUX_CONFIG='. $path); putenv('DAUX_VERBOSITY=' . $output->getVerbosity()); - putenv('DAUX_SOURCE=' . $daux->getParams()->getDocumentationDirectory()); - putenv('DAUX_THEME=' . $daux->getParams()->getThemesPath()); - putenv('DAUX_CONFIGURATION=' . $daux->getParams()->getConfigurationOverrideFile()); putenv('DAUX_EXTENSION=' . DAUX_EXTENSION); $base = escapeshellarg(__DIR__ . '/../../'); @@ -49,6 +58,7 @@ class Serve extends DauxCommand echo "Daux development server started on http://{$host}:{$port}/\n"; passthru("{$binary} -S {$host}:{$port} {$base}/index.php"); + fclose($file); return 0; } diff --git a/libs/ContentTypes/Markdown/CommonMarkConverter.php b/libs/ContentTypes/Markdown/CommonMarkConverter.php index d145c34..0a79e20 100644 --- a/libs/ContentTypes/Markdown/CommonMarkConverter.php +++ b/libs/ContentTypes/Markdown/CommonMarkConverter.php @@ -25,8 +25,8 @@ class CommonMarkConverter extends \League\CommonMark\CommonMarkConverter $this->extendEnvironment($environment, $config['daux']); - if (array_key_exists('processor_instance', $config['daux'])) { - $config['daux']['processor_instance']->extendCommonMarkEnvironment($environment); + if ($config['daux']->hasProcessorInstance()) { + $config['daux']->getProcessorInstance()->extendCommonMarkEnvironment($environment); } parent::__construct($config, $environment); diff --git a/libs/ContentTypes/Markdown/ContentType.php b/libs/ContentTypes/Markdown/ContentType.php index 2687684..c1fb2db 100644 --- a/libs/ContentTypes/Markdown/ContentType.php +++ b/libs/ContentTypes/Markdown/ContentType.php @@ -49,20 +49,23 @@ class ContentType implements \Todaymade\Daux\ContentTypes\ContentType { $this->config->setCurrentPage($node); - if (!$this->config->canCache()) { - return $this->doConversion($raw); - } + $can_cache = $this->config->canCache(); // TODO :: add daux version to cache key $cacheKey = $this->config->getCacheKey() . sha1($raw); $payload = Cache::get($cacheKey); - if ($payload) { + if ($can_cache && $payload) { Daux::writeln("Using cached version", OutputInterface::VERBOSITY_VERBOSE); - } else { - Daux::writeln("Not found in the cache, generating...", OutputInterface::VERBOSITY_VERBOSE); + } + + if (!$can_cache || !$payload) { + Daux::writeln($can_cache ? "Not found in the cache, generating..." : "Cache disabled, generating...", OutputInterface::VERBOSITY_VERBOSE); $payload = $this->doConversion($raw); + } + + if ($can_cache) { Cache::put($cacheKey, $payload); } diff --git a/libs/Daux.php b/libs/Daux.php index 0f99e63..eb66fe5 100644 --- a/libs/Daux.php +++ b/libs/Daux.php @@ -15,18 +15,13 @@ class Daux public static $output; - /** @var string */ - public $local_base; - /** @var \Todaymade\Daux\Format\Base\Generator */ protected $generator; /** @var ContentTypeHandler */ protected $typeHandler; - /** - * @var string[] - */ + /** @var string[] */ protected $validExtensions; /** @var Processor */ @@ -36,155 +31,17 @@ class Daux public $tree; /** @var Config */ - public $options; - - /** @var string */ - private $mode; + public $config; /** @var bool */ private $merged_tree = false; - /** - * @param string $mode - */ - public function __construct($mode, OutputInterface $output) + public function __construct(Config $config, OutputInterface $output) { Daux::$output = $output; - $this->mode = $mode; - $this->local_base = dirname(__DIR__); - - // global.json - $this->loadBaseConfiguration(); - } - - /** - * @param string $override_file - * @throws Exception - */ - public function initializeConfiguration($override_file = null) - { - $params = $this->getParams(); - - // Validate and set theme path - $params->setDocumentationDirectory( - $docs_path = $this->normalizeDocumentationPath($this->getParams()->getDocumentationDirectory()) - ); - - // Read documentation overrides - $this->loadConfiguration($docs_path . DIRECTORY_SEPARATOR . 'config.json'); - - // Read command line overrides - $override_file = $this->getConfigurationOverride($override_file); - if ($override_file !== null) { - $params->setConfigurationOverrideFile($override_file); - $this->loadConfiguration($override_file); - } - - // Validate and set theme path - $params->setThemesPath($this->normalizeThemePath($params->getThemesDirectory())); - - // Set a valid default timezone - if ($params->hasTimezone()) { - date_default_timezone_set($params->getTimezone()); - } elseif (!ini_get('date.timezone')) { - date_default_timezone_set('GMT'); - } - } - - /** - * Get the file requested for configuration overrides - * - * @param string|null $path - * @return string|null the path to a file to load for configuration overrides - * @throws Exception - */ - public function getConfigurationOverride($path) - { - $validPath = DauxHelper::findLocation($path, $this->local_base, 'DAUX_CONFIGURATION', 'file'); - - if ($validPath === null) { - return null; - } - - if (!$validPath) { - throw new Exception('The configuration override file does not exist. Check the path again : ' . $path); - } - - return $validPath; - } - - public function normalizeThemePath($path) - { - $validPath = DauxHelper::findLocation($path, $this->local_base, 'DAUX_THEME', 'dir'); - - if (!$validPath) { - throw new Exception('The Themes directory does not exist. Check the path again : ' . $path); - } - - return $validPath; - - } - - public function normalizeDocumentationPath($path) - { - $validPath = DauxHelper::findLocation($path, $this->local_base, 'DAUX_SOURCE', 'dir'); - - if (!$validPath) { - throw new Exception('The Docs directory does not exist. Check the path again : ' . $path); - } - - return $validPath; - } - - /** - * Load and validate the global configuration - * - * @throws Exception - */ - protected function loadBaseConfiguration() - { - $this->options = new Config(); - - // Set the default configuration - $this->options->merge([ - 'docs_directory' => 'docs', - 'valid_content_extensions' => ['md', 'markdown'], - - //Paths and tree - 'mode' => $this->mode, - 'local_base' => $this->local_base, - 'templates' => 'templates', - - 'index_key' => 'index.html', - 'base_page' => '', - 'base_url' => '', - ]); - - // Load the global configuration - $this->loadConfiguration($this->local_base . DIRECTORY_SEPARATOR . 'global.json', false); - } - - /** - * @param string $config_file - * @param bool $optional - * @throws Exception - */ - protected function loadConfiguration($config_file, $optional = true) - { - if (!file_exists($config_file)) { - if ($optional) { - return; - } - - throw new Exception('The configuration file is missing. Check path : ' . $config_file); - } - - $config = json_decode(file_get_contents($config_file), true); - if (!isset($config)) { - throw new Exception('The configuration file "' . $config_file . '" is corrupt. Is your JSON well-formed ?'); - } - $this->options->merge($config); + + $this->config = $config; } /** @@ -192,14 +49,14 @@ class Daux */ public function generateTree() { - $this->options['valid_content_extensions'] = $this->getContentExtensions(); + $this->config->setValidContentExtensions($this->getContentExtensions()); - $this->tree = new Root($this->getParams()); - Builder::build($this->tree, $this->options['ignore']); + $this->tree = new Root($this->getConfig()); + Builder::build($this->tree, $this->config->getIgnore()); // Apply the language name as Section title - if ($this->options->isMultilanguage()) { - foreach ($this->options['languages'] as $key => $node) { + if ($this->config->isMultilanguage()) { + foreach ($this->config->getLanguages() as $key => $node) { $this->tree->getEntries()[$key]->setTitle($node); } } @@ -216,22 +73,34 @@ class Daux /** * @return Config */ - public function getParams() + public function getConfig() { if ($this->tree && !$this->merged_tree) { - $this->options['tree'] = $this->tree; - $this->options['index'] = $this->tree->getIndexPage() ?: $this->tree->getFirstPage(); - if ($this->options->isMultilanguage()) { - foreach ($this->options['languages'] as $key => $name) { - $this->options['entry_page'][$key] = $this->tree->getEntries()[$key]->getFirstPage(); + $this->config->setTree($this->tree); + $this->config->setIndex($this->tree->getIndexPage() ?: $this->tree->getFirstPage()); + $entry_page = null; + if ($this->config->isMultilanguage()) { + $entry_page = []; + foreach ($this->config->getLanguages() as $key => $name) { + $entry_page[$key] = $this->tree->getEntries()[$key]->getFirstPage(); } } else { - $this->options['entry_page'] = $this->tree->getFirstPage(); + $entry_page= $this->tree->getFirstPage(); } + $this->config->setEntryPage($entry_page); $this->merged_tree = true; } - return $this->options; + return $this->config; + } + + /** + * @return Config + * @deprecated Use getConfig instead + */ + public function getParams() + { + return $this->getConfig(); } /** @@ -254,9 +123,9 @@ class Daux $this->processor = $processor; // This is not the cleanest but it's - // the best i've found to use the + // the best I've found to use the // processor in very remote places - $this->options['processor_instance'] = $processor; + $this->config->setProcessorInstance($processor); } public function getGenerators() @@ -272,10 +141,9 @@ class Daux return array_replace($default, $extended); } - public function getProcessorClass() { - $processor = $this->getParams()['processor']; + $processor = $this->getConfig()->getProcessor(); if (empty($processor)) { return null; @@ -318,7 +186,7 @@ class Daux $generators = $this->getGenerators(); - $format = $this->getParams()->getFormat(); + $format = $this->getConfig()->getFormat(); if (!array_key_exists($format, $generators)) { $message = "The format '$format' doesn't exist, did you forget to set your processor ?"; diff --git a/libs/DauxHelper.php b/libs/DauxHelper.php index 0b54fea..c902a33 100644 --- a/libs/DauxHelper.php +++ b/libs/DauxHelper.php @@ -16,52 +16,27 @@ class DauxHelper public static function rebaseConfiguration(Config $config, $base_url) { // Avoid changing the url if it is already correct - if ($config['base_url'] == $base_url && !empty($config['theme'])) { + if ($config->getBaseUrl() == $base_url && !empty($config->getTheme())) { return; } // Change base url for all links on the pages - $config['base_url'] = $config['base_page'] = $base_url; + $config['base_url'] = $base_url; $config['theme'] = static::getTheme($config, $base_url); - $config['image'] = str_replace('', $base_url, $config['image']); - } - - protected static function resolveVariant(Config $params) - { - if (array_key_exists('theme-variant', $params['html'])) { - return; - } - - if (is_dir(realpath(($params->getThemesPath() . DIRECTORY_SEPARATOR . $params['html']['theme'])))) { - return; - } - - $theme = explode('-', $params['html']['theme']); - - // do we have a variant or only a theme ? - if (isset($theme[1])) { - $params['html']['theme-variant'] = array_pop($theme); - $params['html']['theme'] = implode('-', $theme); - } else { - $params['html']['theme'] = array_pop($theme); - } - - if (!is_dir(realpath($params->getThemesPath() . DIRECTORY_SEPARATOR . $params['html']['theme']))) { - throw new \RuntimeException("Theme '{$params['html']['theme']}' not found"); - } + $config['image'] = str_replace('', $base_url, $config->getImage()); } /** - * @param Config $params + * @param Config $config * @param string $current_url * @return array */ - protected static function getTheme(Config $params, $current_url) + protected static function getTheme(Config $config, $current_url) { - self::resolveVariant($params); + $htmlTheme = $config->getHTML()->getTheme(); - $theme_folder = $params->getThemesPath() . DIRECTORY_SEPARATOR . $params['html']['theme']; - $theme_url = $params['base_url'] . 'themes/' . $params['html']['theme'] . '/'; + $theme_folder = $config->getThemesPath() . DIRECTORY_SEPARATOR . $htmlTheme; + $theme_url = $config->getBaseUrl() . 'themes/' . $htmlTheme . '/'; $theme = []; if (is_file($theme_folder . DIRECTORY_SEPARATOR . 'config.json')) { @@ -73,7 +48,7 @@ class DauxHelper //Default parameters for theme $theme += [ - 'name' => $params['html']['theme'], + 'name' => $htmlTheme, 'css' => [], 'js' => [], 'fonts' => [], @@ -82,8 +57,8 @@ class DauxHelper 'variants' => [], ]; - if (array_key_exists('theme-variant', $params['html'])) { - $variant = $params['html']['theme-variant']; + if ($config->getHTML()->hasThemeVariant()) { + $variant = $config->getHTML()->getThemeVariant(); if (!array_key_exists($variant, $theme['variants'])) { throw new Exception("Variant '$variant' not found for theme '$theme[name]'"); } @@ -104,7 +79,7 @@ class DauxHelper } $substitutions = [ - '' => $params['local_base'], + '' => $config->getLocalBase(), '' => $current_url, '' => $theme_url, ]; @@ -156,7 +131,7 @@ class DauxHelper */ public static function getFilenames(Config $config, $part) { - $extensions = implode('|', array_map('preg_quote', $config['valid_content_extensions'])) . '|html'; + $extensions = implode('|', array_map('preg_quote', $config->getValidContentExtensions())) . '|html'; $raw = preg_replace('/(.*)?\\.(' . $extensions . ')$/', '$1', $part); $raw = Builder::removeSortingInformations($raw); @@ -487,44 +462,6 @@ class DauxHelper return getcwd() . '/' . $path; } - /** - * @param string|null $path - * @param string $basedir - * @param string $var The constant name to check - * @param "dir"|"file" $type - * @return false|null|string - */ - public static function findLocation($path, $basedir, $var, $type) { - // VFS, used only in tests - if (substr($path, 0, 6) == "vfs://") { - return $path; - } - - // When running through `daux --serve` we set an environment variable to know where we started from - $env = getenv($var); - if ($env && DauxHelper::is($env, $type)) { - return $env; - } - - // If Path is explicitly null, it's useless to go further - if ($path == null) { - return null; - } - - // Check if it's relative to the current directory or an absolute path - if (DauxHelper::is($path, $type)) { - return DauxHelper::getAbsolutePath($path); - } - - // Check if it exists relative to Daux's root - $newPath = $basedir . DIRECTORY_SEPARATOR . $path; - if (DauxHelper::is($newPath, $type)) { - return $newPath; - } - - return false; - } - public static function is($path, $type) { return ($type == 'dir') ? is_dir($path) : file_exists($path); } @@ -545,7 +482,7 @@ class DauxHelper if ($url[0] == '!' || $url[0] == '/') { $url = ltrim($url, '!/'); - if ($file = DauxHelper::getFile($config['tree'], $url)) { + if ($file = DauxHelper::getFile($config->getTree(), $url)) { return $file; } @@ -560,7 +497,7 @@ class DauxHelper // If we didn't already try it, we'll // do a pass starting at the root - if (!$triedAbsolute && $file = DauxHelper::getFile($config['tree'], $url)) { + if (!$triedAbsolute && $file = DauxHelper::getFile($config->getTree(), $url)) { return $file; } diff --git a/libs/Format/Base/ContentPage.php b/libs/Format/Base/ContentPage.php index 7641085..4af078e 100644 --- a/libs/Format/Base/ContentPage.php +++ b/libs/Format/Base/ContentPage.php @@ -14,7 +14,7 @@ abstract class ContentPage extends SimplePage /** * @var Config */ - protected $params; + protected $config; /** * @var ContentType @@ -38,9 +38,17 @@ abstract class ContentPage extends SimplePage return $this->file; } - public function setParams(Config $params) + public function setConfig(Config $config) { - $this->params = $params; + $this->config = $config; + } + + /** + * @deprecated use setConfig instead + */ + public function setParams(Config $config) + { + $this->setConfig($config); } /** @@ -65,11 +73,11 @@ abstract class ContentPage extends SimplePage return $this->getPureContent(); } - public static function fromFile(Content $file, $params, ContentType $contentType) + public static function fromFile(Content $file, $config, ContentType $contentType) { $page = new static($file->getTitle(), $file->getContent()); $page->setFile($file); - $page->setParams($params); + $page->setConfig($config); $page->setContentType($contentType); return $page; diff --git a/libs/Format/Base/LiveGenerator.php b/libs/Format/Base/LiveGenerator.php index 97e14c6..0230719 100644 --- a/libs/Format/Base/LiveGenerator.php +++ b/libs/Format/Base/LiveGenerator.php @@ -7,8 +7,8 @@ interface LiveGenerator extends Generator { /** * @param Entry $node - * @param Config $params + * @param Config $config * @return \Todaymade\Daux\Format\Base\Page */ - public function generateOne(Entry $node, Config $params); + public function generateOne(Entry $node, Config $config); } diff --git a/libs/Format/Confluence/Config.php b/libs/Format/Confluence/Config.php new file mode 100644 index 0000000..8311a68 --- /dev/null +++ b/libs/Format/Confluence/Config.php @@ -0,0 +1,66 @@ +params['tree'])) + $content = (new EmbedImages($this->config->getTree())) ->embed( $content, $this->file, @@ -36,10 +36,9 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage } ); - $intro = ''; - if (array_key_exists('confluence', $this->params) && array_key_exists('header', $this->params['confluence']) && !empty($this->params['confluence']['header'])) { - $intro = '' . $this->params['confluence']['header'] . ''; + if ($this->config->getConfluenceConfiguration()->hasHeader()) { + $intro = '' . $this->config->getConfluenceConfiguration()->getHeader() . ''; } return $intro . $content; diff --git a/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php b/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php index b39d5aa..f53ed67 100644 --- a/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php +++ b/libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php @@ -48,12 +48,12 @@ class FencedCodeRenderer extends CodeRenderer throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block)); } - $language = $this->getLanguage($block->getInfoWords(), $htmlRenderer); + $language = $this->getLanguage($block->getInfoWords()); return $this->getHTMLElement($block->getStringContent(), $language); } - public function getLanguage($infoWords, ElementRendererInterface $htmlRenderer) + public function getLanguage($infoWords) { if (count($infoWords) === 0 || strlen($infoWords[0]) === 0) { return false; diff --git a/libs/Format/Confluence/Generator.php b/libs/Format/Confluence/Generator.php index 0c70c23..a452651 100644 --- a/libs/Format/Confluence/Generator.php +++ b/libs/Format/Confluence/Generator.php @@ -30,7 +30,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator public function checkConfiguration() { - $config = $this->daux->getParams(); + $config = $this->daux->getConfig(); $confluence = $config->getConfluenceConfiguration(); if ($confluence == null) { @@ -60,7 +60,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator public function getContentTypes() { return [ - new ContentTypes\Markdown\ContentType($this->daux->getParams()), + new ContentTypes\Markdown\ContentType($this->daux->getConfig()), ]; } @@ -69,10 +69,10 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator */ public function generateAll(InputInterface $input, OutputInterface $output, $width) { - $params = $this->daux->getParams(); + $config = $this->daux->getConfig(); - $confluence = $params['confluence']; - $this->prefix = trim($confluence['prefix']) . ' '; + $confluence = $config->getConfluenceConfiguration(); + $this->prefix = trim($confluence->getPrefix()) . ' '; if ($this->prefix == ' ') { $this->prefix = ''; } @@ -80,9 +80,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $tree = $this->runAction( 'Generating Tree ...', $width, - function() use ($params) { - $tree = $this->generateRecursive($this->daux->tree, $params); - $tree['title'] = $this->prefix . $params['title']; + function() use ($config) { + $tree = $this->generateRecursive($this->daux->tree, $config); + $tree['title'] = $this->prefix . $config->getTitle(); return $tree; } @@ -96,31 +96,31 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $publisher->publish($tree); } - private function generateRecursive(Directory $tree, Config $params, $base_url = '') + private function generateRecursive(Directory $tree, Config $config, $base_url = '') { $final = ['title' => $this->prefix . $tree->getTitle()]; - $params['base_url'] = $params['base_page'] = $base_url; + $config['base_url'] = $base_url; - $params['image'] = str_replace('', $base_url, $params['image']); + $config->setImage(str_replace('', $base_url, $config->getImage())); if ($base_url !== '') { - $params['entry_page'] = $tree->getFirstPage(); + $config->setEntryPage($tree->getFirstPage()); } foreach ($tree->getEntries() as $key => $node) { if ($node instanceof Directory) { $final['children'][$this->prefix . $node->getTitle()] = $this->generateRecursive( $node, - $params, + $config, '../' . $base_url ); } elseif ($node instanceof Content) { - $params['request'] = $node->getUrl(); + $config->setRequest($node->getUrl()); $contentType = $this->daux->getContentTypeHandler()->getType($node); $data = [ 'title' => $this->prefix . $node->getTitle(), 'file' => $node, - 'page' => ContentPage::fromFile($node, $params, $contentType), + 'page' => ContentPage::fromFile($node, $config, $contentType), ]; if ($key == 'index.html') { diff --git a/libs/Format/Confluence/Publisher.php b/libs/Format/Confluence/Publisher.php index ec13a4e..f5abe20 100644 --- a/libs/Format/Confluence/Publisher.php +++ b/libs/Format/Confluence/Publisher.php @@ -13,7 +13,7 @@ class Publisher protected $client; /** - * @var array + * @var Config */ protected $confluence; @@ -30,12 +30,12 @@ class Publisher /** * @param $confluence */ - public function __construct($confluence) + public function __construct(Config $confluence) { $this->confluence = $confluence; - $this->client = new Api($confluence['base_url'], $confluence['user'], $confluence['pass']); - $this->client->setSpace($confluence['space_id']); + $this->client = new Api($confluence->getBaseUrl(), $confluence->getUser(), $confluence->getPassword()); + $this->client->setSpace($confluence->getSpaceId()); } public function run($title, $closure) @@ -64,22 +64,21 @@ class Publisher $published = $this->run( "Create placeholder pages...", function() use ($tree, $published) { - return $this->createRecursive($this->confluence['ancestor_id'], $tree, $published); + return $this->createRecursive($this->confluence->getAncestorId(), $tree, $published); } ); $this->output->writeLn('Publishing updates...'); - $published = $this->updateRecursive($this->confluence['ancestor_id'], $tree, $published); + $published = $this->updateRecursive($this->confluence->getAncestorId(), $tree, $published); - $shouldDelete = array_key_exists('delete', $this->confluence) && $this->confluence['delete']; - $delete = new PublisherDelete($this->output, $shouldDelete, $this->client); + $delete = new PublisherDelete($this->output, $this->confluence->shouldAutoDeleteOrphanedPages(), $this->client); $delete->handle($published); } protected function getRootPage($tree) { - if (array_key_exists('ancestor_id', $this->confluence)) { - $pages = $this->client->getList($this->confluence['ancestor_id']); + if ($this->confluence->hasAncestorId()) { + $pages = $this->client->getList($this->confluence->getAncestorId()); foreach ($pages as $page) { if ($page['title'] == $tree['title']) { return $page; @@ -87,9 +86,9 @@ class Publisher } } - if (array_key_exists('root_id', $this->confluence)) { - $published = $this->client->getPage($this->confluence['root_id']); - $this->confluence['ancestor_id'] = $published['ancestor_id']; + if ($this->confluence->hasRootId()) { + $published = $this->client->getPage($this->confluence->getRootId()); + $this->confluence->setAncestorId($published['ancestor_id']); return $published; } @@ -178,7 +177,7 @@ class Publisher protected function updatePage($parent_id, $entry, $published) { - $updateThreshold = array_key_exists('update_threshold', $this->confluence) ? $this->confluence['update_threshold'] : 2; + $updateThreshold = $this->confluence->getUpdateThreshold(); $this->run( '- ' . PublisherUtilities::niceTitle($entry['file']->getUrl()), diff --git a/libs/Format/Confluence/PublisherDelete.php b/libs/Format/Confluence/PublisherDelete.php index b3a94a6..6c5a0b5 100644 --- a/libs/Format/Confluence/PublisherDelete.php +++ b/libs/Format/Confluence/PublisherDelete.php @@ -22,7 +22,7 @@ class PublisherDelete */ protected $client; - public function __construct($output, $delete, $client) + public function __construct($output, bool $delete, $client) { $this->output = $output; $this->delete = $delete; @@ -55,7 +55,6 @@ class PublisherDelete if ($this->delete) { $this->doDelete(); - } else { $this->displayDeletable(); } diff --git a/libs/Format/HTML/Config.php b/libs/Format/HTML/Config.php index affd476..4ea352a 100644 --- a/libs/Format/HTML/Config.php +++ b/libs/Format/HTML/Config.php @@ -20,7 +20,6 @@ class Config extends BaseConfig if (is_string($this['edit_on'])) { return $this->prepareGithubUrl($this['edit_on']); } else { - $this['edit_on']['basepath'] = rtrim($this['edit_on']['basepath'], '/'); return $this['edit_on']; @@ -28,9 +27,154 @@ class Config extends BaseConfig } if (array_key_exists('edit_on_github', $this)) { - return $this->prepareGithubUrl($this['edit_on_github']); + return $this->prepareGithubUrl($this->getValue('edit_on_github')); } return null; } + + public function hasSearch() { + return $this->hasValue('search') && $this->getValue('search'); + } + + public function showDateModified() + { + return $this->hasValue('date_modified') && $this->getValue('date_modified'); + } + + public function showPreviousNextLinks() + { + if ($this->hasValue('jump_buttons')) { + return $this->getValue('jump_buttons'); + } + + return true; + } + + public function showCodeToggle() + { + if ($this->hasValue('toggle_code')) { + return $this->getValue('toggle_code'); + } + + return true; + } + + public function hasAutomaticTableOfContents(): bool + { + return $this->hasValue('auto_toc') && $this->getValue('auto_toc'); + } + + public function hasGoogleAnalytics() + { + return $this->hasValue('google_analytics'); + } + + public function getGoogleAnalyticsId() + { + return $this->getValue('google_analytics'); + } + + public function hasPiwikAnalytics() + { + return $this->hasValue('piwik_analytics') && $this->hasValue('piwik_analytics_id'); + } + + public function getPiwikAnalyticsId() + { + return $this->getValue('piwik_analytics_id'); + } + + public function getPiwikAnalyticsUrl() + { + return $this->getValue('piwik_analytics'); + } + + public function hasPoweredBy() + { + return $this->hasValue('powered_by') && !empty($this->getValue('powered_by')); + } + + public function getPoweredBy() + { + return $this->getValue('powered_by'); + } + + public function hasTwitterHandles() + { + return $this->hasValue('twitter') && !empty($this->getValue('twitter')); + } + + public function getTwitterHandles() + { + return $this->getValue('twitter'); + } + + public function hasLinks() + { + return $this->hasValue('links') && !empty($this->getValue('links')); + } + + public function getLinks() + { + return $this->getValue('links'); + } + + public function hasRepository() + { + return $this->hasValue('repo') && !empty($this->getValue('repo')); + } + + public function getRepository() + { + return $this->getValue('repo'); + } + + public function hasButtons() + { + return $this->hasValue('buttons') && !empty($this->getValue('buttons')); + } + + public function getButtons() + { + return $this->getValue('buttons'); + } + + public function hasLandingPage() + { + if ($this->hasValue('auto_landing')) { + return $this->getValue('auto_landing'); + } + + return true; + } + + public function hasBreadcrumbs() + { + if ($this->hasValue('breadcrumbs')) { + return $this->getValue('breadcrumbs'); + } + + return true; + } + + public function getBreadcrumbsSeparator() + { + return $this->getValue('breadcrumb_separator'); + } + + public function getTheme() + { + return $this->getValue('theme'); + } + + public function hasThemeVariant() + { + return $this->hasValue('theme-variant') && !empty($this->getValue('theme-variant')); + } + + public function getThemeVariant() + { + return $this->getValue('theme-variant'); + } } diff --git a/libs/Format/HTML/ContentPage.php b/libs/Format/HTML/ContentPage.php index 79e9da1..72d8a11 100644 --- a/libs/Format/HTML/ContentPage.php +++ b/libs/Format/HTML/ContentPage.php @@ -4,7 +4,14 @@ use Todaymade\Daux\Tree\Root; class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage { + /** + * @var string + */ private $language; + + /** + * @var bool + */ private $homepage; /** @@ -12,24 +19,19 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage */ public $templateRenderer; - private function isHomepage() + private function isHomepage(): bool { // If the current page isn't the index, no chance it is the landing page if ($this->file->getParent()->getIndexPage() != $this->file) { return false; } - // If the direct parent is root, this is the homage + // If the direct parent is root, this is the homepage return $this->file->getParent() instanceof Root; } - private function isLanding() { - // If we don't have the auto_landing parameter, we don't want any homepage - if (array_key_exists('auto_landing', $this->params['html']) && !$this->params['html']['auto_landing']) { - return false; - } - - return $this->homepage; + private function isLanding(): bool { + return $this->config->getHTML()->hasLandingPage() && $this->homepage; } private function initialize() @@ -37,7 +39,7 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage $this->homepage = $this->isHomepage(); $this->language = ''; - if ($this->params->isMultilanguage() && count($this->file->getParents())) { + if ($this->config->isMultilanguage() && count($this->file->getParents())) { $language_dir = $this->file->getParents()[0]; $this->language = $language_dir->getName(); } @@ -67,16 +69,16 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage protected function generatePage() { $this->initialize(); - $params = $this->params; + $config = $this->config; $entry_page = []; if ($this->homepage) { - if ($params->isMultilanguage()) { - foreach ($params['languages'] as $key => $name) { - $entry_page[$name] = $params['base_page'] . $params['entry_page'][$key]->getUrl(); + if ($config->isMultilanguage()) { + foreach ($config->getLanguages() as $key => $name) { + $entry_page[$name] = $config->getBasePage() . $config->getEntryPage()[$key]->getUrl(); } } else { - $entry_page['__VIEW_DOCUMENTATION__'] = $params['base_page'] . $params['entry_page']->getUrl(); + $entry_page['__VIEW_DOCUMENTATION__'] = $config->getBasePage() . $config->getEntryPage()->getUrl(); } } @@ -90,24 +92,24 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage 'relative_path' => $this->file->getRelativePath(), 'modified_time' => filemtime($this->file->getPath()), 'markdown' => $this->content, - 'request' => $params['request'], + 'request' => $config->getRequest(), 'content' => $this->getPureContent(), - 'breadcrumbs' => $params['html']['breadcrumbs'], + 'breadcrumbs' => $config->getHTML()->hasBreadcrumbs(), 'prev' => $this->file->getPrevious(), 'next' => $this->file->getNext(), 'attributes' => $this->file->getAttribute() ]; if ($page['breadcrumbs']) { - $page['breadcrumb_trail'] = $this->getBreadcrumbTrail($this->file->getParents(), $params->isMultilanguage()); - $page['breadcrumb_separator'] = $params['html']['breadcrumb_separator']; + $page['breadcrumb_trail'] = $this->getBreadcrumbTrail($this->file->getParents(), $config->isMultilanguage()); + $page['breadcrumb_separator'] = $this->config->getHTML()->getBreadcrumbsSeparator(); if ($this->homepage) { $page['breadcrumb_trail'] = [['title' => $this->file->getTitle(), 'url' => '']]; } } - $context = ['page' => $page, 'params' => $params]; + $context = ['page' => $page, 'config' => $config]; $template = "theme::content"; if ($this->isLanding()) { diff --git a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php index 995ad56..07fe77e 100644 --- a/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php +++ b/libs/Format/HTML/ContentTypes/Markdown/TOC/Processor.php @@ -17,6 +17,9 @@ use Todaymade\Daux\ContentTypes\Markdown\TableOfContents; class Processor { + /** + * @var Config + */ protected $config; public function __construct(Config $config) @@ -24,11 +27,6 @@ class Processor $this->config = $config; } - public function hasAutoTOC() - { - return array_key_exists('html', $this->config) && array_key_exists('auto_toc', $this->config['html']) && $this->config['html']['auto_toc']; - } - /** * @param DocumentParsedEvent $event * @@ -60,7 +58,7 @@ class Processor $headings[] = new Entry($node); } - if (count($headings) && (count($tocs) || $this->hasAutoTOC())) { + if (count($headings) && (count($tocs) || $this->config->getHTML()->hasAutomaticTableOfContents())) { $generated = $this->generate($headings); if (count($tocs)) { diff --git a/libs/Format/HTML/Generator.php b/libs/Format/HTML/Generator.php index dbf46c0..3eb41ca 100755 --- a/libs/Format/HTML/Generator.php +++ b/libs/Format/HTML/Generator.php @@ -31,11 +31,11 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator */ public function __construct(Daux $daux) { - $params = $daux->getParams(); + $config = $daux->getConfig(); $this->daux = $daux; - $this->templateRenderer = new Template($params); - $params->templateRenderer = $this->templateRenderer; + $this->templateRenderer = new Template($config); + $config->templateRenderer = $this->templateRenderer; } /** @@ -44,7 +44,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator public function getContentTypes() { return [ - 'markdown' => new ContentType($this->daux->getParams()), + 'markdown' => new ContentType($this->daux->getConfig()), ]; } @@ -52,35 +52,31 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator { $destination = $input->getOption('destination'); - $params = $this->daux->getParams(); + $config = $this->daux->getConfig(); if (is_null($destination)) { - $destination = $this->daux->local_base . DIRECTORY_SEPARATOR . 'static'; + $destination = $config->getLocalBase() . DIRECTORY_SEPARATOR . 'static'; } $this->runAction( 'Copying Static assets ...', $width, - function() use ($destination, $params) { + function() use ($destination, $config) { $this->ensureEmptyDestination($destination); - $this->copyThemes($destination, $params->getThemesPath()); + $this->copyThemes($destination, $config->getThemesPath()); } ); $output->writeLn('Generating ...'); - if (!array_key_exists('search', $params['html']) || !$params['html']['search']) { - $params['html']['search'] = $input->getOption('search'); - } - - $this->generateRecursive($this->daux->tree, $destination, $params, $output, $width, $params['html']['search']); + $this->generateRecursive($this->daux->tree, $destination, $config, $output, $width, $config->getHTML()->hasSearch()); GeneratorHelper::copyRecursive( - $this->daux->local_base . DIRECTORY_SEPARATOR . 'daux_libraries' . DIRECTORY_SEPARATOR, + $config->getLocalBase() . DIRECTORY_SEPARATOR . 'daux_libraries' . DIRECTORY_SEPARATOR, $destination . DIRECTORY_SEPARATOR . 'daux_libraries' ); - if ($params['html']['search']) { + if ($config->getHTML()->hasSearch()) { file_put_contents( $destination . DIRECTORY_SEPARATOR . 'daux_search_index.json', json_encode(['pages' => $this->indexed_pages]) @@ -147,34 +143,34 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator * * @param Directory $tree * @param string $output_dir - * @param \Todaymade\Daux\Config $params + * @param \Todaymade\Daux\Config $config * @param OutputInterface $output * @param int $width * @param bool $index_pages * @param string $base_url * @throws \Exception */ - private function generateRecursive(Directory $tree, $output_dir, $params, $output, $width, $index_pages, $base_url = '') + private function generateRecursive(Directory $tree, $output_dir, $config, $output, $width, $index_pages, $base_url = '') { - DauxHelper::rebaseConfiguration($params, $base_url); + DauxHelper::rebaseConfiguration($config, $base_url); - if ($base_url !== '' && empty($params['entry_page'])) { - $params['entry_page'] = $tree->getFirstPage(); + if ($base_url !== '' && !$config->hasEntryPage()) { + $config->setEntryPage($tree->getFirstPage()); } foreach ($tree->getEntries() as $key => $node) { if ($node instanceof Directory) { $new_output_dir = $output_dir . DIRECTORY_SEPARATOR . $key; mkdir($new_output_dir); - $this->generateRecursive($node, $new_output_dir, $params, $output, $width, $index_pages, '../' . $base_url); + $this->generateRecursive($node, $new_output_dir, $config, $output, $width, $index_pages, '../' . $base_url); - // Rebase configuration again as $params is a shared object - DauxHelper::rebaseConfiguration($params, $base_url); + // Rebase configuration again as $config is a shared object + DauxHelper::rebaseConfiguration($config, $base_url); } else { $this->runAction( '- ' . $node->getUrl(), $width, - function() use ($node, $output_dir, $key, $params, $index_pages) { + function() use ($node, $output_dir, $key, $config, $index_pages) { if ($node instanceof Raw) { copy($node->getPath(), $output_dir . DIRECTORY_SEPARATOR . $key); @@ -183,7 +179,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator $this->daux->tree->setActiveNode($node); - $generated = $this->generateOne($node, $params); + $generated = $this->generateOne($node, $config); file_put_contents($output_dir . DIRECTORY_SEPARATOR . $key, $generated->getContent()); if ($index_pages) { $this->indexed_pages[] = [ @@ -201,10 +197,10 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator /** * @param Entry $node - * @param Config $params + * @param Config $config * @return \Todaymade\Daux\Format\Base\Page */ - public function generateOne(Entry $node, Config $params) + public function generateOne(Entry $node, Config $config) { if ($node instanceof Raw) { return new RawPage($node->getPath()); @@ -214,9 +210,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator, LiveGenerator return new ComputedRawPage($node); } - $params['request'] = $node->getUrl(); + $config->setRequest($node->getUrl()); - $contentPage = ContentPage::fromFile($node, $params, $this->daux->getContentTypeHandler()->getType($node)); + $contentPage = ContentPage::fromFile($node, $config, $this->daux->getContentTypeHandler()->getType($node)); $contentPage->templateRenderer = $this->templateRenderer; return $contentPage; diff --git a/libs/Format/HTML/Template.php b/libs/Format/HTML/Template.php index 1ab8ce9..28fc6ae 100644 --- a/libs/Format/HTML/Template.php +++ b/libs/Format/HTML/Template.php @@ -13,25 +13,25 @@ class Template { protected $engine; - protected $params; + protected $config; /** * @param string $base * @param string $theme */ - public function __construct(Config $params) + public function __construct(Config $config) { - $this->params = $params; + $this->config = $config; } - public function getEngine(Config $params) + public function getEngine(Config $config) { if ($this->engine) { return $this->engine; } - $base = $params['templates']; - $theme = $params['theme']['templates']; + $base = $config->getTemplates(); + $theme = $config->getTheme()->getTemplates(); // Use internal templates if no templates // dir exists in the working directory @@ -60,14 +60,15 @@ class Template */ public function render($name, array $data = []) { - $engine = $this->getEngine($data['params']); + $engine = $this->getEngine($data['config']); $engine->addData([ - 'base_url' => $data['params']['base_url'], - 'base_page' => $data['params']['base_page'], + 'base_url' => $data['config']->getBaseUrl(), + 'base_page' => $data['config']->getBasePage(), 'page' => $data['page'], - 'params' => $data['params'], - 'tree' => $data['params']['tree'], + 'params' => $data['config'], // legacy name for config + 'config' => $data['config'], + 'tree' => $data['config']['tree'], ]); Daux::writeln("Rendering template '$name'", OutputInterface::VERBOSITY_VERBOSE); @@ -84,7 +85,7 @@ class Template }); $engine->registerFunction('translate', function($key) { - $language = $this->params['language']; + $language = $this->config->getLanguage(); if (isset($this->engine->getData('page')['page'])) { $page = $this->engine->getData('page'); @@ -93,14 +94,12 @@ class Template } } - if (array_key_exists($language, $this->params['strings'])) { - if (array_key_exists($key, $this->params['strings'][$language])) { - return $this->params['strings'][$language][$key]; - } + if ($this->config->hasTranslationKey($language, $key)) { + return $this->config->getTranslationKey($language, $key); } - if (array_key_exists($key, $this->params['strings']['en'])) { - return $this->params['strings']['en'][$key]; + if ($this->config->hasTranslationKey('en', $key)) { + return $this->config->getTranslationKey('en', $key); } return "Unknown key $key"; diff --git a/libs/Format/HTML/Theme.php b/libs/Format/HTML/Theme.php new file mode 100644 index 0000000..f2a9e9e --- /dev/null +++ b/libs/Format/HTML/Theme.php @@ -0,0 +1,26 @@ +getValue('fonts'); + } + + public function getCSS() { + return $this->getValue('css'); + } + + public function getJS() { + return $this->getValue('js'); + } + + public function getFavicon() { + return $this->getValue('favicon'); + } + + public function getTemplates() { + return $this->getValue('templates'); + } +} diff --git a/libs/Format/HTMLFile/ContentPage.php b/libs/Format/HTMLFile/ContentPage.php index a672b6f..ceb1f12 100644 --- a/libs/Format/HTMLFile/ContentPage.php +++ b/libs/Format/HTMLFile/ContentPage.php @@ -13,7 +13,7 @@ class ContentPage extends \Todaymade\Daux\Format\Base\ContentPage // Embed images // We do it after generation so we can catch the images that were in html already - $content = (new EmbedImages($this->params['tree'])) + $content = (new EmbedImages($this->config->getTree())) ->embed( $content, $this->file, diff --git a/libs/Format/HTMLFile/Generator.php b/libs/Format/HTMLFile/Generator.php index 77d7110..6161491 100644 --- a/libs/Format/HTMLFile/Generator.php +++ b/libs/Format/HTMLFile/Generator.php @@ -23,11 +23,11 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator */ public function __construct(Daux $daux) { - $params = $daux->getParams(); + $config = $daux->getConfig(); $this->daux = $daux; - $this->templateRenderer = new Template($params); - $params->templateRenderer = $this->templateRenderer; + $this->templateRenderer = new Template($config); + $config->templateRenderer = $this->templateRenderer; } /** @@ -36,7 +36,7 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator public function getContentTypes() { return [ - 'markdown' => new ContentType($this->daux->getParams()), + 'markdown' => new ContentType($this->daux->getConfig()), ]; } @@ -47,9 +47,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator { $destination = $input->getOption('destination'); - $params = $this->daux->getParams(); + $config = $this->daux->getConfig(); if (is_null($destination)) { - $destination = $this->daux->local_base . DIRECTORY_SEPARATOR . 'static'; + $destination = $this->config->getLocalBase() . DIRECTORY_SEPARATOR . 'static'; } $this->runAction( @@ -61,9 +61,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator ); $data = [ - 'author' => $params['author'], - 'title' => $params['title'], - 'subject' => $params['tagline'] + 'author' => $config->getAuthor(), + 'title' => $config->getTitle(), + 'subject' => $config->getTagline() ]; $book = new Book($this->daux->tree, $data); @@ -73,9 +73,9 @@ class Generator implements \Todaymade\Daux\Format\Base\Generator $this->runAction( 'Generating ' . $current->getTitle(), $width, - function () use ($book, $current, $params) { + function () use ($book, $current, $config) { $contentType = $this->daux->getContentTypeHandler()->getType($current); - $content = ContentPage::fromFile($current, $params, $contentType); + $content = ContentPage::fromFile($current, $config, $contentType); $content->templateRenderer = $this->templateRenderer; $content = $content->getContent(); $book->addPage($current, $content); diff --git a/libs/FormatDate.php b/libs/FormatDate.php index 464e812..3b09dd9 100644 --- a/libs/FormatDate.php +++ b/libs/FormatDate.php @@ -4,8 +4,8 @@ use IntlDateFormatter; class FormatDate { - public static function format($params, $date) { - $locale = $params['language']; + public static function format($config, $date) { + $locale = $config->getLanguage(); $datetype = IntlDateFormatter::LONG; $timetype = IntlDateFormatter::SHORT; $timezone = null; diff --git a/libs/Server/ErrorPage.php b/libs/Server/ErrorPage.php index f9084d3..c6c81dd 100644 --- a/libs/Server/ErrorPage.php +++ b/libs/Server/ErrorPage.php @@ -12,17 +12,17 @@ class ErrorPage extends SimplePage /** * @var \Todaymade\Daux\Config */ - private $params; + private $config; /** * @param string $title * @param string $content - * @param \Todaymade\Daux\Config $params + * @param \Todaymade\Daux\Config $config */ - public function __construct($title, $content, $params) + public function __construct($title, $content, $config) { parent::__construct($title, $content); - $this->params = $params; + $this->config = $config; } /** @@ -30,15 +30,15 @@ class ErrorPage extends SimplePage */ protected function generatePage() { - $params = $this->params; + $config = $this->config; $page = [ 'title' => $this->title, 'content' => $this->getPureContent(), 'language' => '', ]; - $template = new Template($params); + $template = new Template($config); - return $template->render('error', ['page' => $page, 'params' => $params]); + return $template->render('error', ['page' => $page, 'config' => $config]); } } diff --git a/libs/Server/Server.php b/libs/Server/Server.php index 3a34ea3..144edda 100755 --- a/libs/Server/Server.php +++ b/libs/Server/Server.php @@ -6,6 +6,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Mime\MimeTypes; use Todaymade\Daux\Daux; +use Todaymade\Daux\ConfigBuilder; use Todaymade\Daux\DauxHelper; use Todaymade\Daux\Exception; use Todaymade\Daux\Format\Base\ComputedRawPage; @@ -16,7 +17,7 @@ use Todaymade\Daux\Format\HTML\RawPage; class Server { private $daux; - private $params; + private $config; private $base_url; /** @@ -34,18 +35,20 @@ class Server $verbosity = getenv('DAUX_VERBOSITY'); $output = new ConsoleOutput($verbosity); - $daux = new Daux(Daux::LIVE_MODE, $output); - $daux->initializeConfiguration(); + $configFile = getenv('DAUX_CONFIG'); + if ($configFile) { + $config = ConfigBuilder::fromFile($configFile); + } else { + $config = ConfigBuilder::withMode(Daux::LIVE_MODE)->build(); + } + + $daux = new Daux($config, $output); $class = $daux->getProcessorClass(); if (!empty($class)) { $daux->setProcessor(new $class($daux, $output, 0)); } - // Set this critical configuration - // for the tree generation - $daux->getParams()['index_key'] = 'index'; - // Improve the tree with a processor $daux->generateTree(); @@ -54,7 +57,7 @@ class Server try { $page = $server->handle(); } catch (NotFoundException $e) { - $page = new ErrorPage('An error occured', $e->getMessage(), $daux->getParams()); + $page = new ErrorPage('An error occured', $e->getMessage(), $daux->getConfig()); } $server->createResponse($page)->prepare($server->request)->send(); @@ -118,20 +121,14 @@ class Server /** * @return \Todaymade\Daux\Config */ - public function getParams() + public function getConfig() { - $params = $this->daux->getParams(); + $config = $this->daux->getConfig(); - DauxHelper::rebaseConfiguration($params, '//' . $this->base_url); - $params['base_page'] = '//' . $this->base_url; - if (!$this->daux->options['live']['clean_urls']) { - $params['base_page'] .= 'index.php/'; - } + DauxHelper::rebaseConfiguration($config, '//' . $this->base_url); - // Text search would be too slow on live server - $params['html']['search'] = false; - return $params; + return $config; } /** @@ -143,7 +140,7 @@ class Server */ public function handle() { - $this->params = $this->getParams(); + $this->config = $this->getConfig(); $request = substr($this->request->getRequestUri(), strlen($this->request->getBaseUrl()) + 1); @@ -167,7 +164,7 @@ class Server */ public function serveTheme($request) { - $file = $this->getParams()->getThemesPath() . $request; + $file = $this->getConfig()->getThemesPath() . $request; if (file_exists($file)) { return new RawPage($file); @@ -199,6 +196,6 @@ class Server ); } - return $this->daux->getGenerator()->generateOne($file, $this->params); + return $this->daux->getGenerator()->generateOne($file, $this->config); } } diff --git a/libs/Tree/Builder.php b/libs/Tree/Builder.php index 82772fd..db76d09 100644 --- a/libs/Tree/Builder.php +++ b/libs/Tree/Builder.php @@ -104,7 +104,7 @@ class Builder $config = $parent->getConfig(); - if (!in_array($file->getExtension(), $config['valid_content_extensions'])) { + if (!in_array($file->getExtension(), $config->getValidContentExtensions())) { $uri = $file->getFilename(); $entry = new Raw($parent, $uri, $file); @@ -122,7 +122,7 @@ class Builder $entry = new Content($parent, $uri, $file); - if ($entry->getUri() == $config['index_key']) { + if ($entry->getUri() == $config->getIndexKey()) { if ($parent instanceof Root) { $entry->setTitle($config->getTitle()); } else { @@ -184,7 +184,7 @@ class Builder $path .= '.md'; } - $raw = !in_array($extension, $parent->getConfig()['valid_content_extensions']); + $raw = !in_array($extension, $parent->getConfig()->getValidContentExtensions()); $title = $uri = $path; if (!$raw) { diff --git a/libs/Tree/Directory.php b/libs/Tree/Directory.php index 86955d1..f3d6b7a 100644 --- a/libs/Tree/Directory.php +++ b/libs/Tree/Directory.php @@ -127,7 +127,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate } public function getLocalIndexPage() { - $index_key = $this->getConfig()['index_key']; + $index_key = $this->getConfig()->getIndexKey(); if (isset($this->children[$index_key])) { return $this->children[$index_key]; @@ -141,8 +141,6 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate */ public function getIndexPage(): ?Content { - $index_key = $this->getConfig()['index_key']; - if ($this->getLocalIndexPage()) { return $this->getLocalIndexPage(); } @@ -161,7 +159,7 @@ class Directory extends Entry implements \ArrayAccess, \IteratorAggregate public function seekFirstPage(): ?Content { if ($this instanceof self) { - $index_key = $this->getConfig()['index_key']; + $index_key = $this->getConfig()->getIndexKey(); if (isset($this->children[$index_key])) { return $this->children[$index_key]; } diff --git a/libs/bootstrap.php b/libs/bootstrap.php index 8e5b669..07734fe 100644 --- a/libs/bootstrap.php +++ b/libs/bootstrap.php @@ -16,6 +16,8 @@ function loadApp() { $loader = loadApp(); +// This will define the path at which to +// find the daux processor extensions if ($loader) { $ext = __DIR__ . '/../daux'; if (is_dir(getcwd() . "/daux")) { diff --git a/templates/content.php b/templates/content.php index c710bec..2949c47 100644 --- a/templates/content.php +++ b/templates/content.php @@ -3,13 +3,13 @@ getHTML()->showPreviousNextLinks()) { ?>