├── src ├── test │ ├── resources │ │ ├── dummy.txt │ │ ├── LookAndFeel │ │ │ ├── [Test1] test1.htm │ │ │ ├── [Test1] test2.htm │ │ │ ├── [Test2] test3.htm │ │ │ ├── [Test3] test1.htm │ │ │ └── MetaData │ │ │ │ └── tag_info.xml │ │ ├── OwnNoteEditorManager.jpg │ │ ├── [Test] TestVerify_OK.htm │ │ ├── [Test] TestLinks.htm │ │ ├── MetaData │ │ │ └── tag_info.xml │ │ ├── [Test] TestVerify_DUPL_ID.htm │ │ ├── [Test] TestVerify_ADD_ATTR.htm │ │ ├── [Test] TestVerify_DUPL_COM.htm │ │ └── [Test] TestTasks.htm │ └── java │ │ └── tf │ │ └── ownnote │ │ └── ui │ │ ├── testsuites │ │ └── NonUITests.java │ │ └── notes │ │ └── TestNoteAppVersion.java └── main │ ├── resources │ ├── css │ │ ├── delete.png │ │ ├── delete-hover.png │ │ ├── customize-metro.min.css │ │ └── customize-metro.css │ ├── insertimage.png │ ├── insertcheckbox.png │ ├── OwnNoteEditorManager.ico │ ├── OwnNoteEditorManager.png │ ├── tinymce │ │ ├── tinymce_5.10.7.7z │ │ ├── langs │ │ │ └── README.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 │ │ │ ├── preview │ │ │ │ └── plugin.min.js │ │ │ ├── autoresize │ │ │ │ └── plugin.min.js │ │ │ ├── anchor │ │ │ │ └── plugin.min.js │ │ │ ├── help.6.8.2 │ │ │ │ └── js │ │ │ │ │ └── i18n │ │ │ │ │ └── keynav │ │ │ │ │ ├── zh_CN.js │ │ │ │ │ ├── zh_TW.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── ko_KR.js │ │ │ │ │ ├── he_IL.js │ │ │ │ │ ├── th_TH.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── hi.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── sv_SE.js │ │ │ │ │ ├── da.js │ │ │ │ │ ├── id.js │ │ │ │ │ ├── ar.js │ │ │ │ │ ├── pt_BR.js │ │ │ │ │ ├── eu.js │ │ │ │ │ ├── tr.js │ │ │ │ │ └── vi.js │ │ │ ├── insertdatetime │ │ │ │ └── plugin.min.js │ │ │ ├── autolink │ │ │ │ └── plugin.min.js │ │ │ ├── autosave │ │ │ │ └── plugin.min.js │ │ │ ├── advlist │ │ │ │ └── plugin.min.js │ │ │ ├── importcss │ │ │ │ └── plugin.min.js │ │ │ └── directionality │ │ │ │ └── plugin.min.js │ │ └── license.txt │ ├── editor.min.css │ ├── insertimage.svg │ ├── insertcheckbox.svg │ ├── editor.css │ ├── testBrowser.min.html │ └── testBrowser.html │ └── java │ └── tf │ └── ownnote │ └── ui │ ├── helper │ ├── FileContentChangeType.java │ ├── IFileChangeSubscriber.java │ ├── IFileContentChangeSubscriber.java │ ├── IGroupListContainer.java │ └── RecentNoteForGroup.java │ ├── xstreamfx │ ├── StringPropertyConverter.java │ ├── LongPropertyConverter.java │ ├── FXConverters.java │ ├── DoublePropertyConverter.java │ ├── IntegerPropertyConverter.java │ ├── BooleanPropertyConverter.java │ ├── ObservableSetConverter.java │ ├── ObservableListConverter.java │ ├── ObjectPropertyConverter.java │ └── AbstractPropertyConverter.java │ ├── tags │ ├── ITagHolder.java │ ├── ITagTreeCell.java │ ├── TagDataWrapper.java │ └── TagTextFieldTreeCell.java │ ├── commentdata │ ├── ICommentDataInfo.java │ └── ICommentDataHolder.java │ ├── notes │ ├── INoteCRMDS.java │ └── NoteVersion.java │ └── tasks │ └── TaskCount.java ├── manifest.mf ├── gradle └── wrapper │ └── gradle-wrapper.properties ├── gradle.properties ├── .gitignore ├── settings.gradle ├── .nb-gradle-properties └── LICENSE.md /src/test/resources/dummy.txt: -------------------------------------------------------------------------------- 1 | das ist mal ein sinnvoller text... -------------------------------------------------------------------------------- /manifest.mf: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | X-COMMENT: Main-Class will be added automatically by build 3 | 4 | -------------------------------------------------------------------------------- /src/main/resources/css/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/css/delete.png -------------------------------------------------------------------------------- /src/main/resources/insertimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/insertimage.png -------------------------------------------------------------------------------- /src/test/resources/LookAndFeel/[Test1] test1.htm: -------------------------------------------------------------------------------- 1 | 2 |

Test1

-------------------------------------------------------------------------------- /src/test/resources/LookAndFeel/[Test1] test2.htm: -------------------------------------------------------------------------------- 1 | 2 |

Test2

-------------------------------------------------------------------------------- /src/test/resources/LookAndFeel/[Test2] test3.htm: -------------------------------------------------------------------------------- 1 | 2 |

Test3

-------------------------------------------------------------------------------- /src/main/resources/insertcheckbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/insertcheckbox.png -------------------------------------------------------------------------------- /src/main/resources/css/delete-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/css/delete-hover.png -------------------------------------------------------------------------------- /src/main/resources/OwnNoteEditorManager.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/OwnNoteEditorManager.ico -------------------------------------------------------------------------------- /src/main/resources/OwnNoteEditorManager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/OwnNoteEditorManager.png -------------------------------------------------------------------------------- /src/test/resources/OwnNoteEditorManager.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/test/resources/OwnNoteEditorManager.jpg -------------------------------------------------------------------------------- /src/test/resources/[Test] TestVerify_OK.htm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/test/resources/[Test] TestVerify_OK.htm -------------------------------------------------------------------------------- /src/main/resources/tinymce/tinymce_5.10.7.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasDaheim/ownNoteEditor/HEAD/src/main/resources/tinymce/tinymce_5.10.7.7z -------------------------------------------------------------------------------- /src/test/resources/LookAndFeel/[Test3] test1.htm: -------------------------------------------------------------------------------- 1 | 2 |

Test1 - mit SUCH text

-------------------------------------------------------------------------------- /src/main/resources/css/customize-metro.min.css: -------------------------------------------------------------------------------- 1 | .check-box>.box>.mark{-fx-pref-width:14px;-fx-pref-height:12px}.button,.toggle-button{-fx-border-width:2}.menu .context-menu{-fx-padding:1 1 1 1} -------------------------------------------------------------------------------- /src/main/resources/editor.min.css: -------------------------------------------------------------------------------- 1 | body,html{height:100%;width:100%}#editorBase,body,html{margin:0!important;padding:0!important}#editorBase{display:block!important;height:100%!important;width:100%!important} -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | netbeans.org-netbeans-modules-javascript2-requirejs.enabled=true 2 | action.custom-1=unzip 3 | action.custom-1.args=--configure-on-demand -w -x check unzip 4 | action.custom-2=dependencyUpdates 5 | action.custom-2.args=--configure-on-demand -w -x check -x test dependencyUpdates 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | 14 | build 15 | .gradle 16 | 17 | #NetBeans ignores 18 | nbproject/private/ 19 | build/ 20 | nbbuild/ 21 | dist/ 22 | nbdist/ 23 | nbactions.xml 24 | nb-configuration.xml 25 | .nb-gradle/ 26 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/helper/FileContentChangeType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package tf.ownnote.ui.helper; 7 | 8 | /** 9 | * 10 | * @author thomas 11 | */ 12 | public enum FileContentChangeType { 13 | CHECKBOX_CHANGED, 14 | CONTENT_CHANGED 15 | } 16 | -------------------------------------------------------------------------------- /src/test/resources/[Test] TestLinks.htm: -------------------------------------------------------------------------------- 1 | &lmr; 2 |

[Test] TestTasks

3 |

[Test] TestVerify_OK

4 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/skins/ui/oxide-dark/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/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}") 2 | //# sourceMappingURL=skin.shadowdom.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/skins/ui/oxide/skin.shadowdom.js: -------------------------------------------------------------------------------- 1 | tinymce.Resource.add('ui/default/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}") 2 | //# sourceMappingURL=skin.shadowdom.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=skin.shadowdom.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=skin.shadowdom.js.map 3 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/helper/IFileChangeSubscriber.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package tf.ownnote.ui.helper; 7 | 8 | import java.nio.file.Path; 9 | import java.nio.file.WatchEvent; 10 | 11 | /** 12 | * Subscriber interface for file changes. 13 | * 14 | * Option to break propagation chain by returning FALSE. 15 | * 16 | * @author thomas 17 | */ 18 | public interface IFileChangeSubscriber { 19 | abstract boolean processFileChange(final WatchEvent.Kind eventKind, final Path filePath); 20 | } 21 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * This settings file was auto generated by the Gradle buildInit task 3 | * by 'markus' at '06.10.15 11:58' with Gradle 2.7 4 | * 5 | * The settings file is used to specify which projects to include in your build. 6 | * In a single project build this file can be empty or even removed. 7 | * 8 | * Detailed information about configuring a multi-project build in Gradle can be found 9 | * in the user guide at https://docs.gradle.org/2.7/userguide/multi_project_builds.html 10 | */ 11 | 12 | /* 13 | // To declare projects as part of a multi-project build use the 'include' method 14 | include 'shared' 15 | include 'api' 16 | include 'services:webservice' 17 | */ 18 | 19 | rootProject.name = 'ownNoteEditor' 20 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/helper/IFileContentChangeSubscriber.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package tf.ownnote.ui.helper; 7 | 8 | import tf.ownnote.ui.notes.Note; 9 | 10 | /** 11 | * Subscriber interface for editor content changes. 12 | * 13 | * Option to break propagation chain by returning FALSE. 14 | * 15 | * @author thomas 16 | */ 17 | public interface IFileContentChangeSubscriber { 18 | abstract boolean processFileContentChange(final FileContentChangeType changeType, final Note note, final String oldContent, final String newContent); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/code/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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),{})))}(); -------------------------------------------------------------------------------- /src/main/resources/insertimage.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 14 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/insertcheckbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/StringPropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 5 | import com.thoughtworks.xstream.mapper.Mapper; 6 | import javafx.beans.property.SimpleStringProperty; 7 | import javafx.beans.property.StringProperty; 8 | import javafx.beans.value.WritableValue; 9 | 10 | /** 11 | * Created at 17/09/11 10:52.
12 | * 13 | * @author antoine 14 | */ 15 | public class StringPropertyConverter extends AbstractPropertyConverter implements Converter { 16 | 17 | public StringPropertyConverter(Mapper mapper) { 18 | super(StringProperty.class, mapper); 19 | } 20 | 21 | @Override 22 | protected WritableValue createProperty() { 23 | return new SimpleStringProperty(); 24 | } 25 | 26 | @Override 27 | protected Class readType(HierarchicalStreamReader reader) { 28 | return String.class; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/LongPropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 5 | import com.thoughtworks.xstream.mapper.Mapper; 6 | import javafx.beans.property.LongProperty; 7 | import javafx.beans.property.SimpleLongProperty; 8 | import javafx.beans.value.WritableValue; 9 | 10 | /** 11 | * Created at 17/09/11 11:17.
12 | * 13 | * @author Antoine Mischler 14 | */ 15 | public class LongPropertyConverter extends AbstractPropertyConverter implements Converter { 16 | 17 | public LongPropertyConverter(Mapper mapper) { 18 | super(LongProperty.class, mapper); 19 | } 20 | 21 | @Override 22 | protected WritableValue createProperty() { 23 | return new SimpleLongProperty(); 24 | } 25 | 26 | @Override 27 | protected Class readType(HierarchicalStreamReader reader) { 28 | return Long.class; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/FXConverters.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.XStream; 4 | 5 | /** 6 | * Utility to configure a xStream with JavaFX property converters.
7 | *
8 | * Created at 17/09/11 11:18.
9 | * 10 | * @author Antoine Mischler 11 | */ 12 | public class FXConverters { 13 | public static void configure(XStream xStream) { 14 | xStream.registerConverter(new StringPropertyConverter(xStream.getMapper())); 15 | xStream.registerConverter(new BooleanPropertyConverter(xStream.getMapper())); 16 | xStream.registerConverter(new ObjectPropertyConverter(xStream.getMapper())); 17 | xStream.registerConverter(new DoublePropertyConverter(xStream.getMapper())); 18 | xStream.registerConverter(new LongPropertyConverter(xStream.getMapper())); 19 | xStream.registerConverter(new IntegerPropertyConverter(xStream.getMapper())); 20 | xStream.registerConverter(new ObservableListConverter(xStream.getMapper())); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/DoublePropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 5 | import com.thoughtworks.xstream.mapper.Mapper; 6 | import javafx.beans.property.DoubleProperty; 7 | import javafx.beans.property.SimpleDoubleProperty; 8 | import javafx.beans.value.WritableValue; 9 | 10 | /** 11 | * Created at 17/09/11 11:12.
12 | * 13 | * @author Antoine Mischler 14 | */ 15 | public class DoublePropertyConverter extends AbstractPropertyConverter implements Converter { 16 | 17 | public DoublePropertyConverter(Mapper mapper) { 18 | super(DoubleProperty.class, mapper); 19 | } 20 | 21 | @Override 22 | protected WritableValue createProperty() { 23 | return new SimpleDoubleProperty(); 24 | } 25 | 26 | @Override 27 | protected Class readType(HierarchicalStreamReader reader) { 28 | return Double.class; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/IntegerPropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 5 | import com.thoughtworks.xstream.mapper.Mapper; 6 | import javafx.beans.property.IntegerProperty; 7 | import javafx.beans.property.SimpleIntegerProperty; 8 | import javafx.beans.value.WritableValue; 9 | 10 | /** 11 | * Created at 17/09/11 11:16.
12 | * 13 | * @author Antoine Mischler 14 | */ 15 | public class IntegerPropertyConverter extends AbstractPropertyConverter implements Converter { 16 | 17 | public IntegerPropertyConverter(Mapper mapper) { 18 | super(IntegerProperty.class, mapper); 19 | } 20 | 21 | @Override 22 | protected WritableValue createProperty() { 23 | return new SimpleIntegerProperty(); 24 | } 25 | 26 | @Override 27 | protected Class readType(HierarchicalStreamReader reader) { 28 | return Integer.class; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/BooleanPropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 5 | import com.thoughtworks.xstream.mapper.Mapper; 6 | import javafx.beans.property.BooleanProperty; 7 | import javafx.beans.property.SimpleBooleanProperty; 8 | import javafx.beans.value.WritableValue; 9 | 10 | /** 11 | * Created at 17/09/11 11:09.
12 | * 13 | * @author Antoine Mischler 14 | */ 15 | public class BooleanPropertyConverter extends AbstractPropertyConverter implements Converter { 16 | 17 | public BooleanPropertyConverter(Mapper mapper) { 18 | super(BooleanProperty.class, mapper); 19 | } 20 | 21 | @Override 22 | protected WritableValue createProperty() { 23 | return new SimpleBooleanProperty(); 24 | } 25 | 26 | @Override 27 | protected Class readType(HierarchicalStreamReader reader) { 28 | return Boolean.class; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/license.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /.nb-gradle-properties: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | j2se 5 | 11 6 | 1.9 7 | 8 | 9 | debugWithArgs 10 | no 11 | 12 | ${project}:debug 13 | 14 | 15 | -PcmdLineArgs=-lookAndFeel="classic" 16 | 17 | 18 | 19 | 20 | runWithArgs 21 | no 22 | 23 | ${project}:run 24 | 25 | 26 | -PcmdLineArgs=-lookAndFeel="oneNote" 27 | 28 | 29 | 30 | 31 | 32 | j2se 33 | 11 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/visualblocks/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const s=(t,s,o)=>{t.dom.toggleClass(t.getBody(),"mce-visualblocks"),o.set(!o.get()),((t,s)=>{t.dispatch("VisualBlocks",{state:s})})(t,o.get())},o=("visualblocks_default_state",t=>t.options.get("visualblocks_default_state"));const e=(t,s)=>o=>{o.setActive(s.get());const e=t=>o.setActive(t.state);return t.on("VisualBlocks",e),()=>t.off("VisualBlocks",e)};t.add("visualblocks",((t,l)=>{(t=>{(0,t.options.register)("visualblocks_default_state",{processor:"boolean",default:!1})})(t);const a=(t=>{let s=!1;return{get:()=>s,set:t=>{s=t}}})();((t,o,e)=>{t.addCommand("mceVisualBlocks",(()=>{s(t,0,e)}))})(t,0,a),((t,s)=>{const o=()=>t.execCommand("mceVisualBlocks");t.ui.registry.addToggleButton("visualblocks",{icon:"visualblocks",tooltip:"Show blocks",onAction:o,onSetup:e(t,s)}),t.ui.registry.addToggleMenuItem("visualblocks",{text:"Show blocks",icon:"visualblocks",onAction:o,onSetup:e(t,s)})})(t,a),((t,e,l)=>{t.on("PreviewFormats AfterPreviewFormats",(s=>{l.get()&&t.dom.toggleClass(t.getBody(),"mce-visualblocks","afterpreviewformats"===s.type)})),t.on("init",(()=>{o(t)&&s(t,0,l)}))})(t,0,a)}))}(); -------------------------------------------------------------------------------- /src/main/resources/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 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/main/resources/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}") 2 | //# sourceMappingURL=content.js.map 3 | -------------------------------------------------------------------------------- /src/test/resources/MetaData/tag_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Groups 5 | 6 | 7 | All 8 | 9 | 10 | #F4A6A6 11 | 5910f367ed69 12 | 13 | 14 | Not grouped 15 | 16 | 17 | #F4A6A6 18 | d0e3cbd827cd 19 | 20 | 21 | Test 22 | 23 | 24 | darkgrey 25 | e5699f358d92 26 | 27 | 28 | Archive 29 | 30 | 31 | #F4A6A6 32 | 53675d0a4b68 33 | 34 | 35 | 36 | 37 | 5fda0dc60dec 38 | 39 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/nonbreaking/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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)}))}(); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/save/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=("function",e=>"function"==typeof e);var o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),t=tinymce.util.Tools.resolve("tinymce.util.Tools");const a=e=>n=>n.options.get(e),c=a("save_enablewhendirty"),i=a("save_onsavecallback"),s=a("save_oncancelcallback"),r=(e,n)=>{e.notificationManager.open({text:n,type:"error"})},l=e=>n=>{const o=()=>{n.setEnabled(!c(e)||e.isDirty())};return o(),e.on("NodeChange dirty",o),()=>e.off("NodeChange dirty",o)};e.add("save",(e=>{(e=>{const n=e.options.register;n("save_enablewhendirty",{processor:"boolean",default:!0}),n("save_onsavecallback",{processor:"function"}),n("save_oncancelcallback",{processor:"function"})})(e),(e=>{e.ui.registry.addButton("save",{icon:"save",tooltip:"Save",enabled:!1,onAction:()=>e.execCommand("mceSave"),onSetup:l(e)}),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 t=o.DOM.getParent(e.id,"form");if(c(e)&&!e.isDirty())return;e.save();const a=i(e);if(n(a))return a.call(e,e),void e.nodeChanged();t?(e.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():r(e,"Error: Form submit field collision.")),e.nodeChanged()):r(e,"Error: No form element found.")})(e)})),e.addCommand("mceCancel",(()=>{(e=>{const o=t.trim(e.startContent),a=s(e);n(a)?a.call(e,e):e.resetContent(o)})(e)}))})(e)}))}(); -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2016, Thomas Feuster 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/ObservableSetConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.sun.javafx.collections.ObservableSetWrapper; 4 | import com.thoughtworks.xstream.converters.Converter; 5 | import com.thoughtworks.xstream.converters.collections.CollectionConverter; 6 | import com.thoughtworks.xstream.mapper.Mapper; 7 | import javafx.beans.property.SimpleSetProperty; 8 | import javafx.collections.FXCollections; 9 | import javafx.collections.ObservableSet; 10 | 11 | /** 12 | * TODO write documentation
13 | *
14 | * Created at 21/09/11 09:32.
15 | * 16 | * @author Antoine Mischler 17 | * @since 2.2 18 | * 19 | * using implementation from https://stackoverflow.com/a/33298946 20 | */ 21 | public class ObservableSetConverter extends CollectionConverter implements Converter { 22 | 23 | public ObservableSetConverter(Mapper mapper) { 24 | super(mapper); 25 | } 26 | 27 | @Override 28 | public boolean canConvert(Class type) { 29 | return ObservableSet.class.isAssignableFrom(type); 30 | } 31 | 32 | @Override 33 | protected Object createCollection(Class type) { 34 | if (type == ObservableSetWrapper.class) { 35 | return FXCollections.observableSet(); 36 | } 37 | if (type.getName().indexOf("$") > 0) { 38 | if (type.getName().equals("javafx.collections.FXCollections$SynchronizedObservableSet")) { 39 | return FXCollections.synchronizedObservableSet(FXCollections.observableSet()); 40 | } 41 | } 42 | return new SimpleSetProperty<>(FXCollections.observableSet()); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/pagebreak/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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)}))}(); -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/ObservableListConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.sun.javafx.collections.ObservableListWrapper; 4 | import com.thoughtworks.xstream.converters.Converter; 5 | import com.thoughtworks.xstream.converters.collections.CollectionConverter; 6 | import com.thoughtworks.xstream.mapper.Mapper; 7 | import javafx.beans.property.SimpleListProperty; 8 | import javafx.collections.FXCollections; 9 | import javafx.collections.ObservableList; 10 | 11 | /** 12 | * TODO write documentation
13 | *
14 | * Created at 21/09/11 09:32.
15 | * 16 | * @author Antoine Mischler 17 | * @since 2.2 18 | * 19 | * using implementation from https://stackoverflow.com/a/33298946 20 | */ 21 | public class ObservableListConverter extends CollectionConverter implements Converter { 22 | 23 | public ObservableListConverter(Mapper mapper) { 24 | super(mapper); 25 | } 26 | 27 | @Override 28 | public boolean canConvert(Class type) { 29 | return ObservableList.class.isAssignableFrom(type); 30 | } 31 | 32 | @Override 33 | protected Object createCollection(Class type) { 34 | if (type == ObservableListWrapper.class) { 35 | return FXCollections.observableArrayList(); 36 | } 37 | if (type.getName().indexOf("$") > 0) { 38 | if (type.getName().equals("javafx.collections.FXCollections$SynchronizedObservableList")) { 39 | return FXCollections.synchronizedObservableList(FXCollections.observableArrayList()); 40 | } 41 | } 42 | return new SimpleListProperty<>(FXCollections.observableArrayList()); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/xstreamfx/ObjectPropertyConverter.java: -------------------------------------------------------------------------------- 1 | package tf.helper.xstreamfx; 2 | 3 | import com.thoughtworks.xstream.converters.Converter; 4 | import com.thoughtworks.xstream.converters.MarshallingContext; 5 | import com.thoughtworks.xstream.io.HierarchicalStreamReader; 6 | import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 7 | import com.thoughtworks.xstream.mapper.Mapper; 8 | import javafx.beans.property.ObjectProperty; 9 | import javafx.beans.property.SimpleObjectProperty; 10 | import javafx.beans.value.WritableValue; 11 | import tf.helper.general.ObjectsHelper; 12 | 13 | /** 14 | * Created at 17/09/11 11:10.
15 | * 16 | * @author Antoine Mischler 17 | */ 18 | public class ObjectPropertyConverter extends AbstractPropertyConverter implements Converter { 19 | 20 | public ObjectPropertyConverter(Mapper mapper) { 21 | super(ObjectProperty.class, mapper); 22 | } 23 | 24 | @Override 25 | protected WritableValue createProperty() { 26 | return ObjectsHelper.uncheckedCast(new SimpleObjectProperty()); 27 | } 28 | 29 | @Override 30 | protected Class readType(HierarchicalStreamReader reader) { 31 | return ObjectsHelper.uncheckedCast(mapper.realClass(reader.getAttribute("propertyClass"))); 32 | } 33 | 34 | @Override 35 | protected void writeValue(HierarchicalStreamWriter writer, MarshallingContext context, Object value) { 36 | final Class clazz = value.getClass(); 37 | final String propertyClass = mapper.serializedClass(clazz); 38 | writer.addAttribute("propertyClass", propertyClass); 39 | context.convertAnother(value); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/preview/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 3 | */ 4 | !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>t=>t.options.get(e),i=n("content_style"),s=n("content_css_cors"),c=n("body_class"),r=n("body_id");e.add("preview",(e=>{(e=>{e.addCommand("mcePreview",(()=>{(e=>{const n=(e=>{var n;let l="";const a=e.dom.encode,d=null!==(n=i(e))&&void 0!==n?n:"";l+='';const m=s(e)?' crossorigin="anonymous"':"";o.each(e.contentCSS,(t=>{l+='"})),d&&(l+='");const y=r(e),u=c(e),v=' -------------------------------------------------------------------------------- /src/test/resources/LookAndFeel/MetaData/tag_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Groups 5 | 6 | 7 | All 8 | 9 | 10 | darkgrey 11 | 74a9df4e657b 12 | 13 | 14 | Not grouped 15 | 16 | 17 | lightgrey 18 | e22b19773370 19 | 20 | 21 | Test1 22 | 23 | KEYBOARD_ALT 24 | #B4AFDF 25 | 85ef2a4106ad 26 | 27 | 28 | Test2 29 | 30 | CODE 31 | #A2D07F 32 | 66995e6377a5 33 | 34 | 35 | Test3 36 | 37 | 38 | Level 2 39 | 40 | CUBES 41 | #FF0000 42 | 2b891248c1c9 43 | 44 | 45 | CAMERA_RETRO 46 | #99D0DF 47 | b2eeee278206 48 | 49 | 50 | BARS 51 | 52 | e89cc659391a 53 | 54 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/anchor/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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=("allow_html_in_named_anchor",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)}))}))}(); -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/tasks/TaskCount.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.tasks; 27 | 28 | /** 29 | * Holder for count of open / closed / total tasks per note. 30 | * @author thomas 31 | */ 32 | public class TaskCount { 33 | public static enum TaskType { 34 | OPEN, 35 | CLOSED, 36 | TOTAL 37 | } 38 | 39 | private final long openCount; 40 | private final long closedCount; 41 | 42 | private TaskCount() { 43 | openCount = 0; 44 | closedCount = 0; 45 | } 46 | 47 | public TaskCount(final long open, final long closed) { 48 | openCount = open; 49 | closedCount = closed; 50 | } 51 | 52 | public long getCount(final TaskType type) { 53 | long result = 0; 54 | 55 | switch (type) { 56 | case OPEN: 57 | result = openCount; 58 | break; 59 | case CLOSED: 60 | result = closedCount; 61 | break; 62 | case TOTAL: 63 | result = openCount + closedCount; 64 | break; 65 | } 66 | 67 | return result; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 或 macOS:Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 19 | '\n' + 20 | '

在 UI 部分之间导航

\n' + 21 | '\n' + 22 | '

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

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

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

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

这些 UI 部分的 Tab 顺序为:

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

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

\n' + 39 | '\n' + 40 | '

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

\n' + 41 | '\n' + 42 | '

在 UI 部分内导航

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

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

\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 | '

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

\n' + 63 | '\n' + 64 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

执行菜单项或工具栏按钮

\n' + 69 | '\n' + 70 | '

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

\n' + 71 | '\n' + 72 | '

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

在标签页式对话框中导航

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/insertdatetime/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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)){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)}))}(); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 或 macOS:Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

在 UI 區段之間瀏覽

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

在 UI 區段之內瀏覽

\n' + 45 | '\n' + 46 | '

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

\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 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

瀏覽索引標籤式對話方塊

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/autolink/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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=("string",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=(void 0,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]"))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)}))}(); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/autosave/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 3 | */ 4 | !function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=("string",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=(void 0,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)},g=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))},y=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=>{e.setEnabled(f(t));const r=()=>e.setEnabled(f(t));return t.on("StoreDraft RestoreDraft RemoveDraft",r),()=>t.off("StoreDraft RestoreDraft RemoveDraft",r)};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,(()=>{g(t)}),e)})(t);const e=()=>{(t=>{t.undoManager.transact((()=>{y(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())&&y(t)})),(t=>({hasDraft:()=>f(t),storeDraft:()=>g(t),restoreDraft:()=>y(t),removeDraft:e=>p(t,e),isEmpty:e=>v(t,e)}))(t))))}(); -------------------------------------------------------------------------------- /src/test/resources/[Test] TestTasks.htm: -------------------------------------------------------------------------------- 1 | 2 |

Nothing that resembles a task...

3 |

And the first task: tell me, what to do!

4 |

And a more complex task: a bit more complex following test and some more text...

5 |

And a completed task: of course with something special: ♠ cool

6 |
    7 |
  • lists, here we come: open task
  • 8 |
  • and here completed
  • 9 |
10 |

-------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 または macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

UI セクション間の移動

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

UI セクション内の移動

\n' + 45 | '\n' + 46 | '

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

\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 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/test/java/tf/ownnote/ui/notes/TestNoteAppVersion.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.notes; 27 | 28 | import org.junit.jupiter.api.AfterEach; 29 | import org.junit.jupiter.api.Assertions; 30 | import org.junit.jupiter.api.BeforeEach; 31 | import org.junit.jupiter.api.Test; 32 | import tf.ownnote.ui.helper.FileManager; 33 | import tf.ownnote.ui.main.OwnNoteEditor; 34 | import tf.ownnote.ui.tags.TagManager; 35 | 36 | /** 37 | * 38 | * @author thomas 39 | */ 40 | public class TestNoteAppVersion { 41 | @BeforeEach 42 | public void setUp() { 43 | TagManager.getInstance().resetTagList(); 44 | FileManager.getInstance().setCallback(null); 45 | FileManager.getInstance().initNotesPath("src/test/resources/LookAndFeel"); 46 | } 47 | 48 | @AfterEach 49 | public void tearDown() { 50 | } 51 | 52 | @Test 53 | public void testAppVersionExistingNote() { 54 | // this one should have no app version 55 | Note testNote = FileManager.getInstance().getNote("[Test1] test1.htm"); 56 | 57 | Assertions.assertNotNull(testNote); 58 | Assertions.assertEquals(OwnNoteEditor.AppVersion.NONE.getVersionId(), testNote.getMetaData().getAppVersion(), 0.1); 59 | 60 | // this one should have 6.1 61 | testNote = FileManager.getInstance().getNote("[Test3] test1.htm"); 62 | 63 | Assertions.assertNotNull(testNote); 64 | Assertions.assertEquals(OwnNoteEditor.AppVersion.V6_1.getVersionId(), testNote.getMetaData().getAppVersion(), 0.1); 65 | } 66 | 67 | @Test 68 | public void testAppVersionNewNote() { 69 | Note testNote = new Note("Test3", "TestAppVersion"); 70 | 71 | Assertions.assertNotNull(testNote); 72 | Assertions.assertEquals(OwnNoteEditor.AppVersion.NONE.getVersionId(), testNote.getMetaData().getAppVersion(), 0.1); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 또는 macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

UI 섹션 간 탐색

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

UI 섹션 내 탐색

\n' + 45 | '\n' + 46 | '

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

\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 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | "

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

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

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

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

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

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

탭이 없는 대화 탐색

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

탭이 있는 대화 탐색

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/notes/NoteVersion.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.notes; 27 | 28 | import java.time.DateTimeException; 29 | import java.time.LocalDateTime; 30 | import java.util.logging.Level; 31 | import java.util.logging.Logger; 32 | import tf.ownnote.ui.main.OwnNoteEditor; 33 | 34 | /** 35 | * 36 | * @author thomas 37 | */ 38 | public class NoteVersion { 39 | private static final String DATA_SEP = "@"; 40 | 41 | private String versionAuthor; 42 | private LocalDateTime versionDate; 43 | 44 | private NoteVersion() { 45 | } 46 | 47 | public NoteVersion(final String author, final LocalDateTime date) { 48 | versionAuthor = author; 49 | versionDate = date; 50 | } 51 | 52 | public String getAuthor() { 53 | return versionAuthor; 54 | } 55 | 56 | public void setAuthor(final String author) { 57 | versionAuthor = author; 58 | } 59 | 60 | public LocalDateTime getDate() { 61 | return versionDate; 62 | } 63 | 64 | public void setDate(final LocalDateTime date) { 65 | versionDate = date; 66 | } 67 | 68 | public static NoteVersion fromHtmlString(final String htmlString) { 69 | final NoteVersion result = new NoteVersion("", LocalDateTime.now()); 70 | 71 | String [] data = htmlString.split(DATA_SEP); 72 | if (data.length == 2) { 73 | result.setAuthor(data[0]); 74 | 75 | try { 76 | result.setDate(LocalDateTime.parse(data[1], OwnNoteEditor.DATE_TIME_FORMATTER)); 77 | } catch (DateTimeException ex) { 78 | Logger.getLogger(NoteVersion.class.getName()).log(Level.SEVERE, null, ex); 79 | } 80 | } 81 | 82 | return result; 83 | } 84 | 85 | public static String toHtmlString(final NoteVersion data) { 86 | if (data == null) { 87 | return ""; 88 | } 89 | 90 | return data.getAuthor() + DATA_SEP + OwnNoteEditor.DATE_TIME_FORMATTER.format(data.getDate()); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/advlist/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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"),i=t=>null==t,l=t=>!i(t);var o=tinymce.util.Tools.resolve("tinymce.util.Tools");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 l(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=>l(e)&&t.test(e.nodeName),d=u(/^(OL|UL|DL)$/),g=u(/^(TH|TD)$/),c=t=>i(t)||"default"===t?"":t,h=(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.selection.isEditable())})(t,r.parents))),m=(t,s,r,n,i,l)=>{l.length>1?((t,s,r,n,i,l)=>{t.ui.registry.addSplitButton(s,{tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:t=>{t(o.map(l,(t=>{const e="OL"===i?"num":"bull",s="disc"===t||"decimal"===t?"default":t,r=c(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,i,r)},select:e=>{const s=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),s=t.dom.getStyle(e,"listStyleType");return a.from(s)})(t);return s.map((t=>e===t)).getOr(!1)},onSetup:h(t,i)})})(t,s,r,n,i,l):((t,s,r,n,i,l)=>{t.ui.registry.addToggleButton(s,{active:!1,tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",onSetup:h(t,i),onAction:()=>t.queryCommandState(n)||""===l?t.execCommand(n):e(t,i,l)})})(t,s,r,n,i,c(l[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=>{m(t,"numlist","Numbered list","InsertOrderedList","OL",r(t)),m(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 Advanced List plugin.")}))}(); -------------------------------------------------------------------------------- /src/main/resources/testBrowser.html: -------------------------------------------------------------------------------- 1 | 2 | 27 | 28 | 29 | 30 | 31 | JavaScript Geolocation Demo 32 | 33 | 34 |
35 | 36 |
37 |
38 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/tags/TagDataWrapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.tags; 27 | 28 | import javafx.beans.property.BooleanProperty; 29 | import javafx.beans.property.SimpleBooleanProperty; 30 | import javafx.collections.FXCollections; 31 | import javafx.collections.ListChangeListener; 32 | import javafx.collections.ObservableList; 33 | 34 | /** 35 | * Wrapper for TagData that adds selected property as is required in TagsTreeView. 36 | * 37 | * @author thomas 38 | */ 39 | public class TagDataWrapper { 40 | private final BooleanProperty selectedProperty = new SimpleBooleanProperty(false); 41 | private TagData myTag; 42 | private final ObservableList children = FXCollections.observableArrayList(); 43 | 44 | private TagDataWrapper() { 45 | this(null); 46 | } 47 | 48 | public TagDataWrapper(final TagData tag) { 49 | this(tag, false); 50 | } 51 | 52 | public TagDataWrapper(final TagData tag, final boolean sel) { 53 | myTag = tag; 54 | selectedProperty.setValue(sel); 55 | 56 | initChildren(); 57 | } 58 | 59 | private void initChildren() { 60 | if (myTag != null) { 61 | createChildren(); 62 | } 63 | 64 | // and now we need to keep track of changes to the wrapped list 65 | myTag.getChildren().addListener((ListChangeListener.Change change) -> { 66 | createChildren(); 67 | }); 68 | } 69 | 70 | private void createChildren() { 71 | children.clear(); 72 | for (TagData child : myTag.getChildren()) { 73 | children.add(new TagDataWrapper(child)); 74 | } 75 | } 76 | 77 | public TagData getTagData() { 78 | return myTag; 79 | } 80 | 81 | public void setTagData(final TagData tag) { 82 | myTag = tag; 83 | } 84 | 85 | public BooleanProperty selectedProperty() { 86 | return selectedProperty; 87 | } 88 | 89 | public boolean isSelected() { 90 | return selectedProperty.get(); 91 | } 92 | 93 | public void setSelected(final boolean sel) { 94 | selectedProperty.set(sel); 95 | } 96 | 97 | public ObservableList getChildren() { 98 | return children; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/importcss/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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=("function",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"),_=p("importcss_file_filter"),g=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),w=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=g(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/";return t===o+"/content"+(e.inline?".inline":"")+".min.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(_(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),w(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}(); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 או macOS:‏ Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

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

\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 | '

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

\n' + 67 | '\n' + 68 | "

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 หรือ macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

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

\n' + 45 | '\n' + 46 | '

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

\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 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/helper/RecentNoteForGroup.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.helper; 27 | 28 | import java.util.HashMap; 29 | import java.util.stream.Collectors; 30 | import tf.ownnote.ui.notes.Note; 31 | import tf.ownnote.ui.tags.TagManager; 32 | 33 | /** 34 | * Map that keeps track of the most recent edited note for each group. 35 | * 36 | * Supports storing to / reading from preferences. 37 | * 38 | * @author thomas 39 | */ 40 | public class RecentNoteForGroup extends HashMap { 41 | private final static RecentNoteForGroup INSTANCE = new RecentNoteForGroup(); 42 | 43 | private RecentNoteForGroup() { 44 | super(); 45 | } 46 | 47 | public static RecentNoteForGroup getInstance() { 48 | return INSTANCE; 49 | } 50 | 51 | public String toPreferenceString() { 52 | return EditorPreferences.PREF_STRING_PREFIX + 53 | entrySet().stream().map((t) -> { 54 | if (t.getValue() != null) { 55 | return t.getKey() + EditorPreferences.PREF_DATA_SEP + t.getValue().getNoteName(); 56 | } else { 57 | return null; 58 | } 59 | }).collect( Collectors.joining(EditorPreferences.PREF_STRING_SEP)) + 60 | EditorPreferences.PREF_STRING_SUFFIX; 61 | } 62 | 63 | public void fromPreferenceString(final String prefString) { 64 | // not long enough to be a valid preference string 65 | if (prefString.length() < (EditorPreferences.PREF_STRING_PREFIX + EditorPreferences.PREF_STRING_SUFFIX).length()) { 66 | return; 67 | } 68 | if (!prefString.startsWith(EditorPreferences.PREF_STRING_PREFIX)) { 69 | return; 70 | } 71 | if (!prefString.endsWith(EditorPreferences.PREF_STRING_SUFFIX)) { 72 | return; 73 | } 74 | 75 | // list of key - value pairs (as single string) for the map 76 | final String [] prefs = prefString.substring(EditorPreferences.PREF_STRING_PREFIX.length(), prefString.length()-EditorPreferences.PREF_STRING_SUFFIX.length()). 77 | strip().split(EditorPreferences.PREF_STRING_SEP); 78 | 79 | for (String pref : prefs) { 80 | // no two elements in preference string 81 | if (pref.split(EditorPreferences.PREF_DATA_SEP).length != 2) { 82 | continue; 83 | } 84 | 85 | final String[] recentNote = pref.split(EditorPreferences.PREF_DATA_SEP); 86 | put(recentNote[0], FileManager.getInstance().getNote(TagManager.getInstance().groupForExternalName(recentNote[0], false), recentNote[1])); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 a contextual toolbar
\n' + 15 | '
Windows, Linux or macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Navigate between UI sections

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

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

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

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

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

The Tab order of these UI sections is:

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

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

\n' + 40 | '\n' + 41 | '

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

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

Navigate within UI sections

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

The Left and Right arrow keys

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

The Down and Up arrow keys

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • move between menu items in a menu.
  • \n' + 61 | '
  • move between items in a toolbar pop-up menu.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

Arrow keys cycle within the focused UI section.

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

Execute a menu item or toolbar button

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

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

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

Navigate non-tabbed dialogs

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Navigate tabbed dialogs

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 या macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

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

\n' + 45 | '\n' + 46 | '

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

\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 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | "

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 | '
Windows ،Linux یا macOS:‏ Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

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

\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 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/java/tf/ownnote/ui/tags/TagTextFieldTreeCell.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014ff Thomas Feuster 3 | * All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * 1. Redistributions of source code must retain the above copyright 8 | * notice, this list of conditions and the following disclaimer. 9 | * 2. Redistributions in binary form must reproduce the above copyright 10 | * notice, this list of conditions and the following disclaimer in the 11 | * documentation and/or other materials provided with the distribution. 12 | * 3. The name of the author may not be used to endorse or promote products 13 | * derived from this software without specific prior written permission. 14 | * 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | package tf.ownnote.ui.tags; 27 | 28 | import javafx.scene.control.TreeCell; 29 | import javafx.scene.control.TreeItem; 30 | import javafx.scene.control.TreeView; 31 | import javafx.scene.control.cell.TextFieldTreeCell; 32 | import javafx.util.StringConverter; 33 | import tf.ownnote.ui.main.OwnNoteEditor; 34 | 35 | /** 36 | * TextFieldTreeCell functionality for tags 37 | * 38 | * Throw drag & drop + copy & paste support into the mix :-) 39 | * Based on https://github.com/cerebrosoft/treeview-dnd-example/blob/master/treedrag/TaskCellFactory.java and GPXEditor 40 | * 41 | * @author thomas 42 | */ 43 | public class TagTextFieldTreeCell extends TextFieldTreeCell implements ITagTreeCell { 44 | // callback to OwnNoteEditor 45 | private final OwnNoteEditor myEditor; 46 | private final TreeView myTreeView; 47 | 48 | private TagTextFieldTreeCell() { 49 | myEditor = null; 50 | myTreeView = null; 51 | } 52 | 53 | public TagTextFieldTreeCell(final TreeView treeView, final OwnNoteEditor editor) { 54 | this(treeView, TagTreeCellBase.tagInfoConverter, editor); 55 | } 56 | 57 | public TagTextFieldTreeCell(final TreeView treeView, final StringConverter sc, final OwnNoteEditor editor) { 58 | super(sc); 59 | 60 | myEditor = editor; 61 | myTreeView = treeView; 62 | } 63 | 64 | @Override 65 | public void updateItem(TagDataWrapper item, boolean empty) { 66 | super.updateItem(item, empty); 67 | TagTreeCellBase.getInstance().updateItem(this, item, empty, myEditor); 68 | } 69 | 70 | @Override 71 | public void startEdit() { 72 | if (!isEditable() || !getTreeView().isEditable()) { 73 | return; 74 | } 75 | 76 | // check if item can be edited 77 | final TreeItem treeItem = getTreeItem(); 78 | if ((treeItem != null) && !TagManager.isEditableTag(treeItem.getValue().getTagData())) { 79 | return; 80 | } 81 | 82 | super.startEdit(); 83 | TagTreeCellBase.getInstance().startEdit(this); 84 | } 85 | 86 | @Override 87 | public void cancelEdit() { 88 | super.cancelEdit(); 89 | TagTreeCellBase.getInstance().cancelEdit(this); 90 | } 91 | 92 | @Override 93 | public OwnNoteEditor getEditor() { 94 | return myEditor; 95 | } 96 | 97 | @Override 98 | public StringConverter getTextConverter() { 99 | return getConverter(); 100 | } 101 | 102 | @Override 103 | public TreeCell getTreeCell() { 104 | return this; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 | '
Fokus bar alat kontekstual
\n' + 15 | '
Windows, Linux atau macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Navigasi antara bahagian UI

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

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

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

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

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

Tertib Tab bahagian UI ini ialah:

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

Jika bahagian UI tidak wujud, ia dilangkau.

\n' + 40 | '\n' + 41 | '

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

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

Navigasi dalam bahagian UI

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

Kekunci anak panah Kiri dan Kanan

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

Kekunci anak panah Bawah dan Atas

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • bergerak antara item menu dalam menu.
  • \n' + 61 | '
  • bergerak antara item dalam menu timbul bar alat.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

Kekunci Anak Panah berkitar dalam bahagian UI difokuskan.

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | "

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

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

Laksanakan item menu atau butang bar alat

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

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

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

Navigasi ke dialog tidak bertab

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Navigasi ke dialog bertab

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/directionality/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TinyMCE version 6.8.2 (2023-12-11) 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=(!1,()=>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(9),y=m(11),p=(t,e)=>{t.dom.removeAttribute(e)},w=i(Element.prototype.attachShadow)&&i(Node.prototype.getRootNode)?t=>d(t.dom.getRootNode()):t=>v(t)?t:d(t.dom.ownerDocument),b=t=>d(t.dom.host),N=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=w(t);return y(o=e)&&n(o.dom.host)?a.some(e):a.none();var o})(d(e)).fold((()=>o.body.contains(e)),(r=N,i=b,t=>r(i(t))));var r,i},S=t=>"rtl"===((t,e)=>{const o=t.dom,r=window.getComputedStyle(o).getPropertyValue(e);return""!==r||N(t)?r:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(o,e)})(t,"direction")?"rtl":"ltr",A=(t,e)=>((t,o)=>((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),E=("li",t=>g(t)&&"li"===t.dom.nodeName.toLowerCase());const T=(t,e,n)=>{u(e,(e=>{const c=d(e),m=E(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),S(e)===n?p(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),S(f)!==n&&t.setStyle(f.dom,"direction",n),m){const e=A(f,"li[dir],li[style]");u(e,(e=>{p(e,"dir"),t.setStyle(e.dom,"direction",null)}))}}))}))},C=(t,e)=>{t.selection.isEditable()&&(T(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},D=(t,e)=>o=>{const r=r=>{const n=d(r.element);o.setActive(S(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",(()=>{C(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{C(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:D(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:D(t,"rtl")})})(t)}))}(); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 på en snabbverktygsrad
\n' + 15 | '
Windows, Linux eller macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Navigera mellan UI-avsnitt

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

Navigera i UI-avsnitt

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

Vänsterpil och högerpil

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

Nedpil och uppil

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • flytta mellan menyalternativ på en meny.
  • \n' + 61 | '
  • flytta mellan alternativ på en popup-meny på verktygsraden.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

Piltangenterna cirkulerar inom det fokuserade UI-avsnittet.

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

Köra ett menyalternativ eller en verktygfältsknapp

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

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

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

Navigera i dialogrutor utan flikar

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Navigera i dialogrutor med flikar

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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å kontekstuel værktøjslinje
\n' + 15 | '
Windows, Linux eller macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Naviger mellem UI-sektioner

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

Naviger inden for UI-sektioner

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

Venstre og højre piletast

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

Pil ned og op

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

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | "

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

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

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

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

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

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

Naviger i ikke-faneopdelte dialogbokse

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Naviger i faneopdelte dialogbokse

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 | '
Fokus pada bilah alat kontekstual
\n' + 15 | '
Windows, Linux, atau macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Berpindah antar-bagian UI

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

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

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

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

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

Urutan Tab bagian-bagian UI ini adalah:

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

Jika suatu bagian UI tidak ada, bagian tersebut dilewati.

\n' + 40 | '\n' + 41 | '

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

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

Berpindah di dalam bagian-bagian UI

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

Tombol panah Kiri dan Kanan untuk

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

Tombol panah Bawah dan Atas untuk

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • berpindah-pindah antar-item menu di dalam menu.
  • \n' + 61 | '
  • berpindah-pindah antar-item di dalam menu pop-up bilah alat.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

Tombol Panah hanya bergerak di dalam bagian UI yang difokuskan.

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

Menjalankan item menu atau tombol bilah alat

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

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

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

Berpindah dalam dialog tanpa tab

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Berpindah dalam dialog dengan tab

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 أو macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

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

\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 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

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

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 barra de ferramentas contextual
\n' + 15 | '
Windows, Linux ou macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Navegar entre seções da IU

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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

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

Navegar dentro das seções da IU

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

As teclas de seta Esquerda e Direita

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

As teclas de seta Abaixo e Acima

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • movem entre itens de menu em um menu.
  • \n' + 61 | '
  • movem entre itens em um menu suspenso da barra de ferramentas.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

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

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

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

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

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

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

Navegar por caixas de diálogo sem guias

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Navegar por caixas de diálogo com guias

\n' + 83 | '\n' + 84 | '

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' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 testuinguruaren tresna-barra
\n' + 15 | '
Windows, Linux edo macOS: Ktrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

Nabigatu EIko atalen artean

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

EIko atal batetik hurrengora mugitzeko, sakatu Tabuladorea.

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

EIko atal batetik aurrekora mugitzeko, sakatu Maius+Tabuladorea.

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

EIko atal hauen Tabuladorea da:

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

EIko atal bat ez badago, saltatu egin da.

\n' + 40 | '\n' + 41 | '

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

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

Nabigatu EIko atalen barruan

\n' + 45 | '\n' + 46 | '

EIko elementu batetik hurrengora mugitzeko, sakatu dagokion Gezia tekla.

\n' + 47 | '\n' + 48 | '

Ezkerrera eta Eskuinera gezi-teklak

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

Gora eta Behera gezi-teklak

\n' + 58 | '\n' + 59 | '
    \n' + 60 | '
  • mugitu menu bateko menu-elementuen artean.
  • \n' + 61 | '
  • mugitu tresna-barrako menu gainerakor bateko menu-elementuen artean.
  • \n' + 62 | '
\n' + 63 | '\n' + 64 | '

Gezia teklen zikloa nabarmendutako EI atalen barruan.

\n' + 65 | '\n' + 66 | '

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

\n' + 67 | '\n' + 68 | '

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

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

Exekutatu menuko elementu bat edo tresna-barrako botoi bat

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

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

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

Nabigatu fitxarik gabeko elkarrizketak

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Nabigatu fitxadun elkarrizketak

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 | '
Bağlamsal araç çubuğuna odaklan
\n' + 15 | '
Windows, Linux veya macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

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

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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

\n' + 40 | '\n' + 41 | '

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' + 42 | ' odak son araç çubuğu yerine ilk araç çubuğu grubuna taşınır.

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

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

\n' + 45 | '\n' + 46 | '

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

\n' + 47 | '\n' + 48 | '

Sol ve Sağ ok tuşları

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

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

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

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

\n' + 65 | '\n' + 66 | '

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' + 67 | '\n' + 68 | '

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

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

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

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

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

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

Sekme bulunmayan iletişim kutularında gezinme

\n' + 77 | '\n' + 78 | '

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

\n' + 79 | '\n' + 80 | '

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

\n' + 81 | '\n' + 82 | '

Sekmeli iletişim kutularında gezinme

\n' + 83 | '\n' + 84 | '

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

\n' + 85 | '\n' + 86 | '

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

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

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

\n'); -------------------------------------------------------------------------------- /src/main/resources/tinymce/plugins/help.6.8.2/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 thanh công cụ ngữ cảnh
\n' + 15 | '
Windows, Linux hoặc macOS: Ctrl+F9\n' + 16 | '
\n' + 17 | '\n' + 18 | '

Đ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' + 19 | ' đường dẫn phần tử Chân trang).

\n' + 20 | '\n' + 21 | '

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

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

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

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

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

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

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

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

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' + 40 | '\n' + 41 | '

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' + 42 | ' 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' + 43 | '\n' + 44 | '

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

\n' + 45 | '\n' + 46 | '

Để 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' + 47 | '\n' + 48 | '

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

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

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

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

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

\n' + 65 | '\n' + 66 | '

Để đó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' + 67 | '\n' + 68 | '

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' + 69 | ' toàn bộ phần điều hướng bàn phím.

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

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

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

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' + 74 | ' hoặc Phím cách để thực hiện chức năng mục đó.

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

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

\n' + 77 | '\n' + 78 | '

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' + 79 | '\n' + 80 | '

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' + 81 | '\n' + 82 | '

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

\n' + 83 | '\n' + 84 | '

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' + 85 | '\n' + 86 | '

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' + 87 | ' Shift+Tab.

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

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' + 90 | ' để xoay vòng các tab hiện có.

\n'); --------------------------------------------------------------------------------