@akilli/editor-src 5.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abbreviation/Abbreviation.js +32 -0
- package/abbreviation/AbbreviationDialog.js +21 -0
- package/audio/Audio.js +47 -0
- package/audio/AudioDialog.js +18 -0
- package/audio/AudioListener.js +50 -0
- package/base/AlignCommand.js +34 -0
- package/base/AlignableListener.js +45 -0
- package/base/Alignment.js +36 -0
- package/base/BarListener.js +95 -0
- package/base/Base.js +127 -0
- package/base/Command.js +139 -0
- package/base/CommandManager.js +60 -0
- package/base/ContentFilter.js +109 -0
- package/base/DeletableListener.js +36 -0
- package/base/DeleteCommand.js +18 -0
- package/base/Dialog.js +153 -0
- package/base/DialogManager.js +44 -0
- package/base/Dispatcher.js +88 -0
- package/base/Dom.js +790 -0
- package/base/EditableListener.js +82 -0
- package/base/Editor.js +448 -0
- package/base/Filter.js +35 -0
- package/base/FilterManager.js +44 -0
- package/base/FocusableListener.js +22 -0
- package/base/FocusbarListener.js +99 -0
- package/base/FormCreator.js +162 -0
- package/base/FormatbarListener.js +32 -0
- package/base/Key.js +258 -0
- package/base/Listener.js +51 -0
- package/base/NavigableListener.js +81 -0
- package/base/Plugin.js +176 -0
- package/base/PluginManager.js +51 -0
- package/base/SlotableListener.js +40 -0
- package/base/SortCommand.js +30 -0
- package/base/SortableListener.js +135 -0
- package/base/Sorting.js +36 -0
- package/base/Tag.js +113 -0
- package/base/TagGroup.js +183 -0
- package/base/TagListener.js +34 -0
- package/base/TagManager.js +61 -0
- package/base/TagName.js +470 -0
- package/base/ToolbarListener.js +11 -0
- package/base/util.js +59 -0
- package/block/Block.js +51 -0
- package/block/BlockDialog.js +11 -0
- package/block/BlockElement.js +21 -0
- package/block/BlockListener.js +60 -0
- package/blockquote/Blockquote.js +43 -0
- package/blockquote/BlockquoteFilter.js +22 -0
- package/blockquote/BlockquoteListener.js +34 -0
- package/bold/Bold.js +30 -0
- package/break/Break.js +33 -0
- package/break/BreakFilter.js +24 -0
- package/build/BuildEditor.js +97 -0
- package/build/editor.css +548 -0
- package/build/editor.woff2 +0 -0
- package/cite/Cite.js +30 -0
- package/code/Code.js +30 -0
- package/data/Data.js +32 -0
- package/data/DataDialog.js +13 -0
- package/definition/Definition.js +32 -0
- package/definition/DefinitionDialog.js +13 -0
- package/deletion/Deletion.js +30 -0
- package/details/Details.js +63 -0
- package/details/DetailsFilter.js +17 -0
- package/details/DetailsListener.js +102 -0
- package/division/Division.js +53 -0
- package/division/DivisionDialog.js +13 -0
- package/emphasis/Emphasis.js +30 -0
- package/figure/Figure.js +58 -0
- package/figure/FigureFilter.js +14 -0
- package/figure/FigureListener.js +23 -0
- package/heading/Heading.js +38 -0
- package/horizontalrule/HorizontalRule.js +37 -0
- package/i18n/I18n.js +26 -0
- package/i18n/de.js +167 -0
- package/iframe/Iframe.js +49 -0
- package/iframe/IframeDialog.js +20 -0
- package/iframe/IframeListener.js +48 -0
- package/image/Image.js +47 -0
- package/image/ImageDialog.js +23 -0
- package/image/ImageListener.js +47 -0
- package/insertion/Insertion.js +30 -0
- package/italic/Italic.js +30 -0
- package/keyboard/Keyboard.js +30 -0
- package/link/Link.js +34 -0
- package/link/LinkDialog.js +14 -0
- package/link/LinkListener.js +45 -0
- package/list/List.js +40 -0
- package/list/ListListener.js +91 -0
- package/mark/Mark.js +30 -0
- package/orderedlist/OrderedList.js +39 -0
- package/package.json +24 -0
- package/paragraph/Paragraph.js +42 -0
- package/paragraph/ParagraphListener.js +40 -0
- package/preformat/Preformat.js +43 -0
- package/preformat/PreformatFilter.js +22 -0
- package/preformat/PreformatListener.js +34 -0
- package/quote/Quote.js +30 -0
- package/sample/Sample.js +30 -0
- package/section/Section.js +55 -0
- package/section/SectionDialog.js +13 -0
- package/small/Small.js +30 -0
- package/strikethrough/Strikethrough.js +30 -0
- package/strong/Strong.js +30 -0
- package/subheading/Subheading.js +38 -0
- package/subscript/Subscript.js +30 -0
- package/superscript/Superscript.js +30 -0
- package/table/Table.js +113 -0
- package/table/TableCellListener.js +125 -0
- package/table/TableColumnAddCommand.js +19 -0
- package/table/TableColumnListener.js +34 -0
- package/table/TableCommand.js +23 -0
- package/table/TableDialog.js +14 -0
- package/table/TableFilter.js +35 -0
- package/table/TableListener.js +39 -0
- package/table/TableRowAddCommand.js +18 -0
- package/table/TableRowListener.js +34 -0
- package/time/Time.js +32 -0
- package/time/TimeDialog.js +13 -0
- package/underline/Underline.js +30 -0
- package/unorderedlist/UnorderedList.js +39 -0
- package/variable/Variable.js +30 -0
- package/video/Video.js +47 -0
- package/video/VideoDialog.js +20 -0
- package/video/VideoListener.js +48 -0
package/iframe/Iframe.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Figure from '../figure/Figure.js';
|
|
3
|
+
import IframeDialog from './IframeDialog.js';
|
|
4
|
+
import IframeListener from './IframeListener.js';
|
|
5
|
+
import Plugin from '../base/Plugin.js';
|
|
6
|
+
import TagGroup from '../base/TagGroup.js';
|
|
7
|
+
import TagName from '../base/TagName.js';
|
|
8
|
+
|
|
9
|
+
export default class Iframe extends Plugin {
|
|
10
|
+
/**
|
|
11
|
+
* @type {string}
|
|
12
|
+
*/
|
|
13
|
+
static get name() {
|
|
14
|
+
return 'iframe';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @type {Plugin[]}
|
|
19
|
+
*/
|
|
20
|
+
static get dependencies() {
|
|
21
|
+
return [Base, Figure];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @type {Object.<string, any>}
|
|
26
|
+
*/
|
|
27
|
+
static get config() {
|
|
28
|
+
return { browser: undefined };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @return {void}
|
|
33
|
+
*/
|
|
34
|
+
init() {
|
|
35
|
+
this._tag({
|
|
36
|
+
name: TagName.IFRAME,
|
|
37
|
+
group: TagGroup.IFRAME,
|
|
38
|
+
attributes: ['allowfullscreen', 'height', 'id', 'src', 'width'],
|
|
39
|
+
empty: true,
|
|
40
|
+
navigable: true,
|
|
41
|
+
});
|
|
42
|
+
new IframeListener(this.editor);
|
|
43
|
+
this.editor.dialogs.set(
|
|
44
|
+
new IframeDialog(this.editor, this.constructor.name, this.editor.config.iframe.browser)
|
|
45
|
+
);
|
|
46
|
+
this._command(TagName.IFRAME);
|
|
47
|
+
this._toolbar('Iframe');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import Dialog from '../base/Dialog.js';
|
|
2
|
+
|
|
3
|
+
export default class IframeDialog extends Dialog {
|
|
4
|
+
/**
|
|
5
|
+
* @protected
|
|
6
|
+
* @return {void}
|
|
7
|
+
*/
|
|
8
|
+
_prepareForm() {
|
|
9
|
+
this.formCreator
|
|
10
|
+
.addLegend(this._('Iframe'))
|
|
11
|
+
.addTextInput('src', this._('URL'), {
|
|
12
|
+
pattern: '(https?|/).+',
|
|
13
|
+
placeholder: this._('Insert URL to embedded page'),
|
|
14
|
+
required: 'required',
|
|
15
|
+
})
|
|
16
|
+
.addNumberInput('width', this._('Width'))
|
|
17
|
+
.addNumberInput('height', this._('Height'))
|
|
18
|
+
.addTextInput('id', this._('ID'));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import Iframe from './Iframe.js';
|
|
2
|
+
import Listener from '../base/Listener.js';
|
|
3
|
+
import TagName from '../base/TagName.js';
|
|
4
|
+
|
|
5
|
+
export default class IframeListener extends Listener {
|
|
6
|
+
/**
|
|
7
|
+
* @param {Editor} editor
|
|
8
|
+
*/
|
|
9
|
+
constructor(editor) {
|
|
10
|
+
super(editor);
|
|
11
|
+
this.editor.root.addEventListener('sethtml', this);
|
|
12
|
+
this.editor.root.addEventListener('insertiframe', this);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {CustomEvent} event
|
|
17
|
+
* @param {HTMLElement} event.detail.element
|
|
18
|
+
* @return {void}
|
|
19
|
+
*/
|
|
20
|
+
sethtml({ detail: { element } }) {
|
|
21
|
+
Array.from(element.getElementsByTagName(TagName.IFRAME)).forEach((item) => this.#init(item));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {CustomEvent} event
|
|
26
|
+
* @param {HTMLIFrameElement} event.detail.element
|
|
27
|
+
* @return {void}
|
|
28
|
+
*/
|
|
29
|
+
insertiframe({ detail: { element } }) {
|
|
30
|
+
this.#init(element);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {HTMLIFrameElement} element
|
|
35
|
+
* @return {void}
|
|
36
|
+
*/
|
|
37
|
+
#init(element) {
|
|
38
|
+
const src = element.getAttribute('src');
|
|
39
|
+
|
|
40
|
+
if (!src) {
|
|
41
|
+
element.parentElement.removeChild(element);
|
|
42
|
+
} else {
|
|
43
|
+
element.setAttribute('src', this.editor.url(src));
|
|
44
|
+
element.allowFullscreen = true;
|
|
45
|
+
this.editor.dom.wrap(element, TagName.FIGURE, { attributes: { class: Iframe.name } });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
package/image/Image.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Figure from '../figure/Figure.js';
|
|
3
|
+
import ImageDialog from './ImageDialog.js';
|
|
4
|
+
import ImageListener from './ImageListener.js';
|
|
5
|
+
import Plugin from '../base/Plugin.js';
|
|
6
|
+
import TagGroup from '../base/TagGroup.js';
|
|
7
|
+
import TagName from '../base/TagName.js';
|
|
8
|
+
|
|
9
|
+
export default class Image extends Plugin {
|
|
10
|
+
/**
|
|
11
|
+
* @type {string}
|
|
12
|
+
*/
|
|
13
|
+
static get name() {
|
|
14
|
+
return 'image';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @type {Plugin[]}
|
|
19
|
+
*/
|
|
20
|
+
static get dependencies() {
|
|
21
|
+
return [Base, Figure];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @type {Object.<string, any>}
|
|
26
|
+
*/
|
|
27
|
+
static get config() {
|
|
28
|
+
return { browser: undefined };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @return {void}
|
|
33
|
+
*/
|
|
34
|
+
init() {
|
|
35
|
+
this._tag({
|
|
36
|
+
name: TagName.IMG,
|
|
37
|
+
group: TagGroup.IMAGE,
|
|
38
|
+
attributes: ['alt', 'height', 'id', 'src', 'width'],
|
|
39
|
+
empty: true,
|
|
40
|
+
navigable: true,
|
|
41
|
+
});
|
|
42
|
+
new ImageListener(this.editor);
|
|
43
|
+
this.editor.dialogs.set(new ImageDialog(this.editor, this.constructor.name, this.editor.config.image.browser));
|
|
44
|
+
this._command(TagName.IMG);
|
|
45
|
+
this._toolbar('Image');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Dialog from '../base/Dialog.js';
|
|
2
|
+
|
|
3
|
+
export default class ImageDialog extends Dialog {
|
|
4
|
+
/**
|
|
5
|
+
* @protected
|
|
6
|
+
* @return {void}
|
|
7
|
+
*/
|
|
8
|
+
_prepareForm() {
|
|
9
|
+
this.formCreator
|
|
10
|
+
.addLegend(this._('Image'))
|
|
11
|
+
.addTextInput('src', this._('URL'), {
|
|
12
|
+
pattern: '(https?|/).+',
|
|
13
|
+
placeholder: this._('Insert URL to image'),
|
|
14
|
+
required: 'required',
|
|
15
|
+
})
|
|
16
|
+
.addTextInput('alt', this._('Alternative text'), {
|
|
17
|
+
placeholder: this._('Text shown when media element is not available'),
|
|
18
|
+
})
|
|
19
|
+
.addNumberInput('width', this._('Width'))
|
|
20
|
+
.addNumberInput('height', this._('Height'))
|
|
21
|
+
.addTextInput('id', this._('ID'));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import Image from './Image.js';
|
|
2
|
+
import Listener from '../base/Listener.js';
|
|
3
|
+
import TagName from '../base/TagName.js';
|
|
4
|
+
|
|
5
|
+
export default class ImageListener extends Listener {
|
|
6
|
+
/**
|
|
7
|
+
* @param {Editor} editor
|
|
8
|
+
*/
|
|
9
|
+
constructor(editor) {
|
|
10
|
+
super(editor);
|
|
11
|
+
this.editor.root.addEventListener('sethtml', this);
|
|
12
|
+
this.editor.root.addEventListener('insertimg', this);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {CustomEvent} event
|
|
17
|
+
* @param {HTMLElement} event.detail.element
|
|
18
|
+
* @return {void}
|
|
19
|
+
*/
|
|
20
|
+
sethtml({ detail: { element } }) {
|
|
21
|
+
Array.from(element.getElementsByTagName(TagName.IMG)).forEach((item) => this.#init(item));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {CustomEvent} event
|
|
26
|
+
* @param {HTMLImageElement} event.detail.element
|
|
27
|
+
* @return {void}
|
|
28
|
+
*/
|
|
29
|
+
insertimg({ detail: { element } }) {
|
|
30
|
+
this.#init(element);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {HTMLImageElement} element
|
|
35
|
+
* @return {void}
|
|
36
|
+
*/
|
|
37
|
+
#init(element) {
|
|
38
|
+
const src = element.getAttribute('src');
|
|
39
|
+
|
|
40
|
+
if (!src) {
|
|
41
|
+
element.parentElement.removeChild(element);
|
|
42
|
+
} else {
|
|
43
|
+
element.setAttribute('src', this.editor.url(src));
|
|
44
|
+
this.editor.dom.wrap(element, TagName.FIGURE, { attributes: { class: Image.name } });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Key from '../base/Key.js';
|
|
3
|
+
import Plugin from '../base/Plugin.js';
|
|
4
|
+
import TagGroup from '../base/TagGroup.js';
|
|
5
|
+
import TagName from '../base/TagName.js';
|
|
6
|
+
|
|
7
|
+
export default class Insertion extends Plugin {
|
|
8
|
+
/**
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
static get name() {
|
|
12
|
+
return 'insertion';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {Plugin[]}
|
|
17
|
+
*/
|
|
18
|
+
static get dependencies() {
|
|
19
|
+
return [Base];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @return {void}
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
this._tag({ name: TagName.INS, group: TagGroup.FORMAT });
|
|
27
|
+
this._command(TagName.INS);
|
|
28
|
+
this._formatbar('Text Insertion', Key.F);
|
|
29
|
+
}
|
|
30
|
+
}
|
package/italic/Italic.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Key from '../base/Key.js';
|
|
3
|
+
import Plugin from '../base/Plugin.js';
|
|
4
|
+
import TagGroup from '../base/TagGroup.js';
|
|
5
|
+
import TagName from '../base/TagName.js';
|
|
6
|
+
|
|
7
|
+
export default class Italic extends Plugin {
|
|
8
|
+
/**
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
static get name() {
|
|
12
|
+
return 'italic';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {Plugin[]}
|
|
17
|
+
*/
|
|
18
|
+
static get dependencies() {
|
|
19
|
+
return [Base];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @return {void}
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
this._tag({ name: TagName.I, group: TagGroup.FORMAT });
|
|
27
|
+
this._command(TagName.I);
|
|
28
|
+
this._formatbar('italic', Key.I);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Key from '../base/Key.js';
|
|
3
|
+
import Plugin from '../base/Plugin.js';
|
|
4
|
+
import TagGroup from '../base/TagGroup.js';
|
|
5
|
+
import TagName from '../base/TagName.js';
|
|
6
|
+
|
|
7
|
+
export default class Keyboard extends Plugin {
|
|
8
|
+
/**
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
static get name() {
|
|
12
|
+
return 'keyboard';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {Plugin[]}
|
|
17
|
+
*/
|
|
18
|
+
static get dependencies() {
|
|
19
|
+
return [Base];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @return {void}
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
this._tag({ name: TagName.KBD, group: TagGroup.FORMAT });
|
|
27
|
+
this._command(TagName.KBD);
|
|
28
|
+
this._formatbar('User Input', Key.K);
|
|
29
|
+
}
|
|
30
|
+
}
|
package/link/Link.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Key from '../base/Key.js';
|
|
3
|
+
import LinkDialog from './LinkDialog.js';
|
|
4
|
+
import LinkListener from './LinkListener.js';
|
|
5
|
+
import Plugin from '../base/Plugin.js';
|
|
6
|
+
import TagGroup from '../base/TagGroup.js';
|
|
7
|
+
import TagName from '../base/TagName.js';
|
|
8
|
+
|
|
9
|
+
export default class Link extends Plugin {
|
|
10
|
+
/**
|
|
11
|
+
* @type {string}
|
|
12
|
+
*/
|
|
13
|
+
static get name() {
|
|
14
|
+
return 'link';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @type {Plugin[]}
|
|
19
|
+
*/
|
|
20
|
+
static get dependencies() {
|
|
21
|
+
return [Base];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @return {void}
|
|
26
|
+
*/
|
|
27
|
+
init() {
|
|
28
|
+
this._tag({ name: TagName.A, group: TagGroup.FORMAT, attributes: ['href'] });
|
|
29
|
+
new LinkListener(this.editor);
|
|
30
|
+
this.editor.dialogs.set(new LinkDialog(this.editor, this.constructor.name));
|
|
31
|
+
this._command(TagName.A);
|
|
32
|
+
this._formatbar('Link', Key.L);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Dialog from '../base/Dialog.js';
|
|
2
|
+
|
|
3
|
+
export default class LinkDialog extends Dialog {
|
|
4
|
+
/**
|
|
5
|
+
* @protected
|
|
6
|
+
* @return {void}
|
|
7
|
+
*/
|
|
8
|
+
_prepareForm() {
|
|
9
|
+
this.formCreator.addLegend(this._('Link')).addTextInput('href', this._('URL'), {
|
|
10
|
+
pattern: '(https?|/|mailto:|tel:).+',
|
|
11
|
+
placeholder: this._('Insert link or leave empty to unlink'),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Listener from '../base/Listener.js';
|
|
2
|
+
import TagName from '../base/TagName.js';
|
|
3
|
+
|
|
4
|
+
export default class LinkListener extends Listener {
|
|
5
|
+
/**
|
|
6
|
+
* @param {Editor} editor
|
|
7
|
+
*/
|
|
8
|
+
constructor(editor) {
|
|
9
|
+
super(editor);
|
|
10
|
+
this.editor.root.addEventListener('sethtml', this);
|
|
11
|
+
this.editor.root.addEventListener('inserta', this);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {CustomEvent} event
|
|
16
|
+
* @param {HTMLElement} event.detail.element
|
|
17
|
+
* @return {void}
|
|
18
|
+
*/
|
|
19
|
+
sethtml({ detail: { element } }) {
|
|
20
|
+
Array.from(element.getElementsByTagName(TagName.A)).forEach((item) => this.#init(item));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {CustomEvent} event
|
|
25
|
+
* @param {HTMLAnchorElement} event.detail.element
|
|
26
|
+
* @return {void}
|
|
27
|
+
*/
|
|
28
|
+
inserta({ detail: { element } }) {
|
|
29
|
+
this.#init(element);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param {HTMLAnchorElement} element
|
|
34
|
+
* @return {void}
|
|
35
|
+
*/
|
|
36
|
+
#init(element) {
|
|
37
|
+
const href = element.getAttribute('href');
|
|
38
|
+
|
|
39
|
+
if (!href) {
|
|
40
|
+
element.parentElement.replaceChild(this.editor.dom.createText(element.textContent), element);
|
|
41
|
+
} else {
|
|
42
|
+
element.setAttribute('href', this.editor.url(href));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
package/list/List.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Break from '../break/Break.js';
|
|
3
|
+
import ListListener from './ListListener.js';
|
|
4
|
+
import Plugin from '../base/Plugin.js';
|
|
5
|
+
import TagGroup from '../base/TagGroup.js';
|
|
6
|
+
import TagName from '../base/TagName.js';
|
|
7
|
+
|
|
8
|
+
export default class List extends Plugin {
|
|
9
|
+
/**
|
|
10
|
+
* @type {string}
|
|
11
|
+
*/
|
|
12
|
+
static get name() {
|
|
13
|
+
return 'list';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @type {Plugin[]}
|
|
18
|
+
*/
|
|
19
|
+
static get dependencies() {
|
|
20
|
+
return [Base, Break];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @return {void}
|
|
25
|
+
*/
|
|
26
|
+
init() {
|
|
27
|
+
this._tag({
|
|
28
|
+
name: TagName.LI,
|
|
29
|
+
group: TagGroup.LISTITEM,
|
|
30
|
+
children: [TagGroup.BREAK, TagGroup.FORMAT],
|
|
31
|
+
deletable: true,
|
|
32
|
+
editable: true,
|
|
33
|
+
focusable: true,
|
|
34
|
+
navigable: true,
|
|
35
|
+
sortable: true,
|
|
36
|
+
enter: TagName.LI,
|
|
37
|
+
});
|
|
38
|
+
new ListListener(this.editor);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Listener from '../base/Listener.js';
|
|
2
|
+
import TagName from '../base/TagName.js';
|
|
3
|
+
|
|
4
|
+
export default class ListListener extends Listener {
|
|
5
|
+
/**
|
|
6
|
+
* @param {Editor} editor
|
|
7
|
+
*/
|
|
8
|
+
constructor(editor) {
|
|
9
|
+
super(editor);
|
|
10
|
+
this.editor.root.addEventListener('sethtml', this);
|
|
11
|
+
this.editor.root.addEventListener('insertli', this);
|
|
12
|
+
this.editor.root.addEventListener('deleteli', this);
|
|
13
|
+
this.editor.root.addEventListener('insertol', this);
|
|
14
|
+
this.editor.root.addEventListener('insertul', this);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param {CustomEvent} event
|
|
19
|
+
* @param {HTMLElement} event.detail.element
|
|
20
|
+
* @return {void}
|
|
21
|
+
*/
|
|
22
|
+
sethtml({ detail: { element } }) {
|
|
23
|
+
Array.from(element.getElementsByTagName(TagName.LI)).forEach((item) => this.#init(item));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param {CustomEvent} event
|
|
28
|
+
* @param {HTMLLIElement} event.detail.element
|
|
29
|
+
* @return {void}
|
|
30
|
+
*/
|
|
31
|
+
insertli({ detail: { element } }) {
|
|
32
|
+
this.#init(element);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Removes parent element too if deleted listitem was the only child
|
|
37
|
+
*
|
|
38
|
+
* @param {HTMLOListElement|HTMLUListElement} target
|
|
39
|
+
* @return {void}
|
|
40
|
+
*/
|
|
41
|
+
deleteli({ detail: { target } }) {
|
|
42
|
+
if (target.children.length === 0) {
|
|
43
|
+
target.parentElement.removeChild(target);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param {CustomEvent} event
|
|
49
|
+
* @param {HTMLOListElement} event.detail.element
|
|
50
|
+
* @return {void}
|
|
51
|
+
*/
|
|
52
|
+
insertol({ detail: { element } }) {
|
|
53
|
+
this.#insert(element);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @param {CustomEvent} event
|
|
58
|
+
* @param {HTMLUListElement} event.detail.element
|
|
59
|
+
* @return {void}
|
|
60
|
+
*/
|
|
61
|
+
insertul({ detail: { element } }) {
|
|
62
|
+
this.#insert(element);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Initializes listitem elements
|
|
67
|
+
*
|
|
68
|
+
* @param {HTMLLIElement} element
|
|
69
|
+
* @return {void}
|
|
70
|
+
*/
|
|
71
|
+
#init(element) {
|
|
72
|
+
if (
|
|
73
|
+
!(element.parentElement instanceof HTMLOListElement) &&
|
|
74
|
+
!(element.parentElement instanceof HTMLUListElement)
|
|
75
|
+
) {
|
|
76
|
+
this.editor.dom.wrap(element, TagName.UL);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Initializes list elements
|
|
82
|
+
*
|
|
83
|
+
* @param {HTMLOListElement|HTMLUListElement} element
|
|
84
|
+
* @return {void}
|
|
85
|
+
*/
|
|
86
|
+
#insert(element) {
|
|
87
|
+
if (element.children.length === 0) {
|
|
88
|
+
this.editor.dom.insertLastChild(this.editor.dom.createElement(TagName.LI), element);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
package/mark/Mark.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import Key from '../base/Key.js';
|
|
3
|
+
import Plugin from '../base/Plugin.js';
|
|
4
|
+
import TagGroup from '../base/TagGroup.js';
|
|
5
|
+
import TagName from '../base/TagName.js';
|
|
6
|
+
|
|
7
|
+
export default class Mark extends Plugin {
|
|
8
|
+
/**
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
static get name() {
|
|
12
|
+
return 'mark';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {Plugin[]}
|
|
17
|
+
*/
|
|
18
|
+
static get dependencies() {
|
|
19
|
+
return [Base];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @return {void}
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
this._tag({ name: TagName.MARK, group: TagGroup.FORMAT });
|
|
27
|
+
this._command(TagName.MARK);
|
|
28
|
+
this._formatbar('mark', Key.M);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Base from '../base/Base.js';
|
|
2
|
+
import List from '../list/List.js';
|
|
3
|
+
import Plugin from '../base/Plugin.js';
|
|
4
|
+
import TagGroup from '../base/TagGroup.js';
|
|
5
|
+
import TagName from '../base/TagName.js';
|
|
6
|
+
|
|
7
|
+
export default class OrderedList extends Plugin {
|
|
8
|
+
/**
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
static get name() {
|
|
12
|
+
return 'orderedlist';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @type {Plugin[]}
|
|
17
|
+
*/
|
|
18
|
+
static get dependencies() {
|
|
19
|
+
return [Base, List];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @return {void}
|
|
24
|
+
*/
|
|
25
|
+
init() {
|
|
26
|
+
this._tag({
|
|
27
|
+
name: TagName.OL,
|
|
28
|
+
group: TagGroup.LIST,
|
|
29
|
+
children: [TagGroup.LISTITEM],
|
|
30
|
+
arbitrary: true,
|
|
31
|
+
deletable: true,
|
|
32
|
+
focusable: true,
|
|
33
|
+
navigable: true,
|
|
34
|
+
sortable: true,
|
|
35
|
+
});
|
|
36
|
+
this._command(TagName.OL);
|
|
37
|
+
this._toolbar('Ordered List');
|
|
38
|
+
}
|
|
39
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@akilli/editor-src",
|
|
3
|
+
"version": "5.1.5",
|
|
4
|
+
"description": "@akilli/editor source files",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"contenteditable",
|
|
7
|
+
"editor",
|
|
8
|
+
"html-editor",
|
|
9
|
+
"rte",
|
|
10
|
+
"rich-text",
|
|
11
|
+
"rich-text-editor",
|
|
12
|
+
"wysiwyg",
|
|
13
|
+
"wysiwyg-editor"
|
|
14
|
+
],
|
|
15
|
+
"author": "Ayhan Akilli",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"bugs": "https://github.com/akilli/editor/issues",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/akilli/editor.git"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"browser": "./build/BuildEditor.js"
|
|
24
|
+
}
|