├── docs ├── README.md ├── get-started │ ├── requirements.md │ ├── installation-setup.md │ └── configuration.md ├── .sidebar.json └── feature-tour │ └── usage.md ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yaml │ ├── support_request.yaml │ └── bug_report.yaml ├── src ├── resources │ ├── ckeditor │ │ ├── src │ │ │ ├── index.js │ │ │ ├── footnotes.js │ │ │ ├── footnotes-editing.js │ │ │ └── footnotes-ui.js │ │ ├── .gitignore │ │ ├── theme │ │ │ ├── footnotes.css │ │ │ └── icon.svg │ │ ├── package.json │ │ ├── sample │ │ │ ├── ckeditor.js │ │ │ ├── index.html │ │ │ └── dll.html │ │ └── build │ │ │ └── footnotes.js │ └── redactor │ │ ├── footnotebutton-min.js │ │ └── footnotebutton.js ├── helpers │ └── Plugin.php ├── models │ └── Settings.php ├── assetbundles │ ├── FootnotesAsset.php │ └── CkEditorAsset.php ├── controllers │ └── BaseController.php ├── base │ └── PluginTrait.php ├── templates │ ├── _layouts │ │ └── index.html │ └── settings.html ├── translations │ ├── en │ │ └── footnotes.php │ └── de │ │ └── footnotes.php ├── icon.svg ├── twigextensions │ └── Extension.php ├── Footnotes.php └── services │ └── Service.php ├── .gitignore ├── LICENSE.md ├── README.md ├── composer.json ├── CHANGELOG.md └── config.codekit3 /docs/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: verbb 4 | -------------------------------------------------------------------------------- /src/resources/ckeditor/src/index.js: -------------------------------------------------------------------------------- 1 | export { default as Footnotes } from './footnotes.js'; 2 | -------------------------------------------------------------------------------- /src/resources/ckeditor/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | coverage/ 3 | node_modules/ 4 | tmp/ 5 | sample/ckeditor.dist.js 6 | -------------------------------------------------------------------------------- /docs/get-started/requirements.md: -------------------------------------------------------------------------------- 1 | # Requirements 2 | 3 | ## Craft CMS 4 | Footnotes requires Craft CMS 5.0 or greater. 5 | 6 | ## PHP 7 | Footnotes requires PHP 8.2 or greater. 8 | -------------------------------------------------------------------------------- /src/helpers/Plugin.php: -------------------------------------------------------------------------------- 1 | depends = [ 17 | VerbbCpAsset::class, 18 | CpAsset::class, 19 | ]; 20 | 21 | parent::init(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/controllers/BaseController.php: -------------------------------------------------------------------------------- 1 | getSettings(); 18 | 19 | return $this->renderTemplate('footnotes/settings', [ 20 | 'settings' => $settings, 21 | ]); 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /docs/get-started/installation-setup.md: -------------------------------------------------------------------------------- 1 | # Installation & Setup 2 | You can install Footnotes via the plugin store, or through Composer. 3 | 4 | ## Craft Plugin Store 5 | To install **Footnotes**, navigate to the _Plugin Store_ section of your Craft control panel, search for `Footnotes`, and click the _Try_ button. 6 | 7 | ## Composer 8 | You can also add the package to your project using Composer and the command line. 9 | 10 | 1. Open your terminal and go to your Craft project: 11 | ```shell 12 | cd /path/to/project 13 | ``` 14 | 15 | 2. Then tell Composer to require the plugin, and Craft to install it: 16 | ```shell 17 | composer require verbb/footnotes && php craft plugin/install footnotes 18 | ``` 19 | -------------------------------------------------------------------------------- /src/resources/ckeditor/theme/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assetbundles/CkEditorAsset.php: -------------------------------------------------------------------------------- 1 | sourcePath = '@verbb/footnotes/resources/ckeditor/build'; 16 | 17 | $this->pluginNames = [ 18 | 'Footnotes', 19 | ]; 20 | 21 | $this->toolbarItems = [ 22 | 'footnotes', 23 | ]; 24 | 25 | $this->js = [ 26 | 'footnotes.js', 27 | ]; 28 | 29 | parent::init(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /docs/get-started/configuration.md: -------------------------------------------------------------------------------- 1 | # Configuration 2 | Create a `footnotes.php` file under your `/config` directory with the following options available to you. You can also use multi-environment options to change these per environment. 3 | 4 | The below shows the defaults already used by Footnotes, so you don't need to add these options unless you want to modify the values. 5 | 6 | ```php 7 | [ 11 | 'enableAnchorLinks' => false, 12 | 'enableDuplicateFootnotes' => false, 13 | ], 14 | ]; 15 | ``` 16 | 17 | ## Configuration options 18 | - `enableAnchorLinks` - Whether to enable `` tags for footnotes. 19 | - `enableDuplicateFootnotes` - Whether duplicate footnotes should combine, or keep separate. 20 | 21 | ## Control Panel 22 | You can also manage configuration settings through the Control Panel by visiting Settings → Footnotes. 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Suggest an idea or enhancement. 3 | labels: 'feature request' 4 | body: 5 | - type: textarea 6 | id: feature-description 7 | attributes: 8 | label: What are you trying to do? 9 | description: A description of what you want to happen. 10 | placeholder: "I would like to see..." 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: proposed-solution 15 | attributes: 16 | label: What's your proposed solution? 17 | description: A description of how you think this could be solved, including any alternatives that you considered. 18 | validations: 19 | required: true 20 | - type: textarea 21 | id: additional-context 22 | attributes: 23 | label: Additional context 24 | description: Add any other context or screenshots about the feature request here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/support_request.yaml: -------------------------------------------------------------------------------- 1 | name: Question 2 | description: Ask a question about this plugin. DO NOT use this to submit bug reports. 3 | labels: 'question' 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Before you send through your question, please ensure you have taken these steps first: 9 | 10 | ✅ I‘ve searched open and closed issues. 11 | ✅ This is not a bug report, just a general question. 12 | 13 | - type: textarea 14 | id: question 15 | attributes: 16 | label: Question 17 | description: A question about the plugin or how it works. 18 | placeholder: "Is it possible to do..." 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: additional-context 23 | attributes: 24 | label: Additional context 25 | description: Add any other context or screenshots about your question here. -------------------------------------------------------------------------------- /src/resources/redactor/footnotebutton-min.js: -------------------------------------------------------------------------------- 1 | Redactor.add("plugin","footnotebutton",{translations:{en:{footnote:"Footnote"},de:{footnote:"Fußnote"}},init:function(t){this.app=t,this.lang=t.lang,this.toolbar=t.toolbar,this.inline=t.inline},start:function(){this.button=this.toolbar.addButton("footnotebutton",{title:this.lang.get("footnote"),api:"plugin.footnotebutton.formatSup",icon:''})},formatSup:function(){this.inline.format({tag:"sup",class:"footnote",attr:{tabindex:"0"}})}}); -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2022 Verbb, 2016 Vierbeuter UG (haftungsbeschränkt) 4 | 5 | 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: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | 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. -------------------------------------------------------------------------------- /src/resources/ckeditor/src/footnotes-editing.js: -------------------------------------------------------------------------------- 1 | import AttributeCommand from '@ckeditor/ckeditor5-basic-styles/src/attributecommand.js'; 2 | import { Plugin } from 'ckeditor5/src/core.js'; 3 | import { TwoStepCaretMovement, inlineHighlight } from 'ckeditor5/src/typing.js'; 4 | 5 | export default class FootnotesEditing extends Plugin { 6 | static get pluginName() { 7 | return 'FootnotesEditing'; 8 | } 9 | 10 | static get requires() { 11 | return [TwoStepCaretMovement]; 12 | } 13 | 14 | init() { 15 | const editor = this.editor; 16 | 17 | editor.model.schema.extend('$text', { allowAttributes: 'footnotes' }); 18 | 19 | editor.conversion.attributeToElement({ 20 | model: 'footnotes', 21 | view: { 22 | name: 'sup', 23 | classes: 'footnote', 24 | }, 25 | }); 26 | 27 | editor.commands.add('footnotes', new AttributeCommand(editor, 'footnotes')); 28 | 29 | editor.plugins.get(TwoStepCaretMovement).registerAttribute('footnotes'); 30 | inlineHighlight(editor, 'footnotes', 'sup', 'footnote-selected'); 31 | } 32 | } -------------------------------------------------------------------------------- /src/resources/ckeditor/src/footnotes-ui.js: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'ckeditor5/src/core.js'; 2 | import { ButtonView } from 'ckeditor5/src/ui.js'; 3 | 4 | import icon from '../theme/icon.svg'; 5 | 6 | export default class FootnotesUI extends Plugin { 7 | static get pluginName() { 8 | return 'FootnotesUI'; 9 | } 10 | 11 | init() { 12 | const editor = this.editor; 13 | const t = editor.t; 14 | const model = editor.model; 15 | 16 | editor.ui.componentFactory.add('footnotes', (locale) => { 17 | const command = editor.commands.get('footnotes'); 18 | const view = new ButtonView(locale); 19 | 20 | view.set({ 21 | label: t('Footnotes'), 22 | icon: icon, 23 | tooltip: true, 24 | isToggleable: true, 25 | }); 26 | 27 | view.bind('isOn', 'isEnabled').to(command, 'value', 'isEnabled'); 28 | 29 | this.listenTo(view, 'execute', () => { 30 | editor.execute('footnotes'); 31 | editor.editing.view.focus(); 32 | }); 33 | 34 | return view; 35 | }); 36 | } 37 | } -------------------------------------------------------------------------------- /src/base/PluginTrait.php: -------------------------------------------------------------------------------- 1 | [ 33 | 'service' => Service::class, 34 | ], 35 | ]; 36 | } 37 | 38 | 39 | // Public Methods 40 | // ========================================================================= 41 | 42 | public function getService(): Service 43 | { 44 | return $this->get('service'); 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /src/templates/_layouts/index.html: -------------------------------------------------------------------------------- 1 | {% extends parentLayout ?? '_layouts/cp' %} 2 | 3 | {% do view.registerAssetBundle('verbb\\footnotes\\assetbundles\\FootnotesAsset') %} 4 | 5 | {% if title is not defined %} 6 | {% set title = 'Footnotes' | t('footnotes') %} 7 | {% endif %} 8 | 9 | {% set content %} 10 | {% block blockContent %} 11 | 12 | {% endblock %} 13 | 14 |
15 | 16 |
37 | {% endset %} 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Footnotes icon

2 |

Footnotes for Craft CMS

3 | 4 | Footnotes is a Craft CMS plugin to add a footnote button to [CKEditor](https://plugins.craftcms.com/ckeditor) fields. 5 | 6 | ## Documentation 7 | Visit the [Footnotes Plugin page](https://verbb.io/craft-plugins/footnotes) for all documentation, guides, pricing and developer resources. 8 | 9 | ## Credit & Thanks 10 | Originally created by the team at [Vierbeuter](http://www.vierbeuter.de/). 11 | 12 | ## Support 13 | Get in touch with us via the [Footnotes Support page](https://verbb.io/craft-plugins/footnotes/support) or by [creating a Github issue](https://github.com/verbb/footnotes/issues) 14 | 15 | ## Sponsor 16 | Footnotes is licensed under the MIT license, meaning it will always be free and open source – we love free stuff! If you'd like to show your support to the plugin regardless, [Sponsor](https://github.com/sponsors/verbb) development. 17 | 18 |

19 | 20 | 21 | Verbb 22 | 23 | -------------------------------------------------------------------------------- /src/translations/en/footnotes.php: -------------------------------------------------------------------------------- 1 | 'Enable anchor links', 5 | 'Enable duplicate footnotes' => 'Enable duplicate footnotes', 6 | 'Footnotes' => 'Footnotes', 7 | 'When disabled, identical footnote texts will share the same footnote number and the texts will be combined into a single footnote. When enabled, each footnote text will be listed seperately (with its own footnote number) regardless of any equality to other footnotes.' => 'When disabled, identical footnote texts will share the same footnote number and the texts will be combined into a single footnote. When enabled, each footnote text will be listed seperately (with its own footnote number) regardless of any equality to other footnotes.', 8 | 'When disabled, the superscript numbers substituting footnote texts will be just plain text. When enabled, those superscript numbers will be anchors linking to the corresponding footnotes (assumed the footnotes in the template are marked up as targets accordingly).' => 'When disabled, the superscript numbers substituting footnote texts will be just plain text. When enabled, those superscript numbers will be anchors linking to the corresponding footnotes (assumed the footnotes in the template are marked up as targets accordingly).', 9 | ]; -------------------------------------------------------------------------------- /src/translations/de/footnotes.php: -------------------------------------------------------------------------------- 1 | 'Sprungmarken aktivieren', 5 | 'Enable duplicate footnotes' => 'Doppelte Fußnoten aktivieren', 6 | 'Footnotes' => 'Footnotes', 7 | 'When disabled, identical footnote texts will share the same footnote number and the texts will be combined into a single footnote. When enabled, each footnote text will be listed seperately (with its own footnote number) regardless of any equality to other footnotes.' => 'Wenn deaktiviert, dann werden sich identische Fußnotentexte die selbe Fußnotennummer teilen und es wird nur eine Fußnote dafür geben. Wenn aktiviert, dann wird jeder Fußnotentext einzeln aufgelistet (jeweils mit eigener Fußnotennummer) und zwar unabhängig von etwaiger Gleichheit zu anderen Fußnoten.', 8 | 'When disabled, the superscript numbers substituting footnote texts will be just plain text. When enabled, those superscript numbers will be anchors linking to the corresponding footnotes (assumed the footnotes in the template are marked up as targets accordingly).' => 'Wenn deaktivert, dann werden die hochgestellten Zahlen, welche die Fußnotentexte ersetzen, einfache Texte sein. Wenn aktiviert, dann werden eben jene hochgestellten Zahlen Ankerlinks sein und zu den entsprechenden Fußnoten verlinken (vorausgesetzt die Fußnoten sind im Template entsprechend als Sprungmarken ausgewiesen).', 9 | ]; -------------------------------------------------------------------------------- /src/resources/ckeditor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@verbb/ckeditor5-footnotes", 3 | "version": "0.0.1", 4 | "description": "A plugin for CKEditor 5.", 5 | "type": "module", 6 | "main": "src/index.js", 7 | "exports": { 8 | ".": "./src/index.js", 9 | "./dist/index.js": "./dist/index.js", 10 | "./*": "./dist/*", 11 | "./browser/*": null, 12 | "./build/*": "./build/*", 13 | "./src/*": "./src/*", 14 | "./package.json": "./package.json" 15 | }, 16 | "license": "MIT", 17 | "files": [ 18 | "dist", 19 | "lang", 20 | "src", 21 | "theme", 22 | "build", 23 | "ckeditor5-metadata.json" 24 | ], 25 | "devDependencies": { 26 | "@ckeditor/ckeditor5-dev-build-tools": "43.0.1", 27 | "@ckeditor/ckeditor5-inspector": ">=4.1.0", 28 | "@ckeditor/ckeditor5-package-tools": "^3.0.1", 29 | "ckeditor5": "latest", 30 | "http-server": "^14.1.0", 31 | "webdriverio": "^9.0.7" 32 | }, 33 | "peerDependencies": { 34 | "ckeditor5": ">=42.0.0 || ^0.0.0-nightly" 35 | }, 36 | "scripts": { 37 | "build:dist": "node ./scripts/build-dist.mjs", 38 | "dll:build": "ckeditor5-package-tools dll:build", 39 | "dll:serve": "http-server ./ -o sample/dll.html", 40 | "dev": "ckeditor5-package-tools start", 41 | "build": "npm run dll:build && npm run build:dist" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 12 | 13 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/resources/redactor/footnotebutton.js: -------------------------------------------------------------------------------- 1 | (function ($R) { 2 | $R.add('plugin', 'footnotebutton', { 3 | translations: { 4 | en: { 5 | "footnote": 'Footnote', 6 | }, 7 | de: { 8 | "footnote": 'Fußnote', 9 | } 10 | }, 11 | 12 | init: function (app) { 13 | this.app = app; 14 | this.lang = app.lang; 15 | this.toolbar = app.toolbar; 16 | this.inline = app.inline; 17 | }, 18 | 19 | start: function () { 20 | this.button = this.toolbar.addButton('footnotebutton', { 21 | title: this.lang.get('footnote'), 22 | api: 'plugin.footnotebutton.formatSup', 23 | icon: '', 24 | }); 25 | }, 26 | 27 | formatSup: function () { 28 | this.inline.format({ tag: 'sup', class: 'footnote', attr: { tabindex: '0' } }); 29 | }, 30 | }); 31 | })(Redactor); 32 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "verbb/footnotes", 3 | "description": "Adds a footnotes feature to CKEditor fields and Twig templates.", 4 | "type": "craft-plugin", 5 | "version": "5.1.3", 6 | "keywords": [ 7 | "craft", 8 | "cms", 9 | "craftcms", 10 | "craft-plugin", 11 | "redactor", 12 | "ckeditor", 13 | "footnotes" 14 | ], 15 | "support": { 16 | "email": "support@verbb.io", 17 | "issues": "https://github.com/verbb/footnotes/issues?state=open", 18 | "source": "https://github.com/verbb/footnotes", 19 | "docs": "https://github.com/verbb/footnotes", 20 | "rss": "https://github.com/verbb/footnotes/commits/v2.atom" 21 | }, 22 | "license": "MIT", 23 | "authors": [ 24 | { 25 | "name": "Verbb", 26 | "homepage": "https://verbb.io" 27 | }, 28 | { 29 | "name": "Vierbeuter", 30 | "homepage": "https://www.vierbeuter.de" 31 | } 32 | ], 33 | "require": { 34 | "php": "^8.2", 35 | "craftcms/cms": "^5.0.0", 36 | "verbb/base": "^3.0.0" 37 | }, 38 | "autoload": { 39 | "psr-4": { 40 | "verbb\\footnotes\\": "src/" 41 | } 42 | }, 43 | "extra": { 44 | "name": "Footnotes", 45 | "handle": "footnotes", 46 | "changelogUrl": "https://raw.githubusercontent.com/verbb/footnotes/craft-5/CHANGELOG.md", 47 | "class": "verbb\\footnotes\\Footnotes" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/templates/settings.html: -------------------------------------------------------------------------------- 1 | {% extends 'footnotes/_layouts' %} 2 | {% import '_includes/forms' as forms %} 3 | 4 | {% requireAdmin %} 5 | 6 | {% set crumbs = [ 7 | { label: 'Footnotes' | t('footnotes'), url: url('footnotes/settings') }, 8 | { label: 'Settings' | t('app'), url: url('footnotes/settings') } 9 | ] %} 10 | 11 | {% set selectedTab = 'settings' %} 12 | {% set fullPageForm = true %} 13 | 14 | {% block blockContent %} 15 | 16 | 17 | 18 | 19 | {% namespace 'settings' %} 20 | 21 | {{ forms.lightswitchField({ 22 | first: true, 23 | label: 'Enable anchor links' | t('footnotes'), 24 | instructions: 'When disabled, the superscript numbers substituting footnote texts will be just plain text. When enabled, those superscript numbers will be anchors linking to the corresponding footnotes (assumed the footnotes in the template are marked up as targets accordingly).' | t('footnotes'), 25 | name: 'enableAnchorLinks', 26 | on: settings.enableAnchorLinks, 27 | errors: settings.getErrors('enableAnchorLinks'), 28 | }) }} 29 | 30 | {{ forms.lightswitchField({ 31 | label: 'Enable duplicate footnotes' | t('footnotes'), 32 | instructions: 'When disabled, identical footnote texts will share the same footnote number and the texts will be combined into a single footnote. When enabled, each footnote text will be listed seperately (with its own footnote number) regardless of any equality to other footnotes.' | t('footnotes'), 33 | name: 'enableDuplicateFootnotes', 34 | on: settings.enableDuplicateFootnotes, 35 | errors: settings.getErrors('enableDuplicateFootnotes'), 36 | }) }} 37 | 38 | {% endnamespace %} 39 | 40 | {% endblock %} 41 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: Create a report to help us improve. 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | Before you send through your bug report, please ensure you have taken these steps first: 8 | 9 | ✅ I‘ve searched open and closed issues. 10 | 11 | - type: textarea 12 | id: bug-description 13 | attributes: 14 | label: Describe the bug 15 | description: Describe the bug and what behaviour you expect if the bug is fixed. 16 | placeholder: "I have an issue where..." 17 | validations: 18 | required: true 19 | - type: textarea 20 | id: steps-to-reproduce 21 | attributes: 22 | label: Steps to reproduce 23 | description: Detail how we can reproduce this issue. 24 | value: | 25 | 1. 26 | 2. 27 | validations: 28 | required: true 29 | - type: input 30 | id: craft-version 31 | attributes: 32 | label: Craft CMS version 33 | description: What version of Craft CMS you‘re using. **Do not write "latest"**. 34 | validations: 35 | required: true 36 | - type: input 37 | id: plugin-version 38 | attributes: 39 | label: Plugin version 40 | description: What version of the plugin you‘re using. **Do not write "latest"**. 41 | validations: 42 | required: true 43 | - type: input 44 | id: multi-site 45 | attributes: 46 | label: Multi-site? 47 | description: Whether your install is a multi-site. 48 | placeholder: | 49 | "Yes" or "No" 50 | - type: textarea 51 | id: additional-context 52 | attributes: 53 | label: Additional context 54 | description: Provide any additional information you think might be useful. The more information you provide the easier it‘ll be for use to fix this bug! 55 | placeholder: | 56 | "I also have X plugin installed..." or "This only happens on production..." -------------------------------------------------------------------------------- /src/twigextensions/Extension.php: -------------------------------------------------------------------------------- 1 | ['html']]), 29 | ]; 30 | } 31 | 32 | /** 33 | * Returns a list of functions to add to the existing list. 34 | * 35 | * @return array An array of functions 36 | */ 37 | public function getFunctions(): array 38 | { 39 | return [ 40 | new TwigFunction('footnotes_exist', [$this, 'footnotesExist']), 41 | new TwigFunction('footnotes_set', [$this, 'setFootnotes']), 42 | new TwigFunction('footnotes', [$this, 'getFootnotes'], ['is_safe' => ['html']]), 43 | ]; 44 | } 45 | 46 | /** 47 | * Filters the given string for footnotes and replaces them with a number. 48 | * 49 | * @param string|null $value 50 | * @param array $options 51 | * @return string 52 | */ 53 | public function filterFootnotes(string $value = null, array $options = []): string 54 | { 55 | return Footnotes::$plugin->getService()->filter($value, $options); 56 | } 57 | 58 | /** 59 | * Checks if any footnotes exist. 60 | * 61 | * @return bool 62 | */ 63 | public function footnotesExist(): bool 64 | { 65 | return Footnotes::$plugin->getService()->exist(); 66 | } 67 | 68 | /** 69 | * Returns all footnotes. 70 | * 71 | * @return string[] 72 | */ 73 | public function getFootnotes(array $options = []): array 74 | { 75 | return Footnotes::$plugin->getService()->get($options); 76 | } 77 | 78 | public function setFootnotes(array $footnotes = []): void 79 | { 80 | Footnotes::$plugin->getService()->set($footnotes); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /docs/feature-tour/usage.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | Once Footnotes has been installed, in the Craft CMS control panel, navigate to any CKEditor field in your Craft settings (Settings > Fields). 3 | 4 | For the **CKEditor Config** setting, either create a new config, or edit an existing one. You'll see a button with the Footnotes icon (an asterisk) as an available button to add to your toolbar. Drag and drop it to the appropriate position in your toolbar. 5 | 6 | ## Render your content 7 | When rendering the CKEditor field containing footnotes, you'll need to use the `footnotes` Twig filter. 8 | 9 | ```twig 10 | {{ entry.myContentField | footnotes }} 11 | ``` 12 | 13 | ## Render footnotes 14 | Then, you'll likely want to render the footnotes at the bottom of the page, or neat your content. Using the Twig function `footnotes()` will return an array of footnotes (those that have been collected using the `footnotes` filter above). Each footnote is indexed by its `number`. 15 | 16 | ```twig 17 | 22 | ``` 23 | 24 | ### Anchor links 25 | When activating the [Enable anchor links](#enable-anchor-links) option on the plugin's settings page, the `number` variable will contain a link like `1`. You can get the plain footnote number with [Twig’s `loop` variable](https://twig.symfony.com/doc/2.x/tags/for.html) for usage in the `
  • ` element's `id` attribute: 26 | 27 | ```twig 28 | 35 | ``` 36 | 37 | Don't forget to use the `raw` filter for printing the `number` because it contains HTML. 38 | 39 | ### Add a back button 40 | From here, you might want to add a link that jumps readers back to their position they just came from. Each footnote reference in your text content already comes with an ID, e.g. `fnref:1`, so you can link back to that ID from your footnote. 41 | 42 | ```twig 43 | 51 | ``` 52 | 53 | ### Attributes 54 | You can also include a range of options to assist with rendering: 55 | 56 | ```twig 57 | {{ entry.myContentField | footnotes({ anchorAttributes: { class: 'some-class' }, superscriptAttributes: { class: 'another-class' } }) }} 58 | ``` 59 | -------------------------------------------------------------------------------- /src/resources/ckeditor/sample/ckeditor.js: -------------------------------------------------------------------------------- 1 | import CKEditorInspector from '@ckeditor/ckeditor5-inspector'; 2 | 3 | import { ClassicEditor } from '@ckeditor/ckeditor5-editor-classic'; 4 | 5 | import { Autoformat } from '@ckeditor/ckeditor5-autoformat'; 6 | import { Bold, Code, Italic } from '@ckeditor/ckeditor5-basic-styles'; 7 | import { BlockQuote } from '@ckeditor/ckeditor5-block-quote'; 8 | import { CodeBlock } from '@ckeditor/ckeditor5-code-block'; 9 | import { Essentials } from '@ckeditor/ckeditor5-essentials'; 10 | import { Heading } from '@ckeditor/ckeditor5-heading'; 11 | import { Image, ImageCaption, ImageStyle, ImageToolbar, ImageUpload } from '@ckeditor/ckeditor5-image'; 12 | import { Indent } from '@ckeditor/ckeditor5-indent'; 13 | import { Link } from '@ckeditor/ckeditor5-link'; 14 | import { List } from '@ckeditor/ckeditor5-list'; 15 | import { MediaEmbed } from '@ckeditor/ckeditor5-media-embed'; 16 | import { Paragraph } from '@ckeditor/ckeditor5-paragraph'; 17 | import { Table, TableToolbar } from '@ckeditor/ckeditor5-table'; 18 | import { Base64UploadAdapter } from '@ckeditor/ckeditor5-upload'; 19 | 20 | import Footnotes from '../src/footnotes.js'; 21 | 22 | /* global document, window */ 23 | 24 | ClassicEditor 25 | .create( document.querySelector( '#editor' ), { 26 | licenseKey: 'GPL', 27 | plugins: [ 28 | Footnotes, 29 | Essentials, 30 | Autoformat, 31 | BlockQuote, 32 | Bold, 33 | Heading, 34 | Image, 35 | ImageCaption, 36 | ImageStyle, 37 | ImageToolbar, 38 | ImageUpload, 39 | Indent, 40 | Italic, 41 | Link, 42 | List, 43 | MediaEmbed, 44 | Paragraph, 45 | Table, 46 | TableToolbar, 47 | CodeBlock, 48 | Code, 49 | Base64UploadAdapter 50 | ], 51 | toolbar: [ 52 | 'footnotes', 53 | '|', 54 | 'heading', 55 | '|', 56 | 'bold', 57 | 'italic', 58 | 'link', 59 | 'code', 60 | 'bulletedList', 61 | 'numberedList', 62 | '|', 63 | 'outdent', 64 | 'indent', 65 | '|', 66 | 'uploadImage', 67 | 'blockQuote', 68 | 'insertTable', 69 | 'mediaEmbed', 70 | 'codeBlock', 71 | '|', 72 | 'undo', 73 | 'redo' 74 | ], 75 | image: { 76 | toolbar: [ 77 | 'imageStyle:inline', 78 | 'imageStyle:block', 79 | 'imageStyle:side', 80 | '|', 81 | 'imageTextAlternative' 82 | ] 83 | }, 84 | table: { 85 | contentToolbar: [ 86 | 'tableColumn', 87 | 'tableRow', 88 | 'mergeTableCells' 89 | ] 90 | } 91 | } ) 92 | .then( editor => { 93 | window.editor = editor; 94 | CKEditorInspector.attach( editor ); 95 | window.console.log( 'CKEditor 5 is ready.', editor ); 96 | } ) 97 | .catch( err => { 98 | window.console.error( err.stack ); 99 | } ); 100 | -------------------------------------------------------------------------------- /src/Footnotes.php: -------------------------------------------------------------------------------- 1 | _registerTwigExtensions(); 48 | $this->_registerRedactorPlugins(); 49 | $this->_registerCkEditorPlugins(); 50 | 51 | if (Craft::$app->getRequest()->getIsCpRequest()) { 52 | $this->_registerCpRoutes(); 53 | } 54 | } 55 | 56 | public function getSettingsResponse(): mixed 57 | { 58 | return Craft::$app->getResponse()->redirect(UrlHelper::cpUrl('footnotes/settings')); 59 | } 60 | 61 | 62 | // Protected Methods 63 | // ========================================================================= 64 | 65 | protected function createSettingsModel(): Settings 66 | { 67 | return new Settings(); 68 | } 69 | 70 | 71 | // Private Methods 72 | // ========================================================================= 73 | 74 | private function _registerCpRoutes(): void 75 | { 76 | Event::on(UrlManager::class, UrlManager::EVENT_REGISTER_CP_URL_RULES, function(RegisterUrlRulesEvent $event) { 77 | $event->rules = array_merge($event->rules, [ 78 | 'footnotes/settings' => 'footnotes/base/settings', 79 | ]); 80 | }); 81 | } 82 | 83 | private function _registerTwigExtensions(): void 84 | { 85 | Craft::$app->getView()->registerTwigExtension(new Extension); 86 | } 87 | 88 | private function _registerRedactorPlugins(): void 89 | { 90 | if (PluginHelper::isPluginInstalledAndEnabled('redactor')) { 91 | Event::on(Field::class, Field::EVENT_REGISTER_PLUGIN_PATHS, function (RegisterPluginPathsEvent $event) { 92 | $event->paths[] = Craft::getAlias('@verbb/footnotes/resources/redactor/'); 93 | }); 94 | } 95 | } 96 | 97 | private function _registerCkEditorPlugins(): void 98 | { 99 | if (PluginHelper::isPluginInstalledAndEnabled('ckeditor')) { 100 | CkEditor::registerCkeditorPackage(CkEditorAsset::class); 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/resources/ckeditor/sample/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | CKEditor 5 – Development Sample 7 | 13 | 14 | 15 | 16 |

    CKEditor 5 – Development Sample

    17 | 18 |
    19 |

    Development environment

    20 |

    21 | This is a demo of the classic editor 22 | build that loads your plugin (Footnotes) generated by the tool. You can modify this 23 | sample and use it to validate whether a plugin or a set of plugins work fine. 24 |

    25 |

    26 | Footnotes inserts text into the editor. You can click the CKEditor 5 icon in the toolbar and see the results. 27 |

    28 | 29 |

    Helpful resources

    30 | 59 | 60 |

    The directory structure

    61 | 62 |

    63 | The code snippet below presents the directory structure. 64 |

    65 | 66 |
    .
     67 | ├─ lang
     68 | │  └─ contexts.json    # Entries used for creating translations.
     69 | ├─ sample
     70 | │  ├─ dll.html         # The editor initialized using the DLL builds. Check README for details.
     71 | │  ├─ index.html       # The currently displayed file.
     72 | │  └─ ckeditor.js      # The editor initialization script.
     73 | ├─ src
     74 | │  ├─ footnotes.ts
     75 | │  ├─ index.js         # The modules exported by the package when using the DLL builds.
     76 | │  └─ **/*.js          # All JavaScript source files should be saved here.
     77 | ├─ tests
     78 | │  ├─ footnotes.js
     79 | │  ├─ index.js         # Tests for the plugin.
     80 | │  └─ **/*.js          # All tests should be saved here.
     81 | ├─ theme
     82 | │  ├─ icons
     83 | │  │  ├─ ckeditor.svg  # The CKEditor 5 icon displayed in the toolbar.
     84 | │  │  └─ **/*.svg      # All icon files should be saved here.
     85 | │  └─ **/*.css         # All CSS files should be saved here.
     86 | ├─ .editorconfig
     87 | ├─ ...
     88 | └─ README.md
    89 | 90 |

    Reporting issues

    91 |

    If you found a problem with CKEditor 5 or the package generator, please, report an issue:

    92 | 96 |
    97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 5.1.3 - 2025-11-29 4 | 5 | ### Added 6 | - Add `footnotes_set` Twig function. 7 | 8 | ## 5.1.2 - 2025-11-06 9 | 10 | ### Changed 11 | - Update English translations. 12 | 13 | ## 5.1.0 - 2025-03-21 14 | 15 | ### Added 16 | - Add support for [CKEditor](https://plugins.craftcms.com/ckeditor). 17 | 18 | ### Deprecated 19 | - Deprecated [Redactor](https://plugins.craftcms.com/redactor) support. 20 | 21 | ## 5.0.0 - 2024-05-13 22 | 23 | ### Changed 24 | - Now requires PHP `8.2.0+`. 25 | - Now requires Craft `5.0.0+`. 26 | 27 | ## 4.1.1 - 2025-07-18 28 | 29 | ### Changed 30 | - Update English translations. 31 | 32 | ## 4.1.0 - 2025-03-24 33 | 34 | ### Added 35 | - Add support for [CKEditor](https://plugins.craftcms.com/ckeditor). 36 | 37 | ### Deprecated 38 | - Deprecated [Redactor](https://plugins.craftcms.com/redactor) support. 39 | 40 | ## 4.0.2 - 2023-10-25 41 | 42 | ### Added 43 | - Add `tabindex=“0”` to `` footnotes. 44 | 45 | ### Changed 46 | - Only admins are now allowed to access plugin settings. 47 | 48 | ## 4.0.1 - 2022-12-03 49 | 50 | ### Fixed 51 | - Fix an error when viewing the field in Live Preview with no value. 52 | 53 | ## 4.0.0 - 2022-08-27 54 | 55 | ### Changed 56 | - Now requires PHP `8.0.2+`. 57 | - Now requires Craft `4.0.0+`. 58 | 59 | ## 3.0.0 - 2022-08-27 60 | 61 | > {note} The plugin’s package name has changed to `verbb/footnotes`. Footnotes will need be updated to 3.0 from a terminal, by running `composer require verbb/footnotes && composer remove vierbeuter/craft-footnotes`. 62 | 63 | ### Added 64 | - Add the ability to pass `anchorAttributes` object to `footnotes` filter. 65 | - Add the ability to pass `superscriptAttributes` object to `footnotes` filter. 66 | - Add the ability to pass `anchorAttributes` object to `footnotes` function. 67 | 68 | ### Changed 69 | - Migration to `verbb/footnotes`. 70 | - Now requires Craft 3.7+. 71 | 72 | ## 2.2.2 - 2019-11-08 73 | 74 | ### Fixed 75 | - yet another fix of changelog file … please, don't ask 76 | 77 | ## 2.2.1 - 2019-11-08 78 | 79 | ### Fixed 80 | - fixed changelog format to be recognized by Craft Plugin Store … again 😪 81 | 82 | ## 2.2.0 - 2019-11-08 83 | 84 | ### Added 85 | - [#3](https://github.com/Vierbeuter/craft-footnotes/issues/3): new setting for changing how to deal with duplicate footnotes → either combine identical footnotes to one footnote (which is the behaviour of all previous releases and therefore the plugin's default) or list all footnotes seperately, even those that are equal (which is optional, of course) 86 | - German translations for settings page 87 | - slightly extended the README file 88 | 89 | ### Fixed 90 | - minor fix of docs: added missing note to README about the `` tag's `footnote` class (which has been added with release 2.1.0) 91 | 92 | ## 2.1.1 - 2019-10-30 93 | 94 | ### Fixed 95 | - [#6](https://github.com/Vierbeuter/craft-footnotes/issues/6): fixed the footnote button whose icon always stayed black, also on hovering → now the icon color does change on hovering the button 96 | - fixed changelog format to be recognized by Craft Plugin Store 97 | 98 | ## 2.1.0 - 2019-10-30 99 | 100 | ### Changed 101 | - [#6](https://github.com/Vierbeuter/craft-footnotes/issues/6): changed icon of footnote button and slightly changed the behaviour of the footnote button: footnotes are not just tagged with `` any longer, now they're tagged with `` to make footnotes coexist with regular superscript text 102 | 103 | ### Fixed 104 | - changelog format 105 | 106 | ## 2.0.0 - 2019-10-29 107 | 108 | ### Added 109 | - minor improvement: set icon for footnote button 110 | 111 | ### Changed 112 | - update sources for Craft CMS 3 113 | 114 | ## 1.1.3 - 2017-05-10 115 | 116 | ### Added 117 | - minor improvement: Footnotes directly followed by other footnotes (either with or without whitespace characters between them) will now be comma-separated: 118 | *"your text2 34"* will now be rendered as *"your text2, 3, 4"* 119 | 120 | ## 1.1.2 - 2017-03-31 121 | 122 | ### Fixed 123 | - fixed anchor link replacement in "footnotes" filter 124 | 125 | ## 1.1.1 - 2016-07-19 126 | 127 | ### Fixed 128 | - [#2](https://github.com/Vierbeuter/craft-footnotes/issues/2): fixed missing settings template 129 | 130 | ## 1.1.0 - 2016-07-05 131 | 132 | ### Added 133 | - [#1](https://github.com/Vierbeuter/craft-footnotes/issues/1): anchor links can now be added to footnotes 134 | 135 | ## 1.0.0 - 2016-06-23 136 | 137 | ### Added 138 | - First version of footnotes plugin released for Craft CMS 2 139 | -------------------------------------------------------------------------------- /src/resources/ckeditor/build/footnotes.js: -------------------------------------------------------------------------------- 1 | (()=>{var e={72:(e,t,n)=>{"use strict";var o,r=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},i=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),s=[];function a(e){for(var t=-1,n=0;n{"use strict";e.exports=CKEditor5.dll},311:(e,t,n)=>{e.exports=n(237)("./src/ui.js")},314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,o){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(o)for(var i=0;i{"use strict";n.d(t,{A:()=>i});var o=n(314),r=n.n(o)()((function(e){return e[1]}));r.push([e.id,".ck-content .footnote{background-color:var(--gray-100);border-radius:var(small);display:inline-block;font-size:.8em;line-height:1;margin-inline:2px;padding-block:1px 2px;padding-inline:4px;top:-4px;vertical-align:0}.ck.ck-editor__editable .footnote-selected{outline:2px solid var(--dark-focus-color)}",""]);const i=r},782:(e,t,n)=>{e.exports=n(237)("./src/core.js")},834:(e,t,n)=>{e.exports=n(237)("./src/typing.js")}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={id:o,exports:{}};return e[o](i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nc=void 0;var o={};(()=>{"use strict";n.r(o),n.d(o,{Footnotes:()=>f});var e=n(782); 2 | /** 3 | * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. 4 | * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options 5 | */ 6 | class t extends e.Command{constructor(e,t){super(e),this.attributeKey=t}refresh(){const e=this.editor.model,t=e.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=e.schema.checkAttributeInSelection(t.selection,this.attributeKey)}execute(e={}){const t=this.editor.model,n=t.document.selection,o=void 0===e.forceValue?!this.value:e.forceValue;t.change((e=>{if(n.isCollapsed)o?e.setSelectionAttribute(this.attributeKey,!0):e.removeSelectionAttribute(this.attributeKey);else{const r=t.schema.getValidRanges(n.getRanges(),this.attributeKey);for(const t of r)o?e.setAttribute(this.attributeKey,o,t):e.removeAttribute(this.attributeKey,t)}}))}_getValueFromFirstAllowedNode(){const e=this.editor.model,t=e.schema,n=e.document.selection;if(n.isCollapsed)return n.hasAttribute(this.attributeKey);for(const e of n.getRanges())for(const n of e.getItems())if(t.checkAttribute(n,this.attributeKey))return n.hasAttribute(this.attributeKey);return!1}}var r=n(834);class i extends e.Plugin{static get pluginName(){return"FootnotesEditing"}static get requires(){return[r.TwoStepCaretMovement]}init(){const e=this.editor;e.model.schema.extend("$text",{allowAttributes:"footnotes"}),e.conversion.attributeToElement({model:"footnotes",view:{name:"sup",classes:"footnote"}}),e.commands.add("footnotes",new t(e,"footnotes")),e.plugins.get(r.TwoStepCaretMovement).registerAttribute("footnotes"),(0,r.inlineHighlight)(e,"footnotes","sup","footnote-selected")}}var s=n(311);class a extends e.Plugin{static get pluginName(){return"FootnotesUI"}init(){const e=this.editor,t=e.t;e.model;e.ui.componentFactory.add("footnotes",(n=>{const o=e.commands.get("footnotes"),r=new s.ButtonView(n);return r.set({label:t("Footnotes"),icon:'\n',tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(o,"value","isEnabled"),this.listenTo(r,"execute",(()=>{e.execute("footnotes"),e.editing.view.focus()})),r}))}}var c=n(72),l=n.n(c),u=n(442),d={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};l()(u.A,d);u.A.locals;class f extends e.Plugin{static get pluginName(){return"Footnotes"}static get requires(){return[i,a]}}})(),(window.CKEditor5=window.CKEditor5||{}).footnotes=o})(); -------------------------------------------------------------------------------- /src/resources/ckeditor/sample/dll.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | CKEditor 5 – DLL Sample 7 | 13 | 14 | 15 | 16 |

    CKEditor 5 – DLL Sample

    17 | 18 |
    19 |

    Production sample

    20 |

    21 | This is a demo of the classic editor 22 | build, initialized using the DLL builds. 23 |

    24 |

    25 | Your plugin (Footnotes) generated by the tool is already loaded into the editor. By default, it has an example button that adds some text to the editor. Whenever you change the plugin's name or toolbar items, make sure to update the editor configuration in the sample/dll.html file. 26 |

    27 | 28 |

    Uncaught TypeError

    29 |

    If the editor is not initialized correctly and the browser console displays an error such as the following:

    30 |
    Uncaught TypeError: Cannot read properties of undefined (reading 'Footnotes') at dll.html:85
    31 |

    it means that the DLL build of the @verbb/ckeditor5-footnotes package has not been created.

    32 |

    Please call the npm run dll:build command in the CLI, and after it finishes, refresh the page.

    33 | 34 |

    Anatomy of the DLL build

    35 |

    The source of the DLL build is located in the src/index.js file. It may export as many things as the package offers.

    36 | 37 |

    Maintaining the sample

    38 |

    Whenever you change objects exported by the DLL build, please review the content of the sample. Things to keep in mind:

    39 |
      40 |
    • Review the list of loaded plugins in the configuration.
    • 41 |
    • Review names of items registered in toolbars.
    • 42 |
    43 | 44 |

    The goal

    45 |

    The primary purpose of the sample is to verify whether the plugins in the package will work together with CKEditor 5 created with the DLL approach.

    46 | 47 |

    Publishing the package

    48 |

    49 | By default, the build/ directory is specified in the #files 50 | array in the package.json file. It means all its contents will be published when calling the npm publish command. 51 |

    52 |

    53 | Unfortunately, it is easy to forget to refresh the DLL build before making a new release. Hence, we created the prescript that would refresh the build automatically when calling the npm publish command. 54 |

    55 | 56 |

    Reporting issues

    57 |

    If you found a problem with CKEditor 5 or the package generator, please, report an issue:

    58 | 62 |
    63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 161 | 162 | 163 | -------------------------------------------------------------------------------- /src/services/Service.php: -------------------------------------------------------------------------------- 1 | set(); 31 | 32 | // Get plugin settings 33 | $this->settings = Footnotes::$plugin->getSettings(); 34 | } 35 | 36 | /** 37 | * Sets the footnotes or resets them if no value given. 38 | * 39 | * @param string[] $footnotes 40 | */ 41 | public function set(array $footnotes = []): void 42 | { 43 | $this->footnotes = $footnotes; 44 | } 45 | 46 | /** 47 | * Filters the given string and extracts all substrings 48 | * within <sup> tags. Replaces those substrings with 49 | * footnote indexes that reference to the corresponding 50 | * (extracted) strings. 51 | * 52 | * For getting the strings these footnote indexes refer to 53 | * use the get() method. 54 | * 55 | * @param string|FieldData|null $string 56 | * @param array $options 57 | * @return string 58 | * 59 | * @see get() 60 | */ 61 | public function filter(FieldData|string|null $string, array $options = []): string 62 | { 63 | // check if given value is a Redactor field's data (containing the markup ) 64 | if ($string instanceof FieldData) { 65 | $string = $string->getParsedContent(); 66 | } 67 | 68 | // empty fields return NULL instead of an empty string --> nothing to do for us here, therefore just return an empty string 69 | if (empty($string)) { 70 | return ''; 71 | } 72 | 73 | // ensure the filter is used correctly 74 | if (!is_string($string)) { 75 | throw new InvalidArgumentException('expected value of type string or ' . FieldData::class . ', but ' . (is_object($string) ? get_class($string) : gettype($string)) . ' given'); 76 | } 77 | 78 | // extract the contents of all occurrences of tags 79 | preg_match_all('#(.*?)#', $string, $matches); 80 | 81 | // collect the footnotes and replace them with numbers 82 | $footnotesWithSup = reset($matches); 83 | $footnotes = next($matches); 84 | 85 | foreach ($footnotesWithSup as $key => $footnote) { 86 | $number = $this->add($footnotes[$key]); 87 | $replaceWith = $number; 88 | 89 | // add anchor link 90 | if ($this->settings->enableAnchorLinks) { 91 | $anchorAttributes = $options['anchorAttributes'] ?? []; 92 | $anchorAttrs = array_merge_recursive($anchorAttributes, ['id' => 'fnref:' . $number, 'href' => '#footnote-' . $number]); 93 | 94 | $replaceWith = Html::tag('a', $replaceWith, $anchorAttrs); 95 | } 96 | 97 | $superscriptAttributes = $options['superscriptAttributes'] ?? []; 98 | $superscriptAttrs = array_merge_recursive($superscriptAttributes, ['class' => 'footnote']); 99 | 100 | $replaceWith = Html::tag('sup', $replaceWith, $superscriptAttrs); 101 | 102 | // check if "duplicate footnotes" feature is enabled to search'n'replace differently 103 | if ($this->settings->enableDuplicateFootnotes) { 104 | // replace first footnote only (ignore any other identical ones) 105 | $string = substr_replace($string, $replaceWith, strpos($string, $footnote), strlen($footnote)); 106 | } else { 107 | // replace all footnotes of same text 108 | $string = str_replace($footnote, $replaceWith, $string); 109 | } 110 | } 111 | 112 | // enable multiple, comma-separated footnotes 113 | // like "2, 3" instead of having "23" 114 | 115 | // therefore find all closing followed by opening tags (eventually divided by whitespaces) 116 | preg_match_all('#\s*#', $string, $matches); 117 | $footnotesCloseAndOpen = reset($matches); 118 | 119 | // iterate all found "" (including those with whitespaces such as " " or even " ") 120 | foreach ($footnotesCloseAndOpen as $footnoteCloseAndOpen) { 121 | // replace with just a comma 122 | $string = str_replace($footnoteCloseAndOpen, ', ', $string); 123 | } 124 | 125 | return $string; 126 | } 127 | 128 | /** 129 | * Adds the given footnote text and returns its number. 130 | * 131 | * @param string $footnote 132 | * 133 | * @return int 134 | */ 135 | public function add(string $footnote): int 136 | { 137 | // just add the new footnote in case of "duplicate footnotes" feature is activated insteadof searching for any existing footnote of same content added before 138 | if ($this->settings->enableDuplicateFootnotes) { 139 | // return array size after adding which is the last footnote's number (not the array index) 140 | return array_push($this->footnotes, $footnote); 141 | } 142 | 143 | // check if given footnote already exists 144 | $key = array_search($footnote, $this->footnotes); 145 | 146 | // add the new footnote 147 | if ($key === false) { 148 | $this->footnotes[] = $footnote; 149 | $key = array_search($footnote, $this->footnotes); 150 | } 151 | 152 | // return the footnote's number (not the array index) 153 | return $key + 1; 154 | } 155 | 156 | /** 157 | * Checks if any footnote exists. 158 | * 159 | * In other words: The method returns if the collection 160 | * of footnotes is non-empty. 161 | * 162 | * @return bool 163 | */ 164 | public function exist(): bool 165 | { 166 | return !empty($this->footnotes); 167 | } 168 | 169 | /** 170 | * Returns all footnotes which could be collected by using 171 | * the filter() method. 172 | * 173 | * The footnotes' array keys begin with 1. 174 | * 175 | * @return string[] 176 | * 177 | * @see filter() 178 | */ 179 | public function get(array $options = []): array 180 | { 181 | $result = []; 182 | 183 | foreach ($this->footnotes as $key => $footnote) { 184 | $number = $key + 1; 185 | 186 | if ($this->settings->enableAnchorLinks) { 187 | $anchorAttributes = $options['anchorAttributes'] ?? []; 188 | $anchorAttrs = array_merge_recursive($anchorAttributes, ['name' => 'footnote-' . $number]); 189 | 190 | $number = Html::tag('a', $number, $anchorAttrs); 191 | } 192 | 193 | $result[$number] = $footnote; 194 | } 195 | 196 | return $result; 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /config.codekit3: -------------------------------------------------------------------------------- 1 | { 2 | "AAInfo" : "This is a CodeKit 3 project config file. EDITING THIS FILE IS A POOR LIFE DECISION. Doing so may cause CodeKit to crash and\/or corrupt your project. Several critical values in this file are 64-bit integers, which JavaScript JSON parsers do not support because JavaScript cannot handle 64-bit integers. These values will be corrupted if the file is parsed with JavaScript. This file is not backwards-compatible with CodeKit 1 or 2. For details, see https:\/\/codekitapp.com\/", 3 | "buildSteps" : [ 4 | { 5 | "name" : "Process All Remaining Files and Folders", 6 | "stepType" : 1, 7 | "uuidString" : "0A71E4CE-982C-48E9-8BA7-21E1AA92B7BF" 8 | } 9 | ], 10 | "creatorBuild" : "34518", 11 | "files" : { 12 | "\/.github\/FUNDING.yml" : { 13 | "cB" : 0, 14 | "ft" : 8192, 15 | "hM" : 0, 16 | "oA" : 0, 17 | "oAP" : "\/.github\/FUNDING.yml", 18 | "oF" : 0 19 | }, 20 | "\/.github\/ISSUE_TEMPLATE\/bug_report.yaml" : { 21 | "cB" : 0, 22 | "ft" : 8192, 23 | "hM" : 0, 24 | "oA" : 0, 25 | "oAP" : "\/.github\/ISSUE_TEMPLATE\/bug_report.yaml", 26 | "oF" : 0 27 | }, 28 | "\/.github\/ISSUE_TEMPLATE\/config.yml" : { 29 | "cB" : 0, 30 | "ft" : 8192, 31 | "hM" : 0, 32 | "oA" : 0, 33 | "oAP" : "\/.github\/ISSUE_TEMPLATE\/config.yml", 34 | "oF" : 0 35 | }, 36 | "\/.github\/ISSUE_TEMPLATE\/feature_request.yaml" : { 37 | "cB" : 0, 38 | "ft" : 8192, 39 | "hM" : 0, 40 | "oA" : 0, 41 | "oAP" : "\/.github\/ISSUE_TEMPLATE\/feature_request.yaml", 42 | "oF" : 0 43 | }, 44 | "\/.github\/ISSUE_TEMPLATE\/support_request.yaml" : { 45 | "cB" : 0, 46 | "ft" : 8192, 47 | "hM" : 0, 48 | "oA" : 0, 49 | "oAP" : "\/.github\/ISSUE_TEMPLATE\/support_request.yaml", 50 | "oF" : 0 51 | }, 52 | "\/.gitignore" : { 53 | "cB" : 0, 54 | "ft" : 8192, 55 | "hM" : 0, 56 | "oA" : 0, 57 | "oAP" : "\/.gitignore", 58 | "oF" : 0 59 | }, 60 | "\/CHANGELOG.md" : { 61 | "cB" : 0, 62 | "cS" : 0, 63 | "eF" : 1, 64 | "eL" : 1, 65 | "ema" : 1, 66 | "eSQ" : 1, 67 | "ft" : 4096, 68 | "hM" : 0, 69 | "oA" : 1, 70 | "oAP" : "\/CHANGELOG.html", 71 | "oF" : 0, 72 | "oFM" : 0, 73 | "oS" : 0, 74 | "pHT" : 0, 75 | "pME" : 1, 76 | "rFN" : 0, 77 | "uCM" : 0 78 | }, 79 | "\/composer.json" : { 80 | "ft" : 524288, 81 | "oA" : 1, 82 | "oAP" : "\/composer-min.json", 83 | "oF" : 0, 84 | "oO" : 1, 85 | "oS" : 1 86 | }, 87 | "\/docs\/.sidebar.json" : { 88 | "ft" : 524288, 89 | "oA" : 1, 90 | "oAP" : "\/docs\/.sidebar-min.json", 91 | "oF" : 0, 92 | "oO" : 1, 93 | "oS" : 1 94 | }, 95 | "\/docs\/feature-tour\/usage.md" : { 96 | "cB" : 0, 97 | "cS" : 0, 98 | "eF" : 1, 99 | "eL" : 1, 100 | "ema" : 1, 101 | "eSQ" : 1, 102 | "ft" : 4096, 103 | "hM" : 0, 104 | "oA" : 1, 105 | "oAP" : "\/docs\/feature-tour\/usage.html", 106 | "oF" : 0, 107 | "oFM" : 0, 108 | "oS" : 0, 109 | "pHT" : 0, 110 | "pME" : 1, 111 | "rFN" : 0, 112 | "uCM" : 0 113 | }, 114 | "\/docs\/get-started\/configuration.md" : { 115 | "cB" : 0, 116 | "cS" : 0, 117 | "eF" : 1, 118 | "eL" : 1, 119 | "ema" : 1, 120 | "eSQ" : 1, 121 | "ft" : 4096, 122 | "hM" : 0, 123 | "oA" : 1, 124 | "oAP" : "\/docs\/get-started\/configuration.html", 125 | "oF" : 0, 126 | "oFM" : 0, 127 | "oS" : 0, 128 | "pHT" : 0, 129 | "pME" : 1, 130 | "rFN" : 0, 131 | "uCM" : 0 132 | }, 133 | "\/docs\/get-started\/installation-setup.md" : { 134 | "cB" : 0, 135 | "cS" : 0, 136 | "eF" : 1, 137 | "eL" : 1, 138 | "ema" : 1, 139 | "eSQ" : 1, 140 | "ft" : 4096, 141 | "hM" : 0, 142 | "oA" : 1, 143 | "oAP" : "\/docs\/get-started\/installation-setup.html", 144 | "oF" : 0, 145 | "oFM" : 0, 146 | "oS" : 0, 147 | "pHT" : 0, 148 | "pME" : 1, 149 | "rFN" : 0, 150 | "uCM" : 0 151 | }, 152 | "\/docs\/get-started\/requirements.md" : { 153 | "cB" : 0, 154 | "cS" : 0, 155 | "eF" : 1, 156 | "eL" : 1, 157 | "ema" : 1, 158 | "eSQ" : 1, 159 | "ft" : 4096, 160 | "hM" : 0, 161 | "oA" : 1, 162 | "oAP" : "\/docs\/get-started\/requirements.html", 163 | "oF" : 0, 164 | "oFM" : 0, 165 | "oS" : 0, 166 | "pHT" : 0, 167 | "pME" : 1, 168 | "rFN" : 0, 169 | "uCM" : 0 170 | }, 171 | "\/docs\/README.md" : { 172 | "cB" : 0, 173 | "cS" : 0, 174 | "eF" : 1, 175 | "eL" : 1, 176 | "ema" : 1, 177 | "eSQ" : 1, 178 | "ft" : 4096, 179 | "hM" : 0, 180 | "oA" : 1, 181 | "oAP" : "\/docs\/README.html", 182 | "oF" : 0, 183 | "oFM" : 0, 184 | "oS" : 0, 185 | "pHT" : 0, 186 | "pME" : 1, 187 | "rFN" : 0, 188 | "uCM" : 0 189 | }, 190 | "\/LICENSE.md" : { 191 | "cB" : 0, 192 | "cS" : 0, 193 | "eF" : 1, 194 | "eL" : 1, 195 | "ema" : 1, 196 | "eSQ" : 1, 197 | "ft" : 4096, 198 | "hM" : 0, 199 | "oA" : 1, 200 | "oAP" : "\/LICENSE.html", 201 | "oF" : 0, 202 | "oFM" : 0, 203 | "oS" : 0, 204 | "pHT" : 0, 205 | "pME" : 1, 206 | "rFN" : 0, 207 | "uCM" : 0 208 | }, 209 | "\/README.md" : { 210 | "cB" : 0, 211 | "cS" : 0, 212 | "eF" : 1, 213 | "eL" : 1, 214 | "ema" : 1, 215 | "eSQ" : 1, 216 | "ft" : 4096, 217 | "hM" : 0, 218 | "oA" : 1, 219 | "oAP" : "\/README.html", 220 | "oF" : 0, 221 | "oFM" : 0, 222 | "oS" : 0, 223 | "pHT" : 0, 224 | "pME" : 1, 225 | "rFN" : 0, 226 | "uCM" : 0 227 | }, 228 | "\/src\/assetbundles\/CkEditorAsset.php" : { 229 | "cB" : 0, 230 | "ft" : 8192, 231 | "hM" : 0, 232 | "oA" : 0, 233 | "oAP" : "\/src\/assetbundles\/CkEditorAsset.php", 234 | "oF" : 0 235 | }, 236 | "\/src\/assetbundles\/FootnotesAsset.php" : { 237 | "cB" : 0, 238 | "ft" : 8192, 239 | "hM" : 0, 240 | "oA" : 0, 241 | "oAP" : "\/src\/assetbundles\/FootnotesAsset.php", 242 | "oF" : 0 243 | }, 244 | "\/src\/base\/PluginTrait.php" : { 245 | "cB" : 0, 246 | "ft" : 8192, 247 | "hM" : 0, 248 | "oA" : 0, 249 | "oAP" : "\/src\/base\/PluginTrait.php", 250 | "oF" : 0 251 | }, 252 | "\/src\/controllers\/BaseController.php" : { 253 | "cB" : 0, 254 | "ft" : 8192, 255 | "hM" : 0, 256 | "oA" : 0, 257 | "oAP" : "\/src\/controllers\/BaseController.php", 258 | "oF" : 0 259 | }, 260 | "\/src\/Footnotes.php" : { 261 | "cB" : 0, 262 | "ft" : 8192, 263 | "hM" : 0, 264 | "oA" : 0, 265 | "oAP" : "\/src\/Footnotes.php", 266 | "oF" : 0 267 | }, 268 | "\/src\/helpers\/Plugin.php" : { 269 | "cB" : 0, 270 | "ft" : 8192, 271 | "hM" : 0, 272 | "oA" : 0, 273 | "oAP" : "\/src\/helpers\/Plugin.php", 274 | "oF" : 0 275 | }, 276 | "\/src\/icon.svg" : { 277 | "ft" : 2097152, 278 | "miP" : 0, 279 | "oA" : 2, 280 | "oAP" : "\/src\/icon.svg", 281 | "oF" : 0, 282 | "opt" : 0, 283 | "plM" : 52780316221407, 284 | "prP" : 0 285 | }, 286 | "\/src\/models\/Settings.php" : { 287 | "cB" : 0, 288 | "ft" : 8192, 289 | "hM" : 0, 290 | "oA" : 0, 291 | "oAP" : "\/src\/models\/Settings.php", 292 | "oF" : 0 293 | }, 294 | "\/src\/resources\/ckeditor\/.gitignore" : { 295 | "cB" : 0, 296 | "ft" : 8192, 297 | "hM" : 0, 298 | "oA" : 0, 299 | "oAP" : "\/src\/resources\/ckeditor\/.gitignore", 300 | "oF" : 0 301 | }, 302 | "\/src\/resources\/ckeditor\/build\/footnotes.js" : { 303 | "bF" : 0, 304 | "ft" : 64, 305 | "ma" : 1, 306 | "mi" : 1, 307 | "oA" : 0, 308 | "oAP" : "\/src\/resources\/dist\/js\/footnotes.js", 309 | "oF" : 0, 310 | "sC" : 0, 311 | "tS" : 0 312 | }, 313 | "\/src\/resources\/ckeditor\/dist\/browser\/index-content.css" : { 314 | "aP" : 1, 315 | "bl" : 0, 316 | "ci" : 0, 317 | "co" : 0, 318 | "ft" : 16, 319 | "ma" : 0, 320 | "oA" : 0, 321 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index-content-min.css", 322 | "oF" : 0, 323 | "pg" : 0 324 | }, 325 | "\/src\/resources\/ckeditor\/dist\/browser\/index-editor.css" : { 326 | "aP" : 1, 327 | "bl" : 0, 328 | "ci" : 0, 329 | "co" : 0, 330 | "ft" : 16, 331 | "ma" : 0, 332 | "oA" : 0, 333 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index-editor-min.css", 334 | "oF" : 0, 335 | "pg" : 0 336 | }, 337 | "\/src\/resources\/ckeditor\/dist\/browser\/index.css" : { 338 | "aP" : 1, 339 | "bl" : 0, 340 | "ci" : 0, 341 | "co" : 0, 342 | "ft" : 16, 343 | "ma" : 0, 344 | "oA" : 0, 345 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index-min.css", 346 | "oF" : 0, 347 | "pg" : 0 348 | }, 349 | "\/src\/resources\/ckeditor\/dist\/browser\/index.css.map" : { 350 | "cB" : 0, 351 | "ft" : 8192, 352 | "hM" : 0, 353 | "oA" : 0, 354 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index.css.map", 355 | "oF" : 0 356 | }, 357 | "\/src\/resources\/ckeditor\/dist\/browser\/index.js" : { 358 | "bF" : 0, 359 | "ft" : 64, 360 | "ma" : 1, 361 | "mi" : 1, 362 | "oA" : 0, 363 | "oAP" : "\/src\/resources\/ckeditor\/dist\/js\/index.js", 364 | "oF" : 0, 365 | "sC" : 0, 366 | "tS" : 0 367 | }, 368 | "\/src\/resources\/ckeditor\/dist\/browser\/index.js.map" : { 369 | "cB" : 0, 370 | "ft" : 8192, 371 | "hM" : 0, 372 | "oA" : 0, 373 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index.js.map", 374 | "oF" : 0 375 | }, 376 | "\/src\/resources\/ckeditor\/dist\/browser\/index.umd.js" : { 377 | "bF" : 0, 378 | "ft" : 64, 379 | "ma" : 1, 380 | "mi" : 1, 381 | "oA" : 0, 382 | "oAP" : "\/src\/resources\/ckeditor\/dist\/js\/index.umd.js", 383 | "oF" : 0, 384 | "sC" : 0, 385 | "tS" : 0 386 | }, 387 | "\/src\/resources\/ckeditor\/dist\/browser\/index.umd.js.map" : { 388 | "cB" : 0, 389 | "ft" : 8192, 390 | "hM" : 0, 391 | "oA" : 0, 392 | "oAP" : "\/src\/resources\/ckeditor\/dist\/browser\/index.umd.js.map", 393 | "oF" : 0 394 | }, 395 | "\/src\/resources\/ckeditor\/dist\/index-content.css" : { 396 | "aP" : 1, 397 | "bl" : 0, 398 | "ci" : 0, 399 | "co" : 0, 400 | "ft" : 16, 401 | "ma" : 0, 402 | "oA" : 0, 403 | "oAP" : "\/src\/resources\/ckeditor\/dist\/index-content-min.css", 404 | "oF" : 0, 405 | "pg" : 0 406 | }, 407 | "\/src\/resources\/ckeditor\/dist\/index-editor.css" : { 408 | "aP" : 1, 409 | "bl" : 0, 410 | "ci" : 0, 411 | "co" : 0, 412 | "ft" : 16, 413 | "ma" : 0, 414 | "oA" : 0, 415 | "oAP" : "\/src\/resources\/ckeditor\/dist\/index-editor-min.css", 416 | "oF" : 0, 417 | "pg" : 0 418 | }, 419 | "\/src\/resources\/ckeditor\/dist\/index.css" : { 420 | "aP" : 1, 421 | "bl" : 0, 422 | "ci" : 0, 423 | "co" : 0, 424 | "ft" : 16, 425 | "ma" : 0, 426 | "oA" : 0, 427 | "oAP" : "\/src\/resources\/ckeditor\/dist\/index-min.css", 428 | "oF" : 0, 429 | "pg" : 0 430 | }, 431 | "\/src\/resources\/ckeditor\/dist\/index.css.map" : { 432 | "cB" : 0, 433 | "ft" : 8192, 434 | "hM" : 0, 435 | "oA" : 0, 436 | "oAP" : "\/src\/resources\/ckeditor\/dist\/index.css.map", 437 | "oF" : 0 438 | }, 439 | "\/src\/resources\/ckeditor\/dist\/index.js" : { 440 | "bF" : 0, 441 | "ft" : 64, 442 | "ma" : 1, 443 | "mi" : 1, 444 | "oA" : 0, 445 | "oAP" : "\/src\/resources\/dist\/js\/index.js", 446 | "oF" : 0, 447 | "sC" : 0, 448 | "tS" : 0 449 | }, 450 | "\/src\/resources\/ckeditor\/dist\/index.js.map" : { 451 | "cB" : 0, 452 | "ft" : 8192, 453 | "hM" : 0, 454 | "oA" : 0, 455 | "oAP" : "\/src\/resources\/ckeditor\/dist\/index.js.map", 456 | "oF" : 0 457 | }, 458 | "\/src\/resources\/ckeditor\/node_modules" : { 459 | "ft" : 65536, 460 | "oA" : 2, 461 | "oAP" : "\/src\/resources\/ckeditor\/node_modules", 462 | "oF" : 0 463 | }, 464 | "\/src\/resources\/ckeditor\/package-lock.json" : { 465 | "ft" : 524288, 466 | "oA" : 1, 467 | "oAP" : "\/src\/resources\/ckeditor\/package-lock-min.json", 468 | "oF" : 0, 469 | "oO" : 1, 470 | "oS" : 1 471 | }, 472 | "\/src\/resources\/ckeditor\/package.json" : { 473 | "ft" : 524288, 474 | "oA" : 1, 475 | "oAP" : "\/src\/resources\/ckeditor\/package-min.json", 476 | "oF" : 0, 477 | "oO" : 1, 478 | "oS" : 1 479 | }, 480 | "\/src\/resources\/ckeditor\/sample\/ckeditor.js" : { 481 | "bF" : 0, 482 | "ft" : 64, 483 | "ma" : 1, 484 | "mi" : 1, 485 | "oA" : 0, 486 | "oAP" : "\/src\/resources\/dist\/js\/ckeditor.js", 487 | "oF" : 0, 488 | "sC" : 0, 489 | "tS" : 0 490 | }, 491 | "\/src\/resources\/ckeditor\/sample\/dll.html" : { 492 | "cB" : 0, 493 | "ft" : 8192, 494 | "hM" : 0, 495 | "oA" : 0, 496 | "oAP" : "\/src\/resources\/ckeditor\/sample\/dll.html", 497 | "oF" : 0 498 | }, 499 | "\/src\/resources\/ckeditor\/sample\/index.html" : { 500 | "cB" : 0, 501 | "ft" : 8192, 502 | "hM" : 0, 503 | "oA" : 0, 504 | "oAP" : "\/src\/resources\/ckeditor\/sample\/index.html", 505 | "oF" : 0 506 | }, 507 | "\/src\/resources\/ckeditor\/src\/footnotes-editing.js" : { 508 | "bF" : 0, 509 | "ft" : 64, 510 | "ma" : 1, 511 | "mi" : 1, 512 | "oA" : 1, 513 | "oAP" : "\/src\/resources\/dist\/js\/footnotes-editing.js", 514 | "oF" : 0, 515 | "sC" : 0, 516 | "tS" : 0 517 | }, 518 | "\/src\/resources\/ckeditor\/src\/footnotes-ui.js" : { 519 | "bF" : 0, 520 | "ft" : 64, 521 | "ma" : 1, 522 | "mi" : 1, 523 | "oA" : 1, 524 | "oAP" : "\/src\/resources\/dist\/js\/footnotes-ui.js", 525 | "oF" : 0, 526 | "sC" : 0, 527 | "tS" : 0 528 | }, 529 | "\/src\/resources\/ckeditor\/src\/footnotes.js" : { 530 | "bF" : 0, 531 | "ft" : 64, 532 | "ma" : 1, 533 | "mi" : 1, 534 | "oA" : 1, 535 | "oAP" : "\/src\/resources\/dist\/js\/footnotes.js", 536 | "oF" : 0, 537 | "sC" : 0, 538 | "tS" : 0 539 | }, 540 | "\/src\/resources\/ckeditor\/src\/index.js" : { 541 | "bF" : 0, 542 | "ft" : 64, 543 | "ma" : 1, 544 | "mi" : 1, 545 | "oA" : 1, 546 | "oAP" : "\/src\/resources\/dist\/js\/index.js", 547 | "oF" : 0, 548 | "sC" : 0, 549 | "tS" : 0 550 | }, 551 | "\/src\/resources\/ckeditor\/theme\/footnotes.css" : { 552 | "aP" : 1, 553 | "bl" : 0, 554 | "ci" : 0, 555 | "co" : 0, 556 | "ft" : 16, 557 | "ma" : 0, 558 | "oA" : 0, 559 | "oAP" : "\/src\/resources\/ckeditor\/theme\/footnotes-min.css", 560 | "oF" : 0, 561 | "pg" : 0 562 | }, 563 | "\/src\/resources\/ckeditor\/theme\/icon.svg" : { 564 | "ft" : 2097152, 565 | "miP" : 0, 566 | "oA" : 2, 567 | "oAP" : "\/src\/resources\/ckeditor\/theme\/icon.svg", 568 | "oF" : 0, 569 | "opt" : 0, 570 | "plM" : 52780316221407, 571 | "prP" : 0 572 | }, 573 | "\/src\/resources\/redactor\/footnotebutton-min.js" : { 574 | "bF" : 0, 575 | "ft" : 64, 576 | "ma" : 1, 577 | "mi" : 1, 578 | "oA" : 0, 579 | "oAP" : "\/src\/dist\/js\/footnotebutton-min.js", 580 | "oF" : 0, 581 | "sC" : 0, 582 | "tS" : 0 583 | }, 584 | "\/src\/resources\/redactor\/footnotebutton.js" : { 585 | "bF" : 0, 586 | "ft" : 64, 587 | "ma" : 1, 588 | "mi" : 1, 589 | "oA" : 0, 590 | "oAP" : "\/src\/dist\/js\/footnotebutton.js", 591 | "oF" : 0, 592 | "sC" : 0, 593 | "tS" : 0 594 | }, 595 | "\/src\/services\/Service.php" : { 596 | "cB" : 0, 597 | "ft" : 8192, 598 | "hM" : 0, 599 | "oA" : 0, 600 | "oAP" : "\/src\/services\/Service.php", 601 | "oF" : 0 602 | }, 603 | "\/src\/templates\/_layouts\/index.html" : { 604 | "cB" : 0, 605 | "ft" : 8192, 606 | "hM" : 0, 607 | "oA" : 0, 608 | "oAP" : "\/src\/templates\/_layouts\/index.html", 609 | "oF" : 0 610 | }, 611 | "\/src\/templates\/settings.html" : { 612 | "cB" : 0, 613 | "ft" : 8192, 614 | "hM" : 0, 615 | "oA" : 0, 616 | "oAP" : "\/src\/templates\/settings.html", 617 | "oF" : 0 618 | }, 619 | "\/src\/translations\/de\/footnotes.php" : { 620 | "cB" : 0, 621 | "ft" : 8192, 622 | "hM" : 0, 623 | "oA" : 0, 624 | "oAP" : "\/src\/translations\/de\/footnotes.php", 625 | "oF" : 0 626 | }, 627 | "\/src\/translations\/en\/footnotes.php" : { 628 | "cB" : 0, 629 | "ft" : 8192, 630 | "hM" : 0, 631 | "oA" : 0, 632 | "oAP" : "\/src\/translations\/en\/footnotes.php", 633 | "oF" : 0 634 | }, 635 | "\/src\/twigextensions\/Extension.php" : { 636 | "cB" : 0, 637 | "ft" : 8192, 638 | "hM" : 0, 639 | "oA" : 0, 640 | "oAP" : "\/src\/twigextensions\/Extension.php", 641 | "oF" : 0 642 | } 643 | }, 644 | "hooks" : [ 645 | 646 | ], 647 | "manualImportLinks" : { 648 | 649 | }, 650 | "projectAttributes" : { 651 | "creationDate" : 713858726.50520205, 652 | "displayValue" : "footnotes", 653 | "displayValueWasSetByUser" : 0, 654 | "iconImageName" : "brackets-cafe", 655 | "iconImageWasSetByUser" : 0 656 | }, 657 | "projectSettings" : { 658 | "abortBuildOnError" : 1, 659 | "allowInjectionReloads" : 1, 660 | "alwaysUseExternalServer" : 0, 661 | "animateCSSInjections" : 0, 662 | "autoBuildNewItems" : 1, 663 | "autoprefixerEnableIEGrid" : 0, 664 | "babel7PresetType" : 1, 665 | "babelAllowRCFiles" : 0, 666 | "babelAuxiliaryCommentAfter" : "", 667 | "babelAuxiliaryCommentBefore" : "", 668 | "babelConfigType" : 0, 669 | "babelCustomPluginsList" : "", 670 | "babelCustomPresetsList" : "", 671 | "babelExcludeString" : "\/\\\/node_modules\\\/\/, \/\\\/core-js\\\/\/, \/\\\/bower_components\\\/\/", 672 | "babelInsertModuleIDs" : 0, 673 | "babelModuleID" : "", 674 | "babelNoComments" : 0, 675 | "babelPlugins" : { 676 | "arrow-functions" : { 677 | "active" : 0 678 | }, 679 | "async-generator-functions" : { 680 | "active" : 0 681 | }, 682 | "async-to-generator" : { 683 | "active" : 0 684 | }, 685 | "block-scoped-functions" : { 686 | "active" : 0 687 | }, 688 | "block-scoping" : { 689 | "active" : 0 690 | }, 691 | "class-properties" : { 692 | "active" : 0 693 | }, 694 | "classes" : { 695 | "active" : 0 696 | }, 697 | "computed-properties" : { 698 | "active" : 0 699 | }, 700 | "decorators" : { 701 | "active" : 0 702 | }, 703 | "destructuring" : { 704 | "active" : 0 705 | }, 706 | "do-expressions" : { 707 | "active" : 0 708 | }, 709 | "dotall-regex" : { 710 | "active" : 0 711 | }, 712 | "duplicate-keys" : { 713 | "active" : 0 714 | }, 715 | "exponentiation-operator" : { 716 | "active" : 0 717 | }, 718 | "export-default-from" : { 719 | "active" : 0 720 | }, 721 | "export-namespace-from" : { 722 | "active" : 0 723 | }, 724 | "external-helpers" : { 725 | "active" : 0 726 | }, 727 | "flow-strip-types" : { 728 | "active" : 0 729 | }, 730 | "for-of" : { 731 | "active" : 0 732 | }, 733 | "function-bind" : { 734 | "active" : 0 735 | }, 736 | "function-name" : { 737 | "active" : 0 738 | }, 739 | "function-sent" : { 740 | "active" : 0 741 | }, 742 | "inline-consecutive-adds" : { 743 | "active" : 0 744 | }, 745 | "inline-environment-variables" : { 746 | "active" : 0 747 | }, 748 | "instanceof" : { 749 | "active" : 0 750 | }, 751 | "jscript" : { 752 | "active" : 0 753 | }, 754 | "literals" : { 755 | "active" : 0 756 | }, 757 | "logical-assignment-operators" : { 758 | "active" : 0 759 | }, 760 | "member-expression-literals" : { 761 | "active" : 0 762 | }, 763 | "merge-sibling-variables" : { 764 | "active" : 0 765 | }, 766 | "minify-booleans" : { 767 | "active" : 0 768 | }, 769 | "minify-builtins" : { 770 | "active" : 0 771 | }, 772 | "minify-constant-folding" : { 773 | "active" : 0 774 | }, 775 | "minify-dead-code-elimination" : { 776 | "active" : 0 777 | }, 778 | "minify-flip-comparisons" : { 779 | "active" : 0 780 | }, 781 | "minify-guarded-expressions" : { 782 | "active" : 0 783 | }, 784 | "minify-infinity" : { 785 | "active" : 0 786 | }, 787 | "minify-mangle-names" : { 788 | "active" : 0 789 | }, 790 | "minify-numeric-literals" : { 791 | "active" : 0 792 | }, 793 | "minify-simplify" : { 794 | "active" : 0 795 | }, 796 | "minify-type-constructors" : { 797 | "active" : 0 798 | }, 799 | "modules-amd" : { 800 | "active" : 0 801 | }, 802 | "modules-commonjs" : { 803 | "active" : 0 804 | }, 805 | "modules-systemjs" : { 806 | "active" : 0 807 | }, 808 | "modules-umd" : { 809 | "active" : 0 810 | }, 811 | "named-capturing-groups-regex" : { 812 | "active" : 0 813 | }, 814 | "new-target" : { 815 | "active" : 0 816 | }, 817 | "node-env-inline" : { 818 | "active" : 0 819 | }, 820 | "nullish-coalescing-operator" : { 821 | "active" : 0 822 | }, 823 | "numeric-separator" : { 824 | "active" : 0 825 | }, 826 | "object-assign" : { 827 | "active" : 0 828 | }, 829 | "object-rest-spread" : { 830 | "active" : 0 831 | }, 832 | "object-set-prototype-of-to-assign" : { 833 | "active" : 0 834 | }, 835 | "object-super" : { 836 | "active" : 0 837 | }, 838 | "optional-catch-binding" : { 839 | "active" : 0 840 | }, 841 | "optional-chaining" : { 842 | "active" : 0 843 | }, 844 | "parameters" : { 845 | "active" : 0 846 | }, 847 | "partial-application" : { 848 | "active" : 0 849 | }, 850 | "pipeline-operator" : { 851 | "active" : 0 852 | }, 853 | "private-methods" : { 854 | "active" : 0 855 | }, 856 | "property-literals" : { 857 | "active" : 0 858 | }, 859 | "property-mutators" : { 860 | "active" : 0 861 | }, 862 | "proto-to-assign" : { 863 | "active" : 0 864 | }, 865 | "react-constant-elements" : { 866 | "active" : 0 867 | }, 868 | "react-display-name" : { 869 | "active" : 0 870 | }, 871 | "react-inline-elements" : { 872 | "active" : 0 873 | }, 874 | "react-jsx" : { 875 | "active" : 0 876 | }, 877 | "react-jsx-compat" : { 878 | "active" : 0 879 | }, 880 | "react-jsx-self" : { 881 | "active" : 0 882 | }, 883 | "react-jsx-source" : { 884 | "active" : 0 885 | }, 886 | "regenerator" : { 887 | "active" : 0 888 | }, 889 | "regexp-constructors" : { 890 | "active" : 0 891 | }, 892 | "remove-console" : { 893 | "active" : 0 894 | }, 895 | "remove-debugger" : { 896 | "active" : 0 897 | }, 898 | "remove-undefined" : { 899 | "active" : 0 900 | }, 901 | "reserved-words" : { 902 | "active" : 0 903 | }, 904 | "runtime" : { 905 | "active" : 0 906 | }, 907 | "shorthand-properties" : { 908 | "active" : 0 909 | }, 910 | "simplify-comparison-operators" : { 911 | "active" : 0 912 | }, 913 | "spread" : { 914 | "active" : 0 915 | }, 916 | "sticky-regex" : { 917 | "active" : 0 918 | }, 919 | "strict-mode" : { 920 | "active" : 0 921 | }, 922 | "template-literals" : { 923 | "active" : 0 924 | }, 925 | "throw-expressions" : { 926 | "active" : 0 927 | }, 928 | "typeof-symbol" : { 929 | "active" : 0 930 | }, 931 | "undefined-to-void" : { 932 | "active" : 0 933 | }, 934 | "unicode-property-regex" : { 935 | "active" : 0 936 | }, 937 | "unicode-regex" : { 938 | "active" : 0 939 | } 940 | }, 941 | "babelRetainLines" : 0, 942 | "babelUseBuiltInsType" : 0, 943 | "bowerAbbreviatedPath" : "bower_components", 944 | "bowerForceLatestOnConflict" : 1, 945 | "bowerTargetDependencyListType" : 1, 946 | "bowerUseExactVersion" : 0, 947 | "browserRefreshDelay" : 0, 948 | "browserslistString" : ">0.2%, last 2 versions, Firefox ESR, not dead", 949 | "buildEnvironment" : 0, 950 | "buildFolderActive" : 0, 951 | "buildFolderName" : "build", 952 | "cleanBuild" : 1, 953 | "cssoForceMediaMerge" : 0, 954 | "cssoRestructure" : 1, 955 | "environmentVariableEntries" : [ 956 | "NODE_ENV:::production" 957 | ], 958 | "esLintConfigFileHandlingType" : 0, 959 | "esLintECMAVersion" : 7, 960 | "esLintEnvironmentsMask" : 1, 961 | "esLintRules" : { 962 | "accessor-pairs" : { 963 | "active" : 0, 964 | "optionString" : "{'setWithoutGet': true, 'getWithoutSet': false, 'enforceForClassMembers': true}" 965 | }, 966 | "array-bracket-newline" : { 967 | "active" : 0, 968 | "optionString" : "{'multiline': true, 'minItems': null}" 969 | }, 970 | "array-bracket-spacing" : { 971 | "active" : 0, 972 | "optionString" : "'never', {'singleValue': false, 'objectsInArrays': false, 'arraysInArrays': false}" 973 | }, 974 | "array-callback-return" : { 975 | "active" : 0, 976 | "optionString" : "{'allowImplicit': false}" 977 | }, 978 | "array-element-newline" : { 979 | "active" : 0, 980 | "optionString" : "'always'" 981 | }, 982 | "arrow-body-style" : { 983 | "active" : 0, 984 | "optionString" : "'as-needed', {'requireReturnForObjectLiteral': false}" 985 | }, 986 | "arrow-parens" : { 987 | "active" : 0, 988 | "optionString" : "'always'" 989 | }, 990 | "arrow-spacing" : { 991 | "active" : 0, 992 | "optionString" : "{'before': true, 'after': true}" 993 | }, 994 | "block-scoped-var" : { 995 | "active" : 0 996 | }, 997 | "block-spacing" : { 998 | "active" : 0, 999 | "optionString" : "'always'" 1000 | }, 1001 | "brace-style" : { 1002 | "active" : 0, 1003 | "optionString" : "'1tbs', {'allowSingleLine': true}" 1004 | }, 1005 | "camelcase" : { 1006 | "active" : 0, 1007 | "optionString" : "{'properties': 'always', 'ignoreDestructuring': false, 'ignoreImports': false}" 1008 | }, 1009 | "capitalized-comments" : { 1010 | "active" : 0, 1011 | "optionString" : "'always', {'ignoreInlineComments': false, 'ignoreConsecutiveComments': false}" 1012 | }, 1013 | "class-methods-use-this" : { 1014 | "active" : 0, 1015 | "optionString" : "{'exceptMethods': [], 'enforceForClassFields': true}" 1016 | }, 1017 | "comma-dangle" : { 1018 | "active" : 1, 1019 | "optionString" : "'never'" 1020 | }, 1021 | "comma-spacing" : { 1022 | "active" : 0, 1023 | "optionString" : "{'before': false, 'after': true}" 1024 | }, 1025 | "comma-style" : { 1026 | "active" : 0, 1027 | "optionString" : "'last'" 1028 | }, 1029 | "complexity" : { 1030 | "active" : 0, 1031 | "optionString" : "20" 1032 | }, 1033 | "computed-property-spacing" : { 1034 | "active" : 0, 1035 | "optionString" : "'never', {'enforceForClassMembers': true}" 1036 | }, 1037 | "consistent-return" : { 1038 | "active" : 0, 1039 | "optionString" : "{'treatUndefinedAsUnspecified': false}" 1040 | }, 1041 | "consistent-this" : { 1042 | "active" : 0, 1043 | "optionString" : "'that'" 1044 | }, 1045 | "constructor-super" : { 1046 | "active" : 1 1047 | }, 1048 | "curly" : { 1049 | "active" : 0, 1050 | "optionString" : "'all'" 1051 | }, 1052 | "default-case" : { 1053 | "active" : 0 1054 | }, 1055 | "default-case-last" : { 1056 | "active" : 0 1057 | }, 1058 | "default-param-last" : { 1059 | "active" : 0 1060 | }, 1061 | "dot-location" : { 1062 | "active" : 0, 1063 | "optionString" : "'object'" 1064 | }, 1065 | "dot-notation" : { 1066 | "active" : 0, 1067 | "optionString" : "{'allowKeywords': false}" 1068 | }, 1069 | "eol-last" : { 1070 | "active" : 0, 1071 | "optionString" : "'always'" 1072 | }, 1073 | "eqeqeq" : { 1074 | "active" : 0, 1075 | "optionString" : "'always', {'null': 'always'}" 1076 | }, 1077 | "for-direction" : { 1078 | "active" : 1 1079 | }, 1080 | "func-call-spacing" : { 1081 | "active" : 0, 1082 | "optionString" : "'never'" 1083 | }, 1084 | "func-name-matching" : { 1085 | "active" : 0, 1086 | "optionString" : "'always', {'considerPropertyDescriptor': false, 'includeCommonJSModuleExports': false}" 1087 | }, 1088 | "func-names" : { 1089 | "active" : 0, 1090 | "optionString" : "'always', {'generators': 'always'}" 1091 | }, 1092 | "func-style" : { 1093 | "active" : 0, 1094 | "optionString" : "'expression'" 1095 | }, 1096 | "function-call-argument-newline" : { 1097 | "active" : 0, 1098 | "optionString" : "'always'" 1099 | }, 1100 | "function-paren-newline" : { 1101 | "active" : 0, 1102 | "optionString" : "'multiline'" 1103 | }, 1104 | "generator-star-spacing" : { 1105 | "active" : 0, 1106 | "optionString" : "{'before': true, 'after': false}" 1107 | }, 1108 | "getter-return" : { 1109 | "active" : 1, 1110 | "optionString" : "{'allowImplicit': false}" 1111 | }, 1112 | "grouped-accessor-pairs" : { 1113 | "active" : 0, 1114 | "optionString" : "'anyOrder'" 1115 | }, 1116 | "guard-for-in" : { 1117 | "active" : 0 1118 | }, 1119 | "id-denylist" : { 1120 | "active" : 0, 1121 | "optionString" : "'data', 'err', 'e', 'cb', 'callback'" 1122 | }, 1123 | "id-length" : { 1124 | "active" : 0, 1125 | "optionString" : "{'min': 2, 'max': 1000, 'properties': 'always', 'exceptions': ['x', 'i', 'y']}" 1126 | }, 1127 | "id-match" : { 1128 | "active" : 0, 1129 | "optionString" : "'^[a-z]+([A-Z][a-z]+)*$', {'properties': false, 'onlyDeclarations': true, 'ignoreDestructuring': false}" 1130 | }, 1131 | "implicit-arrow-linebreak" : { 1132 | "active" : 0, 1133 | "optionString" : "'beside'" 1134 | }, 1135 | "indent" : { 1136 | "active" : 0, 1137 | "optionString" : "4, {'SwitchCase': 0, 'VariableDeclarator': 1, 'outerIIFEBody': 1 }" 1138 | }, 1139 | "init-declarations" : { 1140 | "active" : 0, 1141 | "optionString" : "'always', {'ignoreForLoopInit': true}" 1142 | }, 1143 | "jsx-quotes" : { 1144 | "active" : 0, 1145 | "optionString" : "'prefer-double'" 1146 | }, 1147 | "key-spacing" : { 1148 | "active" : 0, 1149 | "optionString" : "{'singleLine': {'beforeColon': false, 'afterColon': true, 'mode':'strict'}, 'multiLine': {'beforeColon': false, 'afterColon': true, 'align': 'value', 'mode':'minimum'}}" 1150 | }, 1151 | "keyword-spacing" : { 1152 | "active" : 0, 1153 | "optionString" : "{'before': true, 'after': true, 'overrides': {}}" 1154 | }, 1155 | "line-comment-position" : { 1156 | "active" : 0, 1157 | "optionString" : "{'position': 'above'}" 1158 | }, 1159 | "linebreak-style" : { 1160 | "active" : 0, 1161 | "optionString" : "'unix'" 1162 | }, 1163 | "lines-around-comment" : { 1164 | "active" : 0, 1165 | "optionString" : "{'beforeBlockComment': true}" 1166 | }, 1167 | "lines-between-class-members" : { 1168 | "active" : 0, 1169 | "optionString" : "'always', {exceptAfterSingleLine: false}" 1170 | }, 1171 | "logical-assignment-operators" : { 1172 | "active" : 0, 1173 | "optionString" : "'always', {'enforceForIfStatements': false}" 1174 | }, 1175 | "max-classes-per-file" : { 1176 | "active" : 0, 1177 | "optionString" : "{'ignoreExpressions': false, 'max': 1}" 1178 | }, 1179 | "max-depth" : { 1180 | "active" : 0, 1181 | "optionString" : "{'max': 4}" 1182 | }, 1183 | "max-len" : { 1184 | "active" : 0, 1185 | "optionString" : "{'code': 80, 'comments': 80, 'tabWidth': 4, 'ignoreUrls': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true, 'ignoreRegExpLiterals': true}" 1186 | }, 1187 | "max-lines" : { 1188 | "active" : 0, 1189 | "optionString" : "{'max': 300, 'skipBlankLines': true, 'skipComments': true}" 1190 | }, 1191 | "max-lines-per-function" : { 1192 | "active" : 0, 1193 | "optionString" : "{'max': 50, 'skipBlankLines': true, 'skipComments': true, 'IIFEs': false}" 1194 | }, 1195 | "max-nested-callbacks" : { 1196 | "active" : 0, 1197 | "optionString" : "{'max': 10}" 1198 | }, 1199 | "max-params" : { 1200 | "active" : 0, 1201 | "optionString" : "{'max': 4}" 1202 | }, 1203 | "max-statements" : { 1204 | "active" : 0, 1205 | "optionString" : "{'max': 10}, {'ignoreTopLevelFunctions': true}" 1206 | }, 1207 | "max-statements-per-line" : { 1208 | "active" : 0, 1209 | "optionString" : "{'max': 1}" 1210 | }, 1211 | "multiline-comment-style" : { 1212 | "active" : 0, 1213 | "optionString" : "'starred-block'" 1214 | }, 1215 | "multiline-ternary" : { 1216 | "active" : 0, 1217 | "optionString" : "'always'" 1218 | }, 1219 | "new-cap" : { 1220 | "active" : 0, 1221 | "optionString" : "{'newIsCap': true, 'capIsNew': true, 'newIsCapExceptions': [], 'capIsNewExceptions': ['Array', 'Boolean', 'Date', 'Error', 'Function', 'Number', 'Object', 'RegExp', 'String', 'Symbol'], 'properties': true}" 1222 | }, 1223 | "new-parens" : { 1224 | "active" : 0, 1225 | "optionString" : "'always'" 1226 | }, 1227 | "newline-per-chained-call" : { 1228 | "active" : 0, 1229 | "optionString" : "{'ignoreChainWithDepth': 2}" 1230 | }, 1231 | "no-alert" : { 1232 | "active" : 0 1233 | }, 1234 | "no-array-constructor" : { 1235 | "active" : 0 1236 | }, 1237 | "no-async-promise-executor" : { 1238 | "active" : 1 1239 | }, 1240 | "no-await-in-loop" : { 1241 | "active" : 0 1242 | }, 1243 | "no-bitwise" : { 1244 | "active" : 0, 1245 | "optionString" : "{'allow': ['~'], 'int32Hint': true}" 1246 | }, 1247 | "no-caller" : { 1248 | "active" : 0 1249 | }, 1250 | "no-case-declarations" : { 1251 | "active" : 1 1252 | }, 1253 | "no-class-assign" : { 1254 | "active" : 1 1255 | }, 1256 | "no-compare-neg-zero" : { 1257 | "active" : 0 1258 | }, 1259 | "no-cond-assign" : { 1260 | "active" : 1, 1261 | "optionString" : "'except-parens'" 1262 | }, 1263 | "no-confusing-arrow" : { 1264 | "active" : 0, 1265 | "optionString" : "{'allowParens': true, 'onlyOneSimpleParam': false}" 1266 | }, 1267 | "no-console" : { 1268 | "active" : 1, 1269 | "optionString" : "{'allow': ['warn', 'error']}" 1270 | }, 1271 | "no-const-assign" : { 1272 | "active" : 1 1273 | }, 1274 | "no-constant-binary-expression" : { 1275 | "active" : 0 1276 | }, 1277 | "no-constant-condition" : { 1278 | "active" : 1, 1279 | "optionString" : "{'checkLoops': true}" 1280 | }, 1281 | "no-constructor-return" : { 1282 | "active" : 0 1283 | }, 1284 | "no-continue" : { 1285 | "active" : 0 1286 | }, 1287 | "no-control-regex" : { 1288 | "active" : 1 1289 | }, 1290 | "no-debugger" : { 1291 | "active" : 1 1292 | }, 1293 | "no-delete-var" : { 1294 | "active" : 1 1295 | }, 1296 | "no-div-regex" : { 1297 | "active" : 0 1298 | }, 1299 | "no-dupe-args" : { 1300 | "active" : 1 1301 | }, 1302 | "no-dupe-class-members" : { 1303 | "active" : 1 1304 | }, 1305 | "no-dupe-else-if" : { 1306 | "active" : 1 1307 | }, 1308 | "no-dupe-keys" : { 1309 | "active" : 1 1310 | }, 1311 | "no-duplicate-case" : { 1312 | "active" : 1 1313 | }, 1314 | "no-duplicate-imports" : { 1315 | "active" : 0, 1316 | "optionString" : "{'includeExports': false}" 1317 | }, 1318 | "no-else-return" : { 1319 | "active" : 0 1320 | }, 1321 | "no-empty" : { 1322 | "active" : 1, 1323 | "optionString" : "{'allowEmptyCatch': false}" 1324 | }, 1325 | "no-empty-character-class" : { 1326 | "active" : 1 1327 | }, 1328 | "no-empty-function" : { 1329 | "active" : 0, 1330 | "optionString" : "{'allow': []}" 1331 | }, 1332 | "no-empty-pattern" : { 1333 | "active" : 1 1334 | }, 1335 | "no-empty-static-block" : { 1336 | "active" : 0 1337 | }, 1338 | "no-eq-null" : { 1339 | "active" : 0 1340 | }, 1341 | "no-eval" : { 1342 | "active" : 0, 1343 | "optionString" : "{'allowIndirect': false}" 1344 | }, 1345 | "no-ex-assign" : { 1346 | "active" : 1 1347 | }, 1348 | "no-extend-native" : { 1349 | "active" : 0, 1350 | "optionString" : "{'exceptions': []}" 1351 | }, 1352 | "no-extra-bind" : { 1353 | "active" : 0 1354 | }, 1355 | "no-extra-boolean-cast" : { 1356 | "active" : 1 1357 | }, 1358 | "no-extra-label" : { 1359 | "active" : 0 1360 | }, 1361 | "no-extra-parens" : { 1362 | "active" : 0, 1363 | "optionString" : "'all'" 1364 | }, 1365 | "no-extra-semi" : { 1366 | "active" : 1 1367 | }, 1368 | "no-fallthrough" : { 1369 | "active" : 1, 1370 | "optionString" : "{'allowEmptyCase': false}" 1371 | }, 1372 | "no-floating-decimal" : { 1373 | "active" : 0 1374 | }, 1375 | "no-func-assign" : { 1376 | "active" : 1 1377 | }, 1378 | "no-global-assign" : { 1379 | "active" : 1, 1380 | "optionString" : "{'exceptions': []}" 1381 | }, 1382 | "no-implicit-coercion" : { 1383 | "active" : 0, 1384 | "optionString" : "{'boolean': true, 'number': true, 'string': true, 'disallowTemplateShorthand': false, 'allow': []}" 1385 | }, 1386 | "no-implicit-globals" : { 1387 | "active" : 0 1388 | }, 1389 | "no-implied-eval" : { 1390 | "active" : 0 1391 | }, 1392 | "no-import-assign" : { 1393 | "active" : 1 1394 | }, 1395 | "no-inline-comments" : { 1396 | "active" : 0 1397 | }, 1398 | "no-inner-declarations" : { 1399 | "active" : 1, 1400 | "optionString" : "'functions'" 1401 | }, 1402 | "no-invalid-regexp" : { 1403 | "active" : 1, 1404 | "optionString" : "{'allowConstructorFlags': ['u', 'y']}" 1405 | }, 1406 | "no-invalid-this" : { 1407 | "active" : 0, 1408 | "optionString" : "{'capIsConstructor': true}" 1409 | }, 1410 | "no-irregular-whitespace" : { 1411 | "active" : 1, 1412 | "optionString" : "{'skipStrings': true, 'skipComments': false, 'skipRegExps': true, 'skipTemplates': true}" 1413 | }, 1414 | "no-iterator" : { 1415 | "active" : 0 1416 | }, 1417 | "no-label-var" : { 1418 | "active" : 0 1419 | }, 1420 | "no-labels" : { 1421 | "active" : 0, 1422 | "optionString" : "{'allowLoop': false, 'allowSwitch': false}" 1423 | }, 1424 | "no-lone-blocks" : { 1425 | "active" : 0 1426 | }, 1427 | "no-lonely-if" : { 1428 | "active" : 0 1429 | }, 1430 | "no-loop-func" : { 1431 | "active" : 0 1432 | }, 1433 | "no-loss-of-precision" : { 1434 | "active" : 1 1435 | }, 1436 | "no-magic-numbers" : { 1437 | "active" : 0, 1438 | "optionString" : "{'ignore': [], 'ignoreArrayIndexes': true, 'ignoreDefaultValues': false, 'enforceConst': false, 'detectObjects': false}" 1439 | }, 1440 | "no-misleading-character-class" : { 1441 | "active" : 0 1442 | }, 1443 | "no-mixed-operators" : { 1444 | "active" : 0, 1445 | "optionString" : "{'groups': [['+', '-', '*', '\/', '%', '**'], ['&', '|', '^', '~', '<<', '>>', '>>>'], ['==', '!=', '===', '!==', '>', '>=', '<', '<='], ['&&', '||'], ['in', 'instanceof']], 'allowSamePrecedence': true}" 1446 | }, 1447 | "no-mixed-spaces-and-tabs" : { 1448 | "active" : 1, 1449 | "optionString" : "" 1450 | }, 1451 | "no-multi-assign" : { 1452 | "active" : 0, 1453 | "optionString" : "{'ignoreNonDeclaration': false}" 1454 | }, 1455 | "no-multi-spaces" : { 1456 | "active" : 0, 1457 | "optionString" : "{'exceptions': {'Property': true, 'BinaryExpression': false, 'VariableDeclarator': false, 'ImportDeclaration': false}}" 1458 | }, 1459 | "no-multi-str" : { 1460 | "active" : 0 1461 | }, 1462 | "no-multiple-empty-lines" : { 1463 | "active" : 0, 1464 | "optionString" : "{'max': 2, 'maxBOF': 2, 'maxEOF': 2}" 1465 | }, 1466 | "no-negated-condition" : { 1467 | "active" : 0 1468 | }, 1469 | "no-nested-ternary" : { 1470 | "active" : 0 1471 | }, 1472 | "no-new" : { 1473 | "active" : 0 1474 | }, 1475 | "no-new-func" : { 1476 | "active" : 0 1477 | }, 1478 | "no-new-native-nonconstructor" : { 1479 | "active" : 0 1480 | }, 1481 | "no-new-object" : { 1482 | "active" : 0 1483 | }, 1484 | "no-new-symbol" : { 1485 | "active" : 1 1486 | }, 1487 | "no-new-wrappers" : { 1488 | "active" : 0 1489 | }, 1490 | "no-nonoctal-decimal-escape" : { 1491 | "active" : 1 1492 | }, 1493 | "no-obj-calls" : { 1494 | "active" : 1 1495 | }, 1496 | "no-octal" : { 1497 | "active" : 1 1498 | }, 1499 | "no-octal-escape" : { 1500 | "active" : 0 1501 | }, 1502 | "no-param-reassign" : { 1503 | "active" : 0, 1504 | "optionString" : "{'props': false}" 1505 | }, 1506 | "no-plusplus" : { 1507 | "active" : 0, 1508 | "optionString" : "{'allowForLoopAfterthoughts': false}" 1509 | }, 1510 | "no-promise-executor-return" : { 1511 | "active" : 0 1512 | }, 1513 | "no-proto" : { 1514 | "active" : 0 1515 | }, 1516 | "no-prototype-builtins" : { 1517 | "active" : 1 1518 | }, 1519 | "no-redeclare" : { 1520 | "active" : 1, 1521 | "optionString" : "{'builtinGlobals': false}" 1522 | }, 1523 | "no-regex-spaces" : { 1524 | "active" : 1 1525 | }, 1526 | "no-restricted-exports" : { 1527 | "active" : 0, 1528 | "optionString" : "{'restrictedNamedExports': []}" 1529 | }, 1530 | "no-restricted-globals" : { 1531 | "active" : 0, 1532 | "optionString" : "'event', 'fdescribe'" 1533 | }, 1534 | "no-restricted-imports" : { 1535 | "active" : 0, 1536 | "optionString" : "" 1537 | }, 1538 | "no-restricted-properties" : { 1539 | "active" : 0, 1540 | "optionString" : "[{'object': 'disallowedObjectName', 'property': 'disallowedPropertyName'}, {'object': 'disallowedObjectName', 'property': 'anotherDisallowedPropertyName', 'message': 'Please use allowedObjectName.allowedPropertyName.'}]" 1541 | }, 1542 | "no-restricted-syntax" : { 1543 | "active" : 0, 1544 | "optionString" : "'FunctionExpression', 'WithStatement'" 1545 | }, 1546 | "no-return-assign" : { 1547 | "active" : 0, 1548 | "optionString" : "'except-parens'" 1549 | }, 1550 | "no-script-url" : { 1551 | "active" : 0 1552 | }, 1553 | "no-self-assign" : { 1554 | "active" : 1, 1555 | "optionString" : "{'props': true}" 1556 | }, 1557 | "no-self-compare" : { 1558 | "active" : 0 1559 | }, 1560 | "no-sequences" : { 1561 | "active" : 0, 1562 | "optionString" : "{'allowInParentheses': true}" 1563 | }, 1564 | "no-setter-return" : { 1565 | "active" : 1 1566 | }, 1567 | "no-shadow" : { 1568 | "active" : 0, 1569 | "optionString" : "{'builtinGlobals': false, 'hoist': 'functions', 'allow': [], 'ignoreOnInitialization': false}" 1570 | }, 1571 | "no-shadow-restricted-names" : { 1572 | "active" : 1 1573 | }, 1574 | "no-sparse-arrays" : { 1575 | "active" : 1 1576 | }, 1577 | "no-tabs" : { 1578 | "active" : 0, 1579 | "optionString" : "{allowIndentationTabs: false}" 1580 | }, 1581 | "no-template-curly-in-string" : { 1582 | "active" : 0 1583 | }, 1584 | "no-ternary" : { 1585 | "active" : 0 1586 | }, 1587 | "no-this-before-super" : { 1588 | "active" : 1 1589 | }, 1590 | "no-throw-literal" : { 1591 | "active" : 0 1592 | }, 1593 | "no-trailing-spaces" : { 1594 | "active" : 0, 1595 | "optionString" : "{'skipBlankLines': false, 'ignoreComments': false}" 1596 | }, 1597 | "no-undef" : { 1598 | "active" : 1, 1599 | "optionString" : "{'typeof': false}" 1600 | }, 1601 | "no-undef-init" : { 1602 | "active" : 0 1603 | }, 1604 | "no-undefined" : { 1605 | "active" : 0 1606 | }, 1607 | "no-underscore-dangle" : { 1608 | "active" : 0, 1609 | "optionString" : "{'allow': [], 'allowAfterThis': false, 'allowAfterSuper': false, 'allowAfterThisConstructor': false, 'enforceInMethodNames': false, 'allowFunctionParams': true}" 1610 | }, 1611 | "no-unexpected-multiline" : { 1612 | "active" : 1 1613 | }, 1614 | "no-unmodified-loop-condition" : { 1615 | "active" : 0 1616 | }, 1617 | "no-unneeded-ternary" : { 1618 | "active" : 0, 1619 | "optionString" : "{'defaultAssignment': true}" 1620 | }, 1621 | "no-unreachable" : { 1622 | "active" : 1 1623 | }, 1624 | "no-unreachable-loop" : { 1625 | "active" : 0, 1626 | "optionString" : "{'ignore': []}" 1627 | }, 1628 | "no-unsafe-finally" : { 1629 | "active" : 1 1630 | }, 1631 | "no-unsafe-negation" : { 1632 | "active" : 1, 1633 | "optionString" : "{'enforceForOrderingRelations': false}" 1634 | }, 1635 | "no-unsafe-optional-chaining" : { 1636 | "active" : 1, 1637 | "optionString" : "{'disallowArithmeticOperators': false}" 1638 | }, 1639 | "no-unused-expressions" : { 1640 | "active" : 0, 1641 | "optionString" : "{'allowShortCircuit': false, 'allowTernary': false, 'allowTaggedTemplates': false, 'enforceForJSX': false}" 1642 | }, 1643 | "no-unused-labels" : { 1644 | "active" : 1 1645 | }, 1646 | "no-unused-private-class-members" : { 1647 | "active" : 0 1648 | }, 1649 | "no-unused-vars" : { 1650 | "active" : 1, 1651 | "optionString" : "{'vars': 'all', 'args': 'after-used', 'caughtErrors': 'none', 'ignoreRestSiblings': false}" 1652 | }, 1653 | "no-use-before-define" : { 1654 | "active" : 0, 1655 | "optionString" : "{'functions': true, 'classes': true, 'variables': true}" 1656 | }, 1657 | "no-useless-backreference" : { 1658 | "active" : 1 1659 | }, 1660 | "no-useless-call" : { 1661 | "active" : 0 1662 | }, 1663 | "no-useless-catch" : { 1664 | "active" : 1 1665 | }, 1666 | "no-useless-computed-key" : { 1667 | "active" : 0, 1668 | "optionString" : "{'enforceForClassMembers': false}" 1669 | }, 1670 | "no-useless-concat" : { 1671 | "active" : 0 1672 | }, 1673 | "no-useless-constructor" : { 1674 | "active" : 0 1675 | }, 1676 | "no-useless-escape" : { 1677 | "active" : 1 1678 | }, 1679 | "no-useless-rename" : { 1680 | "active" : 0, 1681 | "optionString" : "{'ignoreDestructuring': false, 'ignoreImport': false, 'ignoreExport': false}" 1682 | }, 1683 | "no-useless-return" : { 1684 | "active" : 0 1685 | }, 1686 | "no-var" : { 1687 | "active" : 0 1688 | }, 1689 | "no-void" : { 1690 | "active" : 0, 1691 | "optionString" : "{'allowAsStatement': false}" 1692 | }, 1693 | "no-warning-comments" : { 1694 | "active" : 0, 1695 | "optionString" : "{'terms': ['todo', 'fixme', 'xxx'], 'location': 'start'}" 1696 | }, 1697 | "no-whitespace-before-property" : { 1698 | "active" : 0 1699 | }, 1700 | "no-with" : { 1701 | "active" : 1 1702 | }, 1703 | "nonblock-statement-body-position" : { 1704 | "active" : 0, 1705 | "optionString" : "'beside'" 1706 | }, 1707 | "object-curly-newline" : { 1708 | "active" : 0, 1709 | "optionString" : "{'ObjectExpression': {'multiline': true, 'consistent': true}, 'ObjectPattern': {'multiline': true, 'consistent': true}}" 1710 | }, 1711 | "object-curly-spacing" : { 1712 | "active" : 0, 1713 | "optionString" : "'never'" 1714 | }, 1715 | "object-property-newline" : { 1716 | "active" : 0, 1717 | "optionString" : "{'allowAllPropertiesOnSameLine': true}" 1718 | }, 1719 | "object-shorthand" : { 1720 | "active" : 0, 1721 | "optionString" : "'always', {'avoidQuotes': false, 'ignoreConstructors': false}" 1722 | }, 1723 | "one-var" : { 1724 | "active" : 0, 1725 | "optionString" : "'always'" 1726 | }, 1727 | "one-var-declaration-per-line" : { 1728 | "active" : 0, 1729 | "optionString" : "'always'" 1730 | }, 1731 | "operator-assignment" : { 1732 | "active" : 0, 1733 | "optionString" : "'always'" 1734 | }, 1735 | "operator-linebreak" : { 1736 | "active" : 0, 1737 | "optionString" : "'after', {'overrides': {'?': 'after', '+=': 'none'}}" 1738 | }, 1739 | "padded-blocks" : { 1740 | "active" : 0, 1741 | "optionString" : "{'blocks': 'always', 'switches': 'always', 'classes': 'always'}" 1742 | }, 1743 | "padding-line-between-statements" : { 1744 | "active" : 0, 1745 | "optionString" : "{blankLine: 'always', prev:'*', next:'return'}" 1746 | }, 1747 | "prefer-arrow-callback" : { 1748 | "active" : 0 1749 | }, 1750 | "prefer-const" : { 1751 | "active" : 0, 1752 | "optionString" : "{'destructuring': 'any', 'ignoreReadBeforeAssign': false}" 1753 | }, 1754 | "prefer-destructuring" : { 1755 | "active" : 0, 1756 | "optionString" : "{'array': true, 'object': true}, {'enforceForRenamedProperties': false}" 1757 | }, 1758 | "prefer-exponentiation-operator" : { 1759 | "active" : 0 1760 | }, 1761 | "prefer-named-capture-group" : { 1762 | "active" : 0 1763 | }, 1764 | "prefer-numeric-literals" : { 1765 | "active" : 0 1766 | }, 1767 | "prefer-object-has-own" : { 1768 | "active" : 0 1769 | }, 1770 | "prefer-object-spread" : { 1771 | "active" : 0 1772 | }, 1773 | "prefer-promise-reject-errors" : { 1774 | "active" : 0, 1775 | "optionString" : "{'allowEmptyReject': false}" 1776 | }, 1777 | "prefer-regex-literals" : { 1778 | "active" : 0 1779 | }, 1780 | "prefer-rest-params" : { 1781 | "active" : 0 1782 | }, 1783 | "prefer-spread" : { 1784 | "active" : 0 1785 | }, 1786 | "prefer-template" : { 1787 | "active" : 0 1788 | }, 1789 | "quote-props" : { 1790 | "active" : 0, 1791 | "optionString" : "'always'" 1792 | }, 1793 | "quotes" : { 1794 | "active" : 0, 1795 | "optionString" : "'double', {'avoidEscape': true, 'allowTemplateLiterals': true}" 1796 | }, 1797 | "radix" : { 1798 | "active" : 0, 1799 | "optionString" : "'always'" 1800 | }, 1801 | "require-atomic-updates" : { 1802 | "active" : 0, 1803 | "optionString" : "{'allowProperties': false}" 1804 | }, 1805 | "require-await" : { 1806 | "active" : 0 1807 | }, 1808 | "require-unicode-regexp" : { 1809 | "active" : 0 1810 | }, 1811 | "require-yield" : { 1812 | "active" : 1 1813 | }, 1814 | "rest-spread-spacing" : { 1815 | "active" : 0, 1816 | "optionString" : "'never'" 1817 | }, 1818 | "semi" : { 1819 | "active" : 0, 1820 | "optionString" : "'always', {'omitLastInOneLineBlock': false}" 1821 | }, 1822 | "semi-spacing" : { 1823 | "active" : 0, 1824 | "optionString" : "{'before': false, 'after': true}" 1825 | }, 1826 | "semi-style" : { 1827 | "active" : 0, 1828 | "optionString" : "'last'" 1829 | }, 1830 | "sort-imports" : { 1831 | "active" : 0, 1832 | "optionString" : "{'ignoreCase': false, 'ignoreMemberSort': true, 'memberSyntaxSortOrder': ['none', 'all', 'multiple', 'single'], 'allowSeparatedGroups': false}" 1833 | }, 1834 | "sort-keys" : { 1835 | "active" : 0, 1836 | "optionString" : "'asc', {'caseSensitive': true, 'natural': false, 'minKeys': 2}" 1837 | }, 1838 | "sort-vars" : { 1839 | "active" : 0, 1840 | "optionString" : "{'ignoreCase': false}" 1841 | }, 1842 | "space-before-blocks" : { 1843 | "active" : 0, 1844 | "optionString" : "{'functions': 'always', 'keywords': 'always', 'classes': 'always'}" 1845 | }, 1846 | "space-before-function-paren" : { 1847 | "active" : 0, 1848 | "optionString" : "{'anonymous': 'always', 'named': 'never'}" 1849 | }, 1850 | "space-in-parens" : { 1851 | "active" : 0, 1852 | "optionString" : "'never', {'exceptions': []}" 1853 | }, 1854 | "space-infix-ops" : { 1855 | "active" : 0, 1856 | "optionString" : "{'int32Hint': false}" 1857 | }, 1858 | "space-unary-ops" : { 1859 | "active" : 0, 1860 | "optionString" : "{'words': true, 'nonwords': false, 'overrides': {}}" 1861 | }, 1862 | "spaced-comment" : { 1863 | "active" : 0, 1864 | "optionString" : "'always', {'line': {'markers': ['\/'], 'exceptions': ['-', '+']}, 'block': {'markers': ['!'], 'exceptions': ['*'], 'balanced': false}}" 1865 | }, 1866 | "strict" : { 1867 | "active" : 0, 1868 | "optionString" : "'safe'" 1869 | }, 1870 | "switch-colon-spacing" : { 1871 | "active" : 0, 1872 | "optionString" : "{'after': true, 'before': false}" 1873 | }, 1874 | "symbol-description" : { 1875 | "active" : 0 1876 | }, 1877 | "template-curly-spacing" : { 1878 | "active" : 0, 1879 | "optionString" : "'never'" 1880 | }, 1881 | "template-tag-spacing" : { 1882 | "active" : 0, 1883 | "optionString" : "'never'" 1884 | }, 1885 | "unicode-bom" : { 1886 | "active" : 0, 1887 | "optionString" : "'never'" 1888 | }, 1889 | "use-isnan" : { 1890 | "active" : 1, 1891 | "optionString" : "{'enforceForSwitchCase': true, 'enforceForIndexOf': false}" 1892 | }, 1893 | "valid-typeof" : { 1894 | "active" : 1, 1895 | "optionString" : "{'requireStringLiterals': true}" 1896 | }, 1897 | "vars-on-top" : { 1898 | "active" : 0 1899 | }, 1900 | "wrap-iife" : { 1901 | "active" : 0, 1902 | "optionString" : "'outside'" 1903 | }, 1904 | "wrap-regex" : { 1905 | "active" : 0 1906 | }, 1907 | "yield-star-spacing" : { 1908 | "active" : 0, 1909 | "optionString" : "{'before': false, 'after': true}" 1910 | }, 1911 | "yoda" : { 1912 | "active" : 0, 1913 | "optionString" : "'never', {'exceptRange': false, 'onlyEquality': false}" 1914 | } 1915 | }, 1916 | "esLintSourceType" : 0, 1917 | "externalServerAddress" : "http:\/\/localhost:8888", 1918 | "gitIgnoreBuildFolder" : 1, 1919 | "hideConfigFile" : 0, 1920 | "jsCheckerReservedNamesString" : "", 1921 | "languageDefaultsCOFFEE" : { 1922 | "autoOutputAction" : 0, 1923 | "autoOutputPathFilenamePattern" : "*.js", 1924 | "autoOutputPathRelativePath" : "", 1925 | "autoOutputPathReplace1" : "", 1926 | "autoOutputPathReplace2" : "", 1927 | "autoOutputPathStyle" : 0, 1928 | "minifierStyle" : 0, 1929 | "outputStyle" : 0, 1930 | "sourceMapStyle" : 0, 1931 | "transpilerStyle" : 1 1932 | }, 1933 | "languageDefaultsCSS" : { 1934 | "autoOutputAction" : 0, 1935 | "autoOutputPathFilenamePattern" : "*-min.css", 1936 | "autoOutputPathRelativePath" : "", 1937 | "autoOutputPathReplace1" : "", 1938 | "autoOutputPathReplace2" : "", 1939 | "autoOutputPathStyle" : 0, 1940 | "combineImports" : 0, 1941 | "cssoStyle" : 0, 1942 | "purgeCSSStyle" : 0, 1943 | "shouldRunAutoprefixer" : 1, 1944 | "shouldRunBless" : 0, 1945 | "sourceMapStyle" : 0 1946 | }, 1947 | "languageDefaultsGIF" : { 1948 | "autoOutputAction" : 0, 1949 | "autoOutputPathFilenamePattern" : "*.gif", 1950 | "autoOutputPathRelativePath" : "", 1951 | "autoOutputPathReplace1" : "", 1952 | "autoOutputPathReplace2" : "", 1953 | "autoOutputPathStyle" : 0, 1954 | "webpOptimizationPresetUUID" : "lpckwebp-none", 1955 | "webpRGBQuality" : 75 1956 | }, 1957 | "languageDefaultsHAML" : { 1958 | "autoOutputAction" : 0, 1959 | "autoOutputPathFilenamePattern" : "*.html", 1960 | "autoOutputPathRelativePath" : "", 1961 | "autoOutputPathReplace1" : "", 1962 | "autoOutputPathReplace2" : "", 1963 | "autoOutputPathStyle" : 0, 1964 | "escapeHTMLCharacters" : 0, 1965 | "htmlMinifierStyle" : 0, 1966 | "noEscapeInAttributes" : 0, 1967 | "outputFormat" : 2, 1968 | "shouldRunCacheBuster" : 0, 1969 | "useCDATA" : 0, 1970 | "useDoubleQuotes" : 0, 1971 | "useUnixNewlines" : 0 1972 | }, 1973 | "languageDefaultsJPG" : { 1974 | "autoOutputAction" : 0, 1975 | "autoOutputPathFilenamePattern" : "*.jpg", 1976 | "autoOutputPathRelativePath" : "", 1977 | "autoOutputPathReplace1" : "", 1978 | "autoOutputPathReplace2" : "", 1979 | "autoOutputPathStyle" : 0, 1980 | "outputFormat" : 0, 1981 | "quality" : 100, 1982 | "webpOptimizationPresetUUID" : "lpckwebp-none", 1983 | "webpRGBQuality" : 75 1984 | }, 1985 | "languageDefaultsJS" : { 1986 | "autoOutputAction" : 0, 1987 | "autoOutputPathFilenamePattern" : "*.js", 1988 | "autoOutputPathRelativePath" : "..\/..\/dist\/js", 1989 | "autoOutputPathReplace1" : "", 1990 | "autoOutputPathReplace2" : "", 1991 | "autoOutputPathStyle" : 2, 1992 | "bundleFormat" : 0, 1993 | "minifierStyle" : 1, 1994 | "sourceMapStyle" : 1, 1995 | "syntaxCheckerStyle" : 0, 1996 | "transpilerStyle" : 0 1997 | }, 1998 | "languageDefaultsJSON" : { 1999 | "autoOutputAction" : 1, 2000 | "autoOutputPathFilenamePattern" : "*-min.json", 2001 | "autoOutputPathRelativePath" : "", 2002 | "autoOutputPathReplace1" : "", 2003 | "autoOutputPathReplace2" : "", 2004 | "autoOutputPathStyle" : 0, 2005 | "orderOutput" : 1, 2006 | "outputStyle" : 1 2007 | }, 2008 | "languageDefaultsKIT" : { 2009 | "autoOutputAction" : 0, 2010 | "autoOutputPathFilenamePattern" : "*.html", 2011 | "autoOutputPathRelativePath" : "", 2012 | "autoOutputPathReplace1" : "kit", 2013 | "autoOutputPathReplace2" : "html", 2014 | "autoOutputPathStyle" : 0, 2015 | "htmlMinifierStyle" : 0, 2016 | "shouldRunCacheBuster" : 0 2017 | }, 2018 | "languageDefaultsLESS" : { 2019 | "allowInsecureImports" : 0, 2020 | "autoOutputAction" : 0, 2021 | "autoOutputPathFilenamePattern" : "*.css", 2022 | "autoOutputPathRelativePath" : "..\/css", 2023 | "autoOutputPathReplace1" : "less", 2024 | "autoOutputPathReplace2" : "css", 2025 | "autoOutputPathStyle" : 0, 2026 | "cssoStyle" : 0, 2027 | "enableJavascript" : 0, 2028 | "mathStyle" : 0, 2029 | "outputStyle" : 0, 2030 | "purgeCSSStyle" : 0, 2031 | "rewriteURLStyle" : 0, 2032 | "shouldRunAutoprefixer" : 0, 2033 | "shouldRunBless" : 0, 2034 | "sourceMapStyle" : 0, 2035 | "strictImports" : 0, 2036 | "strictUnits" : 0 2037 | }, 2038 | "languageDefaultsMARKDOWN" : { 2039 | "autoOutputAction" : 1, 2040 | "autoOutputPathFilenamePattern" : "*.html", 2041 | "autoOutputPathRelativePath" : "", 2042 | "autoOutputPathReplace1" : "", 2043 | "autoOutputPathReplace2" : "", 2044 | "autoOutputPathStyle" : 0, 2045 | "criticStyle" : 0, 2046 | "enableFootnotes" : 1, 2047 | "enableLabels" : 1, 2048 | "enableSmartQuotes" : 1, 2049 | "htmlMinifierStyle" : 0, 2050 | "maskEmailAddresses" : 1, 2051 | "outputFormat" : 0, 2052 | "outputStyle" : 0, 2053 | "parseMetadata" : 1, 2054 | "processHTML" : 0, 2055 | "randomFootnoteNumbers" : 0, 2056 | "shouldRunCacheBuster" : 0, 2057 | "useCompatibilityMode" : 0 2058 | }, 2059 | "languageDefaultsOTHER" : { 2060 | "autoOutputAction" : 0, 2061 | "autoOutputPathFilenamePattern" : "*.*", 2062 | "autoOutputPathRelativePath" : "", 2063 | "autoOutputPathReplace1" : "", 2064 | "autoOutputPathReplace2" : "", 2065 | "autoOutputPathStyle" : 0, 2066 | "htmlMinifierStyle" : 0, 2067 | "shouldRunCacheBuster" : 0 2068 | }, 2069 | "languageDefaultsPNG" : { 2070 | "autoOutputAction" : 0, 2071 | "autoOutputPathFilenamePattern" : "*.png", 2072 | "autoOutputPathRelativePath" : "", 2073 | "autoOutputPathReplace1" : "", 2074 | "autoOutputPathReplace2" : "", 2075 | "autoOutputPathStyle" : 0, 2076 | "optimizerType" : 1, 2077 | "quality" : 100, 2078 | "webpOptimizationPresetUUID" : "lpckwebp-none", 2079 | "webpRGBQuality" : 75 2080 | }, 2081 | "languageDefaultsPUG" : { 2082 | "autoOutputAction" : 0, 2083 | "autoOutputPathFilenamePattern" : "*.html", 2084 | "autoOutputPathRelativePath" : "", 2085 | "autoOutputPathReplace1" : "", 2086 | "autoOutputPathReplace2" : "", 2087 | "autoOutputPathStyle" : 0, 2088 | "compileDebug" : 1, 2089 | "htmlMinifierStyle" : 0, 2090 | "outputStyle" : 1, 2091 | "shouldRunCacheBuster" : 0 2092 | }, 2093 | "languageDefaultsSASS" : { 2094 | "autoOutputAction" : 0, 2095 | "autoOutputPathFilenamePattern" : "*.css", 2096 | "autoOutputPathRelativePath" : "..\/..\/dist\/css", 2097 | "autoOutputPathReplace1" : "sass", 2098 | "autoOutputPathReplace2" : "css", 2099 | "autoOutputPathStyle" : 2, 2100 | "compilerType" : 0, 2101 | "cssoStyle" : 0, 2102 | "decimalPrecision" : 10, 2103 | "emitCharset" : 1, 2104 | "outputStyle" : 3, 2105 | "purgeCSSStyle" : 0, 2106 | "shouldRunAutoprefixer" : 1, 2107 | "shouldRunBless" : 0, 2108 | "sourceMapStyle" : 0 2109 | }, 2110 | "languageDefaultsSLIM" : { 2111 | "autoOutputAction" : 0, 2112 | "autoOutputPathFilenamePattern" : "*.html", 2113 | "autoOutputPathRelativePath" : "", 2114 | "autoOutputPathReplace1" : "", 2115 | "autoOutputPathReplace2" : "", 2116 | "autoOutputPathStyle" : 0, 2117 | "compileOnly" : 0, 2118 | "htmlMinifierStyle" : 0, 2119 | "logicless" : 0, 2120 | "outputFormat" : 0, 2121 | "outputStyle" : 1, 2122 | "railsCompatible" : 0, 2123 | "shouldRunCacheBuster" : 0 2124 | }, 2125 | "languageDefaultsSTYLUS" : { 2126 | "autoOutputAction" : 0, 2127 | "autoOutputPathFilenamePattern" : "*.css", 2128 | "autoOutputPathRelativePath" : "..\/css", 2129 | "autoOutputPathReplace1" : "stylus", 2130 | "autoOutputPathReplace2" : "css", 2131 | "autoOutputPathStyle" : 0, 2132 | "cssoStyle" : 0, 2133 | "debugStyle" : 0, 2134 | "importCSS" : 0, 2135 | "outputStyle" : 0, 2136 | "purgeCSSStyle" : 0, 2137 | "resolveRelativeURLS" : 0, 2138 | "shouldRunAutoprefixer" : 0, 2139 | "shouldRunBless" : 0, 2140 | "sourceMapStyle" : 0 2141 | }, 2142 | "languageDefaultsSVG" : { 2143 | "autoOutputAction" : 2, 2144 | "autoOutputPathFilenamePattern" : "*.svg", 2145 | "autoOutputPathRelativePath" : "", 2146 | "autoOutputPathReplace1" : "", 2147 | "autoOutputPathReplace2" : "", 2148 | "autoOutputPathStyle" : 0, 2149 | "pluginMask" : 52780316221407 2150 | }, 2151 | "languageDefaultsTS" : { 2152 | "autoOutputAction" : 0, 2153 | "autoOutputPathFilenamePattern" : "*.js", 2154 | "autoOutputPathRelativePath" : "\/js", 2155 | "autoOutputPathReplace1" : "", 2156 | "autoOutputPathReplace2" : "", 2157 | "autoOutputPathStyle" : 0, 2158 | "createDeclarationFile" : 0, 2159 | "jsxMode" : 0, 2160 | "minifierStyle" : 0, 2161 | "moduleDetectionType" : 0, 2162 | "moduleResolutionType" : 0, 2163 | "moduleType" : 2, 2164 | "removeComments" : 0, 2165 | "sourceMapStyle" : 0, 2166 | "targetECMAVersion" : 2018 2167 | }, 2168 | "languageDefaultsUserDefined" : [ 2169 | 2170 | ], 2171 | "npmAbbreviatedPath" : "", 2172 | "npmCreatePackageLock" : 1, 2173 | "npmInstallOptionalDependencies" : 0, 2174 | "npmSaveExactVersion" : 0, 2175 | "npmTargetDependencyListType" : 1, 2176 | "overrideExternalServerCSS" : 0, 2177 | "previewPathAddition" : "", 2178 | "purgeCSS" : { 2179 | "blocklistEntries" : [ 2180 | 2181 | ], 2182 | "contentEntries" : [ 2183 | "**\/*.html", 2184 | "**\/*.htm", 2185 | "**\/*.shtml", 2186 | "**\/*.xhtml", 2187 | "**\/*.php", 2188 | "**\/*.js", 2189 | "**\/*.ts", 2190 | "**\/*.coffee", 2191 | "**\/*.erb", 2192 | "**\/*.pug", 2193 | "**\/*.jade", 2194 | "**\/*.slim", 2195 | "**\/*.haml", 2196 | "**\/*.md", 2197 | "**\/*.kit" 2198 | ], 2199 | "removeFontFace" : 0, 2200 | "removeKeyframes" : 0, 2201 | "removeVariables" : 0, 2202 | "safelistEntries" : [ 2203 | 2204 | ], 2205 | "skippedEntries" : [ 2206 | "node_modules\/**" 2207 | ] 2208 | }, 2209 | "rollupContext" : "", 2210 | "rollupExternalEntries" : [ 2211 | 2212 | ], 2213 | "rollupReplacementEntries" : [ 2214 | "process.env.NODE_ENV:::$NODE_ENV", 2215 | "ENVIRONMENT:::$NODE_ENV" 2216 | ], 2217 | "rollupTreeshakingEnabled" : 1, 2218 | "rollupTreeshakingModuleSideEffects" : 1, 2219 | "skippedFoldersString" : "log, _logs, logs, _cache, cache, .idea, \/storage\/framework\/sessions, node_modules", 2220 | "sourceFolderName" : "source", 2221 | "susyVersion" : 3, 2222 | "tsAllowArbitraryExtensions" : 0, 2223 | "tsAllowImportingTSExtensions" : 0, 2224 | "tsAllowSyntheticDefaultImports" : 0, 2225 | "tsAllowUMDGlobalAccess" : 0, 2226 | "tsAllowUnreachableCode" : 0, 2227 | "tsAllowUnusedLabels" : 0, 2228 | "tsAlwaysStrict" : 0, 2229 | "tsDownlevelIteration" : 0, 2230 | "tsEmitBOM" : 0, 2231 | "tsEmitDecoratorMetadata" : 0, 2232 | "tsESModuleInterop" : 0, 2233 | "tsExactOptionalPropertyTypes" : 0, 2234 | "tsExperimentalDecorators" : 0, 2235 | "tsForceConsistentCasingInFileNames" : 0, 2236 | "tsImportHelpers" : 0, 2237 | "tsIsolatedModules" : 0, 2238 | "tsJSXFactory" : "React.createElement", 2239 | "tsNoEmitHelpers" : 0, 2240 | "tsNoFallthroughCasesInSwitch" : 0, 2241 | "tsNoImplicitAny" : 0, 2242 | "tsNoImplicitOverride" : 0, 2243 | "tsNoImplicitReturns" : 0, 2244 | "tsNoImplicitThis" : 0, 2245 | "tsNoLib" : 0, 2246 | "tsNoPropertyAccessFromIndexSignature" : 0, 2247 | "tsNoResolve" : 0, 2248 | "tsNoUncheckedIndexAccess" : 0, 2249 | "tsNoUnusedLocals" : 0, 2250 | "tsNoUnusedParameters" : 0, 2251 | "tsPreserveConstEnums" : 0, 2252 | "tsPreserveSymlinks" : 0, 2253 | "tsResolveJsonModule" : 0, 2254 | "tsSkipDefaultLibCheck" : 0, 2255 | "tsSkipLibCheck" : 0, 2256 | "tsStrictBindCallApply" : 0, 2257 | "tsStrictFunctionTypes" : 0, 2258 | "tsStrictNullChecks" : 0, 2259 | "tsStrictPropertyInitialization" : 0, 2260 | "tsStripInternal" : 0, 2261 | "tsUseDefineForClassFields" : 0, 2262 | "tsUseUnknownInCatchVariables" : 0, 2263 | "tsVerbatimModuleSyntax" : 0, 2264 | "uglifyDefinesString" : "", 2265 | "uglifyFlags2" : { 2266 | "arguments" : { 2267 | "active" : 1, 2268 | "flagValue" : -1 2269 | }, 2270 | "arrows" : { 2271 | "active" : 1, 2272 | "flagValue" : -1 2273 | }, 2274 | "ascii_only" : { 2275 | "active" : 0, 2276 | "flagValue" : -1 2277 | }, 2278 | "booleans" : { 2279 | "active" : 1, 2280 | "flagValue" : -1 2281 | }, 2282 | "booleans_as_integers" : { 2283 | "active" : 0, 2284 | "flagValue" : -1 2285 | }, 2286 | "braces" : { 2287 | "active" : 0, 2288 | "flagValue" : -1 2289 | }, 2290 | "collapse_vars" : { 2291 | "active" : 1, 2292 | "flagValue" : -1 2293 | }, 2294 | "comments" : { 2295 | "active" : 0, 2296 | "flagValue" : 1 2297 | }, 2298 | "comparisons" : { 2299 | "active" : 1, 2300 | "flagValue" : -1 2301 | }, 2302 | "computed_props" : { 2303 | "active" : 1, 2304 | "flagValue" : -1 2305 | }, 2306 | "conditionals" : { 2307 | "active" : 1, 2308 | "flagValue" : -1 2309 | }, 2310 | "dead_code" : { 2311 | "active" : 1, 2312 | "flagValue" : -1 2313 | }, 2314 | "directives" : { 2315 | "active" : 1, 2316 | "flagValue" : -1 2317 | }, 2318 | "drop_console" : { 2319 | "active" : 0, 2320 | "flagValue" : -1 2321 | }, 2322 | "drop_debugger" : { 2323 | "active" : 1, 2324 | "flagValue" : -1 2325 | }, 2326 | "ecma" : { 2327 | "active" : 1, 2328 | "flagValue" : 5 2329 | }, 2330 | "eval" : { 2331 | "active" : 0, 2332 | "flagValue" : -1 2333 | }, 2334 | "evaluate" : { 2335 | "active" : 1, 2336 | "flagValue" : -1 2337 | }, 2338 | "expression" : { 2339 | "active" : 0, 2340 | "flagValue" : -1 2341 | }, 2342 | "hoist_funs" : { 2343 | "active" : 0, 2344 | "flagValue" : -1 2345 | }, 2346 | "hoist_props" : { 2347 | "active" : 1, 2348 | "flagValue" : -1 2349 | }, 2350 | "hoist_vars" : { 2351 | "active" : 0, 2352 | "flagValue" : -1 2353 | }, 2354 | "ie8" : { 2355 | "active" : 0, 2356 | "flagValue" : -1 2357 | }, 2358 | "if_return" : { 2359 | "active" : 1, 2360 | "flagValue" : -1 2361 | }, 2362 | "indent_level" : { 2363 | "active" : 0, 2364 | "flagValue" : 4 2365 | }, 2366 | "indent_start" : { 2367 | "active" : 0, 2368 | "flagValue" : 0 2369 | }, 2370 | "inline" : { 2371 | "active" : 1, 2372 | "flagValue" : 3 2373 | }, 2374 | "inline_script" : { 2375 | "active" : 1, 2376 | "flagValue" : -1 2377 | }, 2378 | "join_vars" : { 2379 | "active" : 1, 2380 | "flagValue" : -1 2381 | }, 2382 | "keep_classnames" : { 2383 | "active" : 0, 2384 | "flagValue" : -1 2385 | }, 2386 | "keep_fargs" : { 2387 | "active" : 1, 2388 | "flagValue" : -1 2389 | }, 2390 | "keep_fnames" : { 2391 | "active" : 0, 2392 | "flagValue" : -1 2393 | }, 2394 | "keep_infinity" : { 2395 | "active" : 0, 2396 | "flagValue" : -1 2397 | }, 2398 | "keep_numbers" : { 2399 | "active" : 0, 2400 | "flagValue" : -1 2401 | }, 2402 | "keep_quoted_props" : { 2403 | "active" : 0, 2404 | "flagValue" : -1 2405 | }, 2406 | "loops" : { 2407 | "active" : 1, 2408 | "flagValue" : -1 2409 | }, 2410 | "max_line_len" : { 2411 | "active" : 1, 2412 | "flagValue" : 32000 2413 | }, 2414 | "module" : { 2415 | "active" : 0, 2416 | "flagValue" : -1 2417 | }, 2418 | "negate_iife" : { 2419 | "active" : 1, 2420 | "flagValue" : -1 2421 | }, 2422 | "passes" : { 2423 | "active" : 1, 2424 | "flagValue" : 1 2425 | }, 2426 | "preserve_annotations" : { 2427 | "active" : 0, 2428 | "flagValue" : -1 2429 | }, 2430 | "properties" : { 2431 | "active" : 1, 2432 | "flagValue" : -1 2433 | }, 2434 | "pure_getters" : { 2435 | "active" : 0, 2436 | "flagValue" : -1 2437 | }, 2438 | "quote_keys" : { 2439 | "active" : 0, 2440 | "flagValue" : -1 2441 | }, 2442 | "quote_style" : { 2443 | "active" : 1, 2444 | "flagValue" : 0 2445 | }, 2446 | "reduce_funcs" : { 2447 | "active" : 1, 2448 | "flagValue" : -1 2449 | }, 2450 | "reduce_vars" : { 2451 | "active" : 1, 2452 | "flagValue" : -1 2453 | }, 2454 | "safari10" : { 2455 | "active" : 0, 2456 | "flagValue" : -1 2457 | }, 2458 | "semicolons" : { 2459 | "active" : 1, 2460 | "flagValue" : -1 2461 | }, 2462 | "sequences" : { 2463 | "active" : 1, 2464 | "flagValue" : -1 2465 | }, 2466 | "shebang" : { 2467 | "active" : 1, 2468 | "flagValue" : -1 2469 | }, 2470 | "side_effects" : { 2471 | "active" : 1, 2472 | "flagValue" : -1 2473 | }, 2474 | "switches" : { 2475 | "active" : 1, 2476 | "flagValue" : -1 2477 | }, 2478 | "toplevel" : { 2479 | "active" : 0, 2480 | "flagValue" : -1 2481 | }, 2482 | "typeofs" : { 2483 | "active" : 1, 2484 | "flagValue" : -1 2485 | }, 2486 | "unsafe" : { 2487 | "active" : 0, 2488 | "flagValue" : -1 2489 | }, 2490 | "unsafe_arrows" : { 2491 | "active" : 0, 2492 | "flagValue" : -1 2493 | }, 2494 | "unsafe_comps" : { 2495 | "active" : 0, 2496 | "flagValue" : -1 2497 | }, 2498 | "unsafe_Function" : { 2499 | "active" : 0, 2500 | "flagValue" : -1 2501 | }, 2502 | "unsafe_math" : { 2503 | "active" : 0, 2504 | "flagValue" : -1 2505 | }, 2506 | "unsafe_methods" : { 2507 | "active" : 0, 2508 | "flagValue" : -1 2509 | }, 2510 | "unsafe_proto" : { 2511 | "active" : 0, 2512 | "flagValue" : -1 2513 | }, 2514 | "unsafe_regexp" : { 2515 | "active" : 0, 2516 | "flagValue" : -1 2517 | }, 2518 | "unsafe_undefined" : { 2519 | "active" : 0, 2520 | "flagValue" : -1 2521 | }, 2522 | "unused" : { 2523 | "active" : 1, 2524 | "flagValue" : -1 2525 | }, 2526 | "warnings" : { 2527 | "active" : 0, 2528 | "flagValue" : -1 2529 | }, 2530 | "webkit" : { 2531 | "active" : 0, 2532 | "flagValue" : -1 2533 | }, 2534 | "wrap_func_args" : { 2535 | "active" : 1, 2536 | "flagValue" : -1 2537 | }, 2538 | "wrap_iife" : { 2539 | "active" : 0, 2540 | "flagValue" : -1 2541 | } 2542 | }, 2543 | "uglifyMangleNames" : 1, 2544 | "uglifyReservedNamesString" : "$,exports,require", 2545 | "webpPresets" : { 2546 | 2547 | }, 2548 | "websiteRelativeRoot" : "" 2549 | }, 2550 | "settingsFileVersion" : "3" 2551 | } --------------------------------------------------------------------------------