From 52bb90a92b50dc828f63a9f2f83935988501e2fd Mon Sep 17 00:00:00 2001 From: RealStickman Date: Mon, 6 Jun 2022 18:16:01 +0200 Subject: [PATCH] (Grav GitSync) Automatic Commit from RealStickman --- plugins/page-toc/CHANGELOG.md | 93 + plugins/page-toc/LICENSE | 21 + plugins/page-toc/README.md | 226 + plugins/page-toc/assets/page-toc-anchors.css | 22 + plugins/page-toc/assets/page-toc-anchors.js | 10 + plugins/page-toc/assets/page-toc.png | Bin 0 -> 338518 bytes plugins/page-toc/blueprints.yaml | 170 + plugins/page-toc/blueprints/page-toc.yaml | 142 + plugins/page-toc/classes/HtmlHelper.php | 89 + plugins/page-toc/classes/MarkupFixer.php | 82 + .../page-toc/classes/OrderedListRenderer.php | 68 + plugins/page-toc/classes/TocGenerator.php | 179 + plugins/page-toc/classes/UniqueSlugify.php | 74 + .../classes/shortcodes/AnchorShortcode.php | 51 + plugins/page-toc/composer.json | 31 + plugins/page-toc/composer.lock | 170 + plugins/page-toc/languages.yaml | 38 + plugins/page-toc/page-toc.php | 222 + plugins/page-toc/page-toc.yaml | 17 + .../templates/components/page-toc.html.twig | 26 + plugins/page-toc/vendor/autoload.php | 7 + plugins/page-toc/vendor/cocur/slugify/LICENSE | 9 + .../page-toc/vendor/cocur/slugify/README.md | 751 ++ .../vendor/cocur/slugify/composer.json | 59 + .../src/Bridge/Laravel/SlugifyFacade.php | 39 + .../Bridge/Laravel/SlugifyServiceProvider.php | 57 + .../src/Bridge/Latte/SlugifyHelper.php | 38 + .../Bridge/League/SlugifyServiceProvider.php | 37 + .../src/Bridge/Nette/SlugifyExtension.php | 49 + .../src/Bridge/Plum/SlugifyConverter.php | 50 + .../src/Bridge/Symfony/CocurSlugifyBundle.php | 31 + .../Bridge/Symfony/CocurSlugifyExtension.php | 62 + .../src/Bridge/Symfony/Configuration.php | 46 + .../src/Bridge/Twig/SlugifyExtension.php | 80 + .../cocur/slugify/src/Bridge/ZF2/Module.php | 50 + .../slugify/src/Bridge/ZF2/SlugifyService.php | 30 + .../src/Bridge/ZF2/SlugifyViewHelper.php | 41 + .../Bridge/ZF2/SlugifyViewHelperFactory.php | 28 + .../src/RuleProvider/DefaultRuleProvider.php | 8557 +++++++++++++++++ .../src/RuleProvider/FileRuleProvider.php | 47 + .../RuleProvider/RuleProviderInterface.php | 29 + .../vendor/cocur/slugify/src/Slugify.php | 192 + .../cocur/slugify/src/SlugifyInterface.php | 36 + .../page-toc/vendor/composer/ClassLoader.php | 572 ++ .../vendor/composer/InstalledVersions.php | 350 + plugins/page-toc/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 11 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 12 + .../vendor/composer/autoload_real.php | 57 + .../vendor/composer/autoload_static.php | 53 + .../page-toc/vendor/composer/installed.json | 158 + .../page-toc/vendor/composer/installed.php | 41 + .../vendor/composer/platform_check.php | 26 + .../tmp-f711f3efca8baf836db7f0f0b18aef94~ | 1 + .../vendor/knplabs/knp-menu/CHANGELOG.md | 174 + .../page-toc/vendor/knplabs/knp-menu/LICENSE | 19 + .../vendor/knplabs/knp-menu/composer.json | 52 + .../src/Knp/Menu/Factory/CoreExtension.php | 62 + .../Knp/Menu/Factory/ExtensionInterface.php | 24 + .../src/Knp/Menu/FactoryInterface.php | 16 + .../Integration/Symfony/RoutingExtension.php | 44 + .../knp-menu/src/Knp/Menu/ItemInterface.php | 333 + .../Iterator/CurrentItemFilterIterator.php | 35 + .../Iterator/DisplayedItemFilterIterator.php | 27 + .../Menu/Iterator/RecursiveItemIterator.php | 33 + .../src/Knp/Menu/Loader/ArrayLoader.php | 62 + .../src/Knp/Menu/Loader/LoaderInterface.php | 22 + .../src/Knp/Menu/Loader/NodeLoader.php | 40 + .../knp-menu/src/Knp/Menu/Matcher/Matcher.php | 76 + .../src/Knp/Menu/Matcher/MatcherInterface.php | 28 + .../src/Knp/Menu/Matcher/Voter/RegexVoter.php | 35 + .../src/Knp/Menu/Matcher/Voter/RouteVoter.php | 94 + .../src/Knp/Menu/Matcher/Voter/UriVoter.php | 34 + .../Knp/Menu/Matcher/Voter/VoterInterface.php | 19 + .../knp-menu/src/Knp/Menu/MenuFactory.php | 66 + .../knp-menu/src/Knp/Menu/MenuItem.php | 620 ++ .../knp-menu/src/Knp/Menu/NodeInterface.php | 30 + .../Knp/Menu/Provider/ArrayAccessProvider.php | 55 + .../src/Knp/Menu/Provider/ChainProvider.php | 43 + .../src/Knp/Menu/Provider/LazyProvider.php | 52 + .../Menu/Provider/MenuProviderInterface.php | 24 + .../src/Knp/Menu/Provider/PsrProvider.php | 39 + .../Knp/Menu/Renderer/ArrayAccessProvider.php | 54 + .../src/Knp/Menu/Renderer/ListRenderer.php | 260 + .../src/Knp/Menu/Renderer/PsrProvider.php | 51 + .../src/Knp/Menu/Renderer/Renderer.php | 100 + .../Knp/Menu/Renderer/RendererInterface.php | 27 + .../Renderer/RendererProviderInterface.php | 20 + .../src/Knp/Menu/Renderer/TwigRenderer.php | 66 + .../Menu/Resources/views/knp_menu.html.twig | 101 + .../Resources/views/knp_menu_base.html.twig | 1 + .../views/knp_menu_ordered.html.twig | 11 + .../knp-menu/src/Knp/Menu/Twig/Helper.php | 192 + .../src/Knp/Menu/Twig/MenuExtension.php | 166 + .../src/Knp/Menu/Util/MenuManipulator.php | 304 + 96 files changed, 16878 insertions(+) create mode 100644 plugins/page-toc/CHANGELOG.md create mode 100644 plugins/page-toc/LICENSE create mode 100644 plugins/page-toc/README.md create mode 100644 plugins/page-toc/assets/page-toc-anchors.css create mode 100644 plugins/page-toc/assets/page-toc-anchors.js create mode 100644 plugins/page-toc/assets/page-toc.png create mode 100644 plugins/page-toc/blueprints.yaml create mode 100644 plugins/page-toc/blueprints/page-toc.yaml create mode 100644 plugins/page-toc/classes/HtmlHelper.php create mode 100644 plugins/page-toc/classes/MarkupFixer.php create mode 100644 plugins/page-toc/classes/OrderedListRenderer.php create mode 100644 plugins/page-toc/classes/TocGenerator.php create mode 100644 plugins/page-toc/classes/UniqueSlugify.php create mode 100644 plugins/page-toc/classes/shortcodes/AnchorShortcode.php create mode 100644 plugins/page-toc/composer.json create mode 100644 plugins/page-toc/composer.lock create mode 100644 plugins/page-toc/languages.yaml create mode 100644 plugins/page-toc/page-toc.php create mode 100644 plugins/page-toc/page-toc.yaml create mode 100644 plugins/page-toc/templates/components/page-toc.html.twig create mode 100644 plugins/page-toc/vendor/autoload.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/LICENSE create mode 100644 plugins/page-toc/vendor/cocur/slugify/README.md create mode 100644 plugins/page-toc/vendor/cocur/slugify/composer.json create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyFacade.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyServiceProvider.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Latte/SlugifyHelper.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/League/SlugifyServiceProvider.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Nette/SlugifyExtension.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Plum/SlugifyConverter.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyBundle.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyExtension.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/Configuration.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/Twig/SlugifyExtension.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/Module.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyService.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelper.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelperFactory.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/DefaultRuleProvider.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/FileRuleProvider.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/RuleProviderInterface.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/Slugify.php create mode 100644 plugins/page-toc/vendor/cocur/slugify/src/SlugifyInterface.php create mode 100644 plugins/page-toc/vendor/composer/ClassLoader.php create mode 100644 plugins/page-toc/vendor/composer/InstalledVersions.php create mode 100644 plugins/page-toc/vendor/composer/LICENSE create mode 100644 plugins/page-toc/vendor/composer/autoload_classmap.php create mode 100644 plugins/page-toc/vendor/composer/autoload_namespaces.php create mode 100644 plugins/page-toc/vendor/composer/autoload_psr4.php create mode 100644 plugins/page-toc/vendor/composer/autoload_real.php create mode 100644 plugins/page-toc/vendor/composer/autoload_static.php create mode 100644 plugins/page-toc/vendor/composer/installed.json create mode 100644 plugins/page-toc/vendor/composer/installed.php create mode 100644 plugins/page-toc/vendor/composer/platform_check.php create mode 100644 plugins/page-toc/vendor/composer/tmp-f711f3efca8baf836db7f0f0b18aef94~ create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/CHANGELOG.md create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/LICENSE create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/composer.json create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/CoreExtension.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/ExtensionInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/FactoryInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Integration/Symfony/RoutingExtension.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/ItemInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/CurrentItemFilterIterator.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/DisplayedItemFilterIterator.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/RecursiveItemIterator.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/ArrayLoader.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/LoaderInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/NodeLoader.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Matcher.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/MatcherInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RegexVoter.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/UriVoter.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/VoterInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/MenuFactory.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/MenuItem.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/NodeInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ArrayAccessProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ChainProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/LazyProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/MenuProviderInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/PsrProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ArrayAccessProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/PsrProvider.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/Renderer.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererProviderInterface.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/TwigRenderer.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_base.html.twig create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_ordered.html.twig create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/Helper.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/MenuExtension.php create mode 100644 plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Util/MenuManipulator.php diff --git a/plugins/page-toc/CHANGELOG.md b/plugins/page-toc/CHANGELOG.md new file mode 100644 index 0000000..8043746 --- /dev/null +++ b/plugins/page-toc/CHANGELOG.md @@ -0,0 +1,93 @@ +# v3.2.0 +## 02/23/2022 + +1. [](#new) + * Support for HTML or Shortcode based headers with custom `id` attributes to specify an anchor + * Added German translation + +# v3.1.3 +## 01/03/2022 + +1. [](#new) + * Require Grav `v1.7.26` to make use of built in `Plugin::inheritedConfigOption()` + * NOTE: `page-toc v3.1.2` was released prior to `Grav v1.7.26` and has been removed +2. [](#improved) + * Don't force inclusion of `` or `` tags to reduce chance of invalid HTML + * Improved `README.md` + +# v3.1.1 +## 12/16/2021 + +1. [](#bugfix) + * Fixed some blueprint errors that caused errors on save + * Force `start` and `depth` to be integers [#17](https://github.com/trilbymedia/grav-plugin-page-toc/issues/17) + +# v3.1.0 +## 12/09/2021 + +1. [](#new) + * **NEW** Added option to automatically copying to clipboard an anchor URL when clicking on it + +# v3.0.0 +## 12/03/2021 + +1. [](#new) + * **NEW** Support built-in `anchors` with customization of icon/classes/css etc. + * **NEW** `[anchor]` shortcode for creating manual anchors for easy linking to page content + * Moved the vendor-based TOC functionality in-plugin to provide more flexibility and additional features + * Added several more Twig functions for increased flexibility + * Ability to limit the length of a fragment link + * Ability to set a custom prefix for anchor links + * Added `languages.yaml` file for text translations +2. [](#improved) + * Independent control over the levels of anchors that should be built and the TOC displayed + * `page-toc:` page-level configuration can be set in parent pages and trickles down to child pages + * Removed dependency on HTML5 library and use the faster PHP `DOMDocument` class + * Translated text for the "Table of Contents" in the `page-toc.html.twig` template + +# v2.0.0 +## 11/24/2021 + +1. [](#new) + * Added new `components/page-toc.html.twig` that can be extended and the HTML output modified + * Updated core TOC library to latest `3.0.2` version + * Requires PHP `7.3.6` + * Requires Grav `1.7+` + * Added Shortcode-like in-page syntax support. e.g. `[toc]` + +# v1.1.2 +## 06/01/2021 + +1. [](#new) + * Added page-toc blueprints under "Advanced" tab for admin +1. [](#improved) + * Updated to latest `knplabs/knp-menu` library +1. [](#bugfix) + * Added `|raw` filter to twig output in README.md + +# v1.1.1 +## 12/02/2020 + +1. [](#improved) + * Updated to latest `masterminds/html5` and `knplabs/knp-menu` libraries + +# v1.1.0 +## 04/01/2019 + +1. [](#improved) + * Updated to latest `caseyamcl/toc` library +1. [](#bugfix) + * Fixes relative levels [#6](https://github.com/trilbymedia/grav-plugin-page-toc/pull/9) + * Fixes incorrect reference to `end` when it should be `depth` [#7](https://github.com/trilbymedia/grav-plugin-page-toc/pull/7) + +# v1.0.1 +## 03/19/2017 + +1. [](#improved) + * Fixed issue with `end` not being valid, should be `depth`. Updated README + +# v1.0.0 +## 08/01/2017 + +1. [](#new) + * ChangeLog started... diff --git a/plugins/page-toc/LICENSE b/plugins/page-toc/LICENSE new file mode 100644 index 0000000..5234b4e --- /dev/null +++ b/plugins/page-toc/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Team 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/page-toc/README.md b/plugins/page-toc/README.md new file mode 100644 index 0000000..0959c6c --- /dev/null +++ b/plugins/page-toc/README.md @@ -0,0 +1,226 @@ +# Page Toc Plugin (Anchors + Table of Contents) + +The **Page Toc** Plugin is for [Grav CMS](http://github.com/getgrav/grav) that generates anchors based on HTML header tags, and can also create a table of contents from those headers. + +With version `3.0` this plugin is able to automatically generate anchor links with hover-click capability without the need for other plugins (such as the `anchors` plugin). This functionality operates independently from the now optional "table of contents" functionality. + +![](assets/page-toc.png) + +## Installation + +Installing the Page Toc plugin can be done in one of two ways. The 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 page-toc + +This will install the Page Toc plugin into your `/user/plugins` directory within Grav. Its files can be found under `/your/site/grav/user/plugins/page-toc`. + +### 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 `page-toc`. You can find these files on [GitHub](https://github.com/team-grav/grav-plugin-page-toc) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras). + +You should now have all the plugin files under + + /your/site/grav/user/plugins/page-toc + +## Configuration + +Before configuring this plugin, you should copy the `user/plugins/page-toc/page-toc.yaml` to `user/config/plugins/page-toc.yaml` and only edit that copy. + +Here is the default configuration and an explanation of available options: + +```yaml +enabled: true # Plugin enabled +include_css: true # Include CSS +active: true # Anchor IDs processed and generated for all pages +start: 1 # Start header tag level (1 = h1) for TOC +depth: 6 # Depth from start (2 = 2 levels deep) for TOC +hclass: # Custom Header TOC styling classes +anchors: # Anchor configuration + start: 1 # Start header tag level (1 = h1) + depth: 6 # Depth from start (2 = 2 levels deep) + link: true # Enabled auto-generation of clickable link with fragment + aria: Anchor # Aria label to use + class: # Custom Header anchor styling classes + icon: '#' # Icon to use, can be a symbol, emoji, ascii etc. + position: after # Position to put the anchor, `before|after` + copy_to_clipboard: true # Copy to clipboard functionality (coming soon) + slug_maxlen: 25 # Max length of slugs used for anchors + slug_prefix: # A prefix used in front of generated slugs +``` + +> You can now have `page-toc` automatically add anchors without there being a table of contents being used, just ensure `active` to `true`. + +By default, The plugin is `active` and will add header id attributes anchors for each header level found in a page. You can set `active: false` and then activate on a page basis by adding this to the page frontmatter: + +```yaml +page-toc: + active: true +``` + +You can also configure which header tags to start and depth on when building the id attribute anchors by changing the `start` and `depth` values. This can also be done on a per-page basis. + +For example if you had a start of `3` and a depth of `3` you would get a TOC for `h3`, `h4`, and `h5`. + +## Usage + +### Shortcode-like syntax in your content + +You can use the following shortcode-like syntax in your content: + +```md +[TOC] or [TOC/] or [toc] or [toc /] +``` + +This will replace the shortcode syntax with the Table of Contents with the `components/page-toc.html.twig` Twig template. Either the default one included in the `page-toc` plugin or an overridden version from your theme. + +For example in Quark theme, you will need to create a folder called `components/` under `templates/` so the file will be copied to: + +```shell +user/themes/quark/templates/components/page-toc.html.twig +``` + +NOTE: It's not required to set the TOC plugin `active` if you use the shortcode syntax in your content. That is a good enough indication that you want the plugin to be active. + +### Anchor Shortcode + +Page TOC now includes a `anchor` shortcode that allows you to manually add linkable fragments in your content. +The shortcode will automatically generate the link if no options are provided. Alternatively you can use the bbode syntax of `anchor="some-custom-id"` or you can explicity set it. You can also set a `prefix` and let the shortcode autogenerate the rest. + +For example: + +```markdown + +Ut sed nisl suscipit metus sollicitudin [anchor]ornare[/anchor] nec vitae nulla. In pretium massa ex, in [anchor="vulputate"]vulputate tellus[/anchor] accumsan vel. + +Nullam [anchor id="tempor"]tempor quis lorem[/anchor] venenatis finibus. Curabitur dapibus nulla sed tristique pretium. Nullam tempor quis [anchor prefix="sec2.2-"]lorem venenatis finibus[/anchor]. +``` + +An example of the resulting HTML link looks like: + +```html +tempor quis lorem +``` + +The `inline-anchor` CSS class is used by shortcodes and any manually generated elements so it can be styled as independently from other links or anchored headers. + +### Twig Templating + +When the plugin is `active` it will add anchors to the header tags of the page content as configured. You can simply include the provided Twig template: + +```twig +{% block content %} + {% include 'components/page-toc.html.twig' %} + {{ content|raw }} +{% endblock %} +``` + +You can also add your **Table of Contents** HTML in your Twig template directly with the provided `toc()` Twig function: + +For example: + +```twig +{% if active or toc_config_var('active') %} +
+ {% set table_of_contents = toc(page.content) %} + {% if table_of_contents is not empty %} +

{{ 'PLUGIN_PAGE_TOC.TABLE_OF_CONTENTS'|t }}

+ {{ table_of_contents|raw }} + {% endif %} +
+{% endif %} +``` + +The `toc_ordered()` Twig function does the same things as a the `toc()` function, except it uses an ordered list instead of an unordered one. + +or via the `toc_items()` function which rather than returning HTML directly returns objects and you can manipulate the output as needed: + +```twig +{% macro toc_loop(items) %} + {% import _self as self %} + {% for item in items %} + {% set class = loop.first ? 'first' : loop.last ? 'last' : null %} +
  • + {{ item.label }} + {% if item.children|length > 0 %} + + {% endif %} +
  • + {% endfor %} +{% endmacro %} + +{% if config.get('plugins.page-toc.active') or attribute(page.header, 'page-toc').active %} +
    + {% set table_of_contents = toc_items(page.content) %} + {% if table_of_contents is not empty %} +

    Table of Contents

    + + {% endif %} +
    +{% endif %} +``` + +To explictly build a table of contents for a block of content: + +```markdown +{% block my_content %} +# Header 1 + +## Header 1.1 + +Nullam tempor quis lorem venenatis finibus. Maecenas ut condimentum nibh. Ut sed nisl suscipit metus sollicitudin ornare nec vitae nulla. Integer sed tortor eu ligula interdum rhoncus. Sed pulvinar ut massa et ullamcorper. Curabitur bibendum ante orci, nec porttitor dolor suscipit quis. Nulla et eros enim. + +### Header 1.1.1 + +Integer sed tortor eu ligula interdum rhoncus. + +## Header 1.2 +{% endblock %} + +#### Table O' Contents +{{ toc(block('my_content'), 2, 1) }} +``` + +The `add_anchors()` twig funtion can take a string or a block of content and automatically adds anchors to any headers found per the configuration for the page, but you can override the start and depth. For example here we have a Twig block but we just want to add anchors to the H2 tags: + +```markdown +{% block my_content %} +# Header 1 + +## Header 1.1 + +Nullam tempor quis lorem venenatis finibus. Maecenas ut condimentum nibh. Ut sed nisl suscipit metus sollicitudin ornare nec vitae nulla. Integer sed tortor eu ligula interdum rhoncus. Sed pulvinar ut massa et ullamcorper. Curabitur bibendum ante orci, nec porttitor dolor suscipit quis. Nulla et eros enim. + +### Header 1.1.1 + +Integer sed tortor eu ligula interdum rhoncus. + +## Header 1.2 +{% endblock %} + +#### Anchors Away! +{{ add_anchors(block('my_content'), 2, 1) }} +``` + +### Limiting levels in output + +As well as limiting the levels that the page TOC plugin will use in the table of contents, you can also limit the levels that are actually displayed. To do this you can pass an optional `start`, and `depth` value to the `toc()`, `toc_ordered()` , `toc_items()` and `add_anchors()` Twig functions: + +```twig +{% set table_of_contents = toc(page.content, 3, 3) %} +``` + +This will only display `H3` , and **3** levels deeper (up to `H5`) in the TOC output. + +## Credits + +The majority of this plugin's functionality is provided by the [PHP TOC Generator](https://github.com/caseyamcl/toc) library by [Casey McLaughlin](https://github.com/caseyamcl). So Thanks for making this plugin for Grav possible! + + diff --git a/plugins/page-toc/assets/page-toc-anchors.css b/plugins/page-toc/assets/page-toc-anchors.css new file mode 100644 index 0000000..84c66dc --- /dev/null +++ b/plugins/page-toc/assets/page-toc-anchors.css @@ -0,0 +1,22 @@ +.toc-anchor { + transition: hover 0.5s ease; + position: absolute; + opacity: 0; +} + +.toc-anchor.after { + margin-left: 5px; +} + +.toc-anchor.before { + margin-left: -22px; + padding-right: 8px; +} + +.toc-anchor:after { + content: attr(data-anchor-icon); +} + +:hover > .toc-anchor, .toc-anchor:focus { + opacity: .5; +} \ No newline at end of file diff --git a/plugins/page-toc/assets/page-toc-anchors.js b/plugins/page-toc/assets/page-toc-anchors.js new file mode 100644 index 0000000..ec5c459 --- /dev/null +++ b/plugins/page-toc/assets/page-toc-anchors.js @@ -0,0 +1,10 @@ +document.body.addEventListener('click', (event) => { + if (typeof event.target.dataset.anchorIcon !== 'undefined') { + const href = event.target.href; + navigator.clipboard.writeText(href) + .then(() => {}) + .catch((error) => { + console.error('Unable to copy to clipboard the anchor', error); + }); + } +}, true); \ No newline at end of file diff --git a/plugins/page-toc/assets/page-toc.png b/plugins/page-toc/assets/page-toc.png new file mode 100644 index 0000000000000000000000000000000000000000..51407199552b6bd41ebc57a5a63509fa30b10728 GIT binary patch literal 338518 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%0A;VeimWUGD!WS#VQf+!G}DwMLwV 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

    ClEW>*a6k=M;6J0vosi4VbP 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 z%0D(zqcY!8;a*b)z9dk#gA)oWWu@=)ePO7@U)VnrfH3#Z_m6tt7s@xE{vd5p#DBMZ zc-0m3=?hmxJbyI|#1#kEQ=Z--F zoUH#3s4tQ02H<1V*YUKm(Z0{6Od~Byl*&uXaD(HA5*Fbv^G5p*v(J z9S?`_@v-ER<(xo*DEs(Tlqhx#{^5A)zM4nGd7NJ4zw|L&wPm`k3g9yo&`@;i-naL}_%-z0@+ zG%G+<6X~RGXa$ahf4#pG(u80Tb!hK6@z>iz2{xaFGTgvU0diW58(KB!XZE@(ly7Jo zE^<7!S^Y*pzOowY{Og4J*r2espxx0(**cQF^ zjSnj)1GWY0d2O*ZF1&>T_%(7Iya-0I>pc9>1$8(KFfzohK)3%+*nF6xliUX;aYNgJ zIjR}2i#N1-uli@-?sO%PBNx&4)>W15BjSH8MWn^HCclIK6|_J^oO=6d>(hi+ArYgB zJ#b&Y#Qe$9&fyJ6aHY+{okws$9RZVaISnvrA E^4)rt-!vRcRSFVy*x{1)Jmk&J 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

    35HiYh${8H&Wd02q8p;VJ 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 HwY>fxcC;Bm literal 0 HcmV?d00001 diff --git a/plugins/page-toc/blueprints.yaml b/plugins/page-toc/blueprints.yaml new file mode 100644 index 0000000..38ae211 --- /dev/null +++ b/plugins/page-toc/blueprints.yaml @@ -0,0 +1,170 @@ +name: Page Toc +type: plugin +slug: page-toc +version: 3.2.0 +description: Generate a table of contents and anchors from a page +icon: list +author: + name: Trilby Media, LLC + email: hello@trilby.media + url: http://trilby.media +homepage: http://trilby.media +keywords: grav, plugin, toc, anchors +bugs: https://github.com/trilbymedia/grav-plugin-page-toc/issues +docs: https://github.com/trilbymedia/grav-plugin-page-toc/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.7.26' } + +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 + include_css: + type: toggle + label: PLUGIN_PAGE_TOC.INCLUDE_CSS + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + active: + type: toggle + label: PLUGIN_PAGE_TOC.ACTIVE_BY_DEFAULT + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + toc_section: + type: section + title: PLUGIN_PAGE_TOC.TOC_SECTION + underline: true + + fields: + start: + type: select + label: PLUGIN_PAGE_TOC.START_TOC_HEADERS + help: PLUGIN_PAGE_TOC.START_TOC_HEADERS_HELP + size: x-small + classes: fancy + options: + 1: H1 + 2: H2 + 3: H3 + 4: H4 + 5: H5 + 6: H6 + validate: + type: number + depth: + type: range + label: PLUGIN_PAGE_TOC.DEPTH_TOC_HEADERS + help: PLUGIN_PAGE_TOC.DEPTH_TOC_HEADERS_HELP + classes: fancy + validate: + min: 1 + max: 6 + hclass: + type: text + label: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES + help: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES_HELP + + anchors_section: + type: section + title: PLUGIN_PAGE_TOC.ANCHORS_SECTION + underline: true + + fields: + anchors.start: + type: select + label: PLUGIN_PAGE_TOC.START_ANCHOR_HEADERS + size: x-small + classes: fancy + options: + 1: H1 + 2: H2 + 3: H3 + 4: H4 + 5: H5 + 6: H6 + validate: + type: number + anchors.depth: + type: range + label: PLUGIN_PAGE_TOC.DEPTH_ANCHOR_HEADERS + help: PLUGIN_PAGE_TOC.DEPTH_ANCHOR_HEADERS_HELP + classes: fancy + validate: + min: 1 + max: 6 + anchors.link: + type: toggle + label: PLUGIN_PAGE_TOC.LINK_ANCHOR_HEADERS + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + anchors.aria: + type: text + label: PLUGIN_PAGE_TOC.ARIA_LABEL + default: Anchor + anchors.class: + type: text + label: PLUGIN_PAGE_TOC.ANCHORS_CLASS + help: PLUGIN_PAGE_TOC.ANCHORS_CLASS_HELP + anchors.icon: + type: text + label: PLUGIN_PAGE_TOC.ANCHORS_ICON + help: PLUGIN_PAGE_TOC.ANCHORS_ICON_HELP + default: '#' + size: x-small + anchors.position: + type: select + label: PLUGIN_PAGE_TOC.ANCHORS_POSITION + help: PLUGIN_PAGE_TOC.ANCHORS_POSITION_HELP + size: small + default: after + options: + before: PLUGIN_PAGE_TOC.BEFORE_TEXT + after: PLUGIN_PAGE_TOC.AFTER_TEXT + anchors.copy_to_clipboard: + type: toggle + label: PLUGIN_PAGE_TOC.COPY_TO_CLIPBOARD + help: PLUGIN_PAGE_TOC.COPY_TO_CLIPBOARD_HELP + highlight: 1 + default: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + anchors.slug_maxlen: + type: number + label: PLUGIN_PAGE_TOC.SLUG_MAXLEN + help: PLUGIN_PAGE_TOC.SLUG_MAXLEN_HELP + size: x-small + default: 25 + append: 'chars' + anchors.slug_prefix: + type: text + label: PLUGIN_PAGE_TOC.SLUG_PREFIX + help: PLUGIN_PAGE_TOC.SLUG_PREFIX_HELP diff --git a/plugins/page-toc/blueprints/page-toc.yaml b/plugins/page-toc/blueprints/page-toc.yaml new file mode 100644 index 0000000..de6998f --- /dev/null +++ b/plugins/page-toc/blueprints/page-toc.yaml @@ -0,0 +1,142 @@ +form: + fields: + tabs: + fields: + advanced: + type: tab + + fields: + header.page-toc-section: + type: section + title: Page Table-of-Contents + underline: true + + fields: + header.page-toc.active: + toggleable: true + type: toggle + label: PLUGIN_PAGE_TOC.ACTIVE_BY_DEFAULT_PAGE + help: PLUGIN_PAGE_TOC.ACTIVE_BY_DEFAULT_PAGE_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'active'] + options: + 1: PLUGIN_ADMIN.YES + 0: PLUGIN_ADMIN.NO + validate: + type: bool + + header.page-toc.start: + toggleable: true + type: select + size: x-small + label: PLUGIN_PAGE_TOC.START_TOC_HEADERS + help: PLUGIN_PAGE_TOC.START_TOC_HEADERS_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'start'] + options: + 1: H1 + 2: H2 + 3: H3 + 4: H4 + 5: H5 + 6: H6 + validate: + type: number + header.page-toc.depth: + toggleable: true + type: range + label: PLUGIN_PAGE_TOC.DEPTH_TOC_HEADERS + help: PLUGIN_PAGE_TOC.DEPTH_TOC_HEADERS_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'depth'] + validate: + min: 1 + max: 6 + header.page-toc.hclass: + toggleable: true + type: text + label: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES + help: PLUGIN_PAGE_TOC.HEADER_CSS_CLASSES_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'hclass'] + + header.page-toc-anchors-section: + type: section + title: PLUGIN_PAGE_TOC.PAGE_ANCHORS_SECTION + underline: true + + fields: + header.page-toc.anchors.start: + toggleable: true + type: select + label: PLUGIN_PAGE_TOC.START_ANCHOR_HEADERS + size: x-small + classes: fancy + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.start'] + options: + 1: H1 + 2: H2 + 3: H3 + 4: H4 + 5: H5 + 6: H6 + validate: + type: number + header.page-toc.anchors.depth: + toggleable: true + type: range + label: PLUGIN_PAGE_TOC.DEPTH_ANCHOR_HEADERS + classes: fancy + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.depth'] + validate: + min: 1 + max: 6 + header.page-toc.anchors.link: + toggleable: true + type: toggle + label: PLUGIN_PAGE_TOC.LINK_ANCHOR_HEADERS + highlight: 1 + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.link'] + options: + 1: Enabled + 0: Disabled + validate: + type: bool + header.page-toc.anchors.aria: + toggleable: true + type: text + label: PLUGIN_PAGE_TOC.ARIA_LABEL + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.aria'] + header.page-toc.anchors.class: + toggleable: true + type: text + label: PLUGIN_PAGE_TOC.ANCHORS_CLASS + help: PLUGIN_PAGE_TOC.ANCHORS_CLASS_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.class'] + header.page-toc.anchors.icon: + toggleable: true + type: text + label: PLUGIN_PAGE_TOC.ANCHORS_ICON + help: PLUGIN_PAGE_TOC.ANCHORS_ICON_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.icon'] + size: x-small + header.page-toc.anchors.position: + toggleable: true + type: select + label: PLUGIN_PAGE_TOC.ANCHORS_POSITION + help: PLUGIN_PAGE_TOC.ANCHORS_POSITION_HELP + size: small + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.position'] + options: + before: PLUGIN_PAGE_TOC.BEFORE_TEXT + after: PLUGIN_PAGE_TOC.AFTER_TEXT + header.page-toc.anchors.slug_maxlen: + toggleable: true + type: number + label: PLUGIN_PAGE_TOC.SLUG_MAXLEN + help: PLUGIN_PAGE_TOC.SLUG_MAXLEN_HELP + size: x-small + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.slug_maxlen'] + append: 'chars' + header.page-toc.anchors.slug_prefix: + toggleable: true + type: text + label: PLUGIN_PAGE_TOC.SLUG_PREFIX + help: PLUGIN_PAGE_TOC.SLUG_PREFIX_HELP + data-default@: ['\Grav\Plugin\PageTOCPlugin::configVar', 'anchors.slug_prefix'] \ No newline at end of file diff --git a/plugins/page-toc/classes/HtmlHelper.php b/plugins/page-toc/classes/HtmlHelper.php new file mode 100644 index 0000000..14b9b26 --- /dev/null +++ b/plugins/page-toc/classes/HtmlHelper.php @@ -0,0 +1,89 @@ + + * + * Licensed under MIT, see LICENSE. + */ + +declare(strict_types=1); + +namespace Grav\Plugin\PageToc; + +use ArrayIterator; +use DOMDocument; +use DomElement; +use DOMXPath; + +/** + * Trait that helps with HTML-related operations + * + * @package TOC + */ +trait HtmlHelper +{ + protected function getHTMLParser($markup) + { + libxml_use_internal_errors(true); + $domDocument = new \DOMDocument(); + $domDocument->loadHTML(mb_convert_encoding("$markup", 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); + $domDocument->preserveWhiteSpace = true; + return $domDocument; + } + + /** + * Convert a topLevel and depth to H1..H6 tags array + * + * @param int $topLevel + * @param int $depth + * @return array|string[] Array of header tags; ex: ['h1', 'h2', 'h3'] + */ + protected function determineHeaderTags(int $topLevel, int $depth): array + { + $desired = range((int) $topLevel, (int) $topLevel + ((int) $depth - 1)); + $allowed = [1, 2, 3, 4, 5, 6]; + + return array_map(function ($val) { + return 'h' . $val; + }, array_intersect($desired, $allowed)); + } + + + + /** + * Traverse Header Tags in DOM Document + * + * @param DOMDocument $domDocument + * @param int $topLevel + * @param int $depth + * @return ArrayIterator + */ + protected function traverseHeaderTags(DOMDocument $domDocument, int $topLevel, int $depth): ArrayIterator + { + $xQueryResults = new DOMXPath($domDocument); + + $xpathQuery = sprintf( + "//*[%s]", + implode(' or ', array_map(function ($v) { + return sprintf('local-name() = "%s"', $v); + }, $this->determineHeaderTags($topLevel, $depth))) + ); + + $nodes = []; + $xQueryResults = $xQueryResults->query($xpathQuery); + + if ($xQueryResults) { + foreach ($xQueryResults as $node) { + $nodes[] = $node; + } + return new ArrayIterator($nodes); + } else { + return new ArrayIterator([]); + } + } +} diff --git a/plugins/page-toc/classes/MarkupFixer.php b/plugins/page-toc/classes/MarkupFixer.php new file mode 100644 index 0000000..ceef666 --- /dev/null +++ b/plugins/page-toc/classes/MarkupFixer.php @@ -0,0 +1,82 @@ + + * + * Licensed under MIT, see LICENSE. + */ + +declare(strict_types=1); + +namespace Grav\Plugin\PageToc; + +use DOMElement; +use RuntimeException; +use Cocur\Slugify\SlugifyInterface; + +/** + * TOC Markup Fixer adds `id` attributes to all H1...H6 tags where they do not + * already exist + * + * @author Casey McLaughlin + */ +class MarkupFixer +{ + use HtmlHelper; + + /** + * Fix markup + * + * @param string $markup + * @param int $start + * @param int $depth + * @param array $options + * @return string Markup with added IDs + * @throws RuntimeException + */ + public function fix(string $markup, array $options = []): ?string + { + $start = (int) $options['start'] ?? 1; + $depth = (int) $options['depth'] ?? 6; + $domDocument = $this->getHTMLParser($markup); + $slugger = new UniqueSlugify(); + + /** @var DOMElement $node */ + foreach ($this->traverseHeaderTags($domDocument, $start, $depth) as $node) { + if ($node->getAttribute('id')) { + $slug = $node->getAttribute('id'); + } else { + $slug = $slugger->slugify($node->getAttribute('title') ?: $node->textContent, $options); + } + + $node->setAttribute('id', $slug); + + if ($options['hclass']) { + $class = $node->getAttribute('class'); + $node->setAttribute('class', trim("$class {$options['hclass']}")); + } + + if ($options['link']) { + $link = $domDocument->createElement("a"); + $class = isset($options['class']) ? " {$options['class']}" : ""; + $link->setAttribute('href', "#$slug"); + $link->setAttribute('class', "toc-anchor {$options['position']}$class"); + $link->setAttribute('data-anchor-icon', $options['icon']); + $link->setAttribute('aria-label', $options['aria']); + if ($options['position'] == 'after') { + $node->appendChild($link); + } else { + $node->insertBefore($link, $node->firstChild); + } + } + } + + $markup = $domDocument->saveHTML($domDocument->getElementsByTagName('page-toc')->item(0)); + return str_replace(['', ''], '', $markup); + } +} diff --git a/plugins/page-toc/classes/OrderedListRenderer.php b/plugins/page-toc/classes/OrderedListRenderer.php new file mode 100644 index 0000000..f44e58a --- /dev/null +++ b/plugins/page-toc/classes/OrderedListRenderer.php @@ -0,0 +1,68 @@ + + * + * Licensed under MIT, see LICENSE. + */ + +declare(strict_types=1); + +namespace Grav\Plugin\PageToc; + +use Knp\Menu\ItemInterface; +use Knp\Menu\Renderer\ListRenderer; + +use function str_repeat; + +/** + * Class OrderedListRenderer + * + * @package TOC + */ +class OrderedListRenderer extends ListRenderer +{ + /** + * @param ItemInterface $item + * @param array $attributes + * @param array $options + * @return string + */ + protected function renderList(ItemInterface $item, array $attributes, array $options): string + { + if (!$item->hasChildren() || 0 === $options['depth'] || !$item->getDisplayChildren()) { + return ''; + } + + $html = $this->format( + 'renderHtmlAttributes($attributes) . '>', + 'ol', + $item->getLevel(), + $options + ); + + $html .= $this->renderChildren($item, $options); + $html .= $this->format('', 'ol', $item->getLevel(), $options); + + return $html; + } + + /** + * @param string $html + * @param string $type + * @param int $level + * @param array $options + * @return string + */ + protected function format(string $html, string $type, int $level, array $options): string + { + return $type === 'ol' + ? str_repeat(' ', $level * 4) . $html . "\n" + : parent::format($html, $type, $level, $options); + } +} diff --git a/plugins/page-toc/classes/TocGenerator.php b/plugins/page-toc/classes/TocGenerator.php new file mode 100644 index 0000000..7621835 --- /dev/null +++ b/plugins/page-toc/classes/TocGenerator.php @@ -0,0 +1,179 @@ + + * + * Licensed under MIT, see LICENSE. + */ + +declare(strict_types=1); + +namespace Grav\Plugin\PageToc; + +use Knp\Menu\ItemInterface; +use Knp\Menu\Matcher\Matcher; +use Knp\Menu\MenuFactory; +use Knp\Menu\MenuItem; +use Knp\Menu\Renderer\ListRenderer; +use Knp\Menu\Renderer\RendererInterface; + +/** + * Table Of Contents Generator generates TOCs from HTML Markup + * + * @author Casey McLaughlin + */ +class TocGenerator +{ + use HtmlHelper; + + private const DEFAULT_NAME = 'TOC'; + + /** + * @var MenuFactory + */ + private $menuFactory; + + /** + * Constructor + */ + public function __construct() + { + $this->menuFactory = new MenuFactory(); + } + + /** + * Get Menu + * + * Returns a KNP Menu object, which can be traversed or rendered + * + * @param string $markup Content to get items fro $this->getItems($markup, $topLevel, $depth)m + * @param int $topLevel Top Header (1 through 6) + * @param int $depth Depth (1 through 6) + * @return ItemInterface KNP Menu + */ + public function getMenu(string $markup, int $topLevel = 1, int $depth = 6): ItemInterface + { + $menu = $this->menuFactory->createItem(static::DEFAULT_NAME); + + if (trim($markup) == '') { + return $menu; + } + + $tagsToMatch = $this->determineHeaderTags($topLevel, $depth); + $lastElem = $menu; + + $domDocument = $this->getHTMLParser($markup); + + foreach ($this->traverseHeaderTags($domDocument, $topLevel, $depth) as $i => $node) { + if (! $node->hasAttribute('id')) { + continue; + } + + $tagName = $node->tagName; + $level = array_search(strtolower($tagName), $tagsToMatch) + 1; + + /** @var MenuItem $parent */ + if ($level == 1) { + $parent = $menu; + } elseif ($level == $lastElem->getLevel()) { + $parent = $lastElem->getParent(); + } elseif ($level > $lastElem->getLevel()) { + $parent = $lastElem; + for ($i = $lastElem->getLevel(); $i < ($level - 1); $i++) { + $parent = $parent->addChild(''); + } + } else { //if ($level < $lastElem->getLevel()) + $parent = $lastElem->getParent(); + while ($parent->getLevel() > $level - 1) { + $parent = $parent->getParent(); + } + } + + $lastElem = $parent->addChild( + $node->getAttribute('id'), + [ + 'label' => $node->getAttribute('title') ?: $node->textContent, + 'uri' => '#' . $node->getAttribute('id') + ] + ); + } + + return $this->trimMenu($menu); + } + + /** + * Trim empty items from the menu + * + * @param ItemInterface $menuItem + * @return ItemInterface + */ + protected function trimMenu(ItemInterface $menuItem): ItemInterface + { + // if any of these circumstances are true, then just bail and return the menu item + if ( + count($menuItem->getChildren()) === 0 + or count($menuItem->getChildren()) > 1 + or ! empty($menuItem->getFirstChild()->getLabel()) + ) { + return $menuItem; + } + + // otherwise, find the first level where there is actual content and use that. + while (count($menuItem->getChildren()) == 1 && empty($menuItem->getFirstChild()->getLabel())) { + $menuItem = $menuItem->getFirstChild(); + } + + return $menuItem; + } + + /** + * Get HTML menu in unordered list form + * + * @param string $markup Content to get items from + * @param int $topLevel Top Header (1 through 6) + * @param int $depth Depth (1 through 6) + * @param RendererInterface|null $renderer + * @param bool $ordered + * @return string HTML

  • items + */ + public function getHtmlMenu( + string $markup, + int $topLevel = 1, + int $depth = 6, + ?RendererInterface $renderer = null, + bool $ordered = false + ): string { + if (! $renderer) { + $options = ['currentClass' => 'active', 'ancestorClass' => 'active_ancestor']; + $renderer = $ordered + ? new OrderedListRenderer(new Matcher(), $options) + : new ListRenderer(new Matcher(), $options); + } + + $menu = $this->getMenu($markup, $topLevel, $depth); + return $renderer->render($menu); + } + + /** + * Get HTML menu in ordered list form + * + * @param string $markup Content to get items from + * @param int $topLevel Top Header (1 through 6) + * @param int $depth Depth (1 through 6) + * @param RendererInterface|null $renderer + * @return string HTML
  • items + */ + public function getOrderedHtmlMenu( + string $markup, + int $topLevel = 1, + int $depth = 6, + RendererInterface $renderer = null + ): string { + return $this->getHtmlMenu($markup, $topLevel, $depth, $renderer, true); + } +} diff --git a/plugins/page-toc/classes/UniqueSlugify.php b/plugins/page-toc/classes/UniqueSlugify.php new file mode 100644 index 0000000..9c15acd --- /dev/null +++ b/plugins/page-toc/classes/UniqueSlugify.php @@ -0,0 +1,74 @@ + + * + * Licensed under MIT, see LICENSE. + */ + +declare(strict_types=1); + +namespace Grav\Plugin\PageToc; + +use Cocur\Slugify\Slugify; +use Cocur\Slugify\SlugifyInterface; + +/** + * UniqueSluggify creates slugs from text without repeating the same slug twice per instance + */ +class UniqueSlugify implements SlugifyInterface +{ + protected $slugify; + protected $used; + + protected $options; + + /** + * Constructor + * + * @param SlugifyInterface|null $slugify + */ + public function __construct() + { + $this->used = array(); + $this->slugify = new Slugify(); + } + + /** + * Slugify + * + * @param string $text + * @param array|null $options + * @return string + */ + public function slugify($text, $options = null): string + { + $slugged = $this->slugify->slugify($text, $options); + + $maxlen = $options['maxlen'] ?? null; + $prefix = $options['prefix'] ?? null; + + if (is_int($maxlen) && strlen($slugged) > $maxlen) { + $slugged = substr($slugged, 0, $maxlen); + } + + if (isset($prefix)) { + $slugged = $prefix . $slugged; + } + + $count = 1; + $orig = $slugged; + while (in_array($slugged, $this->used)) { + $slugged = $orig . '-' . $count; + $count++; + } + + $this->used[] = $slugged; + return $slugged; + } +} diff --git a/plugins/page-toc/classes/shortcodes/AnchorShortcode.php b/plugins/page-toc/classes/shortcodes/AnchorShortcode.php new file mode 100644 index 0000000..4702951 --- /dev/null +++ b/plugins/page-toc/classes/shortcodes/AnchorShortcode.php @@ -0,0 +1,51 @@ +shortcode->getRawHandlers()->add('anchor', function(ProcessedShortcode $sc) { + + $id = $this->cleanParam($sc->getParameter('id', $sc->getBbCode())); + $tag = $this->cleanParam($sc->getParameter('tag')); + $prefix = $this->cleanParam($sc->getParameter('prefix', PageTOCPlugin::configVar('anchors.slug_prefix'))); + $class = $this->cleanParam($sc->getParameter('class', 'inline-anchor')); + $aria = PageTOCPlugin::configVar('anchors.aria'); + $content = $sc->getContent(); + + $slugger = new UniqueSlugify(); + + if (is_null($id)) { + $id = $slugger->slugify(strip_tags($content)); + } + + if (isset($prefix)) { + $id = $prefix . $id; + } + + if ($tag) { + $output = "<$tag id=\"$id\" class=\"$class\">$content"; + } else { + $output = "$content"; + } + + return $output; + }); + $this->shortcode->getRawHandlers()->addAlias('#', 'anchor'); + } + + /** + * @param $param + * @return string + */ + protected function cleanParam($param) + { + return trim(html_entity_decode($param), '"'); + } +} \ No newline at end of file diff --git a/plugins/page-toc/composer.json b/plugins/page-toc/composer.json new file mode 100644 index 0000000..419b2fd --- /dev/null +++ b/plugins/page-toc/composer.json @@ -0,0 +1,31 @@ +{ + "name": "trilbymedia/page-toc", + "type": "grav-plugin", + "description": "Page TOC plugin", + "keywords": ["plugin"], + "homepage": "https://github.com/trilbymedia/grav-plugin-page-toc", + "license": "MIT", + "authors": [ + { + "name": "Trilby Media", + "email": "hello@trilby.media", + "role": "Developer" + } + ], + "require": { + "cocur/slugify": "^3.0|^4.0", + "knplabs/knp-menu": "^3.2", + "php": ">=7.3.6" + }, + "autoload": { + "psr-4": { + "Grav\\Plugin\\PageToc\\": "classes/" + }, + "classmap": ["page-toc.php"] + }, + "config": { + "platform": { + "php": "7.3.6" + } + } +} diff --git a/plugins/page-toc/composer.lock b/plugins/page-toc/composer.lock new file mode 100644 index 0000000..7c20d25 --- /dev/null +++ b/plugins/page-toc/composer.lock @@ -0,0 +1,170 @@ +{ + "_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": "8a2c6e66a1071ca85fae3951c0161cee", + "packages": [ + { + "name": "cocur/slugify", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/3f1ffc300f164f23abe8b64ffb3f92d35cec8307", + "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "~5.1", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "phpunit/phpunit": "^5.7.27", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/master" + }, + "time": "2019-12-14T13:04:14+00:00" + }, + { + "name": "knplabs/knp-menu", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenu.git", + "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", + "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "conflict": { + "twig/twig": "<1.40 || >=2,<2.9" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.3", + "symfony/routing": "^4.4 || ^5.0 || ^6.0", + "twig/twig": "^1.40 || ^2.9 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Knp\\Menu\\": "src/Knp/Menu" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + } + ], + "description": "An object oriented menu library", + "homepage": "https://knplabs.com", + "keywords": [ + "menu", + "tree" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenu/issues", + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.3.0" + }, + "time": "2021-10-23T15:01:04+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.3.6" + }, + "platform-dev": [], + "platform-overrides": { + "php": "7.3.6" + }, + "plugin-api-version": "2.1.0" +} diff --git a/plugins/page-toc/languages.yaml b/plugins/page-toc/languages.yaml new file mode 100644 index 0000000..0ec73f8 --- /dev/null +++ b/plugins/page-toc/languages.yaml @@ -0,0 +1,38 @@ +de: + PLUGIN_PAGE_TOC: + TABLE_OF_CONTENTS: Inhaltsverzeichnis +en: + PLUGIN_PAGE_TOC: + TABLE_OF_CONTENTS: Table of Contents + INCLUDE_CSS: 'Include CSS' + ACTIVE_BY_DEFAULT: 'Anchors generated by default' + ACTIVE_BY_DEFAULT_PAGE: 'Anchors generated for this page' + ACTIVE_BY_DEFAULT_PAGE_HELP: 'If the default setting is disabled, you can enable on this page, or vice versa' + TOC_SECTION: 'Table of Contents Configuration' + START_TOC_HEADERS: 'Start TOC headers' + START_TOC_HEADERS_HELP: 'The Header level to start the TOC from' + DEPTH_TOC_HEADERS: 'Depth of TOC headers' + DEPTH_TOC_HEADERS_HELP: 'The number of headers levels from the ''start'' to include in the TOC' + HEADER_CSS_CLASSES: 'Header CSS classes' + HEADER_CSS_CLASSES_HELP: 'Any custom classes to add to the header tags when IDs for slugs are added' + ANCHORS_SECTION: 'Anchors Configuration' + START_ANCHOR_HEADERS: 'Start Anchor headers' + DEPTH_ANCHOR_HEADERS: 'Depth of Anchor headers' + LINK_ANCHOR_HEADERS: 'Link Anchors' + ARIA_LABEL: 'Aria Label' + ANCHORS_CLASS: 'Custom CSS classes for anchors' + ANCHORS_CLASS_HELP: 'Any custom classes to add to the anchor tags' + ANCHORS_ICON: 'Anchor icon symbol' + ANCHORS_ICON_HELP: 'Can be any text character, symbol, unicode character or even emjoi. leave blank if you intend to style with CSS.' + ANCHORS_POSITION: 'Anchor Position' + ANCHORS_POSITION_HELP: 'Position to put the anchor, `before|after`' + ANCHORS_COPY_TO_CLIPBOARD: 'Copy to Clipboard' + ANCHORS_COPY_TO_CLIPBOARD_HELP: 'When clicking an anchor, it will also copy to clipboard the full URL. Convenient for sharing/opening in new tab' + BEFORE_TEXT: 'Before text' + AFTER_TEXT: 'After text' + SLUG_MAXLEN: 'Slug max-length' + SLUG_MAXLEN_HELP: 'Max length of slugs used for anchors' + SLUG_PREFIX: 'Slug prefix' + SLUG_PREFIX_HELP: 'A prefix used in front of generated slugs' + PAGE_ANCHORS_SECTION: 'Page Anchors Configuration' + COPY_TO_CLIPBOARD: 'Copy to Clipboard' diff --git a/plugins/page-toc/page-toc.php b/plugins/page-toc/page-toc.php new file mode 100644 index 0000000..f694fc8 --- /dev/null +++ b/plugins/page-toc/page-toc.php @@ -0,0 +1,222 @@ + ['onPluginsInitialized', 0] + ]; + } + + /** + * Composer autoload + * + * @return ClassLoader + */ + public function autoload(): ClassLoader + { + return require __DIR__ . '/vendor/autoload.php'; + } + + /** + * Initialize the plugin + */ + public function onPluginsInitialized() + { + // Don't proceed if we are in the admin plugin + if ($this->isAdmin()) { + $this->enable([ + 'onBlueprintCreated' => ['onBlueprintCreated', 0], + ]); + return; + } + + // Enable the main event we are interested in + $this->enable([ + 'onShortcodeHandlers' => ['onShortcodeHandlers', 0], + 'onTwigInitialized' => ['onTwigInitialized', 0], + 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0], + 'onTwigSiteVariables' => ['onTwigSiteVariables', 0], + 'onPageContentProcessed' => ['onPageContentProcessed', -20], + ]); + } + + public function onShortcodeHandlers() + { + $this->grav['shortcode']->registerAllShortcodes(__DIR__ . '/classes/shortcodes'); + } + + public function onPageContentProcessed(Event $event) + { + /** @var PageInterface $page */ + $page = $event['page']; + + $content = $page->content(); + $shortcode_exists = preg_match($this->toc_regex, $content); + $active = $this->configVar('active', $page, false); + + // Set ID anchors if needed + if ($active || $shortcode_exists) { + $this->registerTwigFunctions(); + $markup_fixer = new MarkupFixer(); + $content = $markup_fixer->fix($content, $this->getAnchorOptions($page)); + $page->setRawContent($content); + } + + // Replace shortcode if found + if ($shortcode_exists) { + $toc = $this->grav['twig']->processTemplate('components/page-toc.html.twig', ['page' => $page, 'active' => true]); + $content = preg_replace($this->toc_regex, $toc, $content); + $page->setRawContent($content); + } + } + + public function onTwigInitialized() + { + $this->registerTwigFunctions(); + } + + public function onTwigSiteVariables() + { + if ($this->grav['config']->get('plugins.page-toc.include_css')) { + $this->grav['assets']->addCss('plugin://page-toc/assets/page-toc-anchors.css'); + } + if ($this->grav['config']->get('plugins.page-toc.anchors.copy_to_clipboard')) { + $this->grav['assets']->addJs('plugin://page-toc/assets/page-toc-anchors.js', ['group' => 'bottom', 'defer' => 'defer']); + } + } + + public function registerTwigFunctions() + { + static $functions_registered; + + if ($functions_registered) { + return; + } + + $this->generator = new TocGenerator(); + $this->fixer = new MarkupFixer(); + $twig = $this->grav['twig']->twig(); + + $twig->addFunction(new TwigFunction('toc', function ($markup, $start = null, $depth = null) { + $options = $this->getTocOptions(null, $start, $depth); + return $this->generator->getHtmlMenu($markup, $options['start'], $options['depth']); + }, ['is_safe' => ['html']])); + + $twig->addFunction(new TwigFunction('toc_ordered', function ($markup, $start = null, $depth = null) { + $options = $this->getTocOptions(null, $start, $depth); + return $this->generator->getHtmlMenu($markup, $options['start'], $options['depth'], null, true); + }, ['is_safe' => ['html']])); + + $twig->addFunction(new TwigFunction('toc_items', function ($markup, $start = null, $depth = null) { + $options = $this->getTocOptions(null, $start, $depth); + return $this->generator->getMenu($markup, $options['start'], $options['depth']); + })); + + $twig->addFunction(new TwigFunction('add_anchors', function ($markup, $start = null, $depth = null) { + $options = $this->getAnchorOptions(null, $start, $depth); + return $this->fixer->fix($markup, $options); + }, ['is_safe' => ['html']])); + + $twig->addFunction(new TwigFunction('toc_config_var', function ($var) { + return static::configVar($var); + })); + + $functions_registered = true; + } + + public function onTwigTemplatePaths() + { + $this->grav['twig']->twig_paths[] = __DIR__ . '/templates'; + } + + /** + * Extend page blueprints with TOC options. + * + * @param Event $event + */ + public function onBlueprintCreated(Event $event) + { + static $inEvent = false; + + /** @var Data\Blueprint $blueprint */ + $blueprint = $event['blueprint']; + $form = $blueprint->form(); + + $advanced_tab_exists = isset($form['fields']['tabs']['fields']['advanced']); + + if (!$inEvent && $advanced_tab_exists) { + $inEvent = true; + $blueprints = new Data\Blueprints(__DIR__ . '/blueprints/'); + $extends = $blueprints->get('page-toc'); + $blueprint->extend($extends, true); + $inEvent = false; + } + } + + protected function getTocOptions(PageInterface $page = null, $start = null, $depth = null): array + { + $page = $page ?? $this->grav['page']; + return [ + 'start' => $start ?? $this->configVar('start', $page,1), + 'depth' => $depth ?? $this->configVar('depth', $page,6), + ]; + } + + protected function getAnchorOptions(PageInterface $page = null, $start = null, $depth = null): array + { + $page = $page ?? $this->grav['page']; + return [ + 'start' => (int) ($start ?? $this->configVar('anchors.start', $page,1)), + 'depth' => (int) ($depth ?? $this->configVar('anchors.depth', $page,6)), + 'hclass' => $this->configVar('hclass', $page,null), + 'link' => $this->configVar('anchors.link', $page,true), + 'position' => $this->configVar('anchors.position', $page,'before'), + 'aria' => $this->configVar('anchors.aria', $page,'Anchor'), + 'icon' => $this->configVar('anchors.icon', $page,'#'), + 'class' => $this->configVar('anchors.class', $page,null), + 'maxlen' => (int) ($this->configVar('anchors.slug_maxlen', $page,null)), + 'prefix' => $this->configVar('anchors.slug_prefix', $page,null), + ]; + } + + public static function configVar($var, $page = null, $default = null) + { + return Plugin::inheritedConfigOption('page-toc', $var, $page, $default); + } +} diff --git a/plugins/page-toc/page-toc.yaml b/plugins/page-toc/page-toc.yaml new file mode 100644 index 0000000..da89e23 --- /dev/null +++ b/plugins/page-toc/page-toc.yaml @@ -0,0 +1,17 @@ +enabled: true # Plugin enabled +include_css: true # Include CSS +active: true # Anchor IDs processed and generated for all pages +start: 1 # Start header tag level (1 = h1) for TOC +depth: 6 # Depth from start (2 = 2 levels deep) for TOC +hclass: # Custom Header TOC styling classes +anchors: # Anchor configuration + start: 1 # Start header tag level (1 = h1) + depth: 6 # Depth from start (2 = 2 levels deep) + link: true # Enabled auto-generation of clickable link with fragment + aria: Anchor # Aria label to use + class: # Custom Header anchor styling classes + icon: '#' # Icon to use, can be a symbol, emoji, ascii etc. + position: after # Position to put the anchor, `before|after` + copy_to_clipboard: false # Copy to clipboard functionality + slug_maxlen: 25 # Max length of slugs used for anchors + slug_prefix: # A prefix used in front of generated slugs diff --git a/plugins/page-toc/templates/components/page-toc.html.twig b/plugins/page-toc/templates/components/page-toc.html.twig new file mode 100644 index 0000000..00cf24e --- /dev/null +++ b/plugins/page-toc/templates/components/page-toc.html.twig @@ -0,0 +1,26 @@ +{% macro toc_loop(items) %} + {% import _self as self %} + {% for item in items %} + {% set class = loop.first ? 'first' : loop.last ? 'last' : null %} +
  • + {{ item.label }} + {% if item.children|length > 0 %} +
      + {{ _self.toc_loop(item.children) }} +
    + {% endif %} +
  • + {% endfor %} +{% endmacro %} + +{% if active or toc_config_var('active') %} +
    + {% set table_of_contents = toc_items(page.content) %} + {% if table_of_contents is not empty %} +

    {{ 'PLUGIN_PAGE_TOC.TABLE_OF_CONTENTS'|t }}

    +
      + {{ _self.toc_loop(table_of_contents.children) }} +
    + {% endif %} +
    +{% endif %} \ No newline at end of file diff --git a/plugins/page-toc/vendor/autoload.php b/plugins/page-toc/vendor/autoload.php new file mode 100644 index 0000000..dd3f5fe --- /dev/null +++ b/plugins/page-toc/vendor/autoload.php @@ -0,0 +1,7 @@ + Converts a string into a slug. + +[![Build Status](https://img.shields.io/travis/cocur/slugify.svg?style=flat)](https://travis-ci.org/cocur/slugify) +[![Windows Build status](https://ci.appveyor.com/api/projects/status/9yv498ff61byp742?svg=true)](https://ci.appveyor.com/project/florianeckerstorfer/slugify) +[![Scrutinizer Quality Score](https://img.shields.io/scrutinizer/g/cocur/slugify.svg?style=flat)](https://scrutinizer-ci.com/g/cocur/slugify/) +[![Code Coverage](https://scrutinizer-ci.com/g/cocur/slugify/badges/coverage.png?b=master&style=flat-square)](https://scrutinizer-ci.com/g/cocur/slugify/?branch=master) + +[![Latest Release](https://img.shields.io/packagist/v/cocur/slugify.svg)](https://packagist.org/packages/cocur/slugify) +[![MIT License](https://img.shields.io/packagist/l/cocur/slugify.svg)](http://opensource.org/licenses/MIT) +[![Total Downloads](https://img.shields.io/packagist/dt/cocur/slugify.svg)](https://packagist.org/packages/cocur/slugify) + +Developed by [Florian Eckerstorfer](https://florian.ec) in Vienna, Europe with the help of +[many great contributors](https://github.com/cocur/slugify/graphs/contributors). + +## Features + +- Removes all special characters from a string. +- Provides custom replacements for Arabic, Austrian, Azerbaijani, Brazilian Portuguese, Bulgarian, Burmese, Chinese, Croatian, Czech, Esperanto, Estonian, Finnish, French, Georgian, German, Greek, Hindi, Hungarian, Italian, Latvian, Lithuanian, Macedonian, Norwegian, Polish, Romanian, Russian, Serbian, Spanish, Swedish, Turkish, Ukrainian and Vietnamese special characters. Instead of removing these characters, Slugify approximates them (e.g., `ae` replaces `ä`). +- No external dependencies. +- PSR-4 compatible. +- Compatible with PHP >= 7. +- Integrations for [Symfony (3, 4 and 5)](http://symfony.com), [Laravel](http://laravel.com), [Twig (2 and 3)](http://twig.sensiolabs.org), [Zend Framework 2](http://framework.zend.com/), [Nette Framework](http://nette.org/), [Latte](http://latte.nette.org/) and [Plum](https://github.com/plumphp/plum). + +## Installation + +You can install Slugify through [Composer](https://getcomposer.org): + +```shell +$ composer require cocur/slugify +``` + +Slugify requires the Multibyte String extension from PHP. Typically you can use the configure option `--enable-mbstring` while compiling PHP. More information can be found in the [PHP documentation](http://php.net/manual/en/mbstring.installation.php). + +Further steps may be needed for [integrations](#integrations). + +## Usage + +Generate a slug: + +```php +use Cocur\Slugify\Slugify; + +$slugify = new Slugify(); +echo $slugify->slugify('Hello World!'); // hello-world +``` + +You can also change the separator used by `Slugify`: + +```php +echo $slugify->slugify('Hello World!', '_'); // hello_world +``` + +The library also contains `Cocur\Slugify\SlugifyInterface`. Use this interface whenever you need to type hint an +instance of `Slugify`. + +To add additional transliteration rules you can use the `addRule()` method. + +```php +$slugify->addRule('i', 'ey'); +echo $slugify->slugify('Hi'); // hey +``` + +### Rulesets + +Many of the transliterations rules used in Slugify are specific to a language. These rules are therefore categorized +using rulesets. Rules for the most popular are activated by default in a specific order. You can change which rulesets +are activated and the order in which they are activated. The order is important when there are conflicting rules in +different languages. For example, in German `ä` is transliterated with `ae`, in Turkish the correct transliteration is +`a`. By default the German transliteration is used since German is used more often on the internet. If you want to use +prefer the Turkish transliteration you have to possibilities. You can activate it after creating the constructor: + +```php +$slugify = new Slugify(); +$slugify->slugify('ä'); // -> "ae" +$slugify->activateRuleSet('turkish'); +$slugify->slugify('ä'); // -> "a" +``` + +An alternative way would be to pass the rulesets and their order to the constructor. + +```php +$slugify = new Slugify(['rulesets' => ['default', 'turkish']]); +$slugify->slugify('ä'); // -> "a" +``` + +You can find a list of the available rulesets in [Resources/rules](https://github.com/cocur/slugify/tree/master/Resources/rules). + +### More options + +The constructor takes an options array, you have already seen the `rulesets` options above. You can also change the +regular expression that is used to replace characters with the separator. + +```php +$slugify = new Slugify(['regexp' => '/([^A-Za-z0-9]|-)+/']); +``` + +_(The regular expression used in the example above is the default one.)_ + +By default Slugify will convert the slug to lowercase. If you want to preserve the case of the string you can set the +`lowercase` option to false. + +```php +$slugify = new Slugify(['lowercase' => false]); +$slugify->slugify('Hello World'); // -> "Hello-World" +``` + +Lowercasing is done before using the regular expression. If you want to keep the lowercasing behavior but your regular +expression needs to match uppercase letters, you can set the `lowercase_after_regexp` option to `true`. + +```php +$slugify = new Slugify([ + 'regexp' => '/(?<=[[:^upper:]])(?=[[:upper:]])/', + 'lowercase_after_regexp' => false, +]); +$slugify->slugify('FooBar'); // -> "foo-bar" +``` + +By default Slugify will use dashes as separators. If you want to use a different default separator, you can set the +`separator` option. + +```php +$slugify = new Slugify(['separator' => '_']); +$slugify->slugify('Hello World'); // -> "hello_world" +``` + +By default Slugify will remove leading and trailing separators before returning the slug. If you do not want the slug to +be trimmed you can set the `trim` option to false. + +```php +$slugify = new Slugify(['trim' => false]); +$slugify->slugify('Hello World '); // -> "hello-world-" +``` + +### Changing options on the fly + +You can overwrite any of the above options on the fly by passing an options array as second argument to the `slugify()` +method. For example: + +```php +$slugify = new Slugify(); +$slugify->slugify('Hello World', ['lowercase' => false]); // -> "Hello-World" +``` + +You can also modify the separator this way: + +```php +$slugify = new Slugify(); +$slugify->slugify('Hello World', ['separator' => '_']); // -> "hello_world" +``` + +You can even activate a custom ruleset without touching the default rules: + +```php +$slugify = new Slugify(); +$slugify->slugify('für', ['ruleset' => 'turkish']); // -> "fur" +$slugify->slugify('für'); // -> "fuer" +``` + +### Contributing + +We really appreciate if you report bugs and errors in the transliteration, especially if you are a native speaker of +the language and question. Feel free to ask for additional languages in the issues, but please note that the +maintainer of this repository does not speak all languages. If you can provide a Pull Request with rules for +a new language or extend the rules for an existing language that would be amazing. + +To add a new language you need to: + +1. Create a `[language].json` in `Resources/rules` +2. If you believe the language should be a default ruleset you can add the language to + `Cocur\Slugify\Slugify::$options`. If you add the language there all existing tests still have to pass +3. Run `php bin/generate-default.php` +4. Add tests for the language in `tests/SlugifyTest.php`. If the language is in the default ruleset add your + test cases to `defaultRuleProvider()`, otherwise to `customRulesProvider()`. + +Submit PR. Thank you very much. 💚 + +### Code of Conduct + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +The full Code of Conduct can be found [here](https://github.com/cocur/slugify/blob/master/CODE_OF_CONDUCT.md). + +This project is no place for hate. If you have any problems please contact Florian: [florian@eckerstorfer.net](mailto:florian@eckerstorfer.net) ✌🏻🏳️‍🌈 + +### Further information + +- [API docs](http://cocur.co/slugify/api/master/) + +## Integrations + +### Symfony + +Slugify contains a Symfony bundle and service definition that allow you to use it as a service in your Symfony application. The code resides in `Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle` and you only need to activate it: + +#### Symfony 2 + +Support for Symfony 2 has been dropped in Slugify 4.0.0, use `cocur/slugify@3`. + +#### Symfony 3 + +```php +// app/AppKernel.php + +class AppKernel extends Kernel +{ + public function registerBundles() + { + $bundles = array( + // ... + new Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle(), + ); + } +} +``` + +#### Symfony >= 4 + +```php +// config/bundles.php + +return [ + // ... + Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle::class => ['all' => true], +]; +``` + +You can now use the `cocur_slugify` service everywhere in your application, for example, in your controller: + +```php +$slug = $this->get('cocur_slugify')->slugify('Hello World!'); +``` + +The bundle also provides an alias `slugify` for the `cocur_slugify` service: + +```php +$slug = $this->get('slugify')->slugify('Hello World!'); +``` + +If you use `autowire` (Symfony >=3.3), you can inject it into your services like this: + +```php +public function __construct(\Cocur\Slugify\SlugifyInterface $slugify) +``` + +You can set the following configuration settings in `config.yml` to adjust the slugify service: + +```yaml +cocur_slugify: + lowercase: + separator: + regexp: + rulesets: {} # List of rulesets: https://github.com/cocur/slugify/tree/master/Resources/rules +``` + +### Twig + +If you use the Symfony framework with Twig you can use the Twig filter `slugify` in your templates after you have setup +Symfony integrations (see above). + +```twig +{{ 'Hällo Wörld'|slugify }} +``` + +If you use Twig outside of the Symfony framework you first need to add the extension to your environment: + +```php +use Cocur\Slugify\Bridge\Twig\SlugifyExtension; +use Cocur\Slugify\Slugify; + +$twig = new Twig_Environment($loader); +$twig->addExtension(new SlugifyExtension(Slugify::create())); +``` + +To use the Twig filter with [TwigBridge](https://github.com/rcrowe/TwigBridge) for Laravel, you'll need to add the +Slugify extension using a closure: + +```php +// laravel/app/config/packages/rcrowe/twigbridge/config.php + +'extensions' => array( + //... + function () { + return new \Cocur\Slugify\Bridge\Twig\SlugifyExtension(\Cocur\Slugify\Slugify::create()); + }, +), +``` + +You can find more information about registering extensions in the +[Twig documentation](http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension). + +### Mustache.php + +We don't need an additional integration to use Slugify in [Mustache.php](https://github.com/bobthecow/mustache.php). +If you want to use Slugify in Mustache, just add a helper: + +```php +use Cocur\Slugify\Slugify; + +$mustache = new Mustache_Engine(array( + // ... + 'helpers' => array('slugify' => function($string, $separator = null) { + return Slugify::create()->slugify($string, $separator); + }), +)); +``` + +### Laravel + +Slugify also provides a service provider to integrate into Laravel (versions 4.1 and later). + +In your Laravel project's `app/config/app.php` file, add the service provider into the "providers" array: + +```php +'providers' => array( + "Cocur\Slugify\Bridge\Laravel\SlugifyServiceProvider", +) +``` + +And add the facade into the "aliases" array: + +```php +'aliases' => array( + "Slugify" => "Cocur\Slugify\Bridge\Laravel\SlugifyFacade", +) +``` + +You can then use the `Slugify::slugify()` method in your controllers: + +```php +$url = Slugify::slugify('welcome to the homepage'); +``` + +### Zend Framework 2 + +Slugify can be easely used in Zend Framework 2 applications. Included bridge provides a service and a view helper +already registered for you. + +Just enable the module in your configuration like this. + +```php +return array( + //... + + 'modules' => array( + 'Application', + 'ZfcBase', + 'Cocur\Slugify\Bridge\ZF2' // <- Add this line + //... + ) + + //... +); +``` + +After that you can retrieve the `Cocur\Slugify\Slugify` service (or the `slugify` alias) and generate a slug. + +```php +/** @var \Zend\ServiceManager\ServiceManager $sm */ +$slugify = $sm->get('Cocur\Slugify\Slugify'); +$slug = $slugify->slugify('Hällo Wörld'); +$anotherSlug = $slugify->slugify('Hällo Wörld', '_'); +``` + +In your view templates use the `slugify` helper to generate slugs. + +```php +slugify('Hällo Wörld') ?> +slugify('Hällo Wörld', '_') ?> +``` + +The service (which is also used in the view helper) can be customized by defining this configuration key. + +```php +return array( + 'cocur_slugify' => array( + 'reg_exp' => '/([^a-zA-Z0-9]|-)+/' + ) +); +``` + +### Nette Framework + +Slugify contains a Nette extension that allows you to use it as a service in your Nette application. You only need to +register it in your `config.neon`: + +```yml +# app/config/config.neon + +extensions: + slugify: Cocur\Slugify\Bridge\Nette\SlugifyExtension +``` + +You can now use the `Cocur\Slugify\SlugifyInterface` service everywhere in your application, for example in your +presenter: + +```php +class MyPresenter extends \Nette\Application\UI\Presenter +{ + /** @var \Cocur\Slugify\SlugifyInterface @inject */ + public $slugify; + + public function renderDefault() + { + $this->template->hello = $this->slugify->slugify('Hällo Wörld'); + } +} +``` + +### Latte + +If you use the Nette Framework with it's native Latte templating engine, you can use the Latte filter `slugify` in your +templates after you have setup Nette extension (see above). + +```smarty +{$hello|slugify} +``` + +If you use Latte outside of the Nette Framework you first need to add the filter to your engine: + +```php +use Cocur\Slugify\Bridge\Latte\SlugifyHelper; +use Cocur\Slugify\Slugify; +use Latte; + +$latte = new Latte\Engine(); +$latte->addFilter('slugify', array(new SlugifyHelper(Slugify::create()), 'slugify')); +``` + +### Slim 3 + +Slugify does not need a specific bridge to work with [Slim 3](http://www.slimframework.com), just add the following configuration: + +```php +$container['view'] = function ($c) { + $settings = $c->get('settings'); + $view = new \Slim\Views\Twig($settings['view']['template_path'], $settings['view']['twig']); + $view->addExtension(new Slim\Views\TwigExtension($c->get('router'), $c->get('request')->getUri())); + $view->addExtension(new Cocur\Slugify\Bridge\Twig\SlugifyExtension(Cocur\Slugify\Slugify::create())); + return $view; +}; +``` + +In a template you can use it like this: + +```twig +{{ post.title|raw }} +``` + +### League + +Slugify provides a service provider for use with `league/container`: + +```php +use Cocur\Slugify; +use League\Container; + +/* @var Container\ContainerInterface $container */ +$container->addServiceProvider(new Slugify\Bridge\League\SlugifyServiceProvider()); + +/* @var Slugify\Slugify $slugify */ +$slugify = $container->get(Slugify\SlugifyInterface::class); +``` + +You can configure it by sharing the required options: + +```php +use Cocur\Slugify; +use League\Container; + +/* @var Container\ContainerInterface $container */ +$container->share('config.slugify.options', [ + 'lowercase' => false, + 'rulesets' => [ + 'default', + 'german', + ], +]); + +$container->addServiceProvider(new Slugify\Bridge\League\SlugifyServiceProvider()); + +/* @var Slugify\Slugify $slugify */ +$slugify = $container->get(Slugify\SlugifyInterface::class); +``` + +You can configure which rule provider to use by sharing it: + +```php +use Cocur\Slugify; +use League\Container; + +/* @var Container\ContainerInterface $container */ +$container->share(Slugify\RuleProvider\RuleProviderInterface::class, function () { + return new Slugify\RuleProvider\FileRuleProvider(__DIR__ . '/../../rules'); +]); + +$container->addServiceProvider(new Slugify\Bridge\League\SlugifyServiceProvider()); + +/* @var Slugify\Slugify $slugify */ +$slugify = $container->get(Slugify\SlugifyInterface::class); +``` + +## Change Log + +### Version 4.0 (14 December 2019) + +Version 4 does not introduce new major features, but adds support for Symfony 4 and 5, Twig 3 and, most importantly, PHP 7.3 and 7.4. + +Support for PHP 5, Twig 1 and Silex is dropped. + +- [#230](https://github.com/cocur/slugify/pull/230) Add Slovak rules (by [bartko-s](https://github.com/bartko-s)) +- [#236](https://github.com/cocur/slugify/pull/236) Make Twig Bridge compatible with Twig 3.0 (by [mhujer](https://github.com/mhujer)) +- [#237](https://github.com/cocur/slugify/pull/237) Fix Travis CI configuration (by [kubawerlos](https://github.com/kubawerlos)) +- [#238](https://github.com/cocur/slugify/pull/238) Drop Twig 1 support (by [FabienPapet](https://github.com/FabienPapet)) +- [#239](https://github.com/cocur/slugify/pull/239) Fix AppVeyor (by [kubawerlos](https://github.com/kubawerlos)) +- [#241](https://github.com/cocur/slugify/pull/241) Update .gitattributes (by [kubawerlos](https://github.com/kubawerlos)) +- [#242](https://github.com/cocur/slugify/pull/242) Add PHP CS Fixer (by [kubawerlos](https://github.com/kubawerlos)) +- [#243](https://github.com/cocur/slugify/pull/243) Normalize composer.json (by [kubawerlos](https://github.com/kubawerlos)) +- [#246](https://github.com/cocur/slugify/pull/246) Add support for PHP 7.3 and 7.4 (by [snapshotpl](https://github.com/snapshotpl)) +- [#247](https://github.com/cocur/slugify/pull/247) AppVeyor improvements (by [kubawerlos](https://github.com/kubawerlos)) +- [#249](https://github.com/cocur/slugify/pull/249) PHPUnit annotations should be a FQCNs including a root namespace (by [kubawerlos](https://github.com/kubawerlos)) +- [#250](https://github.com/cocur/slugify/pull/250) Add support for Symfony 4 and 5 (by [franmomu](https://github.com/franmomu)) +- [#251](https://github.com/cocur/slugify/pull/251) Dropping support for PHP 5 (by [franmomu](https://github.com/franmomu)) +- [#253](https://github.com/cocur/slugify/pull/253) Add conflict for unmaintained Symfony versions (by [franmomu](https://github.com/franmomu)) + +### Version 3.2 (31 January 2019) + +- [#201](https://github.com/cocur/slugify/pull/201) Add strip_tags option (by [thewilkybarkid](https://github.com/thewilkybarkid)) +- [#212](https://github.com/cocur/slugify/pull/212) Fix Macedonian Dze (by [franmomu](https://github.com/franmomu)) +- [#213](https://github.com/cocur/slugify/pull/213) Add support for Turkmen (by [umbarov](https://github.com/umbarov)) +- [#216](https://github.com/cocur/slugify/pull/216) Add lowercase_after_regexp option (by [julienfalque](https://github.com/julienfalque)) +- [#217](https://github.com/cocur/slugify/pull/217) Simplify default regular impression (by [julienfalque](https://github.com/julienfalque)) +- [#220](https://github.com/cocur/slugify/pull/220) Fix deprecation warning for symfony/config 4.2+ (by [franmomu](https://github.com/franmomu)) +- [#221](https://github.com/cocur/slugify/pull/221) Add suuport Armenian (by [boolfalse](https://github.com/boolfalse)) + +### Version 3.1 (22 January 2018) + +- [#195](https://github.com/cocur/slugify/pull/195) Add support for Chinese (Pinyin) (by [SuN-80](https://github.com/SuN-80), [franmomu](https://github.com/franmomu)) +- [#189](https://github.com/cocur/slugify/pull/189) Add trim option (by [sforsberg](https://github.com/sforsberg)) + +### Version 3.0.1 (24 September 2017) + +- [#183](https://github.com/cocur/slugify/pull/183) Fix invalid JSON ([RusiPapazov](https://github.com/RusiPapazov)) +- [#185](https://github.com/cocur/slugify/pull/185) Fix support for Symfony > 3.3 (by [FabienPapet](https://github.com/FabienPapet)) +- [#186](https://github.com/cocur/slugify/pull/186) Require Multibyte extension in `composer.json` (by [wandersonwhcr](https://github.com/wandersonwhcr)) + +### Version 3.0 (11 August 2017) + +- HHVM is no longer supported +- Bugfix [#165](https://github.com/cocur/slugify/issues/165) Added missing French rules to `DefaultRuleProvider` (by [gsouf](https://github.com/gsouf)) +- [#168](https://github.com/cocur/slugify/pull/168) Add Persian rules (by [mohammad6006](https://github.com/mohammad6006)) +- Bugfix [#169](https://github.com/cocur/slugify/issues/169) Add missing `getName()` to `Cocur\Slugify\Bridge\Twig\SlugifyExtension` (by [TomCan](https://github.com/TomCan)) +- [#172](https://github.com/cocur/slugify/pull/172) Sort rules in `DefaultRuleProvider` alphabetically (by [tbmatuka](https://github.com/tbmatuka)) +- [#174](https://github.com/cocur/slugify/pull/174) Add Hungarian rules (by [rviktor87](https://github.com/rviktor87)) +- [#180](https://github.com/cocur/slugify/pull/180) Add Brazilian Portuguese rules (by [tallesairan](https://github.com/tallesairan)) +- Bugfix [#181](https://github.com/cocur/slugify/pull/181) Add missing French rules (by [FabienPapet](https://github.com/FabienPapet)) + +### Version 2.5 (23 March 2017) + +- [#150](https://github.com/cocur/slugify/pull/150) Add Romanian rules (by [gabiudrescu](https://github.com/gabiudrescu)) +- [#154](https://github.com/cocur/slugify/pull/154) Add French rules (by [SuN-80](https://github.com/SuN-80)) +- [#159](https://github.com/cocur/slugify/pull/159) Add Estonian rules (by [erkimiilberg](https://github.com/erkimiilberg)) +- [#162](https://github.com/cocur/slugify/pull/162) Add support for Twig 2 (by [JakeFr](https://github.com/JakeFr)) + +### Version 2.4 (9 February 2017) + +- [#133](https://github.com/cocur/slugify/pull/133) Allow to modify options without creating a new object (by [leofeyer](https://github.com/leofeyer)) +- [#135](https://github.com/cocur/slugify/pull/135) Add support for Danish (by [izehose](https://github.com/izehose)) +- [#140](https://github.com/cocur/slugify/pull/140) Update Hindi support (by [arunlodhi](https://github.com/arunlodhi)) +- [#146](https://github.com/cocur/slugify/pull/146) Add support for Italien (by [gianiaz](https://github.com/gianiaz)) +- [#151](https://github.com/cocur/slugify/pull/151) Add support for Serbian (by [cvetan](https://github.com/cvetan)) +- [#155](https://github.com/cocur/slugify/pull/155) Update support for Lithuanian (by [s4uliu5](https://github.com/s4uliu5)) + +### Version 2.3 (9 August 2016) + +- [#124](https://github.com/cocur/slugify/issues/124) Fix support for Bulgarian +- [#125](https://github.com/cocur/slugify/pull/125) Update Silex 2 provider (by [JakeFr](https://github.com/JakeFr)) +- [#129](https://github.com/cocur/slugify/pull/129) Add support for Croatian (by [napravicukod](https://github.com/napravicukod)) + +### Version 2.2 (10 July 2016) + +- [#102](https://github.com/cocur/slugify/pull/102) Add transliterations for Azerbaijani (by [seferov](https://github.com/seferov)) +- [#109](https://github.com/cocur/slugify/pull/109) Made integer values into strings (by [JonathanMH](https://github.com/JonathanMH)) +- [#114](https://github.com/cocur/slugify/pull/114) Provide SlugifyServiceProvider for league/container (by [localheinz](https://github.com/localheinz)) +- [#120](https://github.com/cocur/slugify/issues/120) Add compatibility with Silex 2 (by [shamotj](https://github.com/shamotj)) + +### Version 2.1.1 (8 April 2016) + +- Do not activate Swedish rules by default (fixes broken v2.1 release) + +### Version 2.1.0 (8 April 2016) + +- [#104](https://github.com/cocur/slugify/pull/104) Add Symfony configuration (by [estahn](https://github.com/estahn)) +- [#107](https://github.com/cocur/slugify/issues/107) Fix Swedish rules + +### Version 2.0.0 (24 February 2016) + +- [#78](https://github.com/cocur/slugify/pull/78) Use multibyte-safe case convention (by [Koc](https://github.com/Koc)) +- [#81](https://github.com/cocur/slugify/pull/81) Move rules into JSON files (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- [#84](https://github.com/cocur/slugify/pull/84) Add tests for very long strings containing umlauts (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- [#88](https://github.com/cocur/slugify/pull/88) Add rules for Hindi (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- [#89](https://github.com/cocur/slugify/pull/89) Add rules for Norwegian (by [tsmes](https://github.com/tsmes)) +- [#90](https://github.com/cocur/slugify/pull/90) Replace `bindShared` with `singleton` in Laravel bridge (by [sunspikes](https://github.com/sunspikes)) +- [#97](https://github.com/cocur/slugify/pull/97) Set minimum PHP version to 5.5.9 (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- [#98](https://github.com/cocur/slugify/pull/98) Add rules for Bulgarian (by [RoumenDamianoff](https://github.com/RoumenDamianoff)) + +### Version 1.4.1 (11 February 2016) + +- [#90](https://github.com/cocur/slugify/pull/90) Replace `bindShared` with `singleton` in Laravel bridge (by [sunspikes](https://github.com/sunspikes)) + +### Version 1.4 (29 September 2015) + +- [#75](https://github.com/cocur/slugify/pull/75) Remove a duplicate array entry (by [irfanevrens](https://github.com/irfanevrens)) +- [#76](https://github.com/cocur/slugify/pull/76) Add support for Georgian (by [TheGIBSON](https://github.com/TheGIBSON)) +- [#77](https://github.com/cocur/slugify/pull/77) Fix Danish transliterations (by [kafoso](https://github.com/kafoso)) + +### Version 1.3 (2 September 2015) + +- [#70](https://github.com/cocur/slugify/pull/70) Add missing superscript and subscript digits (by [BlueM](https://github.com/BlueM)) +- [#71](https://github.com/cocur/slugify/pull/71) Improve Greek language support (by [kostaspt](https://github.com/kostaspt)) +- [#72](https://github.com/cocur/slugify/pull/72) Improve Silex integration (by [CarsonF](https://github.com/CarsonF)) +- [#73](https://github.com/cocur/slugify/pull/73) Improve Russian language support (by [akost](https://github.com/akost)) + +### Version 1.2 (2 July 2015) + +- Add integration for [Plum](https://github.com/plumphp/plum) (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- [#64](https://github.com/cocur/slugify/pull/64) Fix Nette integration (by [lookyman](https://github.com/lookyman)) +- Add option to not convert slug to lowercase (by [florianeckerstorfer](https://github.com/florianeckerstorfer) and [GDmac](https://github.com/GDmac)) + +### Version 1.1 (18 March 2015) + +- [#54](https://github.com/cocur/slugify/pull/54) Add support for Burmese characters (by [lovetostrike](https://github.com/lovetostrike)) +- [#58](https://github.com/cocur/slugify/pull/58) Add Nette and Latte integration (by [lookyman](https://github.com/lookyman)) +- [#50](https://github.com/cocur/slugify/issues/50) Fix transliteration for Vietnamese character Đ (by [mac2000](https://github.com/mac2000)) + +### Version 1.0 (26 November 2014) + +No new features or bugfixes, but it's about time to pump Slugify to v1.0. + +### Version 0.11 (23 November 2014) + +- [#49](https://github.com/cocur/slugify/pull/49) Add Zend Framework 2 integration (by [acelaya](https://github.com/acelaya)) + +### Version 0.10.3 (8 November 2014) + +- [#48](https://github.com/cocur/slugify/pull/48) Add support for Vietnamese (by [mac2000](https://github.com/mac2000)) + +### Version 0.10.2 (18 October 2014) + +- [#44](https://github.com/cocur/slugify/pull/44) Change visibility of properties to `protected` (by [acelaya](https://github.com/acelaya)) +- [#45](https://github.com/cocur/slugify/pull/45) Configure regular expression used to replace characters (by [acelaya](https://github.com/acelaya)) +- Fix type hinting (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) +- Remove duplicate rule (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) + +### Version 0.10.1 (1 September 2014) + +- [#39](https://github.com/cocur/slugify/pull/39) Add support for rulesets (by [florianeckerstorfer](https://github.com/florianeckerstorfer)) + +### Version 0.10.0 (26 August 2014) + +- [#32](https://github.com/cocur/slugify/pull/32) Added Laraval bridge (by [cviebrock](https://github.com/cviebrock)) +- [#35](https://github.com/cocur/slugify/pull/35) Fixed transliteration for `Ď` (by [michalskop](https://github.com/michalskop)) + +### Version 0.9 (29 May 2014) + +- [#28](https://github.com/cocur/slugify/pull/28) Add Symfony2 service alias and make Twig extension private (by [Kevin Bond](https://github.com/kbond)) + +### Version 0.8 (18 April 2014) + +- [#27](https://github.com/cocur/slugify/pull/27) Add support for Arabic characters (by [Davide Bellini](https://github.com/billmn)) +- Added some missing characters +- Improved organisation of characters in `Slugify` class + +### Version 0.7 (4 April 2014) + +This version introduces optional integrations into Symfony2, Silex and Twig. You can still use the library in any other framework. I decided to include these bridges because there exist integrations from other developers, but they use outdated versions of cocur/slugify. Including these small bridge classes in the library makes maintaining them a lot easier for me. + +- [#23](https://github.com/cocur/slugify/pull/23) Added Symfony2 service +- [#24](https://github.com/cocur/slugify/pull/24) Added Twig extension +- [#25](https://github.com/cocur/slugify/pull/25) Added Silex service provider + +### Version 0.6 (2 April 2014) + +- [#22](https://github.com/cocur/slugify/pull/22) Added support for Esperanto characters (by [Michel Petit](https://github.com/malenkiki)) + +### Version 0.5 (28 March 2014) + +- [#21](https://github.com/cocur/slugify/pull/21) Added support for Greek characters (by [Michel Petit](https://github.com/malenkiki)) +- [#20](https://github.com/cocur/slugify/pull/20) Fixed rule for cyrillic letter D (by [Marchenko Alexandr](https://github.com/cocur/slugify/pull/20)) +- Add missing `$separator` parameter to `SlugifyInterface` + +### Version 0.4.1 (9 March 2014) + +- [#19](https://github.com/cocur/slugify/pull/19) Adds soft sign rule (by [Marchenko Alexandr](https://github.com/mac2000)) + +### Version 0.4 (17 January 2014) + +Nearly completely rewritten code, removes `iconv` support because the underlying library is broken. The code is now better and faster. Many thanks to [Marchenko Alexandr](http://mac-blog.org.ua). + +### Version 0.3 (12 January 2014) + +- [#11](https://github.com/cocur/slugify/pull/11) PSR-4 compatible (by [mac2000](https://github.com/mac2000)) +- [#13](https://github.com/cocur/slugify/pull/13) Added editorconfig (by [mac2000](https://github.com/mac2000)) +- [#14](https://github.com/cocur/slugify/pull/14) Return empty slug when input is empty and removed unused parameter (by [mac2000](https://github.com/mac2000)) + +## Authors + +- [Florian Eckerstorfer](http://florian.ec) ([Twitter](http://twitter.com/Florian_)) +- [Ivo Bathke](https://github.com/ivoba) +- [Marchenko Alexandr](http://mac-blog.org.ua) +- And many [great contributors](https://github.com/cocur/slugify/graphs/contributors) + +Support for Chinese is adapted from [jifei/Pinyin](https://github.com/jifei/Pinyin) with permission. + +> Slugify is a project of [Cocur](http://cocur.co). You can contact us on Twitter: +> [**@cocurco**](https://twitter.com/cocurco) + +## Support + +If you need support you can ask on [Twitter](https://twitter.com/cocurco) (well, only if your question is short) or you +can join our chat on Gitter. + +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cocur/slugify) + +In case you want to support the development of Slugify you can help us with providing additional transliterations or +inform us if a transliteration is wrong. We would highly appreciate it if you can send us directly a Pull Request on +Github. If you have never contributed to a project on Github we are happy to help you. Just ask on Twitter or directly +join our Gitter. + +You always can help me (Florian, the original developer and maintainer) out by +[sending me an Euro or two](https://paypal.me/florianec/2). + +## License + +The MIT License (MIT) + +Copyright (c) 2012-2017 Florian Eckerstorfer + +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/page-toc/vendor/cocur/slugify/composer.json b/plugins/page-toc/vendor/cocur/slugify/composer.json new file mode 100644 index 0000000..8913fc9 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/composer.json @@ -0,0 +1,59 @@ +{ + "name": "cocur/slugify", + "type": "library", + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "license": "MIT", + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "require": { + "php": ">=7.0", + "ext-mbstring": "*" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "~5.1", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "phpunit/phpunit": "^5.7.27", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Cocur\\Slugify\\Tests\\": "tests" + } + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyFacade.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyFacade.php new file mode 100644 index 0000000..7c1b1ac --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyFacade.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Laravel; + +use Illuminate\Support\Facades\Facade; + +/** + * SlugifyFacade + * + * @package cocur/slugify + * @subpackage bridge + * @author Florian Eckerstorfer + * @author Colin Viebrock + * @copyright 2012-2014 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class SlugifyFacade extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + * + * @codeCoverageIgnore + */ + protected static function getFacadeAccessor() + { + return 'slugify'; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyServiceProvider.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyServiceProvider.php new file mode 100644 index 0000000..bca16e5 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Laravel/SlugifyServiceProvider.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Laravel; + +use Cocur\Slugify\Slugify; +use Illuminate\Support\ServiceProvider as LaravelServiceProvider; + +/** + * SlugifyServiceProvider + * + * @package cocur/slugify + * @subpackage bridge + * @author Florian Eckerstorfer + * @author Colin Viebrock + * @copyright 2012-2014 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class SlugifyServiceProvider extends LaravelServiceProvider +{ + /** + * Indicates if loading of the provider is deferred. + * + * @var bool + */ + protected $defer = true; + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton('slugify', function () { + return new Slugify(); + }); + } + + /** + * Get the services provided by the provider. + * + * @return string[] + */ + public function provides() + { + return ['slugify']; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Latte/SlugifyHelper.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Latte/SlugifyHelper.php new file mode 100644 index 0000000..0730aa4 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Latte/SlugifyHelper.php @@ -0,0 +1,38 @@ + + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class SlugifyHelper +{ + /** @var SlugifyInterface */ + private $slugify; + + /** + * @codeCoverageIgnore + */ + public function __construct(SlugifyInterface $slugify) + { + $this->slugify = $slugify; + } + + /** + * @param string $string + * @param string|null $separator + * + * @return string + */ + public function slugify($string, $separator = null) + { + return $this->slugify->slugify($string, $separator); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/League/SlugifyServiceProvider.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/League/SlugifyServiceProvider.php new file mode 100644 index 0000000..6d03f94 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/League/SlugifyServiceProvider.php @@ -0,0 +1,37 @@ +container->share(SlugifyInterface::class, function () { + $options = []; + if ($this->container->has('config.slugify.options')) { + $options = $this->container->get('config.slugify.options'); + } + + $provider = null; + if ($this->container->has(RuleProviderInterface::class)) { + /* @var RuleProviderInterface $provider */ + $provider = $this->container->get(RuleProviderInterface::class); + } + + return new Slugify( + $options, + $provider + ); + }); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Nette/SlugifyExtension.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Nette/SlugifyExtension.php new file mode 100644 index 0000000..12fdbe5 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Nette/SlugifyExtension.php @@ -0,0 +1,49 @@ + + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class SlugifyExtension extends CompilerExtension +{ + public function loadConfiguration() + { + $builder = $this->getContainerBuilder(); + + $builder->addDefinition($this->prefix('slugify')) + ->setClass('Cocur\Slugify\SlugifyInterface') + ->setFactory('Cocur\Slugify\Slugify'); + + $builder->addDefinition($this->prefix('helper')) + ->setClass('Cocur\Slugify\Bridge\Latte\SlugifyHelper') + ->setAutowired(false); + } + + public function beforeCompile() + { + $builder = $this->getContainerBuilder(); + + $self = $this; + $registerToLatte = function (ServiceDefinition $def) use ($self) { + $def->addSetup('addFilter', ['slugify', [$self->prefix('@helper'), 'slugify']]); + }; + + $latteFactory = $builder->getByType('Nette\Bridges\ApplicationLatte\ILatteFactory') ?: 'nette.latteFactory'; + if ($builder->hasDefinition($latteFactory)) { + $registerToLatte($builder->getDefinition($latteFactory)); + } + + if ($builder->hasDefinition('nette.latte')) { + $registerToLatte($builder->getDefinition('nette.latte')); + } + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Plum/SlugifyConverter.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Plum/SlugifyConverter.php new file mode 100644 index 0000000..c686bd0 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Plum/SlugifyConverter.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Plum; + +use Plum\Plum\Converter\ConverterInterface; +use Cocur\Slugify\Slugify; +use Cocur\Slugify\SlugifyInterface; + +/** + * SlugifyConverter + * + * @package Cocur\Slugify\Bridge\Plum + * @author Florian Eckerstorfer + * @copyright 2015 Florian Eckerstorfer + */ +class SlugifyConverter implements ConverterInterface +{ + /** @var Slugify */ + private $slugify; + + /** + * @param SlugifyInterface|null $slugify + */ + public function __construct(SlugifyInterface $slugify = null) + { + if ($slugify === null) { + $slugify = new Slugify(); + } + $this->slugify = $slugify; + } + + /** + * @param string $item + * + * @return string + */ + public function convert($item) + { + return $this->slugify->slugify($item); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyBundle.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyBundle.php new file mode 100644 index 0000000..2dc381c --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyBundle.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Symfony; + +use Symfony\Component\HttpKernel\Bundle\Bundle; + +/** + * CocurSlugifyBundle + * + * @package cocur/slugify + * @subpackage bridge + * @author Florian Eckerstorfer + * @copyright 2012-2014 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class CocurSlugifyBundle extends Bundle +{ + public function getContainerExtension() + { + return new CocurSlugifyExtension(); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyExtension.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyExtension.php new file mode 100644 index 0000000..1b4e49c --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/CocurSlugifyExtension.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Symfony; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\HttpKernel\DependencyInjection\Extension; + +/** + * CocurSlugifyExtension + * + * @package cocur/slugify + * @subpackage bridge + * @author Florian Eckerstorfer + * @copyright 2012-2014 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class CocurSlugifyExtension extends Extension +{ + /** + * {@inheritDoc} + * + * @param mixed[] $configs + * @param ContainerBuilder $container + */ + public function load(array $configs, ContainerBuilder $container) + { + $configuration = new Configuration(); + $config = $this->processConfiguration($configuration, $configs); + + if (empty($config['rulesets'])) { + unset($config['rulesets']); + } + + // Extract slugify arguments from config + $slugifyArguments = array_intersect_key($config, array_flip(['lowercase', 'trim', 'strip_tags', 'separator', 'regexp', 'rulesets'])); + + $container->setDefinition('cocur_slugify', new Definition('Cocur\Slugify\Slugify', [$slugifyArguments])); + $container + ->setDefinition( + 'cocur_slugify.twig.slugify', + new Definition( + 'Cocur\Slugify\Bridge\Twig\SlugifyExtension', + [new Reference('cocur_slugify')] + ) + ) + ->addTag('twig.extension') + ->setPublic(false); + $container->setAlias('slugify', 'cocur_slugify'); + $container->setAlias('Cocur\Slugify\SlugifyInterface', 'cocur_slugify'); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/Configuration.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/Configuration.php new file mode 100644 index 0000000..4959362 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Symfony/Configuration.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Symfony; + +use Symfony\Component\Config\Definition\Builder\TreeBuilder; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +class Configuration implements ConfigurationInterface +{ + /** + * {@inheritdoc} + */ + public function getConfigTreeBuilder() + { + $treeBuilder = new TreeBuilder('cocur_slugify'); + + // Keep compatibility with symfony/config < 4.2 + if (\method_exists($treeBuilder, 'getRootNode')) { + $rootNode = $treeBuilder->getRootNode(); + } else { + $rootNode = $treeBuilder->root('cocur_slugify'); + } + + $rootNode + ->children() + ->booleanNode('lowercase')->end() + ->booleanNode('lowercase_after_regexp')->end() + ->booleanNode('trim')->end() + ->booleanNode('strip_tags')->end() + ->scalarNode('separator')->end() + ->scalarNode('regexp')->end() + ->arrayNode('rulesets')->prototype('scalar')->end() + ->end(); + + return $treeBuilder; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Twig/SlugifyExtension.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Twig/SlugifyExtension.php new file mode 100644 index 0000000..cfec031 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/Twig/SlugifyExtension.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\Bridge\Twig; + +use Cocur\Slugify\SlugifyInterface; +use Twig\Extension\AbstractExtension; +use Twig\TwigFilter; + +/** + * SlugifyExtension + * + * @package cocur/slugify + * @subpackage bridge + * @author Florian Eckerstorfer + * @copyright 2012-2015 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class SlugifyExtension extends AbstractExtension +{ + /** + * @var SlugifyInterface + */ + private $slugify; + + /** + * Constructor. + * + * @param SlugifyInterface $slugify + * + * @codeCoverageIgnore + */ + public function __construct(SlugifyInterface $slugify) + { + $this->slugify = $slugify; + } + + /** + * Returns the Twig functions of this extension. + * + * @return TwigFilter[] + */ + public function getFilters() + { + return [ + new TwigFilter('slugify', [$this, 'slugifyFilter']), + ]; + } + + /** + * Slugify filter. + * + * @param string $string + * @param string|null $separator + * + * @return string + */ + public function slugifyFilter($string, $separator = null) + { + return $this->slugify->slugify($string, $separator); + } + + /** + * get Name + * + * @return string + */ + public function getName() + { + return "SlugifyExtension"; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/Module.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/Module.php new file mode 100644 index 0000000..74e2ec8 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/Module.php @@ -0,0 +1,50 @@ +> + */ + public function getServiceConfig() + { + return [ + 'factories' => [ + 'Cocur\Slugify\Slugify' => 'Cocur\Slugify\Bridge\ZF2\SlugifyService' + ], + 'aliases' => [ + 'slugify' => 'Cocur\Slugify\Slugify' + ] + ]; + } + + /** + * Expected to return \Zend\ServiceManager\Config object or array to + * seed such an object. + * + * @return array>|\Zend\ServiceManager\Config + */ + public function getViewHelperConfig() + { + return [ + 'factories' => [ + 'slugify' => 'Cocur\Slugify\Bridge\ZF2\SlugifyViewHelperFactory' + ] + ]; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyService.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyService.php new file mode 100644 index 0000000..44686b8 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyService.php @@ -0,0 +1,30 @@ +get('Config'); + + $options = isset($config[Module::CONFIG_KEY]['options']) ? $config[Module::CONFIG_KEY]['options'] : []; + $provider = isset($config[Module::CONFIG_KEY]['provider']) ? $config[Module::CONFIG_KEY]['provider'] : null; + + return new Slugify($options, $provider); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelper.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelper.php new file mode 100644 index 0000000..d421aee --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelper.php @@ -0,0 +1,41 @@ +slugify = $slugify; + } + + /** + * @param string $string + * @param string|null $separator + * + * @return string + */ + public function __invoke($string, $separator = null) + { + return $this->slugify->slugify($string, $separator); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelperFactory.php b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelperFactory.php new file mode 100644 index 0000000..1929234 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Bridge/ZF2/SlugifyViewHelperFactory.php @@ -0,0 +1,28 @@ +getServiceLocator()->get('Cocur\Slugify\Slugify'); + + return new SlugifyViewHelper($slugify); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/DefaultRuleProvider.php b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/DefaultRuleProvider.php new file mode 100644 index 0000000..3db1784 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/DefaultRuleProvider.php @@ -0,0 +1,8557 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\RuleProvider; + +/** + * DefaultRuleProvider + * + * @package Cocur\Slugify\RuleProvider + * @author Florian Eckerstorfer + * @copyright 2015 Florian Eckerstorfer + */ +class DefaultRuleProvider implements RuleProviderInterface +{ + /** + * DO NOT MODIFY THESE RULES! + * These rules are generated by the script in bin/generate-rules.php based on the JSON files + * in Resources/rules. + * + * @var array + */ + protected $rules = /*INSERT_START*/array ( + 'arabic' => + array ( + 'أ' => 'a', + 'ب' => 'b', + 'ت' => 't', + 'ث' => 'th', + 'ج' => 'g', + 'ح' => 'h', + 'خ' => 'kh', + 'د' => 'd', + 'ذ' => 'th', + 'ر' => 'r', + 'ز' => 'z', + 'س' => 's', + 'ش' => 'sh', + 'ص' => 's', + 'ض' => 'd', + 'ط' => 't', + 'ظ' => 'th', + 'ع' => 'aa', + 'غ' => 'gh', + 'ف' => 'f', + 'ق' => 'k', + 'ك' => 'k', + 'ل' => 'l', + 'م' => 'm', + 'ن' => 'n', + 'ه' => 'h', + 'و' => 'o', + 'ي' => 'y', + ), + 'armenian' => + array ( + 'Ա' => 'A', + 'Բ' => 'B', + 'Գ' => 'G', + 'Դ' => 'D', + 'Ե' => 'E', + 'Զ' => 'Z', + 'Է' => 'E', + 'Ը' => 'Y', + 'Թ' => 'Th', + 'Ժ' => 'Zh', + 'Ի' => 'I', + 'Լ' => 'L', + 'Խ' => 'Kh', + 'Ծ' => 'Ts', + 'Կ' => 'K', + 'Հ' => 'H', + 'Ձ' => 'Dz', + 'Ղ' => 'Gh', + 'Ճ' => 'Tch', + 'Մ' => 'M', + 'Յ' => 'Y', + 'Ն' => 'N', + 'Շ' => 'Sh', + 'Ո' => 'Vo', + 'Չ' => 'Ch', + 'Պ' => 'P', + 'Ջ' => 'J', + 'Ռ' => 'R', + 'Ս' => 'S', + 'Վ' => 'V', + 'Տ' => 'T', + 'Ր' => 'R', + 'Ց' => 'C', + 'Ւ' => 'u', + 'Փ' => 'Ph', + 'Ք' => 'Q', + 'և' => 'ev', + 'Օ' => 'O', + 'Ֆ' => 'F', + 'ա' => 'a', + 'բ' => 'b', + 'գ' => 'g', + 'դ' => 'd', + 'ե' => 'e', + 'զ' => 'z', + 'է' => 'e', + 'ը' => 'y', + 'թ' => 'th', + 'ժ' => 'zh', + 'ի' => 'i', + 'լ' => 'l', + 'խ' => 'kh', + 'ծ' => 'ts', + 'կ' => 'k', + 'հ' => 'h', + 'ձ' => 'dz', + 'ղ' => 'gh', + 'ճ' => 'tch', + 'մ' => 'm', + 'յ' => 'y', + 'ն' => 'n', + 'շ' => 'sh', + 'ո' => 'vo', + 'չ' => 'ch', + 'պ' => 'p', + 'ջ' => 'j', + 'ռ' => 'r', + 'ս' => 's', + 'վ' => 'v', + 'տ' => 't', + 'ր' => 'r', + 'ց' => 'c', + 'ւ' => 'u', + 'փ' => 'ph', + 'ք' => 'q', + 'օ' => 'o', + 'ֆ' => 'f', + ), + 'austrian' => + array ( + 'Ä' => 'AE', + 'Ö' => 'OE', + 'Ü' => 'UE', + 'ß' => 'sz', + 'ä' => 'ae', + 'ö' => 'oe', + 'ü' => 'ue', + ), + 'azerbaijani' => + array ( + 'Ə' => 'E', + 'Ç' => 'C', + 'Ğ' => 'G', + 'İ' => 'I', + 'Ş' => 'S', + 'Ö' => 'O', + 'Ü' => 'U', + 'ə' => 'e', + 'ç' => 'c', + 'ğ' => 'g', + 'ı' => 'i', + 'ş' => 's', + 'ö' => 'o', + 'ü' => 'u', + ), + 'bulgarian' => + array ( + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Ж' => 'J', + 'З' => 'Z', + 'И' => 'I', + 'Й' => 'Y', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'Ts', + 'Ч' => 'Ch', + 'Ш' => 'Sh', + 'Щ' => 'Sht', + 'Ъ' => 'A', + 'Ь' => 'I', + 'Ю' => 'Iu', + 'Я' => 'Ia', + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'е' => 'e', + 'ж' => 'j', + 'з' => 'z', + 'и' => 'i', + 'й' => 'y', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'ts', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'sht', + 'ъ' => 'a', + 'ь' => 'i', + 'ю' => 'iu', + 'я' => 'ia', + 'ия' => 'ia', + 'йо' => 'iо', + 'ьо' => 'io', + ), + 'burmese' => + array ( + 'က' => 'k', + 'ခ' => 'kh', + 'ဂ' => 'g', + 'ဃ' => 'ga', + 'င' => 'ng', + 'စ' => 's', + 'ဆ' => 'sa', + 'ဇ' => 'z', + 'စျ' => 'za', + 'ည' => 'ny', + 'ဋ' => 't', + 'ဌ' => 'ta', + 'ဍ' => 'd', + 'ဎ' => 'da', + 'ဏ' => 'na', + 'တ' => 't', + 'ထ' => 'ta', + 'ဒ' => 'd', + 'ဓ' => 'da', + 'န' => 'n', + 'ပ' => 'p', + 'ဖ' => 'pa', + 'ဗ' => 'b', + 'ဘ' => 'ba', + 'မ' => 'm', + 'ယ' => 'y', + 'ရ' => 'ya', + 'လ' => 'l', + 'ဝ' => 'w', + 'သ' => 'th', + 'ဟ' => 'h', + 'ဠ' => 'la', + 'အ' => 'a', + 'ြ' => 'y', + 'ျ' => 'ya', + 'ွ' => 'w', + 'ြွ' => 'yw', + 'ျွ' => 'ywa', + 'ှ' => 'h', + 'ဧ' => 'e', + '၏' => '-e', + 'ဣ' => 'i', + 'ဤ' => '-i', + 'ဉ' => 'u', + 'ဦ' => '-u', + 'ဩ' => 'aw', + 'သြော' => 'aw', + 'ဪ' => 'aw', + '၍' => 'ywae', + '၌' => 'hnaik', + '၀' => '0', + '၁' => '1', + '၂' => '2', + '၃' => '3', + '၄' => '4', + '၅' => '5', + '၆' => '6', + '၇' => '7', + '၈' => '8', + '၉' => '9', + '္' => '', + '့' => '', + 'း' => '', + 'ာ' => 'a', + 'ါ' => 'a', + 'ေ' => 'e', + 'ဲ' => 'e', + 'ိ' => 'i', + 'ီ' => 'i', + 'ို' => 'o', + 'ု' => 'u', + 'ူ' => 'u', + 'ေါင်' => 'aung', + 'ော' => 'aw', + 'ော်' => 'aw', + 'ေါ' => 'aw', + 'ေါ်' => 'aw', + '်' => 'at', + 'က်' => 'et', + 'ိုက်' => 'aik', + 'ောက်' => 'auk', + 'င်' => 'in', + 'ိုင်' => 'aing', + 'ောင်' => 'aung', + 'စ်' => 'it', + 'ည်' => 'i', + 'တ်' => 'at', + 'ိတ်' => 'eik', + 'ုတ်' => 'ok', + 'ွတ်' => 'ut', + 'ေတ်' => 'it', + 'ဒ်' => 'd', + 'ိုဒ်' => 'ok', + 'ုဒ်' => 'ait', + 'န်' => 'an', + 'ာန်' => 'an', + 'ိန်' => 'ein', + 'ုန်' => 'on', + 'ွန်' => 'un', + 'ပ်' => 'at', + 'ိပ်' => 'eik', + 'ုပ်' => 'ok', + 'ွပ်' => 'ut', + 'န်ုပ်' => 'nub', + 'မ်' => 'an', + 'ိမ်' => 'ein', + 'ုမ်' => 'on', + 'ွမ်' => 'un', + 'ယ်' => 'e', + 'ိုလ်' => 'ol', + 'ဉ်' => 'in', + 'ံ' => 'an', + 'ိံ' => 'ein', + 'ုံ' => 'on', + ), + 'chinese' => + array ( + '腌' => 'yan', + '嗄' => 'a', + '迫' => 'po', + '捱' => 'ai', + '艾' => 'ai', + '瑷' => 'ai', + '嗌' => 'ai', + '犴' => 'an', + '鳌' => 'ao', + '廒' => 'ao', + '拗' => 'niu', + '岙' => 'ao', + '鏊' => 'ao', + '扒' => 'ba', + '岜' => 'ba', + '耙' => 'pa', + '鲅' => 'ba', + '癍' => 'ban', + '膀' => 'pang', + '磅' => 'bang', + '炮' => 'pao', + '曝' => 'pu', + '刨' => 'pao', + '瀑' => 'pu', + '陂' => 'bei', + '埤' => 'pi', + '鹎' => 'bei', + '邶' => 'bei', + '孛' => 'bei', + '鐾' => 'bei', + '鞴' => 'bei', + '畚' => 'ben', + '甏' => 'beng', + '舭' => 'bi', + '秘' => 'mi', + '辟' => 'pi', + '泌' => 'mi', + '裨' => 'bi', + '濞' => 'bi', + '庳' => 'bi', + '嬖' => 'bi', + '畀' => 'bi', + '筚' => 'bi', + '箅' => 'bi', + '襞' => 'bi', + '跸' => 'bi', + '笾' => 'bian', + '扁' => 'bian', + '碥' => 'bian', + '窆' => 'bian', + '便' => 'bian', + '弁' => 'bian', + '缏' => 'bian', + '骠' => 'biao', + '杓' => 'shao', + '飚' => 'biao', + '飑' => 'biao', + '瘭' => 'biao', + '髟' => 'biao', + '玢' => 'bin', + '豳' => 'bin', + '镔' => 'bin', + '膑' => 'bin', + '屏' => 'ping', + '泊' => 'bo', + '逋' => 'bu', + '晡' => 'bu', + '钸' => 'bu', + '醭' => 'bu', + '埔' => 'pu', + '瓿' => 'bu', + '礤' => 'ca', + '骖' => 'can', + '藏' => 'zang', + '艚' => 'cao', + '侧' => 'ce', + '喳' => 'zha', + '刹' => 'sha', + '瘥' => 'chai', + '禅' => 'chan', + '廛' => 'chan', + '镡' => 'tan', + '澶' => 'chan', + '躔' => 'chan', + '阊' => 'chang', + '鲳' => 'chang', + '长' => 'chang', + '苌' => 'chang', + '氅' => 'chang', + '鬯' => 'chang', + '焯' => 'chao', + '朝' => 'chao', + '车' => 'che', + '琛' => 'chen', + '谶' => 'chen', + '榇' => 'chen', + '蛏' => 'cheng', + '埕' => 'cheng', + '枨' => 'cheng', + '塍' => 'cheng', + '裎' => 'cheng', + '螭' => 'chi', + '眵' => 'chi', + '墀' => 'chi', + '篪' => 'chi', + '坻' => 'di', + '瘛' => 'chi', + '种' => 'zhong', + '重' => 'zhong', + '仇' => 'chou', + '帱' => 'chou', + '俦' => 'chou', + '雠' => 'chou', + '臭' => 'chou', + '楮' => 'chu', + '畜' => 'chu', + '嘬' => 'zuo', + '膪' => 'chuai', + '巛' => 'chuan', + '椎' => 'zhui', + '呲' => 'ci', + '兹' => 'zi', + '伺' => 'si', + '璁' => 'cong', + '楱' => 'cou', + '攒' => 'zan', + '爨' => 'cuan', + '隹' => 'zhui', + '榱' => 'cui', + '撮' => 'cuo', + '鹾' => 'cuo', + '嗒' => 'da', + '哒' => 'da', + '沓' => 'ta', + '骀' => 'tai', + '绐' => 'dai', + '埭' => 'dai', + '甙' => 'dai', + '弹' => 'dan', + '澹' => 'dan', + '叨' => 'dao', + '纛' => 'dao', + '簦' => 'deng', + '提' => 'ti', + '翟' => 'zhai', + '绨' => 'ti', + '丶' => 'dian', + '佃' => 'dian', + '簟' => 'dian', + '癜' => 'dian', + '调' => 'tiao', + '铞' => 'diao', + '佚' => 'yi', + '堞' => 'die', + '瓞' => 'die', + '揲' => 'die', + '垤' => 'die', + '疔' => 'ding', + '岽' => 'dong', + '硐' => 'dong', + '恫' => 'dong', + '垌' => 'dong', + '峒' => 'dong', + '芏' => 'du', + '煅' => 'duan', + '碓' => 'dui', + '镦' => 'dui', + '囤' => 'tun', + '铎' => 'duo', + '缍' => 'duo', + '驮' => 'tuo', + '沲' => 'tuo', + '柁' => 'tuo', + '哦' => 'o', + '恶' => 'e', + '轭' => 'e', + '锷' => 'e', + '鹗' => 'e', + '阏' => 'e', + '诶' => 'ea', + '鲕' => 'er', + '珥' => 'er', + '佴' => 'er', + '番' => 'fan', + '彷' => 'pang', + '霏' => 'fei', + '蜚' => 'fei', + '鲱' => 'fei', + '芾' => 'fei', + '瀵' => 'fen', + '鲼' => 'fen', + '否' => 'fou', + '趺' => 'fu', + '桴' => 'fu', + '莩' => 'fu', + '菔' => 'fu', + '幞' => 'fu', + '郛' => 'fu', + '绂' => 'fu', + '绋' => 'fu', + '祓' => 'fu', + '砩' => 'fu', + '黻' => 'fu', + '罘' => 'fu', + '蚨' => 'fu', + '脯' => 'pu', + '滏' => 'fu', + '黼' => 'fu', + '鲋' => 'fu', + '鳆' => 'fu', + '咖' => 'ka', + '噶' => 'ga', + '轧' => 'zha', + '陔' => 'gai', + '戤' => 'gai', + '扛' => 'kang', + '戆' => 'gang', + '筻' => 'gang', + '槔' => 'gao', + '藁' => 'gao', + '缟' => 'gao', + '咯' => 'ge', + '仡' => 'yi', + '搿' => 'ge', + '塥' => 'ge', + '鬲' => 'ge', + '哿' => 'ge', + '句' => 'ju', + '缑' => 'gou', + '鞲' => 'gou', + '笱' => 'gou', + '遘' => 'gou', + '瞽' => 'gu', + '罟' => 'gu', + '嘏' => 'gu', + '牿' => 'gu', + '鲴' => 'gu', + '栝' => 'kuo', + '莞' => 'guan', + '纶' => 'lun', + '涫' => 'guan', + '涡' => 'wo', + '呙' => 'guo', + '馘' => 'guo', + '猓' => 'guo', + '咳' => 'ke', + '氦' => 'hai', + '颔' => 'han', + '吭' => 'keng', + '颃' => 'hang', + '巷' => 'xiang', + '蚵' => 'ke', + '翮' => 'he', + '吓' => 'xia', + '桁' => 'heng', + '泓' => 'hong', + '蕻' => 'hong', + '黉' => 'hong', + '後' => 'hou', + '唿' => 'hu', + '煳' => 'hu', + '浒' => 'hu', + '祜' => 'hu', + '岵' => 'hu', + '鬟' => 'huan', + '圜' => 'huan', + '郇' => 'xun', + '锾' => 'huan', + '逭' => 'huan', + '咴' => 'hui', + '虺' => 'hui', + '会' => 'hui', + '溃' => 'kui', + '哕' => 'hui', + '缋' => 'hui', + '锪' => 'huo', + '蠖' => 'huo', + '缉' => 'ji', + '稽' => 'ji', + '赍' => 'ji', + '丌' => 'ji', + '咭' => 'ji', + '亟' => 'ji', + '殛' => 'ji', + '戢' => 'ji', + '嵴' => 'ji', + '蕺' => 'ji', + '系' => 'xi', + '蓟' => 'ji', + '霁' => 'ji', + '荠' => 'qi', + '跽' => 'ji', + '哜' => 'ji', + '鲚' => 'ji', + '洎' => 'ji', + '芰' => 'ji', + '茄' => 'qie', + '珈' => 'jia', + '迦' => 'jia', + '笳' => 'jia', + '葭' => 'jia', + '跏' => 'jia', + '郏' => 'jia', + '恝' => 'jia', + '铗' => 'jia', + '袷' => 'qia', + '蛱' => 'jia', + '角' => 'jiao', + '挢' => 'jiao', + '岬' => 'jia', + '徼' => 'jiao', + '湫' => 'qiu', + '敫' => 'jiao', + '瘕' => 'jia', + '浅' => 'qian', + '蒹' => 'jian', + '搛' => 'jian', + '湔' => 'jian', + '缣' => 'jian', + '犍' => 'jian', + '鹣' => 'jian', + '鲣' => 'jian', + '鞯' => 'jian', + '蹇' => 'jian', + '謇' => 'jian', + '硷' => 'jian', + '枧' => 'jian', + '戬' => 'jian', + '谫' => 'jian', + '囝' => 'jian', + '裥' => 'jian', + '笕' => 'jian', + '翦' => 'jian', + '趼' => 'jian', + '楗' => 'jian', + '牮' => 'jian', + '踺' => 'jian', + '茳' => 'jiang', + '礓' => 'jiang', + '耩' => 'jiang', + '降' => 'jiang', + '绛' => 'jiang', + '洚' => 'jiang', + '鲛' => 'jiao', + '僬' => 'jiao', + '鹪' => 'jiao', + '艽' => 'jiao', + '茭' => 'jiao', + '嚼' => 'jiao', + '峤' => 'qiao', + '觉' => 'jiao', + '校' => 'xiao', + '噍' => 'jiao', + '醮' => 'jiao', + '疖' => 'jie', + '喈' => 'jie', + '桔' => 'ju', + '拮' => 'jie', + '桀' => 'jie', + '颉' => 'jie', + '婕' => 'jie', + '羯' => 'jie', + '鲒' => 'jie', + '蚧' => 'jie', + '骱' => 'jie', + '衿' => 'jin', + '馑' => 'jin', + '卺' => 'jin', + '廑' => 'jin', + '堇' => 'jin', + '槿' => 'jin', + '靳' => 'jin', + '缙' => 'jin', + '荩' => 'jin', + '赆' => 'jin', + '妗' => 'jin', + '旌' => 'jing', + '腈' => 'jing', + '憬' => 'jing', + '肼' => 'jing', + '迳' => 'jing', + '胫' => 'jing', + '弪' => 'jing', + '獍' => 'jing', + '扃' => 'jiong', + '鬏' => 'jiu', + '疚' => 'jiu', + '僦' => 'jiu', + '桕' => 'jiu', + '疽' => 'ju', + '裾' => 'ju', + '苴' => 'ju', + '椐' => 'ju', + '锔' => 'ju', + '琚' => 'ju', + '鞫' => 'ju', + '踽' => 'ju', + '榉' => 'ju', + '莒' => 'ju', + '遽' => 'ju', + '倨' => 'ju', + '钜' => 'ju', + '犋' => 'ju', + '屦' => 'ju', + '榘' => 'ju', + '窭' => 'ju', + '讵' => 'ju', + '醵' => 'ju', + '苣' => 'ju', + '圈' => 'quan', + '镌' => 'juan', + '蠲' => 'juan', + '锩' => 'juan', + '狷' => 'juan', + '桊' => 'juan', + '鄄' => 'juan', + '獗' => 'jue', + '攫' => 'jue', + '孓' => 'jue', + '橛' => 'jue', + '珏' => 'jue', + '桷' => 'jue', + '劂' => 'jue', + '爝' => 'jue', + '镢' => 'jue', + '觖' => 'jue', + '筠' => 'jun', + '麇' => 'jun', + '捃' => 'jun', + '浚' => 'jun', + '喀' => 'ka', + '卡' => 'ka', + '佧' => 'ka', + '胩' => 'ka', + '锎' => 'kai', + '蒈' => 'kai', + '剀' => 'kai', + '垲' => 'kai', + '锴' => 'kai', + '戡' => 'kan', + '莰' => 'kan', + '闶' => 'kang', + '钪' => 'kang', + '尻' => 'kao', + '栲' => 'kao', + '柯' => 'ke', + '疴' => 'ke', + '钶' => 'ke', + '颏' => 'ke', + '珂' => 'ke', + '髁' => 'ke', + '壳' => 'ke', + '岢' => 'ke', + '溘' => 'ke', + '骒' => 'ke', + '缂' => 'ke', + '氪' => 'ke', + '锞' => 'ke', + '裉' => 'ken', + '倥' => 'kong', + '崆' => 'kong', + '箜' => 'kong', + '芤' => 'kou', + '眍' => 'kou', + '筘' => 'kou', + '刳' => 'ku', + '堀' => 'ku', + '喾' => 'ku', + '侉' => 'kua', + '蒯' => 'kuai', + '哙' => 'kuai', + '狯' => 'kuai', + '郐' => 'kuai', + '匡' => 'kuang', + '夼' => 'kuang', + '邝' => 'kuang', + '圹' => 'kuang', + '纩' => 'kuang', + '贶' => 'kuang', + '岿' => 'kui', + '悝' => 'kui', + '睽' => 'kui', + '逵' => 'kui', + '馗' => 'kui', + '夔' => 'kui', + '喹' => 'kui', + '隗' => 'wei', + '暌' => 'kui', + '揆' => 'kui', + '蝰' => 'kui', + '跬' => 'kui', + '喟' => 'kui', + '聩' => 'kui', + '篑' => 'kui', + '蒉' => 'kui', + '愦' => 'kui', + '锟' => 'kun', + '醌' => 'kun', + '琨' => 'kun', + '髡' => 'kun', + '悃' => 'kun', + '阃' => 'kun', + '蛞' => 'kuo', + '砬' => 'la', + '落' => 'luo', + '剌' => 'la', + '瘌' => 'la', + '涞' => 'lai', + '崃' => 'lai', + '铼' => 'lai', + '赉' => 'lai', + '濑' => 'lai', + '斓' => 'lan', + '镧' => 'lan', + '谰' => 'lan', + '漤' => 'lan', + '罱' => 'lan', + '稂' => 'lang', + '阆' => 'lang', + '莨' => 'liang', + '蒗' => 'lang', + '铹' => 'lao', + '痨' => 'lao', + '醪' => 'lao', + '栳' => 'lao', + '铑' => 'lao', + '耢' => 'lao', + '勒' => 'le', + '仂' => 'le', + '叻' => 'le', + '泐' => 'le', + '鳓' => 'le', + '了' => 'le', + '镭' => 'lei', + '嫘' => 'lei', + '缧' => 'lei', + '檑' => 'lei', + '诔' => 'lei', + '耒' => 'lei', + '酹' => 'lei', + '塄' => 'leng', + '愣' => 'leng', + '藜' => 'li', + '骊' => 'li', + '黧' => 'li', + '缡' => 'li', + '嫠' => 'li', + '鲡' => 'li', + '蓠' => 'li', + '澧' => 'li', + '锂' => 'li', + '醴' => 'li', + '鳢' => 'li', + '俪' => 'li', + '砺' => 'li', + '郦' => 'li', + '詈' => 'li', + '猁' => 'li', + '溧' => 'li', + '栎' => 'li', + '轹' => 'li', + '傈' => 'li', + '坜' => 'li', + '苈' => 'li', + '疠' => 'li', + '疬' => 'li', + '篥' => 'li', + '粝' => 'li', + '跞' => 'li', + '俩' => 'liang', + '裢' => 'lian', + '濂' => 'lian', + '臁' => 'lian', + '奁' => 'lian', + '蠊' => 'lian', + '琏' => 'lian', + '蔹' => 'lian', + '裣' => 'lian', + '楝' => 'lian', + '潋' => 'lian', + '椋' => 'liang', + '墚' => 'liang', + '寮' => 'liao', + '鹩' => 'liao', + '蓼' => 'liao', + '钌' => 'liao', + '廖' => 'liao', + '尥' => 'liao', + '洌' => 'lie', + '捩' => 'lie', + '埒' => 'lie', + '躐' => 'lie', + '鬣' => 'lie', + '辚' => 'lin', + '遴' => 'lin', + '啉' => 'lin', + '瞵' => 'lin', + '懔' => 'lin', + '廪' => 'lin', + '蔺' => 'lin', + '膦' => 'lin', + '酃' => 'ling', + '柃' => 'ling', + '鲮' => 'ling', + '呤' => 'ling', + '镏' => 'liu', + '旒' => 'liu', + '骝' => 'liu', + '鎏' => 'liu', + '锍' => 'liu', + '碌' => 'lu', + '鹨' => 'liu', + '茏' => 'long', + '栊' => 'long', + '泷' => 'long', + '砻' => 'long', + '癃' => 'long', + '垅' => 'long', + '偻' => 'lou', + '蝼' => 'lou', + '蒌' => 'lou', + '耧' => 'lou', + '嵝' => 'lou', + '露' => 'lu', + '瘘' => 'lou', + '噜' => 'lu', + '轳' => 'lu', + '垆' => 'lu', + '胪' => 'lu', + '舻' => 'lu', + '栌' => 'lu', + '镥' => 'lu', + '绿' => 'lv', + '辘' => 'lu', + '簏' => 'lu', + '潞' => 'lu', + '辂' => 'lu', + '渌' => 'lu', + '氇' => 'lu', + '捋' => 'lv', + '稆' => 'lv', + '率' => 'lv', + '闾' => 'lv', + '栾' => 'luan', + '銮' => 'luan', + '滦' => 'luan', + '娈' => 'luan', + '脔' => 'luan', + '锊' => 'lve', + '猡' => 'luo', + '椤' => 'luo', + '脶' => 'luo', + '镙' => 'luo', + '倮' => 'luo', + '蠃' => 'luo', + '瘰' => 'luo', + '珞' => 'luo', + '泺' => 'luo', + '荦' => 'luo', + '雒' => 'luo', + '呒' => 'mu', + '抹' => 'mo', + '唛' => 'mai', + '杩' => 'ma', + '么' => 'me', + '埋' => 'mai', + '荬' => 'mai', + '脉' => 'mai', + '劢' => 'mai', + '颟' => 'man', + '蔓' => 'man', + '鳗' => 'man', + '鞔' => 'man', + '螨' => 'man', + '墁' => 'man', + '缦' => 'man', + '熳' => 'man', + '镘' => 'man', + '邙' => 'mang', + '硭' => 'mang', + '旄' => 'mao', + '茆' => 'mao', + '峁' => 'mao', + '泖' => 'mao', + '昴' => 'mao', + '耄' => 'mao', + '瑁' => 'mao', + '懋' => 'mao', + '瞀' => 'mao', + '麽' => 'me', + '没' => 'mei', + '嵋' => 'mei', + '湄' => 'mei', + '猸' => 'mei', + '镅' => 'mei', + '鹛' => 'mei', + '浼' => 'mei', + '钔' => 'men', + '瞢' => 'meng', + '甍' => 'meng', + '礞' => 'meng', + '艨' => 'meng', + '黾' => 'mian', + '鳘' => 'min', + '溟' => 'ming', + '暝' => 'ming', + '模' => 'mo', + '谟' => 'mo', + '嫫' => 'mo', + '镆' => 'mo', + '瘼' => 'mo', + '耱' => 'mo', + '貊' => 'mo', + '貘' => 'mo', + '牟' => 'mou', + '鍪' => 'mou', + '蛑' => 'mou', + '侔' => 'mou', + '毪' => 'mu', + '坶' => 'mu', + '仫' => 'mu', + '唔' => 'wu', + '那' => 'na', + '镎' => 'na', + '哪' => 'na', + '呢' => 'ne', + '肭' => 'na', + '艿' => 'nai', + '鼐' => 'nai', + '萘' => 'nai', + '柰' => 'nai', + '蝻' => 'nan', + '馕' => 'nang', + '攮' => 'nang', + '曩' => 'nang', + '猱' => 'nao', + '铙' => 'nao', + '硇' => 'nao', + '蛲' => 'nao', + '垴' => 'nao', + '坭' => 'ni', + '猊' => 'ni', + '铌' => 'ni', + '鲵' => 'ni', + '祢' => 'mi', + '睨' => 'ni', + '慝' => 'te', + '伲' => 'ni', + '鲇' => 'nian', + '鲶' => 'nian', + '埝' => 'nian', + '嬲' => 'niao', + '茑' => 'niao', + '脲' => 'niao', + '啮' => 'nie', + '陧' => 'nie', + '颞' => 'nie', + '臬' => 'nie', + '蘖' => 'nie', + '甯' => 'ning', + '聍' => 'ning', + '狃' => 'niu', + '侬' => 'nong', + '耨' => 'nou', + '孥' => 'nu', + '胬' => 'nu', + '钕' => 'nv', + '恧' => 'nv', + '褰' => 'qian', + '掮' => 'qian', + '荨' => 'xun', + '钤' => 'qian', + '箝' => 'qian', + '鬈' => 'quan', + '缱' => 'qian', + '肷' => 'qian', + '纤' => 'xian', + '茜' => 'qian', + '慊' => 'qian', + '椠' => 'qian', + '戗' => 'qiang', + '镪' => 'qiang', + '锖' => 'qiang', + '樯' => 'qiang', + '嫱' => 'qiang', + '雀' => 'que', + '缲' => 'qiao', + '硗' => 'qiao', + '劁' => 'qiao', + '樵' => 'qiao', + '谯' => 'qiao', + '鞒' => 'qiao', + '愀' => 'qiao', + '鞘' => 'qiao', + '郄' => 'xi', + '箧' => 'qie', + '亲' => 'qin', + '覃' => 'tan', + '溱' => 'qin', + '檎' => 'qin', + '锓' => 'qin', + '嗪' => 'qin', + '螓' => 'qin', + '揿' => 'qin', + '吣' => 'qin', + '圊' => 'qing', + '鲭' => 'qing', + '檠' => 'qing', + '黥' => 'qing', + '謦' => 'qing', + '苘' => 'qing', + '磬' => 'qing', + '箐' => 'qing', + '綮' => 'qi', + '茕' => 'qiong', + '邛' => 'dao', + '蛩' => 'tun', + '筇' => 'qiong', + '跫' => 'qiong', + '銎' => 'qiong', + '楸' => 'qiu', + '俅' => 'qiu', + '赇' => 'qiu', + '逑' => 'qiu', + '犰' => 'qiu', + '蝤' => 'qiu', + '巯' => 'qiu', + '鼽' => 'qiu', + '糗' => 'qiu', + '区' => 'qu', + '祛' => 'qu', + '麴' => 'qu', + '诎' => 'qu', + '衢' => 'qu', + '癯' => 'qu', + '劬' => 'qu', + '璩' => 'qu', + '氍' => 'qu', + '朐' => 'qu', + '磲' => 'qu', + '鸲' => 'qu', + '蕖' => 'qu', + '蠼' => 'qu', + '蘧' => 'qu', + '阒' => 'qu', + '颧' => 'quan', + '荃' => 'quan', + '铨' => 'quan', + '辁' => 'quan', + '筌' => 'quan', + '绻' => 'quan', + '畎' => 'quan', + '阕' => 'que', + '悫' => 'que', + '髯' => 'ran', + '禳' => 'rang', + '穰' => 'rang', + '仞' => 'ren', + '妊' => 'ren', + '轫' => 'ren', + '衽' => 'ren', + '狨' => 'rong', + '肜' => 'rong', + '蝾' => 'rong', + '嚅' => 'ru', + '濡' => 'ru', + '薷' => 'ru', + '襦' => 'ru', + '颥' => 'ru', + '洳' => 'ru', + '溽' => 'ru', + '蓐' => 'ru', + '朊' => 'ruan', + '蕤' => 'rui', + '枘' => 'rui', + '箬' => 'ruo', + '挲' => 'suo', + '脎' => 'sa', + '塞' => 'sai', + '鳃' => 'sai', + '噻' => 'sai', + '毵' => 'san', + '馓' => 'san', + '糁' => 'san', + '霰' => 'xian', + '磉' => 'sang', + '颡' => 'sang', + '缫' => 'sao', + '鳋' => 'sao', + '埽' => 'sao', + '瘙' => 'sao', + '色' => 'se', + '杉' => 'shan', + '鲨' => 'sha', + '痧' => 'sha', + '裟' => 'sha', + '铩' => 'sha', + '唼' => 'sha', + '酾' => 'shai', + '栅' => 'zha', + '跚' => 'shan', + '芟' => 'shan', + '埏' => 'shan', + '钐' => 'shan', + '舢' => 'shan', + '剡' => 'yan', + '鄯' => 'shan', + '疝' => 'shan', + '蟮' => 'shan', + '墒' => 'shang', + '垧' => 'shang', + '绱' => 'shang', + '蛸' => 'shao', + '筲' => 'shao', + '苕' => 'tiao', + '召' => 'zhao', + '劭' => 'shao', + '猞' => 'she', + '畲' => 'she', + '折' => 'zhe', + '滠' => 'she', + '歙' => 'xi', + '厍' => 'she', + '莘' => 'shen', + '娠' => 'shen', + '诜' => 'shen', + '什' => 'shen', + '谂' => 'shen', + '渖' => 'shen', + '矧' => 'shen', + '胂' => 'shen', + '椹' => 'shen', + '省' => 'sheng', + '眚' => 'sheng', + '嵊' => 'sheng', + '嘘' => 'xu', + '蓍' => 'shi', + '鲺' => 'shi', + '识' => 'shi', + '拾' => 'shi', + '埘' => 'shi', + '莳' => 'shi', + '炻' => 'shi', + '鲥' => 'shi', + '豕' => 'shi', + '似' => 'si', + '噬' => 'shi', + '贳' => 'shi', + '铈' => 'shi', + '螫' => 'shi', + '筮' => 'shi', + '殖' => 'zhi', + '熟' => 'shu', + '艏' => 'shou', + '菽' => 'shu', + '摅' => 'shu', + '纾' => 'shu', + '毹' => 'shu', + '疋' => 'shu', + '数' => 'shu', + '属' => 'shu', + '术' => 'shu', + '澍' => 'shu', + '沭' => 'shu', + '丨' => 'shu', + '腧' => 'shu', + '说' => 'shuo', + '妁' => 'shuo', + '蒴' => 'shuo', + '槊' => 'shuo', + '搠' => 'shuo', + '鸶' => 'si', + '澌' => 'si', + '缌' => 'si', + '锶' => 'si', + '厶' => 'si', + '蛳' => 'si', + '驷' => 'si', + '泗' => 'si', + '汜' => 'si', + '兕' => 'si', + '姒' => 'si', + '耜' => 'si', + '笥' => 'si', + '忪' => 'song', + '淞' => 'song', + '崧' => 'song', + '凇' => 'song', + '菘' => 'song', + '竦' => 'song', + '溲' => 'sou', + '飕' => 'sou', + '蜩' => 'tiao', + '萜' => 'tie', + '汀' => 'ting', + '葶' => 'ting', + '莛' => 'ting', + '梃' => 'ting', + '佟' => 'tong', + '酮' => 'tong', + '仝' => 'tong', + '茼' => 'tong', + '砼' => 'tong', + '钭' => 'dou', + '酴' => 'tu', + '钍' => 'tu', + '堍' => 'tu', + '抟' => 'tuan', + '忒' => 'te', + '煺' => 'tui', + '暾' => 'tun', + '氽' => 'tun', + '乇' => 'tuo', + '砣' => 'tuo', + '沱' => 'tuo', + '跎' => 'tuo', + '坨' => 'tuo', + '橐' => 'tuo', + '酡' => 'tuo', + '鼍' => 'tuo', + '庹' => 'tuo', + '拓' => 'tuo', + '柝' => 'tuo', + '箨' => 'tuo', + '腽' => 'wa', + '崴' => 'wai', + '芄' => 'wan', + '畹' => 'wan', + '琬' => 'wan', + '脘' => 'wan', + '菀' => 'wan', + '尢' => 'you', + '辋' => 'wang', + '魍' => 'wang', + '逶' => 'wei', + '葳' => 'wei', + '隈' => 'wei', + '惟' => 'wei', + '帏' => 'wei', + '圩' => 'wei', + '囗' => 'wei', + '潍' => 'wei', + '嵬' => 'wei', + '沩' => 'wei', + '涠' => 'wei', + '尾' => 'wei', + '玮' => 'wei', + '炜' => 'wei', + '韪' => 'wei', + '洧' => 'wei', + '艉' => 'wei', + '鲔' => 'wei', + '遗' => 'yi', + '尉' => 'wei', + '軎' => 'wei', + '璺' => 'wen', + '阌' => 'wen', + '蓊' => 'weng', + '蕹' => 'weng', + '渥' => 'wo', + '硪' => 'wo', + '龌' => 'wo', + '圬' => 'wu', + '吾' => 'wu', + '浯' => 'wu', + '鼯' => 'wu', + '牾' => 'wu', + '迕' => 'wu', + '庑' => 'wu', + '痦' => 'wu', + '芴' => 'wu', + '杌' => 'wu', + '焐' => 'wu', + '阢' => 'wu', + '婺' => 'wu', + '鋈' => 'wu', + '樨' => 'xi', + '栖' => 'qi', + '郗' => 'xi', + '蹊' => 'qi', + '淅' => 'xi', + '熹' => 'xi', + '浠' => 'xi', + '僖' => 'xi', + '穸' => 'xi', + '螅' => 'xi', + '菥' => 'xi', + '舾' => 'xi', + '矽' => 'xi', + '粞' => 'xi', + '硒' => 'xi', + '醯' => 'xi', + '欷' => 'xi', + '鼷' => 'xi', + '檄' => 'xi', + '隰' => 'xi', + '觋' => 'xi', + '屣' => 'xi', + '葸' => 'xi', + '蓰' => 'xi', + '铣' => 'xi', + '饩' => 'xi', + '阋' => 'xi', + '禊' => 'xi', + '舄' => 'xi', + '狎' => 'xia', + '硖' => 'xia', + '柙' => 'xia', + '暹' => 'xian', + '莶' => 'xian', + '祆' => 'xian', + '籼' => 'xian', + '跹' => 'xian', + '鹇' => 'xian', + '痫' => 'xian', + '猃' => 'xian', + '燹' => 'xian', + '蚬' => 'xian', + '筅' => 'xian', + '冼' => 'xian', + '岘' => 'xian', + '骧' => 'xiang', + '葙' => 'xiang', + '芗' => 'xiang', + '缃' => 'xiang', + '庠' => 'xiang', + '鲞' => 'xiang', + '蟓' => 'xiang', + '削' => 'xue', + '枵' => 'xiao', + '绡' => 'xiao', + '筱' => 'xiao', + '邪' => 'xie', + '勰' => 'xie', + '缬' => 'xie', + '血' => 'xue', + '榭' => 'xie', + '瀣' => 'xie', + '薤' => 'xie', + '燮' => 'xie', + '躞' => 'xie', + '廨' => 'xie', + '绁' => 'xie', + '渫' => 'xie', + '榍' => 'xie', + '獬' => 'xie', + '昕' => 'xin', + '忻' => 'xin', + '囟' => 'xin', + '陉' => 'jing', + '荥' => 'ying', + '饧' => 'tang', + '硎' => 'xing', + '荇' => 'xing', + '芎' => 'xiong', + '馐' => 'xiu', + '庥' => 'xiu', + '鸺' => 'xiu', + '貅' => 'xiu', + '髹' => 'xiu', + '宿' => 'xiu', + '岫' => 'xiu', + '溴' => 'xiu', + '吁' => 'xu', + '盱' => 'xu', + '顼' => 'xu', + '糈' => 'xu', + '醑' => 'xu', + '洫' => 'xu', + '溆' => 'xu', + '蓿' => 'xu', + '萱' => 'xuan', + '谖' => 'xuan', + '儇' => 'xuan', + '煊' => 'xuan', + '痃' => 'xuan', + '铉' => 'xuan', + '泫' => 'xuan', + '碹' => 'xuan', + '楦' => 'xuan', + '镟' => 'xuan', + '踅' => 'xue', + '泶' => 'xue', + '鳕' => 'xue', + '埙' => 'xun', + '曛' => 'xun', + '窨' => 'xun', + '獯' => 'xun', + '峋' => 'xun', + '洵' => 'xun', + '恂' => 'xun', + '浔' => 'xun', + '鲟' => 'xun', + '蕈' => 'xun', + '垭' => 'ya', + '岈' => 'ya', + '琊' => 'ya', + '痖' => 'ya', + '迓' => 'ya', + '砑' => 'ya', + '咽' => 'yan', + '鄢' => 'yan', + '菸' => 'yan', + '崦' => 'yan', + '铅' => 'qian', + '芫' => 'yuan', + '兖' => 'yan', + '琰' => 'yan', + '罨' => 'yan', + '厣' => 'yan', + '焱' => 'yan', + '酽' => 'yan', + '谳' => 'yan', + '鞅' => 'yang', + '炀' => 'yang', + '蛘' => 'yang', + '约' => 'yue', + '珧' => 'yao', + '轺' => 'yao', + '繇' => 'yao', + '鳐' => 'yao', + '崾' => 'yao', + '钥' => 'yao', + '曜' => 'yao', + '铘' => 'ye', + '烨' => 'ye', + '邺' => 'ye', + '靥' => 'ye', + '晔' => 'ye', + '猗' => 'yi', + '铱' => 'yi', + '欹' => 'qi', + '黟' => 'yi', + '怡' => 'yi', + '沂' => 'yi', + '圯' => 'yi', + '荑' => 'yi', + '诒' => 'yi', + '眙' => 'yi', + '嶷' => 'yi', + '钇' => 'yi', + '舣' => 'yi', + '酏' => 'yi', + '熠' => 'yi', + '弋' => 'yi', + '懿' => 'yi', + '镒' => 'yi', + '峄' => 'yi', + '怿' => 'yi', + '悒' => 'yi', + '佾' => 'yi', + '殪' => 'yi', + '挹' => 'yi', + '埸' => 'yi', + '劓' => 'yi', + '镱' => 'yi', + '瘗' => 'yi', + '癔' => 'yi', + '翊' => 'yi', + '蜴' => 'yi', + '氤' => 'yin', + '堙' => 'yin', + '洇' => 'yin', + '鄞' => 'yin', + '狺' => 'yin', + '夤' => 'yin', + '圻' => 'qi', + '饮' => 'yin', + '吲' => 'yin', + '胤' => 'yin', + '茚' => 'yin', + '璎' => 'ying', + '撄' => 'ying', + '嬴' => 'ying', + '滢' => 'ying', + '潆' => 'ying', + '蓥' => 'ying', + '瘿' => 'ying', + '郢' => 'ying', + '媵' => 'ying', + '邕' => 'yong', + '镛' => 'yong', + '墉' => 'yong', + '慵' => 'yong', + '痈' => 'yong', + '鳙' => 'yong', + '饔' => 'yong', + '喁' => 'yong', + '俑' => 'yong', + '莸' => 'you', + '猷' => 'you', + '疣' => 'you', + '蚰' => 'you', + '蝣' => 'you', + '莜' => 'you', + '牖' => 'you', + '铕' => 'you', + '卣' => 'you', + '宥' => 'you', + '侑' => 'you', + '蚴' => 'you', + '釉' => 'you', + '馀' => 'yu', + '萸' => 'yu', + '禺' => 'yu', + '妤' => 'yu', + '欤' => 'yu', + '觎' => 'yu', + '窬' => 'yu', + '蝓' => 'yu', + '嵛' => 'yu', + '舁' => 'yu', + '雩' => 'yu', + '龉' => 'yu', + '伛' => 'yu', + '圉' => 'yu', + '庾' => 'yu', + '瘐' => 'yu', + '窳' => 'yu', + '俣' => 'yu', + '毓' => 'yu', + '峪' => 'yu', + '煜' => 'yu', + '燠' => 'yu', + '蓣' => 'yu', + '饫' => 'yu', + '阈' => 'yu', + '鬻' => 'yu', + '聿' => 'yu', + '钰' => 'yu', + '鹆' => 'yu', + '蜮' => 'yu', + '眢' => 'yuan', + '箢' => 'yuan', + '员' => 'yuan', + '沅' => 'yuan', + '橼' => 'yuan', + '塬' => 'yuan', + '爰' => 'yuan', + '螈' => 'yuan', + '鼋' => 'yuan', + '掾' => 'yuan', + '垸' => 'yuan', + '瑗' => 'yuan', + '刖' => 'yue', + '瀹' => 'yue', + '樾' => 'yue', + '龠' => 'yue', + '氲' => 'yun', + '昀' => 'yun', + '郧' => 'yun', + '狁' => 'yun', + '郓' => 'yun', + '韫' => 'yun', + '恽' => 'yun', + '扎' => 'zha', + '拶' => 'za', + '咋' => 'za', + '仔' => 'zai', + '昝' => 'zan', + '瓒' => 'zan', + '奘' => 'zang', + '唣' => 'zao', + '择' => 'ze', + '迮' => 'ze', + '赜' => 'ze', + '笮' => 'ze', + '箦' => 'ze', + '舴' => 'ze', + '昃' => 'ze', + '缯' => 'zeng', + '罾' => 'zeng', + '齄' => 'zha', + '柞' => 'zha', + '痄' => 'zha', + '瘵' => 'zhai', + '旃' => 'zhan', + '璋' => 'zhang', + '漳' => 'zhang', + '嫜' => 'zhang', + '鄣' => 'zhang', + '仉' => 'zhang', + '幛' => 'zhang', + '着' => 'zhe', + '啁' => 'zhou', + '爪' => 'zhao', + '棹' => 'zhao', + '笊' => 'zhao', + '摺' => 'zhe', + '磔' => 'zhe', + '这' => 'zhe', + '柘' => 'zhe', + '桢' => 'zhen', + '蓁' => 'zhen', + '祯' => 'zhen', + '浈' => 'zhen', + '畛' => 'zhen', + '轸' => 'zhen', + '稹' => 'zhen', + '圳' => 'zhen', + '徵' => 'zhi', + '钲' => 'zheng', + '卮' => 'zhi', + '胝' => 'zhi', + '祗' => 'zhi', + '摭' => 'zhi', + '絷' => 'zhi', + '埴' => 'zhi', + '轵' => 'zhi', + '黹' => 'zhi', + '帙' => 'zhi', + '轾' => 'zhi', + '贽' => 'zhi', + '陟' => 'zhi', + '忮' => 'zhi', + '彘' => 'zhi', + '膣' => 'zhi', + '鸷' => 'zhi', + '骘' => 'zhi', + '踬' => 'zhi', + '郅' => 'zhi', + '觯' => 'zhi', + '锺' => 'zhong', + '螽' => 'zhong', + '舯' => 'zhong', + '碡' => 'zhou', + '绉' => 'zhou', + '荮' => 'zhou', + '籀' => 'zhou', + '酎' => 'zhou', + '洙' => 'zhu', + '邾' => 'zhu', + '潴' => 'zhu', + '槠' => 'zhu', + '橥' => 'zhu', + '舳' => 'zhu', + '瘃' => 'zhu', + '渚' => 'zhu', + '麈' => 'zhu', + '箸' => 'zhu', + '炷' => 'zhu', + '杼' => 'zhu', + '翥' => 'zhu', + '疰' => 'zhu', + '颛' => 'zhuan', + '赚' => 'zhuan', + '馔' => 'zhuan', + '僮' => 'tong', + '缒' => 'zhui', + '肫' => 'zhun', + '窀' => 'zhun', + '涿' => 'zhuo', + '倬' => 'zhuo', + '濯' => 'zhuo', + '诼' => 'zhuo', + '禚' => 'zhuo', + '浞' => 'zhuo', + '谘' => 'zi', + '淄' => 'zi', + '髭' => 'zi', + '孳' => 'zi', + '粢' => 'zi', + '趑' => 'zi', + '觜' => 'zui', + '缁' => 'zi', + '鲻' => 'zi', + '嵫' => 'zi', + '笫' => 'zi', + '耔' => 'zi', + '腙' => 'zong', + '偬' => 'zong', + '诹' => 'zou', + '陬' => 'zou', + '鄹' => 'zou', + '驺' => 'zou', + '鲰' => 'zou', + '菹' => 'ju', + '镞' => 'zu', + '躜' => 'zuan', + '缵' => 'zuan', + '蕞' => 'zui', + '撙' => 'zun', + '胙' => 'zuo', + '阿' => 'e', + '柏' => 'bai', + '蚌' => 'beng', + '薄' => 'bo', + '堡' => 'bao', + '呗' => 'bei', + '贲' => 'ben', + '臂' => 'bi', + '瘪' => 'bie', + '槟' => 'bin', + '剥' => 'bo', + '伯' => 'bo', + '卜' => 'bu', + '参' => 'can', + '嚓' => 'ca', + '差' => 'cha', + '孱' => 'chan', + '绰' => 'chuo', + '称' => 'cheng', + '澄' => 'cheng', + '大' => 'da', + '单' => 'dan', + '得' => 'de', + '的' => 'de', + '地' => 'di', + '都' => 'dou', + '读' => 'du', + '度' => 'du', + '蹲' => 'dun', + '佛' => 'fo', + '伽' => 'jia', + '盖' => 'gai', + '镐' => 'hao', + '给' => 'gei', + '呱' => 'gua', + '氿' => 'jiu', + '桧' => 'hui', + '掴' => 'guo', + '蛤' => 'ha', + '还' => 'hai', + '和' => 'he', + '核' => 'he', + '哼' => 'heng', + '鹄' => 'hu', + '划' => 'hua', + '夹' => 'jia', + '贾' => 'jia', + '芥' => 'jie', + '劲' => 'jin', + '荆' => 'jing', + '颈' => 'jing', + '貉' => 'he', + '吖' => 'a', + '啊' => 'a', + '锕' => 'a', + '哎' => 'ai', + '哀' => 'ai', + '埃' => 'ai', + '唉' => 'ai', + '欸' => 'ai', + '锿' => 'ai', + '挨' => 'ai', + '皑' => 'ai', + '癌' => 'ai', + '毐' => 'ai', + '矮' => 'ai', + '蔼' => 'ai', + '霭' => 'ai', + '砹' => 'ai', + '爱' => 'ai', + '隘' => 'ai', + '碍' => 'ai', + '嗳' => 'ai', + '嫒' => 'ai', + '叆' => 'ai', + '暧' => 'ai', + '安' => 'an', + '桉' => 'an', + '氨' => 'an', + '庵' => 'an', + '谙' => 'an', + '鹌' => 'an', + '鞍' => 'an', + '俺' => 'an', + '埯' => 'an', + '唵' => 'an', + '铵' => 'an', + '揞' => 'an', + '岸' => 'an', + '按' => 'an', + '胺' => 'an', + '案' => 'an', + '暗' => 'an', + '黯' => 'an', + '玵' => 'an', + '肮' => 'ang', + '昂' => 'ang', + '盎' => 'ang', + '凹' => 'ao', + '敖' => 'ao', + '遨' => 'ao', + '嗷' => 'ao', + '獒' => 'ao', + '熬' => 'ao', + '聱' => 'ao', + '螯' => 'ao', + '翱' => 'ao', + '謷' => 'ao', + '鏖' => 'ao', + '袄' => 'ao', + '媪' => 'ao', + '坳' => 'ao', + '傲' => 'ao', + '奥' => 'ao', + '骜' => 'ao', + '澳' => 'ao', + '懊' => 'ao', + '八' => 'ba', + '巴' => 'ba', + '叭' => 'ba', + '芭' => 'ba', + '疤' => 'ba', + '捌' => 'ba', + '笆' => 'ba', + '粑' => 'ba', + '拔' => 'ba', + '茇' => 'ba', + '妭' => 'ba', + '菝' => 'ba', + '跋' => 'ba', + '魃' => 'ba', + '把' => 'ba', + '靶' => 'ba', + '坝' => 'ba', + '爸' => 'ba', + '罢' => 'ba', + '霸' => 'ba', + '灞' => 'ba', + '吧' => 'ba', + '钯' => 'ba', + '掰' => 'bai', + '白' => 'bai', + '百' => 'bai', + '佰' => 'bai', + '捭' => 'bai', + '摆' => 'bai', + '败' => 'bai', + '拜' => 'bai', + '稗' => 'bai', + '扳' => 'ban', + '攽' => 'ban', + '班' => 'ban', + '般' => 'ban', + '颁' => 'ban', + '斑' => 'ban', + '搬' => 'ban', + '瘢' => 'ban', + '阪' => 'ban', + '坂' => 'ban', + '板' => 'ban', + '版' => 'ban', + '钣' => 'ban', + '舨' => 'ban', + '办' => 'ban', + '半' => 'ban', + '伴' => 'ban', + '拌' => 'ban', + '绊' => 'ban', + '瓣' => 'ban', + '扮' => 'ban', + '邦' => 'bang', + '帮' => 'bang', + '梆' => 'bang', + '浜' => 'bang', + '绑' => 'bang', + '榜' => 'bang', + '棒' => 'bang', + '傍' => 'bang', + '谤' => 'bang', + '蒡' => 'bang', + '镑' => 'bang', + '包' => 'bao', + '苞' => 'bao', + '孢' => 'bao', + '胞' => 'bao', + '龅' => 'bao', + '煲' => 'bao', + '褒' => 'bao', + '雹' => 'bao', + '饱' => 'bao', + '宝' => 'bao', + '保' => 'bao', + '鸨' => 'bao', + '葆' => 'bao', + '褓' => 'bao', + '报' => 'bao', + '抱' => 'bao', + '趵' => 'bao', + '豹' => 'bao', + '鲍' => 'bao', + '暴' => 'bao', + '爆' => 'bao', + '枹' => 'bao', + '杯' => 'bei', + '卑' => 'bei', + '悲' => 'bei', + '碑' => 'bei', + '北' => 'bei', + '贝' => 'bei', + '狈' => 'bei', + '备' => 'bei', + '背' => 'bei', + '钡' => 'bei', + '倍' => 'bei', + '悖' => 'bei', + '被' => 'bei', + '辈' => 'bei', + '惫' => 'bei', + '焙' => 'bei', + '蓓' => 'bei', + '碚' => 'bei', + '褙' => 'bei', + '别' => 'bei', + '蹩' => 'bei', + '椑' => 'bei', + '奔' => 'ben', + '倴' => 'ben', + '犇' => 'ben', + '锛' => 'ben', + '本' => 'ben', + '苯' => 'ben', + '坌' => 'ben', + '笨' => 'ben', + '崩' => 'beng', + '绷' => 'beng', + '嘣' => 'beng', + '甭' => 'beng', + '泵' => 'beng', + '迸' => 'beng', + '镚' => 'beng', + '蹦' => 'beng', + '屄' => 'bi', + '逼' => 'bi', + '荸' => 'bi', + '鼻' => 'bi', + '匕' => 'bi', + '比' => 'bi', + '吡' => 'bi', + '沘' => 'bi', + '妣' => 'bi', + '彼' => 'bi', + '秕' => 'bi', + '笔' => 'bi', + '俾' => 'bi', + '鄙' => 'bi', + '币' => 'bi', + '必' => 'bi', + '毕' => 'bi', + '闭' => 'bi', + '庇' => 'bi', + '诐' => 'bi', + '苾' => 'bi', + '荜' => 'bi', + '毖' => 'bi', + '哔' => 'bi', + '陛' => 'bi', + '毙' => 'bi', + '铋' => 'bi', + '狴' => 'bi', + '萆' => 'bi', + '梐' => 'bi', + '敝' => 'bi', + '婢' => 'bi', + '赑' => 'bi', + '愎' => 'bi', + '弼' => 'bi', + '蓖' => 'bi', + '痹' => 'bi', + '滗' => 'bi', + '碧' => 'bi', + '蔽' => 'bi', + '馝' => 'bi', + '弊' => 'bi', + '薜' => 'bi', + '篦' => 'bi', + '壁' => 'bi', + '避' => 'bi', + '髀' => 'bi', + '璧' => 'bi', + '芘' => 'bi', + '边' => 'bian', + '砭' => 'bian', + '萹' => 'bian', + '编' => 'bian', + '煸' => 'bian', + '蝙' => 'bian', + '鳊' => 'bian', + '鞭' => 'bian', + '贬' => 'bian', + '匾' => 'bian', + '褊' => 'bian', + '藊' => 'bian', + '卞' => 'bian', + '抃' => 'bian', + '苄' => 'bian', + '汴' => 'bian', + '忭' => 'bian', + '变' => 'bian', + '遍' => 'bian', + '辨' => 'bian', + '辩' => 'bian', + '辫' => 'bian', + '标' => 'biao', + '骉' => 'biao', + '彪' => 'biao', + '摽' => 'biao', + '膘' => 'biao', + '飙' => 'biao', + '镖' => 'biao', + '瀌' => 'biao', + '镳' => 'biao', + '表' => 'biao', + '婊' => 'biao', + '裱' => 'biao', + '鳔' => 'biao', + '憋' => 'bie', + '鳖' => 'bie', + '宾' => 'bin', + '彬' => 'bin', + '傧' => 'bin', + '滨' => 'bin', + '缤' => 'bin', + '濒' => 'bin', + '摈' => 'bin', + '殡' => 'bin', + '髌' => 'bin', + '鬓' => 'bin', + '冰' => 'bing', + '兵' => 'bing', + '丙' => 'bing', + '邴' => 'bing', + '秉' => 'bing', + '柄' => 'bing', + '饼' => 'bing', + '炳' => 'bing', + '禀' => 'bing', + '并' => 'bing', + '病' => 'bing', + '摒' => 'bing', + '拨' => 'bo', + '波' => 'bo', + '玻' => 'bo', + '钵' => 'bo', + '饽' => 'bo', + '袯' => 'bo', + '菠' => 'bo', + '播' => 'bo', + '驳' => 'bo', + '帛' => 'bo', + '勃' => 'bo', + '钹' => 'bo', + '铂' => 'bo', + '亳' => 'bo', + '舶' => 'bo', + '脖' => 'bo', + '博' => 'bo', + '鹁' => 'bo', + '渤' => 'bo', + '搏' => 'bo', + '馎' => 'bo', + '箔' => 'bo', + '膊' => 'bo', + '踣' => 'bo', + '馞' => 'bo', + '礴' => 'bo', + '跛' => 'bo', + '檗' => 'bo', + '擘' => 'bo', + '簸' => 'bo', + '啵' => 'bo', + '蕃' => 'bo', + '哱' => 'bo', + '卟' => 'bu', + '补' => 'bu', + '捕' => 'bu', + '哺' => 'bu', + '不' => 'bu', + '布' => 'bu', + '步' => 'bu', + '怖' => 'bu', + '钚' => 'bu', + '部' => 'bu', + '埠' => 'bu', + '簿' => 'bu', + '擦' => 'ca', + '猜' => 'cai', + '才' => 'cai', + '材' => 'cai', + '财' => 'cai', + '裁' => 'cai', + '采' => 'cai', + '彩' => 'cai', + '睬' => 'cai', + '踩' => 'cai', + '菜' => 'cai', + '蔡' => 'cai', + '餐' => 'can', + '残' => 'can', + '蚕' => 'can', + '惭' => 'can', + '惨' => 'can', + '黪' => 'can', + '灿' => 'can', + '粲' => 'can', + '璨' => 'can', + '穇' => 'can', + '仓' => 'cang', + '伧' => 'cang', + '苍' => 'cang', + '沧' => 'cang', + '舱' => 'cang', + '操' => 'cao', + '糙' => 'cao', + '曹' => 'cao', + '嘈' => 'cao', + '漕' => 'cao', + '槽' => 'cao', + '螬' => 'cao', + '草' => 'cao', + '册' => 'ce', + '厕' => 'ce', + '测' => 'ce', + '恻' => 'ce', + '策' => 'ce', + '岑' => 'cen', + '涔' => 'cen', + '噌' => 'ceng', + '层' => 'ceng', + '嶒' => 'ceng', + '蹭' => 'ceng', + '叉' => 'cha', + '杈' => 'cha', + '插' => 'cha', + '馇' => 'cha', + '锸' => 'cha', + '茬' => 'cha', + '茶' => 'cha', + '搽' => 'cha', + '嵖' => 'cha', + '猹' => 'cha', + '槎' => 'cha', + '碴' => 'cha', + '察' => 'cha', + '檫' => 'cha', + '衩' => 'cha', + '镲' => 'cha', + '汊' => 'cha', + '岔' => 'cha', + '侘' => 'cha', + '诧' => 'cha', + '姹' => 'cha', + '蹅' => 'cha', + '拆' => 'chai', + '钗' => 'chai', + '侪' => 'chai', + '柴' => 'chai', + '豺' => 'chai', + '虿' => 'chai', + '茝' => 'chai', + '觇' => 'chan', + '掺' => 'chan', + '搀' => 'chan', + '襜' => 'chan', + '谗' => 'chan', + '婵' => 'chan', + '馋' => 'chan', + '缠' => 'chan', + '蝉' => 'chan', + '潺' => 'chan', + '蟾' => 'chan', + '巉' => 'chan', + '产' => 'chan', + '浐' => 'chan', + '谄' => 'chan', + '铲' => 'chan', + '阐' => 'chan', + '蒇' => 'chan', + '骣' => 'chan', + '冁' => 'chan', + '忏' => 'chan', + '颤' => 'chan', + '羼' => 'chan', + '韂' => 'chan', + '伥' => 'chang', + '昌' => 'chang', + '菖' => 'chang', + '猖' => 'chang', + '娼' => 'chang', + '肠' => 'chang', + '尝' => 'chang', + '常' => 'chang', + '偿' => 'chang', + '徜' => 'chang', + '嫦' => 'chang', + '厂' => 'chang', + '场' => 'chang', + '昶' => 'chang', + '惝' => 'chang', + '敞' => 'chang', + '怅' => 'chang', + '畅' => 'chang', + '倡' => 'chang', + '唱' => 'chang', + '裳' => 'chang', + '抄' => 'chao', + '怊' => 'chao', + '钞' => 'chao', + '超' => 'chao', + '晁' => 'chao', + '巢' => 'chao', + '嘲' => 'chao', + '潮' => 'chao', + '吵' => 'chao', + '炒' => 'chao', + '耖' => 'chao', + '砗' => 'che', + '扯' => 'che', + '彻' => 'che', + '坼' => 'che', + '掣' => 'che', + '撤' => 'che', + '澈' => 'che', + '瞮' => 'che', + '抻' => 'chen', + '郴' => 'chen', + '嗔' => 'chen', + '瞋' => 'chen', + '臣' => 'chen', + '尘' => 'chen', + '辰' => 'chen', + '沉' => 'chen', + '忱' => 'chen', + '陈' => 'chen', + '宸' => 'chen', + '晨' => 'chen', + '谌' => 'chen', + '碜' => 'chen', + '衬' => 'chen', + '龀' => 'chen', + '趁' => 'chen', + '柽' => 'cheng', + '琤' => 'cheng', + '撑' => 'cheng', + '瞠' => 'cheng', + '成' => 'cheng', + '丞' => 'cheng', + '呈' => 'cheng', + '诚' => 'cheng', + '承' => 'cheng', + '城' => 'cheng', + '铖' => 'cheng', + '程' => 'cheng', + '惩' => 'cheng', + '酲' => 'cheng', + '橙' => 'cheng', + '逞' => 'cheng', + '骋' => 'cheng', + '秤' => 'cheng', + '铛' => 'cheng', + '樘' => 'cheng', + '吃' => 'chi', + '哧' => 'chi', + '鸱' => 'chi', + '蚩' => 'chi', + '笞' => 'chi', + '嗤' => 'chi', + '痴' => 'chi', + '媸' => 'chi', + '魑' => 'chi', + '池' => 'chi', + '弛' => 'chi', + '驰' => 'chi', + '迟' => 'chi', + '茌' => 'chi', + '持' => 'chi', + '踟' => 'chi', + '尺' => 'chi', + '齿' => 'chi', + '侈' => 'chi', + '耻' => 'chi', + '豉' => 'chi', + '褫' => 'chi', + '彳' => 'chi', + '叱' => 'chi', + '斥' => 'chi', + '赤' => 'chi', + '饬' => 'chi', + '炽' => 'chi', + '翅' => 'chi', + '敕' => 'chi', + '啻' => 'chi', + '傺' => 'chi', + '匙' => 'chi', + '冲' => 'chong', + '充' => 'chong', + '忡' => 'chong', + '茺' => 'chong', + '舂' => 'chong', + '憧' => 'chong', + '艟' => 'chong', + '虫' => 'chong', + '崇' => 'chong', + '宠' => 'chong', + '铳' => 'chong', + '抽' => 'chou', + '瘳' => 'chou', + '惆' => 'chou', + '绸' => 'chou', + '畴' => 'chou', + '酬' => 'chou', + '稠' => 'chou', + '愁' => 'chou', + '筹' => 'chou', + '踌' => 'chou', + '丑' => 'chou', + '瞅' => 'chou', + '出' => 'chu', + '初' => 'chu', + '樗' => 'chu', + '刍' => 'chu', + '除' => 'chu', + '厨' => 'chu', + '锄' => 'chu', + '滁' => 'chu', + '蜍' => 'chu', + '雏' => 'chu', + '橱' => 'chu', + '躇' => 'chu', + '蹰' => 'chu', + '杵' => 'chu', + '础' => 'chu', + '储' => 'chu', + '楚' => 'chu', + '褚' => 'chu', + '亍' => 'chu', + '处' => 'chu', + '怵' => 'chu', + '绌' => 'chu', + '搐' => 'chu', + '触' => 'chu', + '憷' => 'chu', + '黜' => 'chu', + '矗' => 'chu', + '揣' => 'chuai', + '搋' => 'chuai', + '膗' => 'chuai', + '踹' => 'chuai', + '川' => 'chuan', + '氚' => 'chuan', + '穿' => 'chuan', + '舡' => 'chuan', + '船' => 'chuan', + '遄' => 'chuan', + '椽' => 'chuan', + '舛' => 'chuan', + '喘' => 'chuan', + '串' => 'chuan', + '钏' => 'chuan', + '疮' => 'chuang', + '窗' => 'chuang', + '床' => 'chuang', + '闯' => 'chuang', + '创' => 'chuang', + '怆' => 'chuang', + '吹' => 'chui', + '炊' => 'chui', + '垂' => 'chui', + '陲' => 'chui', + '捶' => 'chui', + '棰' => 'chui', + '槌' => 'chui', + '锤' => 'chui', + '春' => 'chun', + '瑃' => 'chun', + '椿' => 'chun', + '蝽' => 'chun', + '纯' => 'chun', + '莼' => 'chun', + '唇' => 'chun', + '淳' => 'chun', + '鹑' => 'chun', + '醇' => 'chun', + '蠢' => 'chun', + '踔' => 'chuo', + '戳' => 'chuo', + '啜' => 'chuo', + '惙' => 'chuo', + '辍' => 'chuo', + '龊' => 'chuo', + '歠' => 'chuo', + '疵' => 'ci', + '词' => 'ci', + '茈' => 'ci', + '茨' => 'ci', + '祠' => 'ci', + '瓷' => 'ci', + '辞' => 'ci', + '慈' => 'ci', + '磁' => 'ci', + '雌' => 'ci', + '鹚' => 'ci', + '糍' => 'ci', + '此' => 'ci', + '泚' => 'ci', + '跐' => 'ci', + '次' => 'ci', + '刺' => 'ci', + '佽' => 'ci', + '赐' => 'ci', + '匆' => 'cong', + '苁' => 'cong', + '囱' => 'cong', + '枞' => 'cong', + '葱' => 'cong', + '骢' => 'cong', + '聪' => 'cong', + '从' => 'cong', + '丛' => 'cong', + '淙' => 'cong', + '悰' => 'cong', + '琮' => 'cong', + '凑' => 'cou', + '辏' => 'cou', + '腠' => 'cou', + '粗' => 'cu', + '徂' => 'cu', + '殂' => 'cu', + '促' => 'cu', + '猝' => 'cu', + '蔟' => 'cu', + '醋' => 'cu', + '踧' => 'cu', + '簇' => 'cu', + '蹙' => 'cu', + '蹴' => 'cu', + '汆' => 'cuan', + '撺' => 'cuan', + '镩' => 'cuan', + '蹿' => 'cuan', + '窜' => 'cuan', + '篡' => 'cuan', + '崔' => 'cui', + '催' => 'cui', + '摧' => 'cui', + '璀' => 'cui', + '脆' => 'cui', + '萃' => 'cui', + '啐' => 'cui', + '淬' => 'cui', + '悴' => 'cui', + '毳' => 'cui', + '瘁' => 'cui', + '粹' => 'cui', + '翠' => 'cui', + '村' => 'cun', + '皴' => 'cun', + '存' => 'cun', + '忖' => 'cun', + '寸' => 'cun', + '吋' => 'cun', + '搓' => 'cuo', + '磋' => 'cuo', + '蹉' => 'cuo', + '嵯' => 'cuo', + '矬' => 'cuo', + '痤' => 'cuo', + '脞' => 'cuo', + '挫' => 'cuo', + '莝' => 'cuo', + '厝' => 'cuo', + '措' => 'cuo', + '锉' => 'cuo', + '错' => 'cuo', + '酇' => 'cuo', + '咑' => 'da', + '垯' => 'da', + '耷' => 'da', + '搭' => 'da', + '褡' => 'da', + '达' => 'da', + '怛' => 'da', + '妲' => 'da', + '荙' => 'da', + '笪' => 'da', + '答' => 'da', + '跶' => 'da', + '靼' => 'da', + '瘩' => 'da', + '鞑' => 'da', + '打' => 'da', + '呆' => 'dai', + '歹' => 'dai', + '逮' => 'dai', + '傣' => 'dai', + '代' => 'dai', + '岱' => 'dai', + '迨' => 'dai', + '玳' => 'dai', + '带' => 'dai', + '殆' => 'dai', + '贷' => 'dai', + '待' => 'dai', + '怠' => 'dai', + '袋' => 'dai', + '叇' => 'dai', + '戴' => 'dai', + '黛' => 'dai', + '襶' => 'dai', + '呔' => 'dai', + '丹' => 'dan', + '担' => 'dan', + '眈' => 'dan', + '耽' => 'dan', + '郸' => 'dan', + '聃' => 'dan', + '殚' => 'dan', + '瘅' => 'dan', + '箪' => 'dan', + '儋' => 'dan', + '胆' => 'dan', + '疸' => 'dan', + '掸' => 'dan', + '亶' => 'dan', + '旦' => 'dan', + '但' => 'dan', + '诞' => 'dan', + '萏' => 'dan', + '啖' => 'dan', + '淡' => 'dan', + '惮' => 'dan', + '蛋' => 'dan', + '氮' => 'dan', + '赕' => 'dan', + '当' => 'dang', + '裆' => 'dang', + '挡' => 'dang', + '档' => 'dang', + '党' => 'dang', + '谠' => 'dang', + '凼' => 'dang', + '砀' => 'dang', + '宕' => 'dang', + '荡' => 'dang', + '菪' => 'dang', + '刀' => 'dao', + '忉' => 'dao', + '氘' => 'dao', + '舠' => 'dao', + '导' => 'dao', + '岛' => 'dao', + '捣' => 'dao', + '倒' => 'dao', + '捯' => 'dao', + '祷' => 'dao', + '蹈' => 'dao', + '到' => 'dao', + '盗' => 'dao', + '悼' => 'dao', + '道' => 'dao', + '稻' => 'dao', + '焘' => 'dao', + '锝' => 'de', + '嘚' => 'de', + '德' => 'de', + '扽' => 'den', + '灯' => 'deng', + '登' => 'deng', + '噔' => 'deng', + '蹬' => 'deng', + '等' => 'deng', + '戥' => 'deng', + '邓' => 'deng', + '僜' => 'deng', + '凳' => 'deng', + '嶝' => 'deng', + '磴' => 'deng', + '瞪' => 'deng', + '镫' => 'deng', + '低' => 'di', + '羝' => 'di', + '堤' => 'di', + '嘀' => 'di', + '滴' => 'di', + '狄' => 'di', + '迪' => 'di', + '籴' => 'di', + '荻' => 'di', + '敌' => 'di', + '涤' => 'di', + '笛' => 'di', + '觌' => 'di', + '嫡' => 'di', + '镝' => 'di', + '氐' => 'di', + '邸' => 'di', + '诋' => 'di', + '抵' => 'di', + '底' => 'di', + '柢' => 'di', + '砥' => 'di', + '骶' => 'di', + '玓' => 'di', + '弟' => 'di', + '帝' => 'di', + '递' => 'di', + '娣' => 'di', + '第' => 'di', + '谛' => 'di', + '蒂' => 'di', + '棣' => 'di', + '睇' => 'di', + '缔' => 'di', + '碲' => 'di', + '嗲' => 'dia', + '掂' => 'dian', + '滇' => 'dian', + '颠' => 'dian', + '巅' => 'dian', + '癫' => 'dian', + '典' => 'dian', + '点' => 'dian', + '碘' => 'dian', + '踮' => 'dian', + '电' => 'dian', + '甸' => 'dian', + '阽' => 'dian', + '坫' => 'dian', + '店' => 'dian', + '玷' => 'dian', + '垫' => 'dian', + '钿' => 'dian', + '淀' => 'dian', + '惦' => 'dian', + '奠' => 'dian', + '殿' => 'dian', + '靛' => 'dian', + '刁' => 'diao', + '叼' => 'diao', + '汈' => 'diao', + '凋' => 'diao', + '貂' => 'diao', + '碉' => 'diao', + '雕' => 'diao', + '鲷' => 'diao', + '屌' => 'diao', + '吊' => 'diao', + '钓' => 'diao', + '窎' => 'diao', + '掉' => 'diao', + '铫' => 'diao', + '爹' => 'die', + '跌' => 'die', + '迭' => 'die', + '谍' => 'die', + '耋' => 'die', + '喋' => 'die', + '牒' => 'die', + '叠' => 'die', + '碟' => 'die', + '嵽' => 'die', + '蝶' => 'die', + '蹀' => 'die', + '鲽' => 'die', + '仃' => 'ding', + '叮' => 'ding', + '玎' => 'ding', + '盯' => 'ding', + '町' => 'ding', + '耵' => 'ding', + '顶' => 'ding', + '酊' => 'ding', + '鼎' => 'ding', + '订' => 'ding', + '钉' => 'ding', + '定' => 'ding', + '啶' => 'ding', + '腚' => 'ding', + '碇' => 'ding', + '锭' => 'ding', + '丢' => 'diu', + '铥' => 'diu', + '东' => 'dong', + '冬' => 'dong', + '咚' => 'dong', + '氡' => 'dong', + '鸫' => 'dong', + '董' => 'dong', + '懂' => 'dong', + '动' => 'dong', + '冻' => 'dong', + '侗' => 'dong', + '栋' => 'dong', + '胨' => 'dong', + '洞' => 'dong', + '胴' => 'dong', + '兜' => 'dou', + '蔸' => 'dou', + '篼' => 'dou', + '抖' => 'dou', + '陡' => 'dou', + '蚪' => 'dou', + '斗' => 'dou', + '豆' => 'dou', + '逗' => 'dou', + '痘' => 'dou', + '窦' => 'dou', + '督' => 'du', + '嘟' => 'du', + '毒' => 'du', + '独' => 'du', + '渎' => 'du', + '椟' => 'du', + '犊' => 'du', + '牍' => 'du', + '黩' => 'du', + '髑' => 'du', + '厾' => 'du', + '笃' => 'du', + '堵' => 'du', + '赌' => 'du', + '睹' => 'du', + '杜' => 'du', + '肚' => 'du', + '妒' => 'du', + '渡' => 'du', + '镀' => 'du', + '蠹' => 'du', + '端' => 'duan', + '短' => 'duan', + '段' => 'duan', + '断' => 'duan', + '缎' => 'duan', + '椴' => 'duan', + '锻' => 'duan', + '簖' => 'duan', + '堆' => 'dui', + '队' => 'dui', + '对' => 'dui', + '兑' => 'dui', + '怼' => 'dui', + '憝' => 'dui', + '吨' => 'dun', + '惇' => 'dun', + '敦' => 'dun', + '墩' => 'dun', + '礅' => 'dun', + '盹' => 'dun', + '趸' => 'dun', + '沌' => 'dun', + '炖' => 'dun', + '砘' => 'dun', + '钝' => 'dun', + '盾' => 'dun', + '顿' => 'dun', + '遁' => 'dun', + '多' => 'duo', + '咄' => 'duo', + '哆' => 'duo', + '掇' => 'duo', + '裰' => 'duo', + '夺' => 'duo', + '踱' => 'duo', + '朵' => 'duo', + '垛' => 'duo', + '哚' => 'duo', + '躲' => 'duo', + '亸' => 'duo', + '剁' => 'duo', + '舵' => 'duo', + '堕' => 'duo', + '惰' => 'duo', + '跺' => 'duo', + '屙' => 'e', + '婀' => 'e', + '讹' => 'e', + '囮' => 'e', + '俄' => 'e', + '莪' => 'e', + '峨' => 'e', + '娥' => 'e', + '锇' => 'e', + '鹅' => 'e', + '蛾' => 'e', + '额' => 'e', + '厄' => 'e', + '扼' => 'e', + '苊' => 'e', + '呃' => 'e', + '垩' => 'e', + '饿' => 'e', + '鄂' => 'e', + '谔' => 'e', + '萼' => 'e', + '遏' => 'e', + '愕' => 'e', + '腭' => 'e', + '颚' => 'e', + '噩' => 'e', + '鳄' => 'e', + '恩' => 'en', + '蒽' => 'en', + '摁' => 'en', + '鞥' => 'eng', + '儿' => 'er', + '而' => 'er', + '鸸' => 'er', + '尔' => 'er', + '耳' => 'er', + '迩' => 'er', + '饵' => 'er', + '洱' => 'er', + '铒' => 'er', + '二' => 'er', + '贰' => 'er', + '发' => 'fa', + '乏' => 'fa', + '伐' => 'fa', + '罚' => 'fa', + '垡' => 'fa', + '阀' => 'fa', + '筏' => 'fa', + '法' => 'fa', + '砝' => 'fa', + '珐' => 'fa', + '帆' => 'fan', + '幡' => 'fan', + '藩' => 'fan', + '翻' => 'fan', + '凡' => 'fan', + '矾' => 'fan', + '钒' => 'fan', + '烦' => 'fan', + '樊' => 'fan', + '燔' => 'fan', + '繁' => 'fan', + '蹯' => 'fan', + '蘩' => 'fan', + '反' => 'fan', + '返' => 'fan', + '犯' => 'fan', + '饭' => 'fan', + '泛' => 'fan', + '范' => 'fan', + '贩' => 'fan', + '畈' => 'fan', + '梵' => 'fan', + '方' => 'fang', + '邡' => 'fang', + '坊' => 'fang', + '芳' => 'fang', + '枋' => 'fang', + '钫' => 'fang', + '防' => 'fang', + '妨' => 'fang', + '肪' => 'fang', + '房' => 'fang', + '鲂' => 'fang', + '仿' => 'fang', + '访' => 'fang', + '纺' => 'fang', + '舫' => 'fang', + '放' => 'fang', + '飞' => 'fei', + '妃' => 'fei', + '非' => 'fei', + '菲' => 'fei', + '啡' => 'fei', + '绯' => 'fei', + '扉' => 'fei', + '肥' => 'fei', + '淝' => 'fei', + '腓' => 'fei', + '匪' => 'fei', + '诽' => 'fei', + '悱' => 'fei', + '棐' => 'fei', + '斐' => 'fei', + '榧' => 'fei', + '翡' => 'fei', + '篚' => 'fei', + '吠' => 'fei', + '肺' => 'fei', + '狒' => 'fei', + '废' => 'fei', + '沸' => 'fei', + '费' => 'fei', + '痱' => 'fei', + '镄' => 'fei', + '分' => 'fen', + '芬' => 'fen', + '吩' => 'fen', + '纷' => 'fen', + '氛' => 'fen', + '酚' => 'fen', + '坟' => 'fen', + '汾' => 'fen', + '棼' => 'fen', + '焚' => 'fen', + '鼢' => 'fen', + '粉' => 'fen', + '份' => 'fen', + '奋' => 'fen', + '忿' => 'fen', + '偾' => 'fen', + '粪' => 'fen', + '愤' => 'fen', + '丰' => 'feng', + '风' => 'feng', + '沣' => 'feng', + '枫' => 'feng', + '封' => 'feng', + '砜' => 'feng', + '疯' => 'feng', + '峰' => 'feng', + '烽' => 'feng', + '葑' => 'feng', + '锋' => 'feng', + '蜂' => 'feng', + '酆' => 'feng', + '冯' => 'feng', + '逢' => 'feng', + '缝' => 'feng', + '讽' => 'feng', + '唪' => 'feng', + '凤' => 'feng', + '奉' => 'feng', + '俸' => 'feng', + '缶' => 'fou', + '夫' => 'fu', + '呋' => 'fu', + '肤' => 'fu', + '麸' => 'fu', + '跗' => 'fu', + '稃' => 'fu', + '孵' => 'fu', + '敷' => 'fu', + '弗' => 'fu', + '伏' => 'fu', + '凫' => 'fu', + '扶' => 'fu', + '芙' => 'fu', + '孚' => 'fu', + '拂' => 'fu', + '苻' => 'fu', + '服' => 'fu', + '怫' => 'fu', + '茯' => 'fu', + '氟' => 'fu', + '俘' => 'fu', + '浮' => 'fu', + '符' => 'fu', + '匐' => 'fu', + '涪' => 'fu', + '艴' => 'fu', + '幅' => 'fu', + '辐' => 'fu', + '蜉' => 'fu', + '福' => 'fu', + '蝠' => 'fu', + '抚' => 'fu', + '甫' => 'fu', + '拊' => 'fu', + '斧' => 'fu', + '府' => 'fu', + '俯' => 'fu', + '釜' => 'fu', + '辅' => 'fu', + '腑' => 'fu', + '腐' => 'fu', + '父' => 'fu', + '讣' => 'fu', + '付' => 'fu', + '负' => 'fu', + '妇' => 'fu', + '附' => 'fu', + '咐' => 'fu', + '阜' => 'fu', + '驸' => 'fu', + '赴' => 'fu', + '复' => 'fu', + '副' => 'fu', + '赋' => 'fu', + '傅' => 'fu', + '富' => 'fu', + '腹' => 'fu', + '缚' => 'fu', + '赙' => 'fu', + '蝮' => 'fu', + '覆' => 'fu', + '馥' => 'fu', + '袱' => 'fu', + '旮' => 'ga', + '嘎' => 'ga', + '钆' => 'ga', + '尜' => 'ga', + '尕' => 'ga', + '尬' => 'ga', + '该' => 'gai', + '垓' => 'gai', + '荄' => 'gai', + '赅' => 'gai', + '改' => 'gai', + '丐' => 'gai', + '钙' => 'gai', + '溉' => 'gai', + '概' => 'gai', + '甘' => 'gan', + '玕' => 'gan', + '肝' => 'gan', + '坩' => 'gan', + '苷' => 'gan', + '矸' => 'gan', + '泔' => 'gan', + '柑' => 'gan', + '竿' => 'gan', + '酐' => 'gan', + '疳' => 'gan', + '尴' => 'gan', + '杆' => 'gan', + '秆' => 'gan', + '赶' => 'gan', + '敢' => 'gan', + '感' => 'gan', + '澉' => 'gan', + '橄' => 'gan', + '擀' => 'gan', + '干' => 'gan', + '旰' => 'gan', + '绀' => 'gan', + '淦' => 'gan', + '骭' => 'gan', + '赣' => 'gan', + '冈' => 'gang', + '冮' => 'gang', + '刚' => 'gang', + '肛' => 'gang', + '纲' => 'gang', + '钢' => 'gang', + '缸' => 'gang', + '罡' => 'gang', + '岗' => 'gang', + '港' => 'gang', + '杠' => 'gang', + '皋' => 'gao', + '高' => 'gao', + '羔' => 'gao', + '睾' => 'gao', + '膏' => 'gao', + '篙' => 'gao', + '糕' => 'gao', + '杲' => 'gao', + '搞' => 'gao', + '槁' => 'gao', + '稿' => 'gao', + '告' => 'gao', + '郜' => 'gao', + '诰' => 'gao', + '锆' => 'gao', + '戈' => 'ge', + '圪' => 'ge', + '纥' => 'ge', + '疙' => 'ge', + '哥' => 'ge', + '胳' => 'ge', + '鸽' => 'ge', + '袼' => 'ge', + '搁' => 'ge', + '割' => 'ge', + '歌' => 'ge', + '革' => 'ge', + '阁' => 'ge', + '格' => 'ge', + '隔' => 'ge', + '嗝' => 'ge', + '膈' => 'ge', + '骼' => 'ge', + '镉' => 'ge', + '舸' => 'ge', + '葛' => 'ge', + '个' => 'ge', + '各' => 'ge', + '虼' => 'ge', + '硌' => 'ge', + '铬' => 'ge', + '根' => 'gen', + '跟' => 'gen', + '哏' => 'gen', + '亘' => 'gen', + '艮' => 'gen', + '茛' => 'gen', + '庚' => 'geng', + '耕' => 'geng', + '浭' => 'geng', + '赓' => 'geng', + '羹' => 'geng', + '埂' => 'geng', + '耿' => 'geng', + '哽' => 'geng', + '绠' => 'geng', + '梗' => 'geng', + '鲠' => 'geng', + '更' => 'geng', + '工' => 'gong', + '弓' => 'gong', + '公' => 'gong', + '功' => 'gong', + '攻' => 'gong', + '肱' => 'gong', + '宫' => 'gong', + '恭' => 'gong', + '蚣' => 'gong', + '躬' => 'gong', + '龚' => 'gong', + '塨' => 'gong', + '觥' => 'gong', + '巩' => 'gong', + '汞' => 'gong', + '拱' => 'gong', + '珙' => 'gong', + '共' => 'gong', + '贡' => 'gong', + '供' => 'gong', + '勾' => 'gou', + '佝' => 'gou', + '沟' => 'gou', + '钩' => 'gou', + '篝' => 'gou', + '苟' => 'gou', + '岣' => 'gou', + '狗' => 'gou', + '枸' => 'gou', + '构' => 'gou', + '购' => 'gou', + '诟' => 'gou', + '垢' => 'gou', + '够' => 'gou', + '彀' => 'gou', + '媾' => 'gou', + '觏' => 'gou', + '估' => 'gu', + '咕' => 'gu', + '沽' => 'gu', + '孤' => 'gu', + '姑' => 'gu', + '轱' => 'gu', + '鸪' => 'gu', + '菰' => 'gu', + '菇' => 'gu', + '蛄' => 'gu', + '蓇' => 'gu', + '辜' => 'gu', + '酤' => 'gu', + '觚' => 'gu', + '毂' => 'gu', + '箍' => 'gu', + '古' => 'gu', + '谷' => 'gu', + '汩' => 'gu', + '诂' => 'gu', + '股' => 'gu', + '骨' => 'gu', + '牯' => 'gu', + '钴' => 'gu', + '羖' => 'gu', + '蛊' => 'gu', + '鼓' => 'gu', + '榾' => 'gu', + '鹘' => 'gu', + '臌' => 'gu', + '瀔' => 'gu', + '固' => 'gu', + '故' => 'gu', + '顾' => 'gu', + '梏' => 'gu', + '崮' => 'gu', + '雇' => 'gu', + '锢' => 'gu', + '痼' => 'gu', + '瓜' => 'gua', + '刮' => 'gua', + '胍' => 'gua', + '鸹' => 'gua', + '剐' => 'gua', + '寡' => 'gua', + '卦' => 'gua', + '诖' => 'gua', + '挂' => 'gua', + '褂' => 'gua', + '乖' => 'guai', + '拐' => 'guai', + '怪' => 'guai', + '关' => 'guan', + '观' => 'guan', + '官' => 'guan', + '倌' => 'guan', + '蒄' => 'guan', + '棺' => 'guan', + '瘝' => 'guan', + '鳏' => 'guan', + '馆' => 'guan', + '管' => 'guan', + '贯' => 'guan', + '冠' => 'guan', + '掼' => 'guan', + '惯' => 'guan', + '祼' => 'guan', + '盥' => 'guan', + '灌' => 'guan', + '瓘' => 'guan', + '鹳' => 'guan', + '罐' => 'guan', + '琯' => 'guan', + '光' => 'guang', + '咣' => 'guang', + '胱' => 'guang', + '广' => 'guang', + '犷' => 'guang', + '桄' => 'guang', + '逛' => 'guang', + '归' => 'gui', + '圭' => 'gui', + '龟' => 'gui', + '妫' => 'gui', + '规' => 'gui', + '皈' => 'gui', + '闺' => 'gui', + '硅' => 'gui', + '瑰' => 'gui', + '鲑' => 'gui', + '宄' => 'gui', + '轨' => 'gui', + '庋' => 'gui', + '匦' => 'gui', + '诡' => 'gui', + '鬼' => 'gui', + '姽' => 'gui', + '癸' => 'gui', + '晷' => 'gui', + '簋' => 'gui', + '柜' => 'gui', + '炅' => 'gui', + '刿' => 'gui', + '刽' => 'gui', + '贵' => 'gui', + '桂' => 'gui', + '跪' => 'gui', + '鳜' => 'gui', + '衮' => 'gun', + '绲' => 'gun', + '辊' => 'gun', + '滚' => 'gun', + '磙' => 'gun', + '鲧' => 'gun', + '棍' => 'gun', + '埚' => 'guo', + '郭' => 'guo', + '啯' => 'guo', + '崞' => 'guo', + '聒' => 'guo', + '锅' => 'guo', + '蝈' => 'guo', + '国' => 'guo', + '帼' => 'guo', + '虢' => 'guo', + '果' => 'guo', + '椁' => 'guo', + '蜾' => 'guo', + '裹' => 'guo', + '过' => 'guo', + '哈' => 'ha', + '铪' => 'ha', + '孩' => 'hai', + '骸' => 'hai', + '胲' => 'hai', + '海' => 'hai', + '醢' => 'hai', + '亥' => 'hai', + '骇' => 'hai', + '害' => 'hai', + '嗐' => 'hai', + '嗨' => 'hai', + '顸' => 'han', + '蚶' => 'han', + '酣' => 'han', + '憨' => 'han', + '鼾' => 'han', + '邗' => 'han', + '邯' => 'han', + '含' => 'han', + '函' => 'han', + '晗' => 'han', + '焓' => 'han', + '涵' => 'han', + '韩' => 'han', + '寒' => 'han', + '罕' => 'han', + '喊' => 'han', + '蔊' => 'han', + '汉' => 'han', + '汗' => 'han', + '旱' => 'han', + '捍' => 'han', + '悍' => 'han', + '菡' => 'han', + '焊' => 'han', + '撖' => 'han', + '撼' => 'han', + '翰' => 'han', + '憾' => 'han', + '瀚' => 'han', + '夯' => 'hang', + '杭' => 'hang', + '绗' => 'hang', + '航' => 'hang', + '沆' => 'hang', + '蒿' => 'hao', + '薅' => 'hao', + '嚆' => 'hao', + '蚝' => 'hao', + '毫' => 'hao', + '嗥' => 'hao', + '豪' => 'hao', + '壕' => 'hao', + '嚎' => 'hao', + '濠' => 'hao', + '好' => 'hao', + '郝' => 'hao', + '号' => 'hao', + '昊' => 'hao', + '耗' => 'hao', + '浩' => 'hao', + '皓' => 'hao', + '滈' => 'hao', + '颢' => 'hao', + '灏' => 'hao', + '诃' => 'he', + '呵' => 'he', + '喝' => 'he', + '嗬' => 'he', + '禾' => 'he', + '合' => 'he', + '何' => 'he', + '劾' => 'he', + '河' => 'he', + '曷' => 'he', + '阂' => 'he', + '盍' => 'he', + '荷' => 'he', + '菏' => 'he', + '盒' => 'he', + '涸' => 'he', + '颌' => 'he', + '阖' => 'he', + '贺' => 'he', + '赫' => 'he', + '褐' => 'he', + '鹤' => 'he', + '壑' => 'he', + '黑' => 'hei', + '嘿' => 'hei', + '痕' => 'hen', + '很' => 'hen', + '狠' => 'hen', + '恨' => 'hen', + '亨' => 'heng', + '恒' => 'heng', + '珩' => 'heng', + '横' => 'heng', + '衡' => 'heng', + '蘅' => 'heng', + '啈' => 'heng', + '轰' => 'hong', + '訇' => 'hong', + '烘' => 'hong', + '薨' => 'hong', + '弘' => 'hong', + '红' => 'hong', + '闳' => 'hong', + '宏' => 'hong', + '荭' => 'hong', + '虹' => 'hong', + '竑' => 'hong', + '洪' => 'hong', + '鸿' => 'hong', + '哄' => 'hong', + '讧' => 'hong', + '吽' => 'hong', + '齁' => 'hou', + '侯' => 'hou', + '喉' => 'hou', + '猴' => 'hou', + '瘊' => 'hou', + '骺' => 'hou', + '篌' => 'hou', + '糇' => 'hou', + '吼' => 'hou', + '后' => 'hou', + '郈' => 'hou', + '厚' => 'hou', + '垕' => 'hou', + '逅' => 'hou', + '候' => 'hou', + '堠' => 'hou', + '鲎' => 'hou', + '乎' => 'hu', + '呼' => 'hu', + '忽' => 'hu', + '轷' => 'hu', + '烀' => 'hu', + '惚' => 'hu', + '滹' => 'hu', + '囫' => 'hu', + '狐' => 'hu', + '弧' => 'hu', + '胡' => 'hu', + '壶' => 'hu', + '斛' => 'hu', + '葫' => 'hu', + '猢' => 'hu', + '湖' => 'hu', + '瑚' => 'hu', + '鹕' => 'hu', + '槲' => 'hu', + '蝴' => 'hu', + '糊' => 'hu', + '醐' => 'hu', + '觳' => 'hu', + '虎' => 'hu', + '唬' => 'hu', + '琥' => 'hu', + '互' => 'hu', + '户' => 'hu', + '冱' => 'hu', + '护' => 'hu', + '沪' => 'hu', + '枑' => 'hu', + '怙' => 'hu', + '戽' => 'hu', + '笏' => 'hu', + '瓠' => 'hu', + '扈' => 'hu', + '鹱' => 'hu', + '花' => 'hua', + '砉' => 'hua', + '华' => 'hua', + '哗' => 'hua', + '骅' => 'hua', + '铧' => 'hua', + '猾' => 'hua', + '滑' => 'hua', + '化' => 'hua', + '画' => 'hua', + '话' => 'hua', + '桦' => 'hua', + '婳' => 'hua', + '觟' => 'hua', + '怀' => 'huai', + '徊' => 'huai', + '淮' => 'huai', + '槐' => 'huai', + '踝' => 'huai', + '耲' => 'huai', + '坏' => 'huai', + '欢' => 'huan', + '獾' => 'huan', + '环' => 'huan', + '洹' => 'huan', + '桓' => 'huan', + '萑' => 'huan', + '寰' => 'huan', + '缳' => 'huan', + '缓' => 'huan', + '幻' => 'huan', + '奂' => 'huan', + '宦' => 'huan', + '换' => 'huan', + '唤' => 'huan', + '涣' => 'huan', + '浣' => 'huan', + '患' => 'huan', + '焕' => 'huan', + '痪' => 'huan', + '豢' => 'huan', + '漶' => 'huan', + '鲩' => 'huan', + '擐' => 'huan', + '肓' => 'huang', + '荒' => 'huang', + '塃' => 'huang', + '慌' => 'huang', + '皇' => 'huang', + '黄' => 'huang', + '凰' => 'huang', + '隍' => 'huang', + '喤' => 'huang', + '遑' => 'huang', + '徨' => 'huang', + '湟' => 'huang', + '惶' => 'huang', + '媓' => 'huang', + '煌' => 'huang', + '锽' => 'huang', + '潢' => 'huang', + '璜' => 'huang', + '蝗' => 'huang', + '篁' => 'huang', + '艎' => 'huang', + '磺' => 'huang', + '癀' => 'huang', + '蟥' => 'huang', + '簧' => 'huang', + '鳇' => 'huang', + '恍' => 'huang', + '晃' => 'huang', + '谎' => 'huang', + '幌' => 'huang', + '滉' => 'huang', + '皝' => 'huang', + '灰' => 'hui', + '诙' => 'hui', + '挥' => 'hui', + '恢' => 'hui', + '晖' => 'hui', + '辉' => 'hui', + '麾' => 'hui', + '徽' => 'hui', + '隳' => 'hui', + '回' => 'hui', + '茴' => 'hui', + '洄' => 'hui', + '蛔' => 'hui', + '悔' => 'hui', + '毁' => 'hui', + '卉' => 'hui', + '汇' => 'hui', + '讳' => 'hui', + '荟' => 'hui', + '浍' => 'hui', + '诲' => 'hui', + '绘' => 'hui', + '恚' => 'hui', + '贿' => 'hui', + '烩' => 'hui', + '彗' => 'hui', + '晦' => 'hui', + '秽' => 'hui', + '惠' => 'hui', + '喙' => 'hui', + '慧' => 'hui', + '蕙' => 'hui', + '蟪' => 'hui', + '珲' => 'hun', + '昏' => 'hun', + '荤' => 'hun', + '阍' => 'hun', + '惛' => 'hun', + '婚' => 'hun', + '浑' => 'hun', + '馄' => 'hun', + '混' => 'hun', + '魂' => 'hun', + '诨' => 'hun', + '溷' => 'hun', + '耠' => 'huo', + '劐' => 'huo', + '豁' => 'huo', + '活' => 'huo', + '火' => 'huo', + '伙' => 'huo', + '钬' => 'huo', + '夥' => 'huo', + '或' => 'huo', + '货' => 'huo', + '获' => 'huo', + '祸' => 'huo', + '惑' => 'huo', + '霍' => 'huo', + '镬' => 'huo', + '攉' => 'huo', + '藿' => 'huo', + '嚯' => 'huo', + '讥' => 'ji', + '击' => 'ji', + '叽' => 'ji', + '饥' => 'ji', + '玑' => 'ji', + '圾' => 'ji', + '芨' => 'ji', + '机' => 'ji', + '乩' => 'ji', + '肌' => 'ji', + '矶' => 'ji', + '鸡' => 'ji', + '剞' => 'ji', + '唧' => 'ji', + '积' => 'ji', + '笄' => 'ji', + '屐' => 'ji', + '姬' => 'ji', + '基' => 'ji', + '犄' => 'ji', + '嵇' => 'ji', + '畸' => 'ji', + '跻' => 'ji', + '箕' => 'ji', + '齑' => 'ji', + '畿' => 'ji', + '墼' => 'ji', + '激' => 'ji', + '羁' => 'ji', + '及' => 'ji', + '吉' => 'ji', + '岌' => 'ji', + '汲' => 'ji', + '级' => 'ji', + '极' => 'ji', + '即' => 'ji', + '佶' => 'ji', + '笈' => 'ji', + '急' => 'ji', + '疾' => 'ji', + '棘' => 'ji', + '集' => 'ji', + '蒺' => 'ji', + '楫' => 'ji', + '辑' => 'ji', + '嫉' => 'ji', + '瘠' => 'ji', + '藉' => 'ji', + '籍' => 'ji', + '几' => 'ji', + '己' => 'ji', + '虮' => 'ji', + '挤' => 'ji', + '脊' => 'ji', + '掎' => 'ji', + '戟' => 'ji', + '麂' => 'ji', + '计' => 'ji', + '记' => 'ji', + '伎' => 'ji', + '纪' => 'ji', + '技' => 'ji', + '忌' => 'ji', + '际' => 'ji', + '妓' => 'ji', + '季' => 'ji', + '剂' => 'ji', + '迹' => 'ji', + '济' => 'ji', + '既' => 'ji', + '觊' => 'ji', + '继' => 'ji', + '偈' => 'ji', + '祭' => 'ji', + '悸' => 'ji', + '寄' => 'ji', + '寂' => 'ji', + '绩' => 'ji', + '暨' => 'ji', + '稷' => 'ji', + '鲫' => 'ji', + '髻' => 'ji', + '冀' => 'ji', + '骥' => 'ji', + '加' => 'jia', + '佳' => 'jia', + '枷' => 'jia', + '浃' => 'jia', + '痂' => 'jia', + '家' => 'jia', + '袈' => 'jia', + '嘉' => 'jia', + '镓' => 'jia', + '荚' => 'jia', + '戛' => 'jia', + '颊' => 'jia', + '甲' => 'jia', + '胛' => 'jia', + '钾' => 'jia', + '假' => 'jia', + '价' => 'jia', + '驾' => 'jia', + '架' => 'jia', + '嫁' => 'jia', + '稼' => 'jia', + '戋' => 'jian', + '尖' => 'jian', + '奸' => 'jian', + '歼' => 'jian', + '坚' => 'jian', + '间' => 'jian', + '肩' => 'jian', + '艰' => 'jian', + '监' => 'jian', + '兼' => 'jian', + '菅' => 'jian', + '笺' => 'jian', + '缄' => 'jian', + '煎' => 'jian', + '拣' => 'jian', + '茧' => 'jian', + '柬' => 'jian', + '俭' => 'jian', + '捡' => 'jian', + '检' => 'jian', + '减' => 'jian', + '剪' => 'jian', + '睑' => 'jian', + '简' => 'jian', + '碱' => 'jian', + '见' => 'jian', + '件' => 'jian', + '饯' => 'jian', + '建' => 'jian', + '荐' => 'jian', + '贱' => 'jian', + '剑' => 'jian', + '健' => 'jian', + '舰' => 'jian', + '涧' => 'jian', + '渐' => 'jian', + '谏' => 'jian', + '践' => 'jian', + '锏' => 'jian', + '毽' => 'jian', + '腱' => 'jian', + '溅' => 'jian', + '鉴' => 'jian', + '键' => 'jian', + '僭' => 'jian', + '箭' => 'jian', + '江' => 'jiang', + '将' => 'jiang', + '姜' => 'jiang', + '豇' => 'jiang', + '浆' => 'jiang', + '僵' => 'jiang', + '缰' => 'jiang', + '疆' => 'jiang', + '讲' => 'jiang', + '奖' => 'jiang', + '桨' => 'jiang', + '蒋' => 'jiang', + '匠' => 'jiang', + '酱' => 'jiang', + '犟' => 'jiang', + '糨' => 'jiang', + '交' => 'jiao', + '郊' => 'jiao', + '浇' => 'jiao', + '娇' => 'jiao', + '姣' => 'jiao', + '骄' => 'jiao', + '胶' => 'jiao', + '椒' => 'jiao', + '蛟' => 'jiao', + '焦' => 'jiao', + '跤' => 'jiao', + '蕉' => 'jiao', + '礁' => 'jiao', + '佼' => 'jiao', + '狡' => 'jiao', + '饺' => 'jiao', + '绞' => 'jiao', + '铰' => 'jiao', + '矫' => 'jiao', + '皎' => 'jiao', + '脚' => 'jiao', + '搅' => 'jiao', + '剿' => 'jiao', + '缴' => 'jiao', + '叫' => 'jiao', + '轿' => 'jiao', + '较' => 'jiao', + '教' => 'jiao', + '窖' => 'jiao', + '酵' => 'jiao', + '侥' => 'jiao', + '阶' => 'jie', + '皆' => 'jie', + '接' => 'jie', + '秸' => 'jie', + '揭' => 'jie', + '嗟' => 'jie', + '街' => 'jie', + '孑' => 'jie', + '节' => 'jie', + '讦' => 'jie', + '劫' => 'jie', + '杰' => 'jie', + '诘' => 'jie', + '洁' => 'jie', + '结' => 'jie', + '捷' => 'jie', + '睫' => 'jie', + '截' => 'jie', + '碣' => 'jie', + '竭' => 'jie', + '姐' => 'jie', + '解' => 'jie', + '介' => 'jie', + '戒' => 'jie', + '届' => 'jie', + '界' => 'jie', + '疥' => 'jie', + '诫' => 'jie', + '借' => 'jie', + '巾' => 'jin', + '斤' => 'jin', + '今' => 'jin', + '金' => 'jin', + '津' => 'jin', + '矜' => 'jin', + '筋' => 'jin', + '襟' => 'jin', + '仅' => 'jin', + '紧' => 'jin', + '锦' => 'jin', + '谨' => 'jin', + '尽' => 'jin', + '进' => 'jin', + '近' => 'jin', + '晋' => 'jin', + '烬' => 'jin', + '浸' => 'jin', + '禁' => 'jin', + '觐' => 'jin', + '噤' => 'jin', + '茎' => 'jing', + '京' => 'jing', + '泾' => 'jing', + '经' => 'jing', + '菁' => 'jing', + '惊' => 'jing', + '晶' => 'jing', + '睛' => 'jing', + '粳' => 'jing', + '兢' => 'jing', + '精' => 'jing', + '鲸' => 'jing', + '井' => 'jing', + '阱' => 'jing', + '刭' => 'jing', + '景' => 'jing', + '儆' => 'jing', + '警' => 'jing', + '径' => 'jing', + '净' => 'jing', + '痉' => 'jing', + '竞' => 'jing', + '竟' => 'jing', + '敬' => 'jing', + '靖' => 'jing', + '静' => 'jing', + '境' => 'jing', + '镜' => 'jing', + '迥' => 'jiong', + '炯' => 'jiong', + '窘' => 'jiong', + '纠' => 'jiu', + '鸠' => 'jiu', + '究' => 'jiu', + '赳' => 'jiu', + '阄' => 'jiu', + '揪' => 'jiu', + '啾' => 'jiu', + '九' => 'jiu', + '久' => 'jiu', + '玖' => 'jiu', + '灸' => 'jiu', + '韭' => 'jiu', + '酒' => 'jiu', + '旧' => 'jiu', + '臼' => 'jiu', + '咎' => 'jiu', + '柩' => 'jiu', + '救' => 'jiu', + '厩' => 'jiu', + '就' => 'jiu', + '舅' => 'jiu', + '鹫' => 'jiu', + '军' => 'jun', + '均' => 'jun', + '君' => 'jun', + '钧' => 'jun', + '菌' => 'jun', + '皲' => 'jun', + '俊' => 'jun', + '郡' => 'jun', + '峻' => 'jun', + '骏' => 'jun', + '竣' => 'jun', + '拘' => 'ju', + '狙' => 'ju', + '居' => 'ju', + '驹' => 'ju', + '掬' => 'ju', + '雎' => 'ju', + '鞠' => 'ju', + '局' => 'ju', + '菊' => 'ju', + '焗' => 'ju', + '橘' => 'ju', + '咀' => 'ju', + '沮' => 'ju', + '矩' => 'ju', + '举' => 'ju', + '龃' => 'ju', + '巨' => 'ju', + '拒' => 'ju', + '具' => 'ju', + '炬' => 'ju', + '俱' => 'ju', + '剧' => 'ju', + '据' => 'ju', + '距' => 'ju', + '惧' => 'ju', + '飓' => 'ju', + '锯' => 'ju', + '聚' => 'ju', + '踞' => 'ju', + '捐' => 'juan', + '涓' => 'juan', + '娟' => 'juan', + '鹃' => 'juan', + '卷' => 'juan', + '倦' => 'juan', + '绢' => 'juan', + '眷' => 'juan', + '隽' => 'juan', + '撅' => 'jue', + '噘' => 'jue', + '决' => 'jue', + '诀' => 'jue', + '抉' => 'jue', + '绝' => 'jue', + '掘' => 'jue', + '崛' => 'jue', + '厥' => 'jue', + '谲' => 'jue', + '蕨' => 'jue', + '爵' => 'jue', + '蹶' => 'jue', + '矍' => 'jue', + '倔' => 'jue', + '咔' => 'ka', + '开' => 'kai', + '揩' => 'kai', + '凯' => 'kai', + '铠' => 'kai', + '慨' => 'kai', + '楷' => 'kai', + '忾' => 'kai', + '刊' => 'kan', + '勘' => 'kan', + '龛' => 'kan', + '堪' => 'kan', + '坎' => 'kan', + '侃' => 'kan', + '砍' => 'kan', + '槛' => 'kan', + '看' => 'kan', + '瞰' => 'kan', + '康' => 'kang', + '慷' => 'kang', + '糠' => 'kang', + '亢' => 'kang', + '伉' => 'kang', + '抗' => 'kang', + '炕' => 'kang', + '考' => 'kao', + '拷' => 'kao', + '烤' => 'kao', + '铐' => 'kao', + '犒' => 'kao', + '靠' => 'kao', + '苛' => 'ke', + '轲' => 'ke', + '科' => 'ke', + '棵' => 'ke', + '搕' => 'ke', + '嗑' => 'ke', + '稞' => 'ke', + '窠' => 'ke', + '颗' => 'ke', + '磕' => 'ke', + '瞌' => 'ke', + '蝌' => 'ke', + '可' => 'ke', + '坷' => 'ke', + '渴' => 'ke', + '克' => 'ke', + '刻' => 'ke', + '恪' => 'ke', + '客' => 'ke', + '课' => 'ke', + '肯' => 'ken', + '垦' => 'ken', + '恳' => 'ken', + '啃' => 'ken', + '坑' => 'keng', + '铿' => 'keng', + '空' => 'kong', + '孔' => 'kong', + '恐' => 'kong', + '控' => 'kong', + '抠' => 'kou', + '口' => 'kou', + '叩' => 'kou', + '扣' => 'kou', + '寇' => 'kou', + '蔻' => 'kou', + '枯' => 'ku', + '哭' => 'ku', + '窟' => 'ku', + '骷' => 'ku', + '苦' => 'ku', + '库' => 'ku', + '绔' => 'ku', + '裤' => 'ku', + '酷' => 'ku', + '夸' => 'kua', + '垮' => 'kua', + '挎' => 'kua', + '胯' => 'kua', + '跨' => 'kua', + '块' => 'kuai', + '快' => 'kuai', + '侩' => 'kuai', + '脍' => 'kuai', + '筷' => 'kuai', + '宽' => 'kuan', + '髋' => 'kuan', + '款' => 'kuan', + '诓' => 'kuang', + '哐' => 'kuang', + '筐' => 'kuang', + '狂' => 'kuang', + '诳' => 'kuang', + '旷' => 'kuang', + '况' => 'kuang', + '矿' => 'kuang', + '框' => 'kuang', + '眶' => 'kuang', + '亏' => 'kui', + '盔' => 'kui', + '窥' => 'kui', + '葵' => 'kui', + '魁' => 'kui', + '傀' => 'kui', + '匮' => 'kui', + '馈' => 'kui', + '愧' => 'kui', + '坤' => 'kun', + '昆' => 'kun', + '鲲' => 'kun', + '捆' => 'kun', + '困' => 'kun', + '扩' => 'kuo', + '括' => 'kuo', + '阔' => 'kuo', + '廓' => 'kuo', + '垃' => 'la', + '拉' => 'la', + '啦' => 'la', + '邋' => 'la', + '旯' => 'la', + '喇' => 'la', + '腊' => 'la', + '蜡' => 'la', + '辣' => 'la', + '来' => 'lai', + '莱' => 'lai', + '徕' => 'lai', + '睐' => 'lai', + '赖' => 'lai', + '癞' => 'lai', + '籁' => 'lai', + '兰' => 'lan', + '岚' => 'lan', + '拦' => 'lan', + '栏' => 'lan', + '婪' => 'lan', + '阑' => 'lan', + '蓝' => 'lan', + '澜' => 'lan', + '褴' => 'lan', + '篮' => 'lan', + '览' => 'lan', + '揽' => 'lan', + '缆' => 'lan', + '榄' => 'lan', + '懒' => 'lan', + '烂' => 'lan', + '滥' => 'lan', + '啷' => 'lang', + '郎' => 'lang', + '狼' => 'lang', + '琅' => 'lang', + '廊' => 'lang', + '榔' => 'lang', + '锒' => 'lang', + '螂' => 'lang', + '朗' => 'lang', + '浪' => 'lang', + '捞' => 'lao', + '劳' => 'lao', + '牢' => 'lao', + '崂' => 'lao', + '老' => 'lao', + '佬' => 'lao', + '姥' => 'lao', + '唠' => 'lao', + '烙' => 'lao', + '涝' => 'lao', + '酪' => 'lao', + '雷' => 'lei', + '羸' => 'lei', + '垒' => 'lei', + '磊' => 'lei', + '蕾' => 'lei', + '儡' => 'lei', + '肋' => 'lei', + '泪' => 'lei', + '类' => 'lei', + '累' => 'lei', + '擂' => 'lei', + '嘞' => 'lei', + '棱' => 'leng', + '楞' => 'leng', + '冷' => 'leng', + '睖' => 'leng', + '厘' => 'li', + '狸' => 'li', + '离' => 'li', + '梨' => 'li', + '犁' => 'li', + '鹂' => 'li', + '喱' => 'li', + '蜊' => 'li', + '漓' => 'li', + '璃' => 'li', + '黎' => 'li', + '罹' => 'li', + '篱' => 'li', + '蠡' => 'li', + '礼' => 'li', + '李' => 'li', + '里' => 'li', + '俚' => 'li', + '逦' => 'li', + '哩' => 'li', + '娌' => 'li', + '理' => 'li', + '鲤' => 'li', + '力' => 'li', + '历' => 'li', + '厉' => 'li', + '立' => 'li', + '吏' => 'li', + '丽' => 'li', + '励' => 'li', + '呖' => 'li', + '利' => 'li', + '沥' => 'li', + '枥' => 'li', + '例' => 'li', + '戾' => 'li', + '隶' => 'li', + '荔' => 'li', + '俐' => 'li', + '莉' => 'li', + '莅' => 'li', + '栗' => 'li', + '砾' => 'li', + '蛎' => 'li', + '唳' => 'li', + '笠' => 'li', + '粒' => 'li', + '雳' => 'li', + '痢' => 'li', + '连' => 'lian', + '怜' => 'lian', + '帘' => 'lian', + '莲' => 'lian', + '涟' => 'lian', + '联' => 'lian', + '廉' => 'lian', + '鲢' => 'lian', + '镰' => 'lian', + '敛' => 'lian', + '脸' => 'lian', + '练' => 'lian', + '炼' => 'lian', + '恋' => 'lian', + '殓' => 'lian', + '链' => 'lian', + '良' => 'liang', + '凉' => 'liang', + '梁' => 'liang', + '粮' => 'liang', + '粱' => 'liang', + '两' => 'liang', + '魉' => 'liang', + '亮' => 'liang', + '谅' => 'liang', + '辆' => 'liang', + '靓' => 'liang', + '量' => 'liang', + '晾' => 'liang', + '踉' => 'liang', + '辽' => 'liao', + '疗' => 'liao', + '聊' => 'liao', + '僚' => 'liao', + '寥' => 'liao', + '撩' => 'liao', + '嘹' => 'liao', + '獠' => 'liao', + '潦' => 'liao', + '缭' => 'liao', + '燎' => 'liao', + '料' => 'liao', + '撂' => 'liao', + '瞭' => 'liao', + '镣' => 'liao', + '咧' => 'lie', + '列' => 'lie', + '劣' => 'lie', + '冽' => 'lie', + '烈' => 'lie', + '猎' => 'lie', + '裂' => 'lie', + '趔' => 'lie', + '拎' => 'lin', + '邻' => 'lin', + '林' => 'lin', + '临' => 'lin', + '淋' => 'lin', + '琳' => 'lin', + '粼' => 'lin', + '嶙' => 'lin', + '潾' => 'lin', + '霖' => 'lin', + '磷' => 'lin', + '鳞' => 'lin', + '麟' => 'lin', + '凛' => 'lin', + '檩' => 'lin', + '吝' => 'lin', + '赁' => 'lin', + '躏' => 'lin', + '伶' => 'ling', + '灵' => 'ling', + '苓' => 'ling', + '囹' => 'ling', + '泠' => 'ling', + '玲' => 'ling', + '瓴' => 'ling', + '铃' => 'ling', + '凌' => 'ling', + '陵' => 'ling', + '聆' => 'ling', + '菱' => 'ling', + '棂' => 'ling', + '蛉' => 'ling', + '翎' => 'ling', + '羚' => 'ling', + '绫' => 'ling', + '零' => 'ling', + '龄' => 'ling', + '岭' => 'ling', + '领' => 'ling', + '另' => 'ling', + '令' => 'ling', + '溜' => 'liu', + '熘' => 'liu', + '刘' => 'liu', + '浏' => 'liu', + '留' => 'liu', + '流' => 'liu', + '琉' => 'liu', + '硫' => 'liu', + '馏' => 'liu', + '榴' => 'liu', + '瘤' => 'liu', + '柳' => 'liu', + '绺' => 'liu', + '六' => 'liu', + '遛' => 'liu', + '龙' => 'long', + '咙' => 'long', + '珑' => 'long', + '胧' => 'long', + '聋' => 'long', + '笼' => 'long', + '隆' => 'long', + '窿' => 'long', + '陇' => 'long', + '拢' => 'long', + '垄' => 'long', + '娄' => 'lou', + '楼' => 'lou', + '髅' => 'lou', + '搂' => 'lou', + '篓' => 'lou', + '陋' => 'lou', + '镂' => 'lou', + '漏' => 'lou', + '喽' => 'lou', + '撸' => 'lu', + '卢' => 'lu', + '芦' => 'lu', + '庐' => 'lu', + '炉' => 'lu', + '泸' => 'lu', + '鸬' => 'lu', + '颅' => 'lu', + '鲈' => 'lu', + '卤' => 'lu', + '虏' => 'lu', + '掳' => 'lu', + '鲁' => 'lu', + '橹' => 'lu', + '录' => 'lu', + '赂' => 'lu', + '鹿' => 'lu', + '禄' => 'lu', + '路' => 'lu', + '箓' => 'lu', + '漉' => 'lu', + '戮' => 'lu', + '鹭' => 'lu', + '麓' => 'lu', + '峦' => 'luan', + '孪' => 'luan', + '挛' => 'luan', + '鸾' => 'luan', + '卵' => 'luan', + '乱' => 'luan', + '抡' => 'lun', + '仑' => 'lun', + '伦' => 'lun', + '囵' => 'lun', + '沦' => 'lun', + '轮' => 'lun', + '论' => 'lun', + '啰' => 'luo', + '罗' => 'luo', + '萝' => 'luo', + '逻' => 'luo', + '锣' => 'luo', + '箩' => 'luo', + '骡' => 'luo', + '螺' => 'luo', + '裸' => 'luo', + '洛' => 'luo', + '络' => 'luo', + '骆' => 'luo', + '摞' => 'luo', + '漯' => 'luo', + '驴' => 'lv', + '榈' => 'lv', + '吕' => 'lv', + '侣' => 'lv', + '旅' => 'lv', + '铝' => 'lv', + '屡' => 'lv', + '缕' => 'lv', + '膂' => 'lv', + '褛' => 'lv', + '履' => 'lv', + '律' => 'lv', + '虑' => 'lv', + '氯' => 'lv', + '滤' => 'lv', + '掠' => 'lve', + '略' => 'lve', + '妈' => 'ma', + '麻' => 'ma', + '蟆' => 'ma', + '马' => 'ma', + '犸' => 'ma', + '玛' => 'ma', + '码' => 'ma', + '蚂' => 'ma', + '骂' => 'ma', + '吗' => 'ma', + '嘛' => 'ma', + '霾' => 'mai', + '买' => 'mai', + '迈' => 'mai', + '麦' => 'mai', + '卖' => 'mai', + '霡' => 'mai', + '蛮' => 'man', + '馒' => 'man', + '瞒' => 'man', + '满' => 'man', + '曼' => 'man', + '谩' => 'man', + '幔' => 'man', + '漫' => 'man', + '慢' => 'man', + '牤' => 'mang', + '芒' => 'mang', + '忙' => 'mang', + '盲' => 'mang', + '氓' => 'mang', + '茫' => 'mang', + '莽' => 'mang', + '漭' => 'mang', + '蟒' => 'mang', + '猫' => 'mao', + '毛' => 'mao', + '矛' => 'mao', + '茅' => 'mao', + '牦' => 'mao', + '锚' => 'mao', + '髦' => 'mao', + '蝥' => 'mao', + '蟊' => 'mao', + '冇' => 'mao', + '卯' => 'mao', + '铆' => 'mao', + '茂' => 'mao', + '冒' => 'mao', + '贸' => 'mao', + '袤' => 'mao', + '帽' => 'mao', + '貌' => 'mao', + '玫' => 'mei', + '枚' => 'mei', + '眉' => 'mei', + '莓' => 'mei', + '梅' => 'mei', + '媒' => 'mei', + '楣' => 'mei', + '煤' => 'mei', + '酶' => 'mei', + '霉' => 'mei', + '每' => 'mei', + '美' => 'mei', + '镁' => 'mei', + '妹' => 'mei', + '昧' => 'mei', + '袂' => 'mei', + '寐' => 'mei', + '媚' => 'mei', + '魅' => 'mei', + '门' => 'men', + '扪' => 'men', + '闷' => 'men', + '焖' => 'men', + '懑' => 'men', + '们' => 'men', + '虻' => 'meng', + '萌' => 'meng', + '蒙' => 'meng', + '盟' => 'meng', + '檬' => 'meng', + '曚' => 'meng', + '朦' => 'meng', + '猛' => 'meng', + '锰' => 'meng', + '蜢' => 'meng', + '懵' => 'meng', + '孟' => 'meng', + '梦' => 'meng', + '咪' => 'mi', + '眯' => 'mi', + '弥' => 'mi', + '迷' => 'mi', + '猕' => 'mi', + '谜' => 'mi', + '醚' => 'mi', + '糜' => 'mi', + '麋' => 'mi', + '靡' => 'mi', + '米' => 'mi', + '弭' => 'mi', + '觅' => 'mi', + '密' => 'mi', + '幂' => 'mi', + '谧' => 'mi', + '蜜' => 'mi', + '眠' => 'mian', + '绵' => 'mian', + '棉' => 'mian', + '免' => 'mian', + '勉' => 'mian', + '娩' => 'mian', + '冕' => 'mian', + '渑' => 'mian', + '湎' => 'mian', + '缅' => 'mian', + '腼' => 'mian', + '面' => 'mian', + '喵' => 'miao', + '苗' => 'miao', + '描' => 'miao', + '瞄' => 'miao', + '秒' => 'miao', + '渺' => 'miao', + '藐' => 'miao', + '妙' => 'miao', + '庙' => 'miao', + '缥' => 'miao', + '咩' => 'mie', + '灭' => 'mie', + '蔑' => 'mie', + '篾' => 'mie', + '乜' => 'mie', + '民' => 'min', + '皿' => 'min', + '抿' => 'min', + '泯' => 'min', + '闽' => 'min', + '悯' => 'min', + '敏' => 'min', + '名' => 'ming', + '明' => 'ming', + '鸣' => 'ming', + '茗' => 'ming', + '冥' => 'ming', + '铭' => 'ming', + '瞑' => 'ming', + '螟' => 'ming', + '酩' => 'ming', + '命' => 'ming', + '谬' => 'miu', + '摸' => 'mo', + '馍' => 'mo', + '摹' => 'mo', + '膜' => 'mo', + '摩' => 'mo', + '磨' => 'mo', + '蘑' => 'mo', + '魔' => 'mo', + '末' => 'mo', + '茉' => 'mo', + '殁' => 'mo', + '沫' => 'mo', + '陌' => 'mo', + '莫' => 'mo', + '秣' => 'mo', + '蓦' => 'mo', + '漠' => 'mo', + '寞' => 'mo', + '墨' => 'mo', + '默' => 'mo', + '嬷' => 'mo', + '缪' => 'mou', + '哞' => 'mou', + '眸' => 'mou', + '谋' => 'mou', + '某' => 'mou', + '母' => 'mu', + '牡' => 'mu', + '亩' => 'mu', + '拇' => 'mu', + '姆' => 'mu', + '木' => 'mu', + '目' => 'mu', + '沐' => 'mu', + '苜' => 'mu', + '牧' => 'mu', + '钼' => 'mu', + '募' => 'mu', + '墓' => 'mu', + '幕' => 'mu', + '睦' => 'mu', + '慕' => 'mu', + '暮' => 'mu', + '穆' => 'mu', + '拿' => 'na', + '呐' => 'na', + '纳' => 'na', + '钠' => 'na', + '衲' => 'na', + '捺' => 'na', + '乃' => 'nai', + '奶' => 'nai', + '氖' => 'nai', + '奈' => 'nai', + '耐' => 'nai', + '囡' => 'nan', + '男' => 'nan', + '南' => 'nan', + '难' => 'nan', + '喃' => 'nan', + '楠' => 'nan', + '赧' => 'nan', + '腩' => 'nan', + '囔' => 'nang', + '囊' => 'nang', + '孬' => 'nao', + '呶' => 'nao', + '挠' => 'nao', + '恼' => 'nao', + '脑' => 'nao', + '瑙' => 'nao', + '闹' => 'nao', + '淖' => 'nao', + '讷' => 'ne', + '馁' => 'nei', + '内' => 'nei', + '嫩' => 'nen', + '恁' => 'nen', + '能' => 'neng', + '嗯' => 'ng', + '妮' => 'ni', + '尼' => 'ni', + '泥' => 'ni', + '怩' => 'ni', + '倪' => 'ni', + '霓' => 'ni', + '拟' => 'ni', + '你' => 'ni', + '旎' => 'ni', + '昵' => 'ni', + '逆' => 'ni', + '匿' => 'ni', + '腻' => 'ni', + '溺' => 'ni', + '拈' => 'nian', + '蔫' => 'nian', + '年' => 'nian', + '黏' => 'nian', + '捻' => 'nian', + '辇' => 'nian', + '撵' => 'nian', + '碾' => 'nian', + '廿' => 'nian', + '念' => 'nian', + '娘' => 'niang', + '酿' => 'niang', + '鸟' => 'niao', + '袅' => 'niao', + '尿' => 'niao', + '捏' => 'nie', + '聂' => 'nie', + '涅' => 'nie', + '嗫' => 'nie', + '镊' => 'nie', + '镍' => 'nie', + '蹑' => 'nie', + '孽' => 'nie', + '您' => 'nin', + '宁' => 'ning', + '咛' => 'ning', + '狞' => 'ning', + '柠' => 'ning', + '凝' => 'ning', + '拧' => 'ning', + '佞' => 'ning', + '泞' => 'ning', + '妞' => 'niu', + '牛' => 'niu', + '扭' => 'niu', + '忸' => 'niu', + '纽' => 'niu', + '钮' => 'niu', + '农' => 'nong', + '哝' => 'nong', + '浓' => 'nong', + '脓' => 'nong', + '弄' => 'nong', + '奴' => 'nu', + '驽' => 'nu', + '努' => 'nu', + '弩' => 'nu', + '怒' => 'nu', + '暖' => 'nuan', + '疟' => 'nue', + '虐' => 'nue', + '挪' => 'nuo', + '诺' => 'nuo', + '喏' => 'nuo', + '懦' => 'nuo', + '糯' => 'nuo', + '女' => 'nv', + '噢' => 'o', + '讴' => 'ou', + '瓯' => 'ou', + '欧' => 'ou', + '殴' => 'ou', + '鸥' => 'ou', + '呕' => 'ou', + '偶' => 'ou', + '藕' => 'ou', + '怄' => 'ou', + '趴' => 'pa', + '啪' => 'pa', + '葩' => 'pa', + '杷' => 'pa', + '爬' => 'pa', + '琶' => 'pa', + '帕' => 'pa', + '怕' => 'pa', + '拍' => 'pai', + '排' => 'pai', + '徘' => 'pai', + '牌' => 'pai', + '哌' => 'pai', + '派' => 'pai', + '湃' => 'pai', + '潘' => 'pan', + '攀' => 'pan', + '爿' => 'pan', + '盘' => 'pan', + '磐' => 'pan', + '蹒' => 'pan', + '蟠' => 'pan', + '判' => 'pan', + '盼' => 'pan', + '叛' => 'pan', + '畔' => 'pan', + '乓' => 'pang', + '滂' => 'pang', + '庞' => 'pang', + '旁' => 'pang', + '螃' => 'pang', + '耪' => 'pang', + '抛' => 'pao', + '咆' => 'pao', + '庖' => 'pao', + '袍' => 'pao', + '跑' => 'pao', + '泡' => 'pao', + '呸' => 'pei', + '胚' => 'pei', + '陪' => 'pei', + '培' => 'pei', + '赔' => 'pei', + '裴' => 'pei', + '沛' => 'pei', + '佩' => 'pei', + '配' => 'pei', + '喷' => 'pen', + '盆' => 'pen', + '抨' => 'peng', + '怦' => 'peng', + '砰' => 'peng', + '烹' => 'peng', + '嘭' => 'peng', + '朋' => 'peng', + '彭' => 'peng', + '棚' => 'peng', + '蓬' => 'peng', + '硼' => 'peng', + '鹏' => 'peng', + '澎' => 'peng', + '篷' => 'peng', + '膨' => 'peng', + '捧' => 'peng', + '碰' => 'peng', + '丕' => 'pi', + '批' => 'pi', + '纰' => 'pi', + '坯' => 'pi', + '披' => 'pi', + '砒' => 'pi', + '劈' => 'pi', + '噼' => 'pi', + '霹' => 'pi', + '皮' => 'pi', + '枇' => 'pi', + '毗' => 'pi', + '蚍' => 'pi', + '疲' => 'pi', + '啤' => 'pi', + '琵' => 'pi', + '脾' => 'pi', + '貔' => 'pi', + '匹' => 'pi', + '痞' => 'pi', + '癖' => 'pi', + '屁' => 'pi', + '睥' => 'pi', + '媲' => 'pi', + '僻' => 'pi', + '譬' => 'pi', + '偏' => 'pian', + '篇' => 'pian', + '翩' => 'pian', + '骈' => 'pian', + '蹁' => 'pian', + '片' => 'pian', + '骗' => 'pian', + '剽' => 'piao', + '漂' => 'piao', + '飘' => 'piao', + '瓢' => 'piao', + '殍' => 'piao', + '瞟' => 'piao', + '票' => 'piao', + '氕' => 'pie', + '瞥' => 'pie', + '撇' => 'pie', + '拼' => 'pin', + '姘' => 'pin', + '贫' => 'pin', + '频' => 'pin', + '嫔' => 'pin', + '颦' => 'pin', + '品' => 'pin', + '聘' => 'pin', + '乒' => 'ping', + '娉' => 'ping', + '平' => 'ping', + '评' => 'ping', + '坪' => 'ping', + '苹' => 'ping', + '凭' => 'ping', + '瓶' => 'ping', + '萍' => 'ping', + '钋' => 'po', + '坡' => 'po', + '泼' => 'po', + '颇' => 'po', + '婆' => 'po', + '鄱' => 'po', + '叵' => 'po', + '珀' => 'po', + '破' => 'po', + '粕' => 'po', + '魄' => 'po', + '剖' => 'pou', + '抔' => 'pou', + '扑' => 'pu', + '铺' => 'pu', + '噗' => 'pu', + '仆' => 'pu', + '匍' => 'pu', + '菩' => 'pu', + '葡' => 'pu', + '蒲' => 'pu', + '璞' => 'pu', + '圃' => 'pu', + '浦' => 'pu', + '普' => 'pu', + '谱' => 'pu', + '蹼' => 'pu', + '七' => 'qi', + '沏' => 'qi', + '妻' => 'qi', + '柒' => 'qi', + '凄' => 'qi', + '萋' => 'qi', + '戚' => 'qi', + '期' => 'qi', + '欺' => 'qi', + '嘁' => 'qi', + '漆' => 'qi', + '齐' => 'qi', + '芪' => 'qi', + '其' => 'qi', + '歧' => 'qi', + '祈' => 'qi', + '祇' => 'qi', + '脐' => 'qi', + '畦' => 'qi', + '跂' => 'qi', + '崎' => 'qi', + '骑' => 'qi', + '琪' => 'qi', + '棋' => 'qi', + '旗' => 'qi', + '鳍' => 'qi', + '麒' => 'qi', + '乞' => 'qi', + '岂' => 'qi', + '企' => 'qi', + '杞' => 'qi', + '启' => 'qi', + '起' => 'qi', + '绮' => 'qi', + '气' => 'qi', + '讫' => 'qi', + '迄' => 'qi', + '弃' => 'qi', + '汽' => 'qi', + '泣' => 'qi', + '契' => 'qi', + '砌' => 'qi', + '葺' => 'qi', + '器' => 'qi', + '憩' => 'qi', + '俟' => 'qi', + '掐' => 'qia', + '洽' => 'qia', + '恰' => 'qia', + '千' => 'qian', + '仟' => 'qian', + '阡' => 'qian', + '芊' => 'qian', + '迁' => 'qian', + '钎' => 'qian', + '牵' => 'qian', + '悭' => 'qian', + '谦' => 'qian', + '签' => 'qian', + '愆' => 'qian', + '前' => 'qian', + '虔' => 'qian', + '钱' => 'qian', + '钳' => 'qian', + '乾' => 'qian', + '潜' => 'qian', + '黔' => 'qian', + '遣' => 'qian', + '谴' => 'qian', + '欠' => 'qian', + '芡' => 'qian', + '倩' => 'qian', + '堑' => 'qian', + '嵌' => 'qian', + '歉' => 'qian', + '羌' => 'qiang', + '枪' => 'qiang', + '戕' => 'qiang', + '腔' => 'qiang', + '蜣' => 'qiang', + '锵' => 'qiang', + '墙' => 'qiang', + '蔷' => 'qiang', + '抢' => 'qiang', + '羟' => 'qiang', + '襁' => 'qiang', + '呛' => 'qiang', + '炝' => 'qiang', + '跄' => 'qiang', + '悄' => 'qiao', + '跷' => 'qiao', + '锹' => 'qiao', + '敲' => 'qiao', + '橇' => 'qiao', + '乔' => 'qiao', + '侨' => 'qiao', + '荞' => 'qiao', + '桥' => 'qiao', + '憔' => 'qiao', + '瞧' => 'qiao', + '巧' => 'qiao', + '俏' => 'qiao', + '诮' => 'qiao', + '峭' => 'qiao', + '窍' => 'qiao', + '翘' => 'qiao', + '撬' => 'qiao', + '切' => 'qie', + '且' => 'qie', + '妾' => 'qie', + '怯' => 'qie', + '窃' => 'qie', + '挈' => 'qie', + '惬' => 'qie', + '趄' => 'qie', + '锲' => 'qie', + '钦' => 'qin', + '侵' => 'qin', + '衾' => 'qin', + '芹' => 'qin', + '芩' => 'qin', + '秦' => 'qin', + '琴' => 'qin', + '禽' => 'qin', + '勤' => 'qin', + '擒' => 'qin', + '噙' => 'qin', + '寝' => 'qin', + '沁' => 'qin', + '青' => 'qing', + '轻' => 'qing', + '氢' => 'qing', + '倾' => 'qing', + '卿' => 'qing', + '清' => 'qing', + '蜻' => 'qing', + '情' => 'qing', + '晴' => 'qing', + '氰' => 'qing', + '擎' => 'qing', + '顷' => 'qing', + '请' => 'qing', + '庆' => 'qing', + '罄' => 'qing', + '穷' => 'qiong', + '穹' => 'qiong', + '琼' => 'qiong', + '丘' => 'qiu', + '秋' => 'qiu', + '蚯' => 'qiu', + '鳅' => 'qiu', + '囚' => 'qiu', + '求' => 'qiu', + '虬' => 'qiu', + '泅' => 'qiu', + '酋' => 'qiu', + '球' => 'qiu', + '遒' => 'qiu', + '裘' => 'qiu', + '岖' => 'qu', + '驱' => 'qu', + '屈' => 'qu', + '蛆' => 'qu', + '躯' => 'qu', + '趋' => 'qu', + '蛐' => 'qu', + '黢' => 'qu', + '渠' => 'qu', + '瞿' => 'qu', + '曲' => 'qu', + '取' => 'qu', + '娶' => 'qu', + '龋' => 'qu', + '去' => 'qu', + '趣' => 'qu', + '觑' => 'qu', + '悛' => 'quan', + '权' => 'quan', + '全' => 'quan', + '诠' => 'quan', + '泉' => 'quan', + '拳' => 'quan', + '痊' => 'quan', + '蜷' => 'quan', + '醛' => 'quan', + '犬' => 'quan', + '劝' => 'quan', + '券' => 'quan', + '炔' => 'que', + '缺' => 'que', + '瘸' => 'que', + '却' => 'que', + '确' => 'que', + '鹊' => 'que', + '阙' => 'que', + '榷' => 'que', + '逡' => 'qun', + '裙' => 'qun', + '群' => 'qun', + '蚺' => 'ran', + '然' => 'ran', + '燃' => 'ran', + '冉' => 'ran', + '苒' => 'ran', + '染' => 'ran', + '瓤' => 'rang', + '壤' => 'rang', + '攘' => 'rang', + '嚷' => 'rang', + '让' => 'rang', + '荛' => 'rao', + '饶' => 'rao', + '娆' => 'rao', + '桡' => 'rao', + '扰' => 'rao', + '绕' => 'rao', + '惹' => 're', + '热' => 're', + '人' => 'ren', + '壬' => 'ren', + '仁' => 'ren', + '忍' => 'ren', + '荏' => 'ren', + '稔' => 'ren', + '刃' => 'ren', + '认' => 'ren', + '任' => 'ren', + '纫' => 'ren', + '韧' => 'ren', + '饪' => 'ren', + '扔' => 'reng', + '仍' => 'reng', + '日' => 'ri', + '戎' => 'rong', + '茸' => 'rong', + '荣' => 'rong', + '绒' => 'rong', + '容' => 'rong', + '嵘' => 'rong', + '蓉' => 'rong', + '溶' => 'rong', + '榕' => 'rong', + '熔' => 'rong', + '融' => 'rong', + '冗' => 'rong', + '氄' => 'rong', + '柔' => 'rou', + '揉' => 'rou', + '糅' => 'rou', + '蹂' => 'rou', + '鞣' => 'rou', + '肉' => 'rou', + '如' => 'ru', + '茹' => 'ru', + '铷' => 'ru', + '儒' => 'ru', + '孺' => 'ru', + '蠕' => 'ru', + '汝' => 'ru', + '乳' => 'ru', + '辱' => 'ru', + '入' => 'ru', + '缛' => 'ru', + '褥' => 'ru', + '阮' => 'ruan', + '软' => 'ruan', + '蕊' => 'rui', + '蚋' => 'rui', + '锐' => 'rui', + '瑞' => 'rui', + '睿' => 'rui', + '闰' => 'run', + '润' => 'run', + '若' => 'ruo', + '偌' => 'ruo', + '弱' => 'ruo', + '仨' => 'sa', + '洒' => 'sa', + '撒' => 'sa', + '卅' => 'sa', + '飒' => 'sa', + '萨' => 'sa', + '腮' => 'sai', + '赛' => 'sai', + '三' => 'san', + '叁' => 'san', + '伞' => 'san', + '散' => 'san', + '桑' => 'sang', + '搡' => 'sang', + '嗓' => 'sang', + '丧' => 'sang', + '搔' => 'sao', + '骚' => 'sao', + '扫' => 'sao', + '嫂' => 'sao', + '臊' => 'sao', + '涩' => 'se', + '啬' => 'se', + '铯' => 'se', + '瑟' => 'se', + '穑' => 'se', + '森' => 'sen', + '僧' => 'seng', + '杀' => 'sha', + '沙' => 'sha', + '纱' => 'sha', + '砂' => 'sha', + '啥' => 'sha', + '傻' => 'sha', + '厦' => 'sha', + '歃' => 'sha', + '煞' => 'sha', + '霎' => 'sha', + '筛' => 'shai', + '晒' => 'shai', + '山' => 'shan', + '删' => 'shan', + '苫' => 'shan', + '衫' => 'shan', + '姗' => 'shan', + '珊' => 'shan', + '煽' => 'shan', + '潸' => 'shan', + '膻' => 'shan', + '闪' => 'shan', + '陕' => 'shan', + '讪' => 'shan', + '汕' => 'shan', + '扇' => 'shan', + '善' => 'shan', + '骟' => 'shan', + '缮' => 'shan', + '擅' => 'shan', + '膳' => 'shan', + '嬗' => 'shan', + '赡' => 'shan', + '鳝' => 'shan', + '伤' => 'shang', + '殇' => 'shang', + '商' => 'shang', + '觞' => 'shang', + '熵' => 'shang', + '晌' => 'shang', + '赏' => 'shang', + '上' => 'shang', + '尚' => 'shang', + '捎' => 'shao', + '烧' => 'shao', + '梢' => 'shao', + '稍' => 'shao', + '艄' => 'shao', + '勺' => 'shao', + '芍' => 'shao', + '韶' => 'shao', + '少' => 'shao', + '邵' => 'shao', + '绍' => 'shao', + '哨' => 'shao', + '潲' => 'shao', + '奢' => 'she', + '赊' => 'she', + '舌' => 'she', + '佘' => 'she', + '蛇' => 'she', + '舍' => 'she', + '设' => 'she', + '社' => 'she', + '射' => 'she', + '涉' => 'she', + '赦' => 'she', + '摄' => 'she', + '慑' => 'she', + '麝' => 'she', + '申' => 'shen', + '伸' => 'shen', + '身' => 'shen', + '呻' => 'shen', + '绅' => 'shen', + '砷' => 'shen', + '深' => 'shen', + '神' => 'shen', + '沈' => 'shen', + '审' => 'shen', + '哂' => 'shen', + '婶' => 'shen', + '肾' => 'shen', + '甚' => 'shen', + '渗' => 'shen', + '葚' => 'shen', + '蜃' => 'shen', + '慎' => 'shen', + '升' => 'sheng', + '生' => 'sheng', + '声' => 'sheng', + '昇' => 'sheng', + '牲' => 'sheng', + '笙' => 'sheng', + '甥' => 'sheng', + '绳' => 'sheng', + '圣' => 'sheng', + '胜' => 'sheng', + '晟' => 'sheng', + '剩' => 'sheng', + '尸' => 'shi', + '失' => 'shi', + '师' => 'shi', + '诗' => 'shi', + '虱' => 'shi', + '狮' => 'shi', + '施' => 'shi', + '湿' => 'shi', + '十' => 'shi', + '时' => 'shi', + '实' => 'shi', + '食' => 'shi', + '蚀' => 'shi', + '史' => 'shi', + '矢' => 'shi', + '使' => 'shi', + '始' => 'shi', + '驶' => 'shi', + '屎' => 'shi', + '士' => 'shi', + '氏' => 'shi', + '示' => 'shi', + '世' => 'shi', + '仕' => 'shi', + '市' => 'shi', + '式' => 'shi', + '势' => 'shi', + '事' => 'shi', + '侍' => 'shi', + '饰' => 'shi', + '试' => 'shi', + '视' => 'shi', + '拭' => 'shi', + '柿' => 'shi', + '是' => 'shi', + '适' => 'shi', + '恃' => 'shi', + '室' => 'shi', + '逝' => 'shi', + '轼' => 'shi', + '舐' => 'shi', + '弑' => 'shi', + '释' => 'shi', + '谥' => 'shi', + '嗜' => 'shi', + '誓' => 'shi', + '收' => 'shou', + '手' => 'shou', + '守' => 'shou', + '首' => 'shou', + '寿' => 'shou', + '受' => 'shou', + '狩' => 'shou', + '授' => 'shou', + '售' => 'shou', + '兽' => 'shou', + '绶' => 'shou', + '瘦' => 'shou', + '殳' => 'shu', + '书' => 'shu', + '抒' => 'shu', + '枢' => 'shu', + '叔' => 'shu', + '姝' => 'shu', + '殊' => 'shu', + '倏' => 'shu', + '梳' => 'shu', + '淑' => 'shu', + '舒' => 'shu', + '疏' => 'shu', + '输' => 'shu', + '蔬' => 'shu', + '秫' => 'shu', + '孰' => 'shu', + '赎' => 'shu', + '塾' => 'shu', + '暑' => 'shu', + '黍' => 'shu', + '署' => 'shu', + '蜀' => 'shu', + '鼠' => 'shu', + '薯' => 'shu', + '曙' => 'shu', + '戍' => 'shu', + '束' => 'shu', + '述' => 'shu', + '树' => 'shu', + '竖' => 'shu', + '恕' => 'shu', + '庶' => 'shu', + '墅' => 'shu', + '漱' => 'shu', + '刷' => 'shua', + '唰' => 'shua', + '耍' => 'shua', + '衰' => 'shuai', + '摔' => 'shuai', + '甩' => 'shuai', + '帅' => 'shuai', + '蟀' => 'shuai', + '闩' => 'shuan', + '拴' => 'shuan', + '栓' => 'shuan', + '涮' => 'shuan', + '双' => 'shuang', + '霜' => 'shuang', + '孀' => 'shuang', + '爽' => 'shuang', + '谁' => 'shui', + '水' => 'shui', + '税' => 'shui', + '睡' => 'shui', + '吮' => 'shun', + '顺' => 'shun', + '舜' => 'shun', + '瞬' => 'shun', + '烁' => 'shuo', + '铄' => 'shuo', + '朔' => 'shuo', + '硕' => 'shuo', + '司' => 'si', + '丝' => 'si', + '私' => 'si', + '咝' => 'si', + '思' => 'si', + '斯' => 'si', + '厮' => 'si', + '撕' => 'si', + '嘶' => 'si', + '死' => 'si', + '巳' => 'si', + '四' => 'si', + '寺' => 'si', + '祀' => 'si', + '饲' => 'si', + '肆' => 'si', + '嗣' => 'si', + '松' => 'song', + '嵩' => 'song', + '怂' => 'song', + '耸' => 'song', + '悚' => 'song', + '讼' => 'song', + '宋' => 'song', + '送' => 'song', + '诵' => 'song', + '颂' => 'song', + '搜' => 'sou', + '嗖' => 'sou', + '馊' => 'sou', + '艘' => 'sou', + '叟' => 'sou', + '擞' => 'sou', + '嗽' => 'sou', + '苏' => 'su', + '酥' => 'su', + '俗' => 'su', + '夙' => 'su', + '诉' => 'su', + '肃' => 'su', + '素' => 'su', + '速' => 'su', + '粟' => 'su', + '嗉' => 'su', + '塑' => 'su', + '溯' => 'su', + '簌' => 'su', + '酸' => 'suan', + '蒜' => 'suan', + '算' => 'suan', + '虽' => 'sui', + '睢' => 'sui', + '绥' => 'sui', + '隋' => 'sui', + '随' => 'sui', + '髓' => 'sui', + '岁' => 'sui', + '祟' => 'sui', + '遂' => 'sui', + '碎' => 'sui', + '隧' => 'sui', + '穗' => 'sui', + '孙' => 'sun', + '损' => 'sun', + '笋' => 'sun', + '隼' => 'sun', + '唆' => 'suo', + '梭' => 'suo', + '蓑' => 'suo', + '羧' => 'suo', + '缩' => 'suo', + '所' => 'suo', + '索' => 'suo', + '唢' => 'suo', + '琐' => 'suo', + '锁' => 'suo', + '他' => 'ta', + '它' => 'ta', + '她' => 'ta', + '铊' => 'ta', + '塌' => 'ta', + '塔' => 'ta', + '獭' => 'ta', + '挞' => 'ta', + '榻' => 'ta', + '踏' => 'ta', + '蹋' => 'ta', + '胎' => 'tai', + '台' => 'tai', + '邰' => 'tai', + '抬' => 'tai', + '苔' => 'tai', + '跆' => 'tai', + '太' => 'tai', + '汰' => 'tai', + '态' => 'tai', + '钛' => 'tai', + '泰' => 'tai', + '酞' => 'tai', + '贪' => 'tan', + '摊' => 'tan', + '滩' => 'tan', + '瘫' => 'tan', + '坛' => 'tan', + '昙' => 'tan', + '谈' => 'tan', + '痰' => 'tan', + '谭' => 'tan', + '潭' => 'tan', + '檀' => 'tan', + '坦' => 'tan', + '袒' => 'tan', + '毯' => 'tan', + '叹' => 'tan', + '炭' => 'tan', + '探' => 'tan', + '碳' => 'tan', + '汤' => 'tang', + '嘡' => 'tang', + '羰' => 'tang', + '唐' => 'tang', + '堂' => 'tang', + '棠' => 'tang', + '塘' => 'tang', + '搪' => 'tang', + '膛' => 'tang', + '镗' => 'tang', + '糖' => 'tang', + '螳' => 'tang', + '倘' => 'tang', + '淌' => 'tang', + '躺' => 'tang', + '烫' => 'tang', + '趟' => 'tang', + '涛' => 'tao', + '绦' => 'tao', + '掏' => 'tao', + '滔' => 'tao', + '韬' => 'tao', + '饕' => 'tao', + '逃' => 'tao', + '桃' => 'tao', + '陶' => 'tao', + '萄' => 'tao', + '淘' => 'tao', + '讨' => 'tao', + '套' => 'tao', + '特' => 'te', + '疼' => 'teng', + '腾' => 'teng', + '誊' => 'teng', + '滕' => 'teng', + '藤' => 'teng', + '剔' => 'ti', + '梯' => 'ti', + '踢' => 'ti', + '啼' => 'ti', + '题' => 'ti', + '醍' => 'ti', + '蹄' => 'ti', + '体' => 'ti', + '屉' => 'ti', + '剃' => 'ti', + '涕' => 'ti', + '悌' => 'ti', + '惕' => 'ti', + '替' => 'ti', + '天' => 'tian', + '添' => 'tian', + '田' => 'tian', + '恬' => 'tian', + '甜' => 'tian', + '填' => 'tian', + '忝' => 'tian', + '殄' => 'tian', + '舔' => 'tian', + '掭' => 'tian', + '佻' => 'tiao', + '挑' => 'tiao', + '条' => 'tiao', + '迢' => 'tiao', + '笤' => 'tiao', + '髫' => 'tiao', + '窕' => 'tiao', + '眺' => 'tiao', + '粜' => 'tiao', + '跳' => 'tiao', + '帖' => 'tie', + '贴' => 'tie', + '铁' => 'tie', + '餮' => 'tie', + '铤' => 'ting', + '厅' => 'ting', + '听' => 'ting', + '烃' => 'ting', + '廷' => 'ting', + '亭' => 'ting', + '庭' => 'ting', + '停' => 'ting', + '蜓' => 'ting', + '婷' => 'ting', + '霆' => 'ting', + '挺' => 'ting', + '艇' => 'ting', + '通' => 'tong', + '嗵' => 'tong', + '同' => 'tong', + '彤' => 'tong', + '桐' => 'tong', + '铜' => 'tong', + '童' => 'tong', + '潼' => 'tong', + '瞳' => 'tong', + '统' => 'tong', + '捅' => 'tong', + '桶' => 'tong', + '筒' => 'tong', + '恸' => 'tong', + '痛' => 'tong', + '偷' => 'tou', + '头' => 'tou', + '投' => 'tou', + '骰' => 'tou', + '透' => 'tou', + '凸' => 'tu', + '秃' => 'tu', + '突' => 'tu', + '图' => 'tu', + '荼' => 'tu', + '徒' => 'tu', + '途' => 'tu', + '涂' => 'tu', + '屠' => 'tu', + '土' => 'tu', + '吐' => 'tu', + '兔' => 'tu', + '菟' => 'tu', + '湍' => 'tuan', + '团' => 'tuan', + '疃' => 'tuan', + '彖' => 'tuan', + '推' => 'tui', + '颓' => 'tui', + '腿' => 'tui', + '退' => 'tui', + '蜕' => 'tui', + '褪' => 'tui', + '吞' => 'tun', + '屯' => 'tun', + '饨' => 'tun', + '豚' => 'tun', + '臀' => 'tun', + '托' => 'tuo', + '拖' => 'tuo', + '脱' => 'tuo', + '佗' => 'tuo', + '陀' => 'tuo', + '驼' => 'tuo', + '鸵' => 'tuo', + '妥' => 'tuo', + '椭' => 'tuo', + '唾' => 'tuo', + '挖' => 'wa', + '哇' => 'wa', + '洼' => 'wa', + '娲' => 'wa', + '蛙' => 'wa', + '娃' => 'wa', + '瓦' => 'wa', + '佤' => 'wa', + '袜' => 'wa', + '歪' => 'wai', + '外' => 'wai', + '弯' => 'wan', + '剜' => 'wan', + '湾' => 'wan', + '蜿' => 'wan', + '豌' => 'wan', + '丸' => 'wan', + '纨' => 'wan', + '完' => 'wan', + '玩' => 'wan', + '顽' => 'wan', + '烷' => 'wan', + '宛' => 'wan', + '挽' => 'wan', + '晚' => 'wan', + '惋' => 'wan', + '婉' => 'wan', + '绾' => 'wan', + '皖' => 'wan', + '碗' => 'wan', + '万' => 'wan', + '腕' => 'wan', + '汪' => 'wang', + '亡' => 'wang', + '王' => 'wang', + '网' => 'wang', + '枉' => 'wang', + '罔' => 'wang', + '往' => 'wang', + '惘' => 'wang', + '妄' => 'wang', + '忘' => 'wang', + '旺' => 'wang', + '望' => 'wang', + '危' => 'wei', + '威' => 'wei', + '偎' => 'wei', + '微' => 'wei', + '煨' => 'wei', + '薇' => 'wei', + '巍' => 'wei', + '韦' => 'wei', + '为' => 'wei', + '违' => 'wei', + '围' => 'wei', + '闱' => 'wei', + '桅' => 'wei', + '唯' => 'wei', + '帷' => 'wei', + '维' => 'wei', + '伟' => 'wei', + '伪' => 'wei', + '苇' => 'wei', + '纬' => 'wei', + '委' => 'wei', + '诿' => 'wei', + '娓' => 'wei', + '萎' => 'wei', + '猥' => 'wei', + '痿' => 'wei', + '卫' => 'wei', + '未' => 'wei', + '位' => 'wei', + '味' => 'wei', + '畏' => 'wei', + '胃' => 'wei', + '谓' => 'wei', + '喂' => 'wei', + '猬' => 'wei', + '渭' => 'wei', + '蔚' => 'wei', + '慰' => 'wei', + '魏' => 'wei', + '温' => 'wen', + '瘟' => 'wen', + '文' => 'wen', + '纹' => 'wen', + '闻' => 'wen', + '蚊' => 'wen', + '雯' => 'wen', + '刎' => 'wen', + '吻' => 'wen', + '紊' => 'wen', + '稳' => 'wen', + '问' => 'wen', + '汶' => 'wen', + '翁' => 'weng', + '嗡' => 'weng', + '瓮' => 'weng', + '挝' => 'wo', + '莴' => 'wo', + '倭' => 'wo', + '喔' => 'wo', + '窝' => 'wo', + '蜗' => 'wo', + '我' => 'wo', + '肟' => 'wo', + '沃' => 'wo', + '卧' => 'wo', + '握' => 'wo', + '幄' => 'wo', + '斡' => 'wo', + '乌' => 'wu', + '邬' => 'wu', + '污' => 'wu', + '巫' => 'wu', + '呜' => 'wu', + '钨' => 'wu', + '诬' => 'wu', + '屋' => 'wu', + '无' => 'wu', + '毋' => 'wu', + '芜' => 'wu', + '吴' => 'wu', + '梧' => 'wu', + '蜈' => 'wu', + '五' => 'wu', + '午' => 'wu', + '伍' => 'wu', + '仵' => 'wu', + '怃' => 'wu', + '忤' => 'wu', + '妩' => 'wu', + '武' => 'wu', + '侮' => 'wu', + '捂' => 'wu', + '鹉' => 'wu', + '舞' => 'wu', + '兀' => 'wu', + '勿' => 'wu', + '戊' => 'wu', + '务' => 'wu', + '坞' => 'wu', + '物' => 'wu', + '误' => 'wu', + '悟' => 'wu', + '晤' => 'wu', + '骛' => 'wu', + '雾' => 'wu', + '寤' => 'wu', + '鹜' => 'wu', + '夕' => 'xi', + '兮' => 'xi', + '西' => 'xi', + '吸' => 'xi', + '汐' => 'xi', + '希' => 'xi', + '昔' => 'xi', + '析' => 'xi', + '唏' => 'xi', + '牺' => 'xi', + '息' => 'xi', + '奚' => 'xi', + '悉' => 'xi', + '烯' => 'xi', + '惜' => 'xi', + '晰' => 'xi', + '稀' => 'xi', + '翕' => 'xi', + '犀' => 'xi', + '皙' => 'xi', + '锡' => 'xi', + '溪' => 'xi', + '熙' => 'xi', + '蜥' => 'xi', + '熄' => 'xi', + '嘻' => 'xi', + '膝' => 'xi', + '嬉' => 'xi', + '羲' => 'xi', + '蟋' => 'xi', + '曦' => 'xi', + '习' => 'xi', + '席' => 'xi', + '袭' => 'xi', + '媳' => 'xi', + '洗' => 'xi', + '玺' => 'xi', + '徙' => 'xi', + '喜' => 'xi', + '禧' => 'xi', + '戏' => 'xi', + '细' => 'xi', + '隙' => 'xi', + '呷' => 'xia', + '虾' => 'xia', + '瞎' => 'xia', + '匣' => 'xia', + '侠' => 'xia', + '峡' => 'xia', + '狭' => 'xia', + '遐' => 'xia', + '瑕' => 'xia', + '暇' => 'xia', + '辖' => 'xia', + '霞' => 'xia', + '黠' => 'xia', + '下' => 'xia', + '夏' => 'xia', + '罅' => 'xia', + '仙' => 'xian', + '先' => 'xian', + '氙' => 'xian', + '掀' => 'xian', + '酰' => 'xian', + '锨' => 'xian', + '鲜' => 'xian', + '闲' => 'xian', + '贤' => 'xian', + '弦' => 'xian', + '咸' => 'xian', + '涎' => 'xian', + '娴' => 'xian', + '衔' => 'xian', + '舷' => 'xian', + '嫌' => 'xian', + '显' => 'xian', + '险' => 'xian', + '跣' => 'xian', + '藓' => 'xian', + '苋' => 'xian', + '县' => 'xian', + '现' => 'xian', + '限' => 'xian', + '线' => 'xian', + '宪' => 'xian', + '陷' => 'xian', + '馅' => 'xian', + '羡' => 'xian', + '献' => 'xian', + '腺' => 'xian', + '乡' => 'xiang', + '相' => 'xiang', + '香' => 'xiang', + '厢' => 'xiang', + '湘' => 'xiang', + '箱' => 'xiang', + '襄' => 'xiang', + '镶' => 'xiang', + '详' => 'xiang', + '祥' => 'xiang', + '翔' => 'xiang', + '享' => 'xiang', + '响' => 'xiang', + '饷' => 'xiang', + '飨' => 'xiang', + '想' => 'xiang', + '向' => 'xiang', + '项' => 'xiang', + '象' => 'xiang', + '像' => 'xiang', + '橡' => 'xiang', + '肖' => 'xiao', + '枭' => 'xiao', + '哓' => 'xiao', + '骁' => 'xiao', + '逍' => 'xiao', + '消' => 'xiao', + '宵' => 'xiao', + '萧' => 'xiao', + '硝' => 'xiao', + '销' => 'xiao', + '箫' => 'xiao', + '潇' => 'xiao', + '霄' => 'xiao', + '魈' => 'xiao', + '嚣' => 'xiao', + '崤' => 'xiao', + '淆' => 'xiao', + '小' => 'xiao', + '晓' => 'xiao', + '孝' => 'xiao', + '哮' => 'xiao', + '笑' => 'xiao', + '效' => 'xiao', + '啸' => 'xiao', + '挟' => 'xie', + '些' => 'xie', + '楔' => 'xie', + '歇' => 'xie', + '蝎' => 'xie', + '协' => 'xie', + '胁' => 'xie', + '偕' => 'xie', + '斜' => 'xie', + '谐' => 'xie', + '揳' => 'xie', + '携' => 'xie', + '撷' => 'xie', + '鞋' => 'xie', + '写' => 'xie', + '泄' => 'xie', + '泻' => 'xie', + '卸' => 'xie', + '屑' => 'xie', + '械' => 'xie', + '亵' => 'xie', + '谢' => 'xie', + '邂' => 'xie', + '懈' => 'xie', + '蟹' => 'xie', + '心' => 'xin', + '芯' => 'xin', + '辛' => 'xin', + '欣' => 'xin', + '锌' => 'xin', + '新' => 'xin', + '歆' => 'xin', + '薪' => 'xin', + '馨' => 'xin', + '鑫' => 'xin', + '信' => 'xin', + '衅' => 'xin', + '星' => 'xing', + '猩' => 'xing', + '惺' => 'xing', + '腥' => 'xing', + '刑' => 'xing', + '邢' => 'xing', + '形' => 'xing', + '型' => 'xing', + '醒' => 'xing', + '擤' => 'xing', + '兴' => 'xing', + '杏' => 'xing', + '幸' => 'xing', + '性' => 'xing', + '姓' => 'xing', + '悻' => 'xing', + '凶' => 'xiong', + '兄' => 'xiong', + '匈' => 'xiong', + '讻' => 'xiong', + '汹' => 'xiong', + '胸' => 'xiong', + '雄' => 'xiong', + '熊' => 'xiong', + '休' => 'xiu', + '咻' => 'xiu', + '修' => 'xiu', + '羞' => 'xiu', + '朽' => 'xiu', + '秀' => 'xiu', + '袖' => 'xiu', + '绣' => 'xiu', + '锈' => 'xiu', + '嗅' => 'xiu', + '欻' => 'xu', + '戌' => 'xu', + '须' => 'xu', + '胥' => 'xu', + '虚' => 'xu', + '墟' => 'xu', + '需' => 'xu', + '魆' => 'xu', + '徐' => 'xu', + '许' => 'xu', + '诩' => 'xu', + '栩' => 'xu', + '旭' => 'xu', + '序' => 'xu', + '叙' => 'xu', + '恤' => 'xu', + '酗' => 'xu', + '勖' => 'xu', + '绪' => 'xu', + '续' => 'xu', + '絮' => 'xu', + '婿' => 'xu', + '蓄' => 'xu', + '煦' => 'xu', + '轩' => 'xuan', + '宣' => 'xuan', + '揎' => 'xuan', + '喧' => 'xuan', + '暄' => 'xuan', + '玄' => 'xuan', + '悬' => 'xuan', + '旋' => 'xuan', + '漩' => 'xuan', + '璇' => 'xuan', + '选' => 'xuan', + '癣' => 'xuan', + '炫' => 'xuan', + '绚' => 'xuan', + '眩' => 'xuan', + '渲' => 'xuan', + '靴' => 'xue', + '薛' => 'xue', + '穴' => 'xue', + '学' => 'xue', + '噱' => 'xue', + '雪' => 'xue', + '谑' => 'xue', + '勋' => 'xun', + '熏' => 'xun', + '薰' => 'xun', + '醺' => 'xun', + '旬' => 'xun', + '寻' => 'xun', + '巡' => 'xun', + '询' => 'xun', + '荀' => 'xun', + '循' => 'xun', + '训' => 'xun', + '讯' => 'xun', + '汛' => 'xun', + '迅' => 'xun', + '驯' => 'xun', + '徇' => 'xun', + '逊' => 'xun', + '殉' => 'xun', + '巽' => 'xun', + '丫' => 'ya', + '压' => 'ya', + '押' => 'ya', + '鸦' => 'ya', + '桠' => 'ya', + '鸭' => 'ya', + '牙' => 'ya', + '伢' => 'ya', + '芽' => 'ya', + '蚜' => 'ya', + '崖' => 'ya', + '涯' => 'ya', + '睚' => 'ya', + '衙' => 'ya', + '哑' => 'ya', + '雅' => 'ya', + '亚' => 'ya', + '讶' => 'ya', + '娅' => 'ya', + '氩' => 'ya', + '揠' => 'ya', + '呀' => 'ya', + '恹' => 'yan', + '胭' => 'yan', + '烟' => 'yan', + '焉' => 'yan', + '阉' => 'yan', + '淹' => 'yan', + '湮' => 'yan', + '嫣' => 'yan', + '延' => 'yan', + '闫' => 'yan', + '严' => 'yan', + '言' => 'yan', + '妍' => 'yan', + '岩' => 'yan', + '炎' => 'yan', + '沿' => 'yan', + '研' => 'yan', + '盐' => 'yan', + '阎' => 'yan', + '蜒' => 'yan', + '筵' => 'yan', + '颜' => 'yan', + '檐' => 'yan', + '奄' => 'yan', + '俨' => 'yan', + '衍' => 'yan', + '掩' => 'yan', + '郾' => 'yan', + '眼' => 'yan', + '偃' => 'yan', + '演' => 'yan', + '魇' => 'yan', + '鼹' => 'yan', + '厌' => 'yan', + '砚' => 'yan', + '彦' => 'yan', + '艳' => 'yan', + '晏' => 'yan', + '唁' => 'yan', + '宴' => 'yan', + '验' => 'yan', + '谚' => 'yan', + '堰' => 'yan', + '雁' => 'yan', + '焰' => 'yan', + '滟' => 'yan', + '餍' => 'yan', + '燕' => 'yan', + '赝' => 'yan', + '央' => 'yang', + '泱' => 'yang', + '殃' => 'yang', + '鸯' => 'yang', + '秧' => 'yang', + '扬' => 'yang', + '羊' => 'yang', + '阳' => 'yang', + '杨' => 'yang', + '佯' => 'yang', + '疡' => 'yang', + '徉' => 'yang', + '洋' => 'yang', + '仰' => 'yang', + '养' => 'yang', + '氧' => 'yang', + '痒' => 'yang', + '怏' => 'yang', + '样' => 'yang', + '恙' => 'yang', + '烊' => 'yang', + '漾' => 'yang', + '幺' => 'yao', + '夭' => 'yao', + '吆' => 'yao', + '妖' => 'yao', + '腰' => 'yao', + '邀' => 'yao', + '爻' => 'yao', + '尧' => 'yao', + '肴' => 'yao', + '姚' => 'yao', + '窑' => 'yao', + '谣' => 'yao', + '摇' => 'yao', + '徭' => 'yao', + '遥' => 'yao', + '瑶' => 'yao', + '杳' => 'yao', + '咬' => 'yao', + '舀' => 'yao', + '窈' => 'yao', + '药' => 'yao', + '要' => 'yao', + '鹞' => 'yao', + '耀' => 'yao', + '耶' => 'ye', + '掖' => 'ye', + '椰' => 'ye', + '噎' => 'ye', + '爷' => 'ye', + '揶' => 'ye', + '也' => 'ye', + '冶' => 'ye', + '野' => 'ye', + '业' => 'ye', + '叶' => 'ye', + '页' => 'ye', + '曳' => 'ye', + '夜' => 'ye', + '液' => 'ye', + '谒' => 'ye', + '腋' => 'ye', + '一' => 'yi', + '伊' => 'yi', + '衣' => 'yi', + '医' => 'yi', + '依' => 'yi', + '咿' => 'yi', + '揖' => 'yi', + '壹' => 'yi', + '漪' => 'yi', + '噫' => 'yi', + '仪' => 'yi', + '夷' => 'yi', + '饴' => 'yi', + '宜' => 'yi', + '咦' => 'yi', + '贻' => 'yi', + '姨' => 'yi', + '胰' => 'yi', + '移' => 'yi', + '痍' => 'yi', + '颐' => 'yi', + '疑' => 'yi', + '彝' => 'yi', + '乙' => 'yi', + '已' => 'yi', + '以' => 'yi', + '苡' => 'yi', + '矣' => 'yi', + '迤' => 'yi', + '蚁' => 'yi', + '倚' => 'yi', + '椅' => 'yi', + '旖' => 'yi', + '乂' => 'yi', + '亿' => 'yi', + '义' => 'yi', + '艺' => 'yi', + '刈' => 'yi', + '忆' => 'yi', + '议' => 'yi', + '屹' => 'yi', + '亦' => 'yi', + '异' => 'yi', + '抑' => 'yi', + '呓' => 'yi', + '邑' => 'yi', + '役' => 'yi', + '译' => 'yi', + '易' => 'yi', + '诣' => 'yi', + '绎' => 'yi', + '驿' => 'yi', + '轶' => 'yi', + '弈' => 'yi', + '奕' => 'yi', + '疫' => 'yi', + '羿' => 'yi', + '益' => 'yi', + '谊' => 'yi', + '逸' => 'yi', + '翌' => 'yi', + '肄' => 'yi', + '裔' => 'yi', + '意' => 'yi', + '溢' => 'yi', + '缢' => 'yi', + '毅' => 'yi', + '薏' => 'yi', + '翳' => 'yi', + '臆' => 'yi', + '翼' => 'yi', + '因' => 'yin', + '阴' => 'yin', + '茵' => 'yin', + '荫' => 'yin', + '音' => 'yin', + '姻' => 'yin', + '铟' => 'yin', + '喑' => 'yin', + '愔' => 'yin', + '吟' => 'yin', + '垠' => 'yin', + '银' => 'yin', + '淫' => 'yin', + '寅' => 'yin', + '龈' => 'yin', + '霪' => 'yin', + '尹' => 'yin', + '引' => 'yin', + '蚓' => 'yin', + '隐' => 'yin', + '瘾' => 'yin', + '印' => 'yin', + '英' => 'ying', + '莺' => 'ying', + '婴' => 'ying', + '嘤' => 'ying', + '罂' => 'ying', + '缨' => 'ying', + '樱' => 'ying', + '鹦' => 'ying', + '膺' => 'ying', + '鹰' => 'ying', + '迎' => 'ying', + '茔' => 'ying', + '荧' => 'ying', + '盈' => 'ying', + '莹' => 'ying', + '萤' => 'ying', + '营' => 'ying', + '萦' => 'ying', + '楹' => 'ying', + '蝇' => 'ying', + '赢' => 'ying', + '瀛' => 'ying', + '颍' => 'ying', + '颖' => 'ying', + '影' => 'ying', + '应' => 'ying', + '映' => 'ying', + '硬' => 'ying', + '哟' => 'yo', + '唷' => 'yo', + '佣' => 'yong', + '拥' => 'yong', + '庸' => 'yong', + '雍' => 'yong', + '壅' => 'yong', + '臃' => 'yong', + '永' => 'yong', + '甬' => 'yong', + '咏' => 'yong', + '泳' => 'yong', + '勇' => 'yong', + '涌' => 'yong', + '恿' => 'yong', + '蛹' => 'yong', + '踊' => 'yong', + '用' => 'yong', + '优' => 'you', + '攸' => 'you', + '忧' => 'you', + '呦' => 'you', + '幽' => 'you', + '悠' => 'you', + '尤' => 'you', + '由' => 'you', + '邮' => 'you', + '犹' => 'you', + '油' => 'you', + '铀' => 'you', + '鱿' => 'you', + '游' => 'you', + '友' => 'you', + '有' => 'you', + '酉' => 'you', + '莠' => 'you', + '黝' => 'you', + '又' => 'you', + '右' => 'you', + '幼' => 'you', + '佑' => 'you', + '柚' => 'you', + '囿' => 'you', + '诱' => 'you', + '鼬' => 'you', + '迂' => 'yu', + '纡' => 'yu', + '於' => 'yu', + '淤' => 'yu', + '瘀' => 'yu', + '于' => 'yu', + '余' => 'yu', + '盂' => 'yu', + '臾' => 'yu', + '鱼' => 'yu', + '竽' => 'yu', + '俞' => 'yu', + '狳' => 'yu', + '谀' => 'yu', + '娱' => 'yu', + '渔' => 'yu', + '隅' => 'yu', + '揄' => 'yu', + '逾' => 'yu', + '腴' => 'yu', + '渝' => 'yu', + '愉' => 'yu', + '瑜' => 'yu', + '榆' => 'yu', + '虞' => 'yu', + '愚' => 'yu', + '舆' => 'yu', + '与' => 'yu', + '予' => 'yu', + '屿' => 'yu', + '宇' => 'yu', + '羽' => 'yu', + '雨' => 'yu', + '禹' => 'yu', + '语' => 'yu', + '圄' => 'yu', + '玉' => 'yu', + '驭' => 'yu', + '芋' => 'yu', + '妪' => 'yu', + '郁' => 'yu', + '育' => 'yu', + '狱' => 'yu', + '浴' => 'yu', + '预' => 'yu', + '域' => 'yu', + '欲' => 'yu', + '谕' => 'yu', + '遇' => 'yu', + '喻' => 'yu', + '御' => 'yu', + '寓' => 'yu', + '裕' => 'yu', + '愈' => 'yu', + '誉' => 'yu', + '豫' => 'yu', + '鹬' => 'yu', + '鸢' => 'yuan', + '鸳' => 'yuan', + '冤' => 'yuan', + '渊' => 'yuan', + '元' => 'yuan', + '园' => 'yuan', + '垣' => 'yuan', + '袁' => 'yuan', + '原' => 'yuan', + '圆' => 'yuan', + '援' => 'yuan', + '媛' => 'yuan', + '缘' => 'yuan', + '猿' => 'yuan', + '源' => 'yuan', + '辕' => 'yuan', + '远' => 'yuan', + '苑' => 'yuan', + '怨' => 'yuan', + '院' => 'yuan', + '愿' => 'yuan', + '曰' => 'yue', + '月' => 'yue', + '岳' => 'yue', + '钺' => 'yue', + '阅' => 'yue', + '悦' => 'yue', + '跃' => 'yue', + '越' => 'yue', + '粤' => 'yue', + '晕' => 'yun', + '云' => 'yun', + '匀' => 'yun', + '芸' => 'yun', + '纭' => 'yun', + '耘' => 'yun', + '允' => 'yun', + '陨' => 'yun', + '殒' => 'yun', + '孕' => 'yun', + '运' => 'yun', + '酝' => 'yun', + '愠' => 'yun', + '韵' => 'yun', + '蕴' => 'yun', + '熨' => 'yun', + '匝' => 'za', + '咂' => 'za', + '杂' => 'za', + '砸' => 'za', + '灾' => 'zai', + '甾' => 'zai', + '哉' => 'zai', + '栽' => 'zai', + '载' => 'zai', + '宰' => 'zai', + '崽' => 'zai', + '再' => 'zai', + '在' => 'zai', + '糌' => 'zan', + '簪' => 'zan', + '咱' => 'zan', + '趱' => 'zan', + '暂' => 'zan', + '錾' => 'zan', + '赞' => 'zan', + '赃' => 'zang', + '脏' => 'zang', + '臧' => 'zang', + '驵' => 'zang', + '葬' => 'zang', + '遭' => 'zao', + '糟' => 'zao', + '凿' => 'zao', + '早' => 'zao', + '枣' => 'zao', + '蚤' => 'zao', + '澡' => 'zao', + '藻' => 'zao', + '皂' => 'zao', + '灶' => 'zao', + '造' => 'zao', + '噪' => 'zao', + '燥' => 'zao', + '躁' => 'zao', + '则' => 'ze', + '责' => 'ze', + '泽' => 'ze', + '啧' => 'ze', + '帻' => 'ze', + '仄' => 'ze', + '贼' => 'zei', + '怎' => 'zen', + '谮' => 'zen', + '增' => 'zeng', + '憎' => 'zeng', + '锃' => 'zeng', + '赠' => 'zeng', + '甑' => 'zeng', + '吒' => 'zha', + '挓' => 'zha', + '哳' => 'zha', + '揸' => 'zha', + '渣' => 'zha', + '楂' => 'zha', + '札' => 'zha', + '闸' => 'zha', + '铡' => 'zha', + '眨' => 'zha', + '砟' => 'zha', + '乍' => 'zha', + '诈' => 'zha', + '咤' => 'zha', + '炸' => 'zha', + '蚱' => 'zha', + '榨' => 'zha', + '拃' => 'zha', + '斋' => 'zhai', + '摘' => 'zhai', + '宅' => 'zhai', + '窄' => 'zhai', + '债' => 'zhai', + '砦' => 'zhai', + '寨' => 'zhai', + '沾' => 'zhan', + '毡' => 'zhan', + '粘' => 'zhan', + '詹' => 'zhan', + '谵' => 'zhan', + '瞻' => 'zhan', + '斩' => 'zhan', + '盏' => 'zhan', + '展' => 'zhan', + '崭' => 'zhan', + '搌' => 'zhan', + '辗' => 'zhan', + '占' => 'zhan', + '栈' => 'zhan', + '战' => 'zhan', + '站' => 'zhan', + '绽' => 'zhan', + '湛' => 'zhan', + '蘸' => 'zhan', + '张' => 'zhang', + '章' => 'zhang', + '獐' => 'zhang', + '彰' => 'zhang', + '樟' => 'zhang', + '蟑' => 'zhang', + '涨' => 'zhang', + '掌' => 'zhang', + '丈' => 'zhang', + '仗' => 'zhang', + '杖' => 'zhang', + '帐' => 'zhang', + '账' => 'zhang', + '胀' => 'zhang', + '障' => 'zhang', + '嶂' => 'zhang', + '瘴' => 'zhang', + '钊' => 'zhao', + '招' => 'zhao', + '昭' => 'zhao', + '找' => 'zhao', + '沼' => 'zhao', + '兆' => 'zhao', + '诏' => 'zhao', + '赵' => 'zhao', + '照' => 'zhao', + '罩' => 'zhao', + '肇' => 'zhao', + '蜇' => 'zhe', + '遮' => 'zhe', + '哲' => 'zhe', + '辄' => 'zhe', + '蛰' => 'zhe', + '谪' => 'zhe', + '辙' => 'zhe', + '者' => 'zhe', + '锗' => 'zhe', + '赭' => 'zhe', + '褶' => 'zhe', + '浙' => 'zhe', + '蔗' => 'zhe', + '鹧' => 'zhe', + '贞' => 'zhen', + '针' => 'zhen', + '侦' => 'zhen', + '珍' => 'zhen', + '帧' => 'zhen', + '胗' => 'zhen', + '真' => 'zhen', + '砧' => 'zhen', + '斟' => 'zhen', + '甄' => 'zhen', + '榛' => 'zhen', + '箴' => 'zhen', + '臻' => 'zhen', + '诊' => 'zhen', + '枕' => 'zhen', + '疹' => 'zhen', + '缜' => 'zhen', + '阵' => 'zhen', + '鸩' => 'zhen', + '振' => 'zhen', + '朕' => 'zhen', + '赈' => 'zhen', + '震' => 'zhen', + '镇' => 'zhen', + '争' => 'zheng', + '征' => 'zheng', + '怔' => 'zheng', + '峥' => 'zheng', + '狰' => 'zheng', + '睁' => 'zheng', + '铮' => 'zheng', + '筝' => 'zheng', + '蒸' => 'zheng', + '拯' => 'zheng', + '整' => 'zheng', + '正' => 'zheng', + '证' => 'zheng', + '郑' => 'zheng', + '诤' => 'zheng', + '政' => 'zheng', + '挣' => 'zheng', + '症' => 'zheng', + '之' => 'zhi', + '支' => 'zhi', + '只' => 'zhi', + '汁' => 'zhi', + '芝' => 'zhi', + '吱' => 'zhi', + '枝' => 'zhi', + '知' => 'zhi', + '肢' => 'zhi', + '织' => 'zhi', + '栀' => 'zhi', + '脂' => 'zhi', + '蜘' => 'zhi', + '执' => 'zhi', + '直' => 'zhi', + '侄' => 'zhi', + '值' => 'zhi', + '职' => 'zhi', + '植' => 'zhi', + '跖' => 'zhi', + '踯' => 'zhi', + '止' => 'zhi', + '旨' => 'zhi', + '址' => 'zhi', + '芷' => 'zhi', + '纸' => 'zhi', + '祉' => 'zhi', + '指' => 'zhi', + '枳' => 'zhi', + '咫' => 'zhi', + '趾' => 'zhi', + '酯' => 'zhi', + '至' => 'zhi', + '志' => 'zhi', + '豸' => 'zhi', + '帜' => 'zhi', + '制' => 'zhi', + '质' => 'zhi', + '炙' => 'zhi', + '治' => 'zhi', + '栉' => 'zhi', + '峙' => 'zhi', + '挚' => 'zhi', + '桎' => 'zhi', + '致' => 'zhi', + '秩' => 'zhi', + '掷' => 'zhi', + '痔' => 'zhi', + '窒' => 'zhi', + '蛭' => 'zhi', + '智' => 'zhi', + '痣' => 'zhi', + '滞' => 'zhi', + '置' => 'zhi', + '雉' => 'zhi', + '稚' => 'zhi', + '中' => 'zhong', + '忠' => 'zhong', + '终' => 'zhong', + '盅' => 'zhong', + '钟' => 'zhong', + '衷' => 'zhong', + '肿' => 'zhong', + '冢' => 'zhong', + '踵' => 'zhong', + '仲' => 'zhong', + '众' => 'zhong', + '舟' => 'zhou', + '州' => 'zhou', + '诌' => 'zhou', + '周' => 'zhou', + '洲' => 'zhou', + '粥' => 'zhou', + '妯' => 'zhou', + '轴' => 'zhou', + '肘' => 'zhou', + '纣' => 'zhou', + '咒' => 'zhou', + '宙' => 'zhou', + '胄' => 'zhou', + '昼' => 'zhou', + '皱' => 'zhou', + '骤' => 'zhou', + '帚' => 'zhou', + '朱' => 'zhu', + '侏' => 'zhu', + '诛' => 'zhu', + '茱' => 'zhu', + '珠' => 'zhu', + '株' => 'zhu', + '诸' => 'zhu', + '铢' => 'zhu', + '猪' => 'zhu', + '蛛' => 'zhu', + '竹' => 'zhu', + '竺' => 'zhu', + '逐' => 'zhu', + '烛' => 'zhu', + '躅' => 'zhu', + '主' => 'zhu', + '拄' => 'zhu', + '煮' => 'zhu', + '嘱' => 'zhu', + '瞩' => 'zhu', + '伫' => 'zhu', + '苎' => 'zhu', + '助' => 'zhu', + '住' => 'zhu', + '贮' => 'zhu', + '注' => 'zhu', + '驻' => 'zhu', + '柱' => 'zhu', + '祝' => 'zhu', + '著' => 'zhu', + '蛀' => 'zhu', + '铸' => 'zhu', + '筑' => 'zhu', + '抓' => 'zhua', + '跩' => 'zhuai', + '拽' => 'zhuai', + '专' => 'zhuan', + '砖' => 'zhuan', + '转' => 'zhuan', + '啭' => 'zhuan', + '撰' => 'zhuan', + '篆' => 'zhuan', + '妆' => 'zhuang', + '庄' => 'zhuang', + '桩' => 'zhuang', + '装' => 'zhuang', + '壮' => 'zhuang', + '状' => 'zhuang', + '撞' => 'zhuang', + '幢' => 'zhuang', + '追' => 'zhui', + '骓' => 'zhui', + '锥' => 'zhui', + '坠' => 'zhui', + '缀' => 'zhui', + '惴' => 'zhui', + '赘' => 'zhui', + '谆' => 'zhun', + '准' => 'zhun', + '拙' => 'zhuo', + '捉' => 'zhuo', + '桌' => 'zhuo', + '灼' => 'zhuo', + '茁' => 'zhuo', + '卓' => 'zhuo', + '斫' => 'zhuo', + '浊' => 'zhuo', + '酌' => 'zhuo', + '啄' => 'zhuo', + '擢' => 'zhuo', + '镯' => 'zhuo', + '孜' => 'zi', + '咨' => 'zi', + '姿' => 'zi', + '赀' => 'zi', + '资' => 'zi', + '辎' => 'zi', + '嗞' => 'zi', + '滋' => 'zi', + '锱' => 'zi', + '龇' => 'zi', + '子' => 'zi', + '姊' => 'zi', + '秭' => 'zi', + '籽' => 'zi', + '梓' => 'zi', + '紫' => 'zi', + '訾' => 'zi', + '滓' => 'zi', + '自' => 'zi', + '字' => 'zi', + '恣' => 'zi', + '眦' => 'zi', + '渍' => 'zi', + '宗' => 'zong', + '综' => 'zong', + '棕' => 'zong', + '踪' => 'zong', + '鬃' => 'zong', + '总' => 'zong', + '纵' => 'zong', + '粽' => 'zong', + '邹' => 'zou', + '走' => 'zou', + '奏' => 'zou', + '揍' => 'zou', + '租' => 'zu', + '足' => 'zu', + '卒' => 'zu', + '族' => 'zu', + '诅' => 'zu', + '阻' => 'zu', + '组' => 'zu', + '俎' => 'zu', + '祖' => 'zu', + '纂' => 'zuan', + '钻' => 'zuan', + '攥' => 'zuan', + '嘴' => 'zui', + '最' => 'zui', + '罪' => 'zui', + '醉' => 'zui', + '尊' => 'zun', + '遵' => 'zun', + '樽' => 'zun', + '鳟' => 'zun', + '昨' => 'zuo', + '左' => 'zuo', + '佐' => 'zuo', + '作' => 'zuo', + '坐' => 'zuo', + '阼' => 'zuo', + '怍' => 'zuo', + '祚' => 'zuo', + '唑' => 'zuo', + '座' => 'zuo', + '做' => 'zuo', + '酢' => 'zuo', + '斌' => 'bin', + '曾' => 'zeng', + '查' => 'zha', + '査' => 'zha', + '乘' => 'cheng', + '传' => 'chuan', + '丁' => 'ding', + '行' => 'xing', + '瑾' => 'jin', + '婧' => 'jing', + '恺' => 'kai', + '阚' => 'kan', + '奎' => 'kui', + '乐' => 'le', + '陆' => 'lu', + '逯' => 'lv', + '璐' => 'lu', + '淼' => 'miao', + '闵' => 'min', + '娜' => 'na', + '奇' => 'qi', + '琦' => 'qi', + '强' => 'qiang', + '邱' => 'qiu', + '芮' => 'rui', + '莎' => 'sha', + '盛' => 'sheng', + '石' => 'shi', + '祎' => 'yi', + '殷' => 'yin', + '瑛' => 'ying', + '昱' => 'yu', + '眃' => 'yun', + '琢' => 'zhuo', + '枰' => 'ping', + '玟' => 'min', + '珉' => 'min', + '珣' => 'xun', + '淇' => 'qi', + '缈' => 'miao', + '彧' => 'yu', + '祺' => 'qi', + '骞' => 'qian', + '垚' => 'yao', + '妸' => 'e', + '烜' => 'hui', + '祁' => 'qi', + '傢' => 'jia', + '珮' => 'pei', + '濮' => 'pu', + '屺' => 'qi', + '珅' => 'shen', + '缇' => 'ti', + '霈' => 'pei', + '晞' => 'xi', + '璠' => 'fan', + '骐' => 'qi', + '姞' => 'ji', + '偲' => 'cai', + '齼' => 'chu', + '宓' => 'mi', + '朴' => 'pu', + '萁' => 'qi', + '颀' => 'qi', + '阗' => 'tian', + '湉' => 'tian', + '翀' => 'chong', + '岷' => 'min', + '桤' => 'qi', + '囯' => 'guo', + '浛' => 'han', + '勐' => 'meng', + '苠' => 'min', + '岍' => 'qian', + '皞' => 'hao', + '岐' => 'qi', + '溥' => 'pu', + '锘' => 'muo', + '渼' => 'mei', + '燊' => 'shen', + '玚' => 'chang', + '亓' => 'qi', + '湋' => 'wei', + '涴' => 'wan', + '沤' => 'ou', + '胖' => 'pang', + '莆' => 'pu', + '扦' => 'qian', + '僳' => 'su', + '坍' => 'tan', + '锑' => 'ti', + '嚏' => 'ti', + '腆' => 'tian', + '丿' => 'pie', + '鼗' => 'tao', + '芈' => 'mi', + '匚' => 'fang', + '刂' => 'li', + '冂' => 'tong', + '亻' => 'dan', + '仳' => 'pi', + '俜' => 'ping', + '俳' => 'pai', + '倜' => 'ti', + '傥' => 'tang', + '傩' => 'nuo', + '佥' => 'qian', + '勹' => 'bao', + '亠' => 'tou', + '廾' => 'gong', + '匏' => 'pao', + '扌' => 'ti', + '拚' => 'pin', + '掊' => 'pou', + '搦' => 'nuo', + '擗' => 'pi', + '啕' => 'tao', + '嗦' => 'suo', + '嗍' => 'suo', + '辔' => 'pei', + '嘌' => 'piao', + '嗾' => 'sou', + '嘧' => 'mi', + '帔' => 'pei', + '帑' => 'tang', + '彡' => 'san', + '犭' => 'fan', + '狍' => 'pao', + '狲' => 'sun', + '狻' => 'jun', + '飧' => 'sun', + '夂' => 'zhi', + '饣' => 'shi', + '庀' => 'pi', + '忄' => 'shu', + '愫' => 'su', + '闼' => 'ta', + '丬' => 'jiang', + '氵' => 'san', + '汔' => 'qi', + '沔' => 'mian', + '汨' => 'mi', + '泮' => 'pan', + '洮' => 'tao', + '涑' => 'su', + '淠' => 'pi', + '湓' => 'pen', + '溻' => 'ta', + '溏' => 'tang', + '濉' => 'sui', + '宀' => 'bao', + '搴' => 'qian', + '辶' => 'zou', + '逄' => 'pang', + '逖' => 'ti', + '遢' => 'ta', + '邈' => 'miao', + '邃' => 'sui', + '彐' => 'ji', + '屮' => 'cao', + '娑' => 'suo', + '嫖' => 'piao', + '纟' => 'jiao', + '缗' => 'min', + '瑭' => 'tang', + '杪' => 'miao', + '桫' => 'suo', + '榀' => 'pin', + '榫' => 'sun', + '槭' => 'qi', + '甓' => 'pi', + '攴' => 'po', + '耆' => 'qi', + '牝' => 'pin', + '犏' => 'pian', + '氆' => 'pu', + '攵' => 'fan', + '肽' => 'tai', + '胼' => 'pian', + '脒' => 'mi', + '脬' => 'pao', + '旆' => 'pei', + '炱' => 'tai', + '燧' => 'sui', + '灬' => 'biao', + '礻' => 'shi', + '祧' => 'tiao', + '忑' => 'te', + '忐' => 'tan', + '愍' => 'min', + '肀' => 'yu', + '碛' => 'qi', + '眄' => 'mian', + '眇' => 'miao', + '眭' => 'sui', + '睃' => 'suo', + '瞍' => 'sou', + '畋' => 'tian', + '罴' => 'pi', + '蠓' => 'meng', + '蠛' => 'mie', + '笸' => 'po', + '筢' => 'pa', + '衄' => 'nv', + '艋' => 'meng', + '敉' => 'mi', + '糸' => 'mi', + '綦' => 'qi', + '醅' => 'pei', + '醣' => 'tang', + '趿' => 'ta', + '觫' => 'su', + '龆' => 'tiao', + '鲆' => 'ping', + '稣' => 'su', + '鲐' => 'tai', + '鲦' => 'tiao', + '鳎' => 'ta', + '髂' => 'qia', + '縻' => 'mi', + '裒' => 'pou', + '冫' => 'liang', + '冖' => 'tu', + '讠' => 'yan', + '谇' => 'sui', + '谝' => 'pian', + '谡' => 'su', + '卩' => 'dan', + '阝' => 'zuo', + '陴' => 'pi', + '邳' => 'pi', + '郫' => 'pi', + '郯' => 'tan', + '廴' => 'yin', + '凵' => 'qian', + '圮' => 'pi', + '堋' => 'peng', + '鼙' => 'pi', + '艹' => 'cao', + '芑' => 'qi', + '苤' => 'pie', + '荪' => 'sun', + '荽' => 'sui', + '葜' => 'qia', + '蒎' => 'pai', + '蔌' => 'su', + '蕲' => 'qi', + '薮' => 'sou', + '薹' => 'tai', + '蘼' => 'mi', + '钅' => 'jin', + '钷' => 'po', + '钽' => 'tan', + '铍' => 'pi', + '铴' => 'tang', + '铽' => 'te', + '锫' => 'pei', + '锬' => 'tan', + '锼' => 'sou', + '镤' => 'pu', + '镨' => 'pu', + '皤' => 'po', + '鹈' => 'ti', + '鹋' => 'miao', + '疒' => 'bing', + '疱' => 'pao', + '衤' => 'yi', + '袢' => 'pan', + '裼' => 'ti', + '襻' => 'pan', + '耥' => 'tang', + '耦' => 'ou', + '虍' => 'hu', + '蛴' => 'qi', + '蜞' => 'qi', + '蜱' => 'pi', + '螋' => 'sou', + '螗' => 'tang', + '螵' => 'piao', + '蟛' => 'peng', + ), + 'croatian' => + array ( + 'Č' => 'C', + 'Ć' => 'C', + 'Ž' => 'Z', + 'Š' => 'S', + 'Đ' => 'Dj', + 'č' => 'c', + 'ć' => 'c', + 'ž' => 'z', + 'š' => 's', + 'đ' => 'dj', + ), + 'czech' => + array ( + 'Č' => 'C', + 'Ď' => 'D', + 'Ě' => 'E', + 'Ň' => 'N', + 'Ř' => 'R', + 'Š' => 'S', + 'Ť' => 'T', + 'Ů' => 'U', + 'Ž' => 'Z', + 'č' => 'c', + 'ď' => 'd', + 'ě' => 'e', + 'ň' => 'n', + 'ř' => 'r', + 'š' => 's', + 'ť' => 't', + 'ů' => 'u', + 'ž' => 'z', + ), + 'danish' => + array ( + 'Æ' => 'Ae', + 'æ' => 'ae', + 'Ø' => 'Oe', + 'ø' => 'oe', + 'Å' => 'Aa', + 'å' => 'aa', + 'É' => 'E', + 'é' => 'e', + ), + 'default' => + array ( + '°' => '0', + '¹' => '1', + '²' => '2', + '³' => '3', + '⁴' => '4', + '⁵' => '5', + '⁶' => '6', + '⁷' => '7', + '⁸' => '8', + '⁹' => '9', + '₀' => '0', + '₁' => '1', + '₂' => '2', + '₃' => '3', + '₄' => '4', + '₅' => '5', + '₆' => '6', + '₇' => '7', + '₈' => '8', + '₉' => '9', + 'æ' => 'ae', + 'ǽ' => 'ae', + 'À' => 'A', + 'Á' => 'A', + 'Â' => 'A', + 'Ã' => 'A', + 'Å' => 'AA', + 'Ǻ' => 'A', + 'Ă' => 'A', + 'Ǎ' => 'A', + 'Æ' => 'AE', + 'Ǽ' => 'AE', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ã' => 'a', + 'å' => 'aa', + 'ǻ' => 'a', + 'ă' => 'a', + 'ǎ' => 'a', + 'ª' => 'a', + '@' => 'at', + 'Ĉ' => 'C', + 'Ċ' => 'C', + 'Ç' => 'C', + 'ç' => 'c', + 'ĉ' => 'c', + 'ċ' => 'c', + '©' => 'c', + 'Ð' => 'Dj', + 'Đ' => 'D', + 'ð' => 'dj', + 'đ' => 'd', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ĕ' => 'E', + 'Ė' => 'E', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ĕ' => 'e', + 'ė' => 'e', + 'ƒ' => 'f', + 'Ĝ' => 'G', + 'Ġ' => 'G', + 'ĝ' => 'g', + 'ġ' => 'g', + 'Ĥ' => 'H', + 'Ħ' => 'H', + 'ĥ' => 'h', + 'ħ' => 'h', + 'Ì' => 'I', + 'Í' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ĩ' => 'I', + 'Ĭ' => 'I', + 'Ǐ' => 'I', + 'Į' => 'I', + 'IJ' => 'IJ', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ĩ' => 'i', + 'ĭ' => 'i', + 'ǐ' => 'i', + 'į' => 'i', + 'ij' => 'ij', + 'Ĵ' => 'J', + 'ĵ' => 'j', + 'Ĺ' => 'L', + 'Ľ' => 'L', + 'Ŀ' => 'L', + 'ĺ' => 'l', + 'ľ' => 'l', + 'ŀ' => 'l', + 'Ñ' => 'N', + 'ñ' => 'n', + 'ʼn' => 'n', + 'Ò' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ō' => 'O', + 'Ŏ' => 'O', + 'Ǒ' => 'O', + 'Ő' => 'O', + 'Ơ' => 'O', + 'Ø' => 'OE', + 'Ǿ' => 'O', + 'Œ' => 'OE', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ō' => 'o', + 'ŏ' => 'o', + 'ǒ' => 'o', + 'ő' => 'o', + 'ơ' => 'o', + 'ø' => 'oe', + 'ǿ' => 'o', + 'º' => 'o', + 'œ' => 'oe', + 'Ŕ' => 'R', + 'Ŗ' => 'R', + 'ŕ' => 'r', + 'ŗ' => 'r', + 'Ŝ' => 'S', + 'Ș' => 'S', + 'ŝ' => 's', + 'ș' => 's', + 'ſ' => 's', + 'Ţ' => 'T', + 'Ț' => 'T', + 'Ŧ' => 'T', + 'Þ' => 'TH', + 'ţ' => 't', + 'ț' => 't', + 'ŧ' => 't', + 'þ' => 'th', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ü' => 'U', + 'Ũ' => 'U', + 'Ŭ' => 'U', + 'Ű' => 'U', + 'Ų' => 'U', + 'Ư' => 'U', + 'Ǔ' => 'U', + 'Ǖ' => 'U', + 'Ǘ' => 'U', + 'Ǚ' => 'U', + 'Ǜ' => 'U', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'u', + 'ũ' => 'u', + 'ŭ' => 'u', + 'ű' => 'u', + 'ų' => 'u', + 'ư' => 'u', + 'ǔ' => 'u', + 'ǖ' => 'u', + 'ǘ' => 'u', + 'ǚ' => 'u', + 'ǜ' => 'u', + 'Ŵ' => 'W', + 'ŵ' => 'w', + 'Ý' => 'Y', + 'Ÿ' => 'Y', + 'Ŷ' => 'Y', + 'ý' => 'y', + 'ÿ' => 'y', + 'ŷ' => 'y', + ), + 'esperanto' => + array ( + 'ĉ' => 'cx', + 'ĝ' => 'gx', + 'ĥ' => 'hx', + 'ĵ' => 'jx', + 'ŝ' => 'sx', + 'ŭ' => 'ux', + 'Ĉ' => 'CX', + 'Ĝ' => 'GX', + 'Ĥ' => 'HX', + 'Ĵ' => 'JX', + 'Ŝ' => 'SX', + 'Ŭ' => 'UX', + ), + 'estonian' => + array ( + 'Š' => 'S', + 'Ž' => 'Z', + 'Õ' => 'O', + 'Ä' => 'A', + 'Ö' => 'O', + 'Ü' => 'U', + 'š' => 's', + 'ž' => 'z', + 'õ' => 'o', + 'ä' => 'a', + 'ö' => 'o', + 'ü' => 'u', + ), + 'finnish' => + array ( + 'Ä' => 'A', + 'Ö' => 'O', + 'ä' => 'a', + 'ö' => 'o', + ), + 'french' => + array ( + 'À' => 'A', + 'Â' => 'A', + 'Æ' => 'AE', + 'Ç' => 'C', + 'É' => 'E', + 'È' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ï' => 'I', + 'Î' => 'I', + 'Ô' => 'O', + 'Œ' => 'OE', + 'Ù' => 'U', + 'Û' => 'U', + 'Ü' => 'U', + 'à' => 'a', + 'â' => 'a', + 'æ' => 'ae', + 'ç' => 'c', + 'é' => 'e', + 'è' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ï' => 'i', + 'î' => 'i', + 'ô' => 'o', + 'œ' => 'oe', + 'ù' => 'u', + 'û' => 'u', + 'ü' => 'u', + 'ÿ' => 'y', + 'Ÿ' => 'Y', + ), + 'georgian' => + array ( + 'ა' => 'a', + 'ბ' => 'b', + 'გ' => 'g', + 'დ' => 'd', + 'ე' => 'e', + 'ვ' => 'v', + 'ზ' => 'z', + 'თ' => 't', + 'ი' => 'i', + 'კ' => 'k', + 'ლ' => 'l', + 'მ' => 'm', + 'ნ' => 'n', + 'ო' => 'o', + 'პ' => 'p', + 'ჟ' => 'zh', + 'რ' => 'r', + 'ს' => 's', + 'ტ' => 't', + 'უ' => 'u', + 'ფ' => 'f', + 'ქ' => 'k', + 'ღ' => 'gh', + 'ყ' => 'q', + 'შ' => 'sh', + 'ჩ' => 'ch', + 'ც' => 'ts', + 'ძ' => 'dz', + 'წ' => 'ts', + 'ჭ' => 'ch', + 'ხ' => 'kh', + 'ჯ' => 'j', + 'ჰ' => 'h', + ), + 'german' => + array ( + 'Ä' => 'AE', + 'Ö' => 'OE', + 'Ü' => 'UE', + 'ß' => 'ss', + 'ä' => 'ae', + 'ö' => 'oe', + 'ü' => 'ue', + ), + 'greek' => + array ( + 'ΑΥ' => 'AU', + 'Αυ' => 'Au', + 'ΟΥ' => 'OU', + 'Ου' => 'Ou', + 'ΕΥ' => 'EU', + 'Ευ' => 'Eu', + 'ΕΙ' => 'I', + 'Ει' => 'I', + 'ΟΙ' => 'I', + 'Οι' => 'I', + 'ΥΙ' => 'I', + 'Υι' => 'I', + 'ΑΎ' => 'AU', + 'Αύ' => 'Au', + 'ΟΎ' => 'OU', + 'Ού' => 'Ou', + 'ΕΎ' => 'EU', + 'Εύ' => 'Eu', + 'ΕΊ' => 'I', + 'Εί' => 'I', + 'ΟΊ' => 'I', + 'Οί' => 'I', + 'ΎΙ' => 'I', + 'Ύι' => 'I', + 'ΥΊ' => 'I', + 'Υί' => 'I', + 'αυ' => 'au', + 'ου' => 'ou', + 'ευ' => 'eu', + 'ει' => 'i', + 'οι' => 'i', + 'υι' => 'i', + 'αύ' => 'au', + 'ού' => 'ou', + 'εύ' => 'eu', + 'εί' => 'i', + 'οί' => 'i', + 'ύι' => 'i', + 'υί' => 'i', + 'Α' => 'A', + 'Β' => 'V', + 'Γ' => 'G', + 'Δ' => 'D', + 'Ε' => 'E', + 'Ζ' => 'Z', + 'Η' => 'I', + 'Θ' => 'Th', + 'Ι' => 'I', + 'Κ' => 'K', + 'Λ' => 'L', + 'Μ' => 'M', + 'Ν' => 'N', + 'Ξ' => 'X', + 'Ο' => 'O', + 'Π' => 'P', + 'Ρ' => 'R', + 'Σ' => 'S', + 'Τ' => 'T', + 'Υ' => 'I', + 'Φ' => 'F', + 'Χ' => 'Ch', + 'Ψ' => 'Ps', + 'Ω' => 'O', + 'Ά' => 'A', + 'Έ' => 'E', + 'Ή' => 'I', + 'Ί' => 'I', + 'Ό' => 'O', + 'Ύ' => 'I', + 'Ϊ' => 'I', + 'Ϋ' => 'I', + 'ϒ' => 'I', + 'α' => 'a', + 'β' => 'v', + 'γ' => 'g', + 'δ' => 'd', + 'ε' => 'e', + 'ζ' => 'z', + 'η' => 'i', + 'θ' => 'th', + 'ι' => 'i', + 'κ' => 'k', + 'λ' => 'l', + 'μ' => 'm', + 'ν' => 'n', + 'ξ' => 'x', + 'ο' => 'o', + 'π' => 'p', + 'ρ' => 'r', + 'ς' => 's', + 'σ' => 's', + 'τ' => 't', + 'υ' => 'i', + 'φ' => 'f', + 'χ' => 'ch', + 'ψ' => 'ps', + 'ω' => 'o', + 'ά' => 'a', + 'έ' => 'e', + 'ή' => 'i', + 'ί' => 'i', + 'ό' => 'o', + 'ύ' => 'i', + 'ϊ' => 'i', + 'ϋ' => 'i', + 'ΰ' => 'i', + 'ώ' => 'o', + 'ϐ' => 'v', + 'ϑ' => 'th', + ), + 'hindi' => + array ( + 'अ' => 'a', + 'आ' => 'aa', + 'ए' => 'e', + 'ई' => 'ii', + 'ऍ' => 'ei', + 'ऎ' => 'ae', + 'ऐ' => 'ai', + 'इ' => 'i', + 'ओ' => 'o', + 'ऑ' => 'oi', + 'ऒ' => 'oii', + 'ऊ' => 'uu', + 'औ' => 'ou', + 'उ' => 'u', + 'ब' => 'B', + 'भ' => 'Bha', + 'च' => 'Ca', + 'छ' => 'Chha', + 'ड' => 'Da', + 'ढ' => 'Dha', + 'फ' => 'Fa', + 'फ़' => 'Fi', + 'ग' => 'Ga', + 'घ' => 'Gha', + 'ग़' => 'Ghi', + 'ह' => 'Ha', + 'ज' => 'Ja', + 'झ' => 'Jha', + 'क' => 'Ka', + 'ख' => 'Kha', + 'ख़' => 'Khi', + 'ल' => 'L', + 'ळ' => 'Li', + 'ऌ' => 'Li', + 'ऴ' => 'Lii', + 'ॡ' => 'Lii', + 'म' => 'Ma', + 'न' => 'Na', + 'ङ' => 'Na', + 'ञ' => 'Nia', + 'ण' => 'Nae', + 'ऩ' => 'Ni', + 'ॐ' => 'oms', + 'प' => 'Pa', + 'क़' => 'Qi', + 'र' => 'Ra', + 'ऋ' => 'Ri', + 'ॠ' => 'Ri', + 'ऱ' => 'Ri', + 'स' => 'Sa', + 'श' => 'Sha', + 'ष' => 'Shha', + 'ट' => 'Ta', + 'त' => 'Ta', + 'ठ' => 'Tha', + 'द' => 'Tha', + 'थ' => 'Tha', + 'ध' => 'Thha', + 'ड़' => 'ugDha', + 'ढ़' => 'ugDhha', + 'व' => 'Va', + 'य' => 'Ya', + 'य़' => 'Yi', + 'ज़' => 'Za', + ), + 'hungarian' => + array ( + 'Á' => 'a', + 'É' => 'e', + 'Í' => 'i', + 'Ó' => 'o', + 'Ö' => 'o', + 'Ő' => 'o', + 'Ú' => 'u', + 'Ü' => 'u', + 'Ű' => 'u', + 'á' => 'a', + 'é' => 'e', + 'í' => 'i', + 'ó' => 'o', + 'ö' => 'o', + 'ő' => 'o', + 'ú' => 'u', + 'ü' => 'u', + 'ű' => 'u', + ), + 'italian' => + array ( + 'À' => 'a', + 'È' => 'e', + 'Ì' => 'i', + 'Ò' => 'o', + 'Ù' => 'u', + 'à' => 'a', + 'é' => 'e', + 'è' => 'e', + 'ì' => 'i', + 'ò' => 'o', + 'ù' => 'u', + ), + 'latvian' => + array ( + 'Ā' => 'A', + 'Ē' => 'E', + 'Ģ' => 'G', + 'Ī' => 'I', + 'Ķ' => 'K', + 'Ļ' => 'L', + 'Ņ' => 'N', + 'Ū' => 'U', + 'ā' => 'a', + 'ē' => 'e', + 'ģ' => 'g', + 'ī' => 'i', + 'ķ' => 'k', + 'ļ' => 'l', + 'ņ' => 'n', + 'ū' => 'u', + ), + 'lithuanian' => + array ( + 'Ą' => 'A', + 'Č' => 'C', + 'Ę' => 'E', + 'Ė' => 'E', + 'Į' => 'I', + 'Š' => 'S', + 'Ų' => 'U', + 'Ū' => 'U', + 'Ž' => 'Z', + 'ą' => 'a', + 'č' => 'c', + 'ę' => 'e', + 'ė' => 'e', + 'į' => 'i', + 'š' => 's', + 'ų' => 'u', + 'ū' => 'u', + 'ž' => 'z', + ), + 'macedonian' => + array ( + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Ѓ' => 'Gj', + 'Е' => 'E', + 'Ж' => 'Zh', + 'З' => 'Z', + 'Ѕ' => 'Dz', + 'И' => 'I', + 'Ј' => 'J', + 'К' => 'K', + 'Л' => 'L', + 'Љ' => 'Lj', + 'М' => 'M', + 'Н' => 'N', + 'Њ' => 'Nj', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'Ќ' => 'Kj', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'Ch', + 'Џ' => 'Dj', + 'Ш' => 'Sh', + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'ѓ' => 'gj', + 'е' => 'e', + 'ж' => 'zh', + 'з' => 'z', + 'ѕ' => 'dz', + 'и' => 'i', + 'ј' => 'j', + 'к' => 'k', + 'л' => 'l', + 'љ' => 'lj', + 'м' => 'm', + 'н' => 'n', + 'њ' => 'nj', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'ќ' => 'kj', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'џ' => 'dj', + 'ш' => 'sh', + ), + 'norwegian' => + array ( + 'Æ' => 'AE', + 'Ø' => 'OE', + 'Å' => 'AA', + 'æ' => 'ae', + 'ø' => 'oe', + 'å' => 'aa', + ), + 'persian' => + array ( + 'ا' => 'a', + 'ب' => 'b', + 'پ' => 'p', + 'ت' => 't', + 'ث' => 'th', + 'ج' => 'j', + 'چ' => 'ch', + 'ح' => 'h', + 'خ' => 'kh', + 'د' => 'd', + 'ذ' => 'th', + 'ر' => 'r', + 'ز' => 'z', + 'ژ' => 'zh', + 'س' => 's', + 'ش' => 'sh', + 'ص' => 's', + 'ض' => 'z', + 'ط' => 't', + 'ظ' => 'z', + 'ع' => 'a', + 'غ' => 'gh', + 'ف' => 'f', + 'ق' => 'g', + 'ك' => 'k', + 'گ' => 'g', + 'ل' => 'l', + 'م' => 'm', + 'ن' => 'n', + 'و' => 'o', + 'ه' => 'h', + 'ی' => 'y', + ), + 'polish' => + array ( + 'Ą' => 'A', + 'Ć' => 'C', + 'Ę' => 'E', + 'Ł' => 'L', + 'Ń' => 'N', + 'Ó' => 'O', + 'Ś' => 'S', + 'Ź' => 'Z', + 'Ż' => 'Z', + 'ą' => 'a', + 'ć' => 'c', + 'ę' => 'e', + 'ł' => 'l', + 'ń' => 'n', + 'ó' => 'o', + 'ś' => 's', + 'ź' => 'z', + 'ż' => 'z', + ), + 'portuguese-brazil' => + array ( + '°' => '0', + '¹' => '1', + '²' => '2', + '³' => '3', + '⁴' => '4', + '⁵' => '5', + '⁶' => '6', + '⁷' => '7', + '⁸' => '8', + '⁹' => '9', + '₀' => '0', + '₁' => '1', + '₂' => '2', + '₃' => '3', + '₄' => '4', + '₅' => '5', + '₆' => '6', + '₇' => '7', + '₈' => '8', + '₉' => '9', + 'æ' => 'ae', + 'ǽ' => 'ae', + 'À' => 'A', + 'Á' => 'A', + 'Â' => 'A', + 'Ã' => 'A', + 'Å' => 'AA', + 'Ǻ' => 'A', + 'Ă' => 'A', + 'Ǎ' => 'A', + 'Æ' => 'AE', + 'Ǽ' => 'AE', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ã' => 'a', + 'å' => 'aa', + 'ǻ' => 'a', + 'ă' => 'a', + 'ǎ' => 'a', + 'ª' => 'a', + '@' => 'at', + 'Ĉ' => 'C', + 'Ċ' => 'C', + 'Ç' => 'Ç', + 'ç' => 'ç', + 'ĉ' => 'c', + 'ċ' => 'c', + '©' => 'c', + 'Ð' => 'Dj', + 'Đ' => 'D', + 'ð' => 'dj', + 'đ' => 'd', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ĕ' => 'E', + 'Ė' => 'E', + 'è' => 'e', + 'é' => 'é', + 'ê' => 'e', + 'ë' => 'e', + 'ĕ' => 'e', + 'ė' => 'e', + 'ƒ' => 'f', + 'Ĝ' => 'G', + 'Ġ' => 'G', + 'ĝ' => 'g', + 'ġ' => 'g', + 'Ĥ' => 'H', + 'Ħ' => 'H', + 'ĥ' => 'h', + 'ħ' => 'h', + 'Ì' => 'I', + 'Í' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ĩ' => 'I', + 'Ĭ' => 'I', + 'Ǐ' => 'I', + 'Į' => 'I', + 'IJ' => 'IJ', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ĩ' => 'i', + 'ĭ' => 'i', + 'ǐ' => 'i', + 'į' => 'i', + 'ij' => 'ij', + 'Ĵ' => 'J', + 'ĵ' => 'j', + 'Ĺ' => 'L', + 'Ľ' => 'L', + 'Ŀ' => 'L', + 'ĺ' => 'l', + 'ľ' => 'l', + 'ŀ' => 'l', + 'Ñ' => 'N', + 'ñ' => 'n', + 'ʼn' => 'n', + 'Ò' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ō' => 'O', + 'Ŏ' => 'O', + 'Ǒ' => 'O', + 'Ő' => 'O', + 'Ơ' => 'O', + 'Ø' => 'OE', + 'Ǿ' => 'O', + 'Œ' => 'OE', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ō' => 'o', + 'ŏ' => 'o', + 'ǒ' => 'o', + 'ő' => 'o', + 'ơ' => 'o', + 'ø' => 'oe', + 'ǿ' => 'o', + 'º' => 'o', + 'œ' => 'oe', + 'Ŕ' => 'R', + 'Ŗ' => 'R', + 'ŕ' => 'r', + 'ŗ' => 'r', + 'Ŝ' => 'S', + 'Ș' => 'S', + 'ŝ' => 's', + 'ș' => 's', + 'ſ' => 's', + 'Ţ' => 'T', + 'Ț' => 'T', + 'Ŧ' => 'T', + 'Þ' => 'TH', + 'ţ' => 't', + 'ț' => 't', + 'ŧ' => 't', + 'þ' => 'th', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ü' => 'U', + 'Ũ' => 'U', + 'Ŭ' => 'U', + 'Ű' => 'U', + 'Ų' => 'U', + 'Ư' => 'U', + 'Ǔ' => 'U', + 'Ǖ' => 'U', + 'Ǘ' => 'U', + 'Ǚ' => 'U', + 'Ǜ' => 'U', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'u', + 'ũ' => 'u', + 'ŭ' => 'u', + 'ű' => 'u', + 'ų' => 'u', + 'ư' => 'u', + 'ǔ' => 'u', + 'ǖ' => 'u', + 'ǘ' => 'u', + 'ǚ' => 'u', + 'ǜ' => 'u', + 'Ŵ' => 'W', + 'ŵ' => 'w', + 'Ý' => 'Y', + 'Ÿ' => 'Y', + 'Ŷ' => 'Y', + 'ý' => 'y', + 'ÿ' => 'y', + 'ŷ' => 'y', + ), + 'romanian' => + array ( + 'ă' => 'a', + 'î' => 'i', + 'â' => 'a', + 'ş' => 's', + 'ș' => 's', + 'ţ' => 't', + 'ț' => 't', + 'Ă' => 'A', + 'Î' => 'I', + 'Â' => 'A', + 'Ş' => 'S', + 'Ș' => 'S', + 'Ţ' => 'T', + 'Ț' => 'T', + ), + 'russian' => + array ( + 'Ъ' => '', + 'Ь' => '', + 'А' => 'A', + 'Б' => 'B', + 'Ц' => 'C', + 'Ч' => 'Ch', + 'Д' => 'D', + 'Е' => 'E', + 'Ё' => 'E', + 'Э' => 'E', + 'Ф' => 'F', + 'Г' => 'G', + 'Х' => 'H', + 'И' => 'I', + 'Й' => 'Y', + 'Я' => 'Ya', + 'Ю' => 'Yu', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Ш' => 'Sh', + 'Щ' => 'Shch', + 'Т' => 'T', + 'У' => 'U', + 'В' => 'V', + 'Ы' => 'Y', + 'З' => 'Z', + 'Ж' => 'Zh', + 'ъ' => '', + 'ь' => '', + 'а' => 'a', + 'б' => 'b', + 'ц' => 'c', + 'ч' => 'ch', + 'д' => 'd', + 'е' => 'e', + 'ё' => 'e', + 'э' => 'e', + 'ф' => 'f', + 'г' => 'g', + 'х' => 'h', + 'и' => 'i', + 'й' => 'y', + 'я' => 'ya', + 'ю' => 'yu', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'ш' => 'sh', + 'щ' => 'shch', + 'т' => 't', + 'у' => 'u', + 'в' => 'v', + 'ы' => 'y', + 'з' => 'z', + 'ж' => 'zh', + ), + 'serbian' => + array ( + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'ђ' => 'dj', + 'е' => 'e', + 'ж' => 'z', + 'з' => 'z', + 'и' => 'i', + 'ј' => 'j', + 'к' => 'k', + 'л' => 'l', + 'љ' => 'lj', + 'м' => 'm', + 'н' => 'n', + 'њ' => 'nj', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'ћ' => 'c', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'c', + 'џ' => 'dz', + 'ш' => 's', + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Ђ' => 'Dj', + 'Е' => 'E', + 'Ж' => 'Z', + 'З' => 'Z', + 'И' => 'I', + 'Ј' => 'J', + 'К' => 'K', + 'Л' => 'L', + 'Љ' => 'Lj', + 'М' => 'M', + 'Н' => 'N', + 'Њ' => 'Nj', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'Ћ' => 'C', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'C', + 'Џ' => 'Dz', + 'Ш' => 'S', + 'š' => 's', + 'đ' => 'dj', + 'ž' => 'z', + 'ć' => 'c', + 'č' => 'c', + 'Š' => 'S', + 'Đ' => 'DJ', + 'Ž' => 'Z', + 'Ć' => 'C', + 'Č' => 'C', + ), + 'slovak' => + array( + "Á" => "A", + "Ä" => "A", + "Č" => "C", + "Ď" => "D", + "É" => "E", + "Í" => "I", + "Ĺ" => "L", + "Ľ" => "L", + "Ň" => "N", + "Ó" => "O", + "Ô" => "O", + "Ŕ" => "R", + "Š" => "S", + "Ť" => "T", + "Ú" => "U", + "Ý" => "Y", + "Ž" => "Z", + "á" => "a", + "ä" => "a", + "č" => "c", + "ď" => "d", + "é" => "e", + "í" => "i", + "ĺ" => "l", + "ľ" => "l", + "ň" => "n", + "ó" => "o", + "ô" => "o", + "ŕ" => "r", + "š" => "s", + "ť" => "t", + "ú" => "u", + "ý" => "y", + "ž" => "z", + ), + 'swedish' => + array ( + 'Ä' => 'A', + 'Å' => 'a', + 'Ö' => 'O', + 'ä' => 'a', + 'å' => 'a', + 'ö' => 'o', + ), + 'turkish' => + array ( + 'Ç' => 'C', + 'Ğ' => 'G', + 'İ' => 'I', + 'Ş' => 'S', + 'Ö' => 'O', + 'Ü' => 'U', + 'ç' => 'c', + 'ğ' => 'g', + 'ı' => 'i', + 'ş' => 's', + 'ö' => 'o', + 'ü' => 'u', + ), + 'turkmen' => + array ( + 'Ç' => 'C', + 'Ä' => 'A', + 'Ž' => 'Z', + 'Ň' => 'N', + 'Ö' => 'O', + 'Ş' => 'S', + 'Ü' => 'U', + 'Ý' => 'Y', + 'ç' => 'c', + 'ä' => 'a', + 'ž' => 'z', + 'ň' => 'n', + 'ö' => 'o', + 'ş' => 's', + 'ü' => 'u', + 'ý' => 'y', + ), + 'ukrainian' => + array ( + 'Ґ' => 'G', + 'І' => 'I', + 'Ї' => 'Ji', + 'Є' => 'Ye', + 'ґ' => 'g', + 'і' => 'i', + 'ї' => 'ji', + 'є' => 'ye', + ), + 'vietnamese' => + array ( + 'ạ' => 'a', + 'ả' => 'a', + 'ầ' => 'a', + 'ấ' => 'a', + 'ậ' => 'a', + 'ẩ' => 'a', + 'ẫ' => 'a', + 'ằ' => 'a', + 'ắ' => 'a', + 'ặ' => 'a', + 'ẳ' => 'a', + 'ẵ' => 'a', + 'ẹ' => 'e', + 'ẻ' => 'e', + 'ẽ' => 'e', + 'ề' => 'e', + 'ế' => 'e', + 'ệ' => 'e', + 'ể' => 'e', + 'ễ' => 'e', + 'ị' => 'i', + 'ỉ' => 'i', + 'ọ' => 'o', + 'ỏ' => 'o', + 'ồ' => 'o', + 'ố' => 'o', + 'ộ' => 'o', + 'ổ' => 'o', + 'ỗ' => 'o', + 'ờ' => 'o', + 'ớ' => 'o', + 'ợ' => 'o', + 'ở' => 'o', + 'ỡ' => 'o', + 'ụ' => 'u', + 'ủ' => 'u', + 'ừ' => 'u', + 'ứ' => 'u', + 'ự' => 'u', + 'ử' => 'u', + 'ữ' => 'u', + 'ỳ' => 'y', + 'ỵ' => 'y', + 'ỷ' => 'y', + 'ỹ' => 'y', + 'Ạ' => 'A', + 'Ả' => 'A', + 'Ầ' => 'A', + 'Ấ' => 'A', + 'Ậ' => 'A', + 'Ẩ' => 'A', + 'Ẫ' => 'A', + 'Ằ' => 'A', + 'Ắ' => 'A', + 'Ặ' => 'A', + 'Ẳ' => 'A', + 'Ẵ' => 'A', + 'Ẹ' => 'E', + 'Ẻ' => 'E', + 'Ẽ' => 'E', + 'Ề' => 'E', + 'Ế' => 'E', + 'Ệ' => 'E', + 'Ể' => 'E', + 'Ễ' => 'E', + 'Ị' => 'I', + 'Ỉ' => 'I', + 'Ọ' => 'O', + 'Ỏ' => 'O', + 'Ồ' => 'O', + 'Ố' => 'O', + 'Ộ' => 'O', + 'Ổ' => 'O', + 'Ỗ' => 'O', + 'Ờ' => 'O', + 'Ớ' => 'O', + 'Ợ' => 'O', + 'Ở' => 'O', + 'Ỡ' => 'O', + 'Ụ' => 'U', + 'Ủ' => 'U', + 'Ừ' => 'U', + 'Ứ' => 'U', + 'Ự' => 'U', + 'Ử' => 'U', + 'Ữ' => 'U', + 'Ỳ' => 'Y', + 'Ỵ' => 'Y', + 'Ỷ' => 'Y', + 'Ỹ' => 'Y', + ), +)/*INSERT_END*/; + + /** + * @param string $ruleset + * + * @return array + */ + public function getRules($ruleset) + { + return $this->rules[$ruleset]; + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/FileRuleProvider.php b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/FileRuleProvider.php new file mode 100644 index 0000000..6065933 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/FileRuleProvider.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\RuleProvider; + +/** + * FileRuleProvider + * + * @package Cocur\Slugify\RuleProvider + * @author Florian Eckerstorfer + * @copyright 2015 Florian Eckerstorfer + */ +class FileRuleProvider implements RuleProviderInterface +{ + /** + * @var string + */ + protected $directoryName; + + /** + * @param string $directoryName + */ + public function __construct($directoryName) + { + $this->directoryName = $directoryName; + } + + /** + * @param $ruleset + * + * @return array + */ + public function getRules($ruleset) + { + $fileName = $this->directoryName.DIRECTORY_SEPARATOR.$ruleset.'.json'; + + return json_decode(file_get_contents($fileName), true); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/RuleProviderInterface.php b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/RuleProviderInterface.php new file mode 100644 index 0000000..f5648cc --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/RuleProvider/RuleProviderInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify\RuleProvider; + +/** + * RuleProviderInterface + * + * @package Cocur\Slugify\RuleProvider + * @author Florian Eckerstorfer + * @copyright 2015 Florian Eckerstorfer + */ +interface RuleProviderInterface +{ + /** + * @param $ruleset + * + * @return array + */ + public function getRules($ruleset); +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/Slugify.php b/plugins/page-toc/vendor/cocur/slugify/src/Slugify.php new file mode 100644 index 0000000..712cea3 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/Slugify.php @@ -0,0 +1,192 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify; + +use Cocur\Slugify\RuleProvider\DefaultRuleProvider; +use Cocur\Slugify\RuleProvider\RuleProviderInterface; + +/** + * Slugify + * + * @package Cocur\Slugify + * @author Florian Eckerstorfer + * @author Ivo Bathke + * @author Marchenko Alexandr + * @copyright 2012-2015 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +class Slugify implements SlugifyInterface +{ + const LOWERCASE_NUMBERS_DASHES = '/[^A-Za-z0-9]+/'; + + /** + * @var array + */ + protected $rules = []; + + /** + * @var RuleProviderInterface + */ + protected $provider; + + /** + * @var array + */ + protected $options = [ + 'regexp' => self::LOWERCASE_NUMBERS_DASHES, + 'separator' => '-', + 'lowercase' => true, + 'lowercase_after_regexp' => false, + 'trim' => true, + 'strip_tags' => false, + 'rulesets' => [ + 'default', + // Languages are preferred if they appear later, list is ordered by number of + // websites in that language + // https://en.wikipedia.org/wiki/Languages_used_on_the_Internet#Content_languages_for_websites + 'armenian', + 'azerbaijani', + 'burmese', + 'hindi', + 'georgian', + 'norwegian', + 'vietnamese', + 'ukrainian', + 'latvian', + 'finnish', + 'greek', + 'czech', + 'arabic', + 'slovak', + 'turkish', + 'polish', + 'german', + 'russian', + 'romanian' + ], + ]; + + /** + * @param array $options + * @param RuleProviderInterface $provider + */ + public function __construct(array $options = [], RuleProviderInterface $provider = null) + { + $this->options = array_merge($this->options, $options); + $this->provider = $provider ? $provider : new DefaultRuleProvider(); + + foreach ($this->options['rulesets'] as $ruleSet) { + $this->activateRuleSet($ruleSet); + } + } + + /** + * Returns the slug-version of the string. + * + * @param string $string String to slugify + * @param string|array|null $options Options + * + * @return string Slugified version of the string + */ + public function slugify($string, $options = null) + { + // BC: the second argument used to be the separator + if (is_string($options)) { + $separator = $options; + $options = []; + $options['separator'] = $separator; + } + + $options = array_merge($this->options, (array) $options); + + // Add a custom ruleset without touching the default rules + if (isset($options['ruleset'])) { + $rules = array_merge($this->rules, $this->provider->getRules($options['ruleset'])); + } else { + $rules = $this->rules; + } + + $string = ($options['strip_tags']) + ? strip_tags($string) + : $string; + + $string = strtr($string, $rules); + unset($rules); + + if ($options['lowercase'] && !$options['lowercase_after_regexp']) { + $string = mb_strtolower($string); + } + + $string = preg_replace($options['regexp'], $options['separator'], $string); + + if ($options['lowercase'] && $options['lowercase_after_regexp']) { + $string = mb_strtolower($string); + } + + return ($options['trim']) + ? trim($string, $options['separator']) + : $string; + } + + /** + * Adds a custom rule to Slugify. + * + * @param string $character Character + * @param string $replacement Replacement character + * + * @return Slugify + */ + public function addRule($character, $replacement) + { + $this->rules[$character] = $replacement; + + return $this; + } + + /** + * Adds multiple rules to Slugify. + * + * @param array $rules + * + * @return Slugify + */ + public function addRules(array $rules) + { + foreach ($rules as $character => $replacement) { + $this->addRule($character, $replacement); + } + + return $this; + } + + /** + * @param string $ruleSet + * + * @return Slugify + */ + public function activateRuleSet($ruleSet) + { + return $this->addRules($this->provider->getRules($ruleSet)); + } + + /** + * Static method to create new instance of {@see Slugify}. + * + * @param array $options + * + * @return Slugify + */ + public static function create(array $options = []) + { + return new static($options); + } +} diff --git a/plugins/page-toc/vendor/cocur/slugify/src/SlugifyInterface.php b/plugins/page-toc/vendor/cocur/slugify/src/SlugifyInterface.php new file mode 100644 index 0000000..2160bc1 --- /dev/null +++ b/plugins/page-toc/vendor/cocur/slugify/src/SlugifyInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Cocur\Slugify; + +/** + * SlugifyInterface + * + * @package org.cocur.slugify + * @author Florian Eckerstorfer + * @author Marchenko Alexandr + * @copyright 2012-2014 Florian Eckerstorfer + * @license http://www.opensource.org/licenses/MIT The MIT License + */ +interface SlugifyInterface +{ + /** + * Return a URL safe version of a string. + * + * @param string $string + * @param string|array|null $options + * + * @return string + * + * @api + */ + public function slugify($string, $options = null); +} diff --git a/plugins/page-toc/vendor/composer/ClassLoader.php b/plugins/page-toc/vendor/composer/ClassLoader.php new file mode 100644 index 0000000..0cd6055 --- /dev/null +++ b/plugins/page-toc/vendor/composer/ClassLoader.php @@ -0,0 +1,572 @@ + + * 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 https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var ?string */ + private $vendorDir; + + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ + private $missingClasses = array(); + + /** @var ?string */ + private $apcuPrefix; + + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array[] + * @psalm-return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-var array + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void + */ + 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 string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + 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 string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + 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 string[]|string $paths The PSR-0 base directories + * + * @return void + */ + 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 string[]|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + 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 + * + * @return void + */ + 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 + * + * @return void + */ + 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 + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $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 + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + + return null; + } + + /** + * 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; + } + + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + 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. + * + * @param string $file + * @return void + * @private + */ +function includeFile($file) +{ + include $file; +} diff --git a/plugins/page-toc/vendor/composer/InstalledVersions.php b/plugins/page-toc/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..d50e0c9 --- /dev/null +++ b/plugins/page-toc/vendor/composer/InstalledVersions.php @@ -0,0 +1,350 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/plugins/page-toc/vendor/composer/LICENSE b/plugins/page-toc/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/plugins/page-toc/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/page-toc/vendor/composer/autoload_classmap.php b/plugins/page-toc/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..fde5e12 --- /dev/null +++ b/plugins/page-toc/vendor/composer/autoload_classmap.php @@ -0,0 +1,11 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'Grav\\Plugin\\PageTOCPlugin' => $baseDir . '/page-toc.php', +); diff --git a/plugins/page-toc/vendor/composer/autoload_namespaces.php b/plugins/page-toc/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..b7fc012 --- /dev/null +++ b/plugins/page-toc/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/knplabs/knp-menu/src/Knp/Menu'), + 'Grav\\Plugin\\PageToc\\' => array($baseDir . '/classes'), + 'Cocur\\Slugify\\' => array($vendorDir . '/cocur/slugify/src'), +); diff --git a/plugins/page-toc/vendor/composer/autoload_real.php b/plugins/page-toc/vendor/composer/autoload_real.php new file mode 100644 index 0000000..f0ab1fe --- /dev/null +++ b/plugins/page-toc/vendor/composer/autoload_real.php @@ -0,0 +1,57 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit88b09b7fda3e99f2e22346b58205e375::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/page-toc/vendor/composer/autoload_static.php b/plugins/page-toc/vendor/composer/autoload_static.php new file mode 100644 index 0000000..0b46124 --- /dev/null +++ b/plugins/page-toc/vendor/composer/autoload_static.php @@ -0,0 +1,53 @@ + + array ( + 'Knp\\Menu\\' => 9, + ), + 'G' => + array ( + 'Grav\\Plugin\\PageToc\\' => 20, + ), + 'C' => + array ( + 'Cocur\\Slugify\\' => 14, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Knp\\Menu\\' => + array ( + 0 => __DIR__ . '/..' . '/knplabs/knp-menu/src/Knp/Menu', + ), + 'Grav\\Plugin\\PageToc\\' => + array ( + 0 => __DIR__ . '/../..' . '/classes', + ), + 'Cocur\\Slugify\\' => + array ( + 0 => __DIR__ . '/..' . '/cocur/slugify/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Grav\\Plugin\\PageTOCPlugin' => __DIR__ . '/../..' . '/page-toc.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit88b09b7fda3e99f2e22346b58205e375::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit88b09b7fda3e99f2e22346b58205e375::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit88b09b7fda3e99f2e22346b58205e375::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/plugins/page-toc/vendor/composer/installed.json b/plugins/page-toc/vendor/composer/installed.json new file mode 100644 index 0000000..ae2b15f --- /dev/null +++ b/plugins/page-toc/vendor/composer/installed.json @@ -0,0 +1,158 @@ +{ + "packages": [ + { + "name": "cocur/slugify", + "version": "v4.0.0", + "version_normalized": "4.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/3f1ffc300f164f23abe8b64ffb3f92d35cec8307", + "reference": "3f1ffc300f164f23abe8b64ffb3f92d35cec8307", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "~5.1", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "phpunit/phpunit": "^5.7.27", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "time": "2019-12-14T13:04:14+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/master" + }, + "install-path": "../cocur/slugify" + }, + { + "name": "knplabs/knp-menu", + "version": "v3.3.0", + "version_normalized": "3.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/KnpMenu.git", + "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/KnpMenu/zipball/8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", + "reference": "8bd3dc2afa22c65617c563c5e25e62d6e23e98c7", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "conflict": { + "twig/twig": "<1.40 || >=2,<2.9" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.3", + "symfony/routing": "^4.4 || ^5.0 || ^6.0", + "twig/twig": "^1.40 || ^2.9 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" + }, + "time": "2021-10-23T15:01:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "Knp\\Menu\\": "src/Knp/Menu" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + } + ], + "description": "An object oriented menu library", + "homepage": "https://knplabs.com", + "keywords": [ + "menu", + "tree" + ], + "support": { + "issues": "https://github.com/KnpLabs/KnpMenu/issues", + "source": "https://github.com/KnpLabs/KnpMenu/tree/v3.3.0" + }, + "install-path": "../knplabs/knp-menu" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/plugins/page-toc/vendor/composer/installed.php b/plugins/page-toc/vendor/composer/installed.php new file mode 100644 index 0000000..b07e9cc --- /dev/null +++ b/plugins/page-toc/vendor/composer/installed.php @@ -0,0 +1,41 @@ + array( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'type' => 'grav-plugin', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => '435d66f673904945450ba0f04add1a4b765abe7b', + 'name' => 'trilbymedia/page-toc', + 'dev' => true, + ), + 'versions' => array( + 'cocur/slugify' => array( + 'pretty_version' => 'v4.0.0', + 'version' => '4.0.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../cocur/slugify', + 'aliases' => array(), + 'reference' => '3f1ffc300f164f23abe8b64ffb3f92d35cec8307', + 'dev_requirement' => false, + ), + 'knplabs/knp-menu' => array( + 'pretty_version' => 'v3.3.0', + 'version' => '3.3.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../knplabs/knp-menu', + 'aliases' => array(), + 'reference' => '8bd3dc2afa22c65617c563c5e25e62d6e23e98c7', + 'dev_requirement' => false, + ), + 'trilbymedia/page-toc' => array( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'type' => 'grav-plugin', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => '435d66f673904945450ba0f04add1a4b765abe7b', + 'dev_requirement' => false, + ), + ), +); diff --git a/plugins/page-toc/vendor/composer/platform_check.php b/plugins/page-toc/vendor/composer/platform_check.php new file mode 100644 index 0000000..0109125 --- /dev/null +++ b/plugins/page-toc/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70306)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.6". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/plugins/page-toc/vendor/composer/tmp-f711f3efca8baf836db7f0f0b18aef94~ b/plugins/page-toc/vendor/composer/tmp-f711f3efca8baf836db7f0f0b18aef94~ new file mode 100644 index 0000000..629caa1 --- /dev/null +++ b/plugins/page-toc/vendor/composer/tmp-f711f3efca8baf836db7f0f0b18aef94~ @@ -0,0 +1 @@ +{"message":"Bad credentials","documentation_url":"https://docs.github.com/rest"} \ No newline at end of file diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/CHANGELOG.md b/plugins/page-toc/vendor/knplabs/knp-menu/CHANGELOG.md new file mode 100644 index 0000000..0166456 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/CHANGELOG.md @@ -0,0 +1,174 @@ +## 3.2 (2021-05-28) + +* Remove Symfony 6 deprecations +* Enforce phpstan rules (max level) + +## 3.1 (2019-12-01) + +* Allowed Symfony 5 components +* Removed support for unsupported Symfony versions (4.0 and 4.1) +* Allowed Twig 3 + +## 3.0 (2019-09-02) + +* Raised PHP requirements +* [BC break] Enforced strong types on all interfaces and classes +* [BC break] Removed deprecated features. Specifically, MenuFactory and MenuItem are not accepting a `null` name anymore + +## 2.4 (2019-07-29) + +* Fixed Twig deprecations +* Switched to namespaced Twig +* Fixed sprintf use + +## 2.3 (2017-11-18) + +* Deprecated the Silex 1 KnpMenuServiceProvider. Use the `knplabs/knp-menu-silex` package instead. +* Fixed RouteVoter to also match on non-string request arguments like integers as long as both string representations are identical. +* Add Symfony 4 support + +## 2.2 (2016-09-22) + +* Added a new function to twig: `knp_menu_get_current_item` + +## 2.1.1 (2016-01-08) + +* Made compatible with Symfony 3 + +## 2.1.0 (2015-09-20) + +* Added a new function to twig: `knp_menu_get_breadcrumbs_array` +* Added a new filter to twig: `knp_menu_as_string` +* Added 2 new tests to twig: `knp_menu_current`, `knp_menu_ancestor` +* Made the templates compatible with Twig 2 +* Add menu and renderer providers supporting any ArrayAccess implementations. The + Pimple-based providers (supporting only Pimple 1) are dperecated in favor of these + new providers. + +## 2.0.1 (2014-08-01) + +* Fixed voter conventions on RouteVoter + +## 2.0.0 (2014-07-18) + +* [BC break] Clean code and removed the BC layer + +## 2.0.0 beta 1 (2014-06-19) + +* [BC break] Added the new `Integration` namespace and removed the `Silex` one. +* Added a new Voter based on regular expression: `Knp\Menu\Matcher\Voter\RegexVoter` + +## 2.0.0 alpha 2 (2014-05-01) + +* [BC break] Changed the TwigRenderer to accept a menu template only as a string +* [BC break] Refactored the way of rendering twig templates. Every template should extends + the `knp_menu.html.twig` template. +* Introduced extension points in the MenuFactory through `Knp\Menu\Factory\ExtensionInterface` +* [BC break compared to 2.0 alpha 1] The inheritance extension points introduced in alpha1 are + deprecated in favor of extensions and will be removed before the stable release. +* `Knp\Menu\Silex\RouterAwareFactory` is deprecated in favor of `Knp\Menu\Silex\RoutingExtension`. +* [BC break] Deprecated the methods `createFromArray` and `createFromNode` in the MenuFactory and + removed them from `Knp\Menu\FactoryInterface`. Use `Knp\Menu\Loader\ArrayLoader` and + `Knp\Menu\Loader\NodeLoader` instead. +* [BC break] Deprecated the methods `moveToPosition`, `moveToFirstPosition`, `moveToLastPosition`, + `moveChildToPosition`, `callRecursively`, `toArray`, `getPathAsString` and `getBreadcrumbsArray` + in the MenuItem and removed them from `Knp\Menu\ItemInterface`. Use `Knp\Menu\Util\MenuManipulator` + instead. +* Made the RouterVoter compatible with SensioFrameworkExtraBundle param converters +* Added the possibility to match routes using a regex on their name in the RouterVoter +* [BC break compared to 2.0 alpha 1] Refactored the RouterVoter to make it more flexible + The way to pass routes in the item extras has changed. + + Before: + + ```php + 'extras' => array( + 'routes' => array('foo', 'bar'), + 'routeParameters' => array('foo' => array('id' => 4)), + ) + ``` + + After: + + ```php + 'extras' => array( + 'routes' => array( + array('route' => 'foo', 'parameters' => array('id' => 4)), + 'bar', + ) + ) + ``` + + The old syntax is kept until the final release, but using it will trigger a E_USER_DEPRECATED error. + +## 2.0.0 alpha 1 (2013-06-23) + +* Added protected methods `buildOptions` and `configureItem` in the MenuFactory as extension point by inheritance +* [BC break] Refactored the way to mark items as current + ``setCurrentUri``, ``getCurrentUri`` and ``getCurrentItem`` have been removed from the ItemInterface. + Determining the current items is now delegated to a matcher, and the default implementation + uses voters to apply the matching. Getting the current items can be done thanks to the CurrentItemFilterIterator. +* [BC break] The signature of the CurrentItemFilterIterator constructor changed to accept the item matcher +* [BC break] Changed the format of the breadcrumb array + Instead of storing the elements with the label as key and the uri as value + the array now stores an array of array elements with 3 keys: `label`, `uri` and `item`. + +## 1.1.2 (2012-06-10) + +* Updated the Silex service provider for the change in the interface + +## 1.1.1 (2012-05-17) + +* Added the children attributes and the extras in the array export + +## 1.1.0 (2012-05-17) + +* Marked `Knp\Menu\ItemInterface::getCurrentItem` as deprecated +* Added a recursive filter iterator keeping only displayed items +* Added a filter iterator keeping only current items +* Added a recursive iterator for the item +* Fixed building an array of breadcrumbs when a label has only digits +* Added a way to mark a label as safe +* Refactored the ListRenderer to be consistent with the TwigRenderer and provide the same extension points +* Added a way to attach extra data to an item +* Removed unnecessary optimization in the TwigRenderer +* Added some whitespace control in the Twig template to ensure an empty rendering is really empty +* [BC break] Use the childrenAttributes for the root instead of the attributes +* Made the default options configurable for the TwigRenderer +* Added the support for menu registered as factory in PimpleProvider +* Added a way to use the options in `knp_menu_get()` in Twig templates +* Added an array of options for the MenuProviderInterface +* Added a template to render an ordered list +* Refactored the template a bit to make it easier to use an ordered list +* Allow omitting the name of the child in `fromArray` (the key is used instead) + +## 1.0.0 (2011-12-03) + +* Add composer.json file +* Added more flexible list element blocks +* Add support for attributes on the children collection. +* Added a default renderer +* Added a ChainProvider for the menus. +* Added the Silex extension +* Added a RouterAwareFactory +* Added an helper to be able to reuse the logic more easily for other templating engines +* Added a way to retrieve an item using a path in a menu tree +* Changed the toArray method to use a depth instead of simply using a boolean flag +* Refactored the export to array and the creation from an array +* Added better support for encoding problems when escaping a string in the ListRenderer +* Added a Twig renderer +* Added missing escaping in the ListRenderer +* Renamed some methods in the ItemInterface +* Removed the configuration of the current item as link from the item +* Refactored the ListRenderer to use options +* Changed the interface of callRecursively +* Refactored the NodeInterface to be consistent +* Moved the creation of the item to the factory +* Added a Twig extension to render the menu easily +* Changed the menu provider interface with a pimple-based implementation +* Added a renderer provider to get a renderer by name and a Pimple-based implementation +* Removed the renderer from the menu +* Removed the num in the item by refactoring isLast and isFirst +* Changed the RendererInterface to accept an array of options to be more flexible +* Added an ItemInterface +* Initial import of KnpMenuBundle decoupled classes with a new namespace diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/LICENSE b/plugins/page-toc/vendor/knplabs/knp-menu/LICENSE new file mode 100644 index 0000000..0cc2c38 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-present KnpLabs - https://knplabs.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND 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/page-toc/vendor/knplabs/knp-menu/composer.json b/plugins/page-toc/vendor/knplabs/knp-menu/composer.json new file mode 100644 index 0000000..b50ad8b --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/composer.json @@ -0,0 +1,52 @@ +{ + "name": "knplabs/knp-menu", + "type": "library", + "description": "An object oriented menu library", + "keywords": ["menu", "tree"], + "homepage": "https://knplabs.com", + "license": "MIT", + "authors": [ + { + "name": "KnpLabs", + "homepage": "https://knplabs.com" + }, + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "The Community", + "homepage": "https://github.com/KnpLabs/KnpMenu/contributors" + } + ], + "require": { + "php": "^7.3 || ^8.0" + }, + "conflict": { + "twig/twig": "<1.40 || >=2,<2.9" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "psr/container": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.3", + "symfony/routing": "^4.4 || ^5.0 || ^6.0", + "twig/twig": "^1.40 || ^2.9 || ^3.0" + }, + "suggest": { + "twig/twig": "for the TwigRenderer and the integration with your templates" + }, + "autoload": { + "psr-4": { "Knp\\Menu\\": "src/Knp/Menu" } + }, + "autoload-dev": { + "psr-4": { + "Knp\\Menu\\Tests\\": "tests/Knp/Menu/Tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/CoreExtension.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/CoreExtension.php new file mode 100644 index 0000000..8cf1735 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/CoreExtension.php @@ -0,0 +1,62 @@ + null, + 'label' => null, + 'attributes' => [], + 'linkAttributes' => [], + 'childrenAttributes' => [], + 'labelAttributes' => [], + 'extras' => [], + 'current' => null, + 'display' => true, + 'displayChildren' => true, + ], + $options + ); + } + + public function buildItem(ItemInterface $item, array $options): void + { + $item + ->setUri($options['uri']) + ->setLabel($options['label']) + ->setAttributes($options['attributes']) + ->setLinkAttributes($options['linkAttributes']) + ->setChildrenAttributes($options['childrenAttributes']) + ->setLabelAttributes($options['labelAttributes']) + ->setCurrent($options['current']) + ->setDisplay($options['display']) + ->setDisplayChildren($options['displayChildren']) + ; + + $this->buildExtras($item, $options); + } + + /** + * Configures the newly created item's extras + * Extras are processed one by one in order not to reset values set by other extensions + * + * @param array> $options + */ + private function buildExtras(ItemInterface $item, array $options): void + { + if (!empty($options['extras'])) { + foreach ($options['extras'] as $key => $value) { + $item->setExtra($key, $value); + } + } + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/ExtensionInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/ExtensionInterface.php new file mode 100644 index 0000000..5b764c2 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Factory/ExtensionInterface.php @@ -0,0 +1,24 @@ + $options The options processed by the previous extensions + * + * @return array + */ + public function buildOptions(array $options): array; + + /** + * Configures the item with the passed options + * + * @param array $options + */ + public function buildItem(ItemInterface $item, array $options): void; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/FactoryInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/FactoryInterface.php new file mode 100644 index 0000000..c4a292b --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/FactoryInterface.php @@ -0,0 +1,16 @@ + $options + */ + public function createItem(string $name, array $options = []): ItemInterface; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Integration/Symfony/RoutingExtension.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Integration/Symfony/RoutingExtension.php new file mode 100644 index 0000000..7f7902f --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Integration/Symfony/RoutingExtension.php @@ -0,0 +1,44 @@ +generator = $generator; + } + + public function buildOptions(array $options = []): array + { + if (!empty($options['route'])) { + $params = $options['routeParameters'] ?? []; + $absolute = (isset($options['routeAbsolute']) && $options['routeAbsolute']) ? UrlGeneratorInterface::ABSOLUTE_URL : UrlGeneratorInterface::ABSOLUTE_PATH; + $options['uri'] = $this->generator->generate($options['route'], $params, $absolute); + + // adding the item route to the extras under the 'routes' key (for the Silex RouteVoter) + $options['extras']['routes'][] = [ + 'route' => $options['route'], + 'parameters' => $params, + ]; + } + + return $options; + } + + public function buildItem(ItemInterface $item, array $options): void + { + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/ItemInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/ItemInterface.php new file mode 100644 index 0000000..a73d6e2 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/ItemInterface.php @@ -0,0 +1,333 @@ + tag and is what you should interact with + * most of the time by default. + * Originally taken from ioMenuPlugin (http://github.com/weaverryan/ioMenuPlugin) + * + * @extends \ArrayAccess + * @extends \IteratorAggregate + */ +interface ItemInterface extends \ArrayAccess, \Countable, \IteratorAggregate +{ + public function setFactory(FactoryInterface $factory): self; + + public function getName(): string; + + /** + * Renames the item. + * + * This method must also update the key in the parent. + * + * Provides a fluent interface + * + * @throws \InvalidArgumentException if the name is already used by a sibling + */ + public function setName(string $name): self; + + /** + * Get the uri for a menu item + */ + public function getUri(): ?string; + + /** + * Set the uri for a menu item + * + * Provides a fluent interface + * + * @param string|null $uri The uri to set on this menu item + */ + public function setUri(?string $uri): self; + + /** + * Returns the label that will be used to render this menu item + * + * Defaults to the name of no label was specified + */ + public function getLabel(): string; + + /** + * Provides a fluent interface + * + * @param string|null $label The text to use when rendering this menu item + */ + public function setLabel(?string $label): self; + + /** + * @return array + */ + public function getAttributes(): array; + + /** + * @param array $attributes + */ + public function setAttributes(array $attributes): self; + + /** + * @param string $name The name of the attribute to return + * @param string|bool|null $default The value to return if the attribute doesn't exist + * + * @return string|bool|null + */ + public function getAttribute(string $name, $default = null); + + /** + * @param string|bool|null $value + */ + public function setAttribute(string $name, $value): self; + + /** + * @return array + */ + public function getLinkAttributes(): array; + + /** + * @param array $linkAttributes + */ + public function setLinkAttributes(array $linkAttributes): self; + + /** + * @param string $name The name of the attribute to return + * @param string|bool|null $default The value to return if the attribute doesn't exist + * + * @return string|bool|null + */ + public function getLinkAttribute(string $name, $default = null); + + /** + * @param string|bool|null $value + */ + public function setLinkAttribute(string $name, $value): self; + + /** + * @return array + */ + public function getChildrenAttributes(): array; + + /** + * @param array $childrenAttributes + */ + public function setChildrenAttributes(array $childrenAttributes): self; + + /** + * @param string $name The name of the attribute to return + * @param string|bool|null $default The value to return if the attribute doesn't exist + * + * @return string|bool|null + */ + public function getChildrenAttribute(string $name, $default = null); + + /** + * @param string|bool|null $value + */ + public function setChildrenAttribute(string $name, $value): self; + + /** + * @return array + */ + public function getLabelAttributes(): array; + + /** + * @param array $labelAttributes + */ + public function setLabelAttributes(array $labelAttributes): self; + + /** + * @param string $name The name of the attribute to return + * @param string|bool|null $default The value to return if the attribute doesn't exist + * + * @return string|bool|null + */ + public function getLabelAttribute(string $name, $default = null); + + /** + * @param string|bool|null $value + */ + public function setLabelAttribute(string $name, $value): self; + + /** + * @return array + */ + public function getExtras(): array; + + /** + * @param array $extras + */ + public function setExtras(array $extras): self; + + /** + * @param string $name The name of the extra to return + * @param mixed $default The value to return if the extra doesn't exist + * + * @return mixed + */ + public function getExtra(string $name, $default = null); + + /** + * @param mixed $value + */ + public function setExtra(string $name, $value): self; + + public function getDisplayChildren(): bool; + + /** + * Set whether or not this menu item should show its children + * + * Provides a fluent interface + */ + public function setDisplayChildren(bool $bool): self; + + /** + * Whether or not to display this menu item + */ + public function isDisplayed(): bool; + + /** + * Set whether or not this menu should be displayed + * + * Provides a fluent interface + */ + public function setDisplay(bool $bool): self; + + /** + * Add a child menu item to this menu + * + * Returns the child item + * + * @param ItemInterface|string $child An ItemInterface instance or the name of a new item to create + * @param array $options If creating a new item, the options passed to the factory for the item + * + * @throws \InvalidArgumentException if the item is already in a tree + */ + public function addChild($child, array $options = []): self; + + /** + * Returns the child menu identified by the given name + * + * @param string $name Then name of the child menu to return + */ + public function getChild(string $name): ?self; + + /** + * Reorder children. + * + * Provides a fluent interface + * + * @param array $order new order of children + */ + public function reorderChildren(array $order): self; + + /** + * Makes a deep copy of menu tree. Every item is copied as another object. + */ + public function copy(): self; + + /** + * Returns the level of this menu item + * + * The root menu item is 0, followed by 1, 2, etc + */ + public function getLevel(): int; + + /** + * Returns the root ItemInterface of this menu tree + */ + public function getRoot(): self; + + /** + * Returns whether or not this menu item is the root menu item + */ + public function isRoot(): bool; + + public function getParent(): ?self; + + /** + * Used internally when adding and removing children + * + * Provides a fluent interface + */ + public function setParent(?self $parent = null): self; + + /** + * Return the children as an array of ItemInterface objects + * + * @return array + */ + public function getChildren(): array; + + /** + * Provides a fluent interface + * + * @param array $children An array of ItemInterface objects + */ + public function setChildren(array $children): self; + + /** + * Removes a child from this menu item + * + * Provides a fluent interface + * + * @param ItemInterface|string $name The name of ItemInterface instance or the ItemInterface to remove + */ + public function removeChild($name): self; + + public function getFirstChild(): self; + + public function getLastChild(): self; + + /** + * Returns whether or not this menu items has viewable children + * + * This menu MAY have children, but this will return false if the current + * user does not have access to view any of those items + */ + public function hasChildren(): bool; + + /** + * Sets whether or not this menu item is "current". + * + * If the state is unknown, use null. + * + * Provides a fluent interface + * + * @param bool|null $bool Specify that this menu item is current + */ + public function setCurrent(?bool $bool): self; + + /** + * Gets whether or not this menu item is "current". + */ + public function isCurrent(): ?bool; + + /** + * Whether this menu item is last in its parent + */ + public function isLast(): bool; + + /** + * Whether this menu item is first in its parent + */ + public function isFirst(): bool; + + /** + * Whereas isFirst() returns if this is the first child of the parent + * menu item, this function takes into consideration whether children are rendered or not. + * + * This returns true if this is the first child that would be rendered + * for the current user + */ + public function actsLikeFirst(): bool; + + /** + * Whereas isLast() returns if this is the last child of the parent + * menu item, this function takes into consideration whether children are rendered or not. + * + * This returns true if this is the last child that would be rendered + * for the current user + */ + public function actsLikeLast(): bool; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/CurrentItemFilterIterator.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/CurrentItemFilterIterator.php new file mode 100644 index 0000000..9da8427 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/CurrentItemFilterIterator.php @@ -0,0 +1,35 @@ + $iterator + */ + public function __construct(\Iterator $iterator, MatcherInterface $matcher) + { + $this->matcher = $matcher; + + parent::__construct($iterator); + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function accept() + { + return $this->matcher->isCurrent($this->current()); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/DisplayedItemFilterIterator.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/DisplayedItemFilterIterator.php new file mode 100644 index 0000000..1b8a0f9 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/DisplayedItemFilterIterator.php @@ -0,0 +1,27 @@ +current()->isDisplayed(); + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function hasChildren() + { + return $this->current()->getDisplayChildren() && parent::hasChildren(); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/RecursiveItemIterator.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/RecursiveItemIterator.php new file mode 100644 index 0000000..6969af8 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Iterator/RecursiveItemIterator.php @@ -0,0 +1,33 @@ +> + */ +class RecursiveItemIterator extends \IteratorIterator implements \RecursiveIterator +{ + /** + * @param \Traversable $iterator + */ + final public function __construct(\Traversable $iterator) + { + parent::__construct($iterator); + } + + public function hasChildren(): bool + { + return 0 < \count($this->current()); + } + + /** + * @return \RecursiveIterator + */ + #[\ReturnTypeWillChange] + public function getChildren() + { + return new static($this->current()); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/ArrayLoader.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/ArrayLoader.php new file mode 100644 index 0000000..e1e2109 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/ArrayLoader.php @@ -0,0 +1,62 @@ +factory = $factory; + } + + public function load($data): ItemInterface + { + if (!$this->supports($data)) { + throw new \InvalidArgumentException(\sprintf('Unsupported data. Expected an array but got %s', \is_object($data) ? \get_class($data) : \gettype($data))); + } + + return $this->fromArray($data); + } + + public function supports($data): bool + { + return \is_array($data); + } + + /** + * @param array $data + * @param string|null $name (the name of the item, used only if there is no name in the data themselves) + */ + private function fromArray(array $data, ?string $name = null): ItemInterface + { + $name = $data['name'] ?? $name; + + if (isset($data['children'])) { + $children = $data['children']; + unset($data['children']); + } else { + $children = []; + } + + $item = $this->factory->createItem($name, $data); + + foreach ($children as $childName => $child) { + $item->addChild($this->fromArray($child, $childName)); + } + + return $item; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/LoaderInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/LoaderInterface.php new file mode 100644 index 0000000..a2d9eec --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Loader/LoaderInterface.php @@ -0,0 +1,22 @@ +factory = $factory; + } + + public function load($data): ItemInterface + { + if (!$data instanceof NodeInterface) { + throw new \InvalidArgumentException(\sprintf('Unsupported data. Expected Knp\Menu\NodeInterface but got %s', \is_object($data) ? \get_class($data) : \gettype($data))); + } + + $item = $this->factory->createItem($data->getName(), $data->getOptions()); + + foreach ($data->getChildren() as $childNode) { + $item->addChild($this->load($childNode)); + } + + return $item; + } + + public function supports($data): bool + { + return $data instanceof NodeInterface; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Matcher.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Matcher.php new file mode 100644 index 0000000..6835afa --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Matcher.php @@ -0,0 +1,76 @@ + + */ + private $cache; + + /** + * @var iterable|VoterInterface[] + */ + private $voters; + + /** + * @param VoterInterface[]|iterable $voters + */ + public function __construct($voters = []) + { + $this->voters = $voters; + $this->cache = new \SplObjectStorage(); + } + + public function isCurrent(ItemInterface $item): bool + { + $current = $item->isCurrent(); + if (null !== $current) { + return $current; + } + + if ($this->cache->contains($item)) { + return $this->cache[$item]; + } + + foreach ($this->voters as $voter) { + $current = $voter->matchItem($item); + if (null !== $current) { + break; + } + } + + $current = (bool) $current; + $this->cache[$item] = $current; + + return $current; + } + + public function isAncestor(ItemInterface $item, ?int $depth = null): bool + { + if (0 === $depth) { + return false; + } + + $childDepth = null === $depth ? null : $depth - 1; + foreach ($item->getChildren() as $child) { + if ($this->isCurrent($child) || $this->isAncestor($child, $childDepth)) { + return true; + } + } + + return false; + } + + public function clear(): void + { + $this->cache = new \SplObjectStorage(); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/MatcherInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/MatcherInterface.php new file mode 100644 index 0000000..31e53ec --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/MatcherInterface.php @@ -0,0 +1,28 @@ +regexp = $regexp; + } + + public function matchItem(ItemInterface $item): ?bool + { + if (null === $this->regexp || null === $item->getUri()) { + return null; + } + + if (\preg_match($this->regexp, $item->getUri())) { + return true; + } + + return null; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php new file mode 100644 index 0000000..1026581 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php @@ -0,0 +1,94 @@ +requestStack = $requestStack; + } + + public function matchItem(ItemInterface $item): ?bool + { + if (\is_callable([$this->requestStack, 'getMainRequest'])) { + $request = $this->requestStack->getMainRequest(); // symfony 5.3+ + } else { + $request = $this->requestStack->getMasterRequest(); + } + + if (null === $request) { + return null; + } + + $route = $request->attributes->get('_route'); + if (null === $route) { + return null; + } + + $routes = (array) $item->getExtra('routes', []); + + foreach ($routes as $testedRoute) { + if (\is_string($testedRoute)) { + $testedRoute = ['route' => $testedRoute]; + } + + if (!\is_array($testedRoute)) { + throw new \InvalidArgumentException('Routes extra items must be strings or arrays.'); + } + + if ($this->isMatchingRoute($request, $testedRoute)) { + return true; + } + } + + return null; + } + + /** + * @phpstan-param array{route?: string|null, pattern?: string|null, parameters?: array} $testedRoute + */ + private function isMatchingRoute(Request $request, array $testedRoute): bool + { + $route = $request->attributes->get('_route'); + + if (isset($testedRoute['route'])) { + if ($route !== $testedRoute['route']) { + return false; + } + } elseif (!empty($testedRoute['pattern'])) { + if (!\preg_match($testedRoute['pattern'], $route)) { + return false; + } + } else { + throw new \InvalidArgumentException('Routes extra items must have a "route" or "pattern" key.'); + } + + if (!isset($testedRoute['parameters'])) { + return true; + } + + $routeParameters = $request->attributes->get('_route_params', []); + + foreach ($testedRoute['parameters'] as $name => $value) { + // cast both to string so that we handle integer and other non-string parameters, but don't stumble on 0 == 'abc'. + if (!isset($routeParameters[$name]) || (string) $routeParameters[$name] !== (string) $value) { + return false; + } + } + + return true; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/UriVoter.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/UriVoter.php new file mode 100644 index 0000000..2358425 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/UriVoter.php @@ -0,0 +1,34 @@ +uri = $uri; + } + + public function matchItem(ItemInterface $item): ?bool + { + if (null === $this->uri || null === $item->getUri()) { + return null; + } + + if ($item->getUri() === $this->uri) { + return true; + } + + return null; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/VoterInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/VoterInterface.php new file mode 100644 index 0000000..5e319c1 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/VoterInterface.php @@ -0,0 +1,19 @@ +addExtension(new CoreExtension(), -10); + } + + public function createItem(string $name, array $options = []): ItemInterface + { + foreach ($this->getExtensions() as $extension) { + $options = $extension->buildOptions($options); + } + + $item = new MenuItem($name, $this); + + foreach ($this->getExtensions() as $extension) { + $extension->buildItem($item, $options); + } + + return $item; + } + + /** + * Adds a factory extension + */ + public function addExtension(ExtensionInterface $extension, int $priority = 0): void + { + $this->extensions[$priority][] = $extension; + $this->sorted = null; + } + + /** + * Sorts the internal list of extensions by priority. + * + * @return ExtensionInterface[] + */ + private function getExtensions(): array + { + if (null === $this->sorted) { + \krsort($this->extensions); + $this->sorted = !empty($this->extensions) ? \array_merge(...$this->extensions) : []; + } + + return $this->sorted; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/MenuItem.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/MenuItem.php new file mode 100644 index 0000000..bbd8908 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/MenuItem.php @@ -0,0 +1,620 @@ + + */ + protected $linkAttributes = []; + + /** + * Attributes for the children list + * + * @var array + */ + protected $childrenAttributes = []; + + /** + * Attributes for the item text + * + * @var array + */ + protected $labelAttributes = []; + + /** + * Uri to use in the anchor tag + * + * @var string|null + */ + protected $uri; + + /** + * Attributes for the item + * + * @var array + */ + protected $attributes = []; + + /** + * Extra stuff associated to the item + * + * @var array + */ + protected $extras = []; + + /** + * Whether the item is displayed + * + * @var bool + */ + protected $display = true; + + /** + * Whether the children of the item are displayed + * + * @var bool + */ + protected $displayChildren = true; + + /** + * Child items + * + * @var array + */ + protected $children = []; + + /** + * Parent item + * + * @var ItemInterface|null + */ + protected $parent; + + /** + * whether the item is current. null means unknown + * + * @var bool|null + */ + protected $isCurrent; + + /** + * @var FactoryInterface + */ + protected $factory; + + /** + * Class constructor + * + * @param string $name The name of this menu, which is how its parent will + * reference it. Also used as label if label not specified + */ + public function __construct(string $name, FactoryInterface $factory) + { + $this->name = $name; + $this->factory = $factory; + } + + public function setFactory(FactoryInterface $factory): ItemInterface + { + $this->factory = $factory; + + return $this; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): ItemInterface + { + if ($this->name === $name) { + return $this; + } + + $parent = $this->getParent(); + if (null !== $parent && isset($parent[$name])) { + throw new \InvalidArgumentException('Cannot rename item, name is already used by sibling.'); + } + + $oldName = $this->name; + $this->name = $name; + + if (null !== $parent) { + $names = \array_keys($parent->getChildren()); + $items = \array_values($parent->getChildren()); + + $offset = \array_search($oldName, $names); + $names[$offset] = $name; + + if (false === $children = \array_combine($names, $items)) { + throw new \InvalidArgumentException('Number of elements is not matching.'); + } + + $parent->setChildren($children); + } + + return $this; + } + + public function getUri(): ?string + { + return $this->uri; + } + + public function setUri(?string $uri): ItemInterface + { + $this->uri = $uri; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? $this->name; + } + + public function setLabel(?string $label): ItemInterface + { + $this->label = $label; + + return $this; + } + + public function getAttributes(): array + { + return $this->attributes; + } + + public function setAttributes(array $attributes): ItemInterface + { + $this->attributes = $attributes; + + return $this; + } + + public function getAttribute(string $name, $default = null) + { + return $this->attributes[$name] ?? $default; + } + + public function setAttribute(string $name, $value): ItemInterface + { + $this->attributes[$name] = $value; + + return $this; + } + + public function getLinkAttributes(): array + { + return $this->linkAttributes; + } + + public function setLinkAttributes(array $linkAttributes): ItemInterface + { + $this->linkAttributes = $linkAttributes; + + return $this; + } + + public function getLinkAttribute(string $name, $default = null) + { + return $this->linkAttributes[$name] ?? $default; + } + + public function setLinkAttribute(string $name, $value): ItemInterface + { + $this->linkAttributes[$name] = $value; + + return $this; + } + + public function getChildrenAttributes(): array + { + return $this->childrenAttributes; + } + + public function setChildrenAttributes(array $childrenAttributes): ItemInterface + { + $this->childrenAttributes = $childrenAttributes; + + return $this; + } + + public function getChildrenAttribute(string $name, $default = null) + { + return $this->childrenAttributes[$name] ?? $default; + } + + public function setChildrenAttribute(string $name, $value): ItemInterface + { + $this->childrenAttributes[$name] = $value; + + return $this; + } + + public function getLabelAttributes(): array + { + return $this->labelAttributes; + } + + public function setLabelAttributes(array $labelAttributes): ItemInterface + { + $this->labelAttributes = $labelAttributes; + + return $this; + } + + public function getLabelAttribute(string $name, $default = null) + { + return $this->labelAttributes[$name] ?? $default; + } + + public function setLabelAttribute(string $name, $value): ItemInterface + { + $this->labelAttributes[$name] = $value; + + return $this; + } + + public function getExtras(): array + { + return $this->extras; + } + + public function setExtras(array $extras): ItemInterface + { + $this->extras = $extras; + + return $this; + } + + public function getExtra(string $name, $default = null) + { + return $this->extras[$name] ?? $default; + } + + public function setExtra(string $name, $value): ItemInterface + { + $this->extras[$name] = $value; + + return $this; + } + + public function getDisplayChildren(): bool + { + return $this->displayChildren; + } + + public function setDisplayChildren(bool $bool): ItemInterface + { + $this->displayChildren = $bool; + + return $this; + } + + public function isDisplayed(): bool + { + return $this->display; + } + + public function setDisplay(bool $bool): ItemInterface + { + $this->display = $bool; + + return $this; + } + + public function addChild($child, array $options = []): ItemInterface + { + if (!$child instanceof ItemInterface) { + $child = $this->factory->createItem($child, $options); + } elseif (null !== $child->getParent()) { + throw new \InvalidArgumentException('Cannot add menu item as child, it already belongs to another menu (e.g. has a parent).'); + } + + $child->setParent($this); + + $this->children[$child->getName()] = $child; + + return $child; + } + + public function getChild(string $name): ?ItemInterface + { + return $this->children[$name] ?? null; + } + + public function reorderChildren(array $order): ItemInterface + { + if (\count($order) !== $this->count()) { + throw new \InvalidArgumentException('Cannot reorder children, order does not contain all children.'); + } + + $newChildren = []; + + foreach ($order as $name) { + if (!isset($this->children[$name])) { + throw new \InvalidArgumentException('Cannot find children named '.$name); + } + + $child = $this->children[$name]; + $newChildren[$name] = $child; + } + + $this->setChildren($newChildren); + + return $this; + } + + public function copy(): ItemInterface + { + $newMenu = clone $this; + $newMenu->setChildren([]); + $newMenu->setParent(); + foreach ($this->getChildren() as $child) { + $newMenu->addChild($child->copy()); + } + + return $newMenu; + } + + public function getLevel(): int + { + return $this->parent ? $this->parent->getLevel() + 1 : 0; + } + + public function getRoot(): ItemInterface + { + $obj = $this; + do { + $found = $obj; + } while ($obj = $obj->getParent()); + + return $found; + } + + public function isRoot(): bool + { + return null === $this->parent; + } + + public function getParent(): ?ItemInterface + { + return $this->parent; + } + + public function setParent(?ItemInterface $parent = null): ItemInterface + { + if ($parent === $this) { + throw new \InvalidArgumentException('Item cannot be a child of itself'); + } + + $this->parent = $parent; + + return $this; + } + + public function getChildren(): array + { + return $this->children; + } + + public function setChildren(array $children): ItemInterface + { + $this->children = $children; + + return $this; + } + + public function removeChild($name): ItemInterface + { + $name = $name instanceof ItemInterface ? $name->getName() : $name; + + if (isset($this->children[$name])) { + // unset the child and reset it so it looks independent + $this->children[$name]->setParent(null); + unset($this->children[$name]); + } + + return $this; + } + + public function getFirstChild(): ItemInterface + { + if (empty($this->children)) { + throw new \LogicException('Cannot get first child: there are no children.'); + } + + return \reset($this->children); + } + + public function getLastChild(): ItemInterface + { + if (empty($this->children)) { + throw new \LogicException('Cannot get last child: there are no children.'); + } + + return \end($this->children); + } + + public function hasChildren(): bool + { + foreach ($this->children as $child) { + if ($child->isDisplayed()) { + return true; + } + } + + return false; + } + + public function setCurrent(?bool $bool): ItemInterface + { + $this->isCurrent = $bool; + + return $this; + } + + public function isCurrent(): ?bool + { + return $this->isCurrent; + } + + public function isLast(): bool + { + // if this is root, then return false + if (null === $this->parent) { + return false; + } + + return $this->parent->getLastChild() === $this; + } + + public function isFirst(): bool + { + // if this is root, then return false + if (null === $this->parent) { + return false; + } + + return $this->parent->getFirstChild() === $this; + } + + public function actsLikeFirst(): bool + { + // root items are never "marked" as first + if (null === $this->parent) { + return false; + } + + // A menu acts like first only if it is displayed + if (!$this->isDisplayed()) { + return false; + } + + // if we're first and visible, we're first, period. + if ($this->isFirst()) { + return true; + } + + $children = $this->parent->getChildren(); + foreach ($children as $child) { + // loop until we find a visible menu. If its this menu, we're first + if ($child->isDisplayed()) { + return $child->getName() === $this->getName(); + } + } + + return false; + } + + public function actsLikeLast(): bool + { + // root items are never "marked" as last + if (null === $this->parent) { + return false; + } + + // A menu acts like last only if it is displayed + if (!$this->isDisplayed()) { + return false; + } + + // if we're last and visible, we're last, period. + if ($this->isLast()) { + return true; + } + + $children = \array_reverse($this->parent->getChildren()); + foreach ($children as $child) { + // loop until we find a visible menu. If its this menu, we're first + if ($child->isDisplayed()) { + return $child->getName() === $this->getName(); + } + } + + return false; + } + + /** + * Implements Countable + */ + public function count(): int + { + return \count($this->children); + } + + /** + * Implements IteratorAggregate + */ + public function getIterator(): \Traversable + { + return new \ArrayIterator($this->children); + } + + /** + * Implements ArrayAccess + * + * @param string $offset + */ + public function offsetExists($offset): bool + { + return isset($this->children[$offset]); + } + + /** + * Implements ArrayAccess + * + * @param string $offset + * + * @return ItemInterface|null + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return $this->getChild($offset); + } + + /** + * Implements ArrayAccess + * + * @param string $offset + * @param string|null $value + */ + public function offsetSet($offset, $value): void + { + $this->addChild($offset)->setLabel($value); + } + + /** + * Implements ArrayAccess + * + * @param string $offset + */ + public function offsetUnset($offset): void + { + $this->removeChild($offset); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/NodeInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/NodeInterface.php new file mode 100644 index 0000000..59a9e63 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/NodeInterface.php @@ -0,0 +1,30 @@ + + */ + public function getOptions(): array; + + /** + * Get the child nodes implementing NodeInterface + * + * @return \Traversable + */ + public function getChildren(): \Traversable; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ArrayAccessProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ArrayAccessProvider.php new file mode 100644 index 0000000..a25a855 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ArrayAccessProvider.php @@ -0,0 +1,55 @@ + + */ + private $registry; + + /** + * @var array + */ + private $menuIds; + + /** + * @param \ArrayAccess $registry + * @param array $menuIds The map between menu identifiers and registry keys + */ + public function __construct(\ArrayAccess $registry, array $menuIds = []) + { + $this->registry = $registry; + $this->menuIds = $menuIds; + } + + public function get(string $name, array $options = []): ItemInterface + { + if (!isset($this->menuIds[$name])) { + throw new \InvalidArgumentException(\sprintf('The menu "%s" is not defined.', $name)); + } + + $menu = $this->registry[$this->menuIds[$name]]; + + if (\is_callable($menu)) { + $menu = $menu($options, $this->registry); + } + + return $menu; + } + + public function has(string $name, array $options = []): bool + { + return isset($this->menuIds[$name]); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ChainProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ChainProvider.php new file mode 100644 index 0000000..2caa253 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/ChainProvider.php @@ -0,0 +1,43 @@ +providers = $providers; + } + + public function get(string $name, array $options = []): ItemInterface + { + foreach ($this->providers as $provider) { + if ($provider->has($name, $options)) { + return $provider->get($name, $options); + } + } + + throw new \InvalidArgumentException(\sprintf('The menu "%s" is not defined.', $name)); + } + + public function has(string $name, array $options = []): bool + { + foreach ($this->providers as $provider) { + if ($provider->has($name, $options)) { + return true; + } + } + + return false; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/LazyProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/LazyProvider.php new file mode 100644 index 0000000..3865555 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/LazyProvider.php @@ -0,0 +1,52 @@ + + */ + private $builders; + + /** + * @phpstan-param array $builders + */ + public function __construct(array $builders) + { + $this->builders = $builders; + } + + public function get(string $name, array $options = []): ItemInterface + { + if (!isset($this->builders[$name])) { + throw new \InvalidArgumentException(\sprintf('The menu "%s" is not defined.', $name)); + } + + $builder = $this->builders[$name]; + + if (\is_array($builder) && isset($builder[0]) && $builder[0] instanceof \Closure) { + $builder[0] = $builder[0](); + } + + if (!\is_callable($builder)) { + throw new \LogicException(\sprintf('Invalid menu builder for "%s". A callable or a factory for an object callable are expected.', $name)); + } + + return $builder($options); + } + + public function has(string $name, array $options = []): bool + { + return isset($this->builders[$name]); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/MenuProviderInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/MenuProviderInterface.php new file mode 100644 index 0000000..f6ceb21 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/MenuProviderInterface.php @@ -0,0 +1,24 @@ + $options + * + * @throws \InvalidArgumentException if the menu does not exists + */ + public function get(string $name, array $options = []): ItemInterface; + + /** + * Checks whether a menu exists in this provider + * + * @param array $options + */ + public function has(string $name, array $options = []): bool; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/PsrProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/PsrProvider.php new file mode 100644 index 0000000..dd3761f --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Provider/PsrProvider.php @@ -0,0 +1,39 @@ +container = $container; + } + + public function get(string $name, array $options = []): ItemInterface + { + if (!$this->container->has($name)) { + throw new \InvalidArgumentException(\sprintf('The menu "%s" is not defined.', $name)); + } + + return $this->container->get($name); + } + + public function has(string $name, array $options = []): bool + { + return $this->container->has($name); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ArrayAccessProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ArrayAccessProvider.php new file mode 100644 index 0000000..e460e59 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ArrayAccessProvider.php @@ -0,0 +1,54 @@ + + */ + private $registry; + + /** + * @var array + */ + private $rendererIds; + + /** + * @var string + */ + private $defaultRenderer; + + /** + * @param \ArrayAccess $registry + * @param string $defaultRenderer The name of the renderer used by default + * @param array $rendererIds The map between renderer names and registry keys + */ + public function __construct(\ArrayAccess $registry, string $defaultRenderer, array $rendererIds) + { + $this->registry = $registry; + $this->rendererIds = $rendererIds; + $this->defaultRenderer = $defaultRenderer; + } + + public function get(?string $name = null): RendererInterface + { + if (null === $name) { + $name = $this->defaultRenderer; + } + + if (!isset($this->rendererIds[$name]) || null === $this->registry[$this->rendererIds[$name]]) { + throw new \InvalidArgumentException(\sprintf('The renderer "%s" is not defined.', $name)); + } + + return $this->registry[$this->rendererIds[$name]]; + } + + public function has(string $name): bool + { + return isset($this->rendererIds[$name]); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php new file mode 100644 index 0000000..36068f8 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/ListRenderer.php @@ -0,0 +1,260 @@ + + */ + protected $defaultOptions; + + /** + * @param array $defaultOptions + */ + public function __construct(MatcherInterface $matcher, array $defaultOptions = [], ?string $charset = null) + { + $this->matcher = $matcher; + $this->defaultOptions = \array_merge([ + 'depth' => null, + 'matchingDepth' => null, + 'currentAsLink' => true, + 'currentClass' => 'current', + 'ancestorClass' => 'current_ancestor', + 'firstClass' => 'first', + 'lastClass' => 'last', + 'compressed' => false, + 'allow_safe_labels' => false, + 'clear_matcher' => true, + 'leaf_class' => null, + 'branch_class' => null, + ], $defaultOptions); + + parent::__construct($charset); + } + + public function render(ItemInterface $item, array $options = []): string + { + $options = \array_merge($this->defaultOptions, $options); + + $html = $this->renderList($item, $item->getChildrenAttributes(), $options); + + if ($options['clear_matcher']) { + $this->matcher->clear(); + } + + return $html; + } + + /** + * @param array $attributes + * @param array $options + */ + protected function renderList(ItemInterface $item, array $attributes, array $options): string + { + /* + * Return an empty string if any of the following are true: + * a) The menu has no children eligible to be displayed + * b) The depth is 0 + * c) This menu item has been explicitly set to hide its children + */ + if (0 === $options['depth'] || !$item->hasChildren() || !$item->getDisplayChildren()) { + return ''; + } + + $html = $this->format('renderHtmlAttributes($attributes).'>', 'ul', $item->getLevel(), $options); + $html .= $this->renderChildren($item, $options); + $html .= $this->format('', 'ul', $item->getLevel(), $options); + + return $html; + } + + /** + * Renders all of the children of this menu. + * + * This calls ->renderItem() on each menu item, which instructs each + * menu item to render themselves as an
  • tag (with nested ul if it + * has children). + * This method updates the depth for the children. + * + * @param array $options the options to render the item + */ + protected function renderChildren(ItemInterface $item, array $options): string + { + // render children with a depth - 1 + if (null !== $options['depth']) { + --$options['depth']; + } + + if (null !== $options['matchingDepth'] && $options['matchingDepth'] > 0) { + --$options['matchingDepth']; + } + + $html = ''; + foreach ($item->getChildren() as $child) { + $html .= $this->renderItem($child, $options); + } + + return $html; + } + + /** + * Called by the parent menu item to render this menu. + * + * This renders the li tag to fit into the parent ul as well as its + * own nested ul tag if this menu item has children + * + * @param array $options The options to render the item + */ + protected function renderItem(ItemInterface $item, array $options): string + { + // if we don't have access or this item is marked to not be shown + if (!$item->isDisplayed()) { + return ''; + } + + // create an array than can be imploded as a class list + $class = (array) $item->getAttribute('class'); + + if ($this->matcher->isCurrent($item)) { + $class[] = $options['currentClass']; + } elseif ($this->matcher->isAncestor($item, $options['matchingDepth'])) { + $class[] = $options['ancestorClass']; + } + + if ($item->actsLikeFirst()) { + $class[] = $options['firstClass']; + } + if ($item->actsLikeLast()) { + $class[] = $options['lastClass']; + } + + if (0 !== $options['depth'] && $item->hasChildren()) { + if (null !== $options['branch_class'] && $item->getDisplayChildren()) { + $class[] = $options['branch_class']; + } + } elseif (null !== $options['leaf_class']) { + $class[] = $options['leaf_class']; + } + + // retrieve the attributes and put the final class string back on it + $attributes = $item->getAttributes(); + if (!empty($class)) { + $attributes['class'] = \implode(' ', $class); + } + + // opening li tag + $html = $this->format('renderHtmlAttributes($attributes).'>', 'li', $item->getLevel(), $options); + + // render the text/link inside the li tag + //$html .= $this->format($item->getUri() ? $item->renderLink() : $item->renderLabel(), 'link', $item->getLevel()); + $html .= $this->renderLink($item, $options); + + // renders the embedded ul + $childrenClass = (array) $item->getChildrenAttribute('class'); + $childrenClass[] = 'menu_level_'.$item->getLevel(); + + $childrenAttributes = $item->getChildrenAttributes(); + $childrenAttributes['class'] = \implode(' ', $childrenClass); + + $html .= $this->renderList($item, $childrenAttributes, $options); + + // closing li tag + $html .= $this->format('
  • ', 'li', $item->getLevel(), $options); + + return $html; + } + + /** + * Renders the link in a a tag with link attributes or + * the label in a span tag with label attributes + * + * Tests if item has a an uri and if not tests if it's + * the current item and if the text has to be rendered + * as a link or not. + * + * @param ItemInterface $item The item to render the link or label for + * @param array $options The options to render the item + */ + protected function renderLink(ItemInterface $item, array $options = []): string + { + if (null !== $item->getUri() && (!$this->matcher->isCurrent($item) || $options['currentAsLink'])) { + $text = $this->renderLinkElement($item, $options); + } else { + $text = $this->renderSpanElement($item, $options); + } + + return $this->format($text, 'link', $item->getLevel(), $options); + } + + /** + * @param array $options + */ + protected function renderLinkElement(ItemInterface $item, array $options): string + { + \assert(null !== $item->getUri()); + + return \sprintf('%s', $this->escape($item->getUri()), $this->renderHtmlAttributes($item->getLinkAttributes()), $this->renderLabel($item, $options)); + } + + /** + * @param array $options + */ + protected function renderSpanElement(ItemInterface $item, array $options): string + { + return \sprintf('%s', $this->renderHtmlAttributes($item->getLabelAttributes()), $this->renderLabel($item, $options)); + } + + /** + * @param array $options + */ + protected function renderLabel(ItemInterface $item, array $options): string + { + if ($options['allow_safe_labels'] && $item->getExtra('safe_label', false)) { + return $item->getLabel(); + } + + return $this->escape($item->getLabel()); + } + + /** + * If $this->renderCompressed is on, this will apply the necessary + * spacing and line-breaking so that the particular thing being rendered + * makes up its part in a fully-rendered and spaced menu. + * + * @param string $html The html to render in an (un)formatted way + * @param string $type The type [ul,link,li] of thing being rendered + * @param array $options + */ + protected function format(string $html, string $type, int $level, array $options): string + { + if ($options['compressed']) { + return $html; + } + + $spacing = 0; + + switch ($type) { + case 'ul': + case 'link': + $spacing = $level * 4; + break; + + case 'li': + $spacing = $level * 4 - 2; + } + + return \str_repeat(' ', $spacing).$html."\n"; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/PsrProvider.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/PsrProvider.php new file mode 100644 index 0000000..0abdebd --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/PsrProvider.php @@ -0,0 +1,51 @@ +container = $container; + $this->defaultRenderer = $defaultRenderer; + } + + public function get(?string $name = null): RendererInterface + { + if (null === $name) { + $name = $this->defaultRenderer; + } + + if (!$this->container->has($name)) { + throw new \InvalidArgumentException(\sprintf('The renderer "%s" is not defined.', $name)); + } + + return $this->container->get($name); + } + + public function has(string $name): bool + { + return $this->container->has($name); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/Renderer.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/Renderer.php new file mode 100644 index 0000000..e9f6c30 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/Renderer.php @@ -0,0 +1,100 @@ +charset = $charset; + } + } + + /** + * Renders a HTML attribute + * + * @param string|bool $value + */ + protected function renderHtmlAttribute(string $name, $value): string + { + if (true === $value) { + return \sprintf('%s="%s"', $name, $this->escape($name)); + } + if (false === $value) { + throw new \InvalidArgumentException('Value cannot be false.'); + } + + return \sprintf('%s="%s"', $name, $this->escape($value)); + } + + /** + * Renders HTML attributes + * + * @param array $attributes + */ + protected function renderHtmlAttributes(array $attributes): string + { + return \implode('', \array_map([$this, 'htmlAttributesCallback'], \array_keys($attributes), \array_values($attributes))); + } + + /** + * Prepares an attribute key and value for HTML representation. + * + * It removes empty attributes. + * + * @param string $name The attribute name + * @param string|bool|null $value The attribute value + * + * @return string the HTML representation of the HTML key attribute pair + */ + private function htmlAttributesCallback(string $name, $value): string + { + if (false === $value || null === $value) { + return ''; + } + + return ' '.$this->renderHtmlAttribute($name, $value); + } + + /** + * Escapes an HTML value + */ + protected function escape(string $value): string + { + return $this->fixDoubleEscape(\htmlspecialchars($value, \ENT_QUOTES | \ENT_SUBSTITUTE, $this->charset)); + } + + /** + * Fixes double escaped strings. + * + * @param string $escaped string to fix + * + * @return string A single escaped string + */ + protected function fixDoubleEscape(string $escaped): string + { + return (string) \preg_replace('/&([a-z]+|(#\d+)|(#x[\da-f]+));/i', '&$1;', $escaped); + } + + /** + * Get the HTML charset + */ + public function getCharset(): string + { + return $this->charset; + } + + /** + * Set the HTML charset + */ + public function setCharset(string $charset): void + { + $this->charset = $charset; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererInterface.php new file mode 100644 index 0000000..1855c46 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererInterface.php @@ -0,0 +1,27 @@ + $options some rendering options + */ + public function render(ItemInterface $item, array $options = []): string; +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererProviderInterface.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererProviderInterface.php new file mode 100644 index 0000000..9fe1d28 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Renderer/RendererProviderInterface.php @@ -0,0 +1,20 @@ + + */ + private $defaultOptions; + + /** + * @param array $defaultOptions + */ + public function __construct( + Environment $environment, + string $template, + MatcherInterface $matcher, + array $defaultOptions = [] + ) { + $this->environment = $environment; + $this->matcher = $matcher; + $this->defaultOptions = \array_merge([ + 'depth' => null, + 'matchingDepth' => null, + 'currentAsLink' => true, + 'currentClass' => 'current', + 'ancestorClass' => 'current_ancestor', + 'firstClass' => 'first', + 'lastClass' => 'last', + 'template' => $template, + 'compressed' => false, + 'allow_safe_labels' => false, + 'clear_matcher' => true, + 'leaf_class' => null, + 'branch_class' => null, + ], $defaultOptions); + } + + public function render(ItemInterface $item, array $options = []): string + { + $options = \array_merge($this->defaultOptions, $options); + + $html = $this->environment->render($options['template'], ['item' => $item, 'options' => $options, 'matcher' => $this->matcher]); + + if ($options['clear_matcher']) { + $this->matcher->clear(); + } + + return $html; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig new file mode 100644 index 0000000..0ac53f6 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu.html.twig @@ -0,0 +1,101 @@ +{% extends 'knp_menu_base.html.twig' %} + +{% macro attributes(attributes) %} +{% for name, value in attributes %} + {%- if value is not none and value is not same as(false) -%} + {{- ' %s="%s"'|format(name, value is same as(true) ? name|e : value|e)|raw -}} + {%- endif -%} +{%- endfor -%} +{% endmacro %} + +{% block compressed_root %} +{% apply spaceless %} +{{ block('root') }} +{% endapply %} +{% endblock %} + +{% block root %} +{% set listAttributes = item.childrenAttributes %} +{{ block('list') -}} +{% endblock %} + +{% block list %} +{% if item.hasChildren and options.depth is not same as(0) and item.displayChildren %} + {% import _self as knp_menu %} + + {{ block('children') }} + +{% endif %} +{% endblock %} + +{% block children %} +{# save current variables #} +{% set currentOptions = options %} +{% set currentItem = item %} +{# update the depth for children #} +{% if options.depth is not none %} +{% set options = options|merge({'depth': currentOptions.depth - 1}) %} +{% endif %} +{# update the matchingDepth for children #} +{% if options.matchingDepth is not none and options.matchingDepth > 0 %} +{% set options = options|merge({'matchingDepth': currentOptions.matchingDepth - 1}) %} +{% endif %} +{% for item in currentItem.children %} + {{ block('item') }} +{% endfor %} +{# restore current variables #} +{% set item = currentItem %} +{% set options = currentOptions %} +{% endblock %} + +{% block item %} +{% if item.displayed %} +{# building the class of the item #} + {%- set classes = item.attribute('class') is not empty ? [item.attribute('class')] : [] %} + {%- if matcher.isCurrent(item) %} + {%- set classes = classes|merge([options.currentClass]) %} + {%- elseif matcher.isAncestor(item, options.matchingDepth) %} + {%- set classes = classes|merge([options.ancestorClass]) %} + {%- endif %} + {%- if item.actsLikeFirst %} + {%- set classes = classes|merge([options.firstClass]) %} + {%- endif %} + {%- if item.actsLikeLast %} + {%- set classes = classes|merge([options.lastClass]) %} + {%- endif %} + + {# Mark item as "leaf" (no children) or as "branch" (has children that are displayed) #} + {% if item.hasChildren and options.depth is not same as(0) %} + {% if options.branch_class is not empty and item.displayChildren %} + {%- set classes = classes|merge([options.branch_class]) %} + {% endif %} + {% elseif options.leaf_class is not empty %} + {%- set classes = classes|merge([options.leaf_class]) %} + {%- endif %} + + {%- set attributes = item.attributes %} + {%- if classes is not empty %} + {%- set attributes = attributes|merge({'class': classes|join(' ')}) %} + {%- endif %} +{# displaying the item #} + {% import _self as knp_menu %} + + {%- if item.uri is not empty and (not matcher.isCurrent(item) or options.currentAsLink) %} + {{ block('linkElement') }} + {%- else %} + {{ block('spanElement') }} + {%- endif %} +{# render the list of children#} + {%- set childrenClasses = item.childrenAttribute('class') is not empty ? [item.childrenAttribute('class')] : [] %} + {%- set childrenClasses = childrenClasses|merge(['menu_level_' ~ item.level]) %} + {%- set listAttributes = item.childrenAttributes|merge({'class': childrenClasses|join(' ') }) %} + {{ block('list') }} + +{% endif %} +{% endblock %} + +{% block linkElement %}{% import _self as knp_menu %}{{ block('label') }}{% endblock %} + +{% block spanElement %}{% import _self as knp_menu %}{{ block('label') }}{% endblock %} + +{% block label %}{% if options.allow_safe_labels and item.getExtra('safe_label', false) %}{{ item.label|raw }}{% else %}{{ item.label }}{% endif %}{% endblock %} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_base.html.twig b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_base.html.twig new file mode 100644 index 0000000..26965d8 --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_base.html.twig @@ -0,0 +1 @@ +{% if options.compressed %}{{ block('compressed_root') }}{% else %}{{ block('root') }}{% endif %} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_ordered.html.twig b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_ordered.html.twig new file mode 100644 index 0000000..d21c2cf --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Resources/views/knp_menu_ordered.html.twig @@ -0,0 +1,11 @@ +{% extends 'knp_menu.html.twig' %} + +{% block list %} +{% import 'knp_menu.html.twig' as macros %} + +{% if item.hasChildren and options.depth is not same as(0) and item.displayChildren %} + + {{ block('children') }} + +{% endif %} +{% endblock %} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/Helper.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/Helper.php new file mode 100644 index 0000000..22462cd --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/Helper.php @@ -0,0 +1,192 @@ +rendererProvider = $rendererProvider; + $this->menuProvider = $menuProvider; + $this->menuManipulator = $menuManipulator; + $this->matcher = $matcher; + } + + /** + * Retrieves item in the menu, eventually using the menu provider. + * + * @param ItemInterface|string $menu + * @param array $path + * @param array $options + * + * @throws \BadMethodCallException when there is no menu provider and the menu is given by name + * @throws \LogicException + * @throws \InvalidArgumentException when the path is invalid + */ + public function get($menu, array $path = [], array $options = []): ItemInterface + { + if (!$menu instanceof ItemInterface) { + if (null === $this->menuProvider) { + throw new \BadMethodCallException('A menu provider must be set to retrieve a menu'); + } + + $menuName = $menu; + $menu = $this->menuProvider->get($menuName, $options); + + if (!$menu instanceof ItemInterface) { + throw new \LogicException(\sprintf('The menu "%s" exists, but is not a valid menu item object. Check where you created the menu to be sure it returns an ItemInterface object.', $menuName)); + } + } + + foreach ($path as $child) { + $menu = $menu->getChild($child); + if (null === $menu) { + throw new \InvalidArgumentException(\sprintf('The menu has no child named "%s"', $child)); + } + } + + return $menu; + } + + /** + * Renders a menu with the specified renderer. + * + * If the argument is an array, it will follow the path in the tree to + * get the needed item. The first element of the array is the whole menu. + * If the menu is a string instead of an ItemInterface, the provider + * will be used. + * + * @param ItemInterface|string|array $menu + * @param array $options + * + * @throws \InvalidArgumentException + */ + public function render($menu, array $options = [], ?string $renderer = null): string + { + $menu = $this->castMenu($menu); + + return $this->rendererProvider->get($renderer)->render($menu, $options); + } + + /** + * Renders an array ready to be used for breadcrumbs. + * + * Each element in the array will be an array with 3 keys: + * - `label` containing the label of the item + * - `url` containing the url of the item (may be `null`) + * - `item` containing the original item (may be `null` for the extra items) + * + * The subItem can be one of the following forms + * * 'subItem' + * * ItemInterface object + * * ['subItem' => '@homepage'] + * * ['subItem1', 'subItem2'] + * * [['label' => 'subItem1', 'url' => '@homepage'], ['label' => 'subItem2']] + * + * @param mixed $menu + * @param mixed $subItem A string or array to append onto the end of the array + * @phpstan-param string|ItemInterface|array|\Traversable $subItem + * + * @return array> + * @phpstan-return list + */ + public function getBreadcrumbsArray($menu, $subItem = null): array + { + if (null === $this->menuManipulator) { + throw new \BadMethodCallException('The menu manipulator must be set to get the breadcrumbs array'); + } + + $menu = $this->castMenu($menu); + + return $this->menuManipulator->getBreadcrumbsArray($menu, $subItem); + } + + /** + * Returns the current item of a menu. + * + * @param ItemInterface|string|array $menu + */ + public function getCurrentItem($menu): ?ItemInterface + { + $menu = $this->castMenu($menu); + + return $this->retrieveCurrentItem($menu); + } + + /** + * @param ItemInterface|string|array $menu + */ + private function castMenu($menu): ItemInterface + { + if (!$menu instanceof ItemInterface) { + $path = []; + if (\is_array($menu)) { + if (empty($menu)) { + throw new \InvalidArgumentException('The array cannot be empty'); + } + $path = $menu; + $menu = \array_shift($path); + } + + return $this->get($menu, $path); + } + + return $menu; + } + + private function retrieveCurrentItem(ItemInterface $item): ?ItemInterface + { + if (null === $this->matcher) { + throw new \BadMethodCallException('The matcher must be set to get the current item of a menu'); + } + + if ($this->matcher->isCurrent($item)) { + return $item; + } + + if ($this->matcher->isAncestor($item)) { + foreach ($item->getChildren() as $child) { + $currentItem = $this->retrieveCurrentItem($child); + + if (null !== $currentItem) { + return $currentItem; + } + } + } + + return null; + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/MenuExtension.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/MenuExtension.php new file mode 100644 index 0000000..b5e749b --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Twig/MenuExtension.php @@ -0,0 +1,166 @@ +helper = $helper; + $this->matcher = $matcher; + $this->menuManipulator = $menuManipulator; + } + + /** + * @return array + */ + public function getFunctions(): array + { + return [ + new TwigFunction('knp_menu_get', [$this, 'get']), + new TwigFunction('knp_menu_render', [$this, 'render'], ['is_safe' => ['html']]), + new TwigFunction('knp_menu_get_breadcrumbs_array', [$this, 'getBreadcrumbsArray']), + new TwigFunction('knp_menu_get_current_item', [$this, 'getCurrentItem']), + ]; + } + + /** + * @return array + */ + public function getFilters(): array + { + return [ + new TwigFilter('knp_menu_as_string', [$this, 'pathAsString']), + ]; + } + + /** + * @return array + */ + public function getTests(): array + { + return [ + new TwigTest('knp_menu_current', [$this, 'isCurrent']), + new TwigTest('knp_menu_ancestor', [$this, 'isAncestor']), + ]; + } + + /** + * Retrieves an item following a path in the tree. + * + * @param ItemInterface|string $menu + * @param array $path + * @param array $options + */ + public function get($menu, array $path = [], array $options = []): ItemInterface + { + return $this->helper->get($menu, $path, $options); + } + + /** + * Renders a menu with the specified renderer. + * + * @param ItemInterface|string|array $menu + * @param array $options + */ + public function render($menu, array $options = [], ?string $renderer = null): string + { + return $this->helper->render($menu, $options, $renderer); + } + + /** + * Returns an array ready to be used for breadcrumbs. + * + * @param ItemInterface|string|array $menu + * @param string|array|null $subItem + * @phpstan-param string|ItemInterface|array|\Traversable $subItem + * + * @return array> + * @phpstan-return list + */ + public function getBreadcrumbsArray($menu, $subItem = null): array + { + return $this->helper->getBreadcrumbsArray($menu, $subItem); + } + + /** + * Returns the current item of a menu. + * + * @param ItemInterface|string $menu + */ + public function getCurrentItem($menu): ItemInterface + { + $rootItem = $this->get($menu); + + $currentItem = $this->helper->getCurrentItem($rootItem); + + if (null === $currentItem) { + $currentItem = $rootItem; + } + + return $currentItem; + } + + /** + * A string representation of this menu item + * + * e.g. Top Level > Second Level > This menu + */ + public function pathAsString(ItemInterface $menu, string $separator = ' > '): string + { + if (null === $this->menuManipulator) { + throw new \BadMethodCallException('The menu manipulator must be set to get the breadcrumbs array'); + } + + return $this->menuManipulator->getPathAsString($menu, $separator); + } + + /** + * Checks whether an item is current. + */ + public function isCurrent(ItemInterface $item): bool + { + if (null === $this->matcher) { + throw new \BadMethodCallException('The matcher must be set to get the breadcrumbs array'); + } + + return $this->matcher->isCurrent($item); + } + + /** + * Checks whether an item is the ancestor of a current item. + * + * @param int|null $depth The max depth to look for the item + */ + public function isAncestor(ItemInterface $item, ?int $depth = null): bool + { + if (null === $this->matcher) { + throw new \BadMethodCallException('The matcher must be set to get the breadcrumbs array'); + } + + return $this->matcher->isAncestor($item, $depth); + } +} diff --git a/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Util/MenuManipulator.php b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Util/MenuManipulator.php new file mode 100644 index 0000000..345433a --- /dev/null +++ b/plugins/page-toc/vendor/knplabs/knp-menu/src/Knp/Menu/Util/MenuManipulator.php @@ -0,0 +1,304 @@ +getParent()) { + $this->moveChildToPosition($parent, $item, $position); + } + } + + /** + * Moves child to specified position. Rearrange other children accordingly. + * + * @param ItemInterface $child Child to move + * @param int $position Position to move child to + */ + public function moveChildToPosition(ItemInterface $item, ItemInterface $child, int $position): void + { + $name = $child->getName(); + $order = \array_keys($item->getChildren()); + + $oldPosition = \array_search($name, $order); + unset($order[$oldPosition]); + + $order = \array_values($order); + + \array_splice($order, $position, 0, $name); + $item->reorderChildren($order); + } + + /** + * Moves item to first position. Rearrange siblings accordingly. + */ + public function moveToFirstPosition(ItemInterface $item): void + { + $this->moveToPosition($item, 0); + } + + /** + * Moves item to last position. Rearrange siblings accordingly. + */ + public function moveToLastPosition(ItemInterface $item): void + { + if (null !== $parent = $item->getParent()) { + $this->moveToPosition($item, $parent->count()); + } + } + + /** + * Get slice of menu as another menu. + * + * If offset and/or length are numeric, it works like in array_slice function: + * + * If offset is non-negative, slice will start at the offset. + * If offset is negative, slice will start that far from the end. + * + * If length is null, slice will have all elements. + * If length is positive, slice will have that many elements. + * If length is negative, slice will stop that far from the end. + * + * It's possible to mix names/object/numeric, for example: + * slice("child1", 2); + * slice(3, $child5); + * Note: when using a child as limit, it will not be included in the returned menu. + * the slice is done before this menu. + * + * @param mixed $offset name of child, child object, or numeric offset + * @param string|int|ItemInterface $length name of child, child object, or numeric length + */ + public function slice(ItemInterface $item, $offset, $length = null): ItemInterface + { + $names = \array_keys($item->getChildren()); + if ($offset instanceof ItemInterface) { + $offset = $offset->getName(); + } + if (!\is_int($offset)) { + $offset = \array_search($offset, $names, true); + if (false === $offset) { + throw new \InvalidArgumentException('Not found.'); + } + } + + if (null !== $length) { + if ($length instanceof ItemInterface) { + $length = $length->getName(); + } + if (!\is_int($length)) { + $index = \array_search($length, $names, true); + $length = ($index < $offset) ? 0 : $index - $offset; + } + } + + $slicedItem = $item->copy(); + $children = \array_slice($slicedItem->getChildren(), $offset, $length); + $slicedItem->setChildren($children); + + return $slicedItem; + } + + /** + * Split menu into two distinct menus. + * + * @param string|int|ItemInterface $length name of child, child object, or numeric length + * + * @phpstan-return array{primary: ItemInterface, secondary: ItemInterface} + * + * @return array Array with two menus, with "primary" and "secondary" key + */ + public function split(ItemInterface $item, $length): array + { + return [ + 'primary' => $this->slice($item, 0, $length), + 'secondary' => $this->slice($item, $length), + ]; + } + + /** + * Calls a method recursively on all of the children of this item + * + * @example + * $menu->callRecursively('setShowChildren', [false]); + * + * @param array $arguments + */ + public function callRecursively(ItemInterface $item, string $method, array $arguments = []): void + { + $item->$method(...$arguments); + + foreach ($item->getChildren() as $child) { + $this->callRecursively($child, $method, $arguments); + } + } + + /** + * A string representation of this menu item + * + * e.g. Top Level > Second Level > This menu + */ + public function getPathAsString(ItemInterface $item, string $separator = ' > '): string + { + $children = []; + $obj = $item; + + do { + $children[] = $obj->getLabel(); + } while ($obj = $obj->getParent()); + + return \implode($separator, \array_reverse($children)); + } + + /** + * @param int|null $depth the depth until which children should be exported (null means unlimited) + * + * @return array + */ + public function toArray(ItemInterface $item, ?int $depth = null): array + { + $array = [ + 'name' => $item->getName(), + 'label' => $item->getLabel(), + 'uri' => $item->getUri(), + 'attributes' => $item->getAttributes(), + 'labelAttributes' => $item->getLabelAttributes(), + 'linkAttributes' => $item->getLinkAttributes(), + 'childrenAttributes' => $item->getChildrenAttributes(), + 'extras' => $item->getExtras(), + 'display' => $item->isDisplayed(), + 'displayChildren' => $item->getDisplayChildren(), + 'current' => $item->isCurrent(), + ]; + + // export the children as well, unless explicitly disabled + if (0 !== $depth) { + $childDepth = null === $depth ? null : $depth - 1; + $array['children'] = []; + foreach ($item->getChildren() as $key => $child) { + $array['children'][$key] = $this->toArray($child, $childDepth); + } + } + + return $array; + } + + /** + * Renders an array ready to be used for breadcrumbs. + * + * Each element in the array will be an array with 3 keys: + * - `label` containing the label of the item + * - `url` containing the url of the item (may be `null`) + * - `item` containing the original item (may be `null` for the extra items) + * + * The subItem can be one of the following forms + * * 'subItem' + * * ItemInterface object + * * ['subItem' => '@homepage'] + * * ['subItem1', 'subItem2'] + * * [['label' => 'subItem1', 'url' => '@homepage'], ['label' => 'subItem2']] + * + * @param string|ItemInterface|array|\Traversable $subItem A string or array to append onto the end of the array + * @phpstan-param string|ItemInterface|array|\Traversable $subItem + * + * @return array> + * @phpstan-return list + * + * @throws \InvalidArgumentException if an element of the subItem is invalid + */ + public function getBreadcrumbsArray(ItemInterface $item, $subItem = null): array + { + $breadcrumbs = $this->buildBreadcrumbsArray($item); + + if (null === $subItem) { + return $breadcrumbs; + } + + if ($subItem instanceof ItemInterface) { + $breadcrumbs[] = $this->getBreadcrumbsItem($subItem); + + return $breadcrumbs; + } + + if (!\is_array($subItem) && !$subItem instanceof \Traversable) { + $subItem = [$subItem]; + } + + foreach ($subItem as $key => $value) { + switch (true) { + case $value instanceof ItemInterface: + $value = $this->getBreadcrumbsItem($value); + break; + + case \is_array($value): + // Assume we already have the appropriate array format for the element + break; + + case \is_int($key) && \is_string($value): + $value = [ + 'label' => (string) $value, + 'uri' => null, + 'item' => null, + ]; + break; + + case \is_scalar($value): + $value = [ + 'label' => (string) $key, + 'uri' => (string) $value, + 'item' => null, + ]; + break; + + case null === $value: + $value = [ + 'label' => (string) $key, + 'uri' => null, + 'item' => null, + ]; + break; + + default: + throw new \InvalidArgumentException(\sprintf('Invalid value supplied for the key "%s". It should be an item, an array or a scalar', $key)); + } + + $breadcrumbs[] = $value; + } + + return $breadcrumbs; + } + + /** + * @phpstan-return list + */ + private function buildBreadcrumbsArray(ItemInterface $item): array + { + $breadcrumb = []; + + do { + $breadcrumb[] = $this->getBreadcrumbsItem($item); + } while ($item = $item->getParent()); + + return \array_reverse($breadcrumb); + } + + /** + * @phpstan-return array{label: string, uri: string|null, item: ItemInterface} + */ + private function getBreadcrumbsItem(ItemInterface $item): array + { + return [ + 'label' => $item->getLabel(), + 'uri' => $item->getUri(), + 'item' => $item, + ]; + } +}