From bbe561a84efdee9f95c915bfa0a78e14ace31f8d Mon Sep 17 00:00:00 2001 From: RealStickman Date: Fri, 27 May 2022 15:45:01 +0200 Subject: [PATCH] (Grav GitSync) Automatic Commit from RealStickman --- plugins/breadcrumbs/CHANGELOG.md | 67 +++ plugins/breadcrumbs/LICENSE | 21 + plugins/breadcrumbs/README.md | 101 ++++ plugins/breadcrumbs/assets/readme_1.png | Bin 0 -> 61887 bytes plugins/breadcrumbs/blueprints.yaml | 99 ++++ plugins/breadcrumbs/breadcrumbs.php | 70 +++ plugins/breadcrumbs/breadcrumbs.yaml | 8 + .../classes/plugin/Breadcrumbs.php | 123 +++++ plugins/breadcrumbs/composer.json | 32 ++ plugins/breadcrumbs/composer.lock | 24 + plugins/breadcrumbs/css/breadcrumbs.css | 18 + plugins/breadcrumbs/hebe.json | 15 + plugins/breadcrumbs/languages.yaml | 32 ++ .../templates/partials/breadcrumbs.html.twig | 38 ++ plugins/breadcrumbs/vendor/autoload.php | 7 + .../vendor/composer/ClassLoader.php | 445 ++++++++++++++++++ plugins/breadcrumbs/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 10 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 10 + .../vendor/composer/autoload_real.php | 52 ++ .../vendor/composer/autoload_static.php | 36 ++ .../vendor/composer/installed.json | 1 + 23 files changed, 1239 insertions(+) create mode 100644 plugins/breadcrumbs/CHANGELOG.md create mode 100644 plugins/breadcrumbs/LICENSE create mode 100644 plugins/breadcrumbs/README.md create mode 100644 plugins/breadcrumbs/assets/readme_1.png create mode 100644 plugins/breadcrumbs/blueprints.yaml create mode 100644 plugins/breadcrumbs/breadcrumbs.php create mode 100644 plugins/breadcrumbs/breadcrumbs.yaml create mode 100644 plugins/breadcrumbs/classes/plugin/Breadcrumbs.php create mode 100644 plugins/breadcrumbs/composer.json create mode 100644 plugins/breadcrumbs/composer.lock create mode 100644 plugins/breadcrumbs/css/breadcrumbs.css create mode 100644 plugins/breadcrumbs/hebe.json create mode 100644 plugins/breadcrumbs/languages.yaml create mode 100644 plugins/breadcrumbs/templates/partials/breadcrumbs.html.twig create mode 100644 plugins/breadcrumbs/vendor/autoload.php create mode 100644 plugins/breadcrumbs/vendor/composer/ClassLoader.php create mode 100644 plugins/breadcrumbs/vendor/composer/LICENSE create mode 100644 plugins/breadcrumbs/vendor/composer/autoload_classmap.php create mode 100644 plugins/breadcrumbs/vendor/composer/autoload_namespaces.php create mode 100644 plugins/breadcrumbs/vendor/composer/autoload_psr4.php create mode 100644 plugins/breadcrumbs/vendor/composer/autoload_real.php create mode 100644 plugins/breadcrumbs/vendor/composer/autoload_static.php create mode 100644 plugins/breadcrumbs/vendor/composer/installed.json diff --git a/plugins/breadcrumbs/CHANGELOG.md b/plugins/breadcrumbs/CHANGELOG.md new file mode 100644 index 0000000..6080f6c --- /dev/null +++ b/plugins/breadcrumbs/CHANGELOG.md @@ -0,0 +1,67 @@ +# v1.6.1 +## 12/02/2020 + +1. [](#improved) + * Minor default template improvements + +# v1.6.0 +## 04/22/2020 + +1. [](#new) + * Added `schema.org/BreadcrumbList` [#29] + * Added per-page option to control breadcrumbs [#20] + * Added various translations [#17][#18][#19] + * Pass phpstan level 1 tests + * Require Grav v1.6 + +# v1.5.1 +## 10/24/2017 + +1. [](#improved) + * Add option to ignore current page [#11] + * Removed Grav trait in favor of `Grav::instance()` + +# v1.5.0 +## 07/14/2016 + +1. [](#improved) + * non-routable pages are not linked + +# v1.4.0 +## 08/25/2015 + +1. [](#improved) + * Added blueprints for Grav Admin plugin + +# v1.3.0 +## 03/06/2015 + +1. [](#new) + * Added toggle for showing home item + * Added configurable home icon + * Added configurable divider icon + * Added toggle to link trailing item + +# v1.2.3 +## 02/05/2015 + +2. [](#improved) + * Added support for HHVM + +# v1.2.2 +## 01/23/2015 + +2. [](#improved) + * Added microdata information + +# v1.2.1 +## 01/09/2015 + +2. [](#improved) + * NOTE: BREAKING CHANGE: Moved templates into `partials/` subfolder for consistency. + +# v1.2.0 +## 11/30/2014 + +1. [](#new) + * ChangeLog started... diff --git a/plugins/breadcrumbs/LICENSE b/plugins/breadcrumbs/LICENSE new file mode 100644 index 0000000..484793a --- /dev/null +++ b/plugins/breadcrumbs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Grav + +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/plugins/breadcrumbs/README.md b/plugins/breadcrumbs/README.md new file mode 100644 index 0000000..5f8d424 --- /dev/null +++ b/plugins/breadcrumbs/README.md @@ -0,0 +1,101 @@ +# Grav Breadcrumbs Plugin + +![Breadcrumbs](assets/readme_1.png) + +`Breadcrumbs` is a [Grav](http://github.com/getgrav/grav) plugin that adds links to the previous pages (following the hierarchical structure). +It is particularly useful if you are using Grav to run a blog. + +# Installation + +Installing the Breadcrumbs plugin can be done in one of two ways. Our GPM (Grav Package Manager) installation method enables you to quickly and easily install the plugin with a simple terminal command, while the manual method enables you to do so via a zip file. + +## GPM Installation (Preferred) + +The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type: + + bin/gpm install breadcrumbs + +This will install the Breadcrumbs plugin into your `/user/plugins` directory within Grav. Its files can be found under `/your/site/grav/user/plugins/breadcrumbs`. + +## Manual Installation + +To install this plugin, just download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `breadcrumbs`. You can find these files either on [GitHub](https://github.com/getgrav/grav-plugin-breadcrumbs) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras). + +You should now have all the plugin files under + + /your/site/grav/user/plugins/breadcrumbs + +>> NOTE: This plugin is a modular component for Grav which requires [Grav](http://github.com/getgrav/grav), the [Error](https://github.com/getgrav/grav-plugin-error) and [Problems](https://github.com/getgrav/grav-plugin-problems) plugins, and a theme to be installed in order to operate. + +# Usage + +The `breadcrumbs` plugin doesn't require any configuration. The moment you install it, it is ready to use. + +Something you might want to do is to override the look and feel of the breadcrumbs, and with Grav it is super easy. + +Copy the template file [breadcrumbs.html.twig](templates/partials/breadcrumbs.html.twig) into the `templates` folder of your custom theme, and that is it. + +``` +/your/site/grav/user/themes/custom-theme/templates/partials/breadcrumbs.html.twig +``` + +You can now edit the override and tweak it however you prefer. + +## Per-page Settings + +The following options are available for use in a page's YAML frontmatter, placed within the `breadcrumbs` mapping: + +| Option | Default | Values | Description | +|-------------|---------|-------------------|--------------------------------------------------------------------------------------| +| `max_depth` | `true` | `true` or `false` | Determines whether breadcrumbs for pages beneath the current page will be generated. | + +### Example Per-page Settings + +```yaml +--- +title: Some page you wrote +breadcrumbs: + may_descend: false # Breadcrumbs will not be generated for pages underneath this one. +--- +``` + +# Updating + +As development for the Breadcrumbs plugin continues, new versions may become available that add additional features and functionality, improve compatibility with newer Grav releases, and generally provide a better user experience. Updating Breadcrumbs is easy, and can be done through Grav's GPM system, as well as manually. + +## GPM Update (Preferred) + +The simplest way to update this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). You can do this with this by navigating to the root directory of your Grav install using your system's Terminal (also called command line) and typing the following: + + bin/gpm update breadcrumbs + +This command will check your Grav install to see if your Breadcrumbs plugin is due for an update. If a newer release is found, you will be asked whether or not you wish to update. To continue, type `y` and hit enter. The plugin will automatically update and clear Grav's cache. + +## Manual Update + +Manually updating Breadcrumbs is pretty simple. Here is what you will need to do to get this done: + +* Delete the `your/site/user/plugins/breadcrumbs` directory. +* Download the new version of the Breadcrumbs plugin from either [GitHub](https://github.com/getgrav/grav-plugin-breadcrumbs) or [GetGrav.org](http://getgrav.org/downloads/plugins#extras). +* Unzip the zip file in `your/site/user/plugins` and rename the resulting folder to `breadcrumbs`. +* Clear the Grav cache. The simplest way to do this is by going to the root Grav directory in terminal and typing `bin/grav clear-cache`. + +> Note: Any changes you have made to any of the files listed under this directory will also be removed and replaced by the new set. Any files located elsewhere (for example a YAML settings file placed in `user/config/plugins`) will remain intact. + +## Configuration + +Simply copy the `user/plugins/breadcrumbs/breadcrumbs.yaml` into `user/config/plugins/breadcrumbs.yaml` and make your modifications. + +``` +enabled: true +show_all: true +built_in_css: true +include_home: true +include_current: true +icon_home: '' +icon_divider_classes: 'fa fa-angle-right' +link_trailing: false +``` + +Options are pretty self explanatory. + diff --git a/plugins/breadcrumbs/assets/readme_1.png b/plugins/breadcrumbs/assets/readme_1.png new file mode 100644 index 0000000000000000000000000000000000000000..78374123157f2d4349d4efeb85d9f4f98b0428b7 GIT binary patch literal 61887 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

GFm1ahFah{n^h)o~u1G56 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 lxZj`s|Nkw-xuf=1.6.0' } + +form: + validation: strict + fields: + enabled: + type: toggle + label: PLUGIN_ADMIN.PLUGIN_STATUS + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + show_all: + type: toggle + label: PLUGIN_BREADCRUMBS.SHOW_WITH_ONE_ITEM + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + built_in_css: + type: toggle + label: PLUGIN_BREADCRUMBS.BUILTIN_CSS + highlight: 1 + default: 1 + help: PLUGIN_BREADCRUMBS.BUILTIN_CSS_HELP + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + include_home: + type: toggle + label: PLUGIN_BREADCRUMBS.INCLUDE_HOME + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + include_current: + type: toggle + label: PLUGIN_BREADCRUMBS.INCLUDE_CURRENT_PAGE + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + icon_home: + type: text + size: medium + label: PLUGIN_BREADCRUMBS.ICON_HOME + default: '' + + icon_divider_classes: + type: text + size: medium + label: PLUGIN_BREADCRUMBS.ICON_DIVIDER_CLASSES + default: 'fa fa-angle-right' + + link_trailing: + type: toggle + label: PLUGIN_BREADCRUMBS.LINK_TRAILING + highlight: 1 + default: 0 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool diff --git a/plugins/breadcrumbs/breadcrumbs.php b/plugins/breadcrumbs/breadcrumbs.php new file mode 100644 index 0000000..7c58ee4 --- /dev/null +++ b/plugins/breadcrumbs/breadcrumbs.php @@ -0,0 +1,70 @@ + [ + ['autoload', 100001], + ['onPluginsInitialized', 0] + ] + ]; + } + + /** + * [onPluginsInitialized:100000] Composer autoload. + * + * @return ClassLoader + */ + public function autoload() + { + return require __DIR__ . '/vendor/autoload.php'; + } + + /** + * Initialize configuration + */ + public function onPluginsInitialized() + { + if ($this->isAdmin()) { + $this->active = false; + return; + } + + class_alias(Breadcrumbs::class, 'Grav\\Plugin\\Breadcrumbs'); + + $this->enable([ + 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0], + 'onTwigSiteVariables' => ['onTwigSiteVariables', 0] + ]); + } + + /** + * Add current directory to twig lookup paths. + */ + public function onTwigTemplatePaths() + { + $this->grav['twig']->twig_paths[] = __DIR__ . '/templates'; + } + + /** + * Set needed variables to display breadcrumbs. + */ + public function onTwigSiteVariables() + { + $this->grav['twig']->twig_vars['breadcrumbs'] = new Breadcrumbs($this->config->get('plugins.breadcrumbs')); + + if ($this->config->get('plugins.breadcrumbs.built_in_css')) { + $this->grav['assets']->add('plugin://breadcrumbs/css/breadcrumbs.css'); + } + } +} diff --git a/plugins/breadcrumbs/breadcrumbs.yaml b/plugins/breadcrumbs/breadcrumbs.yaml new file mode 100644 index 0000000..5364d9d --- /dev/null +++ b/plugins/breadcrumbs/breadcrumbs.yaml @@ -0,0 +1,8 @@ +enabled: true +show_all: true +built_in_css: true +include_home: true +include_current: true +icon_home: '' +icon_divider_classes: 'fa fa-angle-right' +link_trailing: false diff --git a/plugins/breadcrumbs/classes/plugin/Breadcrumbs.php b/plugins/breadcrumbs/classes/plugin/Breadcrumbs.php new file mode 100644 index 0000000..4e3aef1 --- /dev/null +++ b/plugins/breadcrumbs/classes/plugin/Breadcrumbs.php @@ -0,0 +1,123 @@ +config = $config; + } + + /** + * Return an array of breadcrumbs for the current page. + * + * @return array An array of breadcrumbs. + */ + public function get() + { + // If the breadcrumbs have not yet been generated... + if (!$this->breadcrumbs) { + // Generate them now. + $this->build(); + } + + return $this->breadcrumbs; + } + + /** + * Build the array of breadcrumbs. + * + * The array is generated by starting at the current page and then climbing + * the hierarchy until the root is reached. The resulting crumbs are then + * stored in the $breadcrumbs instance variable. + * + * @internal + */ + protected function build() + { + // Used to hold the breadcrumbs as they are being generated. + $hierarchy = array(); + + $grav = Grav::instance(); + $current = $grav['page']; + + // If the page is not routable... + if (!$current) { + // Set up an empty array of crumbs. + $this->breadcrumbs = array(); + return; + } + + // If we are not at the root page... + if (!$current->root()) { + + // If we are configured to include the current page... + if ($this->config['include_current']) { + // Place the current page in the hierarchy. + $hierarchy[$current->url()] = $current; + } + + $current = $current->parent(); + + // As long as $current does not contain the root page... + while ($current && !$current->root()) { + // Get the frontmatter of the page. + $header = $current->header(); + + // Assume we may descend unless otherwise told. + $may_descend = true; + + // If the frontmatter contains a value for $may_descend... + if(isset( + $header->breadcrumbs, + $header->breadcrumbs['may_descend'] + )) { + // Get that value. + $may_descend = $header->breadcrumbs['may_descend']; + } + + // Then, if breadcrumbs should stop at this page... + if ($may_descend === false) { + // Empty the $hierarchy. + $hierarchy = []; + } + + // Place the current page in the hierarchy. + $hierarchy[$current->url()] = $current; + + // Get the parent of the current page. + $current = $current->parent(); + } + } + + // If we are configured to include the home page... + if ($this->config['include_home']) { + // Get the home page. + $home = $grav['pages']->dispatch('/'); + + // If the home page isn't already in the hierarchy... + if ($home && !array_key_exists($home->url(), $hierarchy)) { + // Place the home page in the hierarchy. + $hierarchy[] = $home; + } + } + + // Reverse the array of breadcrumbs, so that they are in descending + // order. + $this->breadcrumbs = array_reverse($hierarchy); + } +} diff --git a/plugins/breadcrumbs/composer.json b/plugins/breadcrumbs/composer.json new file mode 100644 index 0000000..21f1979 --- /dev/null +++ b/plugins/breadcrumbs/composer.json @@ -0,0 +1,32 @@ +{ + "name": "grav-plugin-breadcrumbs", + "type": "grav-plugin", + "description": "Breadcrumbs plugin for Grav CMS", + "keywords": ["breadcrumbs"], + "homepage": "https://github.com/getgrav/grav-plugin-breadcrumbs/", + "license": "MIT", + "authors": [ + { + "name": "Team Grav", + "email": "devs@getgrav.org", + "homepage": "http://getgrav.org", + "role": "Developer" + } + ], + "require": { + "php": ">=7.1.3", + "ext-json": "*", + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { + "Grav\\Plugin\\Breadcrumbs\\": "classes/plugin" + }, + "classmap": ["breadcrumbs.php"] + }, + "config": { + "platform": { + "php": "7.1.3" + } + } +} diff --git a/plugins/breadcrumbs/composer.lock b/plugins/breadcrumbs/composer.lock new file mode 100644 index 0000000..87e59c5 --- /dev/null +++ b/plugins/breadcrumbs/composer.lock @@ -0,0 +1,24 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "df6ebb29e1322fb9746644198a99943b", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.1.3", + "ext-json": "*", + "ext-mbstring": "*" + }, + "platform-dev": [], + "platform-overrides": { + "php": "7.1.3" + } +} diff --git a/plugins/breadcrumbs/css/breadcrumbs.css b/plugins/breadcrumbs/css/breadcrumbs.css new file mode 100644 index 0000000..90a9df6 --- /dev/null +++ b/plugins/breadcrumbs/css/breadcrumbs.css @@ -0,0 +1,18 @@ +#breadcrumbs { + height: 3rem; + line-height: 3rem; + padding-left: 3rem; +} +#breadcrumbs span { + display: inline-block; + padding: 0 1rem; +} +#breadcrumbs span:first-child { + padding-left: 0; +} +#breadcrumbs i { + display: inline-block; + width: 20px; + text-align: center; +} + diff --git a/plugins/breadcrumbs/hebe.json b/plugins/breadcrumbs/hebe.json new file mode 100644 index 0000000..4550344 --- /dev/null +++ b/plugins/breadcrumbs/hebe.json @@ -0,0 +1,15 @@ +{ + "project":"grav-plugin-breadcrumbs", + "platforms":{ + "grav":{ + "nodes":{ + "plugin":[ + { + "source":"/", + "destination":"/user/plugins/breadcrumbs" + } + ] + } + } + } +} diff --git a/plugins/breadcrumbs/languages.yaml b/plugins/breadcrumbs/languages.yaml new file mode 100644 index 0000000..8f20b37 --- /dev/null +++ b/plugins/breadcrumbs/languages.yaml @@ -0,0 +1,32 @@ +en: + PLUGIN_BREADCRUMBS: + SHOW_WITH_ONE_ITEM: 'Show even with one item' + BUILTIN_CSS: 'Use built in CSS' + BUILTIN_CSS_HELP: 'Include the CSS provided by the plugin' + INCLUDE_HOME: 'Include Home' + INCLUDE_CURRENT_PAGE: 'Include Current Page' + ICON_HOME: 'Icon home' + ICON_DIVIDER_CLASSES: 'Icon Divider Classes' + LINK_TRAILING: 'Link Trailing' + +uk: + PLUGIN_BREADCRUMBS: + SHOW_WITH_ONE_ITEM: 'Показувати навіть з одним елементом' + BUILTIN_CSS: 'Використовувати вбудований CSS' + BUILTIN_CSS_HELP: 'Включити CSS, що надається плагіном' + INCLUDE_HOME: 'Включити головну сторінку' + INCLUDE_CURRENT_PAGE: 'Включати активну сторінку' + ICON_HOME: 'Іконка головної сторінки' + ICON_DIVIDER_CLASSES: 'Клас іконки розділювача' + LINK_TRAILING: 'Трейлінг посилання' + +ru: + PLUGIN_BREADCRUMBS: + SHOW_WITH_ONE_ITEM: 'Показывать даже с одним элементом' + BUILTIN_CSS: 'Использовать встроенный CSS' + BUILTIN_CSS_HELP: 'Включить CSS, предоставляемый плагином' + INCLUDE_HOME: 'Включить главную страницу' + INCLUDE_CURRENT_PAGE: 'Включать текущую страницу' + ICON_HOME: 'Иконка главной страницы' + ICON_DIVIDER_CLASSES: 'Класс иконки разделителя' + LINK_TRAILING: 'Трейлинг ссылки' diff --git a/plugins/breadcrumbs/templates/partials/breadcrumbs.html.twig b/plugins/breadcrumbs/templates/partials/breadcrumbs.html.twig new file mode 100644 index 0000000..fcb255a --- /dev/null +++ b/plugins/breadcrumbs/templates/partials/breadcrumbs.html.twig @@ -0,0 +1,38 @@ +{% set crumbs = breadcrumbs.get() %} +{% set breadcrumbs_config = config.plugins.breadcrumbs %} +{% set divider = breadcrumbs_config.icon_divider_classes %} + +{% if crumbs|length > 1 or breadcrumbs_config.show_all %} +

+{% endif %} diff --git a/plugins/breadcrumbs/vendor/autoload.php b/plugins/breadcrumbs/vendor/autoload.php new file mode 100644 index 0000000..e0bc823 --- /dev/null +++ b/plugins/breadcrumbs/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath.'\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/plugins/breadcrumbs/vendor/composer/LICENSE b/plugins/breadcrumbs/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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/plugins/breadcrumbs/vendor/composer/autoload_classmap.php b/plugins/breadcrumbs/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..1e48ed9 --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $baseDir . '/breadcrumbs.php', +); diff --git a/plugins/breadcrumbs/vendor/composer/autoload_namespaces.php b/plugins/breadcrumbs/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..b7fc012 --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/classes/plugin'), +); diff --git a/plugins/breadcrumbs/vendor/composer/autoload_real.php b/plugins/breadcrumbs/vendor/composer/autoload_real.php new file mode 100644 index 0000000..c1891fd --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/autoload_real.php @@ -0,0 +1,52 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit3ccdcd6f1ac1044c32372e7c5a66846a::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/plugins/breadcrumbs/vendor/composer/autoload_static.php b/plugins/breadcrumbs/vendor/composer/autoload_static.php new file mode 100644 index 0000000..6dbff43 --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/autoload_static.php @@ -0,0 +1,36 @@ + + array ( + 'Grav\\Plugin\\Breadcrumbs\\' => 24, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Grav\\Plugin\\Breadcrumbs\\' => + array ( + 0 => __DIR__ . '/../..' . '/classes/plugin', + ), + ); + + public static $classMap = array ( + 'Grav\\Plugin\\BreadcrumbsPlugin' => __DIR__ . '/../..' . '/breadcrumbs.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit3ccdcd6f1ac1044c32372e7c5a66846a::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit3ccdcd6f1ac1044c32372e7c5a66846a::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit3ccdcd6f1ac1044c32372e7c5a66846a::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/plugins/breadcrumbs/vendor/composer/installed.json b/plugins/breadcrumbs/vendor/composer/installed.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/plugins/breadcrumbs/vendor/composer/installed.json @@ -0,0 +1 @@ +[]