├── tests ├── __init__.py ├── testapp │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── 0002_testmodel.py │ │ └── 0001_initial.py │ ├── templates │ │ └── flatpages │ │ │ └── default.html │ ├── models.py │ └── admin.py ├── urls.py ├── test_models.py ├── manage.py ├── test_static_files.py ├── test_views.py ├── test_compressor.py └── settings.py ├── docs ├── history.rst ├── index.rst └── Makefile ├── tinymce ├── __init__.py ├── static │ ├── tinymce │ │ ├── langs │ │ │ └── README.md │ │ ├── license.md │ │ ├── skins │ │ │ ├── ui │ │ │ │ ├── oxide │ │ │ │ │ ├── skin.shadowdom.min.css │ │ │ │ │ └── skin.shadowdom.js │ │ │ │ ├── oxide-dark │ │ │ │ │ ├── skin.shadowdom.min.css │ │ │ │ │ └── skin.shadowdom.js │ │ │ │ ├── tinymce-5 │ │ │ │ │ ├── skin.shadowdom.min.css │ │ │ │ │ └── skin.shadowdom.js │ │ │ │ └── tinymce-5-dark │ │ │ │ │ ├── skin.shadowdom.min.css │ │ │ │ │ └── skin.shadowdom.js │ │ │ └── content │ │ │ │ ├── default │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ │ │ ├── tinymce-5 │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ │ │ ├── writer │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ │ │ ├── dark │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ │ │ ├── tinymce-5-dark │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ │ │ └── document │ │ │ │ ├── content.min.css │ │ │ │ └── content.js │ │ └── plugins │ │ │ ├── code │ │ │ └── plugin.min.js │ │ │ ├── visualblocks │ │ │ └── plugin.min.js │ │ │ ├── nonbreaking │ │ │ └── plugin.min.js │ │ │ ├── save │ │ │ └── plugin.min.js │ │ │ ├── pagebreak │ │ │ └── plugin.min.js │ │ │ ├── autoresize │ │ │ └── plugin.min.js │ │ │ ├── anchor │ │ │ └── plugin.min.js │ │ │ ├── insertdatetime │ │ │ └── plugin.min.js │ │ │ ├── help │ │ │ └── js │ │ │ │ └── i18n │ │ │ │ └── keynav │ │ │ │ ├── zh_CN.js │ │ │ │ ├── zh_TW.js │ │ │ │ ├── ja.js │ │ │ │ ├── ko_KR.js │ │ │ │ ├── he_IL.js │ │ │ │ ├── th_TH.js │ │ │ │ ├── hi.js │ │ │ │ ├── en.js │ │ │ │ ├── fa.js │ │ │ │ ├── ms.js │ │ │ │ ├── sv_SE.js │ │ │ │ ├── id.js │ │ │ │ ├── da.js │ │ │ │ ├── ar.js │ │ │ │ ├── pt_BR.js │ │ │ │ ├── eu.js │ │ │ │ ├── tr.js │ │ │ │ ├── vi.js │ │ │ │ ├── pt_PT.js │ │ │ │ ├── nl.js │ │ │ │ ├── nb_NO.js │ │ │ │ ├── hu_HU.js │ │ │ │ ├── cs.js │ │ │ │ ├── kk.js │ │ │ │ ├── sl_SI.js │ │ │ │ └── ru.js │ │ │ ├── autolink │ │ │ └── plugin.min.js │ │ │ ├── autosave │ │ │ └── plugin.min.js │ │ │ ├── importcss │ │ │ └── plugin.min.js │ │ │ ├── advlist │ │ │ └── plugin.min.js │ │ │ └── directionality │ │ │ └── plugin.min.js │ └── django_tinymce │ │ ├── admin_tinymce.css │ │ └── init_tinymce.js ├── urls.py ├── templates │ └── tinymce │ │ ├── filebrowser.js │ │ └── tiny_mce_gzip.js ├── models.py ├── settings.py └── views.py ├── MANIFEST.in ├── .gitignore ├── CONTRIBUTING.rst ├── check_encoding.sh ├── tox.ini ├── LICENSE.txt ├── .pre-commit-config.yaml ├── .github └── workflows │ ├── release.yml │ └── test.yml ├── CONTRIBUTORS.rst ├── runtests.py ├── CODE_OF_CONDUCT.md ├── README.rst └── pyproject.toml /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/testapp/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/testapp/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/history.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../CHANGELOG.rst 2 | -------------------------------------------------------------------------------- /tinymce/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2008 Joost Cassee 2 | # Licensed under the terms of the MIT License (see LICENSE.txt) 3 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.py *.rst 2 | include docs/*.rst 3 | exclude *.pyc 4 | recursive-include tests * 5 | recursive-include tinymce * 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info 2 | *.pyc 3 | .DS_Store 4 | *.sqlite 5 | .coverage 6 | .venv/ 7 | __pycache__/ 8 | .tox/ 9 | coverage.xml 10 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/langs/README.md: -------------------------------------------------------------------------------- 1 | This is where language files should be placed. 2 | 3 | Please DO NOT translate these directly, use this service instead: https://crowdin.com/project/tinymce 4 | -------------------------------------------------------------------------------- /tests/testapp/templates/flatpages/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ flatpage.title }} 5 | 6 | 7 | 8 |

{{ flatpage.title }}

9 | 10 | {{ flatpage.content }} 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/license.md: -------------------------------------------------------------------------------- 1 | # Software License Agreement 2 | 3 | **TinyMCE** – [](https://github.com/tinymce/tinymce) 4 | Copyright (c) 2024, Ephox Corporation DBA Tiny Technologies, Inc. 5 | 6 | Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). 7 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://jazzband.co/static/img/jazzband.svg 2 | :target: https://jazzband.co/ 3 | :alt: Jazzband 4 | 5 | This is a `Jazzband `_ project. By contributing you agree to abide by the `Contributor Code of Conduct `_ and follow the `guidelines `_. 6 | -------------------------------------------------------------------------------- /tests/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 3 | from django.urls import include, path 4 | 5 | import tinymce.urls 6 | 7 | urlpatterns = [ 8 | path("tinymce/", include(tinymce.urls)), 9 | path("admin/", admin.site.urls), 10 | ] 11 | 12 | urlpatterns += staticfiles_urlpatterns() 13 | -------------------------------------------------------------------------------- /tinymce/static/django_tinymce/admin_tinymce.css: -------------------------------------------------------------------------------- 1 | /* 2 | Workaround for the following rule defined in 3 | django/contrib/admin/static/admin/css/responsive.css (which is 4 | unsuitable for textareas used by TinyMCE internally): 5 | 6 | @media (max-width: 1024px) { 7 | textarea { 8 | max-width: 100%; 9 | max-height: 120px; 10 | } 11 | } 12 | */ 13 | .tox .tox-textarea-wrap .tox-textarea { 14 | max-height: none; 15 | } 16 | -------------------------------------------------------------------------------- /tinymce/urls.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2008 Joost Cassee 2 | # Licensed under the terms of the MIT License (see LICENSE.txt) 3 | from django.urls import path 4 | 5 | from tinymce import views 6 | 7 | urlpatterns = [ 8 | path("flatpages_link_list/", views.flatpages_link_list, name="tinymce-linklist"), 9 | path("compressor/", views.compressor, name="tinymce-compressor"), 10 | path("filebrowser/", views.filebrowser, name="tinymce-filebrowser"), 11 | ] 12 | -------------------------------------------------------------------------------- /check_encoding.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | STATICS='tinymce/static/' 3 | 4 | 5 | FULLPATH=$(cd $(dirname "$STATICS"); pwd)/$(basename "$STATICS") 6 | 7 | echo -en "Checking files in $FULLPATH\r" 8 | 9 | find "$FULLPATH" -type f -exec file {} \; | egrep -v "(ASCII|GIF|PNG|JPEG|Flash|UTF-8)" 10 | 11 | if [ "$?" -ne 1 ]; then 12 | echo "Please check encoding of files listed above." 13 | exit 1 14 | fi 15 | echo "Encoding of '$FULLPATH' files checked. Status OK." 16 | exit 0 17 | -------------------------------------------------------------------------------- /tests/testapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | from tinymce import models as tinymce_models 4 | 5 | 6 | class TestModel(models.Model): 7 | foobar = tinymce_models.HTMLField() 8 | 9 | 10 | class TestPage(models.Model): 11 | content1 = models.TextField() 12 | content2 = models.TextField() 13 | 14 | 15 | class TestInline(models.Model): 16 | page = models.ForeignKey(TestPage, on_delete=models.CASCADE) 17 | content1 = models.TextField() 18 | content2 = models.TextField() 19 | -------------------------------------------------------------------------------- /tests/test_models.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.admin.sites import AdminSite 3 | from django.test import SimpleTestCase 4 | 5 | from tests.testapp.models import TestModel 6 | from tinymce.widgets import AdminTinyMCE 7 | 8 | 9 | class TestModels(SimpleTestCase): 10 | def setUp(self): 11 | self.site = AdminSite() 12 | 13 | def test_htmlfield(self): 14 | ma = admin.ModelAdmin(TestModel, self.site) 15 | self.assertIsInstance(ma.get_form(None).base_fields["foobar"].widget, AdminTinyMCE) 16 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /tinymce/templates/tinymce/filebrowser.js: -------------------------------------------------------------------------------- 1 | function djangoFileBrowser(callback, value, meta) { 2 | var url = "{{ fb_url }}?pop=5&type=" + meta.filetype; 3 | 4 | tinyMCE.activeEditor.windowManager.openUrl( 5 | { 6 | 'title': 'Django Filebrowser', 7 | 'url': url, 8 | 'width': 1024, 9 | 'height': 800, 10 | 'onMessage': function (dialogApi, details) { 11 | callback(details.content) 12 | dialogApi.close() 13 | } 14 | }, 15 | ); 16 | return false 17 | } 18 | -------------------------------------------------------------------------------- /tests/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | try: 6 | os.environ["DJANGO_SETTINGS_MODULE"] = "tests.settings" 7 | test_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 8 | sys.path.insert(0, test_dir) 9 | except ImportError: 10 | pass 11 | else: 12 | from django.core.management import execute_from_command_line 13 | 14 | 15 | def main(): 16 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.settings" % __package__) 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == "__main__": 21 | main() 22 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/oxide/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/oxide/skin.shadowdom.css', `body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/oxide-dark/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/oxide-dark/skin.shadowdom.css', `body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/tinymce-5/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/tinymce-5/skin.shadowdom.css', `body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/tinymce-5-dark/skin.shadowdom.css', `body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}`) -------------------------------------------------------------------------------- /tests/testapp/migrations/0002_testmodel.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.17 on 2021-01-28 10:51 2 | 3 | from django.db import migrations, models 4 | 5 | import tinymce.models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("testapp", "0001_initial"), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name="TestModel", 16 | fields=[ 17 | ( 18 | "id", 19 | models.AutoField( 20 | auto_created=True, primary_key=True, serialize=False, verbose_name="ID" 21 | ), 22 | ), 23 | ("foobar", tinymce.models.HTMLField()), 24 | ], 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /tinymce/models.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2008 Joost Cassee 2 | # Licensed under the terms of the MIT License (see LICENSE.txt) 3 | 4 | from django.contrib.admin import widgets as admin_widgets 5 | from django.db import models 6 | 7 | from tinymce import widgets as tinymce_widgets 8 | 9 | 10 | class HTMLField(models.TextField): 11 | """ 12 | A large string field for HTML content. It uses the TinyMCE widget in 13 | forms. 14 | """ 15 | 16 | def formfield(self, **kwargs): 17 | defaults = {"widget": tinymce_widgets.TinyMCE} 18 | defaults.update(kwargs) 19 | 20 | # As an ugly hack, we override the admin widget 21 | if defaults["widget"] == admin_widgets.AdminTextareaWidget: 22 | defaults["widget"] = tinymce_widgets.AdminTinyMCE 23 | 24 | return super().formfield(**defaults) 25 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}(); -------------------------------------------------------------------------------- /tests/test_static_files.py: -------------------------------------------------------------------------------- 1 | import tempfile 2 | 3 | from django.core.management import call_command 4 | from django.test import SimpleTestCase 5 | 6 | 7 | class TestStaticFiles(SimpleTestCase): 8 | 9 | def test_manifest_static_files_storage(self): 10 | """ 11 | Test that TinyMCE's static files can be collected 12 | when using ManifestStaticFilesStorage - missing 13 | .map files can cause this to fail if the static 14 | files refer to them (GH issue #460) 15 | """ 16 | with tempfile.TemporaryDirectory() as temp_dir: 17 | with self.settings( 18 | STATIC_ROOT=temp_dir, 19 | STATICFILES_STORAGE="django.contrib.staticfiles.storage.ManifestStaticFilesStorage", 20 | ): 21 | result = call_command("collectstatic", "--no-input") 22 | self.assertRegex(result, r"\d+ static files copied") 23 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = 3 | py{39,310,311,312}-dj42 4 | py{310,312}-dj50 5 | py{310,313}-dj{51,52,main} 6 | flake8 7 | 8 | [testenv] 9 | deps = 10 | dj42: Django>=4.2,<5.0 11 | dj50: Django>=5.0,<5.1 12 | dj51: Django>=5.1,<5.2 13 | dj52: Django>=5.2,<6.0 14 | djmain: https://github.com/django/django/archive/main.tar.gz 15 | coverage[toml] 16 | usedevelop = True 17 | ignore_outcome = 18 | djmain: True 19 | commands = 20 | coverage run {envbindir}/django-admin test 21 | coverage report -m 22 | coverage xml 23 | pip freeze 24 | setenv = 25 | DJANGO_SETTINGS_MODULE=tests.settings 26 | PYTHONPATH={toxinidir} 27 | 28 | [testenv:flake8] 29 | deps = 30 | flake8 31 | commands = 32 | flake8 tinymce --ignore=E501,E402,W503 33 | 34 | [gh-actions] 35 | python = 36 | 3.9: py39, flake8 37 | 3.10: py310 38 | 3.11: py311 39 | 3.12: py312 40 | 3.13: py313 41 | 42 | [gh-actions:env] 43 | DJANGO = 44 | 4.2: dj42 45 | 5.0: dj50 46 | 5.1: dj51 47 | 5.2: dj52 48 | main: djmain 49 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2008 Joost Cassee 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | exclude: '^tinymce/(static/tinymce|media/tiny_mce|static/.*min.js$)' 4 | repos: 5 | - repo: https://github.com/pre-commit/pre-commit-hooks 6 | rev: v6.0.0 7 | hooks: 8 | - id: check-toml 9 | - id: check-added-large-files 10 | - id: check-ast 11 | - id: check-yaml 12 | - id: debug-statements 13 | - id: detect-private-key 14 | - id: end-of-file-fixer 15 | - id: trailing-whitespace 16 | 17 | - repo: https://github.com/psf/black-pre-commit-mirror 18 | rev: 25.12.0 19 | hooks: 20 | - id: black 21 | args: [--exclude=static] 22 | 23 | - repo: https://github.com/asottile/seed-isort-config 24 | rev: v2.2.0 25 | hooks: 26 | - id: seed-isort-config 27 | - repo: https://github.com/PyCQA/isort 28 | rev: 7.0.0 29 | hooks: 30 | - id: isort 31 | additional_dependencies: 32 | - toml 33 | 34 | - repo: https://github.com/PyCQA/flake8 35 | rev: 7.3.0 36 | hooks: 37 | - id: flake8 38 | args: [--max-line-length=110] 39 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/default/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/tinymce-5/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/writer/content.min.css: -------------------------------------------------------------------------------- 1 | body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to the django-tinymce documentation 2 | =========================================== 3 | 4 | django-tinymce is a Django_ application that contains a widget to render a form field 5 | as a TinyMCE_ editor. 6 | 7 | Features: 8 | * Use as a form widget or with a view. 9 | * Enhanced support for content languages. 10 | * Enables predefined link and image lists for dialogs. 11 | * Support for django-staticfiles 12 | * Can compress the TinyMCE Javascript code. 13 | * Integration with `django-filebrowser`_. 14 | 15 | The django-tinymce code is licensed under the `MIT License`_, the same licence 16 | as the TinyMCE 6 editor itself. See the ``LICENSE.txt`` file in the distribution. 17 | 18 | Starting with django-tinymce v1.5.1 TinyMCE editor is bundled with django-tinymce to enable easy installation and usage. 19 | 20 | .. _Django: https://www.djangoproject.com/ 21 | .. _TinyMCE: https://www.tiny.cloud/ 22 | .. _`django-filebrowser`: https://github.com/sehmaschine/django-filebrowser/ 23 | .. _`MIT License`: https://opensource.org/license/mit/ 24 | 25 | Documentation 26 | ------------- 27 | 28 | .. toctree:: 29 | :maxdepth: 2 30 | 31 | installation 32 | usage 33 | history 34 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/default/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/default/content.css', `body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/tinymce-5/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/tinymce-5/content.css', `body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tinymce/settings.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.contrib.staticfiles.storage import staticfiles_storage 3 | 4 | DEFAULT_CONFIG = getattr( 5 | settings, 6 | "TINYMCE_DEFAULT_CONFIG", 7 | { 8 | "theme": "silver", 9 | "height": 500, 10 | "menubar": False, 11 | "browser_spellcheck": True, 12 | "plugins": "advlist,autolink,lists,link,image,charmap,preview,anchor," 13 | "searchreplace,visualblocks,code,fullscreen,insertdatetime,media,table," 14 | "help,wordcount", 15 | "toolbar": "undo redo | blocks | " 16 | "bold italic backcolor | alignleft aligncenter " 17 | "alignright alignjustify | bullist numlist outdent indent | " 18 | "removeformat | help", 19 | }, 20 | ) 21 | 22 | USE_COMPRESSOR = getattr(settings, "TINYMCE_COMPRESSOR", False) 23 | 24 | USE_EXTRA_MEDIA = getattr(settings, "TINYMCE_EXTRA_MEDIA", None) 25 | 26 | USE_FILEBROWSER = getattr( 27 | settings, "TINYMCE_FILEBROWSER", "filebrowser" in settings.INSTALLED_APPS 28 | ) 29 | 30 | 31 | def get_js_url(): 32 | return getattr( 33 | settings, 34 | "TINYMCE_JS_URL", 35 | staticfiles_storage.url("tinymce/tinymce.min.js"), 36 | ) 37 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/dark/content.min.css: -------------------------------------------------------------------------------- 1 | body{background-color:#222f3e;color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/writer/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/writer/content.css', `body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/visualblocks/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const o=(t,o,e)=>{t.dom.toggleClass(t.getBody(),"mce-visualblocks"),e.set(!e.get()),((t,o)=>{t.dispatch("VisualBlocks",{state:o})})(t,e.get())},e=t=>t.options.get("visualblocks_default_state");const s=(t,o)=>e=>{e.setActive(o.get());const s=t=>e.setActive(t.state);return t.on("VisualBlocks",s),()=>t.off("VisualBlocks",s)};t.add("visualblocks",((t,l)=>{(t=>{(0,t.options.register)("visualblocks_default_state",{processor:"boolean",default:!1})})(t);const a=(()=>{let t=!1;return{get:()=>t,set:o=>{t=o}}})();((t,e,s)=>{t.addCommand("mceVisualBlocks",(()=>{o(t,0,s)}))})(t,0,a),((t,o)=>{const e=()=>t.execCommand("mceVisualBlocks");t.ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:e,onSetup:s(t,o),context:"any"}),t.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:e,onSetup:s(t,o),context:"any"})})(t,a),((t,s,l)=>{t.on("PreviewFormats AfterPreviewFormats",(o=>{l.get()&&t.dom.toggleClass(t.getBody(),"mce-visualblocks","afterpreviewformats"===o.type)})),t.on("init",(()=>{e(t)&&o(t,0,l)}))})(t,0,a)}))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/tinymce-5-dark/content.min.css: -------------------------------------------------------------------------------- 1 | body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/document/content.min.css: -------------------------------------------------------------------------------- 1 | @media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem} 2 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/dark/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/dark/content.css', `body{background-color:#222f3e;color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/tinymce-5-dark/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/tinymce-5-dark/content.css', `body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tinymce/static/tinymce/skins/content/document/content.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('content/document/content.css', `@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}`) -------------------------------------------------------------------------------- /tests/testapp/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.5 on 2020-04-10 10:25 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | initial = True 9 | 10 | dependencies = [] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name="TestPage", 15 | fields=[ 16 | ( 17 | "id", 18 | models.AutoField( 19 | auto_created=True, primary_key=True, serialize=False, verbose_name="ID" 20 | ), 21 | ), 22 | ("content1", models.TextField()), 23 | ("content2", models.TextField()), 24 | ], 25 | ), 26 | migrations.CreateModel( 27 | name="TestInline", 28 | fields=[ 29 | ( 30 | "id", 31 | models.AutoField( 32 | auto_created=True, primary_key=True, serialize=False, verbose_name="ID" 33 | ), 34 | ), 35 | ("content1", models.TextField()), 36 | ("content2", models.TextField()), 37 | ( 38 | "page", 39 | models.ForeignKey( 40 | on_delete=django.db.models.deletion.CASCADE, to="testapp.TestPage" 41 | ), 42 | ), 43 | ], 44 | ), 45 | ] 46 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | build: 10 | if: github.repository == 'jazzband/django-tinymce' 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v4 20 | with: 21 | python-version: 3.11 22 | 23 | - name: Get pip cache dir 24 | id: pip-cache 25 | run: | 26 | echo "::set-output name=dir::$(pip cache dir)" 27 | 28 | - name: Cache 29 | uses: actions/cache@v3 30 | with: 31 | path: ${{ steps.pip-cache.outputs.dir }} 32 | key: release-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }} 33 | restore-keys: | 34 | release- 35 | 36 | - name: Install dependencies 37 | run: | 38 | python -m pip install -U pip 39 | python -m pip install -U setuptools build twine 40 | 41 | - name: Build package 42 | run: | 43 | python -m build 44 | twine check dist/* 45 | 46 | - name: Upload packages to Jazzband 47 | if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') 48 | uses: pypa/gh-action-pypi-publish@master 49 | with: 50 | user: jazzband 51 | password: ${{ secrets.JAZZBAND_RELEASE_KEY }} 52 | repository_url: https://jazzband.co/projects/django-tinymce/upload 53 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,o=e("boolean"),a=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),s=t("nonbreaking_wrap"),r=(n,e)=>{let o="";for(let a=0;a{const o=s(n)||n.plugins.visualchars?`${r(" ",e)}`:r(" ",e);n.undoManager.transact((()=>n.insertContent(o)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");const u=n=>e=>{const o=()=>{e.setEnabled(n.selection.isEditable())};return n.on("NodeChange",o),o(),()=>{n.off("NodeChange",o)}};n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>o(n)?{value:n?3:0,valid:!0}:a(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e,onSetup:u(n)}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e,onSetup:u(n)})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(o=>{if(o.keyCode===l.TAB&&!o.isDefaultPrevented()){if(o.shiftKey)return;o.preventDefault(),o.stopImmediatePropagation(),c(n,e)}}))})(n)}))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/save/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const o=e=>"function"==typeof e;var t=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");const a=e=>o=>o.options.get(e),c=a("save_enablewhendirty"),i=a("save_onsavecallback"),s=a("save_oncancelcallback"),r=(e,o)=>{e.notificationManager.open({text:o,type:"error"})},l=e=>o=>{const t=()=>{o.setEnabled(!c(e)||e.isDirty())};return t(),e.on("NodeChange dirty",t),()=>e.off("NodeChange dirty",t)};e.add("save",(e=>{(e=>{const o=e.options.register;o("save_enablewhendirty",{processor:"boolean",default:!0}),o("save_onsavecallback",{processor:"function"}),o("save_oncancelcallback",{processor:"function"})})(e),(e=>{e.ui.registry.addButton("save",{icon:"save",tooltip:"Save",enabled:!1,onAction:()=>e.execCommand("mceSave"),onSetup:l(e),shortcut:"Meta+S"}),e.ui.registry.addButton("cancel",{icon:"cancel",tooltip:"Cancel",enabled:!1,onAction:()=>e.execCommand("mceCancel"),onSetup:l(e)}),e.addShortcut("Meta+S","","mceSave")})(e),(e=>{e.addCommand("mceSave",(()=>{(e=>{const n=t.DOM.getParent(e.id,"form");if(c(e)&&!e.isDirty())return;e.save();const a=i(e);if(o(a))return a.call(e,e),void e.nodeChanged();n?(e.setDirty(!1),n.onsubmit&&!n.onsubmit()||("function"==typeof n.submit?n.submit():r(e,"Error: Form submit field collision.")),e.nodeChanged()):r(e,"Error: No form element found.")})(e)})),e.addCommand("mceCancel",(()=>{(e=>{const t=n.trim(e.startContent),a=s(e);o(a)?a.call(e,e):e.resetContent(t)})(e)}))})(e)}))}(); -------------------------------------------------------------------------------- /CONTRIBUTORS.rst: -------------------------------------------------------------------------------- 1 | Contributors 2 | ============ 3 | 4 | * Aarni Koskela 5 | * Aitzol Naberan 6 | * Aljosa Mohorovic 7 | * Andy Venet 8 | * BakaNeko 9 | * Chem 10 | * Claude Paroz 11 | * Craig de Stigter 12 | * Dan Moore 13 | * David Harks 14 | * Fred Stluka 15 | * Guilherme Rezende 16 | * Hugo Des 17 | * Ian Bruce 18 | * Jaap Roes 19 | * James Cleveland 20 | * Jason Davies 21 | * Jessamyn Smith 22 | * Joel Burton 23 | * Jonathan D. Baker 24 | * Joost Cassee 25 | * Lee Semel 26 | * Matt Archibald 27 | * Peter van Kampen 28 | * Piet Delport 29 | * Pokutnik Alexandr 30 | * Quadracik 31 | * Rémy HUBSCHER 32 | * Steffen Jasper 33 | * Tim Saylor 34 | * Venelin Stoykov 35 | * Zuzel Vera 36 | * Ivan Chernov 37 | * Andrew Meakovski 38 | * Tom Chiung-ting Chen 39 | * Dima Revutskyi 40 | * Ryan Sevelj 41 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/pagebreak/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),n=t("pagebreak_separator"),o=t("pagebreak_split_block"),r="mce-pagebreak",s=e=>{const t=``;return e?`

${t}

`:t},c=e=>a=>{const t=()=>{a.setEnabled(e.selection.isEditable())};return e.on("NodeChange",t),t(),()=>{e.off("NodeChange",t)}};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(o(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a,onSetup:c(e)}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a,onSetup:c(e)})})(e),(e=>{const a=n(e),t=()=>o(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(n=>{let o,s,c=n.length;for(;c--;)if(o=n[c],s=o.attr("class"),s&&-1!==s.indexOf(r)){const n=o.parent;if(n&&e.schema.getBlockElements()[n.name]&&t()){n.type=3,n.value=a,n.raw=!0,o.remove();continue}o.type=3,o.value=a,o.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,r)&&(a.name="pagebreak")}))})(e)}))}(); -------------------------------------------------------------------------------- /runtests.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import os 3 | import sys 4 | 5 | # Force this to happen before loading django 6 | try: 7 | os.environ["DJANGO_SETTINGS_MODULE"] = "testtinymce.settings" 8 | test_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 | sys.path.insert(0, test_dir) 10 | except ImportError: 11 | pass 12 | else: 13 | import django 14 | from django.conf import settings 15 | from django.test.utils import get_runner 16 | 17 | 18 | def runtests(modules=["tinymce"], verbosity=1, failfast=False): 19 | django.setup() 20 | TestRunner = get_runner(settings) 21 | test_runner = TestRunner(interactive=True, verbosity=verbosity, failfast=failfast) 22 | failures = test_runner.run_tests(modules) 23 | sys.exit(bool(failures)) 24 | 25 | 26 | if __name__ == "__main__": 27 | parser = argparse.ArgumentParser(description="Run the django-tinymce test suite.") 28 | parser.add_argument( 29 | "modules", 30 | nargs="*", 31 | metavar="module", 32 | help='Optional path(s) to test modules; e.g. "tinymce" or ' 33 | '"tinymce.tests.test_widgets".', 34 | ) 35 | parser.add_argument( 36 | "-v", 37 | "--verbosity", 38 | default=1, 39 | type=int, 40 | choices=[0, 1, 2, 3], 41 | help="Verbosity level; 0=minimal output, 1=normal output, 2=all output", 42 | ) 43 | parser.add_argument( 44 | "--failfast", 45 | action="store_true", 46 | help="Stop running the test suite after first failed test.", 47 | ) 48 | options = parser.parse_args() 49 | runtests(modules=options.modules, verbosity=options.verbosity, failfast=options.failfast) 50 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | name: build (Python ${{ matrix.python-version }}, Django ${{ matrix.django-version }}) 8 | runs-on: ubuntu-latest 9 | strategy: 10 | fail-fast: false 11 | max-parallel: 5 12 | matrix: 13 | python-version: ['3.9', '3.12', '3.13'] 14 | django-version: ['4.2', '5.0', '5.1', '5.2', 'main'] 15 | exclude: 16 | - python-version: 3.9 17 | django-version: 5.0 18 | - python-version: 3.9 19 | django-version: 5.1 20 | - python-version: 3.9 21 | django-version: 5.2 22 | - python-version: 3.9 23 | django-version: main 24 | - python-version: 3.13 25 | django-version: 4.2 26 | 27 | steps: 28 | - uses: actions/checkout@v4 29 | 30 | - name: Set up Python ${{ matrix.python-version }} 31 | uses: actions/setup-python@v4 32 | with: 33 | python-version: ${{ matrix.python-version }} 34 | 35 | - name: Get pip cache dir 36 | id: pip-cache 37 | run: | 38 | echo "::set-output name=dir::$(pip cache dir)" 39 | 40 | - name: Cache 41 | uses: actions/cache@v3 42 | with: 43 | path: ${{ steps.pip-cache.outputs.dir }} 44 | key: 45 | ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }} 46 | restore-keys: | 47 | ${{ matrix.python-version }}-v1- 48 | 49 | - name: Install dependencies 50 | run: | 51 | python -m pip install --upgrade pip 52 | python -m pip install --upgrade coverage[toml] tox tox-gh-actions 53 | 54 | - name: Tox tests 55 | run: | 56 | tox -v 57 | env: 58 | DJANGO: ${{ matrix.django-version }} 59 | 60 | - name: Upload coverage 61 | uses: codecov/codecov-action@v3 62 | with: 63 | name: Python ${{ matrix.python-version }} 64 | -------------------------------------------------------------------------------- /tests/testapp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.flatpages.admin import FlatPageAdmin 3 | from django.contrib.flatpages.models import FlatPage 4 | from django.urls import reverse 5 | 6 | from tests.testapp.models import TestInline, TestModel, TestPage 7 | from tinymce.widgets import AdminTinyMCE 8 | 9 | 10 | class TinyMCETestInlineAdmin(admin.StackedInline): 11 | model = TestInline 12 | extra = 1 13 | 14 | def formfield_for_dbfield(self, db_field, **kwargs): 15 | if db_field.name in ("content1", "content2"): 16 | return db_field.formfield( 17 | widget=AdminTinyMCE( 18 | attrs={"cols": 80, "rows": 30}, 19 | mce_attrs={"external_link_list_url": reverse("tinymce-linklist")}, 20 | ) 21 | ) 22 | return super().formfield_for_dbfield(db_field, **kwargs) 23 | 24 | 25 | class TinyMCEFlatPageAdmin(FlatPageAdmin): 26 | def formfield_for_dbfield(self, db_field, **kwargs): 27 | if db_field.name == "content": 28 | return db_field.formfield( 29 | widget=AdminTinyMCE( 30 | attrs={"cols": 80, "rows": 30}, 31 | mce_attrs={"external_link_list_url": reverse("tinymce-linklist")}, 32 | ) 33 | ) 34 | return super().formfield_for_dbfield(db_field, **kwargs) 35 | 36 | 37 | class TinyMCETestPageAdmin(admin.ModelAdmin): 38 | inlines = [TinyMCETestInlineAdmin] 39 | 40 | def formfield_for_dbfield(self, db_field, **kwargs): 41 | if db_field.name in ("content1", "content2"): 42 | return db_field.formfield( 43 | widget=AdminTinyMCE( 44 | attrs={"cols": 80, "rows": 30}, 45 | mce_attrs={"external_link_list_url": reverse("tinymce-linklist")}, 46 | ) 47 | ) 48 | return super().formfield_for_dbfield(db_field, **kwargs) 49 | 50 | 51 | admin.site.unregister(FlatPage) 52 | admin.site.register(FlatPage, TinyMCEFlatPageAdmin) 53 | admin.site.register(TestPage, TinyMCETestPageAdmin) 54 | admin.site.register(TestModel) 55 | -------------------------------------------------------------------------------- /tinymce/views.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2008 Joost Cassee 2 | # Licensed under the terms of the MIT License (see LICENSE.txt) 3 | 4 | import json 5 | 6 | from django.http import HttpResponse 7 | from django.shortcuts import render 8 | from django.urls import reverse 9 | 10 | from tinymce.compressor import gzip_compressor 11 | 12 | 13 | def flatpages_link_list(request): 14 | """ 15 | Returns a HttpResponse whose content is a Javascript file representing a 16 | list of links to flatpages. 17 | """ 18 | from django.contrib.flatpages.models import FlatPage 19 | 20 | link_list = [(page.title, page.url) for page in FlatPage.objects.all()] 21 | return render_to_link_list(link_list) 22 | 23 | 24 | def compressor(request): 25 | """ 26 | Returns a GZip-compressed response. 27 | """ 28 | return gzip_compressor(request) 29 | 30 | 31 | def render_to_link_list(link_list): 32 | """ 33 | Returns a HttpResponse whose content is a Javascript file representing a 34 | list of links suitable for use wit the TinyMCE external_link_list_url 35 | configuration option. The link_list parameter must be a list of 2-tuples. 36 | """ 37 | return render_to_js_vardef("tinyMCELinkList", link_list) 38 | 39 | 40 | def render_to_image_list(image_list): 41 | """ 42 | Returns a HttpResponse whose content is a Javascript file representing a 43 | list of images suitable for use wit the TinyMCE external_image_list_url 44 | configuration option. The image_list parameter must be a list of 2-tuples. 45 | """ 46 | return render_to_js_vardef("tinyMCEImageList", image_list) 47 | 48 | 49 | def render_to_js_vardef(var_name, var_value): 50 | output = f"var {var_name} = {json.dumps(var_value)};" 51 | return HttpResponse(output, content_type="application/x-javascript") 52 | 53 | 54 | def filebrowser(request): 55 | try: 56 | fb_url = request.build_absolute_uri(reverse("fb_browse")) 57 | except Exception: 58 | fb_url = request.build_absolute_uri(reverse("filebrowser:fb_browse")) 59 | 60 | return render( 61 | request, 62 | "tinymce/filebrowser.js", 63 | {"fb_url": fb_url}, 64 | content_type="application/javascript", 65 | ) 66 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/autoresize/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),n=o("min_height"),s=o("max_height"),i=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),g=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},l=(e,t,o,n)=>{var s;const i=parseInt(null!==(s=e.getStyle(t,o,n))&&void 0!==s?s:"",10);return isNaN(i)?0:i},a=(e,o,r,c)=>{var d;const u=e.dom,h=e.getDoc();if(!h)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void g(e,!0);const m=h.documentElement,f=c?c():i(e),p=null!==(d=n(e))&&void 0!==d?d:e.getElement().offsetHeight;let y=p;const S=l(u,m,"margin-top",!0),v=l(u,m,"margin-bottom",!0);let C=m.offsetHeight+S+v+f;C<0&&(C=0);const H=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+H>p&&(y=C+H);const b=s(e);b&&y>b?(y=b,g(e,!0)):g(e,!1);const w=o.get();if(w.set&&(e.dom.setStyles(e.getDoc().documentElement,{"min-height":0}),e.dom.setStyles(e.getBody(),{"min-height":"inherit"})),y!==w.totalHeight&&(C-f!==w.contentHeight||!w.set)){const n=y-w.totalHeight;if(u.setStyle(e.getContainer(),"height",y+"px"),o.set({totalHeight:y,contentHeight:C,set:!0}),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(r)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&n<0&&a(e,o,r,c)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const o=(()=>{let e={totalHeight:0,contentHeight:0,set:!1};return{get:()=>e,set:t=>{e=t}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{a(e,t)}))})(e,o),((e,o)=>{const n=()=>r(e);e.on("init",(s=>{const r=i(e),g=e.dom;g.setStyles(e.getDoc().documentElement,{height:"auto"}),t.browser.isEdge()||t.browser.isIE()?g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r,"min-height":0}):g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r}),a(e,o,s,n)})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(t=>{a(e,o,t,n)}))})(e,o)}}))}(); -------------------------------------------------------------------------------- /tests/test_views.py: -------------------------------------------------------------------------------- 1 | import os 2 | from unittest.mock import patch 3 | 4 | from django.contrib.flatpages.models import FlatPage 5 | from django.http import HttpResponse 6 | from django.test import TestCase 7 | 8 | from tinymce.views import render_to_image_list 9 | 10 | devnull = open(os.devnull, "w") 11 | 12 | 13 | def compress_whitespace(s): 14 | # replace whitespace runs with a single space 15 | return " ".join(s.split()) 16 | 17 | 18 | class TestViews(TestCase): 19 | def test_flatpages_link_list(self): 20 | FlatPage.objects.create( 21 | url="/test/url", 22 | title="Test Title", 23 | ) 24 | response = self.client.get("/tinymce/flatpages_link_list/") 25 | result_ok = b'var tinyMCELinkList = [["Test Title", "/test/url"]];' 26 | self.assertEqual(200, response.status_code) 27 | self.assertEqual("application/x-javascript", response["Content-Type"]) 28 | self.assertEqual(result_ok, response.content) 29 | 30 | @patch("tinymce.views.gzip_compressor") 31 | def test_compressor(self, gzip_mock): 32 | response_ok = HttpResponse("test", content_type="text/javascript") 33 | gzip_mock.return_value = response_ok 34 | 35 | response = self.client.get("/tinymce/compressor/") 36 | 37 | self.assertEqual(200, response.status_code) 38 | self.assertEqual("text/javascript", response["Content-Type"]) 39 | self.assertEqual(response_ok.content, response.content) 40 | gzip_mock.assert_called_once() 41 | 42 | def test_render_to_image_list(self): 43 | response = render_to_image_list([("test", "test.jpg")]) 44 | result_ok = b'var tinyMCEImageList = [["test", "test.jpg"]];' 45 | self.assertEqual(200, response.status_code) 46 | self.assertEqual("application/x-javascript", response["Content-Type"]) 47 | self.assertEqual(result_ok, response.content) 48 | 49 | @patch("tinymce.views.reverse", return_value="/filebrowser") 50 | def test_filebrowser(self, reverse_mock): 51 | response = self.client.get("/tinymce/filebrowser/") 52 | with open("tinymce/templates/tinymce/filebrowser.js") as f: 53 | response_ok = f.read() 54 | response_ok = response_ok.replace("{{ fb_url }}", "http://testserver/filebrowser") 55 | self.assertEqual(200, response.status_code) 56 | self.assertEqual( 57 | compress_whitespace(response_ok), 58 | compress_whitespace(response.content.decode()), 59 | ) 60 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | As contributors and maintainers of the Jazzband projects, and in the interest of 4 | fostering an open and welcoming community, we pledge to respect all people who 5 | contribute through reporting issues, posting feature requests, updating documentation, 6 | submitting pull requests or patches, and other activities. 7 | 8 | We are committed to making participation in the Jazzband a harassment-free experience 9 | for everyone, regardless of the level of experience, gender, gender identity and 10 | expression, sexual orientation, disability, personal appearance, body size, race, 11 | ethnicity, age, religion, or nationality. 12 | 13 | Examples of unacceptable behavior by participants include: 14 | 15 | - The use of sexualized language or imagery 16 | - Personal attacks 17 | - Trolling or insulting/derogatory comments 18 | - Public or private harassment 19 | - Publishing other's private information, such as physical or electronic addresses, 20 | without explicit permission 21 | - Other unethical or unprofessional conduct 22 | 23 | The Jazzband roadies have the right and responsibility to remove, edit, or reject 24 | comments, commits, code, wiki edits, issues, and other contributions that are not 25 | aligned to this Code of Conduct, or to ban temporarily or permanently any contributor 26 | for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 27 | 28 | By adopting this Code of Conduct, the roadies commit themselves to fairly and 29 | consistently applying these principles to every aspect of managing the jazzband 30 | projects. Roadies who do not follow or enforce the Code of Conduct may be permanently 31 | removed from the Jazzband roadies. 32 | 33 | This code of conduct applies both within project spaces and in public spaces when an 34 | individual is representing the project or its community. 35 | 36 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by 37 | contacting the roadies at `roadies@jazzband.co`. All complaints will be reviewed and 38 | investigated and will result in a response that is deemed necessary and appropriate to 39 | the circumstances. Roadies are obligated to maintain confidentiality with regard to the 40 | reporter of an incident. 41 | 42 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 43 | 1.3.0, available at [https://contributor-covenant.org/version/1/3/0/][version] 44 | 45 | [homepage]: https://contributor-covenant.org 46 | [version]: https://contributor-covenant.org/version/1/3/0/ 47 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | 9 | # Internal variables. 10 | PAPEROPT_a4 = -D latex_paper_size=a4 11 | PAPEROPT_letter = -D latex_paper_size=letter 12 | ALLSPHINXOPTS = -d .build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 13 | 14 | .PHONY: help clean html web pickle htmlhelp latex changes linkcheck 15 | 16 | help: 17 | @echo "Please use \`make ' where is one of" 18 | @echo " html to make standalone HTML files" 19 | @echo " pickle to make pickle files (usable by e.g. sphinx-web)" 20 | @echo " htmlhelp to make HTML files and a HTML help project" 21 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 22 | @echo " changes to make an overview over all changed/added/deprecated items" 23 | @echo " linkcheck to check all external links for integrity" 24 | 25 | clean: 26 | -rm -rf .build/doctrees 27 | 28 | html: 29 | mkdir -p .build/html .build/doctrees 30 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) .build/html 31 | @echo 32 | @echo "Build finished. The HTML pages are in .build/html." 33 | 34 | pickle: 35 | mkdir -p .build/pickle .build/doctrees 36 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) .build/pickle 37 | @echo 38 | @echo "Build finished; now you can process the pickle files or run" 39 | @echo " sphinx-web .build/pickle" 40 | @echo "to start the sphinx-web server." 41 | 42 | web: pickle 43 | 44 | htmlhelp: 45 | mkdir -p .build/htmlhelp .build/doctrees 46 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) .build/htmlhelp 47 | @echo 48 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 49 | ".hhp project file in .build/htmlhelp." 50 | 51 | latex: 52 | mkdir -p .build/latex .build/doctrees 53 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) .build/latex 54 | @echo 55 | @echo "Build finished; the LaTeX files are in .build/latex." 56 | @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ 57 | "run these through (pdf)latex." 58 | 59 | changes: 60 | mkdir -p .build/changes .build/doctrees 61 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) .build/changes 62 | @echo 63 | @echo "The overview file is in .build/changes." 64 | 65 | linkcheck: 66 | mkdir -p .build/linkcheck .build/doctrees 67 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) .build/linkcheck 68 | @echo 69 | @echo "Link check complete; look for any errors in the above output " \ 70 | "or in .build/linkcheck/output.txt." 71 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | django-tinymce 2 | ============== 3 | 4 | **django-tinymce** is a Django application that contains a widget to render a form field as a TinyMCE editor. 5 | 6 | It supports Python 3.9+ and Django 4.2 to 5.2. Using TinyMCE 7.8.0. 7 | 8 | .. image:: https://jazzband.co/static/img/badge.svg 9 | :target: https://jazzband.co/ 10 | :alt: Jazzband 11 | 12 | .. image:: https://img.shields.io/pypi/v/django-tinymce.svg 13 | :target: https://pypi.python.org/pypi/django-tinymce 14 | 15 | .. image:: https://img.shields.io/pypi/pyversions/django-tinymce.svg 16 | :target: https://pypi.python.org/pypi/django-tinymce 17 | 18 | .. image:: https://img.shields.io/pypi/djversions/django-tinymce.svg 19 | :target: https://pypi.org/project/django-tinymce/ 20 | 21 | .. image:: https://img.shields.io/pypi/dm/django-tinymce.svg 22 | :target: https://pypi.python.org/pypi/django-tinymce 23 | 24 | .. image:: https://github.com/jazzband/django-tinymce/workflows/Test/badge.svg 25 | :target: https://github.com/jazzband/django-tinymce/actions 26 | :alt: GitHub Actions 27 | 28 | .. image:: https://codecov.io/gh/jazzband/django-tinymce/branch/master/graph/badge.svg 29 | :target: https://codecov.io/gh/jazzband/django-tinymce 30 | :alt: Code coverage 31 | 32 | 33 | Quickstart 34 | ========== 35 | 36 | Install django-tinymce: 37 | 38 | .. code-block:: bash 39 | 40 | $ pip install django-tinymce 41 | 42 | Add tinymce to INSTALLED_APPS in settings.py for your project: 43 | 44 | .. code-block:: python 45 | 46 | INSTALLED_APPS = ( 47 | ... 48 | 'tinymce', 49 | ) 50 | 51 | Add tinymce.urls to urls.py for your project: 52 | 53 | .. code-block:: python 54 | 55 | urlpatterns = [ 56 | ... 57 | path('tinymce/', include('tinymce.urls')), 58 | ] 59 | 60 | In your code: 61 | 62 | .. code-block:: python 63 | 64 | from django.db import models 65 | from tinymce.models import HTMLField 66 | 67 | class MyModel(models.Model): 68 | ... 69 | content = HTMLField() 70 | 71 | **django-tinymce** uses staticfiles so everything should work as expected, different use cases (like using widget instead of HTMLField) and other stuff is available in documentation. 72 | 73 | Documentation 74 | ============= 75 | 76 | https://django-tinymce.readthedocs.org/ 77 | 78 | Support and updates 79 | =================== 80 | 81 | Use github issues https://github.com/jazzband/django-tinymce/issues 82 | 83 | License 84 | ======= 85 | 86 | Originally written by Joost Cassee. 87 | 88 | This program is licensed under the MIT License (see LICENSE.txt) 89 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/anchor/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>e.options.get("allow_html_in_named_anchor");const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),d=(e,a)=>{const r=s(e);r?((e,t,o)=>{o.removeAttribute("name"),o.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact((()=>{n(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const n=e.dom;t(n).walk(e.selection.getRng(),(e=>{o.each(e,(e=>{var t;l(t=e)&&!t.firstChild&&n.remove(e,!1)}))}))})(e),e.formatter.remove("namedAnchor",void 0,void 0,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())}))})(e,a),e.focus()},c=e=>(e=>r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let o=0;ot=>{const o=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",o),o(),()=>{e.off("NodeChange",o)}};e.add("anchor",(e=>{(e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))}))})(e),(e=>{e.addCommand("mceAnchor",(()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(d(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)}))})(e),(e=>{const t=()=>e.execCommand("mceAnchor");e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:t,onSetup:t=>{const o=e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind,n=u(e)(t);return()=>{o(),n()}}}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:t,onSetup:u(e)})})(e),e.on("PreInit",(()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,o)=>l(e)})})(e)}))}))}(); -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "django-tinymce" 7 | version = "5.0.0" 8 | description = """ 9 | A Django application that contains a widget to render a 10 | form field as a TinyMCE editor.""" 11 | readme = "README.rst" 12 | authors = [ 13 | {name = "Aljosa Mohorovic", email = "aljosa.mohorovic@gmail.com"}, 14 | ] 15 | maintainers = [ 16 | {name = "Rémy Hubscher", email = "hubscher.remy@gmail.com"}, 17 | {name = "Claude Paroz", email = "claude@2xlibre.net"}, 18 | ] 19 | license = "MIT AND GPL-2.0-or-later" 20 | license-files = [ 21 | "LICENSE.txt", 22 | "tinymce/static/tinymce/license.md", 23 | ] 24 | requires-python = ">=3.9" 25 | dependencies = [ 26 | "django>=4.2", 27 | ] 28 | keywords = ["django", "widget", "tinymce"] 29 | classifiers = [ 30 | "Development Status :: 5 - Production/Stable", 31 | "Environment :: Web Environment", 32 | "Framework :: Django", 33 | "Framework :: Django :: 4.2", 34 | "Framework :: Django :: 5.0", 35 | "Framework :: Django :: 5.1", 36 | "Framework :: Django :: 5.2", 37 | "Intended Audience :: Developers", 38 | "Operating System :: OS Independent", 39 | "Programming Language :: Python", 40 | "Programming Language :: Python :: 3", 41 | "Programming Language :: Python :: 3.9", 42 | "Programming Language :: Python :: 3.10", 43 | "Programming Language :: Python :: 3.11", 44 | "Programming Language :: Python :: 3.12", 45 | "Programming Language :: Python :: 3.13", 46 | "Topic :: Software Development :: Libraries :: Application Frameworks", 47 | "Topic :: Software Development :: Libraries :: Python Modules", 48 | ] 49 | 50 | [project.urls] 51 | Homepage = "https://github.com/jazzband/django-tinymce" 52 | Documentation = "https://django-tinymce.readthedocs.org/" 53 | Changelog = "https://github.com/jazzband/django-tinymce/blob/master/CHANGELOG.rst" 54 | 55 | [tool.black] 56 | line-length = 99 57 | skip-numeric-underscore-normalization = true 58 | target-version = ['py38'] 59 | include = '\.pyi?$' 60 | exclude = ''' 61 | /( 62 | \.git 63 | | tmp 64 | | conf 65 | | website/documentation 66 | | pos/frontend 67 | )/ 68 | ''' 69 | 70 | [tool.isort] 71 | force_grid_wrap = 0 72 | include_trailing_comma = true 73 | known_first_party = 'lib,model,presenters' 74 | known_third_party = ["django"] 75 | line_length = 99 76 | multi_line_output = 3 77 | skip_glob = '' 78 | use_parentheses = true 79 | combine_as_imports = true 80 | 81 | # If set, imports will be sorted within their section independent to the import_type. 82 | force_sort_within_sections = true 83 | 84 | [tool.coverage.run] 85 | source = ["tinymce"] 86 | branch = true 87 | -------------------------------------------------------------------------------- /tests/test_compressor.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import patch 2 | import zlib 3 | 4 | from django.test import RequestFactory, SimpleTestCase 5 | 6 | from tinymce.compressor import gzip_compressor 7 | 8 | 9 | class TestCompressor(SimpleTestCase): 10 | def setUp(self): 11 | self.factory = RequestFactory() 12 | 13 | def test_not_js(self): 14 | request = self.factory.get("/tinymce/compressor/") 15 | response = gzip_compressor(request) 16 | 17 | self.assertEqual(200, response.status_code) 18 | self.assertEqual("text/javascript", response["Content-Type"]) 19 | self.assertContains(response, "tinyMCE_GZ") 20 | 21 | @patch("tinymce.compressor.cache.get") 22 | def test_cache_data_etag(self, cache_mock): 23 | cache_mock.return_value = { 24 | "ETag": "test", 25 | } 26 | request = self.factory.get("/tinymce/compressor/", {"js": "true"}) 27 | request.META["HTTP_IF_NONE_MATCH"] = "test" 28 | response = gzip_compressor(request) 29 | 30 | self.assertEqual(304, response.status_code) 31 | self.assertEqual("0", response["Content-Length"]) 32 | self.assertEqual("text/javascript", response["Content-Type"]) 33 | self.assertEqual(b"", response.content) 34 | cache_mock.assert_called_once() 35 | 36 | @patch("tinymce.compressor.cache.get") 37 | def test_cache_data_last_modified(self, cache_mock): 38 | cache_mock.return_value = { 39 | "Last-Modified": "test", 40 | } 41 | request = self.factory.get("/tinymce/compressor/", {"js": "true"}) 42 | request.META["HTTP_IF_MODIFIED_SINCE"] = "test" 43 | response = gzip_compressor(request) 44 | 45 | self.assertEqual(304, response.status_code) 46 | self.assertEqual("0", response["Content-Length"]) 47 | self.assertEqual("text/javascript", response["Content-Type"]) 48 | self.assertEqual(b"", response.content) 49 | cache_mock.assert_called_once() 50 | 51 | def test_compressor(self): 52 | request = self.factory.get( 53 | "/tinymce/compressor/", 54 | { 55 | "js": "true", 56 | "compress": "true", 57 | "languages": "en", 58 | "plugins": "codesample", 59 | "themes": "silver", 60 | }, 61 | ) 62 | response = gzip_compressor(request) 63 | response_string = zlib.decompress(response.content, 16 + zlib.MAX_WBITS) 64 | self.assertEqual(200, response.status_code) 65 | self.assertEqual("text/javascript", response["Content-Type"]) 66 | self.assertEqual("gzip", response["Content-Encoding"]) 67 | self.assertIn(b"var tinyMCEPreInit", response_string) 68 | -------------------------------------------------------------------------------- /tests/settings.py: -------------------------------------------------------------------------------- 1 | from os.path import dirname, join, realpath 2 | 3 | ROOT_PATH = dirname(realpath(__file__)) 4 | DEBUG = True 5 | 6 | DATABASES = { 7 | "default": { 8 | "ENGINE": "django.db.backends.sqlite3", 9 | "NAME": join(ROOT_PATH, "tests.sqlite"), 10 | "USER": "", 11 | "PASSWORD": "", 12 | "HOST": "", 13 | "PORT": "", 14 | } 15 | } 16 | 17 | TIME_ZONE = "America/Chicago" 18 | LANGUAGE_CODE = "en-us" 19 | SITE_ID = 1 20 | USE_I18N = True 21 | USE_L10N = True 22 | 23 | MEDIA_ROOT = join(ROOT_PATH, "media") 24 | MEDIA_URL = "/media/" 25 | ADMIN_MEDIA_PREFIX = "/static/admin/" 26 | 27 | STATICFINDERS = [ 28 | "django.contrib.staticfiles.finders.FileSystemFinder", 29 | "django.contrib.staticfiles.finders.AppDirectoriesFinder", 30 | ] 31 | 32 | STATIC_URL = "/static/" 33 | 34 | MIDDLEWARE = [ 35 | "django.contrib.sessions.middleware.SessionMiddleware", 36 | "django.middleware.common.CommonMiddleware", 37 | "django.middleware.csrf.CsrfViewMiddleware", 38 | "django.contrib.auth.middleware.AuthenticationMiddleware", 39 | "django.contrib.messages.middleware.MessageMiddleware", 40 | "django.middleware.clickjacking.XFrameOptionsMiddleware", 41 | ] 42 | MIDDLEWARE_CLASSES = MIDDLEWARE 43 | 44 | TEMPLATES = [ 45 | { 46 | "BACKEND": "django.template.backends.django.DjangoTemplates", 47 | "APP_DIRS": True, 48 | "OPTIONS": { 49 | "context_processors": [ 50 | "django.template.context_processors.request", 51 | "django.contrib.auth.context_processors.auth", 52 | "django.contrib.messages.context_processors.messages", 53 | ] 54 | }, 55 | }, 56 | ] 57 | 58 | SECRET_KEY = "w4o4x^&b4h4zne9&3b1m-_p-=+&n_i_sdf@oz=gd+6h6v1$sd9" 59 | 60 | ROOT_URLCONF = "tests.urls" 61 | 62 | INSTALLED_APPS = ( 63 | "django.contrib.auth", 64 | "django.contrib.contenttypes", 65 | "django.contrib.sessions", 66 | "django.contrib.sites", 67 | "django.contrib.messages", 68 | "django.contrib.staticfiles", 69 | "django.contrib.admin", 70 | "django.contrib.flatpages", 71 | "tinymce", 72 | "tests.testapp", 73 | ) 74 | 75 | TINYMCE_SPELLCHECKER = True 76 | TINYMCE_COMPRESSOR = True 77 | TINYMCE_DEFAULT_CONFIG = { 78 | "theme": "silver", 79 | "height": 500, 80 | "menubar": False, 81 | "plugins": "advlist,autolink,lists,link,image,charmap,preview,anchor," 82 | "searchreplace,visualblocks,code,fullscreen,insertdatetime,media,table," 83 | "code,help,wordcount", 84 | "toolbar": "undo redo | blocks | " 85 | "bold italic backcolor | alignleft aligncenter " 86 | "alignright alignjustify | bullist numlist outdent indent | " 87 | "removeformat | code | help", 88 | } 89 | 90 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" 91 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/insertdatetime/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),a=t("insertdatetime_dateformat"),n=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",c(a.getMonth()+1,2))).replace("%d",c(a.getDate(),2))).replace("%H",""+c(a.getHours(),2))).replace("%M",""+c(a.getMinutes(),2))).replace("%S",""+c(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[a.getMonth()]))).replace("%b",""+e.translate(l[a.getMonth()]))).replace("%A",""+e.translate(o[a.getDay()]))).replace("%a",""+e.translate(i[a.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)&&e.selection.isEditable()){const a=d(e,t);let n;n=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,a,n)=>{const r=e.dom.create("time",{datetime:a},n);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,n,a):e.insertContent('")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,n)=>{u(e,null!=n?n:a(e))})),e.addCommand("mceInsertTime",((t,a)=>{u(e,null!=a?a:n(e))}))})(e),(e=>{const t=r(e),a=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:n(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:e=>e===a.get(),fetch:a=>{a(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(a.get())},onItemAction:(e,t)=>{a.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{a.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)}))),onSetup:g(e)})})(e)}))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/zh_CN.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_CN', 2 | '

开始键盘导航

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
使菜单栏处于焦点
\n' + 6 | '
Windows 或 Linux:Alt+F9
\n' + 7 | '
macOS:⌥F9
\n' + 8 | '
使工具栏处于焦点
\n' + 9 | '
Windows 或 Linux:Alt+F10
\n' + 10 | '
macOS:⌥F10
\n' + 11 | '
使页脚处于焦点
\n' + 12 | '
Windows 或 Linux:Alt+F11
\n' + 13 | '
macOS:⌥F11
\n' + 14 | '
使通知处于焦点
\n' + 15 | '
Windows 或 Linux:Alt+F12
\n' + 16 | '
macOS:⌥F12
\n' + 17 | '
使上下文工具栏处于焦点
\n' + 18 | '
Windows、Linux 或 macOS:Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

导航将在第一个 UI 项上开始,其中突出显示该项,或者对于页脚元素路径中的第一项,将为其添加下划线。

\n' + 22 | '\n' + 23 | '

在 UI 部分之间导航

\n' + 24 | '\n' + 25 | '

要从一个 UI 部分移至下一个,请按 Tab

\n' + 26 | '\n' + 27 | '

要从一个 UI 部分移至上一个,请按 Shift+Tab

\n' + 28 | '\n' + 29 | '

这些 UI 部分的 Tab 顺序为:

\n' + 30 | '\n' + 31 | '
    \n' + 32 | '
  1. 菜单栏
  2. \n' + 33 | '
  3. 每个工具栏组
  4. \n' + 34 | '
  5. 边栏
  6. \n' + 35 | '
  7. 页脚中的元素路径
  8. \n' + 36 | '
  9. 页脚中的字数切换按钮
  10. \n' + 37 | '
  11. 页脚中的品牌链接
  12. \n' + 38 | '
  13. 页脚中的编辑器调整大小图柄
  14. \n' + 39 | '
\n' + 40 | '\n' + 41 | '

如果不存在某个 UI 部分,则跳过它。

\n' + 42 | '\n' + 43 | '

如果键盘导航焦点在页脚,并且没有可见的边栏,则按 Shift+Tab 将焦点移至第一个工具栏组而非最后一个。

\n' + 44 | '\n' + 45 | '

在 UI 部分内导航

\n' + 46 | '\n' + 47 | '

要从一个 UI 元素移至下一个,请按相应的箭头键。

\n' + 48 | '\n' + 49 | '

箭头键

\n' + 50 | '\n' + 51 | '
    \n' + 52 | '
  • 在菜单栏中的菜单之间移动。
  • \n' + 53 | '
  • 打开菜单中的子菜单。
  • \n' + 54 | '
  • 在工具栏组中的按钮之间移动。
  • \n' + 55 | '
  • 在页脚的元素路径中的各项之间移动。
  • \n' + 56 | '
\n' + 57 | '\n' + 58 | '

箭头键

\n' + 59 | '\n' + 60 | '
    \n' + 61 | '
  • 在菜单中的菜单项之间移动。
  • \n' + 62 | '
  • 在工具栏弹出菜单中的各项之间移动。
  • \n' + 63 | '
\n' + 64 | '\n' + 65 | '

箭头键在具有焦点的 UI 部分内循环。

\n' + 66 | '\n' + 67 | '

要关闭打开的菜单、打开的子菜单或打开的弹出菜单,请按 Esc 键。

\n' + 68 | '\n' + 69 | '

如果当前的焦点在特定 UI 部分的“顶部”,则按 Esc 键还将完全退出键盘导航。

\n' + 70 | '\n' + 71 | '

执行菜单项或工具栏按钮

\n' + 72 | '\n' + 73 | '

当突出显示所需的菜单项或工具栏按钮时,按 ReturnEnter空格以执行该项。

\n' + 74 | '\n' + 75 | '

在非标签页式对话框中导航

\n' + 76 | '\n' + 77 | '

在非标签页式对话框中,当对话框打开时,第一个交互组件获得焦点。

\n' + 78 | '\n' + 79 | '

通过按 TabShift+Tab,在交互对话框组件之间导航。

\n' + 80 | '\n' + 81 | '

在标签页式对话框中导航

\n' + 82 | '\n' + 83 | '

在标签页式对话框中,当对话框打开时,标签页菜单中的第一个按钮获得焦点。

\n' + 84 | '\n' + 85 | '

通过按 TabShift+Tab,在此对话框的交互组件之间导航。

\n' + 86 | '\n' + 87 | '

通过将焦点移至另一对话框标签页的菜单,然后按相应的箭头键以在可用的标签页间循环,从而切换到该对话框标签页。

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/zh_TW.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_TW', 2 | '

開始鍵盤瀏覽

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
跳至功能表列
\n' + 6 | '
Windows 或 Linux:Alt+F9
\n' + 7 | '
macOS:⌥F9
\n' + 8 | '
跳至工具列
\n' + 9 | '
Windows 或 Linux:Alt+F10
\n' + 10 | '
macOS:⌥F10
\n' + 11 | '
跳至頁尾
\n' + 12 | '
Windows 或 Linux:Alt+F11
\n' + 13 | '
macOS:⌥F11
\n' + 14 | '
跳至通知
\n' + 15 | '
Windows 或 Linux:Alt+F12
\n' + 16 | '
macOS:⌥F12
\n' + 17 | '
跳至關聯式工具列
\n' + 18 | '
Windows、Linux 或 macOS:Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

瀏覽會從第一個 UI 項目開始,該項目會反白顯示,但如果是「頁尾」元素路徑的第一項,\n' + 22 | ' 則加底線。

\n' + 23 | '\n' + 24 | '

在 UI 區段之間瀏覽

\n' + 25 | '\n' + 26 | '

從 UI 區段移至下一個,請按 Tab

\n' + 27 | '\n' + 28 | '

從 UI 區段移回上一個,請按 Shift+Tab

\n' + 29 | '\n' + 30 | '

這些 UI 區段的 Tab 順序如下:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. 功能表列
  2. \n' + 34 | '
  3. 各個工具列群組
  4. \n' + 35 | '
  5. 側邊欄
  6. \n' + 36 | '
  7. 頁尾中的元素路徑
  8. \n' + 37 | '
  9. 頁尾中字數切換按鈕
  10. \n' + 38 | '
  11. 頁尾中的品牌連結
  12. \n' + 39 | '
  13. 頁尾中編輯器調整大小控點
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

如果 UI 區段未顯示,表示已略過該區段。

\n' + 43 | '\n' + 44 | '

如果鍵盤瀏覽跳至頁尾,但沒有顯示側邊欄,則按下 Shift+Tab\n' + 45 | ' 會跳至第一個工具列群組,而不是最後一個。

\n' + 46 | '\n' + 47 | '

在 UI 區段之內瀏覽

\n' + 48 | '\n' + 49 | '

在兩個 UI 元素之間移動,請按適當的方向鍵。

\n' + 50 | '\n' + 51 | '

向左向右方向鍵

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • 在功能表列中的功能表之間移動。
  • \n' + 55 | '
  • 開啟功能表中的子功能表。
  • \n' + 56 | '
  • 在工具列群組中的按鈕之間移動。
  • \n' + 57 | '
  • 在頁尾的元素路徑中項目之間移動。
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

向下向上方向鍵

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • 在功能表中的功能表項目之間移動。
  • \n' + 64 | '
  • 在工具列快顯功能表中的項目之間移動。
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

方向鍵會在所跳至 UI 區段之內循環。

\n' + 68 | '\n' + 69 | '

若要關閉已開啟的功能表、已開啟的子功能表,或已開啟的快顯功能表,請按 Esc 鍵。

\n' + 70 | '\n' + 71 | '

如果目前已跳至特定 UI 區段的「頂端」,則按 Esc 鍵也會結束\n' + 72 | ' 整個鍵盤瀏覽。

\n' + 73 | '\n' + 74 | '

執行功能表列項目或工具列按鈕

\n' + 75 | '\n' + 76 | '

當想要的功能表項目或工具列按鈕已反白顯示時,按 ReturnEnter、\n' + 77 | ' 或空白鍵即可執行該項目。

\n' + 78 | '\n' + 79 | '

瀏覽非索引標籤式對話方塊

\n' + 80 | '\n' + 81 | '

在非索引標籤式對話方塊中,開啟對話方塊時會跳至第一個互動元件。

\n' + 82 | '\n' + 83 | '

TabShift+Tab 即可在互動式對話方塊元件之間瀏覽。

\n' + 84 | '\n' + 85 | '

瀏覽索引標籤式對話方塊

\n' + 86 | '\n' + 87 | '

在索引標籤式對話方塊中,開啟對話方塊時會跳至索引標籤式功能表中的第一個按鈕。

\n' + 88 | '\n' + 89 | '

若要在此對話方塊的互動式元件之間瀏覽,請按 Tab 或\n' + 90 | ' Shift+Tab

\n' + 91 | '\n' + 92 | '

先跳至索引標籤式功能表,然後按適當的方向鍵,即可切換至另一個對話方塊索引標籤,\n' + 93 | ' 以循環瀏覽可用的索引標籤。

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/autolink/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),n=t("autolink_pattern"),o=t("link_default_target"),r=t("link_default_protocol"),a=t("allow_unsafe_link_target"),s=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(a=o.constructor)||void 0===a?void 0:a.name)===r.name)?"string":t;var n,o,r,a})(e);const l=e=>undefined===e;const i=e=>!(e=>null==e)(e),c=Object.hasOwnProperty,d=e=>"\ufeff"===e;var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>/^[(\[{ \u00a0]$/.test(e),g=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!d(t)&&n(t))return o}return-1},m=(e,t)=>{var o;const a=e.schema.getVoidElements(),s=n(e),{dom:i,selection:d}=e;if(null!==i.getParent(d.getNode(),"a[href]")||e.mode.isReadOnly())return null;const m=d.getRng(),k=u(i,(e=>{return i.isBlock(e)||(t=a,n=e.nodeName.toLowerCase(),c.call(t,n))||"false"===i.getContentEditable(e);var t,n})),{container:p,offset:y}=((e,t)=>{let n=e,o=t;for(;1===n.nodeType&&n.childNodes[o];)n=n.childNodes[o],o=3===n.nodeType?n.data.length:n.childNodes.length;return{container:n,offset:o}})(m.endContainer,m.endOffset),w=null!==(o=i.getParent(p,i.isBlock))&&void 0!==o?o:i.getRoot(),h=k.backwards(p,y+t,((e,t)=>{const n=e.data,o=g(n,t,(r=f,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1}),w);if(!h)return null;let v=h.container;const _=k.backwards(h.container,h.offset,((e,t)=>{v=e;const n=g(e.data,t,f);return-1===n?n:n+1}),w),A=i.createRng();_?A.setStart(_.container,_.offset):A.setStart(v,0),A.setEnd(h.container,h.offset);const C=A.toString().replace(/\uFEFF/g,"").match(s);if(C){let t=C[0];return $="www.",(b=t).length>=4&&b.substr(0,4)===$?t=r(e)+"://"+t:((e,t,n=0,o)=>{const r=e.indexOf(t,n);return-1!==r&&(!!l(o)||r+t.length<=o)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:A,url:t}}var b,$;return null},k=(e,t)=>{const{dom:n,selection:r}=e,{rng:l,url:i}=t,c=r.getBookmark();r.setRng(l);const d="createlink",u={command:d,ui:!1,value:i};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(d,!1,i),e.dispatch("ExecCommand",u);const t=o(e);if(s(t)){const o=r.getNode();n.setAttrib(o,"target",t),"_blank"!==t||a(e)||n.setAttrib(o,"rel","noopener")}}r.moveToBookmark(c),e.nodeChanged()},p=e=>{const t=m(e,-1);i(t)&&k(e,t)},y=p;e.add("autolink",(e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",(t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=m(e,0);i(t)&&k(e,t)})(e)})),e.on("keyup",(t=>{32===t.keyCode?p(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&y(e)}))})(e)}))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/autosave/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":e;var r,o,a,s})(t);const r=t=>undefined===t;var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),l=i("autosave_restore_when_empty"),c=i("autosave_interval"),d=i("autosave_retention"),m=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},v=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},f=t=>{var e;const r=parseInt(null!==(e=a.getItem(m(t)+"time"))&&void 0!==e?e:"0",10)||0;return!((new Date).getTime()-r>d(t)&&(p(t,!1),1))},p=(t,e)=>{const r=m(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},y=t=>{const e=m(t);!v(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},g=t=>{var e;const r=m(t);f(t)&&(t.setContent(null!==(e=a.getItem(r+"draft"))&&void 0!==e?e:"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{const r=()=>f(t)&&!t.mode.isReadOnly();e.setEnabled(r());const o=()=>e.setEnabled(r());return t.on("StoreDraft RestoreDraft RemoveDraft",o),()=>t.off("StoreDraft RestoreDraft RemoveDraft",o)};t.add("autosave",(t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",(t=>{let e;s.each(D.get(),(t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))})),e&&(t.preventDefault(),t.returnValue=e)}))})(t),(t=>{(t=>{const e=c(t);o.setEditorInterval(t,(()=>{y(t)}),e)})(t);const e=()=>{(t=>{t.undoManager.transact((()=>{g(t),p(t)})),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",(()=>{l(t)&&t.dom.isEmpty(t.getBody())&&g(t)})),(t=>({hasDraft:()=>f(t),storeDraft:()=>y(t),restoreDraft:()=>g(t),removeDraft:e=>p(t,e),isEmpty:e=>v(t,e)}))(t))))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/ja.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.ja', 2 | '

キーボード ナビゲーションの開始

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
メニュー バーをフォーカス
\n' + 6 | '
Windows または Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
ツール バーをフォーカス
\n' + 9 | '
Windows または Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
フッターをフォーカス
\n' + 12 | '
Windows または Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
通知にフォーカス
\n' + 15 | '
Windows または Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
コンテキスト ツール バーをフォーカス
\n' + 18 | '
Windows、Linux または macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

ナビゲーションは最初の UI 項目から開始され、強調表示されるか、フッターの要素パスにある最初の項目の場合は\n' + 22 | ' 下線が引かれます。

\n' + 23 | '\n' + 24 | '

UI セクション間の移動

\n' + 25 | '\n' + 26 | '

次の UI セクションに移動するには、Tab を押します。

\n' + 27 | '\n' + 28 | '

前の UI セクションに移動するには、Shift+Tab を押します。

\n' + 29 | '\n' + 30 | '

これらの UI セクションの Tab の順序:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. メニュー バー
  2. \n' + 34 | '
  3. 各ツール バー グループ
  4. \n' + 35 | '
  5. サイド バー
  6. \n' + 36 | '
  7. フッターの要素パス
  8. \n' + 37 | '
  9. フッターの単語数切り替えボタン
  10. \n' + 38 | '
  11. フッターのブランド リンク
  12. \n' + 39 | '
  13. フッターのエディター サイズ変更ハンドル
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

UI セクションが存在しない場合は、スキップされます。

\n' + 43 | '\n' + 44 | '

フッターにキーボード ナビゲーション フォーカスがあり、表示可能なサイド バーがない場合、Shift+Tab を押すと、\n' + 45 | ' フォーカスが最後ではなく最初のツール バー グループに移動します。

\n' + 46 | '\n' + 47 | '

UI セクション内の移動

\n' + 48 | '\n' + 49 | '

次の UI 要素に移動するには、適切な矢印キーを押します。

\n' + 50 | '\n' + 51 | '

左矢印右矢印のキー

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • メニュー バーのメニュー間で移動します。
  • \n' + 55 | '
  • メニュー内のサブメニューを開きます。
  • \n' + 56 | '
  • ツール バー グループのボタン間で移動します。
  • \n' + 57 | '
  • フッターの要素パスの項目間で移動します。
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

下矢印上矢印のキー

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • メニュー内のメニュー項目間で移動します。
  • \n' + 64 | '
  • ツール バー ポップアップ メニュー内のメニュー項目間で移動します。
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

矢印キーで、フォーカスされた UI セクション内で循環します。

\n' + 68 | '\n' + 69 | '

開いたメニュー、開いたサブメニュー、開いたポップアップ メニューを閉じるには、Esc キーを押します。

\n' + 70 | '\n' + 71 | '

現在のフォーカスが特定の UI セクションの「一番上」にある場合、Esc キーを押すと\n' + 72 | ' キーボード ナビゲーションも完全に閉じられます。

\n' + 73 | '\n' + 74 | '

メニュー項目またはツール バー ボタンの実行

\n' + 75 | '\n' + 76 | '

目的のメニュー項目やツール バー ボタンが強調表示されている場合、リターンEnter、\n' + 77 | ' またはスペース キーを押して項目を実行します。

\n' + 78 | '\n' + 79 | '

タブのないダイアログの移動

\n' + 80 | '\n' + 81 | '

タブのないダイアログでは、ダイアログが開くと最初の対話型コンポーネントがフォーカスされます。

\n' + 82 | '\n' + 83 | '

Tab または Shift+Tab を押して、対話型ダイアログ コンポーネント間で移動します。

\n' + 84 | '\n' + 85 | '

タブ付きダイアログの移動

\n' + 86 | '\n' + 87 | '

タブ付きダイアログでは、ダイアログが開くとタブ メニューの最初のボタンがフォーカスされます。

\n' + 88 | '\n' + 89 | '

Tab または\n' + 90 | ' Shift+Tab を押して、このダイアログ タブの対話型コンポーネント間で移動します。

\n' + 91 | '\n' + 92 | '

タブ メニューをフォーカスしてから適切な矢印キーを押して表示可能なタブを循環して、\n' + 93 | ' 別のダイアログに切り替えます。

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/ko_KR.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.ko_KR', 2 | '

키보드 탐색 시작

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
메뉴 모음 포커스 표시
\n' + 6 | '
Windows 또는 Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
도구 모음 포커스 표시
\n' + 9 | '
Windows 또는 Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
푸터 포커스 표시
\n' + 12 | '
Windows 또는 Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
알림 포커스
\n' + 15 | '
Windows 또는 Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
컨텍스트 도구 모음에 포커스 표시
\n' + 18 | '
Windows, Linux 또는 macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

첫 번째 UI 항목에서 탐색이 시작되며, 이때 첫 번째 항목이 강조 표시되거나 푸터 요소 경로에 있는\n' + 22 | ' 경우 밑줄 표시됩니다.

\n' + 23 | '\n' + 24 | '

UI 섹션 간 탐색

\n' + 25 | '\n' + 26 | '

한 UI 섹션에서 다음 UI 섹션으로 이동하려면 Tab(탭)을 누릅니다.

\n' + 27 | '\n' + 28 | '

한 UI 섹션에서 이전 UI 섹션으로 돌아가려면 Shift+Tab(시프트+탭)을 누릅니다.

\n' + 29 | '\n' + 30 | '

이 UI 섹션의 Tab(탭) 순서는 다음과 같습니다.

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. 메뉴 바
  2. \n' + 34 | '
  3. 각 도구 모음 그룹
  4. \n' + 35 | '
  5. 사이드바
  6. \n' + 36 | '
  7. 푸터의 요소 경로
  8. \n' + 37 | '
  9. 푸터의 단어 수 토글 버튼
  10. \n' + 38 | '
  11. 푸터의 브랜딩 링크
  12. \n' + 39 | '
  13. 푸터의 에디터 크기 변경 핸들
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

UI 섹션이 없는 경우 건너뛰기합니다.

\n' + 43 | '\n' + 44 | '

푸터에 키보드 탐색 포커스가 있고 사이드바는 보이지 않는 경우 Shift+Tab(시프트+탭)을 누르면\n' + 45 | ' 포커스 표시가 마지막이 아닌 첫 번째 도구 모음 그룹으로 이동합니다.

\n' + 46 | '\n' + 47 | '

UI 섹션 내 탐색

\n' + 48 | '\n' + 49 | '

한 UI 요소에서 다음 UI 요소로 이동하려면 적절한 화살표 키를 누릅니다.

\n' + 50 | '\n' + 51 | '

왼쪽오른쪽 화살표 키의 용도:

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • 메뉴 모음에서 메뉴 항목 사이를 이동합니다.
  • \n' + 55 | '
  • 메뉴에서 하위 메뉴를 엽니다.
  • \n' + 56 | '
  • 도구 모음 그룹에서 버튼 사이를 이동합니다.
  • \n' + 57 | '
  • 푸터의 요소 경로에서 항목 간에 이동합니다.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

아래 화살표 키의 용도:

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • 메뉴에서 메뉴 항목 사이를 이동합니다.
  • \n' + 64 | '
  • 도구 모음 팝업 메뉴에서 메뉴 항목 사이를 이동합니다.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

화살표 키는 포커스 표시 UI 섹션 내에서 순환됩니다.

\n' + 68 | '\n' + 69 | '

열려 있는 메뉴, 열려 있는 하위 메뉴 또는 열려 있는 팝업 메뉴를 닫으려면 Esc 키를 누릅니다.

\n' + 70 | '\n' + 71 | "

현재 포커스 표시가 특정 UI 섹션 '상단'에 있는 경우 이때도 Esc 키를 누르면\n" + 72 | ' 키보드 탐색이 완전히 종료됩니다.

\n' + 73 | '\n' + 74 | '

메뉴 항목 또는 도구 모음 버튼 실행

\n' + 75 | '\n' + 76 | '

원하는 메뉴 항목 또는 도구 모음 버튼이 강조 표시되어 있을 때 Return(리턴), Enter(엔터),\n' + 77 | ' 또는 Space bar(스페이스바)를 눌러 해당 항목을 실행합니다.

\n' + 78 | '\n' + 79 | '

탭이 없는 대화 탐색

\n' + 80 | '\n' + 81 | '

탭이 없는 대화의 경우, 첫 번째 대화형 요소가 포커스 표시된 상태로 대화가 열립니다.

\n' + 82 | '\n' + 83 | '

대화형 요소들 사이를 이동할 때는 Tab(탭) 또는 Shift+Tab(시프트+탭)을 누릅니다.

\n' + 84 | '\n' + 85 | '

탭이 있는 대화 탐색

\n' + 86 | '\n' + 87 | '

탭이 있는 대화의 경우, 탭 메뉴에서 첫 번째 버튼이 포커스 표시된 상태로 대화가 열립니다.

\n' + 88 | '\n' + 89 | '

이 대화 탭의 대화형 요소들 사이를 이동할 때는 Tab(탭) 또는\n' + 90 | ' Shift+Tab(시프트+탭)을 누릅니다.

\n' + 91 | '\n' + 92 | '

다른 대화 탭으로 이동하려면 탭 메뉴를 포커스 표시한 다음 적절한 화살표\n' + 93 | ' 키를 눌러 사용 가능한 탭들을 지나 원하는 탭으로 이동합니다.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/importcss/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=e=>"function"==typeof e;var c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),i=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=e=>t=>t.options.get(e),u=p("importcss_merge_classes"),m=p("importcss_exclusive"),f=p("importcss_selector_converter"),y=p("importcss_selector_filter"),d=p("importcss_groups"),h=p("importcss_append"),g=p("importcss_file_filter"),_=p("skin"),v=p("skin_url"),b=Array.prototype.push,x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=a.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),u(e)?s.classes=n:s.attributes={class:n},s},k=(e,t)=>null===t||m(e),M=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;oa.map(e,(e=>a.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(d(e)),u=(t,s)=>{if(((e,t,s,r)=>!(k(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{k(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=f(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>S(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||c.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};a.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let p,u=t.href;if(u=(e=>{const t=l.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=_(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/",c=e.editorManager.suffix;return t===o+"/content"+(e.inline?".inline":"")+`${c}.css`||-1!==t.indexOf(n)}return!1})(e,u)){a.each(t.imports,(e=>{c(e,!0)}));try{p=t.cssRules||t.rules}catch(e){}a.each(p,(e=>{e.styleSheet&&e.styleSheet?c(e.styleSheet,!0):e.selectorText&&a.each(e.selectorText.split(","),(e=>{o.push(a.trim(e))}))}))}};a.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{a.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(g(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>a.grep(e,(e=>!e.filter||e.filter(t))))(p,e);if(s.length>0)a.each(s,(s=>{const r=u(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=u(e,null);s&&t.addItem(s)}}}));const m=t.toFormats();e.dispatch("addStyleModifications",{items:m,replace:!h(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),M(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}(); -------------------------------------------------------------------------------- /tinymce/templates/tinymce/tiny_mce_gzip.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Based on "TinyMCE Compressor PHP v2.0.4" from MoxieCode. 3 | * 4 | * https://tinymce.moxiecode.com/ 5 | * 6 | * Copyright (c) 2012 Jason Davies 7 | * Licensed under the terms of the MIT License (see LICENSE.txt) 8 | */ 9 | var tinyMCE_GZ = { 10 | settings : { 11 | themes : '', 12 | plugins : '', 13 | languages : '', 14 | disk_cache : true, 15 | page_name : '{% url "tinymce-compressor" %}', 16 | debug : false, 17 | suffix : '' 18 | }, 19 | 20 | init : function(s, cb, sc) { 21 | var t = this, n, i; 22 | 23 | for (n in s) 24 | t.settings[n] = s[n]; 25 | 26 | s = t.settings; 27 | 28 | if (window.tinyMCEPreInit) { 29 | t.baseURL = tinyMCEPreInit.base; 30 | } else { 31 | t.baseURL = '{{ base_url }}'; 32 | } 33 | 34 | if (!t.coreLoaded) 35 | t.loadScripts(1, s.themes, s.plugins, s.languages, cb, sc); 36 | }, 37 | 38 | loadScripts : function(co, th, pl, la, cb, sc) { 39 | var t = this, x, w = window, q, c = 0, ti, s = t.settings; 40 | 41 | function get(s) { 42 | x = 0; 43 | 44 | try { 45 | x = new ActiveXObject(s); 46 | } catch (s) { 47 | } 48 | 49 | return x; 50 | }; 51 | 52 | // Build query string 53 | q = 'js=true&diskcache=' + (s.disk_cache ? 'true' : 'false') + '&core=' + (co ? 'true' : 'false') + '&suffix=' + escape(s.suffix) + '&themes=' + escape(th) + '&plugins=' + escape(pl) + '&languages=' + escape(la); 54 | 55 | if (co) 56 | t.coreLoaded = 1; 57 | 58 | // Send request 59 | x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Msxml2.XMLHTTP') || get('Microsoft.XMLHTTP'); 60 | x.overrideMimeType && x.overrideMimeType('text/javascript'); 61 | x.open('GET', (/^\//.test(s.page_name) ? "" : t.baseURL + '/') + s.page_name + '?' + q, !!cb); 62 | // x.setRequestHeader('Content-Type', 'text/javascript'); 63 | x.send(''); 64 | 65 | // Handle asynchronous loading 66 | if (cb) { 67 | // Wait for response 68 | ti = w.setInterval(function() { 69 | if (x.readyState == 4 || c++ > 10000) { 70 | w.clearInterval(ti); 71 | 72 | if (c < 10000 && x.status == 200) { 73 | t.loaded = 1; 74 | t.eval(x.responseText); 75 | tinymce.dom.Event.domLoaded = true; 76 | cb.call(sc || t, x); 77 | } 78 | 79 | ti = x = null; 80 | } 81 | }, 10); 82 | } else 83 | t.eval(x.responseText); 84 | }, 85 | 86 | start : function() { 87 | var t = this, each = tinymce.each, s = t.settings, ln = s.languages.split(','); 88 | 89 | tinymce.suffix = s.suffix; 90 | 91 | function load(u) { 92 | tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(u)); 93 | }; 94 | 95 | // Add core languages 96 | each(ln, function(c) { 97 | if (c) 98 | load('langs/' + c + '.js'); 99 | }); 100 | 101 | // Add themes with languages 102 | each(s.themes.split(','), function(n) { 103 | if (n) { 104 | load('themes/' + n + '/editor_template' + s.suffix + '.js'); 105 | 106 | each (ln, function(c) { 107 | if (c) 108 | load('themes/' + n + '/langs/' + c + '.js'); 109 | }); 110 | } 111 | }); 112 | 113 | // Add plugins with languages 114 | each(s.plugins.split(','), function(n) { 115 | if (n) { 116 | load('plugins/' + n + '/editor_plugin' + s.suffix + '.js'); 117 | 118 | each(ln, function(c) { 119 | if (c) 120 | load('plugins/' + n + '/langs/' + c + '.js'); 121 | }); 122 | } 123 | }); 124 | }, 125 | 126 | end : function() { 127 | }, 128 | 129 | eval : function(co) { 130 | var se = document.createElement('script'); 131 | 132 | // Create script 133 | se.type = 'text/javascript'; 134 | se.text = co; 135 | 136 | // Add it to evaluate it and remove it 137 | try { 138 | (document.getElementsByTagName('head')[0] || document.documentElement).appendChild(se); 139 | } catch (error) { 140 | console.error(error, "Tried to eval:", se); 141 | } 142 | se.parentNode.removeChild(se); 143 | } 144 | }; 145 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/advlist/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(t,e,s)=>{const r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===s?null:{"list-style-type":s})},s=t=>e=>e.options.get(t),r=s("advlist_number_styles"),n=s("advlist_bullet_styles"),l=t=>null==t,i=t=>!l(t);class o{constructor(t,e){this.tag=t,this.value=e}static some(t){return new o(!0,t)}static none(){return o.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?o.some(t(this.value)):o.none()}bind(t){return this.tag?t(this.value):o.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:o.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return i(t)?o.some(t):o.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}o.singletonNone=new o(!1);const a=Array.prototype.indexOf,u=Object.keys;var d=tinymce.util.Tools.resolve("tinymce.util.Tools");const c=t=>e=>i(e)&&t.test(e.nodeName),h=c(/^(OL|UL|DL)$/),g=c(/^(TH|TD)$/),p=t=>l(t)||"default"===t?"":t,m=(t,e)=>s=>((t,e)=>{const s=t.selection.getNode();return e({parents:t.dom.getParents(s),element:s}),t.on("NodeChange",e),()=>t.off("NodeChange",e)})(t,(r=>((t,r)=>{const n=t.selection.getStart(!0);s.setActive(((t,e,s)=>((t,e,s)=>{for(let e=0,n=t.length;ee.nodeName===s&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e))))(t,r,e)),s.setEnabled(!((t,e)=>{const s=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,s)||!t.selection.isEditable()})(t,n))})(t,r.parents))),v=(t,s,r,n,l,i)=>{const c={"lower-latin":"lower-alpha","upper-latin":"upper-alpha","lower-alpha":"lower-latin","upper-alpha":"upper-latin"},h=(g=t=>{return e=i,s=t,a.call(e,s)>-1;var e,s},((t,e)=>{const s={};return((t,e)=>{const s=u(t);for(let r=0,n=s.length;r{const n=e(t,r);s[n.k]=n.v})),s})(c,((t,e)=>({k:e,v:g(t)}))));var g;t.ui.registry.addSplitButton(s,{tooltip:r,icon:"OL"===l?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:t=>{t(d.map(i,(t=>{const e="OL"===l?"num":"bull",s="disc"===t||"decimal"===t?"default":t,r=p(t),n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,(t=>t.toUpperCase())))(t);return{type:"choiceitem",value:r,icon:"list-"+e+"-"+s,text:n}})))},onAction:()=>t.execCommand(n),onItemAction:(s,r)=>{e(t,l,r)},select:e=>{const s=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),s=t.dom.getStyle(e,"listStyleType");return o.from(s)})(t);return s.exists((t=>e===t||c[t]===e&&!h[e]))},onSetup:m(t,l)})},y=(t,s,r,n,l,i)=>{i.length>1?v(t,s,r,n,l,i):((t,s,r,n,l,i)=>{t.ui.registry.addToggleButton(s,{active:!1,tooltip:r,icon:"OL"===l?"ordered-list":"unordered-list",onSetup:m(t,l),onAction:()=>t.queryCommandState(n)||""===i?t.execCommand(n):e(t,l,i)})})(t,s,r,n,l,p(i[0]))};t.add("advlist",(t=>{t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,circle,square".split(",")})})(t),(t=>{y(t,"numlist","Numbered list","InsertOrderedList","OL",r(t)),y(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",((s,r)=>{e(t,"UL",r["list-style-type"])})),t.addCommand("ApplyOrderedListStyle",((s,r)=>{e(t,"OL",r["list-style-type"])}))})(t)):console.error("Please use the Lists plugin together with the List Styles plugin.")}))}(); -------------------------------------------------------------------------------- /tinymce/static/django_tinymce/init_tinymce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | { 4 | function onEditorInit(editor) { 5 | const event = new CustomEvent('tinyMceEditorInit', { detail: editor }); 6 | document.dispatchEvent(event); 7 | } 8 | async function initTinyMCE(el) { 9 | if (el.closest('.empty-form') === null) { // Don't do empty inlines 10 | var mce_conf = JSON.parse(el.dataset.mceConf); 11 | 12 | // There is no way to pass a JavaScript function as an option 13 | // because all options are serialized as JSON. 14 | const fns = [ 15 | 'color_picker_callback', 16 | 'file_browser_callback', 17 | 'file_picker_callback', 18 | 'images_dataimg_filter', 19 | 'images_upload_handler', 20 | 'paste_postprocess', 21 | 'paste_preprocess', 22 | 'init_instance_callback', 23 | 'setup', 24 | 'urlconverter_callback', 25 | 'media_url_resolver', 26 | 'video_template_callback', 27 | 'iframe_template_callback', 28 | 'audio_template_callback', 29 | ]; 30 | fns.forEach((fn_name) => { 31 | if (typeof mce_conf[fn_name] != 'undefined') { 32 | if (mce_conf[fn_name].includes('(')) { 33 | mce_conf[fn_name] = eval('(' + mce_conf[fn_name] + ')'); 34 | } 35 | else { 36 | mce_conf[fn_name] = window[mce_conf[fn_name]]; 37 | } 38 | } 39 | }); 40 | 41 | // replace default prefix of 'empty-form' if used in selector 42 | if (mce_conf.selector && mce_conf.selector.includes('__prefix__')) { 43 | mce_conf.selector = `#${el.id}`; 44 | } 45 | else if (!('selector' in mce_conf)) { 46 | mce_conf['target'] = el; 47 | } 48 | if (el.dataset.mceGzConf) { 49 | tinyMCE_GZ.init(JSON.parse(el.dataset.mceGzConf)); 50 | } 51 | // Dispatch per-instance event while preserving user callback 52 | const userInitInstanceCallback = mce_conf.init_instance_callback; 53 | mce_conf.init_instance_callback = function(editor) { 54 | if (typeof userInitInstanceCallback === 'function') { 55 | userInitInstanceCallback(editor); 56 | } 57 | onEditorInit(editor); 58 | }; 59 | if (!tinyMCE.get(el.id)) { 60 | return await tinyMCE.init(mce_conf); 61 | } 62 | } 63 | return []; 64 | } 65 | 66 | // Call function fn when the DOM is loaded and ready. If it is already 67 | // loaded, call the function now. 68 | function ready(fn) { 69 | if (document.readyState !== 'loading') { 70 | fn(); 71 | } else { 72 | document.addEventListener('DOMContentLoaded', fn); 73 | } 74 | } 75 | 76 | async function initializeTinyMCE(element, formsetName) { 77 | const areas = Array.from(element.querySelectorAll('.tinymce')); 78 | const initPromises = areas.map(area => initTinyMCE(area)); 79 | 80 | const results = await Promise.all(initPromises); 81 | const allEditors = results.flat(); 82 | if (allEditors.length) { 83 | const event = new CustomEvent('tinyMceAllEditorsInit', { detail: allEditors }); 84 | document.dispatchEvent(event); 85 | } 86 | return allEditors; 87 | } 88 | 89 | ready(function() { 90 | if (!tinyMCE) { 91 | throw 'tinyMCE is not loaded. If you customized TINYMCE_JS_URL, double-check its content.'; 92 | } 93 | // initialize the TinyMCE editors on load 94 | initializeTinyMCE(document); 95 | 96 | // initialize the TinyMCE editor after adding an inline in the django admin context. 97 | if (typeof(django) !== 'undefined' && typeof(django.jQuery) !== 'undefined') { 98 | django.jQuery(document).on('formset:added', (event, $row, formsetName) => { 99 | if (event.detail && event.detail.formsetName) { 100 | // Django >= 4.1 101 | initializeTinyMCE(event.target); 102 | } else { 103 | // Django < 4.1, use $row 104 | initializeTinyMCE($row.get(0)); 105 | } 106 | }); 107 | } 108 | }); 109 | } 110 | -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/he_IL.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.he_IL', 2 | '

התחל ניווט במקלדת

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
התמקד בשורת התפריטים
\n' + 6 | '
Windows או Linux:‏ Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
העבר מיקוד לסרגל הכלים
\n' + 9 | '
Windows או Linux:‏ Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
העבר מיקוד לכותרת התחתונה
\n' + 12 | '
Windows או Linux:‏ Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
העבר מיקוד להודעה
\n' + 15 | '
Windows או Linux:‏ Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
העבר מיקוד לסרגל כלים הקשרי
\n' + 18 | '
Windows‏, Linux או macOS:‏ Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

הניווט יתחיל ברכיב הראשון במשך, שיודגש או שיהיה מתחתיו קו תחתון במקרה של הפריט הראשון\n' + 22 | ' הנתיב של רכיב הכותרת התחתונה.

\n' + 23 | '\n' + 24 | '

עבור בין מקטעים במסך

\n' + 25 | '\n' + 26 | '

כדי לעבור בין המקטעים במסך, הקש Tab.

\n' + 27 | '\n' + 28 | '

כדי לעבור למקטע הקודם במסך, הקש Shift+Tab.

\n' + 29 | '\n' + 30 | '

הסדר מבחינת מקש Tab של הרכיבים במסך:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. שורת התפריטים
  2. \n' + 34 | '
  3. כל קבוצה בסרגל הכלים
  4. \n' + 35 | '
  5. הסרגל הצידי
  6. \n' + 36 | '
  7. נתיב של רכיב בכותרת התחתונה
  8. \n' + 37 | '
  9. לחצן לספירת מילים בכותרת התחתונה
  10. \n' + 38 | '
  11. קישור של המותג בכותרת התחתונה
  12. \n' + 39 | '
  13. ידית לשינוי גודל עבור העורך בכותרת התחתונה
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

אם רכיב כלשהו במסך לא מופיע, המערכת תדלג עליו.

\n' + 43 | '\n' + 44 | '

אם בכותרת התחתונה יש מיקוד של ניווט במקלדת, ולא מופיע סרגל בצד, יש להקיש Shift+Tab\n' + 45 | ' מעביר את המיקוד לקבוצה הראשונה בסרגל הכלים, לא האחרונה.

\n' + 46 | '\n' + 47 | '

עבור בתוך מקטעים במסך

\n' + 48 | '\n' + 49 | '

כדי לעבור מרכיב אחד לרכיב אחר במסך, הקש על מקש החץ המתאים.

\n' + 50 | '\n' + 51 | '

מקשי החיצים שמאלה וימינה

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • עבור בין תפריטים בשורת התפריטים.
  • \n' + 55 | '
  • פתח תפריט משני בתפריט.
  • \n' + 56 | '
  • עבור בין לחצנים בקבוצה בסרגל הכלים.
  • \n' + 57 | '
  • עבור בין פריטים ברכיב בכותרת התחתונה.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

מקשי החיצים למטה ולמעלה

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • עבור בין פריטים בתפריט.
  • \n' + 64 | '
  • עבור בין פריטים בחלון הקובץ של סרגל הכלים.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

מקשי החצים משתנים בתוך המקטע במסך שעליו נמצא המיקוד.

\n' + 68 | '\n' + 69 | '

כדי לסגור תפריט פתוח, תפריט משני פתוח או חלון קופץ, הקש על Esc.

\n' + 70 | '\n' + 71 | "

אם המיקוד הוא על החלק 'העליון' של מקטע מסוים במסך, הקשה על Esc מביאה גם ליציאה\n" + 72 | ' מהניווט במקלדת לחלוטין.

\n' + 73 | '\n' + 74 | '

הפעל פריט בתפריט או לחצן בסרגל הכלים

\n' + 75 | '\n' + 76 | '

כאשר הפריט הרצוי בתפריט או הלחצן בסרגל הכלים מודגשים, הקש על Return, Enter,\n' + 77 | ' או על מקש הרווח כדי להפעיל את הפריט.

\n' + 78 | '\n' + 79 | '

ניווט בחלונות דו-שיח בלי כרטיסיות

\n' + 80 | '\n' + 81 | '

בחלונות דו-שיח בלי כרטיסיות, הרכיב האינטראקטיבי הראשון מקבל את המיקוד כאשר החלון נפתח.

\n' + 82 | '\n' + 83 | '

עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או Shift+Tab.

\n' + 84 | '\n' + 85 | '

ניווט בחלונות דו-שיח עם כרטיסיות

\n' + 86 | '\n' + 87 | '

בחלונות דו-שיח עם כרטיסיות, הלחצן הראשון בתפריט מקבל את המיקוד כאשר החלון נפתח.

\n' + 88 | '\n' + 89 | '

עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

עבור לכרטיסיה אחרת בחלון על ידי העברת המיקוד לתפריט הכרטיסיות והקשה על החץהמתאים\n' + 93 | ' כדי לעבור בין הכרטיסיות הזמינות.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/th_TH.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.th_TH', 2 | '

เริ่มต้นการนำทางด้วยแป้นพิมพ์

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
โฟกัสที่แถบเมนู
\n' + 6 | '
Windows หรือ Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
โฟกัสที่แถบเครื่องมือ
\n' + 9 | '
Windows หรือ Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
โฟกัสที่ส่วนท้าย
\n' + 12 | '
Windows หรือ Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
โฟกัสไปที่การแจ้งเตือน
\n' + 15 | '
Windows หรือ Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
โฟกัสที่แถบเครื่องมือตามบริบท
\n' + 18 | '
Windows, Linux หรือ macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

การนำทางจะเริ่มที่รายการ UI แรก ซึ่งจะมีการไฮไลต์หรือขีดเส้นใต้ไว้ในกรณีที่รายการแรกอยู่ใน\n' + 22 | ' พาธองค์ประกอบส่วนท้าย

\n' + 23 | '\n' + 24 | '

การนำทางระหว่างส่วนต่างๆ ของ UI

\n' + 25 | '\n' + 26 | '

ในการย้ายจากส่วน UI หนึ่งไปยังส่วนถัดไป ให้กด Tab

\n' + 27 | '\n' + 28 | '

ในการย้ายจากส่วน UI หนึ่งไปยังส่วนก่อนหน้า ให้กด Shift+Tab

\n' + 29 | '\n' + 30 | '

ลำดับแท็บของส่วนต่างๆ ของ UI คือ:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. แถบเมนู
  2. \n' + 34 | '
  3. แต่ละกลุ่มแถบเครื่องมือ
  4. \n' + 35 | '
  5. แถบข้าง
  6. \n' + 36 | '
  7. พาธองค์ประกอบในส่วนท้าย
  8. \n' + 37 | '
  9. ปุ่มสลับเปิด/ปิดจำนวนคำในส่วนท้าย
  10. \n' + 38 | '
  11. ลิงก์ชื่อแบรนด์ในส่วนท้าย
  12. \n' + 39 | '
  13. จุดจับปรับขนาดของตัวแก้ไขในส่วนท้าย
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

หากส่วน UI ไม่ปรากฏ แสดงว่าถูกข้ามไป

\n' + 43 | '\n' + 44 | '

หากส่วนท้ายมีการโฟกัสการนำทางแป้นพิมพ์และไม่มีแถบข้างปรากฏ การกด Shift+Tab\n' + 45 | ' จะย้ายการโฟกัสไปที่กลุ่มแถบเครื่องมือแรก ไม่ใช่สุดท้าย

\n' + 46 | '\n' + 47 | '

การนำทางภายในส่วนต่างๆ ของ UI

\n' + 48 | '\n' + 49 | '

ในการย้ายจากองค์ประกอบ UI หนึ่งไปยังองค์ประกอบส่วนถัดไป ให้กดปุ่มลูกศรที่เหมาะสม

\n' + 50 | '\n' + 51 | '

ปุ่มลูกศรซ้ายและขวา

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • ย้ายไปมาระหว่างเมนูต่างๆ ในแถบเมนู
  • \n' + 55 | '
  • เปิดเมนูย่อยในเมนู
  • \n' + 56 | '
  • ย้ายไปมาระหว่างปุ่มต่างๆ ในกลุ่มแถบเครื่องมือ
  • \n' + 57 | '
  • ย้ายไปมาระหว่างรายการต่างๆ ในพาธองค์ประกอบของส่วนท้าย
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

ปุ่มลูกศรลงและขึ้น

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • ย้ายไปมาระหว่างรายการเมนูต่างๆ ในเมนู
  • \n' + 64 | '
  • ย้ายไปมาระหว่างรายการต่างๆ ในเมนูป๊อบอัพแถบเครื่องมือ
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

ปุ่มลูกศรจะเลื่อนไปมาภายในส่วน UI ที่โฟกัส

\n' + 68 | '\n' + 69 | '

ในการปิดเมนูที่เปิดอยู่ เมนูย่อยที่เปิดอยู่ หรือเมนูป๊อบอัพที่เปิดอยู่ ให้กดปุ่ม Esc

\n' + 70 | '\n' + 71 | '

หากโฟกัสปัจจุบันอยู่ที่ ‘ด้านบนสุด’ ของส่วน UI เฉพาะ การกดปุ่ม Esc จะทำให้ออกจาก\n' + 72 | ' การนำทางด้วยแป้นพิมพ์ทั้งหมดเช่นกัน

\n' + 73 | '\n' + 74 | '

การดำเนินการรายการเมนูหรือปุ่มในแถบเครื่องมือ

\n' + 75 | '\n' + 76 | '

เมื่อไฮไลต์รายการเมนูหรือปุ่มในแถบเครื่องมือที่ต้องการ ให้กด Return, Enter\n' + 77 | ' หรือ Space bar เพื่อดำเนินการรายการดังกล่าว

\n' + 78 | '\n' + 79 | '

การนำทางสำหรับกล่องโต้ตอบที่ไม่อยู่ในแท็บ

\n' + 80 | '\n' + 81 | '

ในกล่องโต้ตอบที่ไม่อยู่ในแท็บ จะโฟกัสที่ส่วนประกอบเชิงโต้ตอบแรกเมื่อกล่องโต้ตอบเปิด

\n' + 82 | '\n' + 83 | '

นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของกล่องโต้ตอบ โดยการกด Tab หรือ Shift+Tab

\n' + 84 | '\n' + 85 | '

การนำทางสำหรับกล่องโต้ตอบที่อยู่ในแท็บ

\n' + 86 | '\n' + 87 | '

ในกล่องโต้ตอบที่อยู่ในแท็บ จะโฟกัสที่ปุ่มแรกในเมนูแท็บเมื่อกล่องโต้ตอบเปิด

\n' + 88 | '\n' + 89 | '

นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของแท็บกล่องโต้ตอบนี้โดยการกด Tab หรือ\n' + 90 | ' Shift+Tab

\n' + 91 | '\n' + 92 | '

สลับไปยังแท็บกล่องโต้ตอบอื่นโดยการเลือกโฟกัสที่เมนูแท็บ แล้วกดปุ่มลูกศรที่เหมาะสม\n' + 93 | ' เพื่อเลือกแท็บที่ใช้ได้

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/directionality/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 7.8.0 (TBD) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,o=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(o=r=t,(n=String).prototype.isPrototypeOf(o)||(null===(i=r.constructor)||void 0===i?void 0:i.name)===n.name)?"string":e;var o,r,n,i})(t),r=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=()=>false;class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return n(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=(t,e)=>{for(let o=0,r=t.length;o{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},d=c,h=(t,e)=>{const o=t.dom;if(1!==o.nodeType)return!1;{const t=o;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}};"undefined"!=typeof window?window:Function("return this;")();const m=t=>e=>(t=>t.dom.nodeType)(e)===t,g=m(1),f=m(3),v=m(11),y=(t,e)=>{t.dom.removeAttribute(e)},p=t=>d(t.dom.host),w=t=>{const e=f(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const o=e.ownerDocument;return(t=>{const e=(t=>d(t.dom.getRootNode()))(t);return v(o=e)&&n(o.dom.host)?a.some(e):a.none();var o})(d(e)).fold((()=>o.body.contains(e)),(r=w,i=p,t=>r(i(t))));var r,i},b=t=>"rtl"===((t,e)=>{const o=t.dom,r=window.getComputedStyle(o).getPropertyValue(e);return""!==r||w(t)?r:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(o,e)})(t,"direction")?"rtl":"ltr",S=(t,e)=>(t=>((t,e)=>{const o=[];for(let r=0,n=t.length;r{const o=t.length,r=new Array(o);for(let n=0;nh(t,e))))(t),N=t=>g(t)&&"li"===t.dom.nodeName.toLowerCase();const A=(t,e,n)=>{u(e,(e=>{const c=d(e),m=N(c),f=((t,e)=>{return(e?(o=t,r="ol,ul",((t,e,o)=>{let n=t.dom;const s=i(o)?o:l;for(;n.parentNode;){n=n.parentNode;const t=d(n);if(h(t,r))return a.some(t);if(s(t))break}return a.none()})(o,0,n)):a.some(t)).getOr(t);var o,r,n})(c,m);var v;(v=f,(t=>a.from(t.dom.parentNode).map(d))(v).filter(g)).each((e=>{if(t.setStyle(f.dom,"direction",null),b(e)===n?y(f,"dir"):((t,e,n)=>{((t,e,n)=>{if(!(o(n)||r(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(f,"dir",n),b(f)!==n&&t.setStyle(f.dom,"direction",n),m){const e=S(f,"li[dir],li[style]");u(e,(e=>{y(e,"dir"),t.setStyle(e.dom,"direction",null)}))}}))}))},T=(t,e)=>{t.selection.isEditable()&&(A(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},C=(t,e)=>o=>{const r=r=>{const n=d(r.element);o.setActive(b(n)===e),o.setEnabled(t.selection.isEditable())};return t.on("NodeChange",r),o.setEnabled(t.selection.isEditable()),()=>t.off("NodeChange",r)};t.add("directionality",(t=>{(t=>{t.addCommand("mceDirectionLTR",(()=>{T(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{T(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:C(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:C(t,"rtl")})})(t)}))}(); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/hi.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.hi', 2 | '

कीबोर्ड नेविगेशन शुरू करें

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
मेन्यू बार पर फ़ोकस करें
\n' + 6 | '
Windows या Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
टूलबार पर फ़ोकस करें
\n' + 9 | '
Windows या Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
फ़ुटर पर फ़ोकस करें
\n' + 12 | '
Windows या Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
नोटिफ़िकेशन फ़ोकस
\n' + 15 | '
Windows या Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
प्रासंगिक टूलबार पर फ़ोकस करें
\n' + 18 | '
Windows, Linux या macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

नेविगेशन पहले UI आइटम पर शुरू होगा, जिसे हाइलाइट किया जाएगा या पहले आइटम के मामले में फ़ुटर तत्व पथ में\n' + 22 | ' रेखांकित किया जाएगा।

\n' + 23 | '\n' + 24 | '

UI सेक्शन के बीच नेविगेट करें

\n' + 25 | '\n' + 26 | '

एक UI सेक्शन से दूसरे सेक्शन में जाने के लिए, Tab दबाएं।

\n' + 27 | '\n' + 28 | '

एक UI सेक्शन से पिछले सेक्शन में जाने के लिए, Shift+Tab दबाएं।

\n' + 29 | '\n' + 30 | '

इन UI सेक्शन का Tab क्रम नीचे दिया गया है:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. मेन्यू बार
  2. \n' + 34 | '
  3. प्रत्येक टूलबार समूह
  4. \n' + 35 | '
  5. साइडबार
  6. \n' + 36 | '
  7. फ़ुटर में तत्व पथ
  8. \n' + 37 | '
  9. फ़ुटर में शब्द गणना टॉगल बटन
  10. \n' + 38 | '
  11. फ़ुटर में ब्रांडिंग लिंक
  12. \n' + 39 | '
  13. फ़ुटर में संपादक का आकार बदलने का हैंडल
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

अगर कोई UI सेक्शन मौजूद नहीं है, तो उसे छोड़ दिया जाता है।

\n' + 43 | '\n' + 44 | '

अगर फ़ुटर में कीबोर्ड नेविगेशन फ़ोकस है, और कोई दिखा देने वाला साइडबार नहीं है, तो Shift+Tab दबाने से\n' + 45 | ' फ़ोकस पहले टूलबार समूह पर चला जाता है, पिछले पर नहीं।

\n' + 46 | '\n' + 47 | '

UI सेक्शन के भीतर नेविगेट करें

\n' + 48 | '\n' + 49 | '

एक UI तत्व से दूसरे में जाने के लिए उपयुक्त ऐरो कुंजी दबाएं।

\n' + 50 | '\n' + 51 | '

बाएं और दाएं ऐरो कुंजियां

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • मेन्यू बार में मेन्यू के बीच ले जाती हैं।
  • \n' + 55 | '
  • मेन्यू में एक सब-मेन्यू खोलें।
  • \n' + 56 | '
  • टूलबार समूह में बटनों के बीच ले जाएं।
  • \n' + 57 | '
  • फ़ुटर के तत्व पथ में आइटम के बीच ले जाएं।
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

नीचे और ऊपर ऐरो कुंजियां

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • मेन्यू में मेन्यू आइटम के बीच ले जाती हैं।
  • \n' + 64 | '
  • टूलबार पॉप-अप मेन्यू में आइटम के बीच ले जाएं।
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

फ़ोकस वाले UI सेक्शन के भीतर ऐरो कुंजियां चलाती रहती हैं।

\n' + 68 | '\n' + 69 | '

कोई खुला मेन्यू, कोई खुला सब-मेन्यू या कोई खुला पॉप-अप मेन्यू बंद करने के लिए Esc कुंजी दबाएं।

\n' + 70 | '\n' + 71 | "

अगर मौजूदा फ़ोकस किसी विशेष UI सेक्शन के 'शीर्ष' पर है, तो Esc कुंजी दबाने से भी\n" + 72 | ' कीबोर्ड नेविगेशन पूरी तरह से बाहर हो जाता है।

\n' + 73 | '\n' + 74 | '

मेन्यू आइटम या टूलबार बटन निष्पादित करें

\n' + 75 | '\n' + 76 | '

जब वांछित मेन्यू आइटम या टूलबार बटन हाइलाइट किया जाता है, तो आइटम को निष्पादित करने के लिए Return, Enter,\n' + 77 | ' या Space bar दबाएं।

\n' + 78 | '\n' + 79 | '

गैर-टैब वाले डायलॉग पर नेविगेट करें

\n' + 80 | '\n' + 81 | '

गैर-टैब वाले डायलॉग में, डायलॉग खुलने पर पहला इंटरैक्टिव घटक फ़ोकस लेता है।

\n' + 82 | '\n' + 83 | '

Tab or Shift+Tab दबाकर इंटरैक्टिव डायलॉग घटकों के बीच नेविगेट करें।

\n' + 84 | '\n' + 85 | '

टैब किए गए डायलॉग पर नेविगेट करें

\n' + 86 | '\n' + 87 | '

टैब किए गए डायलॉग में, डायलॉग खुलने पर टैब मेन्यू में पहला बटन फ़ोकस लेता है।

\n' + 88 | '\n' + 89 | '

इस डायलॉग टैब के इंटरैक्टिव घटकों के बीच नेविगेट करने के लिए Tab या\n' + 90 | ' Shift+Tab दबाएं।

\n' + 91 | '\n' + 92 | '

टैब मेन्यू को फ़ोकस देकर और फिर उपलब्ध टैब में के बीच जाने के लिए उपयुक्त ऐरो\n' + 93 | ' कुंजी दबाकर दूसरे डायलॉग टैब पर स्विच करें।

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/en.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.en', 2 | '

Begin keyboard navigation

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Focus the Menu bar
\n' + 6 | '
Windows or Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Focus the Toolbar
\n' + 9 | '
Windows or Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Focus the footer
\n' + 12 | '
Windows or Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Focus the notification
\n' + 15 | '
Windows or Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Focus a contextual toolbar
\n' + 18 | '
Windows, Linux or macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigation will start at the first UI item, which will be highlighted, or underlined in the case of the first item in\n' + 22 | ' the Footer element path.

\n' + 23 | '\n' + 24 | '

Navigate between UI sections

\n' + 25 | '\n' + 26 | '

To move from one UI section to the next, press Tab.

\n' + 27 | '\n' + 28 | '

To move from one UI section to the previous, press Shift+Tab.

\n' + 29 | '\n' + 30 | '

The Tab order of these UI sections is:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menu bar
  2. \n' + 34 | '
  3. Each toolbar group
  4. \n' + 35 | '
  5. Sidebar
  6. \n' + 36 | '
  7. Element path in the footer
  8. \n' + 37 | '
  9. Word count toggle button in the footer
  10. \n' + 38 | '
  11. Branding link in the footer
  12. \n' + 39 | '
  13. Editor resize handle in the footer
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

If a UI section is not present, it is skipped.

\n' + 43 | '\n' + 44 | '

If the footer has keyboard navigation focus, and there is no visible sidebar, pressing Shift+Tab\n' + 45 | ' moves focus to the first toolbar group, not the last.

\n' + 46 | '\n' + 47 | '

Navigate within UI sections

\n' + 48 | '\n' + 49 | '

To move from one UI element to the next, press the appropriate Arrow key.

\n' + 50 | '\n' + 51 | '

The Left and Right arrow keys

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • move between menus in the menu bar.
  • \n' + 55 | '
  • open a sub-menu in a menu.
  • \n' + 56 | '
  • move between buttons in a toolbar group.
  • \n' + 57 | '
  • move between items in the footer’s element path.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

The Down and Up arrow keys

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • move between menu items in a menu.
  • \n' + 64 | '
  • move between items in a toolbar pop-up menu.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Arrow keys cycle within the focused UI section.

\n' + 68 | '\n' + 69 | '

To close an open menu, an open sub-menu, or an open pop-up menu, press the Esc key.

\n' + 70 | '\n' + 71 | '

If the current focus is at the ‘top’ of a particular UI section, pressing the Esc key also exits\n' + 72 | ' keyboard navigation entirely.

\n' + 73 | '\n' + 74 | '

Execute a menu item or toolbar button

\n' + 75 | '\n' + 76 | '

When the desired menu item or toolbar button is highlighted, press Return, Enter,\n' + 77 | ' or the Space bar to execute the item.

\n' + 78 | '\n' + 79 | '

Navigate non-tabbed dialogs

\n' + 80 | '\n' + 81 | '

In non-tabbed dialogs, the first interactive component takes focus when the dialog opens.

\n' + 82 | '\n' + 83 | '

Navigate between interactive dialog components by pressing Tab or Shift+Tab.

\n' + 84 | '\n' + 85 | '

Navigate tabbed dialogs

\n' + 86 | '\n' + 87 | '

In tabbed dialogs, the first button in the tab menu takes focus when the dialog opens.

\n' + 88 | '\n' + 89 | '

Navigate between interactive components of this dialog tab by pressing Tab or\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Switch to another dialog tab by giving the tab menu focus and then pressing the appropriate Arrow\n' + 93 | ' key to cycle through the available tabs.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/fa.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.fa', 2 | '

شروع پیمایش صفحه‌کلید

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
تمرکز بر نوار منو
\n' + 6 | '
Windows یا Linux:‎‏: Alt+F9
\n' + 7 | '
‎‏macOS: ⌥F9‎‏
\n' + 8 | '
تمرکز بر نوار ابزار
\n' + 9 | '
Windows یا Linux‎‏: Alt+F10
\n' + 10 | '
‎‏macOS: ⌥F10‎‏
\n' + 11 | '
تمرکز بر پانویس
\n' + 12 | '
Windows یا Linux‎‏: Alt+F11
\n' + 13 | '
‎‏macOS: ⌥F11‎‏
\n' + 14 | '
تمرکز اعلان
\n' + 15 | '
ویندوز یا لینوکس: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
تمرکز بر نوار ابزار بافتاری
\n' + 18 | '
Windows ،Linux یا macOS:‏ Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

پیمایش در اولین مورد رابط کاربری شروع می‌شود و درخصوص اولین مورد در\n' + 22 | ' مسیر عنصر پانویس، برجسته یا زیرخط‌دار می‌شود.

\n' + 23 | '\n' + 24 | '

پیمایش بین بخش‌های رابط کاربری

\n' + 25 | '\n' + 26 | '

برای جابجایی از یک بخش رابط کاربری به بخش بعدی، Tab را فشار دهید.

\n' + 27 | '\n' + 28 | '

برای جابجایی از یک بخش رابط کاربری به بخش قبلی، Shift+Tab را فشار دهید.

\n' + 29 | '\n' + 30 | '

ترتیب Tab این بخش‌های رابط کاربری عبارتند از:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. نوار منو
  2. \n' + 34 | '
  3. هر گروه نوار ابزار
  4. \n' + 35 | '
  5. نوار کناری
  6. \n' + 36 | '
  7. مسیر عنصر در پانویس
  8. \n' + 37 | '
  9. دکمه تغییر وضعیت تعداد کلمات در پانویس
  10. \n' + 38 | '
  11. پیوند نمانام‌سازی در پانویس
  12. \n' + 39 | '
  13. دسته تغییر اندازه ویرایشگر در پانویس
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

اگر بخشی از رابط کاربری موجود نباشد، رد می‌شود.

\n' + 43 | '\n' + 44 | '

اگر پانویس دارای تمرکز بر پیمایش صفحه‌کلید باشد،‌ و نوار کناری قابل‌مشاهده وجود ندارد، فشردن Shift+Tab\n' + 45 | ' تمرکز را به گروه نوار ابزار اول می‌برد، نه آخر.

\n' + 46 | '\n' + 47 | '

پیمایش در بخش‌های رابط کاربری

\n' + 48 | '\n' + 49 | '

برای جابجایی از یک عنصر رابط کاربری به بعدی، کلید جهت‌نمای مناسب را فشار دهید.

\n' + 50 | '\n' + 51 | '

کلیدهای جهت‌نمای چپ و راست

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • جابجایی بین منوها در نوار منو.
  • \n' + 55 | '
  • باز کردن منوی فرعی در یک منو.
  • \n' + 56 | '
  • جابجایی بین دکمه‌ها در یک گروه نوار ابزار.
  • \n' + 57 | '
  • جابجایی بین موارد در مسیر عنصر پانویس.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

کلیدهای جهت‌نمای پایین و بالا

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • جابجایی بین موارد منو در یک منو.
  • \n' + 64 | '
  • جابجایی بین موارد در یک منوی بازشوی نوار ابزار.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

کلیدهایجهت‌نما در بخش رابط کاربری متمرکز می‌چرخند.

\n' + 68 | '\n' + 69 | '

برای بستن یک منوی باز، یک منوی فرعی باز، یا یک منوی بازشوی باز، کلید Esc را فشار دهید.

\n' + 70 | '\n' + 71 | '

اگر تمرکز فعلی در «بالای» یک بخش رابط کاربری خاص است، فشردن کلید Esc نیز موجب\n' + 72 | ' خروج کامل از پیمایش صفحه‌کلید می‌شود.

\n' + 73 | '\n' + 74 | '

اجرای یک مورد منو یا دکمه نوار ابزار

\n' + 75 | '\n' + 76 | '

وقتی مورد منو یا دکمه نوار ابزار مورد نظر هایلایت شد، دکمه بازگشت، Enter،\n' + 77 | ' یا نوار Space را فشار دهید تا مورد را اجرا کنید.

\n' + 78 | '\n' + 79 | '

پیمایش در کادرهای گفتگوی بدون زبانه

\n' + 80 | '\n' + 81 | '

در کادرهای گفتگوی بدون زبانه، وقتی کادر گفتگو باز می‌شود، اولین جزء تعاملی متمرکز می‌شود.

\n' + 82 | '\n' + 83 | '

با فشردن Tab یا Shift+Tab، بین اجزای کادر گفتگوی تعاملی پیمایش کنید.

\n' + 84 | '\n' + 85 | '

پیمایش کادرهای گفتگوی زبانه‌دار

\n' + 86 | '\n' + 87 | '

در کادرهای گفتگوی زبانه‌دار، وقتی کادر گفتگو باز می‌شود، اولین دکمه در منوی زبانه متمرکز می‌شود.

\n' + 88 | '\n' + 89 | '

با فشردن Tab یا\n' + 90 | ' Shift+Tab، بین اجزای تعاملی این زبانه کادر گفتگو پیمایش کنید.

\n' + 91 | '\n' + 92 | '

با دادن تمرکز به منوی زبانه و سپس فشار دادن کلید جهت‌نمای\n' + 93 | ' مناسب برای چرخش میان زبانه‌های موجود، به زبانه کادر گفتگوی دیگری بروید.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/ms.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.ms', 2 | '

Mulakan navigasi papan kekunci

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokus bar Menu
\n' + 6 | '
Windows atau Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokus Bar Alat
\n' + 9 | '
Windows atau Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokus pengaki
\n' + 12 | '
Windows atau Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Tumpu kepada pemberitahuan
\n' + 15 | '
Windows atau Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokus bar alat kontekstual
\n' + 18 | '
Windows, Linux atau macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigasi akan bermula pada item UI pertama, yang akan diserlahkan atau digaris bawah dalam saiz item pertama dalam\n' + 22 | ' laluan elemen Pengaki.

\n' + 23 | '\n' + 24 | '

Navigasi antara bahagian UI

\n' + 25 | '\n' + 26 | '

Untuk bergerak dari satu bahagian UI ke yang seterusnya, tekan Tab.

\n' + 27 | '\n' + 28 | '

Untuk bergerak dari satu bahagian UI ke yang sebelumnya, tekan Shift+Tab.

\n' + 29 | '\n' + 30 | '

Tertib Tab bahagian UI ini ialah:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Bar menu
  2. \n' + 34 | '
  3. Setiap kumpulan bar alat
  4. \n' + 35 | '
  5. Bar sisi
  6. \n' + 36 | '
  7. Laluan elemen dalam pengaki
  8. \n' + 37 | '
  9. Butang togol kiraan perkataan dalam pengaki
  10. \n' + 38 | '
  11. Pautan penjenamaan dalam pengaki
  12. \n' + 39 | '
  13. Pemegang saiz semula editor dalam pengaki
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Jika bahagian UI tidak wujud, ia dilangkau.

\n' + 43 | '\n' + 44 | '

Jika pengaki mempunyai fokus navigasi papan kekunci dan tiada bar sisi kelihatan, menekan Shift+Tab\n' + 45 | ' akan mengalihkan fokus ke kumpulan bar alat pertama, bukannya yang terakhir.

\n' + 46 | '\n' + 47 | '

Navigasi dalam bahagian UI

\n' + 48 | '\n' + 49 | '

Untuk bergerak dari satu elemen UI ke yang seterusnya, tekan kekunci Anak Panah yang bersesuaian.

\n' + 50 | '\n' + 51 | '

Kekunci anak panah Kiri dan Kanan

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • bergerak antara menu dalam bar menu.
  • \n' + 55 | '
  • membukan submenu dalam menu.
  • \n' + 56 | '
  • bergerak antara butang dalam kumpulan bar alat.
  • \n' + 57 | '
  • Laluan elemen dalam pengaki.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Kekunci anak panah Bawah dan Atas

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • bergerak antara item menu dalam menu.
  • \n' + 64 | '
  • bergerak antara item dalam menu timbul bar alat.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Kekunci Anak Panah berkitar dalam bahagian UI difokuskan.

\n' + 68 | '\n' + 69 | '

Untuk menutup menu buka, submenu terbuka atau menu timbul terbuka, tekan kekunci Esc.

\n' + 70 | '\n' + 71 | "

Jika fokus semasa berada di bahagian 'atas' bahagian UI tertentu, menekan kekunci Esc juga akan keluar daripada\n" + 72 | ' navigasi papan kekunci sepenuhnya.

\n' + 73 | '\n' + 74 | '

Laksanakan item menu atau butang bar alat

\n' + 75 | '\n' + 76 | '

Apabila item menu atau butang bar alat yang diinginkan diserlahkan, tekan Return, Enter,\n' + 77 | ' atau bar Space untuk melaksanakan item.

\n' + 78 | '\n' + 79 | '

Navigasi ke dialog tidak bertab

\n' + 80 | '\n' + 81 | '

Dalam dialog tidak bertab, komponen interaksi pertama difokuskan apabila dialog dibuka.

\n' + 82 | '\n' + 83 | '

Navigasi antara komponen dialog interaktif dengan menekan Tab atau Shift+Tab.

\n' + 84 | '\n' + 85 | '

Navigasi ke dialog bertab

\n' + 86 | '\n' + 87 | '

Dalam dialog bertab, butang pertama dalam menu tab difokuskan apabila dialog dibuka.

\n' + 88 | '\n' + 89 | '

Navigasi antara komponen interaktif tab dialog ini dengan menekan Tab atau\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Tukar kepada tab dialog lain dengan memfokuskan menu tab, kemudian menekan kekunci Anak Panah yang bersesuaian\n' + 93 | ' untuk berkitar menerusi tab yang tersedia.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/sv_SE.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.sv_SE', 2 | '

Påbörja tangentbordsnavigering

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokusera på menyraden
\n' + 6 | '
Windows eller Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokusera på verktygsraden
\n' + 9 | '
Windows eller Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokusera på verktygsraden
\n' + 12 | '
Windows eller Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Fokusera aviseringen
\n' + 15 | '
Windows eller Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokusera på en snabbverktygsrad
\n' + 18 | '
Windows, Linux eller macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigeringen börjar vid det första gränssnittsobjektet, vilket är markerat eller understruket om det gäller det första objektet i\n' + 22 | ' sidfotens elementsökväg.

\n' + 23 | '\n' + 24 | '

Navigera mellan UI-avsnitt

\n' + 25 | '\n' + 26 | '

Flytta från ett UI-avsnitt till nästa genom att trycka på Tabb.

\n' + 27 | '\n' + 28 | '

Flytta från ett UI-avsnitt till det föregående genom att trycka på Skift+Tabb.

\n' + 29 | '\n' + 30 | '

Tabb-ordningen för dessa UI-avsnitt är:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menyrad
  2. \n' + 34 | '
  3. Varje verktygsradsgrupp
  4. \n' + 35 | '
  5. Sidoruta
  6. \n' + 36 | '
  7. Elementsökväg i sidfoten
  8. \n' + 37 | '
  9. Växlingsknapp för ordantal i sidfoten
  10. \n' + 38 | '
  11. Varumärkeslänk i sidfoten
  12. \n' + 39 | '
  13. Storlekshandtag för redigeraren i sidfoten
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Om ett UI-avsnitt inte finns hoppas det över.

\n' + 43 | '\n' + 44 | '

Om sidfoten har fokus på tangentbordsnavigering, och det inte finns någon synlig sidoruta, flyttas fokus till den första verktygsradsgruppen\n' + 45 | ' när du trycker på Skift+Tabb, inte till den sista.

\n' + 46 | '\n' + 47 | '

Navigera i UI-avsnitt

\n' + 48 | '\n' + 49 | '

Flytta från ett UI-element till nästa genom att trycka på motsvarande piltangent.

\n' + 50 | '\n' + 51 | '

Vänsterpil och högerpil

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • flytta mellan menyer på menyraden.
  • \n' + 55 | '
  • öppna en undermeny på en meny.
  • \n' + 56 | '
  • flytta mellan knappar i en verktygsradgrupp.
  • \n' + 57 | '
  • flytta mellan objekt i sidfotens elementsökväg.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Nedpil och uppil

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • flytta mellan menyalternativ på en meny.
  • \n' + 64 | '
  • flytta mellan alternativ på en popup-meny på verktygsraden.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Piltangenterna cirkulerar inom det fokuserade UI-avsnittet.

\n' + 68 | '\n' + 69 | '

Tryck på Esc-tangenten om du vill stänga en öppen meny, undermeny eller popup-meny.

\n' + 70 | '\n' + 71 | '

Om det aktuella fokuset är högst upp i ett UI-avsnitt avlutas även tangentbordsnavigeringen helt när\n' + 72 | ' du trycker på Esc-tangenten.

\n' + 73 | '\n' + 74 | '

Köra ett menyalternativ eller en verktygfältsknapp

\n' + 75 | '\n' + 76 | '

När menyalternativet eller verktygsradsknappen är markerad trycker du på Retur, Enter\n' + 77 | ' eller blanksteg för att köra alternativet.

\n' + 78 | '\n' + 79 | '

Navigera i dialogrutor utan flikar

\n' + 80 | '\n' + 81 | '

I dialogrutor utan flikar är den första interaktiva komponenten i fokus när dialogrutan öppnas.

\n' + 82 | '\n' + 83 | '

Navigera mellan interaktiva dialogkomponenter genom att trycka på Tabb eller Skift+Tabb.

\n' + 84 | '\n' + 85 | '

Navigera i dialogrutor med flikar

\n' + 86 | '\n' + 87 | '

I dialogrutor utan flikar är den första knappen på flikmenyn i fokus när dialogrutan öppnas.

\n' + 88 | '\n' + 89 | '

Navigera mellan interaktiva komponenter på dialogrutefliken genom att trycka på Tabb eller\n' + 90 | ' Skift+Tabb.

\n' + 91 | '\n' + 92 | '

Växla till en annan dialogruta genom att fokusera på flikmenyn och sedan trycka på motsvarande piltangent\n' + 93 | ' för att cirkulera mellan de tillgängliga flikarna.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/id.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.id', 2 | '

Memulai navigasi keyboard

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokus pada bilah Menu
\n' + 6 | '
Windows atau Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokus pada Bilah Alat
\n' + 9 | '
Windows atau Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokus pada footer
\n' + 12 | '
Windows atau Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Fokuskan pemberitahuan
\n' + 15 | '
Windows atau Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokus pada bilah alat kontekstual
\n' + 18 | '
Windows, Linux, atau macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigasi akan dimulai dari item pertama UI, yang akan disorot atau digarisbawahi di\n' + 22 | ' alur elemen Footer.

\n' + 23 | '\n' + 24 | '

Berpindah antar-bagian UI

\n' + 25 | '\n' + 26 | '

Untuk berpindah dari satu bagian UI ke bagian berikutnya, tekan Tab.

\n' + 27 | '\n' + 28 | '

Untuk berpindah dari satu bagian UI ke bagian sebelumnya, tekan Shift+Tab.

\n' + 29 | '\n' + 30 | '

Urutan Tab bagian-bagian UI ini adalah:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Bilah menu
  2. \n' + 34 | '
  3. Tiap grup bilah alat
  4. \n' + 35 | '
  5. Bilah sisi
  6. \n' + 36 | '
  7. Alur elemen di footer
  8. \n' + 37 | '
  9. Tombol aktifkan/nonaktifkan jumlah kata di footer
  10. \n' + 38 | '
  11. Tautan merek di footer
  12. \n' + 39 | '
  13. Pengatur pengubahan ukuran editor di footer
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Jika suatu bagian UI tidak ada, bagian tersebut dilewati.

\n' + 43 | '\n' + 44 | '

Jika fokus navigasi keyboard ada pada footer, tetapi tidak ada bilah sisi yang terlihat, menekan Shift+Tab\n' + 45 | ' akan memindahkan fokus ke grup bilah alat pertama, bukan yang terakhir.

\n' + 46 | '\n' + 47 | '

Berpindah di dalam bagian-bagian UI

\n' + 48 | '\n' + 49 | '

Untuk berpindah dari satu elemen UI ke elemen berikutnya, tekan tombol Panah yang sesuai.

\n' + 50 | '\n' + 51 | '

Tombol panah Kiri dan Kanan untuk

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • berpindah-pindah antar-menu di dalam bilah menu.
  • \n' + 55 | '
  • membuka sub-menu di dalam menu.
  • \n' + 56 | '
  • berpindah-pindah antar-tombol di dalam grup bilah alat.
  • \n' + 57 | '
  • berpindah-pindah antar-item di dalam alur elemen footer.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Tombol panah Bawah dan Atas untuk

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • berpindah-pindah antar-item menu di dalam menu.
  • \n' + 64 | '
  • berpindah-pindah antar-item di dalam menu pop-up bilah alat.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Tombol Panah hanya bergerak di dalam bagian UI yang difokuskan.

\n' + 68 | '\n' + 69 | '

Untuk menutup menu, sub-menu, atau menu pop-up yang terbuka, tekan tombol Esc.

\n' + 70 | '\n' + 71 | '

Jika fokus sedang berada di ‘atas’ bagian UI tertentu, menekan tombol Esc juga dapat mengeluarkan fokus\n' + 72 | ' dari seluruh navigasi keyboard.

\n' + 73 | '\n' + 74 | '

Menjalankan item menu atau tombol bilah alat

\n' + 75 | '\n' + 76 | '

Jika item menu atau tombol bilah alat yang diinginkan tersorot, tekan Return, Enter,\n' + 77 | ' atau Spasi untuk menjalankan item.

\n' + 78 | '\n' + 79 | '

Berpindah dalam dialog tanpa tab

\n' + 80 | '\n' + 81 | '

Dalam dialog tanpa tab, fokus diarahkan pada komponen interaktif pertama saat dialog terbuka.

\n' + 82 | '\n' + 83 | '

Berpindah di antara komponen dalam dialog interaktif dengan menekan Tab atau Shift+Tab.

\n' + 84 | '\n' + 85 | '

Berpindah dalam dialog dengan tab

\n' + 86 | '\n' + 87 | '

Dalam dialog yang memiliki tab, fokus diarahkan pada tombol pertama di dalam menu saat dialog terbuka.

\n' + 88 | '\n' + 89 | '

Berpindah di antara komponen-komponen interaktif pada tab dialog ini dengan menekan Tab atau\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Beralih ke tab dialog lain dengan mengarahkan fokus pada menu tab lalu tekan tombol Panah\n' + 93 | ' yang sesuai untuk berpindah ke berbagai tab yang tersedia.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/da.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.da', 2 | '

Start tastaturnavigation

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokuser på menulinjen
\n' + 6 | '
Windows eller Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokuser på værktøjslinjen
\n' + 9 | '
Windows eller Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokuser på sidefoden
\n' + 12 | '
Windows eller Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Fokuser på meddelelsen
\n' + 15 | '
Windows eller Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokuser på kontekstuel værktøjslinje
\n' + 18 | '
Windows, Linux eller macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigationen starter ved det første UI-element, som fremhæves eller understreges hvad angår det første element i\n' + 22 | ' sidefodens sti til elementet.

\n' + 23 | '\n' + 24 | '

Naviger mellem UI-sektioner

\n' + 25 | '\n' + 26 | '

Gå fra én UI-sektion til den næste ved at trykke på Tab.

\n' + 27 | '\n' + 28 | '

Gå fra én UI-sektion til den forrige ved at trykke på Shift+Tab.

\n' + 29 | '\n' + 30 | '

Tab-rækkefølgen af disse UI-sektioner er:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menulinje
  2. \n' + 34 | '
  3. Hver værktøjsgruppe
  4. \n' + 35 | '
  5. Sidepanel
  6. \n' + 36 | '
  7. Sti til elementet i sidefoden
  8. \n' + 37 | '
  9. Til/fra-knap for ordoptælling i sidefoden
  10. \n' + 38 | '
  11. Brandinglink i sidefoden
  12. \n' + 39 | '
  13. Tilpasningshåndtag for editor i sidefoden
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Hvis en UI-sektion ikke er til stede, springes den over.

\n' + 43 | '\n' + 44 | '

Hvis sidefoden har fokus til tastaturnavigation, og der ikke er noget synligt sidepanel, kan der trykkes på Shift+Tab\n' + 45 | ' for at flytte fokus til den første værktøjsgruppe, ikke den sidste.

\n' + 46 | '\n' + 47 | '

Naviger inden for UI-sektioner

\n' + 48 | '\n' + 49 | '

Gå fra ét UI-element til det næste ved at trykke på den relevante piletast.

\n' + 50 | '\n' + 51 | '

Venstre og højre piletast

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • flytter mellem menuerne i menulinjen.
  • \n' + 55 | '
  • åbner en undermenu i en menu.
  • \n' + 56 | '
  • flytter mellem knapperne i en værktøjsgruppe.
  • \n' + 57 | '
  • flytter mellem elementer i sidefodens sti til elementet.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Pil ned og op

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • flytter mellem menupunkterne i en menu.
  • \n' + 64 | '
  • flytter mellem punkterne i en genvejsmenu i værktøjslinjen.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Piletasterne kører rundt inden for UI-sektionen, der fokuseres på.

\n' + 68 | '\n' + 69 | '

For at lukke en åben menu, en åben undermenu eller en åben genvejsmenu trykkes der på Esc-tasten.

\n' + 70 | '\n' + 71 | "

Hvis det aktuelle fokus er i 'toppen' af en bestemt UI-sektion, vil tryk på Esc-tasten også afslutte\n" + 72 | ' tastaturnavigationen helt.

\n' + 73 | '\n' + 74 | '

Udfør et menupunkt eller en værktøjslinjeknap

\n' + 75 | '\n' + 76 | '

Når det ønskede menupunkt eller den ønskede værktøjslinjeknap er fremhævet, trykkes der på Retur, Enter\n' + 77 | ' eller mellemrumstasten for at udføre elementet.

\n' + 78 | '\n' + 79 | '

Naviger i ikke-faneopdelte dialogbokse

\n' + 80 | '\n' + 81 | '

I ikke-faneopdelte dialogbokse får den første interaktive komponent fokus, når dialogboksen åbnes.

\n' + 82 | '\n' + 83 | '

Naviger mellem interaktive dialogbokskomponenter ved at trykke på Tab eller Shift+Tab.

\n' + 84 | '\n' + 85 | '

Naviger i faneopdelte dialogbokse

\n' + 86 | '\n' + 87 | '

I faneopdelte dialogbokse får den første knap i fanemenuen fokus, når dialogboksen åbnes.

\n' + 88 | '\n' + 89 | '

Naviger mellem interaktive komponenter i denne dialogboksfane ved at trykke på Tab eller\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Skift til en anden dialogboksfane ved at fokusere på fanemenuen og derefter trykke på den relevante piletast\n' + 93 | ' for at køre igennem de tilgængelige faner.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/ar.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.ar', 2 | '

بدء التنقل بواسطة لوحة المفاتيح

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
التركيز على شريط القوائم
\n' + 6 | '
نظاما التشغيل Windows أو Linux: Alt + F9
\n' + 7 | '
نظام التشغيل macOS: ⌥F9
\n' + 8 | '
التركيز على شريط الأدوات
\n' + 9 | '
نظاما التشغيل Windows أو Linux: Alt + F10
\n' + 10 | '
نظام التشغيل macOS: ⌥F10
\n' + 11 | '
التركيز على التذييل
\n' + 12 | '
نظاما التشغيل Windows أو Linux: Alt + F11
\n' + 13 | '
نظام التشغيل macOS: ⌥F11
\n' + 14 | '
تركيز الإشعارات
\n' + 15 | '
نظاما التشغيل Windows أو Linux: Alt + F12
\n' + 16 | '
نظام التشغيل macOS: ⌥F12
\n' + 17 | '
التركيز على شريط أدوات السياق
\n' + 18 | '
أنظمة التشغيل Windows أو Linux أو macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

سيبدأ التنقل عند عنصر واجهة المستخدم الأول، والذي سيتم تمييزه أو تسطيره في حالة العنصر الأول في\n' + 22 | ' مسار عنصر التذييل.

\n' + 23 | '\n' + 24 | '

التنقل بين أقسام واجهة المستخدم

\n' + 25 | '\n' + 26 | '

للانتقال من أحد أقسام واجهة المستخدم إلى القسم التالي، اضغط على Tab.

\n' + 27 | '\n' + 28 | '

للانتقال من أحد أقسام واجهة المستخدم إلى القسم السابق، اضغط على Shift+Tab.

\n' + 29 | '\n' + 30 | '

ترتيب علامات Tab لأقسام واجهة المستخدم هذه هو:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. شريط القوائم
  2. \n' + 34 | '
  3. كل مجموعة شريط الأدوات
  4. \n' + 35 | '
  5. الشريط الجانبي
  6. \n' + 36 | '
  7. مسار العنصر في التذييل
  8. \n' + 37 | '
  9. زر تبديل عدد الكلمات في التذييل
  10. \n' + 38 | '
  11. رابط إدراج العلامة التجارية في التذييل
  12. \n' + 39 | '
  13. مؤشر تغيير حجم المحرر في التذييل
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

إذا لم يكن قسم واجهة المستخدم موجودًا، فسيتم تخطيه.

\n' + 43 | '\n' + 44 | '

إذا كان التذييل يحتوي على التركيز على ‏‫التنقل بواسطة لوحة المفاتيح، ولا يوجد شريط جانبي مرئي، فإن الضغط على Shift+Tab\n' + 45 | ' ينقل التركيز إلى مجموعة شريط الأدوات الأولى، وليس الأخيرة.

\n' + 46 | '\n' + 47 | '

التنقل بين أقسام واجهة المستخدم

\n' + 48 | '\n' + 49 | '

للانتقال من أحد عناصر واجهة المستخدم إلى العنصر التالي، اضغط على مفتاح السهم المناسب.

\n' + 50 | '\n' + 51 | '

مفتاحا السهمين اليسار‎ واليمين‎

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • التنقل بين القوائم في شريط القوائم.
  • \n' + 55 | '
  • فتح قائمة فرعية في القائمة.
  • \n' + 56 | '
  • التنقل بين الأزرار في مجموعة شريط الأدوات.
  • \n' + 57 | '
  • التنقل بين العناصر في مسار عنصر التذييل.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

مفتاحا السهمين لأسفل‎ ولأعلى‎

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • التنقل بين عناصر القائمة في القائمة.
  • \n' + 64 | '
  • التنقل بين العناصر في قائمة شريط الأدوات المنبثقة.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

دورة مفاتيح الأسهم‎ داخل قسم واجهة المستخدم التي تم التركيز عليها.

\n' + 68 | '\n' + 69 | '

لإغلاق قائمة مفتوحة أو قائمة فرعية مفتوحة أو قائمة منبثقة مفتوحة، اضغط على مفتاح Esc.

\n' + 70 | '\n' + 71 | '

إذا كان التركيز الحالي على "الجزء العلوي" من قسم معين لواجهة المستخدم، فإن الضغط على مفتاح Esc يؤدي أيضًا إلى الخروج\n' + 72 | ' من التنقل بواسطة لوحة المفاتيح بالكامل.

\n' + 73 | '\n' + 74 | '

تنفيذ عنصر قائمة أو زر شريط أدوات

\n' + 75 | '\n' + 76 | '

عندما يتم تمييز عنصر القائمة المطلوب أو زر شريط الأدوات، اضغط على زر Return، أو Enter،\n' + 77 | ' أو مفتاح المسافة لتنفيذ العنصر.

\n' + 78 | '\n' + 79 | '

التنقل في مربعات الحوار غير المبوبة

\n' + 80 | '\n' + 81 | '

في مربعات الحوار غير المبوبة، يتم التركيز على المكون التفاعلي الأول عند فتح مربع الحوار.

\n' + 82 | '\n' + 83 | '

التنقل بين مكونات الحوار التفاعلي بالضغط على زر Tab أو Shift+Tab.

\n' + 84 | '\n' + 85 | '

التنقل في مربعات الحوار المبوبة

\n' + 86 | '\n' + 87 | '

في مربعات الحوار المبوبة، يتم التركيز على الزر الأول في قائمة علامات التبويب عند فتح مربع الحوار.

\n' + 88 | '\n' + 89 | '

التنقل بين المكونات التفاعلية لعلامة التبويب لمربع الحوار هذه بالضغط على زر Tab أو\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

التبديل إلى علامة تبويب أخرى لمربع الحوار من خلال التركيز على قائمة علامة التبويب ثم الضغط على زر السهم المناسب\n' + 93 | ' مفتاح للتنقل بين علامات التبويب المتاحة.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/pt_BR.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_BR', 2 | '

Iniciar navegação pelo teclado

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Foco na barra de menus
\n' + 6 | '
Windows ou Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Foco na barra de ferramentas
\n' + 9 | '
Windows ou Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Foco no rodapé
\n' + 12 | '
Windows ou Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Foco na notificação
\n' + 15 | '
Windows ou Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Foco na barra de ferramentas contextual
\n' + 18 | '
Windows, Linux ou macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

A navegação inicia no primeiro item da IU, que será destacado ou sublinhado no caso do primeiro item no\n' + 22 | ' caminho do elemento Rodapé.

\n' + 23 | '\n' + 24 | '

Navegar entre seções da IU

\n' + 25 | '\n' + 26 | '

Para ir de uma seção da IU para a seguinte, pressione Tab.

\n' + 27 | '\n' + 28 | '

Para ir de uma seção da IU para a anterior, pressione Shift+Tab.

\n' + 29 | '\n' + 30 | '

A ordem de Tab destas seções da IU é:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Barra de menus
  2. \n' + 34 | '
  3. Cada grupo da barra de ferramentas
  4. \n' + 35 | '
  5. Barra lateral
  6. \n' + 36 | '
  7. Caminho do elemento no rodapé
  8. \n' + 37 | '
  9. Botão de alternar contagem de palavras no rodapé
  10. \n' + 38 | '
  11. Link da marca no rodapé
  12. \n' + 39 | '
  13. Alça de redimensionamento do editor no rodapé
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Se não houver uma seção da IU, ela será pulada.

\n' + 43 | '\n' + 44 | '

Se o rodapé tiver o foco da navegação pelo teclado e não houver uma barra lateral visível, pressionar Shift+Tab\n' + 45 | ' move o foco para o primeiro grupo da barra de ferramentas, não para o último.

\n' + 46 | '\n' + 47 | '

Navegar dentro das seções da IU

\n' + 48 | '\n' + 49 | '

Para ir de um elemento da IU para o seguinte, pressione a Seta correspondente.

\n' + 50 | '\n' + 51 | '

As teclas de seta Esquerda e Direita

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • movem entre menus na barra de menus.
  • \n' + 55 | '
  • abrem um submenu em um menu.
  • \n' + 56 | '
  • movem entre botões em um grupo da barra de ferramentas.
  • \n' + 57 | '
  • movem entre itens no caminho do elemento do rodapé.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

As teclas de seta Abaixo e Acima

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • movem entre itens de menu em um menu.
  • \n' + 64 | '
  • movem entre itens em um menu suspenso da barra de ferramentas.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

As teclas de Seta alternam dentre a seção da IU em foco.

\n' + 68 | '\n' + 69 | '

Para fechar um menu aberto, um submenu aberto ou um menu suspenso aberto, pressione Esc.

\n' + 70 | '\n' + 71 | '

Se o foco atual estiver no ‘alto’ de determinada seção da IU, pressionar Esc também sai\n' + 72 | ' totalmente da navegação pelo teclado.

\n' + 73 | '\n' + 74 | '

Executar um item de menu ou botão da barra de ferramentas

\n' + 75 | '\n' + 76 | '

Com o item de menu ou botão da barra de ferramentas desejado destacado, pressione Return, Enter,\n' + 77 | ' ou a Barra de espaço para executar o item.

\n' + 78 | '\n' + 79 | '

Navegar por caixas de diálogo sem guias

\n' + 80 | '\n' + 81 | '

Em caixas de diálogo sem guias, o primeiro componente interativo recebe o foco quando a caixa de diálogo abre.

\n' + 82 | '\n' + 83 | '

Navegue entre componentes interativos de caixa de diálogo pressionando Tab ou Shift+Tab.

\n' + 84 | '\n' + 85 | '

Navegar por caixas de diálogo com guias

\n' + 86 | '\n' + 87 | '

Em caixas de diálogo com guias, o primeiro botão no menu da guia recebe o foco quando a caixa de diálogo abre.

\n' + 88 | '\n' + 89 | '

Navegue entre componentes interativos dessa guia da caixa de diálogo pressionando Tab ou\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Alterne para outra guia da caixa de diálogo colocando o foco no menu da guia e pressionando a Seta\n' + 93 | ' adequada para percorrer as guias disponíveis.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/eu.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.eu', 2 | '

Hasi teklatuaren nabigazioa

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokuratu menu-barra
\n' + 6 | '
Windows edo Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokuratu tresna-barra
\n' + 9 | '
Windows edo Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokuratu orri-oina
\n' + 12 | '
Windows edo Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Fokuratu jakinarazpena
\n' + 15 | '
Windows edo Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokuratu testuinguruaren tresna-barra
\n' + 18 | '
Windows, Linux edo macOS: Ktrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Nabigazioa EIko lehen elementuan hasiko da: elementu hori nabarmendu egingo da, edo azpimarratu lehen elementua bada\n' + 22 | ' orri-oineko elementuaren bidea.

\n' + 23 | '\n' + 24 | '

Nabigatu EIko atalen artean

\n' + 25 | '\n' + 26 | '

EIko atal batetik hurrengora mugitzeko, sakatu Tabuladorea.

\n' + 27 | '\n' + 28 | '

EIko atal batetik aurrekora mugitzeko, sakatu Maius+Tabuladorea.

\n' + 29 | '\n' + 30 | '

EIko atal hauen Tabuladorea da:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menu-barra
  2. \n' + 34 | '
  3. Tresna-barraren talde bakoitza
  4. \n' + 35 | '
  5. Alboko barra
  6. \n' + 36 | '
  7. Orri-oineko elementuaren bidea
  8. \n' + 37 | '
  9. Orri-oneko urrats-kontaketa txandakatzeko botoia
  10. \n' + 38 | '
  11. Orri-oineko marken esteka
  12. \n' + 39 | '
  13. Orri-oineko editorearen tamaina aldatzeko heldulekua
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

EIko atal bat ez badago, saltatu egin da.

\n' + 43 | '\n' + 44 | '

Orri-oinak teklatuaren nabigazioa fokuratuta badago, eta alboko barra ikusgai ez badago, Maius+Tabuladorea sakatuz gero,\n' + 45 | ' fokua tresna-barrako lehen taldera eramaten da, ez azkenera.

\n' + 46 | '\n' + 47 | '

Nabigatu EIko atalen barruan

\n' + 48 | '\n' + 49 | '

EIko elementu batetik hurrengora mugitzeko, sakatu dagokion Gezia tekla.

\n' + 50 | '\n' + 51 | '

Ezkerrera eta Eskuinera gezi-teklak

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • menu-barrako menuen artean mugitzen da.
  • \n' + 55 | '
  • ireki azpimenu bat menuan.
  • \n' + 56 | '
  • mugitu botoi batetik bestera tresna-barren talde batean.
  • \n' + 57 | '
  • mugitu orri-oineko elementuaren bideko elementu batetik bestera.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Gora eta Behera gezi-teklak

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • mugitu menu bateko menu-elementuen artean.
  • \n' + 64 | '
  • mugitu tresna-barrako menu gainerakor bateko menu-elementuen artean.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Gezia teklen zikloa nabarmendutako EI atalen barruan.

\n' + 68 | '\n' + 69 | '

Irekitako menu bat ixteko, ireki azpimenua, edo ireki menu gainerakorra, sakatu Ihes tekla.

\n' + 70 | '\n' + 71 | '

Une horretan fokuratzea EIko atal jakin baten "goialdean" badago, Ihes tekla sakatuz gero\n' + 72 | ' teklatuaren nabigaziotik irtengo zara.

\n' + 73 | '\n' + 74 | '

Exekutatu menuko elementu bat edo tresna-barrako botoi bat

\n' + 75 | '\n' + 76 | '

Nahi den menuaren elementua edo tresna-barraren botoia nabarmenduta dagoenean, sakatu Itzuli, Sartu\n' + 77 | ' edo Zuriune-barra elementua exekutatzeko.

\n' + 78 | '\n' + 79 | '

Nabigatu fitxarik gabeko elkarrizketak

\n' + 80 | '\n' + 81 | '

Fitxarik gabeko elkarrizketetan, lehen osagai interaktiboa fokuratzen da elkarrizketa irekitzen denean.

\n' + 82 | '\n' + 83 | '

Nabigatu elkarrizketa interaktiboko osagai batetik bestera Tabuladorea edo Maius+Tabuladorea sakatuta.

\n' + 84 | '\n' + 85 | '

Nabigatu fitxadun elkarrizketak

\n' + 86 | '\n' + 87 | '

Fitxadun elkarrizketetan, fitxa-menuko lehen botoia fokuratzen da elkarrizketa irekitzen denean.

\n' + 88 | '\n' + 89 | '

Nabigatu elkarrizketa-fitxa honen interaktiboko osagai batetik bestera Tabuladorea edo\n' + 90 | ' Maius+Tabuladorea sakatuta.

\n' + 91 | '\n' + 92 | '

Aldatu beste elkarrizketa-fitxa batera fitxa-menua fokuratu eta dagokion Gezia\n' + 93 | ' tekla sakatzeko, erabilgarri dauden fitxa batetik bestera txandakatzeko.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/tr.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.tr', 2 | '

Klavyeyle gezintiyi başlatma

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Menü çubuğuna odaklan
\n' + 6 | '
Windows veya Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Araç çubuğuna odaklan
\n' + 9 | '
Windows veya Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Alt bilgiye odaklan
\n' + 12 | '
Windows veya Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Bildirime odakla
\n' + 15 | '
Windows veya Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Bağlamsal araç çubuğuna odaklan
\n' + 18 | '
Windows, Linux veya macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Gezinti ilk kullanıcı arabirimi öğesinden başlar, bu öğe vurgulanır ya da ilk öğe, Alt bilgi elemanı\n' + 22 | ' yolundaysa altı çizilir.

\n' + 23 | '\n' + 24 | '

Kullanıcı arabirimi bölümleri arasında gezinme

\n' + 25 | '\n' + 26 | '

Sonraki kullanıcı arabirimi bölümüne gitmek için Sekme tuşuna basın.

\n' + 27 | '\n' + 28 | '

Önceki kullanıcı arabirimi bölümüne gitmek için Shift+Sekme tuşlarına basın.

\n' + 29 | '\n' + 30 | '

Bu kullanıcı arabirimi bölümlerinin Sekme sırası:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menü çubuğu
  2. \n' + 34 | '
  3. Her araç çubuğu grubu
  4. \n' + 35 | '
  5. Kenar çubuğu
  6. \n' + 36 | '
  7. Alt bilgide öğe yolu
  8. \n' + 37 | '
  9. Alt bilgide sözcük sayısı geçiş düğmesi
  10. \n' + 38 | '
  11. Alt bilgide marka bağlantısı
  12. \n' + 39 | '
  13. Alt bilgide düzenleyiciyi yeniden boyutlandırma tutamacı
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Kullanıcı arabirimi bölümü yoksa atlanır.

\n' + 43 | '\n' + 44 | '

Alt bilgide klavyeyle gezinti odağı yoksa ve görünür bir kenar çubuğu mevcut değilse Shift+Sekme tuşlarına basıldığında\n' + 45 | ' odak son araç çubuğu yerine ilk araç çubuğu grubuna taşınır.

\n' + 46 | '\n' + 47 | '

Kullanıcı arabirimi bölümleri içinde gezinme

\n' + 48 | '\n' + 49 | '

Sonraki kullanıcı arabirimi elemanına gitmek için uygun Ok tuşuna basın.

\n' + 50 | '\n' + 51 | '

Sol ve Sağ ok tuşları

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • menü çubuğundaki menüler arasında hareket eder.
  • \n' + 55 | '
  • menüde bir alt menü açar.
  • \n' + 56 | '
  • araç çubuğu grubundaki düğmeler arasında hareket eder.
  • \n' + 57 | '
  • alt bilginin öğe yolundaki öğeler arasında hareket eder.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Aşağı ve Yukarı ok tuşları

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • menüdeki menü öğeleri arasında hareket eder.
  • \n' + 64 | '
  • araç çubuğu açılır menüsündeki öğeler arasında hareket eder.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Ok tuşları, odaklanılan kullanıcı arabirimi bölümü içinde döngüsel olarak hareket eder.

\n' + 68 | '\n' + 69 | '

Açık bir menüyü, açık bir alt menüyü veya açık bir açılır menüyü kapatmak için Esc tuşuna basın.

\n' + 70 | '\n' + 71 | '

Geçerli odak belirli bir kullanıcı arabirimi bölümünün "üst" kısmındaysa Esc tuşuna basıldığında\n' + 72 | ' klavyeyle gezintiden de tamamen çıkılır.

\n' + 73 | '\n' + 74 | '

Menü öğesini veya araç çubuğu düğmesini yürütme

\n' + 75 | '\n' + 76 | '

İstediğiniz menü öğesi veya araç çubuğu düğmesi vurgulandığında Return, Enter\n' + 77 | ' veya Ara çubuğu tuşuna basın.

\n' + 78 | '\n' + 79 | '

Sekme bulunmayan iletişim kutularında gezinme

\n' + 80 | '\n' + 81 | '

Sekme bulunmayan iletişim kutularında, iletişim kutusu açıldığında ilk etkileşimli bileşene odaklanılır.

\n' + 82 | '\n' + 83 | '

Etkileşimli iletişim kutusu bileşenleri arasında gezinmek için Sekme veya Shift+ Sekme tuşlarına basın.

\n' + 84 | '\n' + 85 | '

Sekmeli iletişim kutularında gezinme

\n' + 86 | '\n' + 87 | '

Sekmeli iletişim kutularında, iletişim kutusu açıldığında sekme menüsündeki ilk düğmeye odaklanılır.

\n' + 88 | '\n' + 89 | '

Bu iletişim kutusu sekmesinin etkileşimli bileşenleri arasında gezinmek için Sekme veya\n' + 90 | ' Shift+Sekme tuşlarına basın.

\n' + 91 | '\n' + 92 | '

Mevcut sekmeler arasında geçiş yapmak için sekme menüsüne odaklanıp uygun Ok tuşuna basarak\n' + 93 | ' başka bir iletişim kutusu sekmesine geçiş yapın.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/vi.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.vi', 2 | '

Bắt đầu điều hướng bàn phím

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Tập trung vào thanh menu
\n' + 6 | '
Windows hoặc Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Tập trung vào thanh công cụ
\n' + 9 | '
Windows hoặc Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Tập trung vào chân trang
\n' + 12 | '
Windows hoặc Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Tập trung vào thông báo
\n' + 15 | '
Windows hoặc Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Tập trung vào thanh công cụ ngữ cảnh
\n' + 18 | '
Windows, Linux hoặc macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Điều hướng sẽ bắt đầu từ mục UI đầu tiên. Mục này sẽ được tô sáng hoặc có gạch dưới (nếu là mục đầu tiên trong\n' + 22 | ' đường dẫn phần tử Chân trang).

\n' + 23 | '\n' + 24 | '

Di chuyển qua lại giữa các phần UI

\n' + 25 | '\n' + 26 | '

Để di chuyển từ một phần UI sang phần tiếp theo, ấn Tab.

\n' + 27 | '\n' + 28 | '

Để di chuyển từ một phần UI về phần trước đó, ấn Shift+Tab.

\n' + 29 | '\n' + 30 | '

Thứ tự Tab của các phần UI này như sau:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Thanh menu
  2. \n' + 34 | '
  3. Từng nhóm thanh công cụ
  4. \n' + 35 | '
  5. Thanh bên
  6. \n' + 36 | '
  7. Đường dẫn phần tử trong chân trang
  8. \n' + 37 | '
  9. Nút chuyển đổi đếm chữ ở chân trang
  10. \n' + 38 | '
  11. Liên kết thương hiệu ở chân trang
  12. \n' + 39 | '
  13. Núm điều tác chỉnh kích cỡ trình soạn thảo ở chân trang
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Nếu người dùng không thấy một phần UI, thì có nghĩa phần đó bị bỏ qua.

\n' + 43 | '\n' + 44 | '

Nếu ở chân trang có tính năng tập trung điều hướng bàn phím, mà không có thanh bên nào hiện hữu, thao tác ấn Shift+Tab\n' + 45 | ' sẽ chuyển hướng tập trung vào nhóm thanh công cụ đầu tiên, không phải cuối cùng.

\n' + 46 | '\n' + 47 | '

Di chuyển qua lại trong các phần UI

\n' + 48 | '\n' + 49 | '

Để di chuyển từ một phần tử UI sang phần tiếp theo, ấn phím Mũi tên tương ứng cho phù hợp.

\n' + 50 | '\n' + 51 | '

Các phím mũi tên TráiPhải

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • di chuyển giữa các menu trong thanh menu.
  • \n' + 55 | '
  • mở menu phụ trong một menu.
  • \n' + 56 | '
  • di chuyển giữa các nút trong nhóm thanh công cụ.
  • \n' + 57 | '
  • di chuyển giữa các mục trong đường dẫn phần tử của chân trang.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Các phím mũi tên Hướng xuốngHướng lên

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • di chuyển giữa các mục menu trong menu.
  • \n' + 64 | '
  • di chuyển giữa các mục trong menu thanh công cụ dạng bật lên.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Các phím mũi tên xoay vòng trong một phần UI tập trung.

\n' + 68 | '\n' + 69 | '

Để đóng một menu mở, một menu phụ đang mở, hoặc một menu dạng bật lên đang mở, hãy ấn phím Esc.

\n' + 70 | '\n' + 71 | '

Nếu trọng tâm hiện tại là ở phần “đầu” của một phần UI cụ thể, thao tác ấn phím Esc cũng sẽ thoát\n' + 72 | ' toàn bộ phần điều hướng bàn phím.

\n' + 73 | '\n' + 74 | '

Thực hiện chức năng của một mục menu hoặc nút thanh công cụ

\n' + 75 | '\n' + 76 | '

Khi mục menu hoặc nút thanh công cụ muốn dùng được tô sáng, hãy ấn Return, Enter,\n' + 77 | ' hoặc Phím cách để thực hiện chức năng mục đó.

\n' + 78 | '\n' + 79 | '

Điều hướng giữa các hộp thoại không có nhiều tab

\n' + 80 | '\n' + 81 | '

Trong các hộp thoại không có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào thành phần tương tác đầu tiên.

\n' + 82 | '\n' + 83 | '

Di chuyển giữa các thành phần hộp thoại tương tác bằng cách ấn Tab hoặc Shift+Tab.

\n' + 84 | '\n' + 85 | '

Điều hướng giữa các hộp thoại có nhiều tab

\n' + 86 | '\n' + 87 | '

Trong các hộp thoại có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào nút đầu tiên trong menu tab.

\n' + 88 | '\n' + 89 | '

Di chuyển giữa các thành phần tương tác của tab hộp thoại này bằng cách ấn Tab hoặc\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Chuyển sang một tab hộp thoại khác bằng cách chuyển trọng tâm vào menu tab, rồi ấn phím Mũi tên phù hợp\n' + 93 | ' để xoay vòng các tab hiện có.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/pt_PT.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_PT', 2 | '

Iniciar navegação com teclado

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Foco na barra de menu
\n' + 6 | '
Windows ou Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Foco na barra de ferramentas
\n' + 9 | '
Windows ou Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Foco no rodapé
\n' + 12 | '
Windows ou Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Focar a notificação
\n' + 15 | '
Windows ou Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Foco numa barra de ferramentas contextual
\n' + 18 | '
Windows, Linux ou macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

A navegação começará no primeiro item de IU, que estará realçado ou sublinhado, no caso do primeiro item no\n' + 22 | ' caminho do elemento do rodapé.

\n' + 23 | '\n' + 24 | '

Navegar entre secções de IU

\n' + 25 | '\n' + 26 | '

Para se mover de uma secção de IU para a seguinte, prima Tab.

\n' + 27 | '\n' + 28 | '

Para se mover de uma secção de IU para a anterior, prima Shift+Tab.

\n' + 29 | '\n' + 30 | '

A ordem de tabulação destas secções de IU é:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Barra de menu
  2. \n' + 34 | '
  3. Cada grupo da barra de ferramentas
  4. \n' + 35 | '
  5. Barra lateral
  6. \n' + 36 | '
  7. Caminho do elemento no rodapé
  8. \n' + 37 | '
  9. Botão de alternar da contagem de palavras no rodapé
  10. \n' + 38 | '
  11. Ligação da marca no rodapé
  12. \n' + 39 | '
  13. Alça de redimensionamento do editor no rodapé
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Se uma secção de IU não estiver presente, é ignorada.

\n' + 43 | '\n' + 44 | '

Se o rodapé tiver foco de navegação com teclado e não existir uma barra lateral visível, premir Shift+Tab\n' + 45 | ' move o foco para o primeiro grupo da barra de ferramentas e não para o último.

\n' + 46 | '\n' + 47 | '

Navegar nas secções de IU

\n' + 48 | '\n' + 49 | '

Para se mover de um elemento de IU para o seguinte, prima a tecla de seta adequada.

\n' + 50 | '\n' + 51 | '

As teclas de seta Para a esquerda e Para a direita

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • movem-se entre menus na barra de menu.
  • \n' + 55 | '
  • abrem um submenu num menu.
  • \n' + 56 | '
  • movem-se entre botões num grupo da barra de ferramentas.
  • \n' + 57 | '
  • movem-se entre itens no caminho do elemento do rodapé.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

As teclas de seta Para cima e Para baixo

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • movem-se entre itens de menu num menu.
  • \n' + 64 | '
  • movem-se entre itens num menu de pop-up da barra de ferramentas.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

As teclas de seta deslocam-se ciclicamente na secção de IU em foco.

\n' + 68 | '\n' + 69 | '

Para fechar um menu aberto, um submenu aberto ou um menu de pop-up aberto, prima a tecla Esc.

\n' + 70 | '\n' + 71 | '

Se o foco atual estiver no "topo" de determinada secção de IU, premir a tecla Esc também fecha\n' + 72 | ' completamente a navegação com teclado.

\n' + 73 | '\n' + 74 | '

Executar um item de menu ou botão da barra de ferramentas

\n' + 75 | '\n' + 76 | '

Quando o item de menu ou o botão da barra de ferramentas pretendido estiver realçado, prima Retrocesso, Enter\n' + 77 | ' ou a Barra de espaço para executar o item.

\n' + 78 | '\n' + 79 | '

Navegar em diálogos sem separadores

\n' + 80 | '\n' + 81 | '

Nos diálogos sem separadores, o primeiro componente interativo fica em foco quando o diálogo abre.

\n' + 82 | '\n' + 83 | '

Navegue entre componentes interativos do diálogo, premindo Tab ou Shift+Tab.

\n' + 84 | '\n' + 85 | '

Navegar em diálogos com separadores

\n' + 86 | '\n' + 87 | '

Nos diálogos com separadores, o primeiro botão no menu do separador fica em foco quando o diálogo abre.

\n' + 88 | '\n' + 89 | '

Navegue entre os componentes interativos deste separador do diálogo, premindo Tab ou\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Mude para outro separador do diálogo colocando o menu do separador em foco e, em seguida, premindo a tecla de seta\n' + 93 | ' adequada para se deslocar ciclicamente pelos separadores disponíveis.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/nl.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.nl', 2 | '

Toetsenbordnavigatie starten

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Focus op de menubalk instellen
\n' + 6 | '
Windows of Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Focus op de werkbalk instellen
\n' + 9 | '
Windows of Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Focus op de voettekst instellen
\n' + 12 | '
Windows of Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Focus op de melding instellen
\n' + 15 | '
Windows of Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Focus op een contextuele werkbalk instellen
\n' + 18 | '
Windows, Linux of macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

De navigatie start bij het eerste UI-item, dat wordt gemarkeerd of onderstreept als het eerste item zich in\n' + 22 | ' in het elementenpad van de voettekst bevindt.

\n' + 23 | '\n' + 24 | '

Navigeren tussen UI-secties

\n' + 25 | '\n' + 26 | '

Druk op Tab om naar de volgende UI-sectie te gaan.

\n' + 27 | '\n' + 28 | '

Druk op Shift+Tab om naar de vorige UI-sectie te gaan.

\n' + 29 | '\n' + 30 | '

De Tab-volgorde van deze UI-secties is:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menubalk
  2. \n' + 34 | '
  3. Elke werkbalkgroep
  4. \n' + 35 | '
  5. Zijbalk
  6. \n' + 36 | '
  7. Elementenpad in de voettekst
  8. \n' + 37 | '
  9. Wisselknop voor aantal woorden in de voettekst
  10. \n' + 38 | '
  11. Merkkoppeling in de voettekst
  12. \n' + 39 | '
  13. Greep voor het wijzigen van het formaat van de editor in de voettekst
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Als een UI-sectie niet aanwezig is, wordt deze overgeslagen.

\n' + 43 | '\n' + 44 | '

Als de focus van de toetsenbordnavigatie is ingesteld op de voettekst en er geen zichtbare zijbalk is, kun je op Shift+Tab drukken\n' + 45 | ' om de focus naar de eerste werkbalkgroep in plaats van de laatste te verplaatsen.

\n' + 46 | '\n' + 47 | '

Navigeren binnen UI-secties

\n' + 48 | '\n' + 49 | '

Druk op de pijltjestoets om naar het betreffende UI-element te gaan.

\n' + 50 | '\n' + 51 | '

Met de pijltjestoetsen Links en Rechts

\n' + 52 | '\n' + 53 | '
    \n' + 54 | "
  • wissel je tussen menu's in de menubalk.
  • \n" + 55 | '
  • open je een submenu in een menu.
  • \n' + 56 | '
  • wissel je tussen knoppen in een werkbalkgroep.
  • \n' + 57 | '
  • wissel je tussen items in het elementenpad in de voettekst.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Met de pijltjestoetsen Omlaag en Omhoog

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • wissel je tussen menu-items in een menu.
  • \n' + 64 | '
  • wissel je tussen items in een werkbalkpop-upmenu.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Met de pijltjestoetsen wissel je binnen de UI-sectie waarop de focus is ingesteld.

\n' + 68 | '\n' + 69 | '

Druk op de toets Esc om een geopend menu, submenu of pop-upmenu te sluiten.

\n' + 70 | '\n' + 71 | "

Als de huidige focus is ingesteld 'bovenaan' een bepaalde UI-sectie, kun je op de toets Esc drukken\n" + 72 | ' om de toetsenbordnavigatie af te sluiten.

\n' + 73 | '\n' + 74 | '

Een menu-item of werkbalkknop uitvoeren

\n' + 75 | '\n' + 76 | '

Als het gewenste menu-item of de gewenste werkbalkknop is gemarkeerd, kun je op Return, Enter\n' + 77 | ' of de spatiebalk drukken om het item uit te voeren.

\n' + 78 | '\n' + 79 | '

Navigeren in dialoogvensters zonder tabblad

\n' + 80 | '\n' + 81 | '

Als een dialoogvenster zonder tabblad wordt geopend, wordt de focus ingesteld op het eerste interactieve onderdeel.

\n' + 82 | '\n' + 83 | '

Je kunt navigeren tussen interactieve onderdelen van een dialoogvenster door op Tab of Shift+Tab te drukken.

\n' + 84 | '\n' + 85 | '

Navigeren in dialoogvensters met tabblad

\n' + 86 | '\n' + 87 | '

Als een dialoogvenster met tabblad wordt geopend, wordt de focus ingesteld op de eerste knop in het tabbladmenu.

\n' + 88 | '\n' + 89 | '

Je kunt navigeren tussen interactieve onderdelen van dit tabblad van het dialoogvenster door op Tab of\n' + 90 | ' Shift+Tab te drukken.

\n' + 91 | '\n' + 92 | '

Je kunt overschakelen naar een ander tabblad van het dialoogvenster door de focus in te stellen op het tabbladmenu en vervolgens op de juiste pijltjestoets\n' + 93 | ' te drukken om tussen de beschikbare tabbladen te wisselen.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/nb_NO.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO', 2 | '

Starte tastaturnavigering

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Utheve menylinjen
\n' + 6 | '
Windows eller Linux: Alt + F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Utheve verktøylinjen
\n' + 9 | '
Windows eller Linux: Alt + F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Utheve bunnteksten
\n' + 12 | '
Windows eller Linux: Alt + F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Fokuser på varselet
\n' + 15 | '
Windows eller Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Utheve en kontekstuell verktøylinje
\n' + 18 | '
Windows, Linux eller macOS: Ctrl + F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigeringen starter ved det første grensesnittelementet, som utheves, eller understrekes når det gjelder det første elementet i\n' + 22 | ' elementstien i bunnteksten.

\n' + 23 | '\n' + 24 | '

Navigere mellom grensesnittdeler

\n' + 25 | '\n' + 26 | '

Du kan bevege deg fra én grensesnittdel til den neste ved å trykke på tabulatortasten.

\n' + 27 | '\n' + 28 | '

Du kan bevege deg fra én grensesnittdel til den forrige ved å trykke på Shift + tabulatortasten.

\n' + 29 | '\n' + 30 | '

Rekkefølgen til tabulatortasten gjennom grensesnittdelene er:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menylinjen
  2. \n' + 34 | '
  3. Hver gruppe på verktøylinjen
  4. \n' + 35 | '
  5. Sidestolpen
  6. \n' + 36 | '
  7. Elementstien i bunnteksten
  8. \n' + 37 | '
  9. Veksleknappen for ordantall i bunnteksten
  10. \n' + 38 | '
  11. Merkelenken i bunnteksten
  12. \n' + 39 | '
  13. Skaleringshåndtaket for redigeringsprogrammet i bunnteksten
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Hvis en grensesnittdel ikke er til stede, blir den hoppet over.

\n' + 43 | '\n' + 44 | '

Hvis tastaturnavigeringen har uthevet bunnteksten og det ikke finnes en synlig sidestolpe, kan du trykke på Shift + tabulatortasten\n' + 45 | ' for å flytte fokuset til den første gruppen på verktøylinjen i stedet for den siste.

\n' + 46 | '\n' + 47 | '

Navigere innenfor grensesnittdeler

\n' + 48 | '\n' + 49 | '

Du kan bevege deg fra ett grensesnittelement til det neste ved å trykke på den aktuelle piltasten.

\n' + 50 | '\n' + 51 | '

De venstre og høyre piltastene

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • beveger deg mellom menyer på menylinjen.
  • \n' + 55 | '
  • åpner en undermeny i en meny.
  • \n' + 56 | '
  • beveger deg mellom knapper i en gruppe på verktøylinjen.
  • \n' + 57 | '
  • beveger deg mellom elementer i elementstien i bunnteksten.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Ned- og opp-piltastene

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • beveger deg mellom menyelementer i en meny.
  • \n' + 64 | '
  • beveger deg mellom elementer i en hurtigmeny på verktøylinjen.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Med piltastene kan du bevege deg innenfor den uthevede grensesnittdelen.

\n' + 68 | '\n' + 69 | '

Du kan lukke en åpen meny, en åpen undermeny eller en åpen hurtigmeny ved å klikke på Esc-tasten.

\n' + 70 | '\n' + 71 | '

Hvis det øverste nivået i en grensesnittdel er uthevet, kan du ved å trykke på Esc også avslutte\n' + 72 | ' tastaturnavigeringen helt.

\n' + 73 | '\n' + 74 | '

Utføre et menyelement eller en knapp på en verktøylinje

\n' + 75 | '\n' + 76 | '

Når det ønskede menyelementet eller verktøylinjeknappen er uthevet, trykker du på Retur, Enter,\n' + 77 | ' eller mellomromstasten for å utføre elementet.

\n' + 78 | '\n' + 79 | '

Navigere i dialogbokser uten faner

\n' + 80 | '\n' + 81 | '

I dialogbokser uten faner blir den første interaktive komponenten uthevet når dialogboksen åpnes.

\n' + 82 | '\n' + 83 | '

Naviger mellom interaktive komponenter i dialogboksen ved å trykke på tabulatortasten eller Shift + tabulatortasten.

\n' + 84 | '\n' + 85 | '

Navigere i fanebaserte dialogbokser

\n' + 86 | '\n' + 87 | '

I fanebaserte dialogbokser blir den første knappen i fanemenyen uthevet når dialogboksen åpnes.

\n' + 88 | '\n' + 89 | '

Naviger mellom interaktive komponenter i fanen ved å trykke på tabulatortasten eller\n' + 90 | ' Shift + tabulatortasten.

\n' + 91 | '\n' + 92 | '

Veksle til en annen fane i dialogboksen ved å utheve fanemenyen, og trykk deretter på den aktuelle piltasten\n' + 93 | ' for å bevege deg mellom de tilgjengelige fanene.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/hu_HU.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.hu_HU', 2 | '

Billentyűzetes navigáció indítása

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fókusz a menüsávra
\n' + 6 | '
Windows és Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fókusz az eszköztárra
\n' + 9 | '
Windows és Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fókusz a láblécre
\n' + 12 | '
Windows és Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Ráközelítés az értesítésre
\n' + 15 | '
Windows vagy Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fókusz egy környezetfüggő eszköztárra
\n' + 18 | '
Windows, Linux és macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

A navigáció az első felhasználói felületi elemnél kezdődik, amelyet a rendszer kiemel, illetve aláhúz, amennyiben az az első elem\n' + 22 | ' a lábléc elemútvonalán.

\n' + 23 | '\n' + 24 | '

Navigálás a felhasználói felület szakaszai között

\n' + 25 | '\n' + 26 | '

A felhasználói felület következő szakaszára váltáshoz nyomja meg a Tab billentyűt.

\n' + 27 | '\n' + 28 | '

A felhasználói felület előző szakaszára váltáshoz nyomja meg a Shift+Tab billentyűt.

\n' + 29 | '\n' + 30 | '

A Tab billentyűvel a felhasználói felület szakaszai között a következő sorrendben vált:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menüsáv
  2. \n' + 34 | '
  3. Az egyes eszköztárcsoportok
  4. \n' + 35 | '
  5. Oldalsáv
  6. \n' + 36 | '
  7. Elemútvonal a láblécen
  8. \n' + 37 | '
  9. Szószámátkapcsoló gomb a láblécen
  10. \n' + 38 | '
  11. Márkalink a láblécen
  12. \n' + 39 | '
  13. Szerkesztő átméretezési fogópontja a láblécen
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Ha a felhasználói felület valamelyik eleme nincs jelen, a rendszer kihagyja.

\n' + 43 | '\n' + 44 | '

Ha a billentyűzetes navigáció fókusza a láblécen van, és nincs látható oldalsáv, a Shift+Tab\n' + 45 | ' billentyűkombináció lenyomásakor az első eszköztárcsoportra ugrik a fókusz, nem az utolsóra.

\n' + 46 | '\n' + 47 | '

Navigálás a felhasználói felület szakaszain belül

\n' + 48 | '\n' + 49 | '

A felhasználói felület következő elemére váltáshoz nyomja meg a megfelelő nyílbillentyűt.

\n' + 50 | '\n' + 51 | '

A bal és a jobb nyílgomb

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • a menüsávban a menük között vált.
  • \n' + 55 | '
  • a menükben megnyit egy almenüt.
  • \n' + 56 | '
  • az eszköztárcsoportban a gombok között vált.
  • \n' + 57 | '
  • a lábléc elemútvonalán az elemek között vált.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

A le és a fel nyílgomb

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • a menükben a menüpontok között vált.
  • \n' + 64 | '
  • az eszköztár előugró menüjében az elemek között vált.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

A nyílbillentyűk lenyomásával körkörösen lépkedhet a fókuszban lévő felhasználói felületi szakasz elemei között.

\n' + 68 | '\n' + 69 | '

A megnyitott menüket, almenüket és előugró menüket az Esc billentyűvel zárhatja be.

\n' + 70 | '\n' + 71 | '

Ha a fókusz az aktuális felületi elem „felső” részén van, az Esc billentyűvel az egész\n' + 72 | ' billentyűzetes navigációból kilép.

\n' + 73 | '\n' + 74 | '

Menüpont vagy eszköztárgomb aktiválása

\n' + 75 | '\n' + 76 | '

Amikor a kívánt menüelem vagy eszköztárgomb van kijelölve, nyomja meg a Return, az Enter\n' + 77 | ' vagy a Szóköz billentyűt az adott elem vagy gomb aktiválásához.

\n' + 78 | '\n' + 79 | '

Navigálás a lapokkal nem rendelkező párbeszédablakokban

\n' + 80 | '\n' + 81 | '

A lapokkal nem rendelkező párbeszédablakokban az első interaktív összetevő kapja a fókuszt, amikor a párbeszédpanel megnyílik.

\n' + 82 | '\n' + 83 | '

A párbeszédpanelek interaktív összetevői között a Tab vagy a Shift+Tab billentyűvel navigálhat.

\n' + 84 | '\n' + 85 | '

Navigálás a lapokkal rendelkező párbeszédablakokban

\n' + 86 | '\n' + 87 | '

A lapokkal rendelkező párbeszédablakokban a lapmenü első gombja kapja a fókuszt, amikor a párbeszédpanel megnyílik.

\n' + 88 | '\n' + 89 | '

A párbeszédpanel e lapjának interaktív összetevői között a Tab vagy\n' + 90 | ' Shift+Tab billentyűvel navigálhat.

\n' + 91 | '\n' + 92 | '

A párbeszédablak másik lapjára úgy léphet, hogy a fókuszt a lapmenüre állítja, majd lenyomja a megfelelő nyílbillentyűt\n' + 93 | ' a rendelkezésre álló lapok közötti lépkedéshez.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/cs.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', 2 | '

Začínáme navigovat pomocí klávesnice

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Přejít na řádek nabídek
\n' + 6 | '
Windows nebo Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Přejít na panel nástrojů
\n' + 9 | '
Windows nebo Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Přejít na zápatí
\n' + 12 | '
Windows nebo Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Přejít na oznámení
\n' + 15 | '
Windows nebo Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Přejít na kontextový panel nástrojů
\n' + 18 | '
Windows, Linux nebo macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Navigace začne u první položky uživatelského rozhraní, která bude zvýrazněna nebo v případě první položky\n' + 22 | ' cesty k prvku zápatí podtržena.

\n' + 23 | '\n' + 24 | '

Navigace mezi oddíly uživatelského rozhraní

\n' + 25 | '\n' + 26 | '

Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.

\n' + 27 | '\n' + 28 | '

Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.

\n' + 29 | '\n' + 30 | '

Pořadí přepínání mezi oddíly uživatelského rozhraní pomocí klávesy Tab:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Řádek nabídek
  2. \n' + 34 | '
  3. Každá skupina panelu nástrojů
  4. \n' + 35 | '
  5. Boční panel
  6. \n' + 36 | '
  7. Cesta k prvku v zápatí.
  8. \n' + 37 | '
  9. Tlačítko přepínače počtu slov v zápatí
  10. \n' + 38 | '
  11. Odkaz na informace o značce v zápatí
  12. \n' + 39 | '
  13. Úchyt pro změnu velikosti editoru v zápatí
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Pokud nějaký oddíl uživatelského rozhraní není přítomen, je přeskočen.

\n' + 43 | '\n' + 44 | '

Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boční panel, stisknutím kláves Shift+Tab\n' + 45 | ' přejdete na první skupinu panelu nástrojů, nikoli na poslední.

\n' + 46 | '\n' + 47 | '

Navigace v rámci oddílů uživatelského rozhraní

\n' + 48 | '\n' + 49 | '

Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou.

\n' + 50 | '\n' + 51 | '

Klávesy s šipkou vlevovpravo

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • umožňují přesun mezi nabídkami na řádku nabídek;
  • \n' + 55 | '
  • otevírají podnabídku nabídky;
  • \n' + 56 | '
  • umožňují přesun mezi tlačítky ve skupině panelu nástrojů;
  • \n' + 57 | '
  • umožňují přesun mezi položkami cesty prvku v zápatí.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Klávesy se šipkou dolůnahoru

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • umožňují přesun mezi položkami nabídky;
  • \n' + 64 | '
  • umožňují přesun mezi položkami místní nabídky panelu nástrojů.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.

\n' + 68 | '\n' + 69 | '

Chcete-li zavřít otevřenou nabídku, podnabídku nebo místní nabídku, stiskněte klávesu Esc.

\n' + 70 | '\n' + 71 | '

Pokud je aktuálně vybrána horní část oddílu uživatelského rozhraní, stisknutím klávesy Esc zcela ukončíte také\n' + 72 | ' navigaci pomocí klávesnice.

\n' + 73 | '\n' + 74 | '

Provedení příkazu položky nabídky nebo tlačítka panelu nástrojů

\n' + 75 | '\n' + 76 | '

Pokud je zvýrazněna požadovaná položka nabídky nebo tlačítko panelu nástrojů, stisknutím klávesy Return, Enter\n' + 77 | ' nebo mezerníku provedete příslušný příkaz.

\n' + 78 | '\n' + 79 | '

Navigace v dialogových oknech bez záložek

\n' + 80 | '\n' + 81 | '

Při otevření dialogových oken bez záložek přejdete na první interaktivní komponentu.

\n' + 82 | '\n' + 83 | '

Přecházet mezi interaktivními komponentami dialogového okna můžete stisknutím klávesy Tab nebo kombinace Shift+Tab.

\n' + 84 | '\n' + 85 | '

Navigace v dialogových oknech se záložkami

\n' + 86 | '\n' + 87 | '

Při otevření dialogových oken se záložkami přejdete na první tlačítko v nabídce záložek.

\n' + 88 | '\n' + 89 | '

Přecházet mezi interaktivními komponentami této záložky dialogového okna můžete stisknutím klávesy Tab nebo\n' + 90 | ' kombinace Shift+Tab.

\n' + 91 | '\n' + 92 | '

Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky\n' + 93 | ' přepínat mezi dostupnými záložkami.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/kk.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.kk', 2 | '

Пернетақта навигациясын бастау

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Мәзір жолағын фокустау
\n' + 6 | '
Windows немесе Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Құралдар тақтасын фокустау
\n' + 9 | '
Windows немесе Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Төменгі деректемені фокустау
\n' + 12 | '
Windows немесе Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Хабарландыруды белгілеу
\n' + 15 | '
Windows немесе Linux: Alt+F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Мәтінмәндік құралдар тақтасын фокустау
\n' + 18 | '
Windows, Linux немесе macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Навигация бөлектелетін немесе Төменгі деректеме элементінің жолындағы бірінші элемент жағдайында асты сызылатын\n' + 22 | ' бірінші ПИ элементінен басталады.

\n' + 23 | '\n' + 24 | '

ПИ бөлімдері арасында навигациялау

\n' + 25 | '\n' + 26 | '

Бір ПИ бөлімінен келесісіне өту үшін Tab пернесін басыңыз.

\n' + 27 | '\n' + 28 | '

Бір ПИ бөлімінен алдыңғысына өту үшін Shift+Tab пернесін басыңыз.

\n' + 29 | '\n' + 30 | '

Осы ПИ бөлімдерінің Tab реті:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Мәзір жолағы
  2. \n' + 34 | '
  3. Әрбір құралдар тақтасы тобы
  4. \n' + 35 | '
  5. Бүйірлік жолақ
  6. \n' + 36 | '
  7. Төменгі деректемедегі элемент жолы
  8. \n' + 37 | '
  9. Төменгі деректемедегі сөздер санын ауыстыру түймесі
  10. \n' + 38 | '
  11. Төменгі деректемедегі брендингтік сілтеме
  12. \n' + 39 | '
  13. Төменгі деректемедегі редактор өлшемін өзгерту тұтқасы
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

ПИ бөлімі көрсетілмесе, ол өткізіп жіберіледі.

\n' + 43 | '\n' + 44 | '

Төменгі деректемеде пернетақта навигациясының фокусы болса және бүйірлік жолақ көрінбесе, Shift+Tab тіркесімін басу әрекеті\n' + 45 | ' фокусты соңғысы емес, бірінші құралдар тақтасы тобына жылжытады.

\n' + 46 | '\n' + 47 | '

ПИ бөлімдерінде навигациялау

\n' + 48 | '\n' + 49 | '

Бір ПИ элементінен келесісіне өту үшін Arrow (Көрсеткі) пернесін басыңыз.

\n' + 50 | '\n' + 51 | '

Left (Сол жақ) және Right (Оң жақ) көрсеткі пернелері

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • мәзір жолағындағы мәзірлер арасында жылжыту.
  • \n' + 55 | '
  • мәзірде ішкі мәзірді ашу.
  • \n' + 56 | '
  • құралдар тақтасы тобындағы түймелер арасында жылжыту.
  • \n' + 57 | '
  • төменгі деректеме элементінің жолындағы элементтер арасында жылжыту.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Down (Төмен) және Up (Жоғары) көрсеткі пернелері

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • мәзірдегі мәзір элементтері арасында жылжыту.
  • \n' + 64 | '
  • құралдар тақтасының ашылмалы мәзіріндегі мәзір элементтері арасында жылжыту.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Фокусталған ПИ бөліміндегі Arrow (Көрсеткі) пернелерінің циклі.

\n' + 68 | '\n' + 69 | '

Ашық мәзірді жабу үшін ішкі мәзірді ашып немесе ашылмалы мәзірді ашып, Esc пернесін басыңыз.

\n' + 70 | '\n' + 71 | '

Ағымдағы фокус белгілі бір ПИ бөлімінің «үстінде» болса, Esc пернесін басу әрекеті пернетақта\n' + 72 | ' навигациясын толығымен жабады.

\n' + 73 | '\n' + 74 | '

Мәзір элементін немесе құралдар тақтасы түймесін орындау

\n' + 75 | '\n' + 76 | '

Қажетті мәзір элементі немесе құралдар тақтасы түймесі бөлектелген кезде, элементті орындау үшін Return (Қайтару), Enter (Енгізу)\n' + 77 | ' немесе Space bar (Бос орын) пернесін басыңыз.

\n' + 78 | '\n' + 79 | '

Белгіленбеген диалог терезелерін навигациялау

\n' + 80 | '\n' + 81 | '

Белгіленбеген диалог терезелерінде диалог терезесі ашылған кезде бірінші интерактивті құрамдас фокусталады.

\n' + 82 | '\n' + 83 | '

Tab немесе Shift+Tab пернесін басу арқылы интерактивті диалог терезесінің құрамдастары арасында навигациялаңыз.

\n' + 84 | '\n' + 85 | '

Белгіленген диалог терезелерін навигациялау

\n' + 86 | '\n' + 87 | '

Белгіленген диалог терезелерінде диалог терезесі ашылған кезде қойынды мәзіріндегі бірінші түйме фокусталады.

\n' + 88 | '\n' + 89 | '

Tab немесе\n' + 90 | ' Shift+Tab пернесін басу арқылы осы диалог терезесі қойындысының интерактивті құрамдастары арасында навигациялаңыз.

\n' + 91 | '\n' + 92 | '

Қойынды мәзірінің фокусын беру арқылы басқа диалог терезесінің қойындысына ауысып, тиісті Arrow (Көрсеткі)\n' + 93 | ' пернесін басу арқылы қолжетімді қойындылар арасында айналдыруға болады.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/sl_SI.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.sl_SI', 2 | '

Začetek krmarjenja s tipkovnico

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Fokus na menijsko vrstico
\n' + 6 | '
Windows ali Linux: Alt + F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Fokus na orodno vrstico
\n' + 9 | '
Windows ali Linux: Alt + F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Fokus na nogo
\n' + 12 | '
Windows ali Linux: Alt + F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Označitev obvestila
\n' + 15 | '
Windows ali Linux: Alt + F12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Fokus na kontekstualno orodno vrstico
\n' + 18 | '
Windows, Linux ali macOS: Ctrl + F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Krmarjenje se bo začelo s prvim elementom uporabniškega vmesnika, ki bo izpostavljena ali podčrtan, če gre za prvi element na\n' + 22 | ' poti do elementa noge.

\n' + 23 | '\n' + 24 | '

Krmarjenje med razdelki uporabniškega vmesnika

\n' + 25 | '\n' + 26 | '

Če se želite pomakniti z enega dela uporabniškega vmesnika na naslednjega, pritisnite tabulatorko.

\n' + 27 | '\n' + 28 | '

Če se želite pomakniti z enega dela uporabniškega vmesnika na prejšnjega, pritisnite shift + tabulatorko.

\n' + 29 | '\n' + 30 | '

Zaporedje teh razdelkov uporabniškega vmesnika, ko pritiskate tabulatorko, je:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Menijska vrstica
  2. \n' + 34 | '
  3. Posamezne skupine orodne vrstice
  4. \n' + 35 | '
  5. Stranska vrstica
  6. \n' + 36 | '
  7. Pod do elementa v nogi
  8. \n' + 37 | '
  9. Gumb za preklop štetja besed v nogi
  10. \n' + 38 | '
  11. Povezava do blagovne znamke v nogi
  12. \n' + 39 | '
  13. Ročaj za spreminjanje velikosti urejevalnika v nogi
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Če razdelek uporabniškega vmesnika ni prisoten, je preskočen.

\n' + 43 | '\n' + 44 | '

Če ima noga fokus za krmarjenje s tipkovnico in ni vidne stranske vrstice, s pritiskom na shift + tabulatorko\n' + 45 | ' fokus premaknete na prvo skupino orodne vrstice, ne zadnjo.

\n' + 46 | '\n' + 47 | '

Krmarjenje v razdelkih uporabniškega vmesnika

\n' + 48 | '\n' + 49 | '

Če se želite premakniti z enega elementa uporabniškega vmesnika na naslednjega, pritisnite ustrezno puščično tipko.

\n' + 50 | '\n' + 51 | '

Leva in desna puščična tipka

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • omogočata premikanje med meniji v menijski vrstici.
  • \n' + 55 | '
  • odpreta podmeni v meniju.
  • \n' + 56 | '
  • omogočata premikanje med gumbi v skupini orodne vrstice.
  • \n' + 57 | '
  • omogočata premikanje med elementi na poti do elementov noge.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Spodnja in zgornja puščična tipka

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • omogočata premikanje med elementi menija.
  • \n' + 64 | '
  • omogočata premikanje med elementi v pojavnem meniju orodne vrstice.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

Puščične tipke omogočajo kroženje znotraj razdelka uporabniškega vmesnika, na katerem je fokus.

\n' + 68 | '\n' + 69 | '

Če želite zapreti odprt meni, podmeni ali pojavni meni, pritisnite tipko Esc.

\n' + 70 | '\n' + 71 | '

Če je trenutni fokus na »vrhu« določenega razdelka uporabniškega vmesnika, s pritiskom tipke Esc zaprete\n' + 72 | ' tudi celotno krmarjenje s tipkovnico.

\n' + 73 | '\n' + 74 | '

Izvajanje menijskega elementa ali gumba orodne vrstice

\n' + 75 | '\n' + 76 | '

Ko je označen želeni menijski element ali orodja vrstica, pritisnite vračalko, Enter\n' + 77 | ' ali preslednico, da izvedete element.

\n' + 78 | '\n' + 79 | '

Krmarjenje po pogovornih oknih brez zavihkov

\n' + 80 | '\n' + 81 | '

Ko odprete pogovorno okno brez zavihkov, ima fokus prva interaktivna komponenta.

\n' + 82 | '\n' + 83 | '

Med interaktivnimi komponentami pogovornega okna se premikate s pritiskom tabulatorke ali kombinacije tipke shift + tabulatorke.

\n' + 84 | '\n' + 85 | '

Krmarjenje po pogovornih oknih z zavihki

\n' + 86 | '\n' + 87 | '

Ko odprete pogovorno okno z zavihki, ima fokus prvi gumb v meniju zavihka.

\n' + 88 | '\n' + 89 | '

Med interaktivnimi komponentami tega zavihka pogovornega okna se premikate s pritiskom tabulatorke ali\n' + 90 | ' kombinacije tipke shift + tabulatorke.

\n' + 91 | '\n' + 92 | '

Na drug zavihek pogovornega okna preklopite tako, da fokus prestavite na meni zavihka in nato pritisnete ustrezno puščično\n' + 93 | ' tipko, da se pomaknete med razpoložljivimi zavihki.

\n'); -------------------------------------------------------------------------------- /tinymce/static/tinymce/plugins/help/js/i18n/keynav/ru.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('tinymce.html-i18n.help-keynav.ru', 2 | '

Начните управление с помощью клавиатуры

\n' + 3 | '\n' + 4 | '
\n' + 5 | '
Фокус на панели меню
\n' + 6 | '
Windows или Linux: Alt+F9
\n' + 7 | '
macOS: ⌥F9
\n' + 8 | '
Фокус на панели инструментов
\n' + 9 | '
Windows или Linux: Alt+F10
\n' + 10 | '
macOS: ⌥F10
\n' + 11 | '
Фокус на нижнем колонтитуле
\n' + 12 | '
Windows или Linux: Alt+F11
\n' + 13 | '
macOS: ⌥F11
\n' + 14 | '
Фокус на уведомлении
\n' + 15 | '
Windows или Linux: Alt+12
\n' + 16 | '
macOS: ⌥F12
\n' + 17 | '
Фокус на контекстной панели инструментов
\n' + 18 | '
Windows, Linux или macOS: Ctrl+F9
\n' + 19 | '
\n' + 20 | '\n' + 21 | '

Первый доступный для управления элемент интерфейса будет выделен цветом или подчеркнут (если он находится\n' + 22 | ' в пути элементов нижнего колонтитула).

\n' + 23 | '\n' + 24 | '

Переход между разделами пользовательского интерфейса

\n' + 25 | '\n' + 26 | '

Чтобы перейти из текущего раздела интерфейса в следующий, нажмите Tab.

\n' + 27 | '\n' + 28 | '

Чтобы перейти из текущего раздела интерфейса в предыдущий, нажмите Shift+Tab.

\n' + 29 | '\n' + 30 | '

Вкладки разделов интерфейса расположены в следующем порядке:

\n' + 31 | '\n' + 32 | '
    \n' + 33 | '
  1. Панель меню
  2. \n' + 34 | '
  3. Группы панели инструментов
  4. \n' + 35 | '
  5. Боковая панель
  6. \n' + 36 | '
  7. Путь элементов нижнего колонтитула
  8. \n' + 37 | '
  9. Подсчет слов/символов в нижнем колонтитуле
  10. \n' + 38 | '
  11. Брендовая ссылка в нижнем колонтитуле
  12. \n' + 39 | '
  13. Угол для изменения размера окна редактора
  14. \n' + 40 | '
\n' + 41 | '\n' + 42 | '

Если раздел интерфейса отсутствует, он пропускается.

\n' + 43 | '\n' + 44 | '

Если при управлении с клавиатуры фокус находится на нижнем колонтитуле, а видимая боковая панель отсутствует, то при нажатии сочетания клавиш Shift+Tab\n' + 45 | ' фокус переносится на первую группу панели инструментов, а не на последнюю.

\n' + 46 | '\n' + 47 | '

Переход между элементами внутри разделов пользовательского интерфейса

\n' + 48 | '\n' + 49 | '

Чтобы перейти от текущего элемента интерфейса к следующему, нажмите соответствующую клавишу со стрелкой.

\n' + 50 | '\n' + 51 | '

Клавиши со стрелками влево и вправо позволяют

\n' + 52 | '\n' + 53 | '
    \n' + 54 | '
  • перемещаться между разными меню в панели меню.
  • \n' + 55 | '
  • открывать разделы меню.
  • \n' + 56 | '
  • перемещаться между кнопками в группе панели инструментов.
  • \n' + 57 | '
  • перемещаться между элементами в пути элементов нижнего колонтитула.
  • \n' + 58 | '
\n' + 59 | '\n' + 60 | '

Клавиши со стрелками вниз и вверх позволяют

\n' + 61 | '\n' + 62 | '
    \n' + 63 | '
  • перемещаться между элементами одного меню.
  • \n' + 64 | '
  • перемещаться между элементами всплывающего меню в панели инструментов.
  • \n' + 65 | '
\n' + 66 | '\n' + 67 | '

При использовании клавиш со стрелками вы будете циклически перемещаться по элементам в пределах выбранного раздела интерфейса.

\n' + 68 | '\n' + 69 | '

Чтобы закрыть открытое меню, его раздел или всплывающее меню, нажмите клавишу Esc.

\n' + 70 | '\n' + 71 | '

Если фокус находится наверху какого-либо раздела интерфейса, нажатие клавиши Esc также приведет\n' + 72 | ' к выходу из режима управления с помощью клавиатуры.

\n' + 73 | '\n' + 74 | '

Использование элемента меню или кнопки на панели инструментов

\n' + 75 | '\n' + 76 | '

Когда элемент меню или кнопка панели инструментов будут выделены, нажмите Return, Enter\n' + 77 | ' или Space, чтобы их активировать.

\n' + 78 | '\n' + 79 | '

Управление в диалоговом окне без вкладок

\n' + 80 | '\n' + 81 | '

При открытии диалогового окна без вкладок фокус переносится на первый интерактивный компонент.

\n' + 82 | '\n' + 83 | '

Для перехода между интерактивными компонентами диалогового окна нажимайте Tab или Shift+Tab.

\n' + 84 | '\n' + 85 | '

Управление в диалоговом окне с вкладками

\n' + 86 | '\n' + 87 | '

При открытии диалогового окна с вкладками фокус переносится на первую кнопку в меню вкладок.

\n' + 88 | '\n' + 89 | '

Для перехода между интерактивными компонентами этой вкладки диалогового окна нажимайте Tab или\n' + 90 | ' Shift+Tab.

\n' + 91 | '\n' + 92 | '

Для перехода на другую вкладку диалогового окна переместите фокус на меню вкладок, а затем используйте клавиши со стрелками\n' + 93 | ' для циклического переключения между доступными вкладками.

\n'); --------------------------------------------------------------------------------