diff --git a/types/ckeditor/ckeditor-tests.ts b/types/ckeditor/ckeditor-tests.ts new file mode 100644 index 0000000000..d849b52a4a --- /dev/null +++ b/types/ckeditor/ckeditor-tests.ts @@ -0,0 +1,1214 @@ + + +function test_CKEDITOR() { + CKEDITOR.basePath = 'test'; + CKEDITOR.replaceClass = 'rich_editor'; + CKEDITOR.skinName = 'moono'; + CKEDITOR.skinName = 'myskin,/customstuff/myskin/'; + var editor = new CKEDITOR.editor(); + if (editor.getSelection(true).getType() == CKEDITOR.SELECTION_ELEMENT) + if (editor.getSelection(false).getType() == CKEDITOR.SELECTION_NONE) + if (editor.getSelection(true).getType() == CKEDITOR.SELECTION_TEXT) + alert(CKEDITOR.basePath); + if (CKEDITOR.currentInstance) + alert(CKEDITOR.currentInstance.name); + alert(CKEDITOR.document.getBody().getName()); + alert(CKEDITOR.instances[0].name); + CKEDITOR.loadFullCoreTimeout = 5; + alert(CKEDITOR.revision); + alert(CKEDITOR.rnd); + if (CKEDITOR.status == 'loaded') { + CKEDITOR.loadFullCore(); + } + alert(CKEDITOR.timestamp); + CKEDITOR.addCss('.cke_editable h1,.cke_editable h2,.cke_editable h3 { border-bottom: 1px dotted red }'); + CKEDITOR.appendTo('editorSpace'); + alert(CKEDITOR.getUrl('skins/default/editor.css')); + alert(CKEDITOR.getUrl('/skins/default/editor.css')); + alert(CKEDITOR.getUrl('http://www.somesite.com/skins/default/editor.css')); + CKEDITOR.inline('content'); + if (CKEDITOR.loadFullCore) + CKEDITOR.loadFullCore(); + CKEDITOR.replace('myfield'); + var textarea = document.createElement('textarea'); + CKEDITOR.replace(textarea); + CKEDITOR.replaceAll(); + CKEDITOR.replaceAll('myClassName'); + CKEDITOR.replaceAll((textarea, config) => false); + + var editor: CKEDITOR.editor = CKEDITOR.appendTo('append here', CKEDITOR.config, 'data'); + var editor: CKEDITOR.editor = CKEDITOR.appendTo(document.createElement('div')); + CKEDITOR.error('code'); + CKEDITOR.error('500', { moreData: true }); + CKEDITOR.warn('danger'); + CKEDITOR.warn('303', 12345); +} + +function test_CKEDITOR_events() { + CKEDITOR.on('instanceCreated', function(event) { + // $ExpectType editor + event.editor; + }); +} + +function test_config() { + var config1: CKEDITOR.config = { + toolbar: 'basic', + }; + var config2: CKEDITOR.config = { + toolbar: [ + [ 'mode', 'document', 'doctools' ], + [ 'clipboard', 'undo' ], + '/', + [ 'find', 'selection', 'spellchecker' ], + [ 'basicstyles', 'cleanup' ], + '/', + [ 'list', 'indent', 'blocks', 'align', 'bidi' ], + ], + }; + var config3: CKEDITOR.config = { + toolbarGroups: [ + { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, + { name: 'editing', groups: [ 'find', 'selection', 'spellchecker', 'editing' ] }, + { name: 'links', groups: [ 'links' ] }, + { name: 'insert', groups: [ 'insert' ] }, + { name: 'tools', groups: [ 'tools' ] }, + { name: 'document', groups: [ 'mode' ] }, + { name: 'about', groups: [ 'about' ] }, + '/', + { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] }, + { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'paragraph' ] }, + '/', + { name: 'styles', groups: [ 'styles' ] }, + { name: 'colors', groups: [ 'colors' ] }, + ], + } +} + +function test_dom_comment() { + var type = CKEDITOR.NODE_COMMENT; + var nativeNode = document.createComment('Example'); + var comment = new CKEDITOR.dom.comment(nativeNode); + var comment2 = new CKEDITOR.dom.comment('Example'); + var comment3 = new CKEDITOR.dom.comment('Example', new CKEDITOR.dom.document(document)); + var html: string = comment.getOuterHtml(); +} + +function test_dom_document() { + var document = new CKEDITOR.dom.document(window.document); + var type = CKEDITOR.NODE_DOCUMENT; + CKEDITOR.document.appendStyleSheet('/mystyles.css'); + var element = CKEDITOR.document.getBody(); + alert(element.getName()); + var element2 = CKEDITOR.document.getById('myElement'); + alert(element.getId()); + var element3 = CKEDITOR.document.getHead(); + alert(element.getName()); + var selection = CKEDITOR.instances[0].document.getSelection(); + alert(selection.getType()); + document.write( + '' + + 'Sample Doc' + + 'Document contents created by code' + + '' + ); + var styles: CSSStyleSheet = document.appendStyleText('some styles'); + var element: CKEDITOR.dom.element = document.createElement('div'); + var element2: CKEDITOR.dom.element = document.createElement('div', { styles: { height: '1234' } }); + var element3: CKEDITOR.dom.element = document.createElement('div', { attributes: { id: '1234' } }); + var element4: CKEDITOR.dom.element = document.createElement('div', { attributes: { tabIndex: '1234' }, styles: { width: '1234' } }); +} + +function test_dom_documentFragment() { + var type = CKEDITOR.NODE_DOCUMENT_FRAGMENT; + alert(new CKEDITOR.dom.documentFragment(document.body).type === type); +} + +function test_dom_domObject() { + var element = new CKEDITOR.dom.element('span'); + alert(element.$.nodeType); + var nativeElement = element.$; + var doc = new CKEDITOR.dom.document(document); + alert(doc.equals(CKEDITOR.document)); + alert(doc == CKEDITOR.document); + var element2 = new CKEDITOR.dom.element('span'); + alert(element.getCustomData('hasCustomData')); + alert(element.getCustomData('nonExistingKey')); + var elementA = new CKEDITOR.dom.element(nativeElement); + elementA.getPrivate().value = 1; + var elementB = new CKEDITOR.dom.element(nativeElement).getPrivate().value; + var element3 = new CKEDITOR.dom.element('span'); + element.setCustomData('hasCustomData', true); + + var domObject = new CKEDITOR.dom.domObject(document.createElement('div')); +} + +function test_dom_element() { + var element = new CKEDITOR.dom.element('span'); + alert(element.$.nodeType); + element.addClass('classA'); + element.addClass('classB'); + element.addClass('classA'); + var p = new CKEDITOR.dom.element('p'); + var strong = new CKEDITOR.dom.element('strong'); + p.append(strong); + var em = p.append('em'); + var p = new CKEDITOR.dom.element('p'); + p.appendText('This is'); + p.appendText(' some text'); + element.breakParent(strong); + element.data('extra-info', 'test'); + alert(element.data('extra-info')); + element.data('extra-info', false); + var element5 = CKEDITOR.document.getById('myTextarea'); + element.focus(); + element.focusNext(); + element.focusPrevious(); + element.forEach(node=> { + console.log(node); + }); + var element2 = CKEDITOR.dom.element.createFromHtml(''); + alert(element.getAttribute('type')); + alert(element.getComputedStyle('display')); + element.appendTo(CKEDITOR.document.getBody()); + alert(element.getEditor().name); + var first = element.getFirst(); + var first2 = element.getFirst((node: CKEDITOR.dom.node) => node.equals(document.body)); + alert(element.getHtml()); + alert(element.getId()); + alert(element.getName()); + alert('' + element.getNameAtt() + ''); + alert(element.getOuterHtml()); + alert(element.getTabIndex()); + alert(element.getText()); + alert(element.hasAttributes()); + alert(element.hasAttributes()); + element.hide(); + alert(element.is('span')); + alert(element.is('p', 'span')); + alert(element.is('p')); + alert(element.is('p', 'div')); + alert(element.is({ p: 1, span: 1 })); + element.removeAttribute('class'); + element.addClass('classA'); + element.addClass('classB'); + element.removeClass('classA'); + element.removeClass('classB'); + element.removeStyle('display'); + element.setAttribute('class', 'myClass'); + element.setAttribute('title', 'This is an example'); + element.setAttributes({ + 'class': 'myClass', + title: 'This is an example' + }); + p.setHtml('Inner HTML'); + element.setOpacity(0.75); + element.setStyle('background-color', '#ff0000'); + element.setStyle('margin-top', '10px'); + element.setStyle('float', 'right'); + element.setStyles({ + position: 'absolute', + float: 'right' + }); + element.setText('A > B & C < D'); + element.show(); + element.unselectable(); + alert(element.getName()); + alert(element == CKEDITOR.dom.element.get(element)); + var htmlElement = document.getElementById('myElement'); + alert(CKEDITOR.dom.element.get(htmlElement).getName()); + + var dtd: CKEDITOR.dtdDefinition = element.getDtd(); + var last: CKEDITOR.dom.node = element.getLast(); + var last2: CKEDITOR.dom.node = element.getLast((node: CKEDITOR.dom.node) => node.equals(document.body)); + if (element.isBlockBoundary({ 'div': 1, 'span': 1 })) { + element.setState(1, 'hex', false); + } + + CKEDITOR.dom.element.clearMarkers({}, element, true); + var element1: CKEDITOR.dom.element = CKEDITOR.dom.element.get('div'); + var element2: CKEDITOR.dom.element = CKEDITOR.dom.element.get(document.createElement('div')); + var element3: CKEDITOR.dom.element = CKEDITOR.dom.element.get(element2); + var markedElement: CKEDITOR.dom.element = CKEDITOR.dom.element.setMarker({}, element, 'key', 0); +} + +function test_dom_elementPath() { + var path: CKEDITOR.dom.elementPath = new CKEDITOR.dom.elementPath(CKEDITOR.dom.element.get('div')); + var path2: CKEDITOR.dom.elementPath = new CKEDITOR.dom.elementPath(CKEDITOR.dom.element.get('div'), CKEDITOR.dom.element.get(document.body)); + + var dir: 'ltr' | 'rtl' = path.direction(); +} + +function test_dom_event() { + var event = new CKEDITOR.dom.event(new Event("")); + alert(event.getKey()); + alert(event.getKeystroke() == 65); + alert(event.getKeystroke() == CKEDITOR.CTRL + 65); + alert(event.getKeystroke() == CKEDITOR.CTRL + CKEDITOR.SHIFT + 65); + var element = new CKEDITOR.dom.element('div'); + element.on('mousemouse', ev=> { + var pageOffset = ev.data.getPageOffset(); + alert(pageOffset.x); + alert(pageOffset.y); + }); + element.on('click', ev=> { + var domEvent = ev.data; + domEvent.getTarget().addClass('clicked'); + }); + element.on('click', ev=> { + var domEvent = ev.data as CKEDITOR.dom.event; + domEvent.preventDefault(); + }); +} + +function test_dom_iterator() { + var range = new CKEDITOR.dom.range(new CKEDITOR.dom.element('div')); + var iterator = range.createIterator(); + var paragrah1: CKEDITOR.dom.element = iterator.getNextParagraph(); + var paragrah2: CKEDITOR.dom.element = iterator.getNextParagraph('div'); + alert(iterator.forceBrBreak === false); + var itRange: CKEDITOR.dom.range = iterator.range; +} + +function test_dom_node() { + var p = new CKEDITOR.dom.element('p'); + var strong = new CKEDITOR.dom.element('strong'); + strong.appendTo(p); + var node = new CKEDITOR.dom.node(new Node()); + node = node.getAscendant('b'); + node = node.getAscendant('b', true); + var element = CKEDITOR.document.getById('example'); + alert(element.getDocument().equals(CKEDITOR.document)); + element.getIndex(); + element.getIndex(true); + var last = element.getFirst().getNext(); + var parent = node.getParent(); + alert(parent.getName()); + var parents = node.getParents(); + var em = new CKEDITOR.dom.element('em'); + strong.insertAfter(em); + strong.insertBefore(em); + strong.insertBeforeMe(em); + element.isReadOnly(); +} + +function test_dom_nodeList() { + var nodeList = CKEDITOR.document.getBody().getChildren(); + alert(nodeList.count()); + var nodes: CKEDITOR.dom.node[] = nodeList.toArray(); +} + +function test_dom_range() { + var editor = new CKEDITOR.editor(); + var range = new CKEDITOR.dom.range(editor.document); + range.selectNodeContents(editor.document.getBody()); + range.deleteContents(); + range.selectNodeContents(editor.document.getBody()); + alert(range.collapsed); + range.collapse(); + alert(range.collapsed); + range.selectNodeContents(range.document.getBody()); + range.selectNodeContents(editor.document.getBody()); + alert(range.endContainer.getPrivate()); + range.selectNodeContents(editor.document.getBody()); + alert(range.endOffset); + range.selectNodeContents(editor.document.getBody()); + alert(range.startContainer.getDocument()); + range.selectNodeContents(editor.document.getBody()); + alert(range.startOffset); +} + +function test_dom_selection() { + var element: CKEDITOR.dom.element = CKEDITOR.dom.element.get('div'); + var selection: CKEDITOR.dom.selection = new CKEDITOR.dom.selection(new CKEDITOR.dom.document(document)); + selection = new CKEDITOR.dom.selection(element); + selection = new CKEDITOR.dom.selection(selection); + + var marks: CKEDITOR.dom.bookmark[] = selection.createBookmarks('serialized'); + var marks2: CKEDITOR.dom.bookmark2[] = selection.createBookmarks2({ normalized: true }); + selection.fake(element); + selection.fake(element, true); + element = selection.getCommonAncestor(); + var domSel: Selection = selection.getNative(); + var ranges: CKEDITOR.dom.range[] = selection.getRanges(); + ranges = selection.getRanges(true); + element = selection.getSelectedElement(); + var text: string = selection.getSelectedText(); + element = selection.getStartElement(); + + var type: number = selection.getType(); + + var isSomething: boolean = selection.isCollapsed(); + isSomething = selection.isHidden(); + isSomething = selection.isInTable(); + isSomething = selection.isInTable(false); + + selection.lock(); + selection.removeAllRanges(); + selection.reset(); + selection.removeAllRanges(); + selection.reset(); + selection.scrollIntoView(); + selection = selection.selectBookmarks(marks); + selection = selection.selectBookmarks(marks2); + selection.selectElement(element); + selection.selectRanges(ranges); + selection.unlock(false); +} + +function test_dom_walker() { + var element: CKEDITOR.dom.element = CKEDITOR.dom.element.get('div'); + var range: CKEDITOR.dom.range = new CKEDITOR.dom.range(element); + + var walker: CKEDITOR.dom.walker = new CKEDITOR.dom.walker(range); + + var isSomething: boolean = walker.checkBackward(); + isSomething = walker.checkForward(); + walker.end(); + + var node: CKEDITOR.dom.node = walker.lastBackward(); + node = walker.lastForward(); + node = walker.next(); + node = walker.previous(); + walker.reset(); + + isSomething = CKEDITOR.dom.walker.blockBoundary({ 'div': 1 })(node); + isSomething = CKEDITOR.dom.walker.bogus()(node); + isSomething = CKEDITOR.dom.walker.bogus(isSomething)(node); + isSomething = CKEDITOR.dom.walker.bookmark()(node); + isSomething = CKEDITOR.dom.walker.bookmark(true)(node); + isSomething = CKEDITOR.dom.walker.bookmark(true, false)(node); + isSomething = CKEDITOR.dom.walker.editable()(node); + isSomething = CKEDITOR.dom.walker.editable(isSomething)(node); + isSomething = CKEDITOR.dom.walker.empty()(node); + isSomething = CKEDITOR.dom.walker.empty(true)(node); + isSomething = CKEDITOR.dom.walker.ignored()(node); + isSomething = CKEDITOR.dom.walker.ignored(true)(node); + isSomething = CKEDITOR.dom.walker.listItemBoundary()(node); + isSomething = CKEDITOR.dom.walker.nodeType(0)(node); + isSomething = CKEDITOR.dom.walker.nodeType(1, true)(node); + isSomething = CKEDITOR.dom.walker.temp()(node); + isSomething = CKEDITOR.dom.walker.temp(isSomething)(node); + isSomething = CKEDITOR.dom.walker.whitespaces()(node); + isSomething = CKEDITOR.dom.walker.whitespaces(isSomething)(node); +} + +function test_dom_text() { + var nativeNode = document.createTextNode('Example'); + var text = new CKEDITOR.dom.text(nativeNode); + var text2 = new CKEDITOR.dom.text('Example'); + text.substring(1, 2); + text.substring(1); +} + +function test_dom_window() { + var document = new CKEDITOR.dom.window(window); + var win = new CKEDITOR.dom.window(window); + var pos = win.getScrollPosition(); + alert(pos.x); + alert(pos.y); + var size = win.getViewPaneSize(); + alert(size.width); + alert(size.height); + + var frame: CKEDITOR.dom.element = win.getFrame(); + win.focus(); +} + +function test_ajax() { + var req: string = CKEDITOR.ajax.load('https://ckeditor.com/ckeditor-4/'); + req = CKEDITOR.ajax.load('https://ckeditor.com/ckeditor-4/', (data: any) => console.log(data)); + + var xml: CKEDITOR.xml = CKEDITOR.ajax.loadXml('https://ckeditor.com/ckeditor-4/'); + xml = CKEDITOR.ajax.loadXml('https://ckeditor.com/ckeditor-4/', (data: any) => console.log(data)); + + CKEDITOR.ajax.post('https://ckeditor.com/ckeditor-4/', {}); + CKEDITOR.ajax.post('https://ckeditor.com/ckeditor-4/', {}, 'html'); + CKEDITOR.ajax.post('https://ckeditor.com/ckeditor-4/', {}, 'text', (data: any) => console.log(data)); +} + +function test_dataProcessor() { + var processor: CKEDITOR.dataProcessor; + processor.toDataFormat('html', 'fix'); + processor.toHtml('data'); + processor.toHtml('data', 'fix'); +} + +function test_dialog() { + var dialog: CKEDITOR.dialog = new CKEDITOR.dialog(CKEDITOR.instances[0], 'dialog'); + + var element: CKEDITOR.dom.element = CKEDITOR.dom.element.get('div'); + dialog.addFocusable(element); + dialog.addFocusable(element, 13); + dialog.addPage({ some: true, object: false }); + var ret = dialog.click('1234'); + dialog.commitContent(); + dialog.disableButton('some button'); + dialog.enableButton('4321'); + dialog = dialog.foreach(() => console.log('hey')); + + var button: CKEDITOR.ui.dialog.button = dialog.getButton('button1'); + var uiEl: CKEDITOR.ui.dialog.uiElement = dialog.getContentElement('page1', 'element1'); + element = dialog.getElement(); + var str: string = dialog.getName(); + var numb: number = dialog.getPageCount(); + var editor: CKEDITOR.editor = dialog.getParentEditor(); + var obj: { [key: string]: any } = dialog.getPosition(); + element = dialog.getSelectedElement(); + obj = dialog.getSize(); + obj = dialog.getValueOf('page1', 'ele1'); + dialog.hide(); + dialog.hidePage('1234'); + dialog.layout(); + dialog.move(1, 2, true); + dialog = dialog.reset(); + dialog.resize(numb, numb); + dialog.selectPage('1'); + dialog.setState(4); + dialog.setValueOf('page1', 'ele1', false); + dialog.setupContent(); + dialog.show(); + dialog.showPage('1234'); + dialog.updateStyle(); + + CKEDITOR.dialog.add( 'abbrDialog', this.path + 'dialogs/abbr.js' ); + CKEDITOR.dialog.add( 'abbrDialog', function ( editor: CKEDITOR.editor ) { + return { + title: 'Abbreviation Properties', + minWidth: 400, + minHeight: 200, + onLoad: () => {}, + onOk: () => {}, + onCancel: () => {}, + onShow: () => {}, + onHide: () => {}, + contents: [ + { + id: 'tab-basic', + label: 'Basic Settings', + elements: [] + }, + { + id: 'tab-adv', + label: 'Advanced Settings', + elements: [] + } + ] + }; + }); + + CKEDITOR.dialog.addIframe('frame', 'frame', 1234, 4321); + CKEDITOR.dialog.addIframe('frame', 'frame', 1234, 4321, () => console.log('loaded')); + CKEDITOR.dialog.addIframe('frame', 'frame', 1234, 4321, () => console.log('loaded'), obj); + + CKEDITOR.dialog.addUIElement('node', () => console.log('build')); + CKEDITOR.dialog.cancelButton(); + CKEDITOR.dialog.exists('dialog1'); + CKEDITOR.dialog.exists(1234); + dialog = CKEDITOR.dialog.getCurrent(); + + var isEnabled: boolean = CKEDITOR.dialog.isTabEnabled(editor, 'dialog', 'table'); + + CKEDITOR.dialog.okButton(); +} + +function test_editable() { + var element: CKEDITOR.dom.element; + var editor: CKEDITOR.editor; + + var editable: CKEDITOR.editable = new CKEDITOR.editable(editor, element); + editable = new CKEDITOR.editable(editor, document.createElement('div')); + + editable.attachClass('class'); + editable.attachListener(editable, 'event', (evt: CKEDITOR.eventInfo) => console.log('listen')).removeListener(); + editable.attachListener(new CKEDITOR.event(), 'event', (evt: CKEDITOR.eventInfo) => console.log('listen')).removeListener(); + editable.attachListener(new CKEDITOR.event(), 'event', (evt: CKEDITOR.eventInfo) => console.log('listen'), { scope: 'object' }).removeListener(); + editable.attachListener(editable, 'event', (evt: CKEDITOR.eventInfo) => console.log('listen'), { scope: 'object' }, 'data').removeListener(); + editable.attachListener(editable, 'event', (evt: CKEDITOR.eventInfo) => console.log('listen'), { scope: 'object' }, 'data', 1).removeListener(); + + editable.changeAttr('attr', 'val'); + editable.detach(); + + var range: CKEDITOR.dom.range; + editable.insertElement(element); + editable.insertElement(element, range); + editable.insertHtml('data'); + editable.insertHtml('data', 'mode'); + editable.insertHtml('data', 'mode', range); + editable.insertText(new CKEDITOR.dom.text('text')); + + var inline: boolean = editable.isInline(); + editable.setReadOnly(inline); +} + +function test_fileTools() { + var editor: CKEDITOR.editor; + var def: CKEDITOR.fileTools.uploadWidgetDefinition; + var loader: CKEDITOR.fileTools.fileLoader; + var blob: Blob; + var element: CKEDITOR.dom.element; + + CKEDITOR.fileTools.addUploadWidget(editor, 'editor', def); + CKEDITOR.fileTools.bindNotification(editor, loader); + var url: string = CKEDITOR.fileTools.getUploadUrl({ some: 'object' }); + url = CKEDITOR.fileTools.getUploadUrl({ some: 'object' }, 'type'); + + var supported = CKEDITOR.fileTools.isTypeSupported(blob, /regex/); + CKEDITOR.fileTools.markElement(element, 'name', 45); +} + +function test_fileTools_fileLoader() { + var editor: CKEDITOR.editor; + var def: CKEDITOR.fileTools.uploadWidgetDefinition; + var blob: Blob; + var element: CKEDITOR.dom.element; + + var loader: CKEDITOR.fileTools.fileLoader = new CKEDITOR.fileTools.fileLoader(editor, 'data'); + loader = new CKEDITOR.fileTools.fileLoader(editor, blob); + loader = new CKEDITOR.fileTools.fileLoader(editor, blob, 'name'); + + loader.abort(); + var finished: boolean = loader.isFinished(); + loader.load(); + loader.loadAndUpload('url'); + loader.loadAndUpload('url', { someHeader: '1234' }); + + loader.update(); + loader.upload('url'); + loader.upload('url', { someHeader: '1234' }); +} + +function test_fileTools_uploadRepository() { + var editor: CKEDITOR.editor; + var blob: Blob; + var repo: CKEDITOR.fileTools.uploadRepository = new CKEDITOR.fileTools.uploadRepository(editor); + + var loader: CKEDITOR.fileTools.fileLoader = repo.create('data', 'name'); + loader = repo.create(blob, 'name', 'type'); + + var fin: boolean = loader.isFinished(); +} + +function test_filter() { + var editor: CKEDITOR.editor; + var style: CKEDITOR.style; + + var filter: CKEDITOR.filter = new CKEDITOR.filter(editor); + filter = new CKEDITOR.filter('rule'); + filter = new CKEDITOR.filter(style); + filter = new CKEDITOR.filter([ style, 'rule', [ style, 'rule' ] ]); + filter = CKEDITOR.filter.instances['1234']; + + filter.addContentForms([ { form: true } ]); + filter.addElementCallback((el: CKEDITOR.htmlParser.element) => 4); + filter.addFeature({ allowedContent: style }); + filter.addTransformations([ [ 'transform1', { right: (element: CKEDITOR.htmlParser.element, tools: string | CKEDITOR.filter.transformationTools) => true } ] ]); + + var allowed: boolean = filter.allow(style); + allowed = filter.allow([style], 'name'); + allowed = filter.allow('rule', 'name', false); + + var apply: boolean = filter.applyTo(CKEDITOR.htmlParser.fragment.fromHtml('string'), true, false, 1); + apply = filter.applyTo(new CKEDITOR.htmlParser.element('name', null), true, false, 1); + + var checked: boolean = filter.check(style); + checked = filter.check('rule', true); + checked = filter.check(style, false, true); + + checked = filter.checkFeature({ allowedContent: style }); + + filter = filter.clone(); + filter.destroy(); + filter.disable(); + + filter.disallow(filter.disallowedContent); + var mode: number = filter.getAllowedEnterMode(1); + mode = filter.getAllowedEnterMode(1, false); +} + +function test_focusManager() { + var textarea = document.createElement('textarea'); + var instance = CKEDITOR.replace(textarea); + var element = CKEDITOR.document.getById('myElement'); + + instance.focusManager.focus(); + instance.focusManager.focus(element); + instance.focusManager.lock(); + instance.focusManager.unlock(); + instance.focusManager.blur(); + instance.focusManager.blur(true); + instance.focusManager.add(element, true); + instance.focusManager.remove(element); + + var focusManager = new CKEDITOR.focusManager(CKEDITOR.instances[0]); + var object: CKEDITOR.dom.domObject = focusManager.currentActive; + var bool: boolean = focusManager.hasFocus; +} + + +function test_htmlParser_basicWriter() { + var writer = new CKEDITOR.htmlParser.basicWriter(); + writer.attribute('class', 'MyClass'); + writer.closeTag('p'); + writer.comment('hello'); + alert(writer.getHtml(true)); // '

Hello

' + writer.openTag('p', {}); + writer.openTagClose('p', false); + writer.reset(); + writer.text('Hello'); + writer.write('data'); +} + +function test_htmlParser_cdata() { + var cdata: CKEDITOR.htmlParser.cdata = new CKEDITOR.htmlParser.cdata('hey'); + cdata.writeHtml(new CKEDITOR.htmlParser.basicWriter()); +} + +function test_htmlParser_comment() { + var filter: CKEDITOR.htmlParser.filter; + var comment: CKEDITOR.htmlParser.comment = new CKEDITOR.htmlParser.comment('hey'); + var filtered: boolean = comment.filter(filter); + comment.writeHtml(new CKEDITOR.htmlParser.basicWriter()); + comment.writeHtml(new CKEDITOR.htmlParser.basicWriter(), filter); +} + +function test_htmlParser_cssStyle() { + var element: CKEDITOR.htmlParser.element; + + var style: CKEDITOR.htmlParser.cssStyle = new CKEDITOR.htmlParser.cssStyle(element); + style = new CKEDITOR.htmlParser.cssStyle('styles'); + + style.populate(element); + style.populate(new CKEDITOR.dom.element('div')); + style.populate({ 'width': 1 }); +} + +function test_htmlParser_element() { + var element: CKEDITOR.htmlParser.element = new CKEDITOR.htmlParser.element('el', { 'id': '1'}); + + var node: CKEDITOR.htmlParser.node; + element.add(node); + element.add(node, 5); + element.addClass('class'); + element = element.clone(); + + var filter: CKEDITOR.htmlParser.filter; + var filtered: boolean = element.filter(filter); + element.filterChildren(filter); + + var nodes: CKEDITOR.htmlParser.node[] = element.find('*'); + nodes = element.find((el: CKEDITOR.htmlParser.node) => false, true); + + element.forEach((el: CKEDITOR.htmlParser.node) => console.log('node')); + element.forEach((el: CKEDITOR.htmlParser.node) => console.log('node'), 1); + element.forEach((el: CKEDITOR.htmlParser.node) => false, 2, true); + + var node: CKEDITOR.htmlParser.node = element.getFirst('*'); + node = element.getFirst({ 'id': '1' }); + node = element.getFirst((el: CKEDITOR.htmlParser.node) => true); + + var html: string = element.getHtml(); + html = element.getOuterHtml(); + + var hasClass: boolean = element.hasClass('class'); + element.removeClass('class'); + element.replaceWithChildren(); + element.setHtml('html'); + var el2: CKEDITOR.htmlParser.element = element.split(1); + + element.writeChildrenHtml(new CKEDITOR.htmlParser.basicWriter()); + element.writeChildrenHtml(new CKEDITOR.htmlParser.basicWriter(), filter); + + element.writeHtml(new CKEDITOR.htmlParser.basicWriter()); + element.writeHtml(new CKEDITOR.htmlParser.basicWriter(), filter); +} + +function test_htmlParser_filter() { + var filter: CKEDITOR.htmlParser.filter = new CKEDITOR.htmlParser.filter({ elementNames: [ 'div' ] }); + filter = new CKEDITOR.htmlParser.filter(); + + filter.addRules({ text: 'text' }); + filter.addRules({ attributes: { 'id': '1234' }}, 1); + filter.addRules({ comment: 'hey', text: 'text' }, { priority: 1 }); + filter.addRules({ root: document.body }, { applyToAll: false }); + + var node: CKEDITOR.htmlParser.node; + filter.applyTo(node); +} + + +function test_htmlParser_filterRulesGroup() { + var rules: CKEDITOR.htmlParser.filterRulesGroup = new CKEDITOR.htmlParser.filterRulesGroup(); + + rules.add([ 'some', 'rule' ], 1, { applyToAll: false, excludeNestedEditable: true }); + + rules.addMany([ (value: CKEDITOR.htmlParser.node | CKEDITOR.htmlParser.fragment | string) => false, [ 'some', 'rule' ] ], 1, { applyToAll: false }); + + var nodeFragOrString: CKEDITOR.htmlParser.node | CKEDITOR.htmlParser.fragment | string; + nodeFragOrString = rules.exec(nodeFragOrString); + + var str: string; + str = rules.execOnName(str); + + var idx: number = rules.findIndex(1); +} + +function test_htmlParser_fragment() { + var frag: CKEDITOR.htmlParser.fragment = new CKEDITOR.htmlParser.fragment(); + + var node: CKEDITOR.htmlParser.node; + frag.add(node); + frag.add(node, 1); + + var filter: CKEDITOR.htmlParser.filter; + frag.filter(filter); + frag.filterChildren(filter); + frag.filterChildren(filter, true); + frag.forEach((node: CKEDITOR.htmlParser.node) => console.log('node')); + frag.forEach((node: CKEDITOR.htmlParser.node) => false, 1); + frag.forEach((node: CKEDITOR.htmlParser.node) => false, 2, true); + + frag.writeChildrenHtml(new CKEDITOR.htmlParser.basicWriter()); + frag.writeChildrenHtml(new CKEDITOR.htmlParser.basicWriter(), filter); + + frag.writeHtml(new CKEDITOR.htmlParser.basicWriter()); + frag.writeHtml(new CKEDITOR.htmlParser.basicWriter(), filter); + + frag = CKEDITOR.htmlParser.fragment.fromBBCode('code'); + + var fragOrEl: CKEDITOR.htmlParser.fragment | CKEDITOR.htmlParser.element = CKEDITOR.htmlParser.fragment.fromHtml('html'); + fragOrEl = CKEDITOR.htmlParser.fragment.fromHtml('html', 'parent'); + fragOrEl = CKEDITOR.htmlParser.fragment.fromHtml('html', 'parent', 'fix'); + fragOrEl = CKEDITOR.htmlParser.fragment.fromHtml('html', new CKEDITOR.htmlParser.element('name', null), true); +} + +function test_htmlParser_node() { + var node: CKEDITOR.htmlParser.node = new CKEDITOR.htmlParser.node(); + + var el: CKEDITOR.htmlParser.element = node.getAscendant('condition'); + el = node.getAscendant({ 'id': '1234' }); + el = node.getAscendant((node: CKEDITOR.htmlParser.element) => false); + + var idx: number = node.getIndex(); + node.insertAfter(node); + node.insertBefore(node); + node.remove(); + node.replaceWith(node); + el = node.wrapWith(el); + +} + +function test_htmlParser_text() { + var text: CKEDITOR.htmlParser.text = new CKEDITOR.htmlParser.text('text'); + var filtered: boolean = text.filter(new CKEDITOR.htmlParser.filter()); + text.writeHtml(new CKEDITOR.htmlParser.basicWriter()); + text.writeHtml(new CKEDITOR.htmlParser.basicWriter(), new CKEDITOR.htmlParser.filter()); +} + +function test_htmlWriter() { + var writer = new CKEDITOR.htmlWriter(); + writer.openTag('p', {}); + writer.attribute('class', 'MyClass'); + writer.openTagClose('p', false); + writer.text('Hello'); + writer.closeTag('p'); + alert(writer.getHtml(true)); // '

Hello

' + + writer.indentationChars = '\t'; + writer.lineBreakChars = '\r\n'; + writer.selfClosingEnd = '>'; + writer.indentation(); + writer.lineBreak(); + writer.setRules('img', {breakBeforeOpen: true, breakAfterOpen: true}); +} + +function test_htmlParser() { + var html = '
text
'; + var fragment = CKEDITOR.htmlParser.fragment.fromHtml(html); + fragment.forEach(function(node) { + if (node instanceof CKEDITOR.htmlParser.element) { + node.forEach(function(node) { + console.log(node); + }); + } + }, CKEDITOR.NODE_ELEMENT, true); +} + +function test_keystrokeHandler() { + var handler: CKEDITOR.keystrokeHandler = new CKEDITOR.keystrokeHandler(CKEDITOR.instances[0]); + handler.attach(new CKEDITOR.dom.domObject(document.body)); +} + +function test_lang() { + var lang: string = CKEDITOR.lang.detect('en'); + lang = CKEDITOR.lang.detect('zh', 'sw'); + + CKEDITOR.lang.load('tk', 'pr', (code: string, entries: any) => console.log('loaded')); +} + +function test_loader() { + CKEDITOR.loader.load('script'); + CKEDITOR.loader.load('script', true); + + CKEDITOR.loader.loadPending(); +} + +function test_menu() { + var menu: CKEDITOR.menu = new CKEDITOR.menu(); + + menu.add({ anything: true }); + menu.addListener((startElement: CKEDITOR.dom.element, selection: CKEDITOR.dom.selection, path: CKEDITOR.dom.elementPath) => 'return'); + var { item, element } = menu.findItemByCommandName('command'); + menu.hide(); + menu.hide(false); + menu.removeAll(); + menu.show(new CKEDITOR.dom.element('div')); + menu.show(new CKEDITOR.dom.element('div'), 1); + menu.show(new CKEDITOR.dom.element('div'), 1, 2); + menu.show(new CKEDITOR.dom.element('div'), 1, 2, 3); +} + +function test_plugins() { + CKEDITOR.plugins.add( 'abbr', { + init: function( editor: CKEDITOR.editor ) { + // empty logic + } + }); + + console.log(CKEDITOR.plugins.registered['abbr']); +} + +function test_resourceManager() { + var manager: CKEDITOR.resourceManager = new CKEDITOR.resourceManager('path', 'name'); + + manager.add('name'); + manager.add('name', { hidpi: true }); + manager.addExternal('names', 'path'); + manager.addExternal('names', 'path', 'name'); + + var def: CKEDITOR.pluginDefinition = manager.get('name'); + var path: string = manager.getFilePath('path'); + path = manager.getPath('path'); + + manager.load('name', (loaded: string[]) => console.log('hey')); + manager.load([ 'name' ], (loaded: string[]) => console.log('hey'), manager); +} + +function test_scriptLoader() { + CKEDITOR.scriptLoader.load('url', (succeededUrls: boolean | string[], failedUrls: string[]) => console.log('loaded')); + CKEDITOR.scriptLoader.load([ 'url' ], (succeededUrls: boolean | string[], failedUrls: string[]) => console.log('loaded'), null); + CKEDITOR.scriptLoader.load([ 'url' ], (succeededUrls: boolean | string[], failedUrls: string[]) => console.log('loaded'), null, true); + CKEDITOR.scriptLoader.queue('url', (succeeded: boolean) => console.log('loaded')); +} + +function test_skin() { + CKEDITOR.skin.addIcon('name', 'path'); + CKEDITOR.skin.addIcon('name', 'path', 1); + CKEDITOR.skin.addIcon('name', 'path', 1, 'small'); + + CKEDITOR.skin.chameleon('editor', 'part'); + + var style: any = CKEDITOR.skin.getIconStyle('name'); + style = CKEDITOR.skin.getIconStyle('name', true); + style = CKEDITOR.skin.getIconStyle('name', true, 1); + style = CKEDITOR.skin.getIconStyle('name', true, 1, 'large'); + + var path: any = CKEDITOR.skin.getPath('part'); + + CKEDITOR.skin.loadPart('part', () => console.log('load')); + + var path2: string = CKEDITOR.skin.path(); +} + +function test_style() { + var style: CKEDITOR.style = new CKEDITOR.style({ element: 'div' }, { 'key': 'value '}); + style.apply(CKEDITOR.instances[0]); + + var el: CKEDITOR.dom.element; + style.applyToObject(el, CKEDITOR.instances[0]); + + var range: CKEDITOR.dom.range; + style.applyToRange(range, CKEDITOR.instances[0]); + + var str: string = style.buildPreview(); + str = style.buildPreview('label'); + + var path: CKEDITOR.dom.elementPath; + var bool: boolean = style.checkActive(path, CKEDITOR.instances[0]); + + var filter: CKEDITOR.filter; + bool = style.checkApplicable(path, CKEDITOR.instances[0], filter); + + bool = style.checkElementMatch(el, true, CKEDITOR.instances[0]); + bool = style.checkElementRemovable(el, false, CKEDITOR.instances[0]); + + var def: CKEDITOR.style.definition = style.getDefintion(); + style.remove(CKEDITOR.instances[0]); + style.removeFromRange(range, CKEDITOR.instances[0]); + + var rules: CKEDITOR.filter.allowedContentRules; + rules = style.toAllowedContentRules(); + rules = style.toAllowedContentRules(CKEDITOR.instances[0]); +} + +function test_adding_command_and_buttons() { + var textarea = document.createElement('textarea'); + var instance = CKEDITOR.replace(textarea); + + instance.addCommand( 'aCommand', { + exec: function( editor: CKEDITOR.editor ) { + // empty logic + return true; + } + }); + + instance.ui.addButton( 'firstButton', { + icon: 'http://www.example.com/assets/images/icons.png', + iconOffset: -32, + label: 'Label 1', + command: 'aCommand', + toolbar: 'tools' + }); + + instance.ui.addButton( 'secondButton', { + label: 'Label 2', + command: 'aCommand', + toolbar: 'tools' + }); +} + +function test_adding_widget() { + function wrapper(editor: CKEDITOR.editor) { + editor.widgets.add("widgetty", { + button: "Activate widgetty", + template: "", + dialog: "widgetty", + init: function() { + // no logic + } + }); + } +} + +function test_sharedSpace() { + CKEDITOR.inline('content', { + removePlugins: 'maximize,resize', + sharedSpaces: { + top: 'someElementId', + bottom: document.getElementById('anotherId') + } + }); + + CKEDITOR.inline('content', { + sharedSpaces: { } + }); +} + +function test_specifying_editor_path() { + window.CKEDITOR_BASEPATH = '/ckeditor/'; +} + +function test_editor_instance_event() { + var textarea = document.createElement('textarea'); + var instance = CKEDITOR.replace(textarea, { + on: { + activeEnterModeChange: function() {}, + activeFilterChange: function() {}, + afterCommandExec: function() {}, + afterInsertHtml: function() {}, + afterPaste: function() {}, + afterPasteFromWord: function() {}, + afterSetData: function() {}, + afterUndoImage: function() {}, + ariaEditorHelpLabel: function() {}, + ariaWidget: function() {}, + autogrow: function() {}, + beforeCommandExec: function() {}, + beforeDestroy: function() {}, + beforeModeUnload: function() {}, + beforeSetMode: function() {}, + beforeUndoImage: function() {}, + blur: function() {}, + change: function() {}, + configLoaded: function() {}, + contentDirChanged: function() {}, + contentDom: function() {}, + contentDomInvalidated: function() {}, + contentDomUnload: function() {}, + customConfigLoaded: function() {}, + dataFiltered: function() {}, + dataReady: function() {}, + destroy: function() {}, + dialogHide: function() {}, + dialogShow: function() {}, + dirChanged: function() {}, + doubleclick: function() {}, + dragend: function() {}, + dragstart: function() {}, + drop: function() {}, + elementsPathUpdate: function() {}, + fileUploadRequest: function() {}, + fileUploadResponse: function() {}, + floatingSpaceLayout: function() {}, + focus: function() {}, + getData: function() {}, + getSnapshot: function() {}, + insertElement: function() {}, + insertHtml: function() {}, + insertText: function() {}, + instanceReady: function() {}, + key: function() {}, + langLoaded: function() {}, + loadSnapshot: function() {}, + loaded: function() {}, + lockSnapshot: function() {}, + maximize: function() {}, + menuShow: function() {}, + mode: function() {}, + notificationHide: function() {}, + notificationShow: function() {}, + notificationUpdate: function() {}, + paste: function() {}, + pasteFromWord: function() {}, + pluginsLoaded: function() {}, + readOnly: function() {}, + removeFormatCleanup: function() {}, + required: function() {}, + resize: function() {}, + save: function() {}, + saveSnapshot: function() {}, + selectionChange: function() {}, + setData: function() {}, + stylesSet: function() {}, + template: function() {}, + toDataFormat: function() {}, + toHtml: function() {}, + unlockSnapshot: function() {}, + updateSnapshot: function() {}, + widgetDefinition: function() {} + } + }); +} + +function test_dtd() { + var brConsideredEmptyTag = CKEDITOR.dtd.$empty['br']; + var spanCanContainText = CKEDITOR.dtd['span']['#']; + var divCanContainSpan = CKEDITOR.dtd['div']['span']; +} + +function test_getSelectedHtml() { + var textarea = document.createElement('textarea'); + var editor = CKEDITOR.replace(textarea); + + // $ExpectType documentFragment + var sel1 = editor.getSelectedHtml(); + console.log(sel1); + + // $ExpectType documentFragment + var sel2 = editor.getSelectedHtml(false); + console.log(sel2); + + // $ExpectType string + var sel3 = editor.getSelectedHtml(true); + console.log(sel3); + + // $ExpectType string | documentFragment + var sel4 = editor.getSelectedHtml(Math.random() > 0.5); + console.log(sel4); +} + +function test_element() { + var el = CKEDITOR.document.getById('myElement'); + el.addClass('class'); + console.log(el.hasClass('class')); + el.removeClass('class'); +} + +function test_selection() { + var editor = new CKEDITOR.editor(); + var testNode = CKEDITOR.document.getById('myElement'); + + var selection = editor.getSelection(true); + var ranges = selection.getRanges(); + for (var i = 0, c = ranges.length; i < c; i++) { + var range = ranges[i]; + range.setStartBefore(testNode); + range.setStartAfter(testNode); + range.setEndBefore(testNode); + range.setEndAfter(testNode); + } +} + +function test_tools() { + var obj: { [key: string]: any } = { key: 'value' }; + + CKEDITOR.tools.addFunction(console.log); + CKEDITOR.tools.addFunction(console.log, obj); + var bool = CKEDITOR.tools.arrayCompare([ 1 ], [ 2, 3 ]); + CKEDITOR.tools.clone(obj); + CKEDITOR.tools.copy(obj); + obj = CKEDITOR.tools.createClass(obj); + var str = CKEDITOR.tools.cssStyleToDomStyle('style'); + var prefixes: { [cssClass: string]: string | number } = CKEDITOR.tools.cssVendorPrefix('prop', 'val'); + prefixes = CKEDITOR.tools.cssVendorPrefix('prop', 'val', true); + var fn: (param: any) => boolean + fn = CKEDITOR.tools.defer<(param: any) => boolean>(fn); + CKEDITOR.tools.enableHtml5Elements(document); + CKEDITOR.tools.enableHtml5Elements(document.createDocumentFragment(), true); + str = CKEDITOR.tools.escapeCss('css'); + var { input, reset } = CKEDITOR.tools.eventsBuffer(1, console.log, obj); + obj = CKEDITOR.tools.extend(obj, obj, true, obj); + bool = CKEDITOR.tools.fixDomain(); + str = CKEDITOR.tools.genKey(str); + str = CKEDITOR.tools.getCookie(str); + str = CKEDITOR.tools.getCsrfToken(); + var numb: number = CKEDITOR.tools.getIndex(['string', 'array'], (element: string) => false); + bool = CKEDITOR.tools.getMouseButton(new CKEDITOR.dom.event(document.createEvent(null))); + str = CKEDITOR.tools.getNextId(); + numb = CKEDITOR.tools.getNextNumber(); + str = CKEDITOR.tools.getUniqueId(); + str = CKEDITOR.tools.htmlDecode(str); + str = CKEDITOR.tools.htmlDecodeAttr(str); + str = CKEDITOR.tools.htmlEncode(str); + str = CKEDITOR.tools.htmlEncodeAttr(str); + numb = CKEDITOR.tools.indexOf(['string', 'array'], 'string'); + numb = CKEDITOR.tools.indexOf([true, false], (val: boolean) => false); + console.log(CKEDITOR.tools.isArray([1])); // true + console.log(CKEDITOR.tools.isArray(obj)); // false + console.log(CKEDITOR.tools.isArray(null)); // false + console.log(CKEDITOR.tools.isArray(undefined)); // false + bool = CKEDITOR.tools.isEmpty(obj); + var ret1: { display: string[], aria: string[] } = CKEDITOR.tools.keystrokeToArray(obj, 1); + var ret2: { display: string, aria: string } = CKEDITOR.tools.keystrokeToString(obj, 1); + str = CKEDITOR.tools.ltrim(str); + str = CKEDITOR.tools.normalizeCssText(str, bool); + str = CKEDITOR.tools.normalizeHex(str); + bool = CKEDITOR.tools.objectCompare(obj, obj); + bool = CKEDITOR.tools.objectCompare(obj, obj, true); + var strArr: string[] = CKEDITOR.tools.objectKeys(obj); + CKEDITOR.tools.override(parseInt, function(_parseInt) { + return function(value: any, radix?: number) { + return _parseInt(value, radix); + }; + }); + obj = CKEDITOR.tools.parseCssText(str); + obj = CKEDITOR.tools.parseCssText(str, bool); + obj = CKEDITOR.tools.parseCssText(str, bool, bool); + obj = CKEDITOR.tools.prototypedCopy(obj); + CKEDITOR.tools.removeFunction(1); + str = CKEDITOR.tools.repeat(str, 40); + str = CKEDITOR.tools.rtrim(str); + str = CKEDITOR.tools.search(strArr, 'string'); + str = CKEDITOR.tools.search(strArr, (el: string) => true); + CKEDITOR.tools.setCookie('name', 'value'); + numb = CKEDITOR.tools.setTimeout(console.log); + numb = CKEDITOR.tools.setTimeout(console.log, 1000); + numb = CKEDITOR.tools.setTimeout(console.log, 1000, obj); + numb = CKEDITOR.tools.setTimeout(console.log, 1000, obj, 'timeout'); + numb = CKEDITOR.tools.setTimeout(console.log, 1000, obj, 'timeout', window); + str = CKEDITOR.tools.transformPlainTextToHtml(str, 1); + str = CKEDITOR.tools.trim(str); + CKEDITOR.tools.tryThese([ console.log, console.warn ]); + str = CKEDITOR.tools.writeCssText(obj); + str = CKEDITOR.tools.writeCssText(obj, true); +} diff --git a/types/ckeditor/index.d.ts b/types/ckeditor/index.d.ts new file mode 100644 index 0000000000..53760a7610 --- /dev/null +++ b/types/ckeditor/index.d.ts @@ -0,0 +1,2770 @@ +// Type definitions for CKEditor 4.9 +// Project: https://ckeditor.com/ckeditor-4/ +// Definitions by: Thomas Wittwer +// Stuart Long +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +// WORK-IN-PROGRESS: Any contribution support welcomed. +// See https://github.com/DefinitelyTyped/DefinitelyTyped/issues/1827 for more informations. +interface Window { + CKEDITOR_BASEPATH: string; +} + +declare namespace CKEDITOR { + + // Config options + var disableAutoInline: boolean; + var replaceClass: string; + var skinName: string; + + // Properties + const ALT: number; + const CTRL: number; + const DATA_TRANSFER_CROSS_EDITORS: number; + const DATA_TRANSFER_EXTERNAL: number; + const DATA_TRANSFER_INTERNAL: number; + const DIALOG_RESIZE_BOTH: number; + const DIALOG_RESIZE_HEIGHT: number; + const DIALOG_RESIZE_NONE: number; + const DIALOG_RESIZE_WIDTH: number; + const DIALOG_STATE_BUSY: number; + const DIALOG_STATE_IDLE: number; + const ELEMENT_MODE_APPENDTO: number; + const ELEMENT_MODE_INLINE: number; + const ELEMENT_MODE_NONE: number; + const ELEMENT_MODE_REPLACE: number; + const END: number; + const ENLARGE_BLOCK_CONTENTS: number; + const ENLARGE_ELEMENT: number; + const ENLARGE_INLINE: number; + const ENLARGE_LIST_ITEM_CONTENTS: number; + const ENTER_BR: number; + const ENTER_DIV: number; + const ENTER_P: number; + const EVENT_PHASE_AT_TARGET: number; + const EVENT_PHASE_BUBBLING: number; + const EVENT_PHASE_CAPTURING: number; + const FILTER_SKIP_TREE: number; + const LINEUTILS_AFTER: number; + const LINEUTILS_BEFORE: number; + const LINEUTIS_INSIDE: number; + const MOUSE_BUTTON_LEFT: number; + const MOUSE_BUTTON_MIDDLE: number; + const MOUSE_BUTTON_RIGHT: number; + const NODE_COMMENT: number; + const NODE_DOCUMENT: number; + const NODE_DOCUMENT_FRAGMENT: number; + const NODE_ELEMENT: number; + const NODE_TEXT: number; + const POSITION_AFTER_END: number; + const POSITION_AFTER_START: number; + const POSITION_BEFORE_END: number; + const POSITION_BEFORE_START: number; + const POSITION_CONTAINS: number; + const POSITION_DISCONNECTED: number; + const POSITION_FOLLOWING: number; + const POSITION_IDENTICAL: number; + const POSITION_IS_CONTAINED: number; + const POSITION_PRECEDING: number; + const SELECTION_ELEMENT: number; + const SELECTION_NONE: number; + const SELECTION_TEXT: number; + const SHIFT: number; + const SHRINK_ELEMENT: number; + const SHRINK_TEXT: number; + const START: number; + const STYLE_BLOCK: string; + const STYLE_INLINE: string; + const STYLE_OBJECT: string; + const TRISTATE_DISABLED: number; + const TRISTATE_OFF: number; + const TRISTATE_ON: number; + const UI_BUTTON: string; + const UI_MENUBUTTON: string; + const UI_PANEL: string; + const UI_PANELBUTTON: string; + const UI_RICHCOMBO: string; + const UI_SEPARATOR: string; + const VERBOSITY_ERROR: number; + const VERBOSITY_WARN: number; + + var basePath: string; + var currentInstance: editor; + var document: dom.document; + var instances: { [id: string]: editor }; + var loadFullCoreTimeout: number; + var revision: string; + var rnd: number; + var status: string; + var timestamp: string; + var verbosity: number; + var version: string; + const config: config; + + // Methods + function add(editor: editor): void; + function addCss(css: string): void; + function addTemplate(name: string, source: string): template; + function appendTo(element: string | HTMLElement, config?: config, data?: string): editor; + function domReady(): void; + function editorConfig(config: config): void; + function error(errorCode: string, additionalData?: any): void; + function getCss(): string; + function getTemplate(name: string): template; + function getUrl(resource: string): string; + function inline(element: string | HTMLElement, instanceConfig?: config): editor; + function inlineAll(): void; + function loadFullCore(): void; + function replace(element: string | HTMLTextAreaElement, config?: config): editor; + function replaceAll(className?: string): void; + function replaceAll(assertionFunction: (textarea: HTMLTextAreaElement, config: config) => boolean): void; + function warn(errorCode: string, additionalData?: any): void; + + // Event interface + function capture(): void; + function define(name: string, meta: { [key: string]: any }): void; + function fire(eventName: string, data?: { [key: string]: any }, editor?: editor): any; + function fireOnce(eventName: string, data?: { [key: string]: any }, editor?: editor): any; + function hasListeners(eventName: string): boolean; + function on(eventName: string, listenerFunction: (eventInfo: eventInfo) => void, scopeObj?: { [key: string]: any }, listenerData?: { [key: string]: any }, priority?: number): void; + function once(eventName: string, listenerFunction: (eventInfo: eventInfo) => void, scopeObj?: { [key: string]: any }, listenerData?: { [key: string]: any }, priority?: number): void; + function removeAllListeners(): void; + function removeListener(eventName: string, listenerFunction: (eventInfo: eventInfo) => void): void; + + type listenerRegistration = { + removeListener: () => void; + } + + namespace dom { + + interface bookmark { + startNode: dom.node | string; + endNode: dom.node | string; + serializable: boolean; + collapsed: boolean; + } + + interface bookmark2 { + start: number[]; + end: number[]; + startOffset: number; + endOffset: number; + collapsed: boolean; + normalized: boolean; + is2: boolean; + } + + class comment extends node { + readonly type: number; + + constructor(comment: string | Node, ownerDocument?: document); + getOuterHtml(): string; + } + + class document extends domObject { + readonly $: Document; + readonly type: number; + + constructor(domDocument: { [key: string]: any }); + appendStyleSheet(cssFileUrl: string): void; + appendStyleText(cssStyleText: string): CSSStyleSheet; + createElement(name: string, attribsAndStyles?: { attributes?: { [key: string]: string }; styles?: { [key: string]: string }; }): element; + createText(text: string): element; + find(selector: string): nodeList; + findOne(selector: string): element; + focus(): void; + getActive(): element; + getBody(): element; + getByAddress(address: any[], normalized?: boolean): node; + getById(elementId: string): element; + getDocumentElement(): element; + getElementsByTag(tagName: string): nodeList; + getHead(): element; + getSelection(): selection; + getWindow(): window; + write(html: string): void; + } + + class documentFragment extends node { + readonly type: number; + + constructor(nodeOrDoc: { [key: string]: any }); + insertAfterNode(node: node): void; + } + + class domObject extends CKEDITOR.event { + readonly $: any; + + constructor(nativeDomObject: { [key: string]: any }); + clearCustomData(): void; + equals(object: any): boolean; + getCustomData(key: string): any; + getPrivate(): any; + getUniqueId(): number; + removeAllListeners(): void; + removeCustomData(key: string): any; + setCustomData(key: string, value: any): domObject; + } + + class element extends node { + readonly $: HTMLElement; + readonly type: number; + + constructor(element: string, ownerDocument?: document); + constructor(element: HTMLElement, ownerDocument?: document); + addClass(className: string): void; + append(node: node | string, toStart?: boolean): node; + appendBogus(force: boolean): void; + appendHtml(html: string): void; + appendText(text: string): node; + breakParent(parent: element): void; + contains(node: node): boolean; + copyAttributes(dest: element, skipAttributes: { [key: string]: string }): void; + data(name: string, value?: string | false): string; + disableContextMenu(): void; + find(selector: string): nodeList; + findOne(selector: string): element; + focus(defer?: boolean): void; + focusNext(ignoreChildren?: boolean, indexToUse?: number): void; + focusPrevious(ignoreChildren?: boolean, indexToUse?: number): void; + forEach(callback: (node: node) => void, type?: number, skipRoot?: boolean): void; + getAttribute(name: string): string; + getBogus(): node | boolean; + getChild(indices: number | number[]): node; + getChildCount(): number; + getChildren(): nodeList; + getClientRect(): ClientRect; + getComputedStyle(propertyName: string): string; + getDirection(useComputed: boolean): string; + getDocumentPosition(refDocument: document): position; + getDtd(): dtdDefinition; + getEditor(): editor; + getElementsByTag(tagName: string): nodeList; + getFirst(evaluator?: (node: node) => boolean): node; + getFrameDocument(): document; + getHtml(): string; + getId(): string; + getLast(evaluator?: (node: node) => boolean): node; + getName(): string; + getNameAtt(): string; + getOuterHtml(): string; + getPositionedAncestor(): element; + getSize(type: string, isBorderBox: boolean): void; + getStyle(name: string): string; + getTabIndex(): number; + getText(): string; + getValue(): string; + getWindow(): window; + hasAttributes(): boolean; + hasAttribute(name: string): boolean; + hasClass(className: string): boolean; + hide(): void; + is(...name: string[]): boolean; + is(name: any): boolean; + isBlockBoundary(customNodeNames: { [tagName: string]: 1 }): boolean; + isEditable(textCursor?: boolean): boolean; + isEmptyInlineRemoveable(): boolean; + isIdentical(otherElement: element): boolean; + isVisible(): boolean; + mergeSiblings(inlineOnly?: boolean): void; + moveChildren(target: element, toStart?: boolean): void; + removeAttribute(name: string): void; + removeAttributes(attributes?: string[]): void; + removeClass(className: string): void; + removeStyle(name: string): void; + renameNode(newTag: string): void; + scrollIntoParent(parent: element, alignToTop: boolean, hscroll: boolean): void; + scrollIntoParent(parent: window, alignToTop: boolean, hscroll: boolean): void; + scrollIntoView(alignToTop?: boolean): void; + setAttribute(name: string, value: string): element; + setAttributes(attributesPairs: { [key: string]: string }): element; + setHtml(html: string): string; + setOpacity(opacity: number): void; + setSize(type: string, size: number, isBorderBox: boolean): void; + setState(state: number, base?: string, useAria?: boolean): void; + setStyle(name: string, value: string): element; + setStyles(stylesPair: { [key: string]: string }): element; + setText(text: string): string; + setValue(value: string): element; + show(): void; + unselectable(): void; + + //static method + static clearAllMarkers(database: any): any; + static clearMarkers(database: any, element: dom.element, removeFromDatabase: boolean): void; + static createFromHtml(html: string): element; + static get(element: string | HTMLElement | element): element; + static setMarker(database: any, element: dom.element, name: string, value: any): dom.element; + } + + class elementPath { + readonly block: element; + readonly blockLimit: element; + readonly elements: element[]; + readonly lastElement: element; + readonly root: element; + + constructor(startNode: element, root?: element); + compare(otherPath: elementPath): boolean; + contains(query: string | string[] | ((element: element) => boolean) | { [key: string]: any } | element, excludeRoot?: boolean, fromTop?: boolean): element; + direction(): 'ltr' | 'rtl'; + isContextFor(tag: string): boolean; + } + + class event { + constructor(domEvent: Event); + getKey(): number; + getKeystroke(): number; + preventDefault(stopPropagation?: boolean): void; + stopPropagation(): void; + getTarget(): node; + getPhase(): number; + getPhaseOffset(): position; + on(eventName: string, listenerFunction: (eventInfo: eventInfo) => void, scopeObj?: any, listenerData?: any, priority?: number): { removeListener: () => void }; + } + + class iterator { + readonly activeFilter: filter; + enforceRealBlocks: boolean; + enlargeBr: boolean; + readonly filter: filter; + forceBrBreak: boolean; + readonly range: range; + constructor(range: range); + getNextParagraph(blockTag?: string): element; + } + + class node extends domObject { + constructor(domNode: Node); + appendTo(element: element): element; + clone(includeChildren: boolean, cloneId: boolean): node; + hasPrevious(): boolean; + hasNext(): boolean; + insertAfter(node: node): node; + insertBefore(node: node): node; + insertBeforeMe(node: node): node; + getAddress(normalized?: boolean): number[]; + getAscendant(reference: string, includeSelf?: boolean): node; + getCommonAncestor(node: node): void; + getDocument(): document; + getIndex(normalized?: boolean): number; + getNext(evaluator?: (node: node) => boolean): node; + getNextSourceNode(startFromSibling: boolean, nodeType: number, guard: node | ((node: node) => boolean)): void; + getParent(allowFragmentParent?: boolean): element; + getParents(closerFirst?: boolean): node[]; + getPosition(otherNode: node): void; + getPrevious(evaluator?: (node: node) => boolean): node; + getPreviousSourceNode(startFromSibling: boolean, nodeType: number, guard: node | ((node: node) => boolean)): void; + hasAscendant(name: string, includeSelf: boolean): boolean; + remove(preserveChildren?: boolean): node; + replace(nodeToReplace: node): void; + trim(): void; + ltrim(): void; + rtrim(): void; + isReadOnly(): boolean; + } + + class nodeList { + constructor(nativeList: NodeList); + count(): number; + getItem(index: number): node; + toArray(): node[]; + } + + class range { + readonly collapsed: boolean; + readonly document: document; + readonly endContainer: element | text; + readonly endOffset: number; + readonly root: element; + readonly startContainer: element | text; + readonly startOffset: number; + + constructor(root: element | document); + checkBoundaryOfElement(element: element, checkType: number): boolean; + checkEndOfBlock(): boolean; + checkReadOnly(): boolean; + checkStartOfBlock(): boolean; + clone(cloneId?: boolean): range; + cloneContents(): documentFragment; + collapse(toStart?: boolean): boolean; + createBookmark(serializable?: boolean): bookmark; + createBookmark2(normalized?: boolean): bookmark2; + createIterator(): iterator; + deleteContents(mergeThen?: boolean): void; + endPath(): elementPath; + enlarge(unit: number, excludeBrs?: boolean): void; + extractContents(mergeThen?: boolean, cloneId?: boolean): documentFragment; + fixBlock(isStart: boolean, blockTag: string): element; + getBoundaryNodes(): { startNode: node; endNode: node; }; + getCommonAncestor(includeSelf?: boolean, ignoreTextNode?: boolean): element; + getEnclosedNode(): node; + getNextEditableNode(): element | text; + getNextNode(evaluator?: (element: dom.element) => boolean, guard?: (element: dom.element) => boolean, boundary?: element): element; + getPreviousEditableNode(): element | text; + getPreviousNode(evaluator?: (element: dom.element) => boolean, guard?: (element: dom.element) => boolean, boundary?: element): element; + getTouchedEndNode(): node; + getTouchedStartNode(): node; + insertNode(node: node): void; + moveToBookmark(bookmark: bookmark | bookmark2): void; + moveToClosestEditablePosition(element?: element, isMoveForward?: boolean): boolean; + moveToElementEditEnd(target: element): boolean; + moveToElementEditStart(target: element): boolean; + moveToElementEditablePosition(element: element, isMoveToEnd: boolean): boolean; + moveToPosition(node: node, position: number): void; + moveToRange(range: range): void; + optimize(): void; + optimizeBookmark(): void; + removeEmptyBlocksAtEnd(atEnd: boolean): void; + scrollIntoView(): void; + select(): selection; + selectNodeContents(node: node): void; + setEnd(endNode: node, endOffset: number): void; + setEndAfter(node: node): void; + setEndAt(node: node, position: number): void; + setEndBefore(node: node): void; + setStart(startNode: node, startOffset: number): void; + setStartAfter(node: node): void; + setStartAt(node: node, position: number): void; + setStartBefore(node: node): void; + shrink(mode: number, selectContents?: boolean, options?: boolean | shrinkOptions): void; + splitBlock(cloneId?: boolean): void; + splitElement(toSplit: element, cloneId?: boolean): element; + startPath(): elementPath; + trim(ignoreStart?: boolean, ignoreEnd?: boolean): void; + + static mergeRanges(ranges: range[]): range[]; + } + + interface shrinkOptions { + shrinkOnBlockBoundary?: boolean, + skipBogus?: boolean + } + + class rangeList { + constructor(ranges?: range | range[]); + createBokmarks(serializable?: boolean): bookmark[]; + createBookmarks2(normalized?: boolean): bookmark2[]; + createIterator(): rangeListIterator; + moveToBookmarks(bookmarks: bookmark[]): void; + } + + + interface rangeListIterator { + getNextRange(mergeConsequent?: boolean): range; + } + + // see https://docs.com/ckeditor4/latest/api/CKEDITOR_dom_selection.html + class selection { + readonly FILLING_CHAR_SEQUENCE: string; + readonly document: document; + readonly isFake: boolean; + readonly isLocked: boolean; + readonly rev: number; + readonly root: element; + + constructor(target: document | element | selection); + createBookmarks(serializable: any): bookmark[]; + createBookmarks2(normalized: any): bookmark2[]; + fake(element: element, ariaLabel?: boolean): void; + getCommonAncestor(): element; + getNative(): Selection; + getRanges(onlyEditables?: boolean): range[]; + getSelectedElement(): element; + getSelectedText(): string; + getStartElement(): element; + getType(): number; + isCollapsed(): boolean; + isHidden(): boolean; + isInTable(allowPartialSelection?: boolean): boolean; + lock(): void; + removeAllRanges(): void; + reset(): void; + scrollIntoView(): void; + selectBookmarks(bookmarks: (bookmark | bookmark2)[]): selection; + selectElement(element: element): void; + selectRanges(ranges: range[]): void; + unlock(restore: boolean): void; + } + + class text extends node { + readonly $: Text; + readonly type: number; + + constructor(text: Text | string, ownerDocument?: document); + getLength(): number; + getText(): string; + setText(text: string): void; + split(offset: number): text; + substring(indexA: number, indexB?: number): void; + } + + class walker { + evaluator: (node: node) => boolean; + guard: (node: node) => boolean; + + static validEmptyBlockContainers: { [key: string]: any }; + + constructor(range: range); + checkBackward(): boolean; + checkForward(): boolean; + end(): void; + lastBackward(): node; + lastForward(): node; + next(): node; + previous(): node; + reset(): void; + + static blockBoundary(customNodeNames: any): (node: node) => boolean; + static bogus(isReject?: boolean): (node: node) => boolean; + static bookmark(contentOnly?: boolean, isReject?: boolean): (node: node) => boolean; + static editable(isReject?: boolean): (node: node) => boolean; + static empty(isReject?: boolean): (node: node) => boolean; + static ignored(isReject?: boolean): (node: node) => boolean; + static invisible(isReject?: boolean): (node: node) => boolean; + static listItemBoundary(): (node: node) => boolean; + static nodeType(type: number, isReject?: boolean): (node: node) => boolean; + static temp(isReject?: boolean): (node: node) => boolean; + static whitespaces(isReject?: boolean): (node: node) => boolean; + } + + interface position { + x: number; + y: number; + } + + interface widthAndHeight { + width: number; + height: number; + } + + class window extends domObject { + constructor(domWindow: Window); + focus(): void; + getViewPaneSize(): widthAndHeight; + getScrollPosition(): position; + getFrame(): element; + } + } + + + namespace ajax { + function load(url: string, callback?: (data: any) => void): string; + function loadXml(url: string, callback?: (data: any) => void): xml; + function post(url: string, data: any, contentType?: string, callback?: (data: any) => void): void; + } + + + class command extends event implements commandDefinition { + fakeKeystroke: number; + previousState: number; + state: number; + uiItems: any[]; + + // Methods + constructor(editor: editor, commandDefinition: commandDefinition); + checkAllowed(noCache: boolean): boolean; + disable(): void; + enable(): void; + exec(data?: { [key: string]: any }): boolean; + refresh(editor: editor, path: dom.elementPath): void; + setState(newState: number): boolean; + toggleState(): void; + + } + + interface commandDefinition { + async?: boolean; + canUndo?: boolean; + context?: boolean; + contextSensitive?: boolean; + editorFocus?: boolean; + fakeKeystroke?: number; + modes?: { [key: string]: any }; + startDisabled?: boolean; + readOnly?: boolean; + exec(editor: editor, data?: any): boolean; + refresh?(editor: editor, path: dom.elementPath): void; + } + + // https://docs.com/ckeditor4/latest/api/CKEDITOR_config.html + interface config { + allowedContent?: boolean | filter.allowedContentRules; + autoEmbed_widget?: string | ((url: string) => string); + autoGrow_bottomSpace?: number; + autoGrow_maxHeight?: number; + autoGrow_minHeight?: number; + autoGrow_onStartup?: boolean; + autoUpdateElement?: boolean; + + baseFloatZIndex?: number; + baseHref?: string; + basicEntities?: boolean; + blockedKeystrokes?: number[]; + bodyClass?: string; + bodyId?: string; + browserContextMenuOnCtrl?: boolean; + + clipboard_defaultContentType?: 'html' | 'text'; + clipboard_notificationDuration?: number; + cloudServices_tokenUrl?: string; + cloudServices_uploadUrl?: string; + codeSnippetGeshi_url?: string; + codeSnippet_codeClass?: string; + codeSnippet_languages?: { [key: string]: any }; + coceSnippet_theme?: string; + colorButton_backStyle?: config.styleObject; + colorButton_colors?: string; + colorButton_colorsPerRow?: number; + colorButton_enableAutomatic?: boolean; + colorButton_enableMore?: boolean; + colorButton_foreStyle?: config.styleObject; + colorButton_normalizeBackground?: boolean; + contentsCss?: string | string[]; + contentsLangDirection?: string; + contentsLanguage?: string; + copyFormatting_allowRules?: string; + copyFormatting_allowedContexts?: boolean | string[]; + copyFormatting_keystrokeCopy?: number; + copyFormatting_keystrokePaste?: number; + copyFormatting_outerCursor?: boolean; + coreStyles_bold?: config.styleObject; + coreStyles_italic?: config.styleObject; + coreStyles_strike?: config.styleObject; + coreStyles_subscript?: config.styleObject; + coreStyles_superscript?: config.styleObject; + coreStyles_underline?: config.styleObject; + customConfig?: string; + + dataIndentationChars?: string; + defaultLanguage?: string; + devtools_styles?: string; + devtools_textCallback?: (editor: editor, dialog: dialog, element: dom.element, tabName: string) => string; + dialog_backgroundCoverColor?: string; + dialog_backgroundCoverOpacity?: number; + dialog_buttonsOrder?: string; + dialog_magnetDistance?: number; + dialog_noConfirmCancel?: boolean; + dialog_startupFocusTab?: boolean; + disableNativeSpellChecker?: boolean; + disableNativeTableHandles?: boolean; + disableNativeObjectResizing?: boolean; + disableNativeReadonlyStyling?: boolean; + disallowedContent?: filter.disallowedContentRules; + div_wrapTable?: boolean; + docType?: string; + + easyimage_class?: string; + easyimage_defaultStyle?: string; + easyimage_styles?: { [key: string]: any }; + easyimage_toolbar?: string[] | string; + emailProtection?: string; + embed_provider?: string; + enableTabKeyTools?: boolean; + enterMode?: number; + entities?: boolean; + entities_additional?: string; + entities_greek?: boolean; + entities_latin?: boolean; + entities_processNumerical?: boolean | string; + extraAllowedContent?: filter.allowedContentRules; + extraPlugins?: string; + + fileTools_defaultFileName?: string; + fileTools_requestHeaders?: { [key: string]: any }; + filebrowserBrowseUrl?: string; + filebrowserFlashBrowseUrl?: string; + filebrowserFlashUploadUrl?: string; + filebrowserImageBrowseLinkUrl?: string; + filebrowserImageBrowseUrl?: string; + filebrowserImageUploadUrl?: string; + filebrowserUploadMethod?: string; + filebrowserUploadUrl?: string; + filebrowserWindowFeatures?: string; + filebrowserWindowHeight?: number | string; + filebrowserWindowWidth?: number | string; + fillEmptyBlocks?: boolean | ((element: htmlParser.element) => boolean); + find_highlight?: config.styleObject; + flashAddEmbedTag?: boolean; + flashConvertOnEdit?: boolean; + flashEmbedTagOnly?: boolean; + floatSpaceDockedOffsetX?: number; + floatSpaceDockedOffsetY?: number; + floatSpacePinnedOffsetX?: number; + floatSpacePinnedOffsetY?: number; + floatSpacePreferRight?: boolean; + fontSize_defaultLabel?: string; + fontSize_sizes?: string; + fontSize_style?: config.styleObject; + font_defaultLabel?: string; + font_names?: string; + font_style?: config.styleObject; + forceEnterMode?: boolean; + forcePasteAsPlainText?: boolean; + forceSimpleAmpersand?: boolean; + format_address?: config.styleObject; + format_div?: config.styleObject; + format_h1?: config.styleObject; + format_h2?: config.styleObject; + format_h3?: config.styleObject; + format_h4?: config.styleObject; + format_h5?: config.styleObject; + format_h6?: config.styleObject; + format_p?: config.styleObject; + format_pre?: config.styleObject; + format_tags?: string; + fullPage?: boolean; + + grayt_autoStartup?: boolean; + + height?: string | number; + htmlEncodeOutput?: boolean; + + ignoreEmptyParagraph?: boolean; + image2_alignClasses?: string[]; + image2_altRequired?: boolean; + image2_captionedClass?: string; + image2_disableResizer?: boolean; + image2_prefillDimensions?: boolean; + imageUploadUrl?: string; + image_prefillDimensions?: boolean; + image_previewText?: string; + image_removeLinkByEmptyUrl?: boolean; + indentClasses?: string[]; + indentOffset?: number; + indentUnit?: string; + + jqueryOverrideVal?: boolean; + justifyClasses?: string[]; + + keystrokes?: [number, string][]; + + language?: string; + language_list?: string[]; + linkJavaScriptLinksAllowed?: boolean; + linkShowAdvancedTab?: boolean; + linkShowTargetTab?: boolean; + + magicline_color?: string + magicline_everywhere?: boolean; + magicline_holdDistance?: number; + magicline_keystrokeNext?: number; + magicline_keystrokePrevious?: number; + magicline_tabuList?: string[]; + magicline_triggerOffset?: number; + mathJaxClass?: string; + mathJaxLib?: string; + menu_groups?: string; + menu_subMenuDelay?: number; + + newpage_html?: string; + notification_duration?: number; + + on?: editor.eventObject; + + pasteFilter?: string; + pasteFromWordCleanupFile?: string; + pasteFromWordNumberedHeadingToList?: boolean; + pasteFromWordPromptCleanup?: boolean; + pasteFromWordRemoveFontStyles?: boolean; + pasteFromWorkRemoveStyles?: boolean; + pasteFromWord_heuristicsEdgeList?: boolean; + pasteFromWord_inlineImages?: boolean; + plugins?: string; + protectedSource?: RegExp[]; + + readOnly?: boolean; + removeButtons?: string; + removeDialogTabs?: string; + removeFormatAttributes?: string; + removeFormatTags?: string; + removePlugins?: string; + resize_dir?: string; + resize_enabled?: boolean; + resize_maxHeight?: number; + resize_maxWidth?: number; + resize_minHeight?: number; + resize_minWidth?: number; + + scayt_autoStartup?: boolean; + scayt_contextCommands?: string; + scayt_contextMenuItemsOrder?: string; + scayt_customDictionaryIds?: string; + scayt_customerId?: string; + scayt_disableOptionsStorage?: string | string[]; + scayt_elementsToIgnore?: string; + scayt_handleCheckDirty?: string; + scayt_handleUndoRedo?: string; + scayt_ignoreAllCapsWords?: boolean; + scayt_ignoreDomainNames?: boolean; + scayt_ignoreWordsWithMixedCases?: boolean; + scayt_ignoreWordsWithNumbers?: boolean; + scayt_inlineModeImmediateMarkup?: boolean; + scayt_maxSuggestions?: number; + scayt_minWordLength?: number; + scayt_moreSuggestions?: string; + scayt_multiLanguageMode?: boolean; + scayt_multiLanguageStyles?: { [key: string]: any }; + scayt_sLang?: string; + scayt_serviceHost?: string; + scayt_servicePath?: string; + scayt_servicePort?: string; + scayt_serviceProtocol?: string; + scayt_srcUrl?: string; + scayt_uiTabs?: string; + scayt_userDictionaryName?: string; + + sharedSpaces?: sharedSpace; + shiftEnterMode?: number; + skin?: string; + smiley_columns?: number; + smiley_descriptions?: string[]; + smiley_images?: string[]; + smiley_path?: string; + sourceAreaTabSize?: number; + specialChars?: (string | [string, string])[]; + startupFocus?: string | boolean; + startupMode?: string; + startupOutlineBlocks?: boolean; + startupShowBorders?: boolean; + stylesSet?: string | boolean | config.styleObject[]; + stylesheetParser_skipSelectors?: RegExp; + stylesheetParser_validSelectors?: RegExp; + + tabIndex?: number; + tabSpaces?: number; + templates?: string; + templates_files?: { [key: string]: any }; + templates_replaceContent?: boolean; + title?: string | boolean; + toolbar?: string | (string | string[] | { name: string, items?: string[], groups?: string[] })[] | null; + toolbarCanCollapse?: boolean; + toolbarGroupCycling?: boolean; + toolbarGroups?: (toolbarGroups | string)[]; + toolbarLocation?: string; + toolbarStartupExpanded?: boolean; + + uiColor?: string; + undoStackSize?: number; + uploadUrl?: string; + useComputedState?: boolean; + + width?: string | number; + wsc_cmd?: string; + wsc_customDictionaryIds?: string; + wsc_customLoaderScript?: string; + wsc_customerId?: string; + wsc_height?: string; + wsc_lang?: string; + wsc_left?: string; + wsc_top?: string; + wsc_userDictionaryName?: string; + wsc_width?: string; + } + + interface dataProcessor { + toDataFormat(html: string, fixForBody: string): void; + toHtml(data: string, fixForBody?: string): void; + } + + class dialog { + readonly state: number; + + constructor(editor: editor, dialogName: string); + + addFocusable(element: dom.element, index?: number): void; + addPage(contents: { [key: string]: any }): void; + click(id: string): any; + commitContent(): void; + disableButton(id: string): void; + enableButton(id: string): void; + foreach(fn: () => void): dialog; + getButton(id: string): ui.dialog.button; + getContentElement(pageId: string, elementId: string): ui.dialog.uiElement; + getElement(): dom.element; + getName(): string; + getPageCount(): number; + getParentEditor(): editor; + getPosition(): { [key: string]: any }; + getSelectedElement(): dom.element; + getSize(): { [key: string]: any }; + getValueOf(pageId: string, elementId: string): any; + hide(): void; + hidePage(id: string): void; + layout(): void; + move(x: number, y: number, save: boolean): void; + reset(): dialog; + resize(width: number, height: number): void; + selectPage(id: string): void; + setState(state: number): void; + setValueOf(pageId: string, elementId: string, value: any): void; + setupContent(): void; + show(): void; + showPage(id: string): void; + updateStyle(): void; + + static add(name: string, dialogDefinition: string | ((editor: editor) => dialog.IDialogDefinition)): void; + static addIframe(name: string, title: string, minWidth: number, minHeight: number, onContentLoad?: () => void, userDefinition?: { [key: string]: any }): void; + static addUIElement(typeName: string, builder: () => void): void; + static cancelButton(): void; + static exists(name: string | number): void; // NOTE: documentation says object, but it's an array accessor, so really a string or number will work + static getCurrent(): dialog; + static isTabEnabled(editor: editor, dialogName: string, tabName: string): boolean; + static okButton(): void; + } + + namespace dialog { + + namespace definition { + + interface button extends uiElement { + disabled?: boolean; + } + + interface checkbox extends uiElement { + default?: string; + validate?: () => boolean; + } + + interface content { + accessKey?: string; + elements?: dialog.definition.uiElement[]; + id?: string; + label?: string; + title?: string; + } + + interface file extends labeledElement { + action?: string; + size?: string; + validate?: () => boolean; + } + + interface fileButton extends uiElement { + filebrowser?: string; + for?: string; + validate?: () => boolean; + } + + interface hbox extends uiElement { + children?: ui.dialog.uiElement[]; + height?: number; + padding?: number; + validate?: () => boolean; + widths?: number[]; + } + + interface html extends uiElement { + html?: string; + } + + interface labeledElement extends uiElement { + controlStyle?: string; + inputStyle?: string; + labelLayout?: string; + labelStyle?: string; + widths?: number[]; + } + + interface radio extends labeledElement { + default?: string; + items?: string[] | (string[])[]; + validate?: () => boolean; + } + + interface select extends labeledElement { + default?: string; + items?: string[] | (string[])[]; + multiple?: boolean; + size?: number; + validate?: () => boolean; + } + + interface textarea extends labeledElement { + bidi?: boolean; + cols?: number; + default?: string; + rows?: number; + validate?: () => boolean; + } + + interface textInput extends labeledElement { + bidi?: boolean; + default?: string; + maxLength?: number; + size?: number; + validate?: () => boolean; + } + + interface uiElement { + align?: string; + className?: string; + commit?: (widget: plugins.widget) => void; + id?: string; + label?: string; + onHide?: (elem: ui.dialog.uiElement) => void; + onLoad?: (elem: ui.dialog.uiElement) => void; + onShow?: (elem: ui.dialog.uiElement) => void; + requiredContent?: string | { [key: string]: any } | style; + setup?: (widget: plugins.widget) => void; + style?: string; + title?: string; + type?: string; + } + + interface vbox extends uiElement { + children?: ui.dialog.uiElement[]; + expand?: boolean; + heights?: number[]; + padding?: number; + styles?: string; + width?: number[]; + } + } + + interface IDialogDefinition { + buttons?: dialog.definition.button[]; + contents?: dialog.definition.content[]; + height?: number; + minHeight?: number; + minWidth?: number; + onCancel?: () => void; + onLoad?: () => void; + onOk?: () => void; + onShow?: () => void; + onHide?: () => void; + resizable?: number; + title?: string; + width?: number; + } + } + + class dialogCommand { + value: any; + + constructor(dialogName: string, ext?: { tabId?: string }); + } + + interface dtdDefinition { + [outerTagName: string]: { [innerTagName: string]: 1 }; + $block: { [tagName: string]: 1 }; + $blockLimit: { [tagName: string]: 1 }; + $cdata: { [tagName: string]: 1 }; + $editable: { [tagName: string]: 1 }; + $empty: { [tagName: string]: 1 }; + $inline: { [tagName: string]: 1 }; + $intermediate: { [tagName: string]: 1 }; + $list: { [tagName: string]: 1 }; + $listItem: { [tagName: string]: 1 }; + $nonBodyContent: { [tagName: string]: 1 }; + $nonEditable: { [tagName: string]: 1 }; + $object: { [tagName: string]: 1 }; + $removeEmpty: { [tagName: string]: 1 }; + $tabIndex: { [tagName: string]: 1 }; + $tableContent: { [tagName: string]: 1 }; + $transparent: { [tagName: string]: 1 }; + } + + var dtd: dtdDefinition; + + class editable extends dom.element { + hasFocus: boolean; + readonly status: string; + + constructor(editor: editor, element: HTMLElement | dom.element); + attachClass(className: string): void; + attachListener(obj: event | editable, eventName: string, listenerFunction: (ei: eventInfo) => void, scopeobj?: {}, listenerData?: any, priority?: number): listenerRegistration; + changeAttr(attr: string, val: string): void; + detach(): void; + insertElement(element: dom.element, range?: dom.range): void; + insertHtml(data: string, mode?: string, range?: dom.range): void; + insertText(text: dom.text): void; + isInline(): boolean; + setReadOnly(isReadOnly: boolean): void; + } + + class editor extends event { + readonly activeEnterMode: number; + readonly activeFilter: filter; + readonly activeShiftEnterMode: number; + readonly blockless: boolean; + readonly config: config; + readonly container: dom.element; + readonly contextMenu: plugins.contextMenu; + copyFormatting: plugins.copyformatting.state; + dataProcessor: dataProcessor; + readonly document: dom.document; + readonly element: dom.element; + readonly elementMode: number; + readonly enterMode: number; + readonly filter: filter; + readonly focusManager: focusManager; + readonly id: string; + readonly keystrokeHandler: keystrokeHandler; + readonly lang: any; + readonly langCode: string; + readonly mode: string; + readonly name: string; + readonly pasteFilter: filter; + readonly plugins: any; + readonly readOnly: boolean; + readonly shiftEnterMode: number; + readonly status: string; + readonly tabIndex: number; + readonly templates: any; + readonly title: any; + readonly toolbar: any; + readonly ui: ui; + readonly widgets: plugins.widget.repository; + readonly window: dom.window; + + constructor(instanceConfig?: config, element?: dom.element, mode?: number); + addCommand(commandName: string, commandDefinition: commandDefinition): void; + addContentsCss(cssPath: string): void; + addFeature(feature: feature): boolean; + addMenuGroup(name: string, order?: number): void; + addMenuItem(name: string, definition?: IMenuItemDefinition): void; + addMenuItems(definitions: { [id: string]: IMenuItemDefinition }): void; + addMode(mode: string, exec: () => void): void; + addRemoveFormatFilter(func: (element: dom.element) => boolean): void; + applyStyle(style: style): void; + attachStyleStateChange(style: style, callback: (state: number) => void): void; + checkDirty(): boolean; + createFakeElement(realElement: dom.element, className: string, realElementType: string, isResizable: boolean): void; + createFakeParserElement(realElement: dom.element, className: string, realElementType: string, isResizable: boolean): void; + createRange(): dom.range; + destroy(noUpdate?: boolean): void; + editable(elementOrEditable?: dom.element | editable): editable; + elementPath(startNode?: dom.node): dom.elementPath; + execCommand(commandName: string, data?: any): boolean; + extractSelectedHtml(toString?: boolean, removeEmptyBlock?: boolean): dom.documentFragment | string | void; + focus(): void; + forceNextSelectionCheck(): void; + getClipboardData(callbackOrOptions: { title: string } | ((data: any) => void), callback: (data: any) => void): void; + getColorFromDialog(callback: (color: string) => void, scope?: { [key: string]: any }): void; + getCommand(commandName: string): command; + getCommandKeystroke(command: command | string): number | null; + getData(internal?: boolean): string; + getMenuItem(name: string): IMenuItemDefinition; + getResizable(forContents: boolean): dom.element; + getSelectedHtml(toString?: false): dom.documentFragment; + getSelectedHtml(toString: true): string; + getSelectedHtml(toString?: boolean): dom.documentFragment | string; + getSelection(forceRealSelection?: boolean): dom.selection; + getSnapshot(): string; + getStylesSet(callback: (stylesDefinitions: style.definition[]) => void): void; + getUiColor(): string; + insertElement(element: dom.element): void; + insertHtml(html: string, mode?: string, range?: dom.range): void; + insertText(text: string): void; + loadSnapshot(snapshot: any): void; + lockSelection(sel?: dom.selection): boolean; + openDialog(dialogName: string, callback: () => void): dialog; + popup(url: string, width?: number | string, height?: number | string, options?: string): void; + removeMenuItem(name: string): void; + removeStyle(style: style): void; + resetDirty(): void; + resetUndo(): void; + resize(width: number | string, height: number | string, isContentHeight?: boolean, resizeInner?: boolean): void; + restoreRealElement(fakeElement: dom.element): dom.element; + selectionChange(checkNow?: boolean): void; + setActiveEnterMode(enterMode: number, shiftEnterMode: number): void; + setActiveFilter(filter: filter): void; + setData(data: string, options?: { internal?: boolean; callback?: () => void; noSnapshot?: boolean; }): void; + setKeystroke(keystroke: number, behavior: string | boolean): void; + setKeystroke(keystroke: [number, string | boolean][]): void; + setMode(newMode: string, callback: () => void): void; + setReadOnly(isReadOnly?: boolean): void; + setUiColor(color: string): void; + showNotification(message: string, type: plugins.notification.type, progressOrDuration: number): plugins.notification; + unlockSelection(restore?: boolean): void; + updateElement(): void; + } + + namespace editor { + interface eventObject { + activeEnterModeChange?: (evt: eventInfo) => void; + activeFilterChange?: (evt: eventInfo) => void; + afterCommandExec?: (evt: eventInfo) => void; + afterInsertHtml?: (evt: eventInfo) => void; + afterPaste?: (evt: eventInfo) => void; + afterPasteFromWord?: (evt: eventInfo) => void; + afterSetData?: (evt: eventInfo) => void; + afterUndoImage?: (evt: eventInfo) => void; + ariaEditorHelpLabel?: (evt: eventInfo) => void; + ariaWidget?: (evt: eventInfo) => void; + autogrow?: (evt: eventInfo) => void; + + beforeCommandExec?: (evt: eventInfo) => void; + beforeDestroy?: (evt: eventInfo) => void; + beforeGetData?: (evt: eventInfo) => void; + beforeModeUnload?: (evt: eventInfo) => void; + beforeSetMode?: (evt: eventInfo) => void; + beforeUndoImage?: (evt: eventInfo) => void; + blur?: (evt: eventInfo) => void; + + change?: (evt: eventInfo) => void; + configLoaded?: (evt: eventInfo) => void; + contentDirChanged?: (evt: eventInfo) => void; + contentDom?: (evt: eventInfo) => void; + contentDomInvalidated?: (evt: eventInfo) => void; + contentDomUnload?: (evt: eventInfo) => void; + customConfigLoaded?: (evt: eventInfo) => void; + + dataFiltered?: (evt: eventInfo) => void; + dataReady?: (evt: eventInfo) => void; + destroy?: (evt: eventInfo) => void; + dialogHide?: (evt: eventInfo) => void; + dialogShow?: (evt: eventInfo) => void; + dirChanged?: (evt: eventInfo) => void; + doubleclick?: (evt: eventInfo) => void; + dragend?: (evt: eventInfo) => void; + dragstart?: (evt: eventInfo) => void; + drop?: (evt: eventInfo) => void; + + elementsPathUpdate?: (evt: eventInfo) => void; + + fileUploadRequest?: (evt: eventInfo) => void; + fileUploadResponse?: (evt: eventInfo) => void; + floatingSpaceLayout?: (evt: eventInfo) => void; + focus?: (evt: eventInfo) => void; + + getData?: (evt: eventInfo) => void; + getSnapshot?: (evt: eventInfo) => void; + + insertElement?: (evt: eventInfo) => void; + insertHtml?: (evt: eventInfo) => void; + insertText?: (evt: eventInfo) => void; + instanceReady?: (evt: eventInfo) => void; + + key?: (evt: eventInfo) => void; + + langLoaded?: (evt: eventInfo) => void; + loadSnapshot?: (evt: eventInfo) => void; + loaded?: (evt: eventInfo) => void; + lockSnapshot?: (evt: eventInfo) => void; + maximize?: (evt: eventInfo) => void; + menuShow?: (evt: eventInfo) => void; + mode?: (evt: eventInfo) => void; + + notificationHide?: (evt: eventInfo) => void; + notificationShow?: (evt: eventInfo) => void; + notificationUpdate?: (evt: eventInfo) => void; + + paste?: (evt: eventInfo) => void; + pasteFromWord?: (evt: eventInfo) => void; + pluginsLoaded?: (evt: eventInfo) => void; + + readOnly?: (evt: eventInfo) => void; + removeFormatCleanup?: (evt: eventInfo) => void; + required?: (evt: eventInfo) => void; + resize?: (evt: eventInfo) => void; + + save?: (evt: eventInfo) => void; + saveSnapshot?: (evt: eventInfo) => void; + selectionChange?: (evt: eventInfo) => void; + setData?: (evt: eventInfo) => void; + stylesSet?: (evt: eventInfo) => void; + + template?: (evt: eventInfo) => void; + toDataFormat?: (evt: eventInfo) => void; + toHtml?: (evt: eventInfo) => void; + + unlockSnapshot?: (evt: eventInfo) => void; + updateSnapshot?: (evt: eventInfo) => void; + + widgetDefinition?: (evt: eventInfo) => void; + } + } + + namespace env { + var air: boolean; + var chrome: boolean; + var cssClass: string; + var edge: boolean; + var gecko: boolean; + var hc: boolean; + var hidpi: boolean; + var iOS: boolean; + var ie: boolean; + var isCompatible: boolean; + var mac: boolean; + var needsBrFiller: boolean; + var needsNbspFiller: boolean; + var quirks: boolean; + var safari: boolean; + var version: number; + var webkit: boolean; + + function secure(): boolean; + } + + class event { + static useCapture: boolean; + + constructor(); + capture(): void; + define(name: string, meta: { [key: string]: any }): void; + fire(eventName: string, data?: { [key: string]: any }, editor?: editor): any; + fireOnce(eventName: string, data?: { [key: string]: any }, editor?: editor): any; + hasListeners(eventName: string): boolean; + on(eventName: string, listenerFunction: (eventInfo: eventInfo) => void, scopeObj?: { [key: string]: any } | null, listenerData?: any, priority?: number): listenerRegistration; + once(eventName: string, listenerFunction: (eventInfo: eventInfo) => void, scopeObj?: { [key: string]: any } | null, listenerData?: any, priority?: number): listenerRegistration; + removeAllListeners(): void; + removeListener(eventName: string, listenerFunction: (eventInfo: eventInfo) => void): void; + + static implementOn(targetObject: { [key: string]: any }): void; + } + + interface eventInfo { + data: any; + editor: editor; + listenerData: any; + name: string; + sender: { [key: string]: any }; + + cancel(): void; + removeListener(): void; + stop(): void; + } + + interface feature { + allowedContent?: filter.allowedContentRules; + contentForms?: any; + contentTransformations?: any; + name?: string; + requiredContent?: string | style; + toFeature?: () => feature; + } + + namespace fileTools { + var isFileUploadSupported: boolean; + + function addUploadWidget(editor: editor, name: string, def: uploadWidgetDefinition): void; + function bindNotification(editor: editor, fileLoader: fileLoader): void; + function getUploadUrl(config: { [key: string]: any }, type?: string): string; + function isTypeSupported(file: Blob, supportedTypes: RegExp): boolean; + function markElement(element: dom.element, widgetName: string, loaderId: number): void; + + class fileLoader extends event { + readonly data: string; + readonly file: Blob; + readonly fileName: string; + readonly id: number; + readonly loaded: number; + readonly message: string; + readonly reader: FileReader; + readonly responseData: any; + status: string; + readonly total: number; + readonly uploadTotal: number; + readonly uploadUrl: string; + readonly uploaded: string; + readonly url: string; + readonly xhr: XMLHttpRequest; + + constructor(editor: editor, fileOrData: Blob | string, fileName?: string); + abort(): void; + isFinished(): boolean; + load(): void; + loadAndUpload(url: string, additionalRequestParameters?: any): void; + update(): void; + upload(url: string, additionalRequestParameters?: any): void; + } + + class uploadRepository extends event { + readonly loaders: fileLoader[]; + + constructor(editor: editor); + create(fileOrData: Blob | string, fileName: string, loaderType?: any): fileLoader; + isFinished(): boolean; + } + + interface uploadWidgetDefinition extends plugins.widget.definition { + additionalRequestParameters: any; + fileToElement: (pastedFile: any) => HTMLElement; + loadMethod: string; + loaderType: any; + onAbort: () => boolean; + onError: () => boolean; + onLoaded: () => boolean; + onUploaded: () => boolean; + onUploading: () => boolean; + replaceWith: () => any; + skipNotifications: boolean; + supportedTypes: string; + uploadUrl: string; + } + } + + module filter { + type allowedContentRule = string | style | { [key: string]: any }; + type allowedContentRules = allowedContentRule | allowedContentRule[]; + type contentRule = string | style; + type disallowedContentRules = string | { [key: string]: any }; + + interface transformation { + check?: string; + element?: string | style; + left?: (element: htmlParser.element | style) => boolean; + right: (element: htmlParser.element, tools: string | filter.transformationTools) => boolean; + } + + var transformationTools: transformationTools; + + interface transformationTools { + alignmentToAttribute(element: htmlParser.element): void; + alignmentToStyle(element: htmlParser.element): void; + lengthToAttribute(element: htmlParser.element, styleName: string, attrName?: string): void; + lengthToStyle(element: htmlParser.element, styleName: string, attrName?: string): void; + matchesTyle(element: htmlParser.element, style: style): void; + sizeToAttribute(element: htmlParser.element): void; + sizeToStyle(element: htmlParser.element): void; + splitBorderShorthand(element: htmlParser.element): void; + splitMarginShorthand(element: htmlParser.element): void; + transform(element: htmlParser.element, form: style | string): void; + } + } + + class filter { + readonly allowedContent: filter.allowedContentRules[]; + readonly customConfig: boolean; + readonly disabled: boolean; + readonly disallowedContent: any[]; + readonly editor: editor; + readonly elementCallbacks: ((element: htmlParser.element) => number)[]; + readonly id: number; + + static instances: { [id: string]: filter }; + + constructor(editorOrRules: editor | filter.allowedContentRules); + addContentForms(forms: any[]): void; + addElementCallback(callback: (element: htmlParser.element) => number): void; + addFeature(feature: feature): boolean; + addTransformations(transformations: (string | filter.transformation)[][]): void; + allow(newRules: filter.allowedContentRules, featureName?: string, overrideCustom?: boolean): boolean; + applyTo(fragment: htmlParser.fragment | htmlParser.element, toHrml: boolean, transformOnly: boolean, enterMode: number): boolean; + check(test: filter.contentRule, applyTransformations?: boolean, strictCheck?: boolean): boolean; + checkFeature(feature: feature): boolean; + clone(): filter; + destroy(): void; + disable(): void; + disallow(newRules: filter.disallowedContentRules): void; + getAllowedEnterMode(defaultMode: number, reverse?: boolean): number; + } + + class focusManager { + currentActive: dom.domObject; + hasFocus: boolean; + + constructor(editor: editor); + add(element: dom.element, isCapture: boolean): void; + blur(noDelay?: boolean): void; + focus(currentActive?: dom.element): void; + lock(): void; + remove(element: dom.element): void; + unlock(): void; + } + + class htmlDataProcessor implements dataProcessor { + dataFilter: htmlParser.filter; + htmlFilter: htmlParser.filter; + writer: htmlParser.basicWriter; + + constructor(editor: editor); + toDataFormat(html: string, options?: string | { context?: string, filter?: filter, enterMode?: number }): string; + toHtml(data: string, options?: string | htmlDataProcessorOptions): string; + } + + interface htmlDataProcessorOptions { + context?: string; + fixForBody?: boolean; + filter?: filter; + dontFilter?: boolean; + enterMode?: number; + protectedWhitespaces?: boolean; + } + + namespace htmlParser { + class basicWriter { + constructor(); + attribute(attName: string, attValue: string): void; + closeTag(tagName: string): void; + comment(comment: string): void; + getHtml(reset: boolean): string; + openTag(tagName: string, attributes: { [key: string]: string }): void; + openTagClose(tagName: string, isSelfClose: boolean): void; + reset(): void; + text(text: string): void; + write(data: string): void; + } + + class cdata extends node { + constructor(value: string); + type: number; + writeHtml(writer: htmlParser.basicWriter): void; + } + + class comment extends node { + type: number; + value: string; + + constructor(value: string); + filter(filter: filter): boolean; + writeHtml(writer: htmlParser.basicWriter, filter?: htmlParser.filter): void; + } + + class cssStyle { + constructor(elementOrStyleText: htmlParser.element | string); + populate(obj: htmlParser.element | dom.element | { [key: string]: any }): void; + } + + class element extends node { + attributes: { [name: string]: string }; + children: htmlParser.node[]; + name: string; + type: number; + + constructor(name: string, attributes: { [name: string]: string }); + add(node: node, index?: number): void; + addClass(className: string): void; + clone(): element; + filter(filter: htmlParser.filter): boolean; + filterChildren(filter: htmlParser.filter): void; + find(criteria: string | ((el: htmlParser.node) => boolean), recursive?: boolean): htmlParser.node[]; + forEach(callback: (node: htmlParser.node) => void | false, type?: number, skipRoot?: boolean): void; + getFirst(condition: string | { [key: string]: string } | ((node: htmlParser.node) => boolean)): htmlParser.node; + getHtml(): string; + getOuterHtml(): string; + hasClass(className: string): boolean; + removeClass(className: string): void; + replaceWithChildren(): void; + setHtml(html: string): void; + split(index: number): htmlParser.element; + writeChildrenHtml(writer: htmlParser.basicWriter, filter?: htmlParser.filter): void; + writeHtml(writer: htmlParser.basicWriter, filter?: htmlParser.filter): void; + } + + class filter { + attributeNameRules: filterRulesGroup; + attributesRules: { [name: string]: filterRulesGroup }; + commentRules: filterRulesGroup; + elementNameRules: filterRulesGroup; + elementsRules: { [name: string]: filterRulesGroup }; + id: number; + rootRules: filterRulesGroup; + textRules: filterRulesGroup; + + constructor(rules?: filterRulesDefinition); + addRules(rules: filterRulesDefinition, options?: number | { priority?: number; applyToAll?: boolean; }): void; + applyTo(node: node): void; + } + + interface filterRulesDefinition { + elementNames?: any; + attributeNames?: any; + elements?: any; + attributes?: any; + text?: any; + comment?: any; + root?: any; + } + + class filterRulesGroup { + rules: { value: rule, priority: number, option: ruleOptions }[]; + + add(rule: rule, priority: number, options: ruleOptions): void; + addMany(rules: { [key: string]: any }[], priority: number, options: ruleOptions): void; + exec(currentValue: htmlParser.node | htmlParser.fragment | string): htmlParser.node | htmlParser.fragment | string; + execOnName(currentName: string): string; + findIndex(priority: number): number; + } + + class fragment { + children: htmlParser.node[]; + parent: htmlParser.fragment; + readonly type: number; + + constructor(); + + add(node: htmlParser.node, index?: number): void; + filter(filter: htmlParser.filter): void; + filterChildren(filter: htmlParser.filter, filterRoot?: boolean): void; + forEach(callback: (node: htmlParser.node) => void | false, type?: number, skipRoot?: boolean): void; + writeChildrenHtml(writer: basicWriter, filter?: htmlParser.filter, filterRoot?: boolean): void; + writeHtml(writer: basicWriter, filter?: htmlParser.filter): void; + + static fromBBCode(source: string): htmlParser.fragment; + static fromHtml(fragmentHtml: string, parent?: htmlParser.element | string, fixingBlock?: string | boolean): fragment | htmlParser.element; + } + + class node { + constructor(); + getAscendant(condition: string | { [name: string]: string } | ((node: htmlParser.element) => boolean)): element; + getIndex(): number; + insertAfter(node: node): void; + insertBefore(node: node): void; + remove(): node; + replaceWith(node: node): void; + wrapWith(wrapper: element): element; + } + + type rule = ((value: htmlParser.node | htmlParser.fragment | string) => boolean) | [string, string]; + + interface ruleOptions { + applyToAll?: boolean, + excludeNestedEditable?: boolean + } + + class text extends node { + constructor(value: string); + type: number; + filter(filter: filter): boolean; + writeHtml(writer: basicWriter, filter?: filter): void; + } + } + + class htmlWriter extends htmlParser.basicWriter { + indentationChars: string; + lineBreakChars: string; + selfClosingEnd: string; + + indentation(): void; + lineBreak(): void; + setRules(tagName: string, rules: { [key: string]: any }): void; + } + + class keystrokeHandler { + blockedKeystrokes: { [key: number]: string | boolean }; + keystrokes: { [key: number]: string | boolean }; + + constructor(editor: editor); + + attach(domObject: dom.domObject): void; + } + + namespace lang { + var languages: { [code: string]: number }; + var rtl: { [code: string]: number }; + + function detect(defaultLanguage: string, probeLanguage?: string): string; + function load(languageCode: string, defaultLanguage: string, callback: (code: string, entries: any) => void): void; + } + + namespace loader { + var loadedScripts: string[]; + var scripts: string[]; + + function load(scriptName: string, defer?: boolean): void; + function loadPending(): void; + } + + class menu { + constructor(); + + add(item: any): void; + addListener(listenerFn: (startElement: dom.element, selection: dom.selection, path: dom.elementPath) => any): void; + findItemByCommandName(commandName: string): { item: any, element: dom.element }; + hide(returnFocus?: boolean): void; + removeAll(): void; + show(offsetParent: dom.element, corner?: number, offsetX?: number, offsetY?: number): void; + } + + interface pluginDefinition { + hidpi?: boolean; + lang?: string | string[]; + requires?: string | string[]; + + afterInit?(editor: editor): any; + beforeInit?(editor: editor): any; + init?(editor: editor): void; + onLoad?(): any; + } + + namespace plugins { + + namespace cloudservices { + class cloudServicesLoader extends fileTools.fileLoader { + customToken: string; + + constructor(editor: editor, fileOrData: Blob | string, fileName?: string, token?: string); + loadAndUpload(url?: string, additionalRequestParameters?: any): void; + upload(url?: string, additionalRequestParameters?: any): void; + } + } + + class autoEmbed { + getWidgetDefinition(editor: editor, url: string): widget.definition; + } + + namespace balloontoolbar { + const PRIORITY: { [pri: string]: number }; + + class context { + editor: editor; + options: contextDefinition; + toolbar: ui.balloonToolbar; + + constructor(editor: editor, options: contextDefinition); + destroy(): void; + hide(): void; + refresh(): void; + show(pointedElement?: dom.element): void; + } + + interface contextDefinition { + cssSelector?: string; + priority?: number; + widgets?: string[] | string; + + refresh?: (editor: editor, path: dom.elementPath, selection: dom.selection) => dom.element; + } + + class contextManager { + editor: editor; + + constructor(editor: editor); + add(context: context): void; + check(selection?: dom.selection): void; + create(options: contextDefinition): context; + destroy(): void; + hide(): void; + } + } + + namespace clipboard { + const isCustomCopyCutSupported: boolean; + const isCustomDataTypesSupported: boolean; + const isFileApiSupported: boolean; + const mainPasteEvent: string; + + function addPasteButton(editor: editor, name: string, definition: { [key: string]: any }): void; + function canClipboardApiBeTrusted(dataTransfer: dataTransfer, editor: editor): boolean; + function getDropTarget(editor: editor): dom.domObject; + function getRangeAtDropPosition(domEvent: Event, editor: editor): dom.range; + function initDragDataTransfer(evt?: dom.event, editor?: editor): void; + function initPasteDataTransfer(evt?: dom.event, sourceEditor?: editor): void; + function preventDefaultDropOnElement(element: dom.element): void; + function resetDragDataTransfer(): void; + + class dataTransfer { + readonly $: DataTransfer; + readonly id: string; + readonly sourceEditor: editor; + + constructor(nativeDataTransfer?: DataTransfer, editor?: editor); + cacheData(): void; + getData(type: string, getNative?: boolean): string; + getFile(i: number): File; + getFilesCount(): number; + getTransferType(targetEditor: editor): number; + isEmpty(): boolean; + setData(type: string, value: string): void; + storeId(): void; + } + + class fallbackDataTransfer { + constructor(dataTransfer: dataTransfer); + getData(type: string, getNative?: boolean): string; + isRequired(): boolean; + setData(type: string, value: string): string; + } + } + + namespace condesnippet { + function setHighlighter(highlighter: highlighter): void; + + class highlighter { + highlighter: (code: string, lang: string, callback: (highlightedCode: string) => void) => void; + init: (ready: () => void) => void; + languages: { [lang: string]: string }; + readonly queue: ((code: string, lang: string, callback: (highlightedCode: string) => void) => void)[]; + readonly ready: boolean; + + highlight(code: string, lang: string, callback: (highlightedCode: string) => void): void; + } + } + + class contextMenu extends menu { + constructor(editor: editor); + addTarget(element: dom.element, nativeContextMenuOnCtrl?: boolean): void; + open(offsetParent: dom.element, corner?: number, offsetX?: number, offsetY?: number): void; + } + + namespace copyformatting { + var breakOnElements: string[]; + var elementsForInlineTransform: string[]; + var excludedAttributes: string[]; + var excludedAttributesFromInlineTransform: string[]; + var inlineBoundary: string[]; + var preservedElements: string[]; + + class state extends event { + editor: editor; + filter: filter; + sticky: boolean; + styles: style[]; + + constructor(editor: editor); + } + } + + namespace easyimage { + + } + + namespace embedBase { + function createWidgetBaseDefinition(editor: editor): baseDefinition; + + interface baseDefinition extends widget.definition { + providerUrl: template; + urlRegExp: RegExp; + + getErrorMessage(messageTypeOrMessage: string, url?: string, suffix?: string): string; + isUrlValid(url: string): boolean; + loadContent(url: string, callback?: () => void, errorCallback?: (error: string) => void, noNotifications?: boolean): request; + } + + interface request { + callback: () => void; + errorCallback: (error: string) => void; + response: { [key: string]: string }; + task: notificationAggregator.task; + url: string; + + cancel(): void; + } + } + + namespace image2 { + function checkHasNaturalRatio(image: dom.element): boolean; + function getLinkAttributesGetter(): (editor: editor, data: { [key: string]: string }) => { set: { [tag: string]: string }, removed: string[] }; + function getLinkAttributesParser(): (editor: editor, element: dom.element) => { [key: string]: string }; + function getNatural(image: dom.element): { [key: string]: string }; + } + + namespace imagebase { + var featuresDefinitions: { [key: string]: string }; + + function addFeature(editor: editor, name: string, definition: imageWidgetDefinition): imageWidgetDefinition; + function addImageWidget(editor: editor, name: string, definition: imageWidgetDefinition): void; + + interface imageWidgetDefinition extends widget.definition { + features: string[]; + upcast: string; + } + + class progressBar extends progressReporter { + bar: dom.element; + + constructor(); + + } + + class progressReporter { + wrapper: dom.element; + + constructor(wrapperHtml?: string); + aborted(): void; + bindLoader(loader: fileTools.fileLoader): void; + done(): void; + failed(): void; + remove(): void; + updated(progress: number): void; + } + } + + namespace indent { + function registerCommands(editor: editor, commands: { [key: string]: command }): void; + + class genericDefinition implements commandDefinition { + async: boolean; + canUndo: boolean; + context: boolean; + contextSensitive: boolean; + editorFocus: boolean; + fakeKeystroke: number; + readonly isIndent: boolean; + modes: { [key: string]: any }; + readOnly: boolean; + startDisabled: boolean; + + exec(editor: editor, data?: any): boolean; + refresh?(editor: editor, path: dom.elementPath): void; + } + + class specificDefinition { + database: { [key: string]: any }; + readonly enterBr: boolean; + readonly indentKey: { [key: string]: any }; + readonly isIndent: boolean; + readonly jobs: { [priority: string]: { refresh: (editor: editor, path: dom.elementPath) => number, exec: (editor: editor) => boolean } }; + readonly relatedGlobal: { [key: string]: any }; + + execJob(editor: editor, priority: number): boolean; + getContext(node: dom.elementPath): dom.element; + refreshJob(editor: editor, priority: number): number; + } + } + + namespace indentList { + function firstItemInPath(query: string | string[] | { [tagName: string]: any } | dom.element | ((element: dom.element) => boolean)): boolean; + } + + namespace link { + // DEPRECATED 4.3.3 + const emptyAnchorFix: boolean; + + // DEPRECATED 4.3.3 + const fakeAnchor: boolean; + + // DEPRECATED 4.3.3 + const synAnchorSelector: boolean; + + function getEditorAnchors(editor: editor): dom.element[]; + function getLinkAttributes(editor: editor, data: { [key: string]: any }): { set: { [key: string]: string }, removed: string[] } + function getSelectedLink(editor: editor, returnMultiple?: boolean): dom.element | dom.element[]; + function parseLinkAttributes(editor: editor, element: dom.element): { [key: string]: any }; + function showDisplayTextForElement(element: dom.element, editor: editor): boolean; + function tryRestoreFakeAnchor(editor: editor, element: dom.element): dom.element; + } + + class list { + arrayToList(listArray: any, database: any, paragraphMode: any, dir: any): void; + listToArray(listNode: any, database: any, baseArray: any, baseIndentLevel: any, grandparentNode: any): void; + } + + class notification { + readonly area: notification.area; + readonly duration: number; + readonly editor: editor; + readonly element: dom.element; + readonly id: number; + readonly message: string; + readonly progress: number; + readonly type: notification.type; + + constructor(editor: editor, options: notification.options); + hide(): void; + isVisible(): boolean; + show(): void; + update(options: notification.updateOptions): void; + } + + namespace notification { + interface area { + readonly editor: editor; + readonly element: dom.element; + readonly notifications: notification[]; + + add(notification: notification): void; + remove(notification: notification): void; + } + + interface optionsBase { + duration?: number; + progress?: number; + type?: type; + } + + interface options extends optionsBase { + message: string; + } + + interface updateOptions extends optionsBase { + message?: string; + important?: boolean; + } + + type type = 'info' | 'warning' | 'success' | 'progress'; + } + + class notificationAggregator extends event { + readonly editor: editor; + readonly notification: notification; + + constructor(editor: editor, message: string, singularMessage?: string); + createTask(options?: { weight?: number }): notificationAggregator.task; + getDoneTaskCount(): number; + getPercentage(): number; + getTaskCount(): number; + isFinished(): boolean; + update(): void; + } + + namespace notificationAggregator { + class task extends event { + constructor(weight?: number); + cancel(): void; + done(): void; + isCanceled(): boolean; + isDone(): boolean; + update(weight: number): void; + } + } + + namespace pastefromword { + class lists { + numbering: lists.numbering; + } + + namespace lists { + class numbering { + getStyle(marker: string): string; + toNumber(marker: string, markerType: string): number; + } + } + + class styles { + pushStylesLower(element: htmlParser.element, exceptions: { [style: string]: boolean }, wrapText?: boolean): boolean; + } + } + + namespace tableselection { + function getCellsBetween(first: dom.element, last: dom.element): dom.element[]; + } + + namespace widget { + var WRAPPER_CLASS_PREFIX: string; + + function getNestedEditable(guard: dom.element, node: dom.node): dom.element; + function isDomDragHandler(node: dom.node): boolean; + function isDomDragHandlerContainer(node: dom.node): boolean; + function isDomNestedEditable(node: dom.node): boolean; + function isDomWidget(node: dom.node): boolean; + function isDomWidgetElement(node: dom.node): boolean; + function isDomWidgetWrapper(node: dom.node): boolean; + function isParserWidgetElement(node: dom.node): boolean; + function isParserWidgetWrapper(node: dom.node): boolean; + + namespace nestedEditable { + interface definition { + allowedContent?: filter.allowedContentRules; + disallowedContent?: filter.disallowedContentRules; + pathName?: string; + selector?: string; + } + } + + class nestedEditable extends dom.element { + readonly editor: editor; + readonly enterMode: number; + readonly filter: filter; + readonly shiftEnterMode: number; + + constructor(editor: editor, element: dom.element, config: { filter?: filter }); + getData(): string; + setData(data: string): void; + } + + + interface definition extends feature { + button?: string; + data?: (evt: eventInfo) => void; + defaults?: { [key: string]: any }; + dialog?: string; + downcast?: string | ((element: htmlParser.element) => void); + downcasts?: { [key: string]: any }; + draggable?: boolean; + edit?: () => void; + editables?: { [key: string]: any }; + getLabel?: () => any; + init?: () => void; + inline?: boolean; + insert?: () => void; + mask?: boolean; + parts?: { [key: string]: any }; + pathName?: string; + styleToAllowedContentRules?: (style: style) => filter.allowedContentRules; + styleableElements?: string; + template?: string | template; + upcast?: string | ((element: htmlParser.element, data: any) => boolean); + upcastPriority?: number; + upcasts?: { [key: string]: any }; + } + + class repository extends event { + readonly editor: editor; + readonly focused: widget; + readonly instances: { [id: string]: widget }; + readonly registered: { [name: string]: definition }; + readonly selected: widget[]; + readonly widgetHoldingFocusedEditable: widget; + + add(name: string, widgetDef: plugins.widget.definition): void; + addUpcastCallback(callback: (element: htmlParser.element, data: any) => boolean): void; + checkSelection(): void; + checkWidgets(options?: { initOnlyNew?: boolean; focusInited?: boolean }): void; + del(widget: plugins.widget): void; + destroy(widget: plugins.widget, offline?: boolean): void; + destroyAll(offline?: boolean): void; + finalizeCreation(container: any): void; + getByElement(element: any, checkWrapperOnly: boolean): plugins.widget; + initOn(element: dom.element, widgetDef?: plugins.widget.definition, startupData?: { [key: string]: any }): plugins.widget; + initOn(element: dom.element, widgetDef?: string, startupData?: { [key: string]: any }): plugins.widget; + initOnAll(container?: dom.element): plugins.widget[]; + parseElementClasses(classes: string): any; + wrapElement(element: any, widgetName?: string): any; + } + + class widgetselection { + addFillers(editable: editable): boolean; + removeFillers(editable: editable): void; + } + } + + class widget extends event implements widget.definition { + readonly dataReady: boolean; + readonly definition: plugins.widget.definition; + readonly editor: editor; + readonly element: dom.element; + readonly focusedEditable: plugins.widget.nestedEditable + readonly id: number; + readonly inited: boolean; + readonly ready: boolean; + readonly repository: plugins.widget.repository; + readonly wrapper: dom.element; + + constructor(widgetsRepo: plugins.widget.repository, id: number, element: dom.element, widgetDef: plugins.widget.definition, starupData?: any); + + addClass(className: string): void; + applyStyle(style: style): void; + checkStyleActive(style: style): boolean; + destroy(offline?: boolean): void; + destroyEditable(editableName: string, offline?: boolean): void; + edit(): boolean; + focus(): void; + getClasses(): any; + hasClass(className: string, Whether: boolean): void; + initEditable(editableName: string, definition: plugins.widget.nestedEditable.definition): boolean; + isInited(): boolean; + isReady(): boolean; + removeClass(className: string): void; + removeStyle(style: style): void; + setData(keyOrData: any, value: any): plugins.widget; + setFocused(selected: boolean): plugins.widget; + setSelected(selected: boolean): plugins.widget; + updateDragHandlerPosition(): void; + } + + function add(name: string, definition: pluginDefinition): void; + function add(name: string): void; + function addExternal(name: string, path: string, fileName?: string): void; + function get(name: string): any; + function getFilePath(name: string): string; + function getPath(name: string): string; + function load(name: string, callback: (plugins: string[]) => void, scope?: { [key: string]: any }): void; + function setLang(pluginName: string, languageCode: string, languageEntries: any): void; + var registered: { [key: string]: pluginDefinition }; + } + + class resourceManager { + basePath: string; + externals: { [key: string]: any }; + fileName: string; + loaded: { [key: string]: any }; + registered: { [key: string]: any }; + + constructor(basePath: string, fileName: string); + add(name: string, definition?: pluginDefinition): void; + addExternal(names: string, path: string, fileName?: string): void; + get(name: string): pluginDefinition; + getFilePath(name: string): string; + getPath(name: string): string; + load(name: string | string[], callback: (loaded: string[]) => void, scope?: { [key: string]: any }): void; + } + + // see https://docs.com/ckeditor4/latest/api/CKEDITOR_scriptLoader.html + namespace scriptLoader { + function load(scriptUrls: string | string[], callback: (succeededUrls: boolean | string[], failedUrls: string[]) => void, scope?: any, showBusy?: boolean): void; + function queue(scriptUrl: string, callback?: (succeeded: boolean) => void): void; + } + + namespace skin { + var icons: { [name: string]: { path: string } }; + var name: string; + var ua: { [name: string]: any }; + + function addIcon(name: string, path: string, offset?: number, bgsize?: string): void; + function chameleon(editor: string, part: string): void; + function getIconStyle(name: string, rtl?: boolean, overridePath?: number, overrideBgsize?: string): any; + function getPath(part: string): any; + function loadPart(part: string, fn: () => void): void; + function path(): string; + } + + namespace style { + function addCustomHandler(defintion: customHandler): style; + function getStyleText(style: definition): string; + + namespace customHandlers { + class widget extends style { + group: any[]; + widget: string; + checkElement(element: dom.element): boolean; + getClassesArray(): string[]; + getDefintion(): definition; + removeStylesFromSameGroup(editor: editor): boolean; + } + } + + interface definition { + attributes?: { [att: string]: string }, + element: string, + name?: string, + styles?: { [att: string]: string }, + type?: string | number + } + + interface customHandler { + type: string | number; + setup?: (style: definition) => void; + assignedTo?: number; + } + } + + class style { + alwaysRemoveElement: boolean; + includeReadonly: boolean; + constructor(styleDefinition: style.definition, variableValues: any); + apply(editor: editor): void; + applyToObject(element: dom.element, editor: editor): void; + applyToRange(range: dom.range, editor: editor): void; + buildPreview(label?: string): string; + checkActive(elementPath: dom.elementPath, editor: editor): boolean; + checkApplicable(elementPath: dom.elementPath, editor: editor, filter?: filter): boolean; + checkElementMatch(element: dom.element, fullMatch: boolean, editor: editor): boolean; + checkElementRemovable(element: dom.element, fullMatch: boolean, editor: editor): boolean; + getDefintion(): style.definition; + remove(editor: editor): void; + removeFromRange(range: dom.range, editor: editor): void; + toAllowedContentRules(editor?: editor): filter.allowedContentRules; + } + + class styleCommand { + constructor(style: style, ext?: any); + exec(editor: editor): void; + } + + var stylesSet: resourceManager; + + class template { + readonly source: string; + + constructor(source: string); + output(data: any, buffer?: any[]): string | number; + } + + namespace tools { + function addFunction(fn: () => any, scope?: any): number; + function arrayCompare(arrayA: any[], arrayB: any[]): boolean; + function clone(source: { [key: string]: any }): { [key: string]: any }; + function copy(source: { [key: string]: any }): { [key: string]: any }; + function createClass(definition: { [key: string]: any }): any; + function cssStyleToDomStyle(cssName: string): string; + function cssVendorPrefix(property: string, value: string, asString?: boolean): { [cssClass: string]: string | number }; + function defer(fn: T): T; + function enableHtml5Elements(doc: Document | DocumentFragment, withAppend?: boolean): void; + function escapeCss(selector: string): string; + function eventsBuffer(minInterval: number, output: () => void, scopeObj: any): { input: () => void, reset: () => void }; + function extend(target: { [key: string]: any }, source: { [key: string]: any }, overwrite: boolean, properties: { [key: string]: any }): { [key: string]: any }; + function fixDomain(): boolean; + function genKey(subKey: string): string; + function getCookie(name: string): string; + function getCsrfToken(): string; + function getIndex(array: T[], compareFunction: (element: T) => boolean): number; + function getMouseButton(evt: dom.event): boolean; + function getNextId(): string; + function getNextNumber(): number; + function getUniqueId(): string; + function htmlDecode(text: string): string; + function htmlDecodeAttr(text: string): string; + function htmlEncode(text: string): string; + function htmlEncodeAttr(text: string): string; + function indexOf(array: T[], value: T | ((el: T) => boolean)): number; + function isArray(object: any): object is T[]; + function isEmpty(object: { [key: string]: any }): boolean; + function keystrokeToArray(lang: { [key: string]: any }, keystroke: number): { display: string[], aria: string[] }; + function keystrokeToString(lang: { [key: string]: any }, keystroke: number): { display: string, aria: string }; + function ltrim(str: string): string; + function normalizeCssText(styleText: string, nativeNormalize: boolean): string; + function normalizeHex(styleText: string): string; + function objectCompare(left: { [key: string]: any }, right: { [key: string]: any }, onlyLef?: boolean): boolean; + function objectKeys(obj: { [key: string]: any }): string[]; + function override(originalFunction: T, functionBuilder: (originalFunction: T) => T): T; + function parseCssText(styleText: string, normalize?: boolean, nativeNormalize?: boolean): { [key: string]: any }; + function prototypedCopy(source: { [key: string]: any }): { [key: string]: any }; + function removeFunction(ref: number): void; + function repeat(str: string, times: number): string; + function rtrim(str: string): string; + function search(array: T[], value: T | ((element: T) => boolean)): T; + function setCookie(name: string, value: string): void; + function setTimeout(func: Function, milliseconds?: number, scope?: { [key: string]: any }, args?: any, ownerWindow?: Window): number; + function transformPlainTextToHtml(text: string, etnerMode: number): string; + function trim(str: string): string; + function tryThese(fn: Function[]): any; + function writeCssText(styles: { [key: string]: any }, sort?: boolean): string; + + namespace array { + function every(array: T[], fn: (value: T, index: number, array: T[]) => boolean, thisArg?: { [key: string]: any }): boolean; + function filter(array: T[], fn: (value: T, index: number, array: T[]) => boolean, thisArg?: { [key: string]: any }): T[]; + function forEach(array: T[], fn: (value: T, index: number, array: T[]) => void, thisArg?: { [key: string]: any }): void; + function isArray(object: any): boolean; + function map(array: T[], fn: (value: T) => K, thisArg?: { [key: string]: any }): K[]; + function reduce(array: T[], fn: (accumulator: K, a: T, index: number, array: T[]) => K, initial: K, thisArg?: { [key: string]: any }): K; + } + + namespace object { + function findKey(obj: { [key: string]: any }, value: any): string; + function merge(obj1: { [key: string]: any }, obj2: { [key: string]: any }): { [key: string]: any }; + } + + namespace style { + namespace parse { + function background(value: string): { color: string, unprocessed: string }; + function border(value: string): { width: string, style: string, color: string }; + function margin(value: string): { top: number, right: number, bottom: number, left: number }; + } + } + } + + class ui extends event { + constructor(editor: editor); + add(name: string, type: { [key: string]: any }, definition: { [key: string]: any }): void; + addButton(name: string, definition: buttonDefinition): void; + addHandler(type: { [key: string]: any }, handler: { [key: string]: any }): void; + addRichCombo(name: string, definition: { [key: string]: any }): void; + addToolbarGroup(name: string, previous: number | string, subgroupOf?: string): void; + create(name: string): { [key: string]: any }; + get(name: string): { [key: string]: any }; + space(name: string): dom.element; + spaceId(name: string): string; + } + + namespace ui { + namespace dialog { + class button extends uiElement { + constructor(dialog: dialog, elementDefinition: definitions.button, htmlList: any[]); + + accessKeyDown(): void; + accessKeyUp(): void; + click(): any; + } + + class checkbox extends uiElement { + constructor(dialog: dialog, elementDefinition: definitions.checkbox, htmlList: any[]); + + accessKeyUp(): void; + getValue(): boolean; + setValue(checked: boolean, noChangeEvent: boolean): undefined; + } + + namespace definitions { + interface button { + label: string; + disabled?: boolean; + } + + interface checkbox { + checked?: boolean; + validate?: () => boolean; + label?: string; + } + + interface fieldSet { + label?: string; + children: any[]; + } + + interface file { + validate?: () => boolean; + } + + interface fileButton { + for: string; + validate?: () => boolean; + } + + interface hbox { + widths?: string[]; + height?: string; + padding?: string; + align?: string; + } + + interface html { + html: string; + } + + interface iframeElement { + src: string; + width: string; + height: string; + onContentLoad?: () => void; + } + + interface labeledElement { + label: string; + labelLayout?: 'horizontal' | 'vertical'; + widths?: [string, string]; + role?: string; + includeLabel?: boolean; + } + + interface radio { + default: any; + validate?: () => boolean; + items: ([string, string] | [string])[]; + } + + interface select { + default: any; + validate?: () => boolean; + items: ([string, string] | [string])[]; + multiple?: boolean; + size?: number; + } + + interface textarea { + rows?: number; + cols?: number; + default?: string; + validate?: () => boolean; + } + + interface textInput { + default?: string; + validate?: () => boolean; + maxLength?: number; + size?: string; + } + + interface uiElement { + id: string; + type: number; + title?: string; + hidden?: boolean; + className?: string; + style?: string; + accessKey?: string; + } + + interface vbox { + width?: string; + heights?: string[]; + align?: string; + padding?: string; + expand?: boolean; + } + } + + class fieldset extends uiElement { + constructor(dialog: dialog, childObjList: any[], childHtmlList: any[], htmlList: any[], elementDefinition: definitions.fieldSet); + } + + + class file extends ui.dialog.labeledElement { + constructor(dialog: dialog, elementDefinition: definitions.file, htmlList: any[]); + + getAction(): string; + registerEvents(definition: { [key: string]: any }): file; + reset(): void; + setInitValue(): void; + submit(): file; + } + + + class fileButton extends button { + constructor(dialog: dialog, elementDefinition: definitions.fileButton, htmlList: any[]); + } + + + class hbox extends uiElement { + constructor(dialog: dialog, childObjList: any[], childHtmlList: any[], htmlList: any[], elementDefinition: definitions.hbox); + + getChild(indices: number): ui.dialog.uiElement; + getChild(indices: number[]): ui.dialog.uiElement[]; + } + + + class html extends uiElement { + constructor(dialog: dialog, elementDefinition: definitions.html, htmlList: any[]); + + } + + + class iframeElement extends uiElement { + + } + + + class labeledElement extends uiElement { + constructor(dialog: dialog, elementDefinition: definitions.labeledElement, htmlList: any[], contentHtml: () => string); + + getLabel(): string; + setlabel(label: string): ui.dialog.labeledElement; + } + + + class radio extends ui.dialog.labeledElement { + constructor(dialog: dialog, elementDefinition: definitions.radio, htmlList: any[]); + + accessKeyUp(): void; + getValue(): string; + setValue(value: string, noChangeEvent: boolean): undefined; + } + + + class select extends uiElement { + constructor(dialog: dialog, elementDefinition: definitions.select, htmlList: any[]); + + add(label: string, value?: string, indexedDB?: number): select; + clear(): select; + remove(index: number): select; + } + + + class textarea extends labeledElement { + constructor(dialog: dialog, elementDefinition: definitions.textarea, htmlList: any[]); + } + + + class textInput extends ui.dialog.labeledElement { + constructor(dialog: dialog, elementDefinition: definitions.textInput, htmlList: any[]); + + accessKeyUp(): void; + focus(): undefined; + getDirectionMarker(): string; + getValue(): string; + select(): void; + setDirectionMarker(dir: string): void; + setValue(value: string, noChangeEvent: boolean): textInput; + } + + class uiElement { + eventProcessors: any; + + constructor(dialog: dialog, elementDefinition: definitions.uiElement, htmlList: any[], nodeNameArg?: () => string | string, stylesArg?: () => { [key: string]: any } | { [key: string]: any }, attributesArg?: () => { [key: string]: any } | { [key: string]: any }, contentsArg?: () => { [key: string]: any } | string); // Not sure that the htmlList array type is right. + + accessKeyDown(dialog: dialog, key: string): void; + accessKeyUp(dialog: dialog, key: string): void; + disable(): void; + enable(): void; + focus(): ui.dialog.uiElement; + getDialog(): dialog; + getElement(): dom.element; + getInputElement(): dom.element; + getValue(): any; + isChanged(): boolean; + isEnabled(): boolean; + isFocusable(): boolean; + isVisible(): boolean; + registerEvents(definition: CKEDITOR.dialog.definition.uiElement): ui.dialog.uiElement; + selectParentTab(): ui.dialog.uiElement; + setValue(value: any, noChangeEvent: boolean): ui.dialog.uiElement; + } + + class vbox extends hbox { + constructor(dialog: dialog, childObjList: any[], childHtmlList: any[], htmlList: any[], elementDefinition: definitions.vbox); + } + } + + class balloonPanel { + activeShowListeners: { [id: number]: { removeListener: listenerRegistration } }; + editor: editor; + focusables: { [id: number]: dom.element }; + height: string; + parts: balloonPanel.parts; + rect: balloonPanel.rect; + showListeners: { [id: number]: () => listenerRegistration }; + templateDefinitions: balloonPanel.templateDefinitions; + templates: balloonPanel.templates; + triangleHeight: number; + triangleMinDistance: number; + triangleWidth: number; + width: number; + + activeShowListener(id: number): void; + activateShowListeners(): void; + addShowListener(listener: () => listenerRegistration): listenerRegistration; + attach(element: dom.element, options?: dom.element | boolean | { focusElement?: dom.element | boolean, show?: boolean }): void; + blur(): void; + build(): void; + deactivateShowListener(id: number): void; + deregisterFocusable(element: dom.element): void; + destroy(): void; + getHeight(): number; + getWidth(): number; + hide(): void; + move(top: number, left: number): void; + registerFocusable(element: dom.element): void; + removeShowListener(id: number): void; + resize(width: number, height: number): void; + setTitle(title: string): void; + setTriangle(side: 'left' | 'right' | 'top' | 'bottom'): void; + show(): void; + } + + namespace balloonPanel { + interface definition { + content?: string; + title?: string; + } + + interface templates { + close?: template; + content?: template; + panel?: template; + title?: template; + triangle?: template; + triangleInner?: template; + triangleOuter?: template; + } + + interface templateDefinitions { + close?: string; + content?: string; + panel?: string; + title?: string; + triangle?: string; + triangleInner?: string; + triangleOuter?: string; + } + + interface rect { + height?: number; + left?: number; + top?: number; + visible?: boolean; + width?: number; + } + + interface parts { + close?: dom.element; + content?: dom.element; + panel?: dom.element; + title?: dom.element; + triangle?: dom.element; + triangleInner?: dom.element; + triangleOuter?: dom.element; + } + } + + class balloonToolbar { + constructor(editor: editor, definition: { [key: string]: any }); + addItem(name: string, element: button | richCombo): void; + addItems(elements: { [itemName: string]: button | richCombo }): void; + deleteItem(name: string): void; + destroy(): void; + getItem(name: string): button | richCombo; + hide(): void; + refresh(): void; + show(): void; + } + + class button { + static readonly handler: handlerDefinition