From ae00cfea5e99f4ea8f84be881711ce2800816a66 Mon Sep 17 00:00:00 2001 From: tsf Date: Thu, 4 Sep 2025 21:09:42 +0800 Subject: [PATCH] 222 --- composer.json | 2 +- .../chillerlan/php-qrcode/.github/FUNDING.yml | 1 + .../php-qrcode/.github/workflows/tests.yml | 77 ++ vendor/chillerlan/php-qrcode/.gitignore | 5 + vendor/chillerlan/php-qrcode/.scrutinizer.yml | 5 + vendor/chillerlan/php-qrcode/.travis.yml | 24 + vendor/chillerlan/php-qrcode/LICENSE | 21 + vendor/chillerlan/php-qrcode/README.md | 392 ++++++++++ vendor/chillerlan/php-qrcode/composer.json | 52 ++ .../php-qrcode/examples/MyCustomOutput.php | 36 + .../php-qrcode/examples/QRImageWithLogo.php | 81 ++ .../php-qrcode/examples/QRImageWithText.php | 104 +++ .../php-qrcode/examples/custom_output.php | 38 + .../php-qrcode/examples/example_image.png | Bin 0 -> 2279 bytes .../php-qrcode/examples/example_svg.png | Bin 0 -> 15925 bytes .../chillerlan/php-qrcode/examples/fpdf.php | 47 ++ .../chillerlan/php-qrcode/examples/html.php | 102 +++ .../chillerlan/php-qrcode/examples/image.php | 60 ++ .../php-qrcode/examples/imageWithLogo.php | 45 ++ .../php-qrcode/examples/imageWithText.php | 33 + .../php-qrcode/examples/imagick.php | 59 ++ .../php-qrcode/examples/octocat.png | Bin 0 -> 2468 bytes vendor/chillerlan/php-qrcode/examples/svg.php | 77 ++ .../chillerlan/php-qrcode/examples/text.php | 68 ++ vendor/chillerlan/php-qrcode/phpdoc.xml | 15 + vendor/chillerlan/php-qrcode/phpmd.xml | 34 + vendor/chillerlan/php-qrcode/phpunit.xml | 23 + .../chillerlan/php-qrcode/public/index.html | 163 ++++ .../chillerlan/php-qrcode/public/qrcode.php | 97 +++ .../php-qrcode/src/Data/AlphaNum.php | 65 ++ .../chillerlan/php-qrcode/src/Data/Byte.php | 47 ++ .../chillerlan/php-qrcode/src/Data/Kanji.php | 70 ++ .../php-qrcode/src/Data/MaskPatternTester.php | 203 +++++ .../chillerlan/php-qrcode/src/Data/Number.php | 82 ++ .../src/Data/QRCodeDataException.php | 17 + .../php-qrcode/src/Data/QRDataAbstract.php | 351 +++++++++ .../php-qrcode/src/Data/QRDataInterface.php | 187 +++++ .../php-qrcode/src/Data/QRMatrix.php | 733 ++++++++++++++++++ .../php-qrcode/src/Helpers/BitBuffer.php | 75 ++ .../php-qrcode/src/Helpers/Polynomial.php | 184 +++++ .../src/Output/QRCodeOutputException.php | 17 + .../php-qrcode/src/Output/QRFpdf.php | 112 +++ .../php-qrcode/src/Output/QRImage.php | 208 +++++ .../php-qrcode/src/Output/QRImagick.php | 123 +++ .../php-qrcode/src/Output/QRMarkup.php | 151 ++++ .../src/Output/QROutputAbstract.php | 130 ++++ .../src/Output/QROutputInterface.php | 55 ++ .../php-qrcode/src/Output/QRString.php | 76 ++ vendor/chillerlan/php-qrcode/src/QRCode.php | 310 ++++++++ .../php-qrcode/src/QRCodeException.php | 15 + .../chillerlan/php-qrcode/src/QROptions.php | 61 ++ .../php-qrcode/src/QROptionsTrait.php | 408 ++++++++++ .../php-qrcode/tests/Data/AlphaNumTest.php | 44 ++ .../php-qrcode/tests/Data/ByteTest.php | 38 + .../tests/Data/DatainterfaceTestAbstract.php | 65 ++ .../php-qrcode/tests/Data/KanjiTest.php | 50 ++ .../tests/Data/MaskPatternTesterTest.php | 29 + .../php-qrcode/tests/Data/NumberTest.php | 44 ++ .../php-qrcode/tests/Data/QRMatrixTest.php | 260 +++++++ .../tests/Helpers/BitBufferTest.php | 53 ++ .../tests/Helpers/PolynomialTest.php | 42 + .../php-qrcode/tests/Output/QRFpdfTest.php | 83 ++ .../php-qrcode/tests/Output/QRImageTest.php | 77 ++ .../php-qrcode/tests/Output/QRImagickTest.php | 66 ++ .../php-qrcode/tests/Output/QRMarkupTest.php | 79 ++ .../tests/Output/QROutputTestAbstract.php | 71 ++ .../php-qrcode/tests/Output/QRStringTest.php | 56 ++ .../php-qrcode/tests/QRCodeTest.php | 140 ++++ .../php-qrcode/tests/QROptionsTest.php | 80 ++ .../php-qrcode/tests/QRTestAbstract.php | 72 ++ .../.github/workflows/ci.yml | 51 ++ .../php-settings-container/.gitignore | 4 + .../chillerlan/php-settings-container/LICENSE | 21 + .../php-settings-container/README.md | 162 ++++ .../php-settings-container/composer.json | 40 + .../examples/advanced.php | 46 ++ .../examples/simple.php | 30 + .../php-settings-container/phpmd.xml | 35 + .../php-settings-container/phpunit.xml | 22 + .../src/SettingsContainerAbstract.php | 173 +++++ .../src/SettingsContainerInterface.php | 104 +++ .../tests/ContainerTest.php | 105 +++ .../tests/TestContainer.php | 29 + .../tests/TestOptionsTrait.php | 42 + vendor/composer/autoload_psr4.php | 2 + vendor/composer/autoload_static.php | 10 + vendor/composer/installed.json | 146 ++++ vendor/composer/installed.php | 22 +- 88 files changed, 7731 insertions(+), 3 deletions(-) create mode 100644 vendor/chillerlan/php-qrcode/.github/FUNDING.yml create mode 100644 vendor/chillerlan/php-qrcode/.github/workflows/tests.yml create mode 100644 vendor/chillerlan/php-qrcode/.gitignore create mode 100644 vendor/chillerlan/php-qrcode/.scrutinizer.yml create mode 100644 vendor/chillerlan/php-qrcode/.travis.yml create mode 100644 vendor/chillerlan/php-qrcode/LICENSE create mode 100644 vendor/chillerlan/php-qrcode/README.md create mode 100644 vendor/chillerlan/php-qrcode/composer.json create mode 100644 vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php create mode 100644 vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php create mode 100644 vendor/chillerlan/php-qrcode/examples/QRImageWithText.php create mode 100644 vendor/chillerlan/php-qrcode/examples/custom_output.php create mode 100644 vendor/chillerlan/php-qrcode/examples/example_image.png create mode 100644 vendor/chillerlan/php-qrcode/examples/example_svg.png create mode 100644 vendor/chillerlan/php-qrcode/examples/fpdf.php create mode 100644 vendor/chillerlan/php-qrcode/examples/html.php create mode 100644 vendor/chillerlan/php-qrcode/examples/image.php create mode 100644 vendor/chillerlan/php-qrcode/examples/imageWithLogo.php create mode 100644 vendor/chillerlan/php-qrcode/examples/imageWithText.php create mode 100644 vendor/chillerlan/php-qrcode/examples/imagick.php create mode 100644 vendor/chillerlan/php-qrcode/examples/octocat.png create mode 100644 vendor/chillerlan/php-qrcode/examples/svg.php create mode 100644 vendor/chillerlan/php-qrcode/examples/text.php create mode 100644 vendor/chillerlan/php-qrcode/phpdoc.xml create mode 100644 vendor/chillerlan/php-qrcode/phpmd.xml create mode 100644 vendor/chillerlan/php-qrcode/phpunit.xml create mode 100644 vendor/chillerlan/php-qrcode/public/index.html create mode 100644 vendor/chillerlan/php-qrcode/public/qrcode.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/Byte.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/Kanji.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/Number.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/QRCodeDataException.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php create mode 100644 vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php create mode 100644 vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php create mode 100644 vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRCodeOutputException.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRImage.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRImagick.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php create mode 100644 vendor/chillerlan/php-qrcode/src/Output/QRString.php create mode 100644 vendor/chillerlan/php-qrcode/src/QRCode.php create mode 100644 vendor/chillerlan/php-qrcode/src/QRCodeException.php create mode 100644 vendor/chillerlan/php-qrcode/src/QROptions.php create mode 100644 vendor/chillerlan/php-qrcode/src/QROptionsTrait.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php create mode 100644 vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/QRCodeTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/QROptionsTest.php create mode 100644 vendor/chillerlan/php-qrcode/tests/QRTestAbstract.php create mode 100644 vendor/chillerlan/php-settings-container/.github/workflows/ci.yml create mode 100644 vendor/chillerlan/php-settings-container/.gitignore create mode 100644 vendor/chillerlan/php-settings-container/LICENSE create mode 100644 vendor/chillerlan/php-settings-container/README.md create mode 100644 vendor/chillerlan/php-settings-container/composer.json create mode 100644 vendor/chillerlan/php-settings-container/examples/advanced.php create mode 100644 vendor/chillerlan/php-settings-container/examples/simple.php create mode 100644 vendor/chillerlan/php-settings-container/phpmd.xml create mode 100644 vendor/chillerlan/php-settings-container/phpunit.xml create mode 100644 vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php create mode 100644 vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php create mode 100644 vendor/chillerlan/php-settings-container/tests/ContainerTest.php create mode 100644 vendor/chillerlan/php-settings-container/tests/TestContainer.php create mode 100644 vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php diff --git a/composer.json b/composer.json index 5369857..b793d2d 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "alibabacloud/client": "^1.5", "picqer/php-barcode-generator": "^2.4", "endroid/qr-code": "^4.3", - "bacon/bacon-qr-code": "^2.0" + "chillerlan/php-qrcode": "^3.4" }, "autoload": { "psr-4": { diff --git a/vendor/chillerlan/php-qrcode/.github/FUNDING.yml b/vendor/chillerlan/php-qrcode/.github/FUNDING.yml new file mode 100644 index 0000000..fc89a67 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: codemasher diff --git a/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml b/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml new file mode 100644 index 0000000..991e650 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml @@ -0,0 +1,77 @@ +# https://help.github.com/en/categories/automating-your-workflow-with-github-actions +# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml + +on: + - pull_request + - push + +name: "Continuous Integration" + +jobs: + + static-code-analysis: + name: "Static Code Analysis" + + runs-on: ubuntu-latest + + env: + PHAN_ALLOW_XDEBUG: 0 + PHAN_DISABLE_XDEBUG_WARN: 1 + + steps: + - name: "Checkout" + uses: actions/checkout@v2 + + - name: "Install PHP" + uses: shivammathur/setup-php@v2 + with: + php-version: "7.4" + coverage: none + tools: pecl + extensions: ast, gd, imagick, json, mbstring + + - name: "Update dependencies with composer" + run: composer update --no-interaction --no-ansi --no-progress --no-suggest + + - name: "Run phan" + run: php vendor/bin/phan + + tests: + name: "Unit Tests" + + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest +# - windows-latest + php-version: + - "7.2" + - "7.3" + - "7.4" + - "8.0" + + steps: + - name: "Checkout" + uses: actions/checkout@v2 + + - name: "Install PHP with extensions" + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + coverage: pcov + tools: pecl + extensions: gd, imagick, json, mbstring + + - name: "Install dependencies with composer" + run: composer update --no-ansi --no-interaction --no-progress --no-suggest + + - name: "Run tests with phpunit" + run: php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml + + - name: "Send code coverage report to Codecov.io" + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/vendor/chillerlan/php-qrcode/.gitignore b/vendor/chillerlan/php-qrcode/.gitignore new file mode 100644 index 0000000..ecebb99 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/.gitignore @@ -0,0 +1,5 @@ +.build/* +.idea/* +vendor/* +composer.lock +*.phpunit.result.cache diff --git a/vendor/chillerlan/php-qrcode/.scrutinizer.yml b/vendor/chillerlan/php-qrcode/.scrutinizer.yml new file mode 100644 index 0000000..7fdd2a4 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/.scrutinizer.yml @@ -0,0 +1,5 @@ +filter: + excluded_paths: + - examples/* + - tests/* + - vendor/* diff --git a/vendor/chillerlan/php-qrcode/.travis.yml b/vendor/chillerlan/php-qrcode/.travis.yml new file mode 100644 index 0000000..7b2377f --- /dev/null +++ b/vendor/chillerlan/php-qrcode/.travis.yml @@ -0,0 +1,24 @@ +branches: + only: + - main + - v3.2.x + +addons: + apt: + packages: + - imagemagick + +language: php + +matrix: + include: + - php: 7.2 + - php: 7.3 + - php: 7.4 + +before_install: + - pecl channel-update pecl.php.net + - printf "\n" | pecl install imagick +install: travis_retry composer install --no-interaction --prefer-source +script: vendor/bin/phpunit --configuration phpunit.xml --coverage-clover clover.xml +after_script: bash <(curl -s https://codecov.io/bash) diff --git a/vendor/chillerlan/php-qrcode/LICENSE b/vendor/chillerlan/php-qrcode/LICENSE new file mode 100644 index 0000000..dac8528 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Smiley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/chillerlan/php-qrcode/README.md b/vendor/chillerlan/php-qrcode/README.md new file mode 100644 index 0000000..075b2a3 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/README.md @@ -0,0 +1,392 @@ +# chillerlan/php-qrcode + +A PHP7.2+ QR Code library based on the [implementation](https://github.com/kazuhikoarase/qrcode-generator) by [Kazuhiko Arase](https://github.com/kazuhikoarase), +namespaced, cleaned up, improved and other stuff. + +[![Packagist version][packagist-badge]][packagist] +[![License][license-badge]][license] +[![Travis CI][travis-badge]][travis] +[![CodeCov][coverage-badge]][coverage] +[![Scrunitizer CI][scrutinizer-badge]][scrutinizer] +[![Packagist downloads][downloads-badge]][downloads] +[![PayPal donate][donate-badge]][donate] + +[![Continuous Integration][gh-action-badge]][gh-action] + +[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-qrcode.svg?style=flat-square +[packagist]: https://packagist.org/packages/chillerlan/php-qrcode +[license-badge]: https://img.shields.io/github/license/chillerlan/php-qrcode.svg?style=flat-square +[license]: https://github.com/chillerlan/php-qrcode/blob/main/LICENSE +[travis-badge]: https://img.shields.io/travis/chillerlan/php-qrcode.svg?style=flat-square +[travis]: https://travis-ci.org/chillerlan/php-qrcode +[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-qrcode.svg?style=flat-square +[coverage]: https://codecov.io/github/chillerlan/php-qrcode +[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-qrcode.svg?style=flat-square +[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-qrcode +[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-qrcode.svg?style=flat-square +[downloads]: https://packagist.org/packages/chillerlan/php-qrcode/stats +[donate-badge]: https://img.shields.io/badge/donate-paypal-ff33aa.svg?style=flat-square +[donate]: https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4 +[gh-action-badge]: https://github.com/chillerlan/php-qrcode/workflows/Continuous%20Integration/badge.svg +[gh-action]: https://github.com/chillerlan/php-qrcode/actions + +## Documentation + +### Requirements +- PHP 7.2+ + - `ext-mbstring` + - optional: + - `ext-json`, `ext-gd` + - `ext-imagick` with [ImageMagick](https://imagemagick.org) installed + - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module + +### Installation +**requires [composer](https://getcomposer.org)** + +via terminal: `composer require chillerlan/php-qrcode` + +*composer.json* (note: replace `dev-master` with a [version boundary](https://getcomposer.org/doc/articles/versions.md), e.g. `^3.2`) +```json +{ + "require": { + "php": "^7.2", + "chillerlan/php-qrcode": "^3.4" + } +} +``` + +### Usage +We want to encode this URI for a mobile authenticator into a QRcode image: +```php +$data = 'otpauth://totp/test?secret=B3JX4VCVJDVNXNZ5&issuer=chillerlan.net'; + +//quick and simple: +echo 'QR Code'; +``` + +

+ QR codes are awesome! + QR codes are awesome! +

+ +Wait, what was that? Please again, slower! + +### Advanced usage + +Ok, step by step. First you'll need a `QRCode` instance, which can be optionally invoked with a `QROptions` (or a [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php), respectively) object as the only parameter. + +```php +$options = new QROptions([ + 'version' => 5, + 'outputType' => QRCode::OUTPUT_MARKUP_SVG, + 'eccLevel' => QRCode::ECC_L, +]); + +// invoke a fresh QRCode instance +$qrcode = new QRCode($options); + +// and dump the output +$qrcode->render($data); + +// ...with additional cache file +$qrcode->render($data, '/path/to/file.svg'); +``` + +In case you just want the raw QR code matrix, call `QRCode::getMatrix()` - this method is also called internally from `QRCode::render()`. See also [Custom output modules](#custom-qroutputinterface). + +```php +$matrix = $qrcode->getMatrix($data); + +foreach($matrix->matrix() as $y => $row){ + foreach($row as $x => $module){ + + // get a module's value + $value = $module; + $value = $matrix->get($x, $y); + + // boolean check a module + if($matrix->check($x, $y)){ // if($module >> 8 > 0) + // do stuff, the module is dark + } + else{ + // do other stuff, the module is light + } + + } +} +``` + +Have a look [in this folder](https://github.com/chillerlan/php-qrcode/tree/master/examples) for some more usage examples. + +#### Custom module values +Previous versions of `QRCode` held only boolean matrix values that only allowed to determine whether a module was dark or not. Now you can distinguish between different parts of the matrix, namely the several required patterns from the QR Code specification, and use them in different ways. + +The dark value is the module (light) value shifted by 8 bits to the left: `$value = $M_TYPE << ($bool ? 8 : 0);`, where `$M_TYPE` is one of the `QRMatrix::M_*` constants. +You can check the value for a type explicitly like... +```php +// for true (dark) +$value >> 8 === $M_TYPE; + +//for false (light) +$value === $M_TYPE; +``` +...or you can perform a loose check, ignoring the module value +```php +// for true +$value >> 8 > 0; + +// for false +$value >> 8 === 0 +``` + +See also `QRMatrix::set()`, `QRMatrix::check()` and [`QRMatrix` constants](#qrmatrix-constants). + +To map the values and properly render the modules for the given `QROutputInterface`, it's necessary to overwrite the default values: +```php +$options = new QROptions; + +// for HTML, SVG and ImageMagick +$options->moduleValues = [ + // finder + 1536 => '#A71111', // dark (true) + 6 => '#FFBFBF', // light (false) + // alignment + 2560 => '#A70364', + 10 => '#FFC9C9', + // timing + 3072 => '#98005D', + 12 => '#FFB8E9', + // format + 3584 => '#003804', + 14 => '#00FB12', + // version + 4096 => '#650098', + 16 => '#E0B8FF', + // data + 1024 => '#4A6000', + 4 => '#ECF9BE', + // darkmodule + 512 => '#080063', + // separator + 8 => '#AFBFBF', + // quietzone + 18 => '#FFFFFF', +]; + +// for the image output types +$options->moduleValues = [ + 512 => [0, 0, 0], + // ... +]; + +// for string/text output +$options->moduleValues = [ + 512 => '#', + // ... +]; +``` + +#### Custom `QROutputInterface` +Instead of bloating your code you can simply create your own output interface by extending `QROutputAbstract`. Have a look at the [built-in output modules](https://github.com/chillerlan/php-qrcode/tree/master/src/Output). + +```php +class MyCustomOutput extends QROutputAbstract{ + + // inherited from QROutputAbstract + protected $matrix; // QRMatrix + protected $moduleCount; // modules QRMatrix::size() + protected $options; // MyCustomOptions or QROptions + protected $scale; // scale factor from options + protected $length; // length of the matrix ($moduleCount * $scale) + + // ...check/set default module values (abstract method, called by the constructor) + protected function setModuleValues():void{ + // $this->moduleValues = ... + } + + // QROutputInterface::dump() + public function dump(string $file = null):string{ + $output = ''; + + for($row = 0; $row < $this->moduleCount; $row++){ + for($col = 0; $col < $this->moduleCount; $col++){ + $output .= (int)$this->matrix->check($col, $row); + } + } + + return $output; + } + +} +``` + +In case you need additional settings for your output module, just extend `QROptions`... +``` +class MyCustomOptions extends QROptions{ + protected $myParam = 'defaultValue'; + + // ... +} +``` +...or use the [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php), which is the more flexible approach. + +```php +trait MyCustomOptionsTrait{ + protected $myParam = 'defaultValue'; + + // ... +} +``` +set the options: +```php +$myOptions = [ + 'version' => 5, + 'eccLevel' => QRCode::ECC_L, + 'outputType' => QRCode::OUTPUT_CUSTOM, + 'outputInterface' => MyCustomOutput::class, + // your custom settings + 'myParam' => 'whatever value', + ]; + +// extends QROptions +$myCustomOptions = new MyCustomOptions($myOptions); + +// using the SettingsContainerInterface +$myCustomOptions = new class($myOptions) extends SettingsContainerAbstract{ + use QROptionsTrait, MyCustomOptionsTrait; +}; + +``` + +You can then call `QRCode` with the custom modules... +```php +(new QRCode($myCustomOptions))->render($data); +``` +...or invoke the `QROutputInterface` manually. +```php +$qrOutputInterface = new MyCustomOutput($myCustomOptions, (new QRCode($myCustomOptions))->getMatrix($data)); + +//dump the output, which is equivalent to QRCode::render() +$qrOutputInterface->dump(); +``` + +### API + +#### `QRCode` methods +method | return | description +------ | ------ | ----------- +`__construct(QROptions $options = null)` | - | see [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php) +`render(string $data, string $file = null)` | mixed, `QROutputInterface::dump()` | renders a QR Code for the given `$data` and `QROptions`, saves `$file` optional +`getMatrix(string $data)` | `QRMatrix` | returns a `QRMatrix` object for the given `$data` and current `QROptions` +`initDataInterface(string $data)` | `QRDataInterface` | returns a fresh `QRDataInterface` for the given `$data` +`isNumber(string $string)` | bool | checks if a string qualifies for `Number` +`isAlphaNum(string $string)` | bool | checks if a string qualifies for `AlphaNum` +`isKanji(string $string)` | bool | checks if a string qualifies for `Kanji` + +#### `QRCode` constants +name | description +---- | ----------- +`VERSION_AUTO` | `QROptions::$version` +`MASK_PATTERN_AUTO` | `QROptions::$maskPattern` +`OUTPUT_MARKUP_SVG`, `OUTPUT_MARKUP_HTML` | `QROptions::$outputType` markup +`OUTPUT_IMAGE_PNG`, `OUTPUT_IMAGE_JPG`, `OUTPUT_IMAGE_GIF` | `QROptions::$outputType` image +`OUTPUT_STRING_JSON`, `OUTPUT_STRING_TEXT` | `QROptions::$outputType` string +`OUTPUT_IMAGICK` | `QROptions::$outputType` ImageMagick +`OUTPUT_FPDF` | `QROptions::$outputType` PDF, using [FPDF](https://github.com/setasign/fpdf) +`OUTPUT_CUSTOM` | `QROptions::$outputType`, requires `QROptions::$outputInterface` +`ECC_L`, `ECC_M`, `ECC_Q`, `ECC_H`, | ECC-Level: 7%, 15%, 25%, 30% in `QROptions::$eccLevel` +`DATA_NUMBER`, `DATA_ALPHANUM`, `DATA_BYTE`, `DATA_KANJI` | `QRDataInterface::$datamode` + +#### `QROptions` properties +property | type | default | allowed | description +-------- | ---- | ------- | ------- | ----------- +`$version` | int | `QRCode::VERSION_AUTO` | 1...40 | the [QR Code version number](http://www.qrcode.com/en/about/version.html) +`$versionMin` | int | 1 | 1...40 | Minimum QR version (if `$version = QRCode::VERSION_AUTO`) +`$versionMax` | int | 40 | 1...40 | Maximum QR version (if `$version = QRCode::VERSION_AUTO`) +`$eccLevel` | int | `QRCode::ECC_L` | `QRCode::ECC_X` | Error correct level, where X = L (7%), M (15%), Q (25%), H (30%) +`$maskPattern` | int | `QRCode::MASK_PATTERN_AUTO` | 0...7 | Mask Pattern to use +`$addQuietzone` | bool | `true` | - | Add a "quiet zone" (margin) according to the QR code spec +`$quietzoneSize` | int | 4 | clamped to 0 ... `$matrixSize / 2` | Size of the quiet zone +`$dataMode` | string | `null` | `Number`, `AlphaNum`, `Kanji`, `Byte` | allows overriding the data type detection +`$outputType` | string | `QRCode::OUTPUT_IMAGE_PNG` | `QRCode::OUTPUT_*` | built-in output type +`$outputInterface` | string | `null` | * | FQCN of the custom `QROutputInterface` if `QROptions::$outputType` is set to `QRCode::OUTPUT_CUSTOM` +`$cachefile` | string | `null` | * | optional cache file path +`$eol` | string | `PHP_EOL` | * | newline string (HTML, SVG, TEXT) +`$scale` | int | 5 | * | size of a QR code pixel (SVG, IMAGE_*), HTML -> via CSS +`$cssClass` | string | `null` | * | a common css class +`$svgOpacity` | float | 1.0 | 0...1 | +`$svgDefs` | string | * | * | anything between [``](https://developer.mozilla.org/docs/Web/SVG/Element/defs) +`$svgViewBoxSize` | int | `null` | * | a positive integer which defines width/height of the [viewBox attribute](https://css-tricks.com/scale-svg/#article-header-id-3) +`$textDark` | string | '🔴' | * | string substitute for dark +`$textLight` | string | '⭕' | * | string substitute for light +`$markupDark` | string | '#000' | * | markup substitute for dark (CSS value) +`$markupLight` | string | '#fff' | * | markup substitute for light (CSS value) +`$imageBase64` | bool | `true` | - | whether to return the image data as base64 or raw like from `file_get_contents()` +`$imageTransparent` | bool | `true` | - | toggle transparency (no jpeg support) +`$imageTransparencyBG` | array | `[255, 255, 255]` | `[R, G, B]` | the RGB values for the transparent color, see [`imagecolortransparent()`](http://php.net/manual/function.imagecolortransparent.php) +`$pngCompression` | int | -1 | -1 ... 9 | `imagepng()` compression level, -1 = auto +`$jpegQuality` | int | 85 | 0 - 100 | `imagejpeg()` quality +`$imagickFormat` | string | 'png' | * | ImageMagick output type, see `Imagick::setType()` +`$imagickBG` | string | `null` | * | ImageMagick background color, see `ImagickPixel::__construct()` +`$moduleValues` | array | `null` | * | Module values map, see [Custom output modules](#custom-qroutputinterface) and `QROutputInterface::DEFAULT_MODULE_VALUES` + +#### `QRMatrix` methods +method | return | description +------ | ------ | ----------- +`__construct(int $version, int $eclevel)` | - | - +`matrix()` | array | the internal matrix representation as a 2 dimensional array +`version()` | int | the current QR Code version +`eccLevel()` | int | current ECC level +`maskPattern()` | int | the used mask pattern +`size()` | int | the absoulute size of the matrix, including quiet zone (if set). `$version * 4 + 17 + 2 * $quietzone` +`get(int $x, int $y)` | int | returns the value of the module +`set(int $x, int $y, bool $value, int $M_TYPE)` | `QRMatrix` | sets the `$M_TYPE` value for the module +`check(int $x, int $y)` | bool | checks whether a module is true (dark) or false (light) +`setLogoSpace(int $width, int $height, int $startX = null, int $startY = null)` | `QRMatrix` | creates a logo space in the matrix + +#### `QRMatrix` constants +name | light (false) | dark (true) | description +---- | ------------- | ----------- | ----------- +`M_NULL` | 0 | - | module not set (should never appear. if so, there's an error) +`M_DARKMODULE` | - | 512 | once per matrix at `$xy = [8, 4 * $version + 9]` +`M_DATA` | 4 | 1024 | the actual encoded data +`M_FINDER` | 6 | 1536 | the 7x7 finder patterns +`M_SEPARATOR` | 8 | - | separator lines around the finder patterns +`M_ALIGNMENT` | 10 | 2560 | the 5x5 alignment patterns +`M_TIMING` | 12 | 3072 | the timing pattern lines +`M_FORMAT` | 14 | 3584 | format information pattern +`M_VERSION` | 16 | 4096 | version information pattern +`M_QUIETZONE` | 18 | - | margin around the QR Code +`M_LOGO` | 20 | - | space for a logo image (not used yet) +`M_TEST` | 255 | 65280 | test value + + +### Notes +The QR encoder, especially the subroutines for mask pattern testing, can cause high CPU load on increased matrix size. +You can avoid a part of this load by choosing a fast output module, like `OUTPUT_IMAGE_*` and setting the mask pattern manually (which may result in unreadable QR Codes). +Oh hey and don't forget to sanitize any user input! + +### Disclaimer! +I don't take responsibility for molten CPUs, misled applications, failed log-ins etc.. Use at your own risk! + +#### Trademark Notice + +The word "QR Code" is registered trademark of *DENSO WAVE INCORPORATED*
+http://www.denso-wave.com/qrcode/faqpatent-e.html + +### Framework Integration +- Drupal [Google Authenticator Login `ga_login`](https://www.drupal.org/project/ga_login) +- WordPress [`wp-two-factor-auth`](https://github.com/sjinks/wp-two-factor-auth) +- WordPress [Simple 2FA `simple-2fa`](https://wordpress.org/plugins/simple-2fa/) +- WoltLab Suite [two-step-verification](http://pluginstore.woltlab.com/file/3007-two-step-verification/) +- [Cachet](https://github.com/CachetHQ/Cachet) +- [Appwrite](https://github.com/appwrite/appwrite) +- other uses: [dependents](https://github.com/chillerlan/php-qrcode/network/dependents) / [packages](https://github.com/chillerlan/php-qrcode/network/dependents?dependent_type=PACKAGE) + + +Hi, please check out my other projects that are way cooler than qrcodes! + +- [php-oauth-core](https://github.com/chillerlan/php-oauth-core) - an OAuth 1/2 client library along with a bunch of [providers](https://github.com/chillerlan/php-oauth-providers) +- [php-httpinterface](https://github.com/chillerlan/php-httpinterface) - a PSR-7/15/17/18 implemetation +- [php-database](https://github.com/chillerlan/php-database) - a database client & querybuilder for MySQL, Postgres, SQLite, MSSQL, Firebird + diff --git a/vendor/chillerlan/php-qrcode/composer.json b/vendor/chillerlan/php-qrcode/composer.json new file mode 100644 index 0000000..625149c --- /dev/null +++ b/vendor/chillerlan/php-qrcode/composer.json @@ -0,0 +1,52 @@ +{ + "name": "chillerlan/php-qrcode", + "description": "A QR code generator. PHP 7.2+", + "homepage": "https://github.com/chillerlan/php-qrcode", + "license": "MIT", + "minimum-stability": "stable", + "type": "library", + "keywords": [ + "QR code", "qrcode", "qr", "qrcode-generator", "phpqrcode" + ], + "authors": [ + { + "name": "Kazuhiko Arase", + "homepage": "https://github.com/kazuhikoarase" + }, + { + "name": "Smiley", + "email": "smiley@chillerlan.net", + "homepage": "https://github.com/codemasher" + }, + { + "name": "Contributors", + "homepage":"https://github.com/chillerlan/php-qrcode/graphs/contributors" + } + ], + "require": { + "php": "^7.2 || ^8.0", + "ext-mbstring": "*", + "chillerlan/php-settings-container": "^1.2.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5", + "phan/phan": "^3.2.2", + "setasign/fpdf": "^1.8.2" + }, + "suggest": { + "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", + "setasign/fpdf": "Required to use the QR FPDF output." + }, + "autoload": { + "psr-4": { + "chillerlan\\QRCode\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "chillerlan\\QRCodePublic\\": "public/", + "chillerlan\\QRCodeTest\\": "tests/", + "chillerlan\\QRCodeExamples\\": "examples/" + } + } +} diff --git a/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php b/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php new file mode 100644 index 0000000..3c01f86 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php @@ -0,0 +1,36 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\Output\QROutputAbstract; + +class MyCustomOutput extends QROutputAbstract{ + + protected function setModuleValues():void{ + // TODO: Implement setModuleValues() method. + } + + public function dump(string $file = null){ + + $output = ''; + + for($row = 0; $row < $this->moduleCount; $row++){ + for($col = 0; $col < $this->moduleCount; $col++){ + $output .= (int)$this->matrix->check($col, $row); + } + } + + return $output; + } + +} diff --git a/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php b/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php new file mode 100644 index 0000000..76aa5ce --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/QRImageWithLogo.php @@ -0,0 +1,81 @@ + + * @copyright 2020 smiley + * @license MIT + * + * @noinspection PhpComposerExtensionStubsInspection + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\Output\{QRCodeOutputException, QRImage}; + +use function imagecopyresampled, imagecreatefrompng, imagesx, imagesy, is_file, is_readable; + +/** + * @property \chillerlan\QRCodeExamples\LogoOptions $options + */ +class QRImageWithLogo extends QRImage{ + + /** + * @param string|null $file + * @param string|null $logo + * + * @return string + * @throws \chillerlan\QRCode\Output\QRCodeOutputException + */ + public function dump(string $file = null, string $logo = null):string{ + // set returnResource to true to skip further processing for now + $this->options->returnResource = true; + + // of course you could accept other formats too (such as resource or Imagick) + // i'm not checking for the file type either for simplicity reasons (assuming PNG) + if(!is_file($logo) || !is_readable($logo)){ + throw new QRCodeOutputException('invalid logo'); + } + + $this->matrix->setLogoSpace( + $this->options->logoSpaceWidth, + $this->options->logoSpaceHeight + // not utilizing the position here + ); + + // there's no need to save the result of dump() into $this->image here + parent::dump($file); + + $im = imagecreatefrompng($logo); + + // get logo image size + $w = imagesx($im); + $h = imagesy($im); + + // set new logo size, leave a border of 1 module (no proportional resize/centering) + $lw = ($this->options->logoSpaceWidth - 2) * $this->options->scale; + $lh = ($this->options->logoSpaceHeight - 2) * $this->options->scale; + + // get the qrcode size + $ql = $this->matrix->size() * $this->options->scale; + + // scale the logo and copy it over. done! + imagecopyresampled($this->image, $im, ($ql - $lw) / 2, ($ql - $lh) / 2, 0, 0, $lw, $lh, $w, $h); + + $imageData = $this->dumpImage(); + + if($file !== null){ + $this->saveToFile($imageData, $file); + } + + if($this->options->imageBase64){ + $imageData = 'data:image/'.$this->options->outputType.';base64,'.base64_encode($imageData); + } + + return $imageData; + } + +} diff --git a/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php b/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php new file mode 100644 index 0000000..5ca572f --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php @@ -0,0 +1,104 @@ + + * @copyright 2019 smiley + * @license MIT + * + * @noinspection PhpComposerExtensionStubsInspection + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\Output\QRImage; +use function base64_encode, imagechar, imagecolorallocate, imagecolortransparent, imagecopymerge, imagecreatetruecolor, + imagedestroy, imagefilledrectangle, imagefontwidth, in_array, round, str_split, strlen; + +class QRImageWithText extends QRImage{ + + /** + * @param string|null $file + * @param string|null $text + * + * @return string + */ + public function dump(string $file = null, string $text = null):string{ + $this->image = imagecreatetruecolor($this->length, $this->length); + $background = imagecolorallocate($this->image, ...$this->options->imageTransparencyBG); + + if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){ + imagecolortransparent($this->image, $background); + } + + imagefilledrectangle($this->image, 0, 0, $this->length, $this->length, $background); + + foreach($this->matrix->matrix() as $y => $row){ + foreach($row as $x => $M_TYPE){ + $this->setPixel($x, $y, $this->moduleValues[$M_TYPE]); + } + } + + // render text output if a string is given + if($text !== null){ + $this->addText($text); + } + + $imageData = $this->dumpImage($file); + + if((bool)$this->options->imageBase64){ + $imageData = 'data:image/'.$this->options->outputType.';base64,'.base64_encode($imageData); + } + + return $imageData; + } + + /** + * @param string $text + */ + protected function addText(string $text):void{ + // save the qrcode image + $qrcode = $this->image; + + // options things + $textSize = 3; // see imagefontheight() and imagefontwidth() + $textBG = [200, 200, 200]; + $textColor = [50, 50, 50]; + + $bgWidth = $this->length; + $bgHeight = $bgWidth + 20; // 20px extra space + + // create a new image with additional space + $this->image = imagecreatetruecolor($bgWidth, $bgHeight); + $background = imagecolorallocate($this->image, ...$textBG); + + // allow transparency + if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){ + imagecolortransparent($this->image, $background); + } + + // fill the background + imagefilledrectangle($this->image, 0, 0, $bgWidth, $bgHeight, $background); + + // copy over the qrcode + imagecopymerge($this->image, $qrcode, 0, 0, 0, 0, $this->length, $this->length, 100); + imagedestroy($qrcode); + + $fontColor = imagecolorallocate($this->image, ...$textColor); + $w = imagefontwidth($textSize); + $x = round(($bgWidth - strlen($text) * $w) / 2); + + // loop through the string and draw the letters + foreach(str_split($text) as $i => $chr){ + imagechar($this->image, $textSize, $i * $w + $x, $this->length, $chr, $fontColor); + } + } + +} diff --git a/vendor/chillerlan/php-qrcode/examples/custom_output.php b/vendor/chillerlan/php-qrcode/examples/custom_output.php new file mode 100644 index 0000000..71ea626 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/custom_output.php @@ -0,0 +1,38 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +// invoke the QROutputInterface manually +$options = new QROptions([ + 'version' => 5, + 'eccLevel' => QRCode::ECC_L, +]); + +$qrOutputInterface = new MyCustomOutput($options, (new QRCode($options))->getMatrix($data)); + +var_dump($qrOutputInterface->dump()); + + +// or just +$options = new QROptions([ + 'version' => 5, + 'eccLevel' => QRCode::ECC_L, + 'outputType' => QRCode::OUTPUT_CUSTOM, + 'outputInterface' => MyCustomOutput::class, +]); + +var_dump((new QRCode($options))->render($data)); diff --git a/vendor/chillerlan/php-qrcode/examples/example_image.png b/vendor/chillerlan/php-qrcode/examples/example_image.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a80f2abf882bcff5bef9257cb8d4dcfabb8920 GIT binary patch literal 2279 zcma);do>b;la-946>ckNI4Szfj|=cD66=9f?4Mb{$B z%zK!#NmvlbvG3)uD)(}9wJa`)2tS^HuU?TR-*yY!YZI&OG1A}1TW_x(M1itWZSN%t zHHx2oF4~{^9_q{A@Jiq;T|FM|8^P)3a*2C5Ypp0Gi0wIf?OeboWe!g+S^NHfpT@>E zjaXjWgnw@0l~izxH%uz9S-C7RquKNP zzVjJo4bWK2k%~#V6IgI-)7zcp=M7sFH$c024Z1Prc00S^M!qZvp`o^oWWJ7%ZZ&y{ zYhVmL3iH-3_}X^TRf*lAu0QK_Qsl&7g;)?9q$>C~pFj zCuSdnYo4m0rkfQN+ljo|$OBX3yZvG%{St)Epb(fjcLkJx-Sw=$ovmutd<68gIs*aX}aNe&!S@@B?OS1W+<7e;J7bSecU&WGzs_|61of* zFpb2@Qe!Z3sdLgZ!qv=S6J)moG127q^`hd! zw#R=GPO~ccu<<8>{N!wr4Jp>-Vm<13T&+{Hd#Q@r)JcGOfNGIX{qRK?Qvi%vc*LRglg@4N;~dbYA%J8~b^ zQs;kjBMIB^v}k$^ug;Yvk3XWgdJtE>vH@l)v<@N0VfN5ZR}wN;)hx%w1LkP|snicUV$}WjfH#X&d8h0&F2MAJ$>L*py^^hH7d~;V$nSVgNMrpx>Fn zm%?IJ>z@u#c%H|Y;hQtk>sVfv6Ms2x)rY^UU@Wi^_AJ~d7OXxI-wKYu8`e}atqAGe zZr(PG!K;B<%)>;rT`(`SBiUFN%Gzei2a>DGh&5Dhk17f2R^c8KlBuj9z@kCa{Pkal}~+I;U2kCuCu>h}x|!3SPmB~Ji!UwRm^1^b{-S-Xz) z8_u2f&KEk6P*Ub@WZ@U3RI>rgR7(z}k(|C%l}ai4TXGtZn_oHudWQHjR5?0Ysu^SQKem#S;%Mw zug_xY9-6Vj{m8Hx-D4wIo>VrM_Lkz!jGrgls;h3d)LkG~aI}{ZT`}bZkN{@RfR`x6 z0!^w6E3i5QP@}M_Yeh2x4O!b>nCB&H*Ab{|hQvV_ZQfYwZ&+|+--_E{i@sA`2Owns zAQ}7z?3u=4Zh$5ceL`hQL(b2BGXzGN?_@&0mI1*$1S^bds^|Jg`-`%II>I+ek==1I zh^o(vMwj-h)@uVpe? zm&QM$)u-xD7Ye7IlWeJzK2g;iA`TN^?3FbD`=-TW@9aE*lG{nkJ*Wy)vI#U|XAYE7 zxy*pTtVcKc1Cm82lud;m4@rbF+b iXa@}c>)U`?vt2ePk2~CRjcU24fFe#shtp1^{{6q1FP3Ql literal 0 HcmV?d00001 diff --git a/vendor/chillerlan/php-qrcode/examples/example_svg.png b/vendor/chillerlan/php-qrcode/examples/example_svg.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e7b32f762ca667b37f6fdc01259af1011c2d32 GIT binary patch literal 15925 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 literal 0 HcmV?d00001 diff --git a/vendor/chillerlan/php-qrcode/examples/fpdf.php b/vendor/chillerlan/php-qrcode/examples/fpdf.php new file mode 100644 index 0000000..9c690a7 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/fpdf.php @@ -0,0 +1,47 @@ + 7, + 'outputType' => QRCode::OUTPUT_FPDF, + 'eccLevel' => QRCode::ECC_L, + 'scale' => 5, + 'imageBase64' => false, + 'moduleValues' => [ + // finder + 1536 => [0, 63, 255], // dark (true) + 6 => [255, 255, 255], // light (false), white is the transparency color and is enabled by default + // alignment + 2560 => [255, 0, 255], + 10 => [255, 255, 255], + // timing + 3072 => [255, 0, 0], + 12 => [255, 255, 255], + // format + 3584 => [67, 191, 84], + 14 => [255, 255, 255], + // version + 4096 => [62, 174, 190], + 16 => [255, 255, 255], + // data + 1024 => [0, 0, 0], + 4 => [255, 255, 255], + // darkmodule + 512 => [0, 0, 0], + // separator + 8 => [255, 255, 255], + // quietzone + 18 => [255, 255, 255], + ], +]); + +\header('Content-type: application/pdf'); + +echo (new QRCode($options))->render($data); diff --git a/vendor/chillerlan/php-qrcode/examples/html.php b/vendor/chillerlan/php-qrcode/examples/html.php new file mode 100644 index 0000000..aa5305d --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/html.php @@ -0,0 +1,102 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once '../vendor/autoload.php'; + +header('Content-Type: text/html; charset=utf-8'); + +?> + + + + + + QRCode test + + + +
+ 5, + 'outputType' => QRCode::OUTPUT_MARKUP_HTML, + 'eccLevel' => QRCode::ECC_L, + 'moduleValues' => [ + // finder + 1536 => '#A71111', // dark (true) + 6 => '#FFBFBF', // light (false) + // alignment + 2560 => '#A70364', + 10 => '#FFC9C9', + // timing + 3072 => '#98005D', + 12 => '#FFB8E9', + // format + 3584 => '#003804', + 14 => '#00FB12', + // version + 4096 => '#650098', + 16 => '#E0B8FF', + // data + 1024 => '#4A6000', + 4 => '#ECF9BE', + // darkmodule + 512 => '#080063', + // separator + 8 => '#AFBFBF', + // quietzone + 18 => '#FFFFFF', + ], + ]); + + echo (new QRCode($options))->render($data); + +?> +
+ + + + + diff --git a/vendor/chillerlan/php-qrcode/examples/image.php b/vendor/chillerlan/php-qrcode/examples/image.php new file mode 100644 index 0000000..89ba2a9 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/image.php @@ -0,0 +1,60 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +$options = new QROptions([ + 'version' => 7, + 'outputType' => QRCode::OUTPUT_IMAGE_PNG, + 'eccLevel' => QRCode::ECC_L, + 'scale' => 5, + 'imageBase64' => false, + 'moduleValues' => [ + // finder + 1536 => [0, 63, 255], // dark (true) + 6 => [255, 255, 255], // light (false), white is the transparency color and is enabled by default + // alignment + 2560 => [255, 0, 255], + 10 => [255, 255, 255], + // timing + 3072 => [255, 0, 0], + 12 => [255, 255, 255], + // format + 3584 => [67, 191, 84], + 14 => [255, 255, 255], + // version + 4096 => [62, 174, 190], + 16 => [255, 255, 255], + // data + 1024 => [0, 0, 0], + 4 => [255, 255, 255], + // darkmodule + 512 => [0, 0, 0], + // separator + 8 => [255, 255, 255], + // quietzone + 18 => [255, 255, 255], + ], +]); + +header('Content-type: image/png'); + +echo (new QRCode($options))->render($data); + + + + + diff --git a/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php b/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php new file mode 100644 index 0000000..36f63d5 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php @@ -0,0 +1,45 @@ + + * @copyright 2020 smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; +/** + * @property int $logoSpaceWidth + * @property int $logoSpaceHeight + * + * @noinspection PhpIllegalPsrClassPathInspection + */ +class LogoOptions extends QROptions{ + // size in QR modules, multiply with QROptions::$scale for pixel size + protected $logoSpaceWidth; + protected $logoSpaceHeight; +} + +$options = new LogoOptions; + +$options->version = 7; +$options->eccLevel = QRCode::ECC_H; +$options->imageBase64 = false; +$options->logoSpaceWidth = 13; +$options->logoSpaceHeight = 13; +$options->scale = 5; +$options->imageTransparent = false; + +header('Content-type: image/png'); + +$qrOutputInterface = new QRImageWithLogo($options, (new QRCode($options))->getMatrix($data)); + +// dump the output, with an additional logo +echo $qrOutputInterface->dump(null, __DIR__.'/octocat.png'); diff --git a/vendor/chillerlan/php-qrcode/examples/imageWithText.php b/vendor/chillerlan/php-qrcode/examples/imageWithText.php new file mode 100644 index 0000000..050781c --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/imageWithText.php @@ -0,0 +1,33 @@ + + * @copyright 2019 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +$options = new QROptions([ + 'version' => 7, + 'outputType' => QRCode::OUTPUT_IMAGE_PNG, + 'scale' => 3, + 'imageBase64' => false, +]); + +header('Content-type: image/png'); + +$qrOutputInterface = new QRImageWithText($options, (new QRCode($options))->getMatrix($data)); + +// dump the output, with additional text +echo $qrOutputInterface->dump(null, 'example text'); diff --git a/vendor/chillerlan/php-qrcode/examples/imagick.php b/vendor/chillerlan/php-qrcode/examples/imagick.php new file mode 100644 index 0000000..6bec4d0 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/imagick.php @@ -0,0 +1,59 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +$options = new QROptions([ + 'version' => 7, + 'outputType' => QRCode::OUTPUT_IMAGICK, + 'eccLevel' => QRCode::ECC_L, + 'scale' => 5, + 'moduleValues' => [ + // finder + 1536 => '#A71111', // dark (true) + 6 => '#FFBFBF', // light (false) + // alignment + 2560 => '#A70364', + 10 => '#FFC9C9', + // timing + 3072 => '#98005D', + 12 => '#FFB8E9', + // format + 3584 => '#003804', + 14 => '#00FB12', + // version + 4096 => '#650098', + 16 => '#E0B8FF', + // data + 1024 => '#4A6000', + 4 => '#ECF9BE', + // darkmodule + 512 => '#080063', + // separator + 8 => '#DDDDDD', + // quietzone + 18 => '#DDDDDD', + ], +]); + +header('Content-type: image/png'); + +echo (new QRCode($options))->render($data); + + + + + diff --git a/vendor/chillerlan/php-qrcode/examples/octocat.png b/vendor/chillerlan/php-qrcode/examples/octocat.png new file mode 100644 index 0000000000000000000000000000000000000000..f9050b935792512349e6f1ba0e6e55d99ecbf508 GIT binary patch literal 2468 zcmdT_`8U)H8~>UyLoN;~FS1vbQdF{J8?J4NA)_*3EJd=#Ysq#qBaJ2d9!+*iOqN76 z(^xZO--od$2`LQ5i0|#b_pf+A=RBX~x96PabIucIjWQG9li&jYKmciOZ1Ygs5xr>DERy2_uF=WzDH z?*pQu$A67A2j97g#bUvYVfOAWxI||&X=%zQq$DMKdU`Ze6t`L1At50a78Yt3)UFz6 zLZMLb*EGl)1KE=xIDatIC?g}&*VotE+q>0TGCMo#=H})X6fiL{5$0xh-_CN4Quehz zAM0~(lvF`-vTbQ;;q=!Vo0$#_3`mKIZftB!PftfjM|*pFYiMe8baV_24S_!fIfD)0 zOq;K-?-9NudwYB10Y25?2~4K)K0N77Rnt?f zE1Yh}DvRH`ICrvj1Dmv1-U8)%QtNaV2D$%{knUKIrHY0|4MMNMl3W5NzqV zo86ST7|%~?E1`q<&UOw*uYY(ebJZ~|NOS7@W#sQnpDbYS_9KDp0cDm`BYpX)e{f9Fux9 zIBaHbgExwuw+dM73(IHL3{U;s7JF|gqtiLoF}NcIZQBUEcIl~CQ0y5axVBmuAZ{-A zAgTBPwfENu1Zj~_BHMQ|d!`7x1yBX$!(Zy8KA4gXmMyx3R4y zI5*C@cmz?}SVBEd-r68f(l4QqmpfUJ#~W+S%_&QRiZYcUj&;wwfTN+ZMi=}`nzhbL z7fP1)zQ(zz8R^NPv9KAGk*V;^T^}k#O58HIZxGIJV+N~4HH<*YqGgNuVn|1Fwgtmu zkS3PO%D0l8ROr*A!^7$1vke{((O2)#H*yfuqaM=*@4_hKWZxe73ONNt+%=_>|9|D zwpH@HH9r)ZtCRK#&k2I)Jv?!id=>bQs3+Gu5#X4NBW)2h^7_a;+`?oezT!HhMfcvD z><8mG&fOmsaf0FB-K)ibM?9q#hhM=L6KnPUP>D_{$bf-HSm<9(unyyeb zX#kQ;fX=PIrv7-0Xy=O7BH9+OeG@Vhr+$WUb1T`Zx~Qf{Cgu3%b&AMuNgMbYM2f1+ z!+|WN7BOin8eVH!U_3&#`);i*AZZTGV`OE1$wYX|XMHd#nQV8etCcSJ%Iu~lB zc5Aogv-&v;o;1t0C;N^S8w^NxnO zsS1<;NeAgBTIUI-iuy_43v|f9#yU|y$PCwz8e6-$S=;_a*wvpsh%SHXr?)?(u35XW zt{ECi;2jf*SI)jX85o>dSJe?Roo&v3V25WL z{Bh$!e*(toq=fQw(->1;4oh3IiSuTR(t^@#mKnUd!bkIES!ty zOiRQ~%m+a=f3uVn_ShKd;K@FhP?G@9yCs~obQSr?BL0?ezFa&v{q^5JSA_umycY#oGsD2MCI;jqMAX6hlh@>GIb7qHfpaMoXj zlbzvw+ApCJ{x4S0FtKXLb7>hIodmf&Qty1^yhGGI8>o9ks+Gg(IA#EZEn%LHKQYjK z8-ChZgt9}|(q2RA1_|dR@~A*BQ$EFu6y(pH3)Co3g*}bgmSe+|VvwRsl$lU>q0222 z`4z&d?l%N`sCtcZP7B}o43AcwD;#Ve9c)Fyu2|&%s0g4&e)1F1XV%ak|Nc1u(gbBp IGIEak8# + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; +$gzip = true; + +$options = new QROptions([ + 'version' => 7, + 'outputType' => QRCode::OUTPUT_MARKUP_SVG, + 'eccLevel' => QRCode::ECC_L, + 'svgViewBoxSize' => 530, + 'addQuietzone' => true, + 'cssClass' => 'my-css-class', + 'svgOpacity' => 1.0, + 'svgDefs' => ' + + + + + + + + + ', + 'moduleValues' => [ + // finder + 1536 => 'url(#g1)', // dark (true) + 6 => '#fff', // light (false) + // alignment + 2560 => 'url(#g1)', + 10 => '#fff', + // timing + 3072 => 'url(#g1)', + 12 => '#fff', + // format + 3584 => 'url(#g1)', + 14 => '#fff', + // version + 4096 => 'url(#g1)', + 16 => '#fff', + // data + 1024 => 'url(#g2)', + 4 => '#fff', + // darkmodule + 512 => 'url(#g1)', + // separator + 8 => '#fff', + // quietzone + 18 => '#fff', + ], +]); + +$qrcode = (new QRCode($options))->render($data); + +header('Content-type: image/svg+xml'); + +if($gzip === true){ + header('Vary: Accept-Encoding'); + header('Content-Encoding: gzip'); + $qrcode = gzencode($qrcode ,9); +} +echo $qrcode; + + diff --git a/vendor/chillerlan/php-qrcode/examples/text.php b/vendor/chillerlan/php-qrcode/examples/text.php new file mode 100644 index 0000000..9bdf154 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/examples/text.php @@ -0,0 +1,68 @@ + + * @copyright 2017 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +$options = new QROptions([ + 'version' => 5, + 'outputType' => QRCode::OUTPUT_STRING_TEXT, + 'eccLevel' => QRCode::ECC_L, +]); + +//
 to view it in a browser
+echo '
'.(new QRCode($options))->render($data).'
'; + + +// custom values +$options = new QROptions([ + 'version' => 5, + 'outputType' => QRCode::OUTPUT_STRING_TEXT, + 'eccLevel' => QRCode::ECC_L, + 'moduleValues' => [ + // finder + 1536 => 'A', // dark (true) + 6 => 'a', // light (false) + // alignment + 2560 => 'B', + 10 => 'b', + // timing + 3072 => 'C', + 12 => 'c', + // format + 3584 => 'D', + 14 => 'd', + // version + 4096 => 'E', + 16 => 'e', + // data + 1024 => 'F', + 4 => 'f', + // darkmodule + 512 => 'G', + // separator + 8 => 'h', + // quietzone + 18 => 'i', + ], +]); + +//
 to view it in a browser
+echo '
'.(new QRCode($options))->render($data).'
'; + + + + + diff --git a/vendor/chillerlan/php-qrcode/phpdoc.xml b/vendor/chillerlan/php-qrcode/phpdoc.xml new file mode 100644 index 0000000..d191e98 --- /dev/null +++ b/vendor/chillerlan/php-qrcode/phpdoc.xml @@ -0,0 +1,15 @@ + + + + public/docs + + + public/docs + + + src + + +