├── 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 |
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 |
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 |
18 | {% for number, footnote in footnotes() %}
19 | {{ number }} {{ footnote }}
20 | {% endfor %}
21 |
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 |
29 | {% for number, footnote in footnotes() %}
30 |
33 | {% endfor %}
34 |
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 |
44 | {% for number, footnote in footnotes() %}
45 |
49 | {% endfor %}
50 |
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 3 4 "* 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 "2 3 "
114 |
115 | // therefore find all closing followed by opening tags (eventually divided by whitespaces)
116 | preg_match_all('# \s*" (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 | }
--------------------------------------------------------------------------------