feat(pico-content-editor): create
This commit is contained in:
commit
3447257810
23
.eslintrc.json
Normal file
23
.eslintrc.json
Normal file
@ -0,0 +1,23 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"commonjs": true,
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaFeatures": {
|
||||
"jsx": true
|
||||
},
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
"no-const-assign": "warn",
|
||||
"no-this-before-super": "warn",
|
||||
"no-undef": "warn",
|
||||
"no-unreachable": "warn",
|
||||
"no-unused-vars": "warn",
|
||||
"constructor-super": "warn",
|
||||
"valid-typeof": "warn"
|
||||
}
|
||||
}
|
36
.gitignore
vendored
Normal file
36
.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
# SPDX-License-Identifier: EUPL-1.2
|
||||
# Authors: see README.md
|
||||
|
||||
# logs
|
||||
*.log
|
||||
|
||||
# Composer
|
||||
vendor/*
|
||||
|
||||
# Node modules
|
||||
node_modules
|
||||
|
||||
# Macintosh OS
|
||||
/.DS_Store
|
||||
|
||||
# Eclipse IDE
|
||||
/.buildpath
|
||||
/.project
|
||||
/.settings/
|
||||
|
||||
# PHPStorm IDE
|
||||
/.idea
|
||||
/**.iml
|
||||
|
||||
# vscode IDE
|
||||
/*.vscode
|
||||
|
||||
# Docker
|
||||
/*.db
|
||||
/docker-compose.local.yml
|
||||
|
||||
# archive files
|
||||
/*.zip
|
||||
/*.bz2
|
||||
/*.gz
|
||||
/archives/
|
289
LICENCE
Normal file
289
LICENCE
Normal file
@ -0,0 +1,289 @@
|
||||
LICENCE APPLICABLE FOR ALL FILES EXCEPT CONTENT OF 'VENDOR' DIRECTORY
|
||||
|
||||
EUROPEAN UNION PUBLIC LICENCE v. 1.2
|
||||
EUPL © the European Union 2007, 2016
|
||||
|
||||
This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
|
||||
below) which is provided under the terms of this Licence. Any use of the Work,
|
||||
other than as authorised under this Licence is prohibited (to the extent such
|
||||
use is covered by a right of the copyright holder of the Work).
|
||||
|
||||
The Work is provided under the terms of this Licence when the Licensor (as
|
||||
defined below) has placed the following notice immediately following the
|
||||
copyright notice for the Work:
|
||||
|
||||
Licensed under the EUPL
|
||||
|
||||
or has expressed by any other means his willingness to license under the EUPL.
|
||||
|
||||
1. Definitions
|
||||
|
||||
In this Licence, the following terms have the following meaning:
|
||||
|
||||
- ‘The Licence’: this Licence.
|
||||
|
||||
- ‘The Original Work’: the work or software distributed or communicated by the
|
||||
Licensor under this Licence, available as Source Code and also as Executable
|
||||
Code as the case may be.
|
||||
|
||||
- ‘Derivative Works’: the works or software that could be created by the
|
||||
Licensee, based upon the Original Work or modifications thereof. This Licence
|
||||
does not define the extent of modification or dependence on the Original Work
|
||||
required in order to classify a work as a Derivative Work; this extent is
|
||||
determined by copyright law applicable in the country mentioned in Article 15.
|
||||
|
||||
- ‘The Work’: the Original Work or its Derivative Works.
|
||||
|
||||
- ‘The Source Code’: the human-readable form of the Work which is the most
|
||||
convenient for people to study and modify.
|
||||
|
||||
- ‘The Executable Code’: any code which has generally been compiled and which is
|
||||
meant to be interpreted by a computer as a program.
|
||||
|
||||
- ‘The Licensor’: the natural or legal person that distributes or communicates
|
||||
the Work under the Licence.
|
||||
|
||||
- ‘Contributor(s)’: any natural or legal person who modifies the Work under the
|
||||
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||
|
||||
- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
|
||||
the Work under the terms of the Licence.
|
||||
|
||||
- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
|
||||
renting, distributing, communicating, transmitting, or otherwise making
|
||||
available, online or offline, copies of the Work or providing access to its
|
||||
essential functionalities at the disposal of any other natural or legal
|
||||
person.
|
||||
|
||||
2. Scope of the rights granted by the Licence
|
||||
|
||||
The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||
sublicensable licence to do the following, for the duration of copyright vested
|
||||
in the Original Work:
|
||||
|
||||
- use the Work in any circumstance and for all usage,
|
||||
- reproduce the Work,
|
||||
- modify the Work, and make Derivative Works based upon the Work,
|
||||
- communicate to the public, including the right to make available or display
|
||||
the Work or copies thereof to the public and perform publicly, as the case may
|
||||
be, the Work,
|
||||
- distribute the Work or copies thereof,
|
||||
- lend and rent the Work or copies thereof,
|
||||
- sublicense rights in the Work or copies thereof.
|
||||
|
||||
Those rights can be exercised on any media, supports and formats, whether now
|
||||
known or later invented, as far as the applicable law permits so.
|
||||
|
||||
In the countries where moral rights apply, the Licensor waives his right to
|
||||
exercise his moral right to the extent allowed by law in order to make effective
|
||||
the licence of the economic rights here above listed.
|
||||
|
||||
The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
|
||||
any patents held by the Licensor, to the extent necessary to make use of the
|
||||
rights granted on the Work under this Licence.
|
||||
|
||||
3. Communication of the Source Code
|
||||
|
||||
The Licensor may provide the Work either in its Source Code form, or as
|
||||
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||
provides in addition a machine-readable copy of the Source Code of the Work
|
||||
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||
a notice following the copyright notice attached to the Work, a repository where
|
||||
the Source Code is easily and freely accessible for as long as the Licensor
|
||||
continues to distribute or communicate the Work.
|
||||
|
||||
4. Limitations on copyright
|
||||
|
||||
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||
any exception or limitation to the exclusive rights of the rights owners in the
|
||||
Work, of the exhaustion of those rights or of other applicable limitations
|
||||
thereto.
|
||||
|
||||
5. Obligations of the Licensee
|
||||
|
||||
The grant of the rights mentioned above is subject to some restrictions and
|
||||
obligations imposed on the Licensee. Those obligations are the following:
|
||||
|
||||
Attribution right: The Licensee shall keep intact all copyright, patent or
|
||||
trademarks notices and all notices that refer to the Licence and to the
|
||||
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||
copy of the Licence with every copy of the Work he/she distributes or
|
||||
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||
notices stating that the Work has been modified and the date of modification.
|
||||
|
||||
Copyleft clause: If the Licensee distributes or communicates copies of the
|
||||
Original Works or Derivative Works, this Distribution or Communication will be
|
||||
done under the terms of this Licence or of a later version of this Licence
|
||||
unless the Original Work is expressly distributed only under this version of the
|
||||
Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
|
||||
(becoming Licensor) cannot offer or impose any additional terms or conditions on
|
||||
the Work or Derivative Work that alter or restrict the terms of the Licence.
|
||||
|
||||
Compatibility clause: If the Licensee Distributes or Communicates Derivative
|
||||
Works or copies thereof based upon both the Work and another work licensed under
|
||||
a Compatible Licence, this Distribution or Communication can be done under the
|
||||
terms of this Compatible Licence. For the sake of this clause, ‘Compatible
|
||||
Licence’ refers to the licences listed in the appendix attached to this Licence.
|
||||
Should the Licensee's obligations under the Compatible Licence conflict with
|
||||
his/her obligations under this Licence, the obligations of the Compatible
|
||||
Licence shall prevail.
|
||||
|
||||
Provision of Source Code: When distributing or communicating copies of the Work,
|
||||
the Licensee will provide a machine-readable copy of the Source Code or indicate
|
||||
a repository where this Source will be easily and freely available for as long
|
||||
as the Licensee continues to distribute or communicate the Work.
|
||||
|
||||
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||
trademarks, service marks, or names of the Licensor, except as required for
|
||||
reasonable and customary use in describing the origin of the Work and
|
||||
reproducing the content of the copyright notice.
|
||||
|
||||
6. Chain of Authorship
|
||||
|
||||
The original Licensor warrants that the copyright in the Original Work granted
|
||||
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||
power and authority to grant the Licence.
|
||||
|
||||
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||
power and authority to grant the Licence.
|
||||
|
||||
Each time You accept the Licence, the original Licensor and subsequent
|
||||
Contributors grant You a licence to their contributions to the Work, under the
|
||||
terms of this Licence.
|
||||
|
||||
7. Disclaimer of Warranty
|
||||
|
||||
The Work is a work in progress, which is continuously improved by numerous
|
||||
Contributors. It is not a finished work and may therefore contain defects or
|
||||
‘bugs’ inherent to this type of development.
|
||||
|
||||
For the above reason, the Work is provided under the Licence on an ‘as is’ basis
|
||||
and without warranties of any kind concerning the Work, including without
|
||||
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||
copyright as stated in Article 6 of this Licence.
|
||||
|
||||
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||
for the grant of any rights to the Work.
|
||||
|
||||
8. Disclaimer of Liability
|
||||
|
||||
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||
of the Work, including without limitation, damages for loss of goodwill, work
|
||||
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||
damage, even if the Licensor has been advised of the possibility of such damage.
|
||||
However, the Licensor will be liable under statutory product liability laws as
|
||||
far such laws apply to the Work.
|
||||
|
||||
9. Additional agreements
|
||||
|
||||
While distributing the Work, You may choose to conclude an additional agreement,
|
||||
defining obligations or services consistent with this Licence. However, if
|
||||
accepting obligations, You may act only on your own behalf and on your sole
|
||||
responsibility, not on behalf of the original Licensor or any other Contributor,
|
||||
and only if You agree to indemnify, defend, and hold each Contributor harmless
|
||||
for any liability incurred by, or claims asserted against such Contributor by
|
||||
the fact You have accepted any warranty or additional liability.
|
||||
|
||||
10. Acceptance of the Licence
|
||||
|
||||
The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
|
||||
placed under the bottom of a window displaying the text of this Licence or by
|
||||
affirming consent in any other similar way, in accordance with the rules of
|
||||
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||
acceptance of this Licence and all of its terms and conditions.
|
||||
|
||||
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||
Distribution or Communication by You of the Work or copies thereof.
|
||||
|
||||
11. Information to the public
|
||||
|
||||
In case of any Distribution or Communication of the Work by means of electronic
|
||||
communication by You (for example, by offering to download the Work from a
|
||||
remote location) the distribution channel or media (for example, a website) must
|
||||
at least provide to the public the information requested by the applicable law
|
||||
regarding the Licensor, the Licence and the way it may be accessible, concluded,
|
||||
stored and reproduced by the Licensee.
|
||||
|
||||
12. Termination of the Licence
|
||||
|
||||
The Licence and the rights granted hereunder will terminate automatically upon
|
||||
any breach by the Licensee of the terms of the Licence.
|
||||
|
||||
Such a termination will not terminate the licences of any person who has
|
||||
received the Work from the Licensee under the Licence, provided such persons
|
||||
remain in full compliance with the Licence.
|
||||
|
||||
13. Miscellaneous
|
||||
|
||||
Without prejudice of Article 9 above, the Licence represents the complete
|
||||
agreement between the Parties as to the Work.
|
||||
|
||||
If any provision of the Licence is invalid or unenforceable under applicable
|
||||
law, this will not affect the validity or enforceability of the Licence as a
|
||||
whole. Such provision will be construed or reformed so as necessary to make it
|
||||
valid and enforceable.
|
||||
|
||||
The European Commission may publish other linguistic versions or new versions of
|
||||
this Licence or updated versions of the Appendix, so far this is required and
|
||||
reasonable, without reducing the scope of the rights granted by the Licence. New
|
||||
versions of the Licence will be published with a unique version number.
|
||||
|
||||
All linguistic versions of this Licence, approved by the European Commission,
|
||||
have identical value. Parties can take advantage of the linguistic version of
|
||||
their choice.
|
||||
|
||||
14. Jurisdiction
|
||||
|
||||
Without prejudice to specific agreement between parties,
|
||||
|
||||
- any litigation resulting from the interpretation of this License, arising
|
||||
between the European Union institutions, bodies, offices or agencies, as a
|
||||
Licensor, and any Licensee, will be subject to the jurisdiction of the Court
|
||||
of Justice of the European Union, as laid down in article 272 of the Treaty on
|
||||
the Functioning of the European Union,
|
||||
|
||||
- any litigation arising between other parties and resulting from the
|
||||
interpretation of this License, will be subject to the exclusive jurisdiction
|
||||
of the competent court where the Licensor resides or conducts its primary
|
||||
business.
|
||||
|
||||
15. Applicable Law
|
||||
|
||||
Without prejudice to specific agreement between parties,
|
||||
|
||||
- this Licence shall be governed by the law of the European Union Member State
|
||||
where the Licensor has his seat, resides or has his registered office,
|
||||
|
||||
- this licence shall be governed by Belgian law if the Licensor has no seat,
|
||||
residence or registered office inside a European Union Member State.
|
||||
|
||||
Appendix
|
||||
|
||||
‘Compatible Licences’ according to Article 5 EUPL are:
|
||||
|
||||
- GNU General Public License (GPL) v. 2, v. 3
|
||||
- GNU Affero General Public License (AGPL) v. 3
|
||||
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||
- Eclipse Public License (EPL) v. 1.0
|
||||
- CeCILL v. 2.0, v. 2.1
|
||||
- Mozilla Public Licence (MPL) v. 2
|
||||
- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
|
||||
- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
|
||||
works other than software
|
||||
- European Union Public Licence (EUPL) v. 1.1, v. 1.2
|
||||
- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
|
||||
Reciprocity (LiLiQ-R+).
|
||||
|
||||
The European Commission may update this Appendix to later versions of the above
|
||||
licences without producing a new version of the EUPL, as long as they provide
|
||||
the rights granted in Article 2 of this Licence and protect the covered Source
|
||||
Code from exclusive appropriation.
|
||||
|
||||
All other changes or additions to this Appendix require the production of a new
|
||||
EUPL version.
|
99
LICENCE_FR
Normal file
99
LICENCE_FR
Normal file
@ -0,0 +1,99 @@
|
||||
LICENCE APPLICABLE POUR TOUS LES FICHIERS SAUF LE CONTENU DU DOSSIER 'VENDOR'
|
||||
|
||||
LICENCE PUBLIQUE DE L'UNION EUROPÉENNE v. 1.2
|
||||
EUPL © Union européenne 2007, 2016
|
||||
|
||||
La présente licence publique de l'Union européenne («EUPL») s'applique à toute œuvre (telle que définie ci-dessous) fournie aux conditions prévues par la présente licence. Toute utilisation de l'œuvre autre que ce qu'autorise la présente licence est interdite (dans la mesure où pareille utilisation est couverte par un droit du titulaire des droits d'auteur sur l'œuvre). L'œuvre est fournie aux conditions prévues par la présente licence quand le donneur de licence (tel que défini ci-dessous) a placé la mention suivante immédiatement après la déclaration relative au droit d'auteur sur l'œuvre:
|
||||
Sous licence EUPL
|
||||
ou a exprimé de toute autre manière sa volonté de fournir l'œuvre sous licence EUPL.
|
||||
|
||||
1.Définitions
|
||||
Dans la présente licence, on entend par:
|
||||
— «licence», la présente licence,
|
||||
— «œuvre originale», l'œuvre ou le logiciel distribué ou communiqué par le donneur de licence en vertu de la présente licence, sous forme de code source ou de code objet, selon le cas,
|
||||
— «œuvres dérivées», les œuvres ou logiciels qui pourraient être créés par le licencié sur la base de l'œuvre originale ou des modifications qui y auraient été appliquées. La présente licence ne définit pas le degré de modification ou de dépendance requis par rapport à l'œuvre originale pour qu'une œuvre soit qualifiée d'œuvre dérivée; cette question est réglée par la loi applicable en matière de droit d'auteur dans le pays visé à l'article 15,
|
||||
— «œuvre», l'œuvre originale ou ses œuvres dérivées,
|
||||
— «code source», la forme de l'œuvre, lisible par l'homme, la plus appropriée pour que des personnes puissent l'examiner et la modifier,
|
||||
— «code objet», l'œuvre codée, généralement après compilation, destinée à être exécutée en tant que programme par un ordinateur, — «donneur de licence», la personne physique ou morale qui distribue ou communique l'œuvre sous licence,
|
||||
— «contributeur», toute personne physique ou morale qui modifie l'œuvre sous licence, ou contribue de toute autre manière à en faire une œuvre dérivée,
|
||||
— «licencié» ou «vous», toute personne physique ou morale qui utilise l'œuvre conformément à la licence,
|
||||
— «distribution» ou «communication», tout acte de vente, don, prêt, location, distribution, communication, transmission ou mise à disposition, en ligne ou hors ligne, de copies de l'œuvre, et tout acte donnant accès à ses fonctions essentielles à toute autre personne physique ou morale.
|
||||
|
||||
2.Portée des droits accordés par la licence
|
||||
Par la présente, le donneur de licence vous concède, pour la durée de la protection de son droit d'auteur sur l'œuvre originale, une licence mondiale, libre de redevances, non exclusive et pouvant faire l'objet de sous-licences, en vertu de laquelle vous pouvez:
|
||||
— utiliser l'œuvre en toute circonstance et pour tout usage,
|
||||
— reproduire l'œuvre,
|
||||
— modifier l'œuvre et créer des œuvres dérivées sur la base de l'œuvre,
|
||||
— communiquer l'œuvre au public, ce qui inclut le droit de mettre à disposition du public ou de lui présenter l'œuvre ou des copies de l'œuvre et d'en effectuer des représentations publiques, le cas échéant,
|
||||
— distribuer l'œuvre ou des copies de celle-ci,
|
||||
— prêter et louer l'œuvre ou des copies de celles-ci,
|
||||
— accorder en sous-licence des droits sur l'œuvre ou sur des copies de celle-ci.
|
||||
Ces droits peuvent être exercés sur tout support et format, connu ou encore à inventer, dans la mesure où le droit applicable le permet. Dans les pays où des droits moraux s'appliquent, le donneur de licence renonce à son droit d'exercer son droit moral dans la mesure permise par la loi afin que la licence sur les droits patrimoniaux susmentionnés produise ses effets. Le donneur de licence vous concède un droit d'usage libre de redevances et non exclusif sur tout brevet qu'il détient, dans la mesure nécessaire à l'exercice des droits qui vous sont concédés sur l'œuvre sous licence.
|
||||
|
||||
3.Communication du code source
|
||||
Le donneur de licence fournit l'œuvre sous forme de code source ou de code objet. Si l'œuvre est fournie sous forme de code objet, le donneur de licence accompagne chacune des copies de l'œuvre qu'il distribue d'une copie lisible par machine du code source de l'œuvre ou indique, dans un avis qui suit la déclaration relative au droit d'auteur jointe à l'œuvre, l'endroit où le code source est aisément et gratuitement accessible aussi longtemps que le donneur de licence continue à distribuer ou communiquer l'œuvre.
|
||||
|
||||
4.Limitations du droit d'auteur
|
||||
Rien dans la présente licence n'a pour but de priver le licencié des avantages résultant de toute exception ou limitation aux droits exclusifs des titulaires de droits sur l'œuvre, de l'épuisement de ces droits ou de toute autre limitation qui s'y applique.
|
||||
|
||||
5.Obligations du licencié
|
||||
La concession des droits susmentionnés est soumise à des restrictions et à des obligations pour le licencié. Ces obligations sont les suivantes:
|
||||
|
||||
Droit d'attribution: le licencié laisse intactes toutes les déclarations concernant le droit d'auteur, le brevet ou les marques et toutes les déclarations concernant la licence et l'exclusion de garantie. Le licencié assortit chaque copie de l'œuvre qu'il distribue ou communique d'une copie de ces déclarations et d'une copie de la licence. Le licencié veille à ce que toute œuvre dérivée soit assortie d'un avis bien visible indiquant que l'œuvre a été modifiée et mentionnant la date de la modification.
|
||||
|
||||
Clause copyleft: si le licencié distribue ou communique des copies d'œuvres originales ou d'œuvres dérivées, cette distribution ou cette communication est effectuée dans les conditions prévues par la présente licence ou une version ultérieure de cette licence, sauf si l'œuvre originale est expressément distribuée en vertu de la présente version de la licence uniquement, par exemple au moyen de la mention «EUPL v. 1.2 seulement». Le licencié (qui devient donneur de licence) ne peut pas, en ce qui concerne l'œuvre ou les œuvres dérivées, offrir ou imposer des conditions supplémentaires qui restreignent ou modifient les conditions de la licence.
|
||||
|
||||
Clause de compatibilité: si le licencié distribue ou communique des œuvres dérivées ou des copies de telles œuvres basées à la fois sur l'œuvre et sur une autre œuvre concédée sous une licence compatible, la distribution ou la communication peut être faite aux conditions de cette licence compatible. Aux fins de la présente clause, une «licence compatible» est l'une des licences énumérées dans l'appendice de la présente licence. Dans le cas où les obligations du licencié au titre de la licence compatible entrent en conflit avec les obligations du licencié au titre de la présente licence, les premières prévalent.
|
||||
|
||||
Fourniture du code source: lorsqu'il distribue ou communique des copies de l'œuvre, le licencié fournit une copie lisible par machine du code source ou indique l'endroit où ce code source restera aisément et gratuitement accessible aussi longtemps que le donneur de licence continuera à distribuer ou communiquer l'œuvre.
|
||||
|
||||
Protection des droits: la présente licence ne donne pas le droit d'utiliser les noms commerciaux, les marques commerciales, les marques de service ou les noms du donneur de licence, sauf dans la mesure nécessaire, conformément à une utilisation raisonnable et aux pratiques habituelles, pour décrire l'origine de l'œuvre et reproduire la déclaration concernant le droit d'auteur.
|
||||
|
||||
6.Chaîne d'auteurs
|
||||
Le donneur de licence initial garantit que les droits d'auteur sur l'œuvre originale concédés par la présente licence lui appartiennent ou lui ont été donnés sous licence, et qu'il a le pouvoir et la capacité de concéder la licence. Tout contributeur garantit que les droits d'auteur sur les modifications qu'il apporte à l'œuvre lui appartiennent ou lui ont été donnés sous licence, et qu'il a le pouvoir et la capacité de concéder la licence. Chaque fois que vous acceptez la licence, le donneur de licence initial et les contributeurs successifs vous concèdent une licence sur leurs contributions à l'œuvre selon les conditions de la présente licence.
|
||||
|
||||
7.Exclusion de garantie
|
||||
L'œuvre est un travail en cours, amélioré de manière continue par de nombreux contributeurs. Elle constitue un travail inachevé et peut dès lors contenir des défauts ou bogues inhérents à ce type de développement. Pour cette raison, l'œuvre est fournie sous licence telle quelle, sans aucune garantie d'aucune sorte la concernant, y compris, sans que cette liste soit exhaustive, eu égard à sa qualité marchande, son aptitude à un usage particulier, l'absence de défauts ou d'erreurs, l'exactitude ou la non-violation de droits de propriété intellectuelle autres que le droit d'auteur comme prévu à l'article 6 de la présente licence. Cette exclusion de garantie est une partie essentielle de la licence et une condition de la concession de droits sur l'œuvre.
|
||||
|
||||
8.Exclusion de responsabilité
|
||||
Sauf dans les cas de faute intentionnelle ou de dommages directement causés à des personnes physiques, le donneur de licence n'est en aucun cas responsable des dommages, quelle qu'en soit la nature, directs ou indirects, matériels ou moraux, résultant de la licence ou de l'utilisation de l'œuvre, y compris, sans que cette liste soit exhaustive, des dommages causés par les atteintes à la réputation, les interruptions de travail, les défaillances ou le mauvais fonctionnement de matériel informatique, les pertes de données ou tout autre dommage économique, même si le donneur de licence a été informé de la possibilité de tels dommages. Cependant, le donneur de licence est responsable en vertu des dispositions législatives et réglementaires relatives à la responsabilité du fait des produits, dans la mesure où celles-ci sont applicables à l'œuvre.
|
||||
|
||||
9.Accords additionnels
|
||||
Lorsque vous distribuez l'œuvre, vous pouvez choisir de conclure un accord additionnel définissant des obligations ou des services compatibles avec la présente licence. Cependant, si vous acceptez des obligations, vous ne pouvez agir qu'en votre nom et sous votre seule responsabilité, et non au nom du donneur de licence initial ou de tout autre contributeur, et seulement si vous acceptez d'indemniser, de défendre et de mettre hors de cause tous les contributeurs s'ils encourent une responsabilité quelconque ou si des réclamations sont formulées à leur encontre du fait que vous avez accepté des garanties ou des responsabilités additionnelles.
|
||||
|
||||
10.Acceptation de la licence
|
||||
Vous pouvez exprimer votre accord sur le contenu de la présente licence en cliquant sur l'icône «J'accepte» placée au bas d'une fenêtre faisant apparaître le texte de la présente licence, ou par toute autre manifestation de consentement similaire, conformément à la loi applicable. Le fait de cliquer sur cette icône indique votre acceptation claire et irrévocable de la présente licence et de toutes ses conditions. De même, vous acceptez irrévocablement la présente licence et toutes ses conditions dès lors que vous exercez un des droits qui vous sont concédés par l'article 2 de la présente licence, tels que l'utilisation de l'œuvre, la création d'une œuvre dérivée ou la distribution ou la communication de l'œuvre ou de copies de l'œuvre.
|
||||
|
||||
11.Information du public
|
||||
En cas de distribution ou de communication électronique de l'œuvre (par exemple en permettant son téléchargement à distance), le canal de distribution ou le support (par exemple un site web) doit au minimum fournir au public les informations requises par le droit applicable en ce qui concerne le donneur de licence et la licence ainsi que la manière dont le licencié peut accéder à celle-ci, la conclure, la stocker et la reproduire.
|
||||
|
||||
12.Fin de la licence
|
||||
La licence et les droits qu'elle concède prennent automatiquement fin dès que le licencié viole l'une de ses conditions. Un tel événement ne met pas fin aux licences des personnes ayant reçu l'œuvre sous licence de la part du licencié, pour autant que ces personnes respectent pleinement la licence.
|
||||
|
||||
13.Divers
|
||||
Sous réserve de l'article 9, la licence représente l'entièreté de l'accord entre les parties quant à l'œuvre. Le fait qu'une clause quelconque de la licence soit invalide ou inapplicable en vertu du droit applicable n'affecte pas la validité ou l'applicabilité de la licence dans son ensemble. Une telle clause sera interprétée ou modifiée dans la mesure nécessaire pour la rendre valide ou applicable. La Commission européenne peut publier d'autres versions linguistiques ou de nouvelles versions de la présente licence ou des versions actualisées de son appendice, dans la mesure de ce qui est nécessaire et raisonnable, sans réduire la portée des droits accordés par la licence. Les nouvelles versions de la licence seront publiées avec un numéro de version unique. Toutes les versions linguistiques de la présente licence, approuvées par la Commission européenne, ont la même valeur. Les parties peuvent se prévaloir de la version linguistique de leur choix.
|
||||
|
||||
14.Juridiction compétente
|
||||
Sans préjudice d'accords spécifiques entre les parties,
|
||||
— tout litige résultant de l'interprétation de la présente licence survenant entre des institutions, organes, bureaux ou agences de l'Union européenne en tant que donneurs de licence et un licencié relève de la juridiction de la Cour de justice de l'Union européenne, conformément à l'article 272 du traité sur le fonctionnement de l'Union européenne,
|
||||
— tout litige survenant entre d'autres parties et résultant de l'interprétation de la présente licence relève de la compétence exclusive de la juridiction compétente du lieu où le donneur de licence réside ou exerce son activité principale.
|
||||
|
||||
15.Droit applicable
|
||||
Sans préjudice d'accords spécifiques entre les parties,
|
||||
— la présente licence est régie par le droit de l'État membre de l'Union européenne où le donneur de licence réside ou a son siège social ou statutaire,
|
||||
— la présente licence est régie par le droit belge si le donneur de licence ne réside pas et n'a pas son siège social ou statutaire dans un État membre de l'Union européenne.
|
||||
|
||||
Appendice
|
||||
Aux fins de l'article 5 de l'EUPL, les licences compatibles sont les suivantes:
|
||||
— GNU General Public License (GPL) v. 2, v. 3
|
||||
— GNU Affero General Public License (AGPL) v. 3
|
||||
— Open Software License (OSL) v. 2.1, v. 3.0
|
||||
— Eclipse Public License (EPL) v. 1.0
|
||||
— CeCILL v. 2.0, v. 2.1
|
||||
— Mozilla Public licence (MPL) v. 2
|
||||
— GNU Lesser General Public licence (LGPL) v. 2.1, v. 3
|
||||
— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) pour les œuvres autres que logicielles
|
||||
— Licence publique de l'Union européenne (EUPL) v. 1.1, v. 1.2
|
||||
— Licence libre du Québec — Réciprocité (LiLiQ-R) ou Réciprocité forte (LiLiQ-R+)
|
||||
La Commission européenne pourra actualiser le présent appendice afin d'y inclure des versions ultérieures des licences ci-dessus sans produire de nouvelle version de l'EUPL, dès lors que ces versions prévoient la concession des droits visés à l'article 2 de la présente licence et empêchent l'appropriation exclusive du code source couvert.
|
||||
Tout autre changement ou ajout au présent appendice requiert la production d'une nouvelle version de l'EUPL.
|
138
LISEZMOI.md
Normal file
138
LISEZMOI.md
Normal file
@ -0,0 +1,138 @@
|
||||
# Pico Content Editor
|
||||
|
||||
_Read this file in [English](./README.md)_
|
||||
|
||||
Éditeur graphique WYSIWYG pour [SeaCMS](https://git.defis.info/SeaCMS/seacms).
|
||||
|
||||
- édition en ligne avec [ContentTools]
|
||||
- sauvegarde dans les pages et dans le thème
|
||||
- édition des metadata des pages
|
||||
- téléversement d'images
|
||||
- authentification
|
||||
|
||||
### Auteurs
|
||||
|
||||
- [Nicolas Liautaud](https://github.com/nliautaud) (2017-2018)
|
||||
pour les parties du code provenant de https://github.com/nliautaud/pico-content-editor (licence originale MIT)
|
||||
- [Jérémy Dufraisse](https://github.com/J9rem) (2023)
|
||||
- [Association Defis](https://www.defis.info/) (2023)
|
||||
|
||||
### Licence et garanties
|
||||
|
||||
Voir le fichier [LICENCE](./LICENCE) (et sa traduction française [LICENCE_FR](./LICENCE_FR))
|
||||
|
||||
**IMPORTANT**: Le fichier LICENCE file ne couvre pas le contenu des dossiers `vendor`. Voir le fichier LICENCE fournis dans chaque sous-dossier concerné par la bibliothèque importée.
|
||||
|
||||
## Installation
|
||||
|
||||
Si vous utilisez SeaCMS via `composer`, ce paquet sera automatiquement installé si nécessaire.
|
||||
|
||||
Pour l'installer dans un thème, utiliser la ligne `composer require seacms/pico-content-editor`.
|
||||
Comme ce paquet n'est pas encore publié sur <https://packagist.org/>, vous devriez ajouter ces lignes dans le fichier `composer.json` du dossier de tête du projet :
|
||||
```json
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://git.defis.info/SeaCMS/pico-content-editor"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Les langues suportées sont listées dans le dossier *[`js/vendor/ContentTools/translations`](https://git.defis.info/SeaCMS/pico-content-editor/src/branch/master/js/vendor/ContentTools/translations)*.
|
||||
|
||||
## Usage
|
||||
|
||||
Il est possible d'ajouter l'éditeur dans le thème en insérant ces lignes. Il est conseillé de la faite dans le tag html `<head>`.
|
||||
|
||||
```twig
|
||||
{{ include('@PicoContentEditor/head-styles.twig') }}
|
||||
{{ include('@PicoContentEditor/head-scripts.twig') }}
|
||||
```
|
||||
|
||||
Pour définit des régions modifiables dans votre HTML, il faut utiliser les attributs `data-editable`, `data-name` pour le début du bloc et le commentaire de fin de bloc `end-editable`. `data-name` doit être unique pour une sortie.
|
||||
|
||||
```html
|
||||
---
|
||||
Title: A page with editable content
|
||||
---
|
||||
|
||||
The following content is editable :
|
||||
|
||||
<div data-editable data-name="pages-first-content">
|
||||
<p>Edit me!</p>
|
||||
</div><!--end editable-->
|
||||
|
||||
This one will be converted back to markdown on saving :
|
||||
|
||||
<div data-editable data-name="pages-secondary-content" data-markdown markdown=1>
|
||||
- One
|
||||
- Two
|
||||
- Three
|
||||
</div><!--end editable-->
|
||||
```
|
||||
|
||||
Tous les contenus situés entre ces marques seront modifiables..
|
||||
|
||||
## Éditeur metadata
|
||||
|
||||
Pour ajouter un éditeur de la page metadata, utiliser le code suivant après l'ouverture de la balise `<body>` :
|
||||
|
||||
```twig
|
||||
{{ include('@PicoContentEditor/meta-data-editor.twig') }}
|
||||
```
|
||||
|
||||
Une zone de texte édtiable contiendra les metadata à modifier.
|
||||
|
||||
## R2gions éditables dans les thèmes et templates
|
||||
|
||||
IL est possible de créer des blocs modifiables dans les thèmes juste en définissant l'attribut `data-src`.
|
||||
|
||||
Par exemple, le code suivant pourrait être définit dans le fichier `footer.twig` de votre thème.
|
||||
|
||||
```html
|
||||
<footer id="footer">
|
||||
<div data-editable data-name="footer" data-src="themes/mytheme/footer.twig">
|
||||
<p>Edit me !</p>
|
||||
</div><!--end editable-->
|
||||
</footer>
|
||||
```
|
||||
|
||||
## Élements modifiables fixés
|
||||
|
||||
Pour faire un composant modifiable fixé avec un composant `inline`, utliser l'attribut `data-fixture` au lieu de `data-editable` :
|
||||
|
||||
```html
|
||||
<h1 data-fixture data-name="editable-header" data-src="themes/mytheme/header.twig">
|
||||
Edit me !
|
||||
</h1><!--end editable-->
|
||||
```
|
||||
|
||||
Seul les paramètres `inline` seront disponibles dans ce mode : **Bold**, *Italic*, ...
|
||||
|
||||
Les balises non reconnues peuvent être définies avec `data-ce-tag`. Par exemple, un lien modifiable fixé avec une image pourrait être :
|
||||
|
||||
```html
|
||||
<a data-fixture data-name="my-editable-link" data-ce-tag="p" href="/test">
|
||||
Editable link
|
||||
</a><!--end editable-->
|
||||
|
||||
<div data-fixture data-name="my-hero-image" data-ce-tag="img-fixture"
|
||||
style="background-image: url('image.png');">
|
||||
<img src="image.png" alt="Some image">
|
||||
</div><!--end editable-->
|
||||
```
|
||||
|
||||
Voir [ContentTools] pour davantage d'information.
|
||||
|
||||
## Téléversemnt de fichiers
|
||||
|
||||
Par défaut, les fichiers téléversés depuis l'éditeurs sont sauvegardés dans le dossier `images/` situé à la racine de l'installation de Pico, à côté du dossier `content/`. Une localisation personnalisée peut être configurée dans les paramètres.
|
||||
|
||||
Le dossier de téléversement doit exister et doit être accessible en écriture. Le plugin ne le créra pas.
|
||||
|
||||
## Authentification
|
||||
|
||||
En cours de définition
|
||||
|
||||
[ContentTools]: http://getcontenttools.com
|
||||
|
262
PicoContentEditor.php
Normal file
262
PicoContentEditor.php
Normal file
@ -0,0 +1,262 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
|
||||
use PicoContentEditor\Status;
|
||||
use PicoContentEditor\Auth;
|
||||
use PicoContentEditor\Edits;
|
||||
use PicoContentEditor\Uploads;
|
||||
use PicoContentEditor\EditorsHandlers\ContentTools;
|
||||
|
||||
/**
|
||||
* A content editor plugin for Pico 3, using ContentTools.
|
||||
*
|
||||
* Supports PicoUsers plugin for authentification
|
||||
* {@link https://github.com/nliautaud/pico-users}
|
||||
*
|
||||
* @author Nicolas Liautaud
|
||||
* @license http://opensource.org/licenses/MIT The MIT License
|
||||
* @link https://github.com/nliautaud/pico-content-editor
|
||||
* @link http://picocms.org
|
||||
*/
|
||||
class PicoContentEditor extends AbstractPicoPlugin
|
||||
{
|
||||
/**
|
||||
* Pico API version.
|
||||
* @var int
|
||||
*/
|
||||
const API_VERSION = 3;
|
||||
|
||||
/**
|
||||
* EditorHandler (ContentToolsHandler, QuillHandler...)
|
||||
* @var ContentTools
|
||||
*/
|
||||
private $editor;
|
||||
/**
|
||||
* Files edits manager.
|
||||
* @var Edits
|
||||
*/
|
||||
private $edits;
|
||||
/**
|
||||
* Uploads manager.
|
||||
* @var Uploads
|
||||
*/
|
||||
private $uploads;
|
||||
|
||||
/**
|
||||
* Init plugin, process page edits and file uploads.
|
||||
*
|
||||
* The end-editable mark @see{Edits::ENDMARK} need to be
|
||||
* striped away because it's somewhat breaking the page rendering,
|
||||
* and thus @see{Edits::saveRegions()} has to be done here
|
||||
* in addition to @see{self::onPageRendered()}.
|
||||
*
|
||||
* Triggered after Pico has read the contents of the file to serve
|
||||
*
|
||||
* @see Pico::getRawContent()
|
||||
* @param string &$rawContent raw file contents
|
||||
* @return void
|
||||
*/
|
||||
public function onContentLoaded(&$rawContent)
|
||||
{
|
||||
if ($this->getPluginSetting('debug')) {
|
||||
ini_set('display_startup_errors', 1);
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(-1);
|
||||
}
|
||||
|
||||
Auth::init($this);
|
||||
$this->editor = new ContentTools();
|
||||
$this->uploads = new Uploads($this);
|
||||
$this->edits = new Edits();
|
||||
|
||||
$this->processPageEdits($rawContent);
|
||||
|
||||
// remove the end-editable mark
|
||||
$rawContent = preg_replace('`'.Edits::ENDMARK.'`', '', $rawContent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggered when Pico registers the twig template engine
|
||||
*
|
||||
* @see Pico::getTwig()
|
||||
*
|
||||
* @param Twig_Environment &$twig Twig instance
|
||||
*/
|
||||
public function onTwigRegistered(Twig_Environment &$twig)
|
||||
{
|
||||
$twigLoader = $twig->getLoader();
|
||||
$templateDir = $this->getPluginsDir().'PicoContentEditor/templates';
|
||||
if (is_dir($templateDir)){
|
||||
$twigLoader->addPath($templateDir, 'PicoContentEditor');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register `{{ content_editor }}` who outputs the editor scripts
|
||||
* and `{{ content_editor_meta }}` who outputs the metadata editor.
|
||||
*
|
||||
* Triggered before Pico renders the page
|
||||
*
|
||||
* @see DummyPlugin::onPageRendered()
|
||||
* @param string &$templateName file name of the template
|
||||
* @param array &$twigVariables template variables
|
||||
* @return void
|
||||
*/
|
||||
public function onPageRendering(&$templateName, array &$twigVariables)
|
||||
{
|
||||
if (!$this->getPluginSetting('show', true) || !Auth::can(Auth::EDIT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$twigVariables['canEdit'] = true;
|
||||
$twigVariables['dataLang'] = $this->editor::assets($this, "{$this->getPluginsDir()}PicoContentEditor");
|
||||
}
|
||||
/**
|
||||
* If the call is a save query, save the edited regions and output the JSON response.
|
||||
*
|
||||
* Triggered after Pico has rendered the page
|
||||
*
|
||||
* @param string &$output contents which will be sent to the user
|
||||
* @return void
|
||||
*/
|
||||
public function onPageRendered(&$output)
|
||||
{
|
||||
$this->processOverallEdits($output);
|
||||
|
||||
if (!$this->edits->beenReceived() && !$this->uploads->beenReceived()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// output response
|
||||
$response = new stdClass();
|
||||
$response->status = Status::getStatus();
|
||||
$response->edited = $this->edits->output();
|
||||
$response->file = $this->uploads->output();
|
||||
$response->debug = $this->getPluginSetting('debug', false);
|
||||
$output = json_encode($response);
|
||||
}
|
||||
/**
|
||||
* Save page metadata and edited regions if authorized.
|
||||
*
|
||||
* @param string $rawContent raw file contents
|
||||
* @return void
|
||||
*/
|
||||
public function processPageEdits($rawContent)
|
||||
{
|
||||
if (!$this->edits->beenReceived()) {
|
||||
return;
|
||||
}
|
||||
if (Auth::can(Auth::SAVE)) {
|
||||
$this->edits->saveMeta(
|
||||
$rawContent,
|
||||
$this->getRawMeta(),
|
||||
$this->getRequestFile()
|
||||
);
|
||||
$saved = $this->edits->saveRegions($rawContent, $this, $this->editor);
|
||||
if ($saved) {
|
||||
Status::add(true, 'The page have been saved');
|
||||
}
|
||||
} else {
|
||||
Status::add(false, 'You don\'t have the rights to save content');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Save edited regions from overall output if authorized, including themes files.
|
||||
*
|
||||
* @param string $output contents which will be sent to the user
|
||||
* @return void
|
||||
*/
|
||||
public function processOverallEdits($output)
|
||||
{
|
||||
if (!$this->edits->beenReceived()) {
|
||||
return;
|
||||
}
|
||||
if (Auth::can(Auth::SAVE)) {
|
||||
$saved = $this->edits->saveRegions($output, $this, $this->editor);
|
||||
if ($saved) {
|
||||
Status::add(true, 'The theme files have been saved');
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Return the current page raw metadata.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getRawMeta()
|
||||
{
|
||||
$pattern = "/^(\/(\*)|---)[[:blank:]]*(?:\r)?\n"
|
||||
. "(?:(.*?)(?:\r)?\n)?(?(2)\*\/|---)[[:blank:]]*(?:(?:\r)?\n|$)/s";
|
||||
if (preg_match($pattern, $this->getRawContent(), $rawMetaMatches)
|
||||
&& isset($rawMetaMatches[3])) {
|
||||
return $rawMetaMatches[3];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a plugin setting, either on the page metadata or on the pico config file.
|
||||
*
|
||||
* @param string $name name of a setting
|
||||
* @param mixed $default optional default value to return when the setting doesn't exist
|
||||
* @return mixed return the setting value from the page metadata, or from the config file,
|
||||
* or the given default value, or NULL
|
||||
*/
|
||||
public function getPluginSetting($name, $default = null, $caseSensitive = false)
|
||||
{
|
||||
if ($name === null) {
|
||||
return null;
|
||||
}
|
||||
if (!$caseSensitive) {
|
||||
$name = strtolower($name);
|
||||
}
|
||||
|
||||
static $c;
|
||||
static $clow;
|
||||
if (!$c) {
|
||||
$c = get_called_class();
|
||||
if (!$caseSensitive) {
|
||||
$clow = strtolower($c);
|
||||
}
|
||||
}
|
||||
|
||||
// from page metadata
|
||||
static $pageMeta;
|
||||
if (!$pageMeta) {
|
||||
$pageMeta = $this->getFileMeta();
|
||||
if ($pageMeta && !$caseSensitive) {
|
||||
$pageMeta = self::deepArrayKeyCase($pageMeta, CASE_LOWER);
|
||||
}
|
||||
}
|
||||
if ($pageMeta && isset($pageMeta[$clow]) && isset($pageMeta[$clow][$name])) {
|
||||
return $pageMeta[$clow][$name];
|
||||
}
|
||||
|
||||
// from config file
|
||||
static $pluginConfig;
|
||||
if (!$pluginConfig) {
|
||||
$pluginConfig = $this->getConfig($c, array());
|
||||
if (!$caseSensitive) {
|
||||
$pluginConfig = self::deepArrayKeyCase($pluginConfig, CASE_LOWER);
|
||||
}
|
||||
}
|
||||
return isset($pluginConfig[$name]) ? $pluginConfig[$name] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the case of every array keys, recursively.
|
||||
*
|
||||
* @param array $arr
|
||||
* @param CASE_UPPER|CASE_LOWER $case
|
||||
* @return array
|
||||
*/
|
||||
private static function deepArrayKeyCase($arr, $case)
|
||||
{
|
||||
return array_map(function ($item) use ($case) {
|
||||
if (is_array($item)) {
|
||||
$item = self::deepArrayKeyCase($item, $case);
|
||||
}
|
||||
return $item;
|
||||
}, array_change_key_case($arr, $case));
|
||||
}
|
||||
}
|
138
README.md
Normal file
138
README.md
Normal file
@ -0,0 +1,138 @@
|
||||
# Pico Content Editor
|
||||
|
||||
_Lire ce fichier en [Français](./LISEZMOI.md)_
|
||||
|
||||
A WYSIWYG content editor for [SeaCMS](https://git.defis.info/SeaCMS/seacms).
|
||||
|
||||
- live editing with [ContentTools]
|
||||
- save to pages and themes
|
||||
- pages metadata editor
|
||||
- images upload
|
||||
- authentification
|
||||
|
||||
## Authors
|
||||
|
||||
- [Nicolas Liautaud](https://github.com/nliautaud) (2017-2018)
|
||||
for parts of code from https://github.com/nliautaud/pico-content-editor (MIT original licence)
|
||||
- [Jérémy Dufraisse](https://github.com/J9rem) (2023)
|
||||
- [Association Defis](https://www.defis.info/) (2023)
|
||||
|
||||
## Licence and warranty
|
||||
|
||||
See [LICENCE](./LICENCE) file (and french translation [LICENCE_FR](./LICENCE_FR))
|
||||
|
||||
**IMPORTANT**: LICENCE file does not cover content of folders `vendor`. See dedicated LICENCE file for each subfolder concerning the imported library.
|
||||
|
||||
## Installation
|
||||
|
||||
If you are using SeaCMS via `composer`, this package will be automatically used if needed.
|
||||
|
||||
To install in a theme, use `composer require seacms/pico-content-editor`.
|
||||
As this package is not already published on <https://packagist.org/>, you should add in the `composer.json` file of the head repository project these lines :
|
||||
```json
|
||||
"repositories": [
|
||||
{
|
||||
"type": "vcs",
|
||||
"url": "https://git.defis.info/SeaCMS/pico-content-editor"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
The supported languages are listed in the *[`js/vendor/ContentTools/translations`](https://git.defis.info/SeaCMS/pico-content-editor/src/branch/master/js/vendor/ContentTools/translations)* directory.
|
||||
|
||||
## Usage
|
||||
|
||||
Include the editor files by adding the code in your theme. It is advised to put this in `<head>` tag.
|
||||
|
||||
```twig
|
||||
{{ include('@PicoContentEditor/head-styles.twig') }}
|
||||
{{ include('@PicoContentEditor/head-scripts.twig') }}
|
||||
```
|
||||
|
||||
Define editable regions in your pages by using HTML blocks with the attributes `data-editable`, `data-name` and a closing comment `end-editable`. `data-name` should be unique accross a single output.
|
||||
|
||||
```html
|
||||
---
|
||||
Title: A page with editable content
|
||||
---
|
||||
|
||||
The following content is editable :
|
||||
|
||||
<div data-editable data-name="pages-first-content">
|
||||
<p>Edit me!</p>
|
||||
</div><!--end editable-->
|
||||
|
||||
This one will be converted back to markdown on saving :
|
||||
|
||||
<div data-editable data-name="pages-secondary-content" data-markdown markdown=1>
|
||||
- One
|
||||
- Two
|
||||
- Three
|
||||
</div><!--end editable-->
|
||||
```
|
||||
|
||||
Every content inside those tags will be editable by visiting the page.
|
||||
|
||||
## Metadata editor
|
||||
|
||||
To add an editor for the pages metadata, use the following tag after the opening of `<body>` :
|
||||
|
||||
```twig
|
||||
{{ include('@PicoContentEditor/meta-data-editor.twig') }}
|
||||
```
|
||||
|
||||
An editable text area will contain the page frontmatter.
|
||||
|
||||
## Editable regions in themes and templates
|
||||
|
||||
You can create editable blocks in themes, just point to the source file with the attribute `data-src`.
|
||||
|
||||
For exemple, the following code could be the content of a `footer.twig` file in your theme.
|
||||
|
||||
```html
|
||||
<footer id="footer">
|
||||
<div data-editable data-name="footer" data-src="themes/mytheme/footer.twig">
|
||||
<p>Edit me !</p>
|
||||
</div><!--end editable-->
|
||||
</footer>
|
||||
```
|
||||
|
||||
## Fixed editable elements
|
||||
|
||||
To make fixed elements with an editable inner content, use `data-fixture` instead of `data-editable` :
|
||||
|
||||
```html
|
||||
<h1 data-fixture data-name="editable-header" data-src="themes/mytheme/header.twig">
|
||||
Edit me !
|
||||
</h1><!--end editable-->
|
||||
```
|
||||
|
||||
Only inline tools will be allowed in this context : **Bold**, *Italic*, ...
|
||||
|
||||
Unrecognized tags can be defined with `data-ce-tag`, for example for a fixed editable link and a fixed editable image :
|
||||
|
||||
```html
|
||||
<a data-fixture data-name="my-editable-link" data-ce-tag="p" href="/test">
|
||||
Editable link
|
||||
</a><!--end editable-->
|
||||
|
||||
<div data-fixture data-name="my-hero-image" data-ce-tag="img-fixture"
|
||||
style="background-image: url('image.png');">
|
||||
<img src="image.png" alt="Some image">
|
||||
</div><!--end editable-->
|
||||
```
|
||||
|
||||
See [ContentTools] for further info.
|
||||
|
||||
## Files upload
|
||||
|
||||
By default, files uploaded from the editor are saved in an `images/` directory located at the root of the Pico installation, next to `content/`. A custom location can be defined in the settings.
|
||||
|
||||
The upload directory should exist and be writeable. The plugin will not create it.
|
||||
|
||||
## Authentification
|
||||
|
||||
To be defined
|
||||
|
||||
[ContentTools]: http://getcontenttools.com
|
||||
|
47
composer.json
Normal file
47
composer.json
Normal file
@ -0,0 +1,47 @@
|
||||
{
|
||||
"name": "seacms/pico-content-editor",
|
||||
"type": "pico-plugin",
|
||||
"description": "A WYSIWYG content editor plugin for SeaCMS",
|
||||
"keywords": [ "pico", "picocms", "picocms-plugin", "pico-content-editor", "editor"],
|
||||
"homepage": "https://git.defis.info/SeaCMS/pico-content-editor",
|
||||
"license": "EUPL-1.2",
|
||||
"readme": "README.md",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Liautaud",
|
||||
"homepage": "https://github.com/nliautaud",
|
||||
"role": "Lead Developer for fork"
|
||||
},
|
||||
{
|
||||
"name": "Jérémy Dufraisse",
|
||||
"homepage": "https://github.com/J9rem",
|
||||
"role": "SeaCMS developer"
|
||||
},
|
||||
{
|
||||
"name": "Thatoo",
|
||||
"homepage": "https://github.com/Thatoo",
|
||||
"role": "SeaCMS developer"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"docs": "https://git.defis.info/SeaCMS/pico-content-editor/src/branch/master/README.md",
|
||||
"issues": "https://git.defis.info/SeaCMS/pico-content-editor/issues",
|
||||
"source": "https://git.defis.info/SeaCMS/pico-content-editor"
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.0",
|
||||
"pixel418/markdownify": "^2.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": { "PicoContentEditor\\": "src/" },
|
||||
"classmap": [ "PicoContentEditor.php" ]
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"platform": {
|
||||
"php": "8.0.0"
|
||||
},
|
||||
"platform-check": true,
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
81
composer.lock
generated
Normal file
81
composer.lock
generated
Normal file
@ -0,0 +1,81 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "e121657c1c9550dfb19ecb8175ca5814",
|
||||
"packages": [
|
||||
{
|
||||
"name": "pixel418/markdownify",
|
||||
"version": "v2.3.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Elephant418/Markdownify.git",
|
||||
"reference": "891be2176858712c6c4581da410e96fc2019e3f0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/891be2176858712c6c4581da410e96fc2019e3f0",
|
||||
"reference": "891be2176858712c6c4581da410e96fc2019e3f0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8"
|
||||
},
|
||||
"type": "lib",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Markdownify\\": "src",
|
||||
"Test\\Markdownify\\": "test"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Milian Wolff",
|
||||
"email": "mail@milianw.de",
|
||||
"homepage": "http://milianw.de"
|
||||
},
|
||||
{
|
||||
"name": "Thomas Zilliox",
|
||||
"email": "hello@tzi.fr",
|
||||
"homepage": "https://tzi.fr"
|
||||
}
|
||||
],
|
||||
"description": "The HTML to Markdown converter for PHP ",
|
||||
"homepage": "https://github.com/elephant418/Markdownify",
|
||||
"keywords": [
|
||||
"converter",
|
||||
"html",
|
||||
"markdown",
|
||||
"markdownify"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/Elephant418/Markdownify/issues",
|
||||
"source": "https://github.com/Elephant418/Markdownify/tree/master"
|
||||
},
|
||||
"time": "2019-01-22T16:33:43+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": ">=5.4.0"
|
||||
},
|
||||
"platform-dev": [],
|
||||
"platform-overrides": {
|
||||
"php": "8.0.0"
|
||||
},
|
||||
"plugin-api-version": "2.3.0"
|
||||
}
|
61
css/style.css
Normal file
61
css/style.css
Normal file
@ -0,0 +1,61 @@
|
||||
/* SPDX-License-Identifier: EUPL-1.2
|
||||
* Authors: see README.md */
|
||||
.ct-widget.ct-ignition {
|
||||
top: 42px;
|
||||
}
|
||||
.ContentEditor {
|
||||
padding: 16px 16px 16px 144px;
|
||||
background: #234;
|
||||
color: white;
|
||||
}
|
||||
.ContentEditor_Meta {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: #345;
|
||||
color: white;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 1em;
|
||||
font: 16px/1.2 "SF Mono", "Monaco", "Inconsolata", "Fira Mono", "Droid Sans Mono", "Source Code Pro", monospace;
|
||||
border-color: #456;
|
||||
}
|
||||
.ContentEditor::before,
|
||||
.ContentEditor::after {
|
||||
content: "---";
|
||||
font-family: monospace;
|
||||
color: #789;
|
||||
}
|
||||
|
||||
[data-editable] .text-left {
|
||||
text-align: left;
|
||||
}
|
||||
[data-editable] .text-right {
|
||||
text-align: right;
|
||||
}
|
||||
[data-editable] .text-center {
|
||||
text-align: center;
|
||||
}
|
||||
[data-editable] img.text-left,
|
||||
.ce-element--type-image.text-left,
|
||||
.ce-element--type-video.text-left,
|
||||
iframe.text-left {
|
||||
float: left;
|
||||
}
|
||||
[data-editable] img.text-right,
|
||||
.ce-element--type-image.text-right,
|
||||
.ce-element--type-video.text-right,
|
||||
iframe.text-right {
|
||||
float: right;
|
||||
}
|
||||
[data-editable] img.text-center,
|
||||
.ce-element--type-image.text-center,
|
||||
.ce-element--type-video.text-center,
|
||||
iframe.text-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.ce-element--type-image,
|
||||
.ce-element--type-video {
|
||||
display: inline-block;
|
||||
}
|
21
css/vendor/ContentTools/LICENSE
vendored
Normal file
21
css/vendor/ContentTools/LICENSE
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Getme Limited (http://getme.co.uk)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
1
css/vendor/ContentTools/content-tools.min.css
vendored
Normal file
1
css/vendor/ContentTools/content-tools.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
34
css/vendor/ContentTools/images/drop-horz.svg
vendored
Normal file
34
css/vendor/ContentTools/images/drop-horz.svg
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 40 40"
|
||||
preserveAspectRatio="xMaxYMax meet"
|
||||
>
|
||||
<g class="arrows">
|
||||
<polygon
|
||||
points="
|
||||
10, 0
|
||||
0, 10
|
||||
10, 20
|
||||
"
|
||||
fill="#fff"
|
||||
opacity="0.2"
|
||||
/>
|
||||
<polygon
|
||||
points="
|
||||
30, 20
|
||||
20, 30
|
||||
30, 40
|
||||
"
|
||||
fill="#fff"
|
||||
/>
|
||||
<rect
|
||||
x="28"
|
||||
y="25"
|
||||
rx="2"
|
||||
ry="2"
|
||||
width="12"
|
||||
height="10"
|
||||
fill="#fff"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 682 B |
34
css/vendor/ContentTools/images/drop-vert-above.svg
vendored
Normal file
34
css/vendor/ContentTools/images/drop-vert-above.svg
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 40 40"
|
||||
preserveAspectRatio="xMaxYMax meet"
|
||||
>
|
||||
<g class="arrows">
|
||||
<polygon
|
||||
points="
|
||||
0, 10
|
||||
10, 0
|
||||
20, 10
|
||||
"
|
||||
fill="#fff"
|
||||
opacity="0.2"
|
||||
/>
|
||||
<polygon
|
||||
points="
|
||||
20, 30
|
||||
30, 20
|
||||
40, 30
|
||||
"
|
||||
fill="#fff"
|
||||
/>
|
||||
<rect
|
||||
x="25"
|
||||
y="28"
|
||||
rx="2"
|
||||
ry="2"
|
||||
width="10"
|
||||
height="12"
|
||||
fill="#fff"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 681 B |
34
css/vendor/ContentTools/images/drop-vert-below.svg
vendored
Normal file
34
css/vendor/ContentTools/images/drop-vert-below.svg
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 40 40"
|
||||
preserveAspectRatio="xMaxYMax meet"
|
||||
>
|
||||
<g class="arrows">
|
||||
<polygon
|
||||
points="
|
||||
0, 0
|
||||
10, 10
|
||||
20, 0
|
||||
"
|
||||
fill="#fff"
|
||||
opacity="0.2"
|
||||
/>
|
||||
<polygon
|
||||
points="
|
||||
20, 20
|
||||
30, 30
|
||||
40, 20
|
||||
"
|
||||
fill="#fff"
|
||||
/>
|
||||
<rect
|
||||
x="25"
|
||||
y="10"
|
||||
rx="2"
|
||||
ry="2"
|
||||
width="10"
|
||||
height="12"
|
||||
fill="#fff"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 680 B |
BIN
css/vendor/ContentTools/images/icons.woff
vendored
Normal file
BIN
css/vendor/ContentTools/images/icons.woff
vendored
Normal file
Binary file not shown.
28
css/vendor/ContentTools/images/video.svg
vendored
Normal file
28
css/vendor/ContentTools/images/video.svg
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 68 52"
|
||||
preserveAspectRatio="none"
|
||||
>
|
||||
<g class="video">
|
||||
<rect
|
||||
x="2"
|
||||
y="2"
|
||||
rx="12"
|
||||
ry="12"
|
||||
width="64"
|
||||
height="48"
|
||||
fill="transparent"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
/>
|
||||
<polygon
|
||||
points="
|
||||
26, 10
|
||||
46, 26
|
||||
26, 42
|
||||
"
|
||||
fill="#fff"
|
||||
/>
|
||||
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 545 B |
20
css/vendor/noty/LICENSE
vendored
Normal file
20
css/vendor/noty/LICENSE
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
Copyright (c) 2012 Nedim Arabacı
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
216
css/vendor/noty/noty.css
vendored
Normal file
216
css/vendor/noty/noty.css
vendored
Normal file
@ -0,0 +1,216 @@
|
||||
.noty_layout_mixin, #noty_layout__top, #noty_layout__topLeft, #noty_layout__topCenter, #noty_layout__topRight, #noty_layout__bottom, #noty_layout__bottomLeft, #noty_layout__bottomCenter, #noty_layout__bottomRight, #noty_layout__center, #noty_layout__centerLeft, #noty_layout__centerRight {
|
||||
position: fixed;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
z-index: 9999999;
|
||||
-webkit-transform: translateZ(0) scale(1, 1);
|
||||
transform: translateZ(0) scale(1, 1);
|
||||
-webkit-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
-webkit-font-smoothing: subpixel-antialiased;
|
||||
filter: blur(0);
|
||||
-webkit-filter: blur(0);
|
||||
max-width: 90%; }
|
||||
|
||||
#noty_layout__top {
|
||||
top: 0;
|
||||
left: 5%;
|
||||
width: 90%; }
|
||||
|
||||
#noty_layout__topLeft {
|
||||
top: 20px;
|
||||
left: 20px;
|
||||
width: 325px; }
|
||||
|
||||
#noty_layout__topCenter {
|
||||
top: 5%;
|
||||
left: 50%;
|
||||
width: 325px;
|
||||
-webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);
|
||||
transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); }
|
||||
|
||||
#noty_layout__topRight {
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
width: 325px; }
|
||||
|
||||
#noty_layout__bottom {
|
||||
bottom: 0;
|
||||
left: 5%;
|
||||
width: 90%; }
|
||||
|
||||
#noty_layout__bottomLeft {
|
||||
bottom: 20px;
|
||||
left: 20px;
|
||||
width: 325px; }
|
||||
|
||||
#noty_layout__bottomCenter {
|
||||
bottom: 5%;
|
||||
left: 50%;
|
||||
width: 325px;
|
||||
-webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);
|
||||
transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); }
|
||||
|
||||
#noty_layout__bottomRight {
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
width: 325px; }
|
||||
|
||||
#noty_layout__center {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 325px;
|
||||
-webkit-transform: translate(-webkit-calc(-50% - .5px), -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);
|
||||
transform: translate(calc(-50% - .5px), calc(-50% - .5px)) translateZ(0) scale(1, 1); }
|
||||
|
||||
#noty_layout__centerLeft {
|
||||
top: 50%;
|
||||
left: 20px;
|
||||
width: 325px;
|
||||
-webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);
|
||||
transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); }
|
||||
|
||||
#noty_layout__centerRight {
|
||||
top: 50%;
|
||||
right: 20px;
|
||||
width: 325px;
|
||||
-webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);
|
||||
transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); }
|
||||
|
||||
.noty_progressbar {
|
||||
display: none; }
|
||||
|
||||
.noty_has_timeout.noty_has_progressbar .noty_progressbar {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
height: 3px;
|
||||
width: 100%;
|
||||
background-color: #646464;
|
||||
opacity: 0.2;
|
||||
filter: alpha(opacity=10); }
|
||||
|
||||
.noty_bar {
|
||||
-webkit-backface-visibility: hidden;
|
||||
-webkit-transform: translate(0, 0) translateZ(0) scale(1, 1);
|
||||
-ms-transform: translate(0, 0) scale(1, 1);
|
||||
transform: translate(0, 0) scale(1, 1);
|
||||
-webkit-font-smoothing: subpixel-antialiased;
|
||||
overflow: hidden; }
|
||||
|
||||
.noty_effects_open {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate(50%);
|
||||
-ms-transform: translate(50%);
|
||||
transform: translate(50%);
|
||||
-webkit-animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
-webkit-animation-fill-mode: forwards;
|
||||
animation-fill-mode: forwards; }
|
||||
|
||||
.noty_effects_close {
|
||||
-webkit-animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||||
-webkit-animation-fill-mode: forwards;
|
||||
animation-fill-mode: forwards; }
|
||||
|
||||
.noty_fix_effects_height {
|
||||
-webkit-animation: noty_anim_height 75ms ease-out;
|
||||
animation: noty_anim_height 75ms ease-out; }
|
||||
|
||||
.noty_close_with_click {
|
||||
cursor: pointer; }
|
||||
|
||||
.noty_close_button {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
font-weight: bold;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
line-height: 20px;
|
||||
background-color: rgba(0, 0, 0, 0.05);
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
-webkit-transition: all .2s ease-out;
|
||||
transition: all .2s ease-out; }
|
||||
|
||||
.noty_close_button:hover {
|
||||
background-color: rgba(0, 0, 0, 0.1); }
|
||||
|
||||
.noty_modal {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #000;
|
||||
z-index: 10000;
|
||||
opacity: .3;
|
||||
left: 0;
|
||||
top: 0; }
|
||||
|
||||
.noty_modal.noty_modal_open {
|
||||
opacity: 0;
|
||||
-webkit-animation: noty_modal_in .3s ease-out;
|
||||
animation: noty_modal_in .3s ease-out; }
|
||||
|
||||
.noty_modal.noty_modal_close {
|
||||
-webkit-animation: noty_modal_out .3s ease-out;
|
||||
animation: noty_modal_out .3s ease-out;
|
||||
-webkit-animation-fill-mode: forwards;
|
||||
animation-fill-mode: forwards; }
|
||||
|
||||
@-webkit-keyframes noty_modal_in {
|
||||
100% {
|
||||
opacity: .3; } }
|
||||
|
||||
@keyframes noty_modal_in {
|
||||
100% {
|
||||
opacity: .3; } }
|
||||
|
||||
@-webkit-keyframes noty_modal_out {
|
||||
100% {
|
||||
opacity: 0; } }
|
||||
|
||||
@keyframes noty_modal_out {
|
||||
100% {
|
||||
opacity: 0; } }
|
||||
|
||||
@keyframes noty_modal_out {
|
||||
100% {
|
||||
opacity: 0; } }
|
||||
|
||||
@-webkit-keyframes noty_anim_in {
|
||||
100% {
|
||||
-webkit-transform: translate(0);
|
||||
transform: translate(0);
|
||||
opacity: 1; } }
|
||||
|
||||
@keyframes noty_anim_in {
|
||||
100% {
|
||||
-webkit-transform: translate(0);
|
||||
transform: translate(0);
|
||||
opacity: 1; } }
|
||||
|
||||
@-webkit-keyframes noty_anim_out {
|
||||
100% {
|
||||
-webkit-transform: translate(50%);
|
||||
transform: translate(50%);
|
||||
opacity: 0; } }
|
||||
|
||||
@keyframes noty_anim_out {
|
||||
100% {
|
||||
-webkit-transform: translate(50%);
|
||||
transform: translate(50%);
|
||||
opacity: 0; } }
|
||||
|
||||
@-webkit-keyframes noty_anim_height {
|
||||
100% {
|
||||
height: 0; } }
|
||||
|
||||
@keyframes noty_anim_height {
|
||||
100% {
|
||||
height: 0; } }
|
||||
|
||||
/*# sourceMappingURL=noty.css.map*/
|
37
css/vendor/noty/themes/mint.css
vendored
Normal file
37
css/vendor/noty/themes/mint.css
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
.noty_theme__mint.noty_bar {
|
||||
margin: 4px 0;
|
||||
overflow: hidden;
|
||||
border-radius: 2px;
|
||||
position: relative; }
|
||||
.noty_theme__mint.noty_bar .noty_body {
|
||||
padding: 10px;
|
||||
font-size: 14px; }
|
||||
.noty_theme__mint.noty_bar .noty_buttons {
|
||||
padding: 10px; }
|
||||
|
||||
.noty_theme__mint.noty_type__alert,
|
||||
.noty_theme__mint.noty_type__notification {
|
||||
background-color: #fff;
|
||||
border-bottom: 1px solid #D1D1D1;
|
||||
color: #2F2F2F; }
|
||||
|
||||
.noty_theme__mint.noty_type__warning {
|
||||
background-color: #FFAE42;
|
||||
border-bottom: 1px solid #E89F3C;
|
||||
color: #fff; }
|
||||
|
||||
.noty_theme__mint.noty_type__error {
|
||||
background-color: #DE636F;
|
||||
border-bottom: 1px solid #CA5A65;
|
||||
color: #fff; }
|
||||
|
||||
.noty_theme__mint.noty_type__info,
|
||||
.noty_theme__mint.noty_type__information {
|
||||
background-color: #7F7EFF;
|
||||
border-bottom: 1px solid #7473E8;
|
||||
color: #fff; }
|
||||
|
||||
.noty_theme__mint.noty_type__success {
|
||||
background-color: #AFC765;
|
||||
border-bottom: 1px solid #A0B55C;
|
||||
color: #fff; }
|
284
js/editor.js
Normal file
284
js/editor.js
Normal file
@ -0,0 +1,284 @@
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
/*global ContentTools ContentEdit Noty*/
|
||||
|
||||
(function () {
|
||||
|
||||
var Notify = function (type, text) {
|
||||
new Noty({
|
||||
type: type,
|
||||
text: text,
|
||||
timeout: type == 'success' ? 3000 : 5000
|
||||
}).show();
|
||||
};
|
||||
|
||||
var ImageUploader = function (dialog) {
|
||||
var image, xhr, xhrComplete, xhrProgress;
|
||||
|
||||
// Cancel the current upload
|
||||
dialog.addEventListener('imageuploader.cancelupload', function () {
|
||||
// Stop the upload
|
||||
if (xhr) {
|
||||
xhr.upload.removeEventListener('progress', xhrProgress);
|
||||
xhr.removeEventListener('readystatechange', xhrComplete);
|
||||
xhr.abort();
|
||||
}
|
||||
// Set the dialog to empty
|
||||
dialog.state('empty');
|
||||
});
|
||||
|
||||
// Clear the current image
|
||||
dialog.addEventListener('imageuploader.clear', function () {
|
||||
dialog.clear();
|
||||
image = null;
|
||||
});
|
||||
|
||||
// Handle upload progress and completion
|
||||
dialog.addEventListener('imageuploader.fileready', function (ev) {
|
||||
|
||||
function xhrProgress(ev) {
|
||||
// Set the progress for the upload
|
||||
dialog.progress((ev.loaded / ev.total) * 100);
|
||||
}
|
||||
|
||||
function xhrComplete(ev) {
|
||||
var response;
|
||||
|
||||
// Check the request is complete
|
||||
if (ev.target.readyState != 4) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the request
|
||||
xhr = null
|
||||
xhrProgress = null
|
||||
xhrComplete = null
|
||||
|
||||
if (parseInt(ev.target.status) != 200) {
|
||||
// The request failed, notify the user
|
||||
new ContentTools.FlashUI('no');
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle the result of the upload
|
||||
// Unpack the response (from JSON)
|
||||
try {
|
||||
response = JSON.parse(ev.target.responseText);
|
||||
} catch (e) {
|
||||
console.error('PicoContentEditor : UPLOAD ERROR', ev.target.responseText);
|
||||
Notify('error', 'There was an error reading the server response');
|
||||
return;
|
||||
}
|
||||
|
||||
if (response.debug) {
|
||||
console.log('PicoContentEditor : UPLOAD RESPONSE', response);
|
||||
}
|
||||
|
||||
if (response.file) {
|
||||
// Store the image details
|
||||
image = {
|
||||
url: response.file.path,
|
||||
name: response.file.name,
|
||||
width: parseInt(response.file.size[0]),
|
||||
height: parseInt(response.file.size[1])
|
||||
};
|
||||
image.size = [image.width, image.height];
|
||||
|
||||
// Populate the dialog
|
||||
dialog.populate(image.url, image.size);
|
||||
}
|
||||
|
||||
// response notifications
|
||||
response.status.forEach(status => {
|
||||
Notify(status.state ? 'success' : 'warning', status.message);
|
||||
});
|
||||
}
|
||||
|
||||
// Set the dialog state to uploading and reset the progress bar to 0
|
||||
dialog.state('uploading');
|
||||
dialog.progress(0);
|
||||
|
||||
// Build the form data to post to the server
|
||||
var file = ev.detail().file;
|
||||
var formData = new FormData();
|
||||
formData.append('PicoContentEditorUpload', file);
|
||||
|
||||
// Make the request
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.upload.addEventListener('progress', xhrProgress);
|
||||
xhr.addEventListener('readystatechange', xhrComplete);
|
||||
xhr.open('POST', '', true);
|
||||
xhr.send(formData);
|
||||
|
||||
console.log('PicoContentEditor : UPLOAD', file);
|
||||
});
|
||||
|
||||
dialog.addEventListener('imageuploader.save', function () {
|
||||
var crop, cropRegion, formData;
|
||||
// Check if a crop region has been defined by the user
|
||||
if (dialog.cropRegion()) {
|
||||
crop = dialog.cropRegion()
|
||||
}
|
||||
// Trigger the save event against the dialog with details of the
|
||||
// image to be inserted.
|
||||
dialog.save(image.url, image.size, {
|
||||
'alt': image.name,
|
||||
'data-ce-max-width': image.width
|
||||
});
|
||||
|
||||
console.log('PicoContentEditor : INSERT IMAGE', image);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
window.onload = function () {
|
||||
|
||||
var editor;
|
||||
ContentTools.IMAGE_UPLOADER = ImageUploader;
|
||||
|
||||
let applyToImages = function (element) {
|
||||
return element.content !== undefined || element.type() === 'Image' || element.type() === 'Video';
|
||||
}
|
||||
ContentTools.Tools.AlignLeft.canApply = applyToImages;
|
||||
ContentTools.Tools.AlignRight.canApply = applyToImages;
|
||||
ContentTools.Tools.AlignCenter.canApply = applyToImages;
|
||||
|
||||
editor = ContentTools.EditorApp.get();
|
||||
editor.init('[data-editable], [data-fixture]', 'data-name');
|
||||
|
||||
editor.addEventListener('saved', function (ev) {
|
||||
var onStateChange, passive, payload, xhr;
|
||||
|
||||
var edits = ev.detail().regions,
|
||||
regions = editor.regions(),
|
||||
query = {
|
||||
regions: {}
|
||||
},
|
||||
editsNames = Object.keys(edits);
|
||||
|
||||
// Check if this was a passive save
|
||||
passive = ev.detail().passive;
|
||||
|
||||
// Check to see if there are any changes to save
|
||||
if (editsNames.length == 0) return;
|
||||
|
||||
// for fixtures, uses dom innerHTML to get rid of outer el.
|
||||
// see https://github.com/GetmeUK/ContentTools/issues/448
|
||||
editsNames.forEach(name => {
|
||||
var el = regions[name].domElement();
|
||||
// this region is the page meta
|
||||
if (el.dataset.meta !== undefined) {
|
||||
query.meta = el.innerHTML
|
||||
// as we don't use proper region value (see above),
|
||||
// we need to get rid of utility character
|
||||
// see https://github.com/GetmeUK/ContentTools/issues/263
|
||||
query.meta = query.meta.replace(/\u200B/g, '');
|
||||
delete query.regions[name];
|
||||
return;
|
||||
}
|
||||
query.regions[name] = {
|
||||
markdown: el.dataset.editable == 'markdown',
|
||||
html: regions[name].type() == 'Fixture' ? el.innerHTML : regions[name].html()
|
||||
};
|
||||
});
|
||||
|
||||
// Set the editors state to busy while we save our changes
|
||||
this.busy(true);
|
||||
|
||||
// Collect the contents of each region into a FormData instance
|
||||
payload = new FormData();
|
||||
payload.append('PicoContentEditor', JSON.stringify(query));
|
||||
|
||||
// Send the update content to the server to be saved
|
||||
onStateChange = function (ev) {
|
||||
// Check if the request is finished
|
||||
if (ev.target.readyState == 4) {
|
||||
editor.busy(false);
|
||||
if (ev.target.status != '200') {
|
||||
// Save failed, Notify the user with a flash
|
||||
new ContentTools.FlashUI('no');
|
||||
return;
|
||||
}
|
||||
var response;
|
||||
try {
|
||||
response = JSON.parse(ev.target.response);
|
||||
} catch (error) {
|
||||
// response error
|
||||
Notify('error', 'There was an error reading the server response');
|
||||
console.error('PicoContentEditor : SAVE ERROR\n', ev.target.response);
|
||||
return;
|
||||
}
|
||||
if (passive || !response) return;
|
||||
|
||||
if (response.debug) {
|
||||
console.log('PicoContentEditor : SAVE RESPONSE', response);
|
||||
}
|
||||
|
||||
// response notifications
|
||||
response.status.forEach(status => {
|
||||
Notify(status.state ? 'success' : 'warning', status.message);
|
||||
});
|
||||
// debug notifications
|
||||
if (response.debug) {
|
||||
var i = 0;
|
||||
response.edited.regions.forEach(region => {
|
||||
var source = region.source ? `(<em>${region.source.split(/[\\/]/).pop()}</em>)` : '';
|
||||
if (!region.message) return;
|
||||
setTimeout(function () {
|
||||
Notify(
|
||||
region.saved ? 'success' : 'error',
|
||||
`<strong>Debug</strong><br><em>${region.name}</em> : ${region.message} ${source}`
|
||||
);
|
||||
}, 50 * ++i);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
xhr = new XMLHttpRequest();
|
||||
xhr.addEventListener('readystatechange', onStateChange);
|
||||
xhr.open('POST', '');
|
||||
xhr.send(payload);
|
||||
|
||||
console.log('PicoContentEditor : SAVE', query);
|
||||
});
|
||||
|
||||
// Translation
|
||||
var el_lang = document.getElementById('ContentToolsLanguage');
|
||||
if (el_lang && el_lang.dataset.lang) {
|
||||
let translation = JSON.parse(el_lang.textContent);
|
||||
ContentEdit.addTranslations(el_lang.dataset.lang, translation);
|
||||
ContentEdit.LANGUAGE = el_lang.dataset.lang;
|
||||
}
|
||||
|
||||
// Contextual tools
|
||||
var FIXTURE_TOOLS = [
|
||||
['bold', 'italic', 'link'],
|
||||
['undo', 'redo']
|
||||
],
|
||||
IMAGE_FIXTURE_TOOLS = [
|
||||
['undo', 'redo', 'image']
|
||||
],
|
||||
PRE_FIXTURE_TOOLS = [
|
||||
['undo', 'redo']
|
||||
];
|
||||
ContentEdit.Root.get().bind('focus', function (element) {
|
||||
var tools;
|
||||
if (element.isFixed()) {
|
||||
if (element.tagName() === 'pre') {
|
||||
tools = PRE_FIXTURE_TOOLS;
|
||||
} else if (element.type() === 'ImageFixture') {
|
||||
tools = IMAGE_FIXTURE_TOOLS;
|
||||
} else {
|
||||
tools = FIXTURE_TOOLS;
|
||||
}
|
||||
} else {
|
||||
tools = ContentTools.DEFAULT_TOOLS;
|
||||
}
|
||||
if (editor.toolbox().tools() !== tools) {
|
||||
return editor.toolbox().tools(tools);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
}).call(this);
|
87
js/extract-files-from-node-modules.js
Normal file
87
js/extract-files-from-node-modules.js
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: EUPL-1.2
|
||||
* Authors: see README.md
|
||||
*/
|
||||
|
||||
// Extract files that we need from the node_modules folder
|
||||
// The extracted files are integrated to the repository, so production server don't need to
|
||||
// have node installed
|
||||
|
||||
// Include fs and path module
|
||||
|
||||
const fs = require('fs-extra')
|
||||
const path = require('path')
|
||||
|
||||
const basePath = path.join(__dirname, '../')
|
||||
|
||||
function copySync(src, dest, opts) {
|
||||
let parentFolder = path.dirname(dest)
|
||||
if (!fs.existsSync(parentFolder)){
|
||||
fs.mkdirsSync(parentFolder,{recursive:true})
|
||||
}
|
||||
if (fs.existsSync(src)) {
|
||||
fs.copySync(path.join(basePath, src), path.join(basePath, dest), opts)
|
||||
} else {
|
||||
console.log(`${src} is not existing !`)
|
||||
}
|
||||
}
|
||||
|
||||
// ContentTools
|
||||
copySync(
|
||||
'node_modules/ContentTools/build/content-tools.min.css',
|
||||
'css/vendor/ContentTools/content-tools.min.css',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/ContentTools/build/images/',
|
||||
'css/vendor/ContentTools/images/',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/ContentTools/LICENSE',
|
||||
'css/vendor/ContentTools/LICENSE',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/ContentTools/build/content-tools.min.js',
|
||||
'js/vendor/ContentTools/content-tools.min.js',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/ContentTools/translations/',
|
||||
'js/vendor/ContentTools/translations/',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/ContentTools/LICENSE',
|
||||
'js/vendor/ContentTools/LICENSE',
|
||||
{ overwrite: true }
|
||||
)
|
||||
|
||||
// Noty
|
||||
|
||||
copySync(
|
||||
'node_modules/noty/lib/noty.min.js',
|
||||
'js/vendor/noty/noty.min.js',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/noty/LICENSE.txt',
|
||||
'js/vendor/noty/LICENSE',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/noty/lib/noty.css',
|
||||
'css/vendor/noty/noty.css',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/noty/LICENSE.txt',
|
||||
'css/vendor/noty/LICENSE',
|
||||
{ overwrite: true }
|
||||
)
|
||||
copySync(
|
||||
'node_modules/noty/lib/themes/mint.css',
|
||||
'css/vendor/noty/themes/mint.css',
|
||||
{ overwrite: true }
|
||||
)
|
21
js/vendor/ContentTools/LICENSE
vendored
Normal file
21
js/vendor/ContentTools/LICENSE
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Getme Limited (http://getme.co.uk)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
7
js/vendor/ContentTools/content-tools.min.js
vendored
Normal file
7
js/vendor/ContentTools/content-tools.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
51
js/vendor/ContentTools/translations/ar.json
vendored
Normal file
51
js/vendor/ContentTools/translations/ar.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "محاذاة وسط",
|
||||
"Align left": "محاذاة يسار",
|
||||
"Align right": "محاذاة يمين",
|
||||
"Apply": "خزن",
|
||||
"Attributes": "سمات",
|
||||
"Bold": "غامق",
|
||||
"Bullet list": "قائمة غير مرقمة",
|
||||
"Cancel": "إلغاء",
|
||||
"Clear": "مسج",
|
||||
"Code": "برمجة",
|
||||
"Crop marks": "علامات الفص",
|
||||
"Enter a link": "أدخل رابط",
|
||||
"Image": "صورة",
|
||||
"Heading": "عنوان",
|
||||
"Indent": "مسافة بدء",
|
||||
"Insert": "إدراج",
|
||||
"Insert image": "إدراج صورة",
|
||||
"Insert table": "إدراج جدول",
|
||||
"Insert video": "إدراج فيديو",
|
||||
"Italic": "مائل",
|
||||
"Line break": "سطر جديد",
|
||||
"Link": "رابط",
|
||||
"List": "قائمة",
|
||||
"List item": "مادة",
|
||||
"Name": "إسم",
|
||||
"No styles available for this tag": "لا يوجد نمظ لهذا التاغ",
|
||||
"Numbers list": "قائمة مرقمة",
|
||||
"Paste YouTube or Vimeo URL": "ألصق رابط من يوتيوب أو فيميو Youtube - Vimeo",
|
||||
"Paragraph": "فقرة",
|
||||
"Preformatted": "تنسيق مسبق",
|
||||
"Properties": "خصائص",
|
||||
"Redo": "مجدداً",
|
||||
"Remove": "حذف",
|
||||
"Rotate": "تدوير",
|
||||
"Styles": "أنماظ",
|
||||
"Subheading": "عنوان ثانوي",
|
||||
"Table": "جدول",
|
||||
"Table body (columns)": "جسم الجدول - أعمدة",
|
||||
"Table foot": "تذييل الجدول",
|
||||
"Table head": "رأس الجدوب",
|
||||
"Table row": "صف الجدول",
|
||||
"Text": "نص",
|
||||
"Undo": "تراجع",
|
||||
"Unindent": "إزالة مسافة البدء",
|
||||
"Update table": "تحديث الجدول",
|
||||
"Upload": "رفع",
|
||||
"Value": "قيمة",
|
||||
"Video": "فيديو",
|
||||
"Your changes have not been saved, do you really want to lose them?": "لم يتم حزن تغييراتك, هل ترغب حقاً بضياعها؟"
|
||||
}
|
51
js/vendor/ContentTools/translations/ca.json
vendored
Normal file
51
js/vendor/ContentTools/translations/ca.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centrar",
|
||||
"Align left": "Alinear a l'esquerra",
|
||||
"Align right": "Alinear a la dreta",
|
||||
"Apply": "Aplica",
|
||||
"Attributes": "Atributs",
|
||||
"Bold": "Negreta",
|
||||
"Bullet list": "Llista simple",
|
||||
"Cancel": "Cancel·la",
|
||||
"Clear": "Neteja",
|
||||
"Code": "Codi",
|
||||
"Crop marks": "Marques de tall",
|
||||
"Enter a link": "Inserta un enllaç",
|
||||
"Image": "Imatge",
|
||||
"Heading": "Capçalera",
|
||||
"Indent": "Sagnat",
|
||||
"Insert": "Inserta",
|
||||
"Insert image": "Inserta una imatge",
|
||||
"Insert table": "Inserta una taula",
|
||||
"Insert video": "Inserta un vídeo",
|
||||
"Italic": "Cursiva",
|
||||
"Line break": "Salt de línia",
|
||||
"Link": "Enllaç / Hipervincle",
|
||||
"List": "Llista",
|
||||
"List item": "Element de llista",
|
||||
"Name": "Nom",
|
||||
"No styles available for this tag": "No hi han estils disponibles per aquesta etiqueta",
|
||||
"Numbers list": "Llista numèrica",
|
||||
"Paste YouTube or Vimeo URL": "Enganxa la URL de Youtube o Vimeo aquí",
|
||||
"Paragraph": "Pàrraf",
|
||||
"Preformatted": "Text preformatejat",
|
||||
"Properties": "Propietats",
|
||||
"Redo": "Refer",
|
||||
"Remove": "Esborrar",
|
||||
"Rotate": "Rotar",
|
||||
"Styles": "Estils",
|
||||
"Subheading": "Subtítols",
|
||||
"Table": "Taula",
|
||||
"Table body (columns)": "Cos de la taula (columnes)",
|
||||
"Table foot": "Peu de taula",
|
||||
"Table head": "Capçalera de taula",
|
||||
"Table row": "Línia de taula",
|
||||
"Text": "Text",
|
||||
"Undo": "Desfer",
|
||||
"Unindent": "Redueix sagnat",
|
||||
"Update table": "Actualitza la taula",
|
||||
"Upload": "Pujar",
|
||||
"Value": "Valor",
|
||||
"Video": "Vídeo",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Els canvis no s'han desat. Estàs totalment segur de no voler guardar?"
|
||||
}
|
51
js/vendor/ContentTools/translations/cs.json
vendored
Normal file
51
js/vendor/ContentTools/translations/cs.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Zarovnat na střed",
|
||||
"Align left": "Zarovnat vlevo",
|
||||
"Align right": "Zarovnat vpravo",
|
||||
"Apply": "Použít",
|
||||
"Attributes": "Atributy",
|
||||
"Bold": "Tučně",
|
||||
"Bullet list": "Odrážkový seznam",
|
||||
"Cancel": "Zrušit",
|
||||
"Clear": "Vymazat",
|
||||
"Code": "Kód",
|
||||
"Crop marks": "Ořezové značky",
|
||||
"Enter a link": "Vložte odkaz",
|
||||
"Image": "Obrázek",
|
||||
"Heading": "Nadpis",
|
||||
"Indent": "Zvětšit odsazení",
|
||||
"Insert": "Vložit",
|
||||
"Insert image": "Vložit obrázek",
|
||||
"Insert table": "Vložit tabulku",
|
||||
"Insert video": "Vložit video",
|
||||
"Italic": "Kurzívou",
|
||||
"Line break": "Zalomit řádek",
|
||||
"Link": "Odkaz",
|
||||
"List": "Seznam",
|
||||
"List item": "Položka seznamu",
|
||||
"Name": "Jméno",
|
||||
"No styles available for this tag": "Nenalezeny žádné styly pro tento tag",
|
||||
"Numbers list": "Číslovaný seznam",
|
||||
"Paste YouTube or Vimeo URL": "Vložte odkaz z Youtube nebo Vimeo",
|
||||
"Paragraph": "Odstavec",
|
||||
"Preformatted": "Předformátovaný",
|
||||
"Properties": "Vlastnosti",
|
||||
"Redo": "Znovu",
|
||||
"Remove": "Odebrat",
|
||||
"Rotate": "Otočit",
|
||||
"Styles": "Styly",
|
||||
"Subheading": "Podnadpis",
|
||||
"Table": "Tabulka",
|
||||
"Table body (columns)": "Tělo tabulky (sloupce)",
|
||||
"Table foot": "Zápatí tabulky",
|
||||
"Table head": "Záhlaví tabulky",
|
||||
"Table row": "Řádek tabulky",
|
||||
"Text": "Text",
|
||||
"Undo": "Zpět",
|
||||
"Unindent": "Zmenšit odsazení",
|
||||
"Update table": "Aktualizovat tabulku",
|
||||
"Upload": "Nahrát",
|
||||
"Value": "Hodnota",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Provedené změny nebyly uloženy, opravdu je chcete zrušit?"
|
||||
}
|
51
js/vendor/ContentTools/translations/da.json
vendored
Normal file
51
js/vendor/ContentTools/translations/da.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centrer",
|
||||
"Align left": "Venstrestil",
|
||||
"Align right": "Højrestil",
|
||||
"Apply": "Anvend",
|
||||
"Attributes": "Attributter",
|
||||
"Bold": "Fed",
|
||||
"Bullet list": "Punktliste",
|
||||
"Cancel": "Annuller",
|
||||
"Clear": "Ryd",
|
||||
"Code": "Kode",
|
||||
"Crop marks": "Beskæringsmærker",
|
||||
"Enter a link": "Angiv et link",
|
||||
"Image": "Billede",
|
||||
"Heading": "Overskrift",
|
||||
"Indent": "Indenter",
|
||||
"Insert": "Indsæt",
|
||||
"Insert image": "Indsæt billede",
|
||||
"Insert table": "Indsæt tabel",
|
||||
"Insert video": "Indsæt video",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Linjeskift",
|
||||
"Link": "Link",
|
||||
"List": "Liste",
|
||||
"List item": "Liste element",
|
||||
"Name": "Navn",
|
||||
"No styles available for this tag": "Ingen styles er tilgængelige for dette tag",
|
||||
"Numbers list": "Nummereret liste",
|
||||
"Paste YouTube or Vimeo URL": "Indsæt YouTube eller Vimeo URL",
|
||||
"Paragraph": "Afsnit",
|
||||
"Preformatted": "Formateret",
|
||||
"Properties": "Egenskaber",
|
||||
"Redo": "Gendan",
|
||||
"Remove": "Fjern",
|
||||
"Rotate": "Roter",
|
||||
"Styles": "Styles",
|
||||
"Subheading": "Underoverskrift",
|
||||
"Table": "Tabel",
|
||||
"Table body (columns)": "Tabel indhold (kolonner)",
|
||||
"Table foot": "Tabelfod",
|
||||
"Table head": "Tabelhoved",
|
||||
"Table row": "Tabelrække",
|
||||
"Text": "Tekst",
|
||||
"Undo": "Fortryd",
|
||||
"Unindent": "Afindryk",
|
||||
"Update table": "Opdater tabel",
|
||||
"Upload": "Upload",
|
||||
"Value": "Værdi",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Dine ændringer er ikke blevet gemt, ønsker du virkelig at miste disse?"
|
||||
}
|
51
js/vendor/ContentTools/translations/de.json
vendored
Normal file
51
js/vendor/ContentTools/translations/de.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Zentrieren",
|
||||
"Align left": "Linksbündig ausrichten",
|
||||
"Align right": "Rechtsbündig ausrichten",
|
||||
"Apply": "Anwenden",
|
||||
"Attributes": "Attribute",
|
||||
"Bold": "Fett",
|
||||
"Bullet list": "Aufzählungszeichen",
|
||||
"Cancel": "Abbrechen",
|
||||
"Clear": "Leeren",
|
||||
"Code": "Code",
|
||||
"Crop marks": "Schnittmarken",
|
||||
"Enter a link": "Verknüpfung einfügen",
|
||||
"Image": "Bild",
|
||||
"Heading": "Überschrift",
|
||||
"Indent": "Einzug vergrößern",
|
||||
"Insert": "Einfügen",
|
||||
"Insert image": "Bild einfügen",
|
||||
"Insert table": "Tabelle einfügen",
|
||||
"Insert video": "Video einfügen",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Zeilenumbruch",
|
||||
"Link": "Verknüpfung",
|
||||
"List": "Liste",
|
||||
"List item": "Listenelement",
|
||||
"Name": "Name",
|
||||
"No styles available for this tag": "Keine Stile für diesen Tag verfügbar",
|
||||
"Numbers list": "nummerierte Liste",
|
||||
"Paste YouTube or Vimeo URL": "YouTube oder Vimeo URL einfügen",
|
||||
"Paragraph": "Absatz",
|
||||
"Preformatted": "Vorformatiert",
|
||||
"Properties": "Eigenschaften",
|
||||
"Redo": "Wiederholen",
|
||||
"Remove": "Löschen",
|
||||
"Rotate": "Drehen",
|
||||
"Styles": "Stile",
|
||||
"Subheading": "Untertitel",
|
||||
"Table": "Tabelle",
|
||||
"Table body (columns)": "Tabellenkörper (Spalten)",
|
||||
"Table foot": "Tabellenfuß",
|
||||
"Table head": "Tabellenkopf",
|
||||
"Table row": "Tabellenzeile",
|
||||
"Text": "Text",
|
||||
"Undo": "Rückgängig",
|
||||
"Unindent": "Einzug verkleinern",
|
||||
"Update table": "Tabelle aktualisieren",
|
||||
"Upload": "Hochladen",
|
||||
"Value": "Wert",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Ihre Änderungen wurden nicht gespeichert, wollen Sie sie wirklich verlieren?"
|
||||
}
|
51
js/vendor/ContentTools/translations/es.json
vendored
Normal file
51
js/vendor/ContentTools/translations/es.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centrar",
|
||||
"Align left": "Alinear a la Izquierda",
|
||||
"Align right": "Alinear a la Derecha",
|
||||
"Apply": "Aplicar",
|
||||
"Attributes": "Attributos",
|
||||
"Bold": "Negrita",
|
||||
"Bullet list": "Lista simple",
|
||||
"Cancel": "Cancelar",
|
||||
"Clear": "Limpiar",
|
||||
"Code": "Codigo",
|
||||
"Crop marks": "Marcas de corte",
|
||||
"Enter a link": "Inserte un enlace",
|
||||
"Image": "Imagen",
|
||||
"Heading": "Cabecera",
|
||||
"Indent": "Sangría",
|
||||
"Insert": "Insertar",
|
||||
"Insert image": "Insertar una imágen",
|
||||
"Insert table": "Insertar una tabla",
|
||||
"Insert video": "Insertar un video",
|
||||
"Italic": "Itálica",
|
||||
"Line break": "Salto de linea",
|
||||
"Link": "Enlace",
|
||||
"List": "Lista",
|
||||
"List item": "Elemento de Lista",
|
||||
"Name": "Nombre",
|
||||
"No styles available for this tag": "No hay estilos disponibles para esta etiqueta",
|
||||
"Numbers list": "Lista numérica",
|
||||
"Paste YouTube or Vimeo URL": "Pegar URL de Youtube o Vimeo",
|
||||
"Paragraph": "Párrafo",
|
||||
"Preformatted": "Preformateado",
|
||||
"Properties": "Propiedades",
|
||||
"Redo": "Rehacer",
|
||||
"Remove": "Eliminar",
|
||||
"Rotate": "Rotar",
|
||||
"Styles": "Estilos",
|
||||
"Subheading": "Subtítulo",
|
||||
"Table": "Tabla",
|
||||
"Table body (columns)": "cuerpo de la tabla (columnas)",
|
||||
"Table foot": "Pie de tabla",
|
||||
"Table head": "Cabecera de Tabla",
|
||||
"Table row": "Linea de Tabla",
|
||||
"Text": "Texto",
|
||||
"Undo": "Deshacer",
|
||||
"Unindent": "Quitar Sangría",
|
||||
"Update table": "Actualizar tabla",
|
||||
"Upload": "Subir",
|
||||
"Value": "Valor",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Los cambios no han sido grabados, esta seguro que quiere perder los cambios?"
|
||||
}
|
51
js/vendor/ContentTools/translations/fa.json
vendored
Normal file
51
js/vendor/ContentTools/translations/fa.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "وسط چین",
|
||||
"Align left": "چپ چین",
|
||||
"Align right": "راست چین",
|
||||
"Apply": "اعمال",
|
||||
"Attributes": "ویژگی",
|
||||
"Bold": "ضخیم",
|
||||
"Bullet list": "لیست بالت ها",
|
||||
"Cancel": "لغو",
|
||||
"Clear": "پاکسازی",
|
||||
"Code": "کد",
|
||||
"Crop marks": "بریدن علامت",
|
||||
"Enter a link": "درج لینک",
|
||||
"Image": "تصویر",
|
||||
"Heading": "سربرگ",
|
||||
"Indent": "فروفرتگی",
|
||||
"Insert": "درح",
|
||||
"Insert image": "درج تصویر",
|
||||
"Insert table": "درج جدول",
|
||||
"Insert video": "درج فیلم",
|
||||
"Italic": "خمیده",
|
||||
"Line break": "شکست خط",
|
||||
"Link": "لینک",
|
||||
"List": "لیست",
|
||||
"List item": "لیست آیتم",
|
||||
"Name": "نام",
|
||||
"No styles available for this tag": "هیچ استایلی برای این تگ وجود ندارد",
|
||||
"Numbers list": "لیست اعداد",
|
||||
"Paste YouTube or Vimeo URL": "افزودن فیلم از یوتیوب یا وایمو",
|
||||
"Paragraph": "پاراگراف",
|
||||
"Preformatted": "پیش فرمت",
|
||||
"Properties": "ویژگی ها",
|
||||
"Redo": "جلورفت",
|
||||
"Remove": "حذف",
|
||||
"Rotate": "چرخش",
|
||||
"Styles": "ظاهر",
|
||||
"Subheading": "زیر سربرگ",
|
||||
"Table": "جدول",
|
||||
"Table body (columns)": "بدنه جدول (ستون ها)",
|
||||
"Table foot": "پابرگ جدول",
|
||||
"Table head": "سربرگ جدول",
|
||||
"Table row": "سطر جدول",
|
||||
"Text": "متن",
|
||||
"Undo": "برگشت به عقب",
|
||||
"Unindent": "unident",
|
||||
"Update table": "بروزرسانی جدول",
|
||||
"Upload": "بارگذاری",
|
||||
"Value": "مقدار",
|
||||
"Video": "ویديو",
|
||||
"Your changes have not been saved, do you really want to lose them?": "تغییرات شما ذخیره نشده است ، آیا میخواهید آنها را نادیده بگیرید ؟"
|
||||
}
|
51
js/vendor/ContentTools/translations/fr.json
vendored
Normal file
51
js/vendor/ContentTools/translations/fr.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Aligner au centre",
|
||||
"Align left": "Aligner à gauche",
|
||||
"Align right": "Aligner à droite",
|
||||
"Apply": "Appliquer",
|
||||
"Attributes": "Attributs",
|
||||
"Bold": "Gras",
|
||||
"Bullet list": "Liste à puces",
|
||||
"Cancel": "Annuler",
|
||||
"Clear": "Effacer",
|
||||
"Code": "Code",
|
||||
"Crop marks": "Repères de coupe",
|
||||
"Enter a link": "Ajouter un lien",
|
||||
"Image": "Image",
|
||||
"Heading": "En tête",
|
||||
"Indent": "Indenter",
|
||||
"Insert": "Insérer",
|
||||
"Insert image": "Insérer une image",
|
||||
"Insert table": "Insérer une table",
|
||||
"Insert video": "Insérer une vidéo",
|
||||
"Italic": "Italique",
|
||||
"Line break": "Saut de ligne",
|
||||
"Link": "Lien",
|
||||
"List": "Liste",
|
||||
"List item": "Élément de liste",
|
||||
"Name": "Nom",
|
||||
"No styles available for this tag": "Pas de style disponible pour ce marqueur",
|
||||
"Numbers list": "Liste numérique",
|
||||
"Paste YouTube or Vimeo URL": "Saisissez un lien YouTube ou Vimeo",
|
||||
"Paragraph": "Paragraphe",
|
||||
"Preformatted": "Préformaté",
|
||||
"Properties": "Propriétés",
|
||||
"Redo": "Refaire",
|
||||
"Remove": "Effacer",
|
||||
"Rotate": "Tourner",
|
||||
"Styles": "Styles",
|
||||
"Subheading": "Sous-titre",
|
||||
"Table": "Table",
|
||||
"Table body (columns)": "Corps de table (colonnes)",
|
||||
"Table foot": "Pied de table",
|
||||
"Table head": "Tête de table",
|
||||
"Table row": "Ligne de table",
|
||||
"Text": "Texte",
|
||||
"Undo": "Annuler",
|
||||
"Unindent": "Désindenter",
|
||||
"Update table": "Mettre à jour la table",
|
||||
"Upload": "Télécharger",
|
||||
"Value": "Valeur",
|
||||
"Video": "Vidéo",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Vos changements n'ont pas été enregistrés, êtes-vous sûr de vouloir les perdre?"
|
||||
}
|
51
js/vendor/ContentTools/translations/he.json
vendored
Normal file
51
js/vendor/ContentTools/translations/he.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "ישר למרכז",
|
||||
"Align left": "ישר לשמאל",
|
||||
"Align right": "ישר לימין",
|
||||
"Apply": "בצע",
|
||||
"Attributes": "תכונות",
|
||||
"Bold": "מודגש",
|
||||
"Bullet list": "רשימת תבליטים",
|
||||
"Cancel": "בטל",
|
||||
"Clear": "נקה",
|
||||
"Code": "קוד",
|
||||
"Crop marks": "סימני חיתוך",
|
||||
"Enter a link": "הכנס קישור",
|
||||
"Image": "תמונה",
|
||||
"Heading": "כותרת",
|
||||
"Indent": "כניסה",
|
||||
"Insert": "הכנס",
|
||||
"Insert image": "הכנס תמונה",
|
||||
"Insert table": "הכנס טבלה",
|
||||
"Insert video": "הכנס וידאו",
|
||||
"Italic": "נטוי",
|
||||
"Line break": "שובר שורה",
|
||||
"Link": "קישור",
|
||||
"List": "רשימה",
|
||||
"List item": "רשומה",
|
||||
"Name": "שם",
|
||||
"No styles available for this tag": "אין סגנונות עבור תגים זאת",
|
||||
"Numbers list": "רשימה ממוספרת",
|
||||
"Paste YouTube or Vimeo URL": "הדבק קישור יוטיוב או וימאו",
|
||||
"Paragraph": "פיסקה",
|
||||
"Preformatted": "כולל סיגנון",
|
||||
"Properties": "תכונות",
|
||||
"Redo": "בצע שוב",
|
||||
"Remove": "הסר",
|
||||
"Rotate": "סובב",
|
||||
"Styles": "סגנונות",
|
||||
"Subheading": "תת-כותרת",
|
||||
"Table": "טבלה",
|
||||
"Table body (columns)": "גוף הטבלה (עמודות)",
|
||||
"Table foot": "תחתית הטבלה",
|
||||
"Table head": "ראש הטבלה",
|
||||
"Table row": "שורת טבלה",
|
||||
"Text": "טקסט",
|
||||
"Undo": "בטל",
|
||||
"Unindent": "הורד כניסה",
|
||||
"Update table": "עדכן טבלה",
|
||||
"Upload": "העלאה",
|
||||
"Value": "ערך",
|
||||
"Video": "וידאו",
|
||||
"Your changes have not been saved, do you really want to lose them?": "השינויים לא נשמרו, אתה בטוח שאתה רוצה לאבד אותם?"
|
||||
}
|
51
js/vendor/ContentTools/translations/hu.json
vendored
Normal file
51
js/vendor/ContentTools/translations/hu.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Középre igazítás",
|
||||
"Align left": "Balra igazítás",
|
||||
"Align right": "Jobbra igazítás",
|
||||
"Apply": "Alkalmazás",
|
||||
"Attributes": "Attribútumok",
|
||||
"Bold": "Félkövér",
|
||||
"Bullet list": "Felsorolás",
|
||||
"Cancel": "Mégsem",
|
||||
"Clear": "Kirüítés",
|
||||
"Code": "Kód",
|
||||
"Crop marks": "Vágójelek",
|
||||
"Enter a link": "Hivatkozás beszúrása",
|
||||
"Image": "Kép",
|
||||
"Heading": "Cím",
|
||||
"Indent": "Behúzás növelése",
|
||||
"Insert": "Beszúrás",
|
||||
"Insert image": "Kép beszúrása",
|
||||
"Insert table": "Táblázat beszúrása",
|
||||
"Insert video": "Videó beszúrása",
|
||||
"Italic": "Dőlt",
|
||||
"Line break": "Sortörés",
|
||||
"Link": "Hivatkozás",
|
||||
"List": "Lista",
|
||||
"List item": "Listaelem",
|
||||
"Name": "Név",
|
||||
"No styles available for this tag": "Ehhez az elemhez nincsenek elérhető stílusok",
|
||||
"Numbers list": "Számozott lista",
|
||||
"Paste YouTube or Vimeo URL": "YouTube vagy Vimeo URL",
|
||||
"Paragraph": "Bekezdés",
|
||||
"Preformatted": "Előformázott",
|
||||
"Properties": "Tulajdonságok",
|
||||
"Redo": "Újra",
|
||||
"Remove": "Törlés",
|
||||
"Rotate": "Elforgatás",
|
||||
"Styles": "Stílusok",
|
||||
"Subheading": "Alcím",
|
||||
"Table": "Táblázat",
|
||||
"Table body (columns)": "Táblázattörzs (oszlopok száma)",
|
||||
"Table foot": "Táblázat-lábléc",
|
||||
"Table head": "Táblázat-fejléc",
|
||||
"Table row": "Táblázat sor",
|
||||
"Text": "Szöveg",
|
||||
"Undo": "Visszavonás",
|
||||
"Unindent": "Behúzás csökkentése",
|
||||
"Update table": "Táblázat frissítése",
|
||||
"Upload": "Feltöltés",
|
||||
"Value": "Érték",
|
||||
"Video": "Videó",
|
||||
"Your changes have not been saved, do you really want to lose them?": "A változtatások nincsenek elmentve. Biztosan elveted őket?"
|
||||
}
|
51
js/vendor/ContentTools/translations/it.json
vendored
Normal file
51
js/vendor/ContentTools/translations/it.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Allineato al centro",
|
||||
"Align left": "Allineato a sinistra",
|
||||
"Align right": "Allineato a destra",
|
||||
"Apply": "Applica",
|
||||
"Attributes": "Attributi",
|
||||
"Bold": "Grassetto",
|
||||
"Bullet list": "Lista puntata",
|
||||
"Cancel": "Annulla",
|
||||
"Clear": "Pulisci",
|
||||
"Code": "Codice",
|
||||
"Crop marks": "Ritaglia",
|
||||
"Enter a link": "Inserisci un link",
|
||||
"Image": "Immagine",
|
||||
"Heading": "Titolo",
|
||||
"Indent": "Indentazione",
|
||||
"Insert": "Inserisci",
|
||||
"Insert image": "Inserisci una immagine",
|
||||
"Insert table": "Inserisci una tabella",
|
||||
"Insert video": "Inserisci un video",
|
||||
"Italic": "Italico",
|
||||
"Line break": "Interruzione di linea",
|
||||
"Link": "Link",
|
||||
"List": "Lista",
|
||||
"List item": "Elemento della lista",
|
||||
"Name": "Nome",
|
||||
"No styles available for this tag": "Non ci sono stili per questo tag",
|
||||
"Numbers list": "Lista numerata",
|
||||
"Paste YouTube or Vimeo URL": "Incolla la url di YouTube o di Vimeo",
|
||||
"Paragraph": "Paragrafo",
|
||||
"Preformatted": "Preformattato",
|
||||
"Properties": "Proprietà",
|
||||
"Redo": "Rifare",
|
||||
"Remove": "Rimuovi",
|
||||
"Rotate": "Ruota",
|
||||
"Styles": "Stili",
|
||||
"Subheading": "Sottotitolo",
|
||||
"Table": "Tabella",
|
||||
"Table body (columns)": "Corpo della tabella (colonne)",
|
||||
"Table foot": "Piede della tabella",
|
||||
"Table head": "Intestazione della tabella",
|
||||
"Table row": "Riga della tabella",
|
||||
"Text": "Testo",
|
||||
"Undo": "Annullare",
|
||||
"Unindent": "Togli indentazione",
|
||||
"Update table": "Aggiorna tabella",
|
||||
"Upload": "Carica",
|
||||
"Value": "Valore",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "I tuoi cambiamenti non sono stati salvati, vuoi perderli realmente?"
|
||||
}
|
51
js/vendor/ContentTools/translations/ko.json
vendored
Normal file
51
js/vendor/ContentTools/translations/ko.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "가운데 정렬",
|
||||
"Align left": "왼쪽으로 정렬",
|
||||
"Align right": "오른쪽으로 정렬",
|
||||
"Apply": "적용하기",
|
||||
"Attributes": "항목들",
|
||||
"Bold": "굵게",
|
||||
"Bullet list": "열거 목록",
|
||||
"Cancel": "취소",
|
||||
"Clear": "청소",
|
||||
"Code": "코드",
|
||||
"Crop marks": "Crop marks",
|
||||
"Enter a link": "링크 입력",
|
||||
"Image": "사진",
|
||||
"Heading": "제목",
|
||||
"Indent": "들여쓰기",
|
||||
"Insert": "삽입",
|
||||
"Insert image": "이미지 삽입하기",
|
||||
"Insert table": "표 삽입하기",
|
||||
"Insert video": "동영상 삽입하기",
|
||||
"Italic": "기울어짐",
|
||||
"Line break": "줄바꿈",
|
||||
"Link": "링크",
|
||||
"List": "목록",
|
||||
"List item": "목록 항목",
|
||||
"Name": "이름",
|
||||
"No styles available for this tag": "이 태그에 적용할 수 있는 스타일이 존재하지 않습니다",
|
||||
"Numbers list": "숫자 목록",
|
||||
"Paste YouTube or Vimeo URL": "YouTube 혹은 Vimeo의 URL을 입력해주세요",
|
||||
"Paragraph": "문단",
|
||||
"Preformatted": "사전 정의된 텍스트",
|
||||
"Properties": "속성",
|
||||
"Redo": "앞으로 되돌리기",
|
||||
"Remove": "제거",
|
||||
"Rotate": "회전",
|
||||
"Styles": "스타일",
|
||||
"Subheading": "부제",
|
||||
"Table": "표",
|
||||
"Table body (columns)": "표 본문 (열)",
|
||||
"Table foot": "표 하단",
|
||||
"Table head": "표 상단",
|
||||
"Table row": "표 행",
|
||||
"Text": "글자",
|
||||
"Undo": "이전으로 되돌리기",
|
||||
"Unindent": "들여쓰기 수정",
|
||||
"Update table": "표 수정하기",
|
||||
"Upload": "업로드",
|
||||
"Value": "값",
|
||||
"Video": "동영상",
|
||||
"Your changes have not been saved, do you really want to lose them?": "작성한 항목이 저장되지 않았습니다, 페이지를 빠져나갈 경우 작성한 항목들이 모두 사라집니다."
|
||||
}
|
51
js/vendor/ContentTools/translations/lp.json
vendored
Normal file
51
js/vendor/ContentTools/translations/lp.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Alignway entercay",
|
||||
"Align left": "Alignway eftlay",
|
||||
"Align right": "Alignway ightray",
|
||||
"Apply": "Applyway",
|
||||
"Attributes": "Attributesway",
|
||||
"Bold": "Oldbay",
|
||||
"Bullet list": "Ulletbay istlay",
|
||||
"Cancel": "Ancelcay",
|
||||
"Clear": "Earclay",
|
||||
"Code": "Odecay",
|
||||
"Crop marks": "Opmarkscray",
|
||||
"Enter a link": "Enterway away inklay",
|
||||
"Image": "Imageway",
|
||||
"Heading": "Eadinghay",
|
||||
"Indent": "Indentway",
|
||||
"Insert": "Insertway",
|
||||
"Insert image": "Insertway imageway",
|
||||
"Insert table": "Insertway abletay",
|
||||
"Insert video": "Insertway ideovay",
|
||||
"Italic": "Italicway",
|
||||
"Line break": "Inelay eakbray",
|
||||
"Link": "Inklay",
|
||||
"List": "Istlay",
|
||||
"List item": "Istlay itemway",
|
||||
"Name": "Amenay",
|
||||
"No styles available for this tag": "Onay ylesstay availableway orfay isthay agtay",
|
||||
"Numbers list": "Umbersnay istlay",
|
||||
"Paste YouTube or Vimeo URL": "Astepay YouTube orway Vimeo URL",
|
||||
"Paragraph": "Aragraphpay",
|
||||
"Preformatted": "Eformattedpray",
|
||||
"Properties": "Opertiespray",
|
||||
"Redo": "Edoray",
|
||||
"Remove": "Emoveray",
|
||||
"Rotate": "Otateray",
|
||||
"Styles": "Ylesstay",
|
||||
"Subheading": "Ubheadingsay",
|
||||
"Table": "Abletay",
|
||||
"Table body (columns)": "Abletay odybay (olumnscay)",
|
||||
"Table foot": "Abletay ootfay",
|
||||
"Table head": "Abletay eadhay",
|
||||
"Table row": "Abletay owray",
|
||||
"Text": "Exttay",
|
||||
"Undo": "Undoway",
|
||||
"Unindent": "Unindentway",
|
||||
"Update table": "Updateway abletay",
|
||||
"Upload": "Uploadway",
|
||||
"Value": "Aluevay",
|
||||
"Video": "Ideovay",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Ouryay angeschay avehay otnay eenbay avedsay, oday ouyay eallyray antway otay oselay emthay?"
|
||||
}
|
51
js/vendor/ContentTools/translations/nb.json
vendored
Normal file
51
js/vendor/ContentTools/translations/nb.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Midtstill",
|
||||
"Align left": "Venstrejuster",
|
||||
"Align right": "Høyrejuster",
|
||||
"Apply": "Bruk",
|
||||
"Attributes": "Attributter",
|
||||
"Bold": "Fet",
|
||||
"Bullet list": "Punktliste",
|
||||
"Cancel": "Avbryt",
|
||||
"Clear": "Fjern",
|
||||
"Code": "Kode",
|
||||
"Crop marks": "Beskjæringsmerker",
|
||||
"Enter a link": "Angi en lenke",
|
||||
"Image": "Bilde",
|
||||
"Heading": "Overskrift",
|
||||
"Indent": "Indentér",
|
||||
"Insert": "Sett inn",
|
||||
"Insert image": "Sett inn bilde",
|
||||
"Insert table": "Sett inn tabell",
|
||||
"Insert video": "Sett inn video",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Linjeskift",
|
||||
"Link": "Lenke",
|
||||
"List": "Liste",
|
||||
"List item": "Listeelement",
|
||||
"Name": "Navn",
|
||||
"No styles available for this tag": "Ingen stiler er tilgjengelige for denne tagen",
|
||||
"Numbers list": "Nummerert liste",
|
||||
"Paste YouTube or Vimeo URL": "Lim inn YouTube eller Vimeo URL",
|
||||
"Paragraph": "Avsnitt",
|
||||
"Preformatted": "Formatert",
|
||||
"Properties": "Egenskaper",
|
||||
"Redo": "Gjenta",
|
||||
"Remove": "Fjern",
|
||||
"Rotate": "Rotér",
|
||||
"Styles": "Stiler",
|
||||
"Subheading": "Underoverskrift",
|
||||
"Table": "Tabell",
|
||||
"Table body (columns)": "Tabellinnhold (kolonner)",
|
||||
"Table foot": "Tabellfooter",
|
||||
"Table head": "Tabellheader",
|
||||
"Table row": "Tabellrekke",
|
||||
"Text": "Tekst",
|
||||
"Undo": "Angre",
|
||||
"Unindent": "Reduser innrykk",
|
||||
"Update table": "Oppdater tabell",
|
||||
"Upload": "Last opp",
|
||||
"Value": "Verdi",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Dine endringer er ikke lagret, ønsker du virkelig å miste dem?"
|
||||
}
|
51
js/vendor/ContentTools/translations/nl.json
vendored
Normal file
51
js/vendor/ContentTools/translations/nl.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centreren",
|
||||
"Align left": "Links uitlijnen",
|
||||
"Align right": "Rechts uitlijnen",
|
||||
"Apply": "Bevestingen",
|
||||
"Attributes": "Attributen",
|
||||
"Bold": "Dikgedrukt",
|
||||
"Bullet list": "Ongeordende lijst",
|
||||
"Cancel": "Annuleren",
|
||||
"Clear": "Wissen",
|
||||
"Code": "Code",
|
||||
"Crop marks": "Snijtekens",
|
||||
"Enter a link": "Voer een link in",
|
||||
"Image": "Afbeelding",
|
||||
"Heading": "Titel",
|
||||
"Indent": "Inspringen",
|
||||
"Insert": "Invoegen",
|
||||
"Insert image": "Afbeelding invoegen",
|
||||
"Insert table": "Tabel invoegen",
|
||||
"Insert video": "Video invoegen",
|
||||
"Italic": "Cursief",
|
||||
"Line break": "Regeleinde",
|
||||
"Link": "Link",
|
||||
"List": "Lijst",
|
||||
"List item": "Lijst element",
|
||||
"Name": "Naam",
|
||||
"No styles available for this tag": "Er zijn geen stijlen beschikbaar voor deze tag",
|
||||
"Numbers list": "Genummerde lijst",
|
||||
"Paste YouTube or Vimeo URL": "YouTube of Vimeo URL invoegen",
|
||||
"Paragraph": "Paragraaf",
|
||||
"Preformatted": "Vooraf geformateerd",
|
||||
"Properties": "Eigenschappen",
|
||||
"Redo": "Herdoen",
|
||||
"Remove": "Verwijderen",
|
||||
"Rotate": "Draaien",
|
||||
"Styles": "Stijlen",
|
||||
"Subheading": "Ondertitel",
|
||||
"Table": "Tabel",
|
||||
"Table body (columns)": "Tabelcellen (kolommen)",
|
||||
"Table foot": "Tabelvoet",
|
||||
"Table head": "Tabelkop",
|
||||
"Table row": "Tabelrij",
|
||||
"Text": "Tekst",
|
||||
"Undo": "Ongedaan maken",
|
||||
"Unindent": "Inspring verkleinen",
|
||||
"Update table": "Tabel updaten",
|
||||
"Upload": "Uploaden",
|
||||
"Value": "Waarde",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Uw wijzigen zijn niet opgeslagen, wilt u doorgaan zonder deze op te slaan?"
|
||||
}
|
51
js/vendor/ContentTools/translations/nn.json
vendored
Normal file
51
js/vendor/ContentTools/translations/nn.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Midtstill",
|
||||
"Align left": "Venstrejuster",
|
||||
"Align right": "Høgrejuster",
|
||||
"Apply": "Bruk",
|
||||
"Attributes": "Attributt",
|
||||
"Bold": "Feit",
|
||||
"Bullet list": "Punktliste",
|
||||
"Cancel": "Avbryt",
|
||||
"Clear": "Fjern",
|
||||
"Code": "Kode",
|
||||
"Crop marks": "Beskjæringsmerke",
|
||||
"Enter a link": "Angi ei lenke",
|
||||
"Image": "Bilete",
|
||||
"Heading": "Overskrift",
|
||||
"Indent": "Indentér",
|
||||
"Insert": "Sett inn",
|
||||
"Insert image": "Sett inn bilete",
|
||||
"Insert table": "Sett inn tabell",
|
||||
"Insert video": "Sett inn video",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Linjeskift",
|
||||
"Link": "Lenke",
|
||||
"List": "Liste",
|
||||
"List item": "Listeelement",
|
||||
"Name": "Namn",
|
||||
"No styles available for this tag": "Ingen stilar er tilgjengeleg for denne tagen",
|
||||
"Numbers list": "Nummerert liste",
|
||||
"Paste YouTube or Vimeo URL": "Lim inn YouTube eller Vimeo URL",
|
||||
"Paragraph": "Avsnitt",
|
||||
"Preformatted": "Formatert",
|
||||
"Properties": "Eigenskapar",
|
||||
"Redo": "Gjenta",
|
||||
"Remove": "Fjern",
|
||||
"Rotate": "Rotér",
|
||||
"Styles": "Stilar",
|
||||
"Subheading": "Underoverskrift",
|
||||
"Table": "Tabell",
|
||||
"Table body (columns)": "Tabellinnhold (kolonnar)",
|
||||
"Table foot": "Tabellfooter",
|
||||
"Table head": "Tabellheader",
|
||||
"Table row": "Tabellrekke",
|
||||
"Text": "Tekst",
|
||||
"Undo": "Angre",
|
||||
"Unindent": "Reduser innrykk",
|
||||
"Update table": "Oppdater tabell",
|
||||
"Upload": "Last opp",
|
||||
"Value": "Verdi",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Dine endringar er ikkje lagra, ønsker du verkeleg å miste dei?"
|
||||
}
|
51
js/vendor/ContentTools/translations/pl.json
vendored
Normal file
51
js/vendor/ContentTools/translations/pl.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Wyrównanie do środka",
|
||||
"Align left": "Wyrównanie do lewej",
|
||||
"Align right": "Wyrównanie do prawej",
|
||||
"Apply": "Zastosuj",
|
||||
"Attributes": "Atrybuty",
|
||||
"Bold": "Pogrubienie",
|
||||
"Bullet list": "Lista wypunktowana",
|
||||
"Cancel": "Anuluj",
|
||||
"Clear": "Wyczyść",
|
||||
"Code": "Kod",
|
||||
"Crop marks": "Linie cięcia",
|
||||
"Enter a link": "Podaj link",
|
||||
"Image": "Obraz",
|
||||
"Heading": "Tytuł",
|
||||
"Indent": "Wcięcie",
|
||||
"Insert": "Dodaj",
|
||||
"Insert image": "Dodaj obraz",
|
||||
"Insert table": "Dodaj tabelę",
|
||||
"Insert video": "Dodaj video",
|
||||
"Italic": "Pochylenie",
|
||||
"Line break": "Złamanie linii",
|
||||
"Link": "Link",
|
||||
"List": "Lista",
|
||||
"List item": "Element listy",
|
||||
"Name": "Nazwa",
|
||||
"No styles available for this tag": "Dla tego elementu nie dodano stylów",
|
||||
"Numbers list": "Lista numerowana",
|
||||
"Paste YouTube or Vimeo URL": "Wklej URL z YouTube lub Vimeo",
|
||||
"Paragraph": "Akapit",
|
||||
"Preformatted": "Tekst preformatowany",
|
||||
"Properties": "Właściwości",
|
||||
"Redo": "Ponów",
|
||||
"Remove": "Usuń",
|
||||
"Rotate": "Obróć",
|
||||
"Styles": "Style",
|
||||
"Subheading": "Podtytuł",
|
||||
"Table": "Tabela",
|
||||
"Table body (columns)": "Zawartość tabeli (kolumny)",
|
||||
"Table foot": "Stopka tabeli",
|
||||
"Table head": "Nagłówek tabeli",
|
||||
"Table row": "Wiersz tabeli",
|
||||
"Text": "Tekst",
|
||||
"Undo": "Cofnij",
|
||||
"Unindent": "Bez wcięcia",
|
||||
"Update table": "Aktualizuj tabelę",
|
||||
"Upload": "Wczytaj",
|
||||
"Value": "Wartość",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Twoje zmiany nie zostały zapisane - czy na pewno chcesz z nich zrezygnować?"
|
||||
}
|
51
js/vendor/ContentTools/translations/pt-br.json
vendored
Normal file
51
js/vendor/ContentTools/translations/pt-br.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centralizar",
|
||||
"Align left": "Alinhar à esquerda",
|
||||
"Align right": "Alinhar à direita",
|
||||
"Apply": "Aplicar",
|
||||
"Attributes": "Atributo",
|
||||
"Bold": "Negrito",
|
||||
"Bullet list": "Lista com marcadores",
|
||||
"Cancel": "Cancelar",
|
||||
"Clear": "Limpar",
|
||||
"Code": "Código",
|
||||
"Crop marks": "Margem para recorte",
|
||||
"Enter a link": "Coloque um link",
|
||||
"Image": "Imagem",
|
||||
"Heading": "Título",
|
||||
"Indent": "Aumentar recuo",
|
||||
"Insert": "Inserir",
|
||||
"Insert image": "Inserir imagem",
|
||||
"Insert table": "Inserir tabela",
|
||||
"Insert video": "Inserir vídeo",
|
||||
"Italic": "Itálico",
|
||||
"Line break": "Quebra de linha",
|
||||
"Link": "Link",
|
||||
"List": "Lista",
|
||||
"List item": "Item da lista",
|
||||
"Name": "Nome",
|
||||
"No styles available for this tag": "Não há estilo disponível para esta tag",
|
||||
"Numbers list": "Lista com números",
|
||||
"Paste YouTube or Vimeo URL": "Cole a URL do YouTube ou Vimeo",
|
||||
"Paragraph": "Parágrafo",
|
||||
"Preformatted": "Pré-formatado",
|
||||
"Properties": "Propriedades",
|
||||
"Redo": "Refazer",
|
||||
"Remove": "Remover",
|
||||
"Rotate": "Rotacionar",
|
||||
"Styles": "Estilos",
|
||||
"Subheading": "Subtítulo",
|
||||
"Table": "Tabela",
|
||||
"Table body (columns)": "Corpo da tabela (colunas)",
|
||||
"Table foot": "Rodapé da tabela",
|
||||
"Table head": "Cabeçalho da tabela",
|
||||
"Table row": "Linha da tabela",
|
||||
"Text": "Texto",
|
||||
"Undo": "Desfazer",
|
||||
"Unindent": "Diminuir recuo",
|
||||
"Update table": "Atualizar tabela",
|
||||
"Upload": "Enviar",
|
||||
"Value": "Valor",
|
||||
"Video": "Vídeo",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Suas alterações não foram salvas, você realmente quer perdê-las?"
|
||||
}
|
51
js/vendor/ContentTools/translations/ru.json
vendored
Normal file
51
js/vendor/ContentTools/translations/ru.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "По центру",
|
||||
"Align left": "Слева",
|
||||
"Align right": "Справа",
|
||||
"Apply": "Применить",
|
||||
"Attributes": "Атрибуты",
|
||||
"Bold": "Полужирный",
|
||||
"Bullet list": "Маркированный список",
|
||||
"Cancel": "Отменить",
|
||||
"Clear": "Очистить",
|
||||
"Code": "Код",
|
||||
"Crop marks": "Обрезать",
|
||||
"Enter a link": "Введите ссылку",
|
||||
"Image": "Изображение",
|
||||
"Heading": "Заголовок",
|
||||
"Indent": "Добавить отступ",
|
||||
"Insert": "Вставить",
|
||||
"Insert image": "Вставить изображение",
|
||||
"Insert table": "Вставить таблицу",
|
||||
"Insert video": "Вставить видео",
|
||||
"Italic": "Курсив",
|
||||
"Line break": "Разрыв строки",
|
||||
"Link": "Ссылка",
|
||||
"List": "Список",
|
||||
"List item": "Элемент списка",
|
||||
"Name": "Имя",
|
||||
"No styles available for this tag": "Для этого тега стили недоступны",
|
||||
"Numbers list": "Нумерованный список",
|
||||
"Paste YouTube or Vimeo URL": "Вставьте ссылку на ролик с YouTube или Vimeo",
|
||||
"Paragraph": "Абзац",
|
||||
"Preformatted": "Форматированный текст",
|
||||
"Properties": "Свойства",
|
||||
"Redo": "Повторить",
|
||||
"Remove": "Удалить",
|
||||
"Rotate": "Повернуть",
|
||||
"Styles": "Стили",
|
||||
"Subheading": "Подзаголовок",
|
||||
"Table": "Таблица",
|
||||
"Table body (columns)": "Количество столбцов",
|
||||
"Table foot": "Подвал таблицы",
|
||||
"Table head": "Шапка таблицы",
|
||||
"Table row": "Строка таблицы",
|
||||
"Text": "Текст",
|
||||
"Undo": "Отменить",
|
||||
"Unindent": "Убрать отступ",
|
||||
"Update table": "Обновить таблицу",
|
||||
"Upload": "Загрузить",
|
||||
"Value": "Значение",
|
||||
"Video": "Видео",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Ваши изменения не были сохранены, вы уверены, что не хотите их сохранить?"
|
||||
}
|
51
js/vendor/ContentTools/translations/sv.json
vendored
Normal file
51
js/vendor/ContentTools/translations/sv.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Centrera",
|
||||
"Align left": "Justera vänster",
|
||||
"Align right": "Justera höger",
|
||||
"Apply": "Applicera",
|
||||
"Attributes": "Attribut",
|
||||
"Bold": "Fet",
|
||||
"Bullet list": "Punktlista",
|
||||
"Cancel": "Avbryt",
|
||||
"Clear": "Rensa",
|
||||
"Code": "Kod",
|
||||
"Crop marks": "Skärmärken",
|
||||
"Enter a link": "Ange en länk",
|
||||
"Image": "Bild",
|
||||
"Heading": "Titel",
|
||||
"Indent": "Dra in",
|
||||
"Insert": "Lägg till",
|
||||
"Insert image": "Lägg till bild",
|
||||
"Insert table": "Lägg till tabell",
|
||||
"Insert video": "Lägg till video",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Radbrytning",
|
||||
"Link": "Länk",
|
||||
"List": "Lista",
|
||||
"List item": "Listobjekt",
|
||||
"Name": "Namn",
|
||||
"No styles available for this tag": "Det finns ingen stil tillgänglig för denna tag",
|
||||
"Numbers list": "Numrerad lista",
|
||||
"Paste YouTube or Vimeo URL": "Klistra in en YouTube eller Vimeo adress",
|
||||
"Paragraph": "Paragraf",
|
||||
"Preformatted": "Förformaterad",
|
||||
"Properties": "Egenskaper",
|
||||
"Redo": "Gör om",
|
||||
"Remove": "Ta bort",
|
||||
"Rotate": "Rotera",
|
||||
"Styles": "Stilar",
|
||||
"Subheading": "Undertitel",
|
||||
"Table": "Tabell",
|
||||
"Table body (columns)": "Tabell innehåll (kolumner)",
|
||||
"Table foot": "Tabell fot",
|
||||
"Table head": "Tabell huvud",
|
||||
"Table row": "Tabell rad",
|
||||
"Text": "Text",
|
||||
"Undo": "Ångra",
|
||||
"Unindent": "Dra ut",
|
||||
"Update table": "Uppdatera tabell",
|
||||
"Upload": "Ladda upp",
|
||||
"Value": "Värde",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Dina ändringar har inte sparats, är du säker att du vill fortsätta?"
|
||||
}
|
51
js/vendor/ContentTools/translations/tr.json
vendored
Normal file
51
js/vendor/ContentTools/translations/tr.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Ortala",
|
||||
"Align left": "Sola yasla",
|
||||
"Align right": "Sağa yasla",
|
||||
"Apply": "Uygula",
|
||||
"Attributes": "Özellikler",
|
||||
"Bold": "Kalın",
|
||||
"Bullet list": "İşaretli liste",
|
||||
"Cancel": "İptal",
|
||||
"Clear": "Temizle",
|
||||
"Code": "Kod",
|
||||
"Crop marks": "İşaretleri temizle",
|
||||
"Enter a link": "Link girin",
|
||||
"Image": "Resim",
|
||||
"Heading": "Başlık",
|
||||
"Indent": "Satırbaşı",
|
||||
"Insert": "Yerleştir",
|
||||
"Insert image": "Resim ekle",
|
||||
"Insert table": "Tablo ekle",
|
||||
"Insert video": "Video ekle",
|
||||
"Italic": "Eğik",
|
||||
"Line break": "Satır sonu",
|
||||
"Link": "Link",
|
||||
"List": "Liste",
|
||||
"List item": "Liste öğesi",
|
||||
"Name": "İsim",
|
||||
"No styles available for this tag": "Bu etiket için stil bulunmuyor",
|
||||
"Numbers list": "Numaralı liste",
|
||||
"Paste YouTube or Vimeo URL": "YouTube veya Vimeo URL adresi yapıştırın",
|
||||
"Paragraph": "Paragraf",
|
||||
"Preformatted": "Önformatlı",
|
||||
"Properties": "Özellikler",
|
||||
"Redo": "Yinele",
|
||||
"Remove": "Kaldır",
|
||||
"Rotate": "Çevir",
|
||||
"Styles": "Stiller",
|
||||
"Subheading": "Alt başlık",
|
||||
"Table": "Tablo",
|
||||
"Table body (columns)": "Tablo gövdesi (sütunlar)",
|
||||
"Table foot": "Tablo altı",
|
||||
"Table head": "Tablo üstü",
|
||||
"Table row": "Tablo satırı",
|
||||
"Text": "Metin",
|
||||
"Undo": "Geri al",
|
||||
"Unindent": "Girintisiz",
|
||||
"Update table": "Tabloyu güncelle",
|
||||
"Upload": "Yükle",
|
||||
"Value": "Değer",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Yaptığınız değişiklikler kayıt edilmedi, vazgeçmek istediğinize emin misiniz ?"
|
||||
}
|
51
js/vendor/ContentTools/translations/uk.json
vendored
Normal file
51
js/vendor/ContentTools/translations/uk.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "По центру",
|
||||
"Align left": "по лівому краю",
|
||||
"Align right": "По правому краю",
|
||||
"Apply": "Застосувати",
|
||||
"Attributes": "Атрибути",
|
||||
"Bold": "Жирний",
|
||||
"Bullet list": "Маркований список",
|
||||
"Cancel": "Скасувати",
|
||||
"Clear": "Очистити",
|
||||
"Code": "Код",
|
||||
"Crop marks": "Обрізати",
|
||||
"Enter a link": "Вставити посилання",
|
||||
"Image": "Зображення",
|
||||
"Heading": "Заголовок",
|
||||
"Indent": "Додати відступ",
|
||||
"Insert": "Вставити",
|
||||
"Insert image": "Вставити зображення",
|
||||
"Insert table": "Вставити таблицю",
|
||||
"Insert video": "Вставити відео",
|
||||
"Italic": "Курсив",
|
||||
"Line break": "Розрив рядка",
|
||||
"Link": "Посилання",
|
||||
"List": "Список",
|
||||
"List item": "Елемент списку",
|
||||
"Name": "Ім'я",
|
||||
"No styles available for this tag": "Для цього тегу не доступні жодні стилі",
|
||||
"Numbers list": "Нумерований список",
|
||||
"Paste YouTube or Vimeo URL": "Вставити посилання на YouTube або Vimeo",
|
||||
"Paragraph": "Абзац",
|
||||
"Preformatted": "Форматований текст",
|
||||
"Properties": "Властивості",
|
||||
"Redo": "Повторити",
|
||||
"Remove": "Видалити",
|
||||
"Rotate": "Повернути",
|
||||
"Styles": "Стилі",
|
||||
"Subheading": "Підзаголовок",
|
||||
"Table": "Таблиця",
|
||||
"Table body (columns)": "Кількість столбців",
|
||||
"Table foot": "Підвал таблиці",
|
||||
"Table head": "Шапка таблиці",
|
||||
"Table row": "Стрічка таблиці",
|
||||
"Text": "Текст",
|
||||
"Undo": "Відмінити",
|
||||
"Unindent": "Забрати відступ",
|
||||
"Update table": "Оновити таблицю",
|
||||
"Upload": "Завантажити",
|
||||
"Value": "Значення",
|
||||
"Video": "Відео",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Ваші зміни не були збережені, Ви насправді хочете їх втратити?"
|
||||
}
|
51
js/vendor/ContentTools/translations/uz.json
vendored
Normal file
51
js/vendor/ContentTools/translations/uz.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Markazga",
|
||||
"Align left": "Chap tomonga",
|
||||
"Align right": "O‘ng tomonga",
|
||||
"Apply": "Qo‘llash",
|
||||
"Attributes": "Atributlar",
|
||||
"Bold": "Qalin",
|
||||
"Bullet list": "Belgilangan ro‘yxat",
|
||||
"Cancel": "Bekor qilish",
|
||||
"Clear": "Tozalash",
|
||||
"Code": "Kod",
|
||||
"Crop marks": "Kesish",
|
||||
"Enter a link": "Havolani kiriting",
|
||||
"Image": "Rasm",
|
||||
"Heading": "Sarlavha",
|
||||
"Indent": "Bo‘shliq qo‘shish",
|
||||
"Insert": "Qo‘yish",
|
||||
"Insert image": "Rasm qo‘yish",
|
||||
"Insert table": "Jadval qo‘yish",
|
||||
"Insert video": "Video qo‘yish",
|
||||
"Italic": "Kursiv",
|
||||
"Line break": "Qatorni bo‘lish",
|
||||
"Link": "Havola",
|
||||
"List": "Ro‘yxat",
|
||||
"List item": "Ro‘yxat elementi",
|
||||
"Name": "Ism",
|
||||
"No styles available for this tag": "Ushbu teg uchun stillar mavjud emas",
|
||||
"Numbers list": "Raqamli ro‘yxat",
|
||||
"Paste YouTube or Vimeo URL": "YouTube yoki Vimeo'dan havolani kiriting",
|
||||
"Paragraph": "Xat boshi",
|
||||
"Preformatted": "Formatlangan matn",
|
||||
"Properties": "Xususiyat",
|
||||
"Redo": "Qaytarish",
|
||||
"Remove": "O‘chirish",
|
||||
"Rotate": "Aylantirish",
|
||||
"Styles": "Stillar",
|
||||
"Subheading": "Kichik sarlavha",
|
||||
"Table": "Jadval",
|
||||
"Table body (columns)": "Ustunlar soni",
|
||||
"Table foot": "Jadvalning pasti",
|
||||
"Table head": "Jadvalning boshi",
|
||||
"Table row": "Jadvalning qatori",
|
||||
"Text": "Matn",
|
||||
"Undo": "Orqaga qaytarish",
|
||||
"Unindent": "Oraliqni o‘chirish’",
|
||||
"Update table": "Jadvalni yangilash",
|
||||
"Upload": "Yuklash",
|
||||
"Value": "Qiymat",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "O‘zgarishlaringiz saqlanmay qoladi. Saqlanmasligiga rozimisiz?"
|
||||
}
|
51
js/vendor/ContentTools/translations/vi.json
vendored
Normal file
51
js/vendor/ContentTools/translations/vi.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "Căn giữa",
|
||||
"Align left": "Căn trái",
|
||||
"Align right": "Căn phải",
|
||||
"Apply": "Áp dụng",
|
||||
"Attributes": "Thuộc tính",
|
||||
"Bold": "In đậm",
|
||||
"Bullet list": "Danh sách không theo thứ tự",
|
||||
"Cancel": "Hủy bỏ",
|
||||
"Clear": "Dọn sạch",
|
||||
"Code": "Mã",
|
||||
"Crop marks": "Cắt xén đánh dấu",
|
||||
"Enter a link": "Nhập một liên kết",
|
||||
"Image": "Ảnh",
|
||||
"Heading": "Tiêu đề",
|
||||
"Indent": "Thụt lề",
|
||||
"Insert": "Chèn",
|
||||
"Insert image": "Chèn ảnh",
|
||||
"Insert table": "Chèn bảng",
|
||||
"Insert video": "Chèn video",
|
||||
"Italic": "In nghiêng",
|
||||
"Line break": "Ngắt dòng",
|
||||
"Link": "Liên kết",
|
||||
"List": "Danh sách",
|
||||
"List item": "Danh mục",
|
||||
"Name": "Tên",
|
||||
"No styles available for this tag": "Không có kiểu dáng nào cho thẻ này",
|
||||
"Numbers list": "Danh sách theo số thứ tự",
|
||||
"Paste YouTube or Vimeo URL": "Dán URL Youtube hoặc Vimeo",
|
||||
"Paragraph": "Đoạn văn bản",
|
||||
"Preformatted": "Định dạng trước",
|
||||
"Properties": "Thuộc tính",
|
||||
"Redo": "Làm lại",
|
||||
"Remove": "Loại bỏ",
|
||||
"Rotate": "Xoay",
|
||||
"Styles": "Kiểu dáng",
|
||||
"Subheading": "Tiêu đề phụ",
|
||||
"Table": "Bảng",
|
||||
"Table body (columns)": "Thân bảng (các cột)",
|
||||
"Table foot": "Chân bảng",
|
||||
"Table head": "Tiêu đề bảng",
|
||||
"Table row": "Hàng của bảng",
|
||||
"Text": "Văn bản",
|
||||
"Undo": "Hoàn tác",
|
||||
"Unindent": "Hủy thụt lề",
|
||||
"Update table": "Cập nhật bảng",
|
||||
"Upload": "Tải lên",
|
||||
"Value": "Giá trị",
|
||||
"Video": "Video",
|
||||
"Your changes have not been saved, do you really want to lose them?": "Những thay đổi của bạn chưa được lưu lại, bạn có thực sự muốn mất chúng?"
|
||||
}
|
51
js/vendor/ContentTools/translations/zh-cn.json
vendored
Normal file
51
js/vendor/ContentTools/translations/zh-cn.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "居中",
|
||||
"Align left": "居左",
|
||||
"Align right": "居右",
|
||||
"Apply": "确认",
|
||||
"Attributes": "属性",
|
||||
"Bold": "加粗",
|
||||
"Bullet list": "符号列表",
|
||||
"Cancel": "取消",
|
||||
"Clear": "清除",
|
||||
"Code": "代码",
|
||||
"Crop marks": "裁剪",
|
||||
"Enter a link": "输入链接",
|
||||
"Image": "图片",
|
||||
"Heading": "标题",
|
||||
"Indent": "缩排",
|
||||
"Insert": "插入",
|
||||
"Insert image": "插入图片",
|
||||
"Insert table": "插入表格",
|
||||
"Insert video": "插入视频",
|
||||
"Italic": "斜体",
|
||||
"Line break": "分割线",
|
||||
"Link": "链接",
|
||||
"List": "列表",
|
||||
"List item": "列表项",
|
||||
"Name": "名称",
|
||||
"No styles available for this tag": "此标签没有样式",
|
||||
"Numbers list": "数字列表",
|
||||
"Paste YouTube or Vimeo URL": "粘帖YouTube或Vimeo的URL链接",
|
||||
"Paragraph": "段落",
|
||||
"Preformatted": "预格式化",
|
||||
"Properties": "标签",
|
||||
"Redo": "重做",
|
||||
"Remove": "删除",
|
||||
"Rotate": "旋转",
|
||||
"Styles": "样式",
|
||||
"Subheading": "子标题",
|
||||
"Table": "表格",
|
||||
"Table body (columns)": "表格体(列)",
|
||||
"Table foot": "表格底",
|
||||
"Table head": "表格头",
|
||||
"Table row": "表格行",
|
||||
"Text": "文本",
|
||||
"Undo": "撤销",
|
||||
"Unindent": "取消缩排",
|
||||
"Update table": "更新表格",
|
||||
"Upload": "上传",
|
||||
"Value": "值",
|
||||
"Video": "视频",
|
||||
"Your changes have not been saved, do you really want to lose them?": "您的更改还未保存,确定不需要保存吗?"
|
||||
}
|
51
js/vendor/ContentTools/translations/zh-tw.json
vendored
Normal file
51
js/vendor/ContentTools/translations/zh-tw.json
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"Align center": "置中",
|
||||
"Align left": "左對齊",
|
||||
"Align right": "右對齊",
|
||||
"Apply": "確認",
|
||||
"Attributes": "屬性",
|
||||
"Bold": "粗體",
|
||||
"Bullet list": "符號列表",
|
||||
"Cancel": "取消",
|
||||
"Clear": "清除",
|
||||
"Code": "代碼",
|
||||
"Crop marks": "裁切",
|
||||
"Enter a link": "輸入超連結",
|
||||
"Image": "圖片",
|
||||
"Heading": "標題",
|
||||
"Indent": "縮排",
|
||||
"Insert": "插入",
|
||||
"Insert image": "插入圖片",
|
||||
"Insert table": "插入表格",
|
||||
"Insert video": "插入影片",
|
||||
"Italic": "斜體",
|
||||
"Line break": "分割線",
|
||||
"Link": "超連結",
|
||||
"List": "列表",
|
||||
"List item": "列表項目",
|
||||
"Name": "名稱",
|
||||
"No styles available for this tag": "此標籤沒有樣式",
|
||||
"Numbers list": "數字列表",
|
||||
"Paste YouTube or Vimeo URL": "貼上YouTube或Vimeo的URL連結",
|
||||
"Paragraph": "段落",
|
||||
"Preformatted": "預格式化",
|
||||
"Properties": "性質",
|
||||
"Redo": "重做",
|
||||
"Remove": "移除",
|
||||
"Rotate": "旋轉",
|
||||
"Styles": "樣式",
|
||||
"Subheading": "子標題",
|
||||
"Table": "表格",
|
||||
"Table body (columns)": "表格內體(列)",
|
||||
"Table foot": "表格底",
|
||||
"Table head": "表格頭",
|
||||
"Table row": "表格行",
|
||||
"Text": "文本",
|
||||
"Undo": "撤銷",
|
||||
"Unindent": "取消縮排",
|
||||
"Update table": "更新表格",
|
||||
"Upload": "上傳",
|
||||
"Value": "值",
|
||||
"Video": "影片",
|
||||
"Your changes have not been saved, do you really want to lose them?": "您的更改尚未保存,你真的要放棄更改嗎?"
|
||||
}
|
20
js/vendor/noty/LICENSE
vendored
Normal file
20
js/vendor/noty/LICENSE
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
Copyright (c) 2012 Nedim Arabacı
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
17
js/vendor/noty/noty.min.js
vendored
Normal file
17
js/vendor/noty/noty.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
package.json
Normal file
10
package.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"scripts": {
|
||||
"postinstall": "node ./js/extract-files-from-node-modules.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ContentTools": "^1.6.16",
|
||||
"fs-extra": "^11.1.0",
|
||||
"noty": "^3.2.0-beta-deprecated"
|
||||
}
|
||||
}
|
103
src/Auth.php
Normal file
103
src/Auth.php
Normal file
@ -0,0 +1,103 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
namespace PicoContentEditor;
|
||||
|
||||
/**
|
||||
* Auth manager for PicoContentEditor.
|
||||
*/
|
||||
class Auth
|
||||
{
|
||||
const EDIT = 'edit';
|
||||
const SAVE = 'save';
|
||||
const UPLOAD = 'upload';
|
||||
|
||||
/**
|
||||
* Right to show the content editor.
|
||||
* @var bool
|
||||
*/
|
||||
private $canEdit = true;
|
||||
/**
|
||||
* Right to save pages or themes files.
|
||||
* @var bool
|
||||
*/
|
||||
private $canSave = true;
|
||||
/**
|
||||
* Right to upload files.
|
||||
* @var bool
|
||||
*/
|
||||
private $canUpload = true;
|
||||
|
||||
/**
|
||||
* Return the class singleton.
|
||||
* @return Auth
|
||||
*/
|
||||
final public static function instance()
|
||||
{
|
||||
static $inst = null;
|
||||
if ($inst === null) {
|
||||
$inst = new Auth();
|
||||
}
|
||||
return $inst;
|
||||
}
|
||||
/**
|
||||
* Define rights depending on Pico install.
|
||||
*
|
||||
* @param Pico $pico
|
||||
* @return void
|
||||
*/
|
||||
public static function init($pico)
|
||||
{
|
||||
// check authentification with PicoUsers
|
||||
if (class_exists('PicoUsers')) {
|
||||
$PicoUsers = $pico->getPlugin('PicoUsers');
|
||||
self::instance()->canEdit = $PicoUsers->hasRight('PicoContentEditor', true);
|
||||
self::instance()->canSave = $PicoUsers->hasRight('PicoContentEditor/save');
|
||||
self::instance()->canUpload = $PicoUsers->hasRight('PicoContentEditor/upload');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return if the user has the given right.
|
||||
*
|
||||
* @param self::EDIT|self::SAVE|self::UPLOAD $right
|
||||
* @return boolean
|
||||
*/
|
||||
public static function can($right)
|
||||
{
|
||||
switch ($right) {
|
||||
case self::EDIT:
|
||||
return self::instance()->canEdit;
|
||||
case self::SAVE:
|
||||
return self::instance()->canSave;
|
||||
case self::UPLOAD:
|
||||
return self::instance()->canUpload;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a given right.
|
||||
*
|
||||
* @param self::EDIT|self::SAVE|self::UPLOAD $right
|
||||
* @param boolean $status
|
||||
* @return void
|
||||
*/
|
||||
public static function set($right, $status)
|
||||
{
|
||||
switch ($right) {
|
||||
case self::EDIT:
|
||||
self::instance()->canEdit = $status;
|
||||
break;
|
||||
case self::SAVE:
|
||||
self::instance()->canSave = $status;
|
||||
break;
|
||||
case self::UPLOAD:
|
||||
self::instance()->canUpload = $status;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
93
src/EditableRegion.php
Normal file
93
src/EditableRegion.php
Normal file
@ -0,0 +1,93 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
namespace PicoContentEditor;
|
||||
|
||||
/**
|
||||
* Editable region of PicoContentEditor.
|
||||
*
|
||||
*/
|
||||
class EditableRegion
|
||||
{
|
||||
private $before;
|
||||
private $inner;
|
||||
private $after;
|
||||
|
||||
public $name = null;
|
||||
public $source = null;
|
||||
public $type = null;
|
||||
public $markdown = false;
|
||||
public $saved = null;
|
||||
public $message = null;
|
||||
|
||||
public function __construct($match)
|
||||
{
|
||||
$this->before = $match['before'];
|
||||
$this->inner = $match['inner'];
|
||||
$this->after = $match['after'];
|
||||
$this->type = $match['type'];
|
||||
$this->name = $match['name'];
|
||||
|
||||
$hasSource = preg_match(
|
||||
"`\s+data-src\s*=\s*['\"]([^'\"]*?)['\"]`",
|
||||
$this->before,
|
||||
$matches
|
||||
);
|
||||
if ($hasSource) {
|
||||
$this->source = $matches[1];
|
||||
}
|
||||
|
||||
$this->markdown = preg_match(
|
||||
"`\s+markdown\s*=\s*['\"]?\s*(?:1|true)\s*['\"]?`",
|
||||
$this->before
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Save the region.
|
||||
*
|
||||
* @param string $inner The new region content.
|
||||
* @param PicoContentEditor $contentEditor
|
||||
* @return void
|
||||
*/
|
||||
public function save($inner, $contentEditor)
|
||||
{
|
||||
$this->saved = false;
|
||||
|
||||
// get the source file path as given by a src attribute, or the current page
|
||||
if ($this->source) {
|
||||
$file = $contentEditor->getRootDir() . $this->source;
|
||||
} else {
|
||||
$file = $contentEditor->getRequestFile();
|
||||
}
|
||||
|
||||
if (!file_exists($file)) {
|
||||
$this->message = 'Source file not found';
|
||||
return;
|
||||
}
|
||||
|
||||
// load the source file and replace the block with new content
|
||||
$content = file_get_contents($file);
|
||||
$content = preg_replace('`\R`', "\n", $content); // EOL normalization
|
||||
$content = str_replace(
|
||||
$this->before . $this->inner . $this->after,
|
||||
$this->before . $inner . $this->after,
|
||||
$content,
|
||||
$count
|
||||
);
|
||||
if (!$count) {
|
||||
$this->message = 'Error replacing region content';
|
||||
return;
|
||||
}
|
||||
// save the source file
|
||||
$this->saved = file_put_contents($file, $content);
|
||||
if (!$this->saved) {
|
||||
$this->message = 'Error writing file';
|
||||
return;
|
||||
}
|
||||
if ($this->markdown) {
|
||||
$this->message = 'Saved to markdown';
|
||||
} else {
|
||||
$this->message = 'Saved';
|
||||
}
|
||||
}
|
||||
}
|
55
src/EditorsHandlers/ContentTools.php
Normal file
55
src/EditorsHandlers/ContentTools.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
|
||||
namespace PicoContentEditor\EditorsHandlers;
|
||||
|
||||
class ContentTools
|
||||
{
|
||||
/**
|
||||
* Return the HTML links and scripts tags needed by the editor,
|
||||
* that will be included with {{ content_editor }}
|
||||
*
|
||||
* @param \PicoContentEditor $contentEditor
|
||||
* @param string $assetsUrl The URL to the plugin assets directory.
|
||||
* @return string
|
||||
*/
|
||||
public static function assets($contentEditor, $assetsUrl)
|
||||
{
|
||||
$libUrlJs = rtrim("$assetsUrl/js/vendor/ContentTools");
|
||||
$lang = $contentEditor->getPluginSetting('Language');
|
||||
// TODO do not copy lang but use async script
|
||||
$langData = self::getLanguageContent($lang, $libUrlJs);
|
||||
return ['lang'=>$lang,'data'=>!empty($langData) ? $langData : ''];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a ContentTools translation.
|
||||
*
|
||||
* @param string $lang The language code.
|
||||
* @return string The JSON data.
|
||||
*/
|
||||
private static function getLanguageContent($lang, $libUrl)
|
||||
{
|
||||
if (!$lang) {
|
||||
return;
|
||||
}
|
||||
$path = "$libUrl/translations/$lang.json";
|
||||
return file_get_contents($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* process the edit input and return the content that will replace the existing one.
|
||||
*
|
||||
* @param object $edit The edit data object.
|
||||
* @return string
|
||||
*/
|
||||
public static function getOutput($edit, $markdown)
|
||||
{
|
||||
if ($markdown) {
|
||||
$converter = new \Markdownify\Converter;
|
||||
return $converter->parseString($edit->html);
|
||||
}
|
||||
return $edit->html;
|
||||
}
|
||||
}
|
156
src/Edits.php
Normal file
156
src/Edits.php
Normal file
@ -0,0 +1,156 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
namespace PicoContentEditor;
|
||||
|
||||
/**
|
||||
* Files edits manager for PicoContentEditor.
|
||||
*/
|
||||
class Edits
|
||||
{
|
||||
/**
|
||||
* Key used for $_POST data.
|
||||
*/
|
||||
const KEY = 'PicoContentEditor';
|
||||
|
||||
private $meta;
|
||||
private $edits;
|
||||
|
||||
/**
|
||||
* Editable region blocks parsed from files content.
|
||||
* @var array
|
||||
*/
|
||||
private $regions = array();
|
||||
|
||||
/**
|
||||
* HTML comment used in pages content to define the end of an editable block.
|
||||
*
|
||||
* @see self::onContentLoaded()
|
||||
* @see self::parseEditableRegions()
|
||||
*/
|
||||
const ENDMARK = '<!--\s*end\s+editable\s*-->';
|
||||
|
||||
/**
|
||||
* Decode edited data from POST, if any.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
if (!isset($_POST[self::KEY])) {
|
||||
return;
|
||||
}
|
||||
$query = json_decode($_POST[self::KEY]);
|
||||
if ($query === null) {
|
||||
return 'Can\'t decode editor data';
|
||||
}
|
||||
|
||||
$this->meta = isset($query->meta) ? $query->meta : null;
|
||||
if (isset($query->regions)) {
|
||||
$this->edits = $query->regions;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Look for editable regions in the given string and save those who have been edited.
|
||||
*
|
||||
* @see self::parseEditableRegions()
|
||||
* @see self::saveRegion()
|
||||
* @param string $content
|
||||
* @param PicoContentEditor $contentEditor
|
||||
* @return void
|
||||
*/
|
||||
public function saveRegions($content, $contentEditor, $editorHandler)
|
||||
{
|
||||
if (!$this->edits) {
|
||||
return null;
|
||||
}
|
||||
$allSaved = null;
|
||||
$this->parseEditableRegions($content);
|
||||
foreach ($this->regions as $editableRegion) {
|
||||
if ($editableRegion->saved === null && isset($this->edits->{$editableRegion->name})) {
|
||||
$edit = $this->edits->{$editableRegion->name};
|
||||
$editedContent = $editorHandler->getOutput($edit, $editableRegion->markdown);
|
||||
$editableRegion->save($editedContent, $contentEditor);
|
||||
$allSaved = ($allSaved !== false) && $editableRegion->saved;
|
||||
}
|
||||
}
|
||||
return $allSaved;
|
||||
}
|
||||
/**
|
||||
* Return the list of editable blocks found in the given content.
|
||||
*
|
||||
* @param string $content
|
||||
* @return array Array of objects with : before, name, content, after
|
||||
*/
|
||||
private function parseEditableRegions($content)
|
||||
{
|
||||
$before = '<[^>]+data-(?P<type>editable|fixture)\s+';
|
||||
$before .= 'data-name\s*=\s*[\'"]\s*(?P<name>[^\'"]+?)\s*[\'"][^>]*>\s*\R*';
|
||||
$inner = '(?:(?!data-editable|data-fixture).)*?';
|
||||
$after = '\R*\s*</[^>]+>\s*\R*';
|
||||
$after .= self::ENDMARK;
|
||||
$pattern = "`(?P<before>$before)(?P<inner>$inner)(?P<after>$after)`s";
|
||||
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
|
||||
|
||||
foreach ($matches as $match) {
|
||||
$this->regions[] = new EditableRegion($match);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Save the edited page meta if there is one.
|
||||
*
|
||||
* @param string $rawContent The raw page content.
|
||||
* @param string $rawMeta The raw page meta.
|
||||
* @param string $fileLocation The page file location.
|
||||
* @return void
|
||||
*/
|
||||
public function saveMeta($rawContent, $rawMeta, $fileLocation)
|
||||
{
|
||||
if (!$this->meta) {
|
||||
return;
|
||||
}
|
||||
$rawContent = str_replace($rawMeta, $this->meta, $rawContent, $count);
|
||||
|
||||
if (!$count) {
|
||||
Status::add(false, 'Error replacing page meta');
|
||||
return;
|
||||
}
|
||||
|
||||
// save the source file
|
||||
if (!file_put_contents($fileLocation, $rawContent)) {
|
||||
Status::add(false, 'Error writing file');
|
||||
return;
|
||||
}
|
||||
Status::add(true, 'Page meta saved<br>Reload the page to see changes.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return regions that have been saved (successfully or not).
|
||||
* @return array
|
||||
*/
|
||||
public function savedRegions()
|
||||
{
|
||||
return array_values(array_filter($this->regions, function ($region) {
|
||||
return $region->saved !== null;
|
||||
}));
|
||||
}
|
||||
/**
|
||||
* Return true if edits have been received.
|
||||
*/
|
||||
public function beenReceived()
|
||||
{
|
||||
return $this->edits || $this->meta;
|
||||
}
|
||||
/**
|
||||
* Return infos about saved meta and regions
|
||||
* that will be included to the server response.
|
||||
*/
|
||||
public function output()
|
||||
{
|
||||
return (object)[
|
||||
'meta' => $this->meta,
|
||||
'regions' => $this->savedRegions(),
|
||||
];
|
||||
}
|
||||
}
|
68
src/Status.php
Normal file
68
src/Status.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
namespace PicoContentEditor;
|
||||
|
||||
/**
|
||||
* Status singleton for PicoContentEditor.
|
||||
*/
|
||||
class Status
|
||||
{
|
||||
/**
|
||||
* Array of status logs that are returned in the JSON response
|
||||
* and used to display status messages on the client.
|
||||
* @see self::addStatus()
|
||||
* @var array
|
||||
*/
|
||||
private $status;
|
||||
|
||||
/**
|
||||
* Return the class singleton.
|
||||
* @return Status
|
||||
*/
|
||||
final public static function instance()
|
||||
{
|
||||
static $inst = null;
|
||||
if ($inst === null) {
|
||||
$inst = new Status();
|
||||
}
|
||||
return $inst;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is a singleton.
|
||||
* @see self::Instance
|
||||
*/
|
||||
private function __construct()
|
||||
{
|
||||
$this->status = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Statically adds a status entry.
|
||||
*
|
||||
* @see self::$status;
|
||||
* @param bool $state
|
||||
* @param string $message
|
||||
* @return void
|
||||
*/
|
||||
final public static function add($state, $message)
|
||||
{
|
||||
self::instance()->status[] = (object) array(
|
||||
'state' => $state,
|
||||
'message' => $message
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Statically adds a status entry.
|
||||
*
|
||||
* @see self::$status;
|
||||
* @param bool $state
|
||||
* @param string $message
|
||||
* @return void
|
||||
*/
|
||||
final public static function getStatus()
|
||||
{
|
||||
return self::instance()->status;
|
||||
}
|
||||
}
|
81
src/Uploads.php
Normal file
81
src/Uploads.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
// SPDX-License-Identifier: EUPL-1.2
|
||||
// Authors: see README.md
|
||||
namespace PicoContentEditor;
|
||||
|
||||
/**
|
||||
* Upload manager for PicoContentEditor.
|
||||
*/
|
||||
class Uploads
|
||||
{
|
||||
/**
|
||||
* PicoContentEditor
|
||||
* @var PicoContentEditor
|
||||
*/
|
||||
private $contentEditor;
|
||||
private $uploadedFile;
|
||||
private $output = null;
|
||||
|
||||
public function beenReceived()
|
||||
{
|
||||
return $this->uploadedFile !== null;
|
||||
}
|
||||
public function output()
|
||||
{
|
||||
return $this->output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set @see{self::$edited} according to data sent by the editor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($contentEditor)
|
||||
{
|
||||
$this->contentEditor = $contentEditor;
|
||||
|
||||
$key = 'PicoContentEditorUpload';
|
||||
$this->uploadedFile = isset($_FILES[$key]) ? $_FILES[$key] : null;
|
||||
|
||||
if (!$this->uploadedFile) {
|
||||
return;
|
||||
}
|
||||
if (Auth::can(Auth::UPLOAD)) {
|
||||
$root = $contentEditor->getRootDir();
|
||||
$path = $contentEditor->getPluginSetting('uploadpath', 'images');
|
||||
$this->saveFile($root, $path);
|
||||
} else {
|
||||
Status::add(false, 'You don\'t have the rights to upload files');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the uploaded file to the given location.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function saveFile($root, $path)
|
||||
{
|
||||
if (!$this->uploadedFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
$realpath = realpath($root.$path);
|
||||
if ($realpath === false || strpos($realpath, $root) !== 0) {
|
||||
Status::add(false, "The upload directory \"$path\" is missing or invalid");
|
||||
return;
|
||||
}
|
||||
|
||||
$filename = '/' . basename($this->uploadedFile['name']);
|
||||
if (move_uploaded_file($this->uploadedFile['tmp_name'], $realpath.$filename)) {
|
||||
Status::add(true, 'The file have been uploaded');
|
||||
$this->output = (object) [
|
||||
'name' => $filename,
|
||||
'path' => $this->contentEditor->getBaseUrl().$path.$filename,
|
||||
'size' => getimagesize($realpath.$filename)
|
||||
];
|
||||
return;
|
||||
}
|
||||
Status::add(false, 'The file coundn\'t be uploaded');
|
||||
}
|
||||
}
|
13
templates/head-scripts.twig
Normal file
13
templates/head-scripts.twig
Normal file
@ -0,0 +1,13 @@
|
||||
{# SPDX-License-Identifier: EUPL-1.2 #}
|
||||
{# Authors: see README.md #}
|
||||
{% if canEdit %}
|
||||
<script src="{{ plugins_url }}/PicoContentEditor/js/vendor/noty/noty.min.js" type="text/javascript"></script>
|
||||
|
||||
<script src="{{ plugins_url }}/PicoContentEditor/js/vendor/ContentTools/content-tools.min.js"></script>
|
||||
{% if dataLang is not empty %}
|
||||
<script id="ContentToolsLanguage" type="application/json" data-lang="{{ dataLang.lang }}">{{ dataLang.data|raw }}</script>
|
||||
{% endif %}
|
||||
<script src="{{ plugins_url }}/PicoContentEditor/js/editor.js"></script>
|
||||
{% endif %}
|
||||
|
||||
|
10
templates/head-styles.twig
Normal file
10
templates/head-styles.twig
Normal file
@ -0,0 +1,10 @@
|
||||
{# SPDX-License-Identifier: EUPL-1.2 #}
|
||||
{# Authors: see README.md #}
|
||||
{% if canEdit %}
|
||||
<link href="{{ plugins_url }}/PicoContentEditor/css/vendor/noty/noty.css" rel="stylesheet">
|
||||
<link href="{{ plugins_url }}/PicoContentEditor/css/vendor/noty/themes/mint.css" rel="stylesheet">
|
||||
|
||||
<link href="{{ plugins_url }}/PicoContentEditor/css/vendor/ContentTools/content-tools.min.css" rel="stylesheet">
|
||||
|
||||
<link href="{{ plugins_url }}/PicoContentEditor/css/style.css" rel="stylesheet">
|
||||
{% endif %}
|
7
templates/meta-data-editor.twig
Normal file
7
templates/meta-data-editor.twig
Normal file
@ -0,0 +1,7 @@
|
||||
{# SPDX-License-Identifier: EUPL-1.2 #}
|
||||
{# Authors: see README.md #}
|
||||
{% if canEdit and meta %}
|
||||
<div class="ContentEditor">
|
||||
<pre class="ContentEditor_Meta" data-fixture data-meta>{{ meta|raw }}</pre>
|
||||
</div>
|
||||
{% endif %}
|
164
yarn.lock
Normal file
164
yarn.lock
Normal file
@ -0,0 +1,164 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
ContentTools@^1.6.16:
|
||||
version "1.6.16"
|
||||
resolved "https://registry.yarnpkg.com/ContentTools/-/ContentTools-1.6.16.tgz#0773d2481a0ad5dafdb197c94e65d832c75de885"
|
||||
integrity sha512-3uqYLMC217u1/4SU1QfpUQYVGub6S+61gYP+2Yme1VewgvzsCKVaRab0jxbntC5jF5mty8V951XBIm6SZtiCKA==
|
||||
dependencies:
|
||||
sass "^1.25.1-test.1"
|
||||
|
||||
anymatch@~3.1.2:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
|
||||
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
|
||||
dependencies:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
binary-extensions@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
||||
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
||||
|
||||
braces@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
"chokidar@>=3.0.0 <4.0.0":
|
||||
version "3.5.3"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
|
||||
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
|
||||
dependencies:
|
||||
anymatch "~3.1.2"
|
||||
braces "~3.0.2"
|
||||
glob-parent "~5.1.2"
|
||||
is-binary-path "~2.1.0"
|
||||
is-glob "~4.0.1"
|
||||
normalize-path "~3.0.0"
|
||||
readdirp "~3.6.0"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
fs-extra@^11.1.0:
|
||||
version "11.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed"
|
||||
integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
fsevents@~2.3.2:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
|
||||
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
|
||||
|
||||
glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.10"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
|
||||
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
|
||||
|
||||
immutable@^4.0.0:
|
||||
version "4.2.4"
|
||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a"
|
||||
integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==
|
||||
|
||||
is-binary-path@~2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
||||
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
|
||||
dependencies:
|
||||
binary-extensions "^2.0.0"
|
||||
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
|
||||
|
||||
is-glob@^4.0.1, is-glob@~4.0.1:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
|
||||
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
|
||||
dependencies:
|
||||
universalify "^2.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||
|
||||
noty@^3.2.0-beta-deprecated:
|
||||
version "3.2.0-beta-deprecated"
|
||||
resolved "https://registry.yarnpkg.com/noty/-/noty-3.2.0-beta-deprecated.tgz#f74126808b40ba11d7cea3eefc836b32ff7a30f2"
|
||||
integrity sha512-ntRbHuQ9SnnnVFZm/oq5L1DBCaHQUvsU24AwZH3PGjAWx2YqR/IhOadMk11vmJovYiQo00oqTj6Hp+D6PGtmLA==
|
||||
|
||||
picomatch@^2.0.4, picomatch@^2.2.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
|
||||
readdirp@~3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
||||
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
|
||||
dependencies:
|
||||
picomatch "^2.2.1"
|
||||
|
||||
sass@^1.25.1-test.1:
|
||||
version "1.58.3"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d"
|
||||
integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
immutable "^4.0.0"
|
||||
source-map-js ">=0.6.2 <2.0.0"
|
||||
|
||||
"source-map-js@>=0.6.2 <2.0.0":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
Loading…
x
Reference in New Issue
Block a user