本文整理匯總了TypeScript中@ephox/katamari.Struct類的典型用法代碼示例。如果您正苦於以下問題:TypeScript Struct類的具體用法?TypeScript Struct怎麽用?TypeScript Struct使用的例子?那麽, 這裏精選的類代碼示例或許可以為您提供幫助。
在下文中一共展示了Struct類的9個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的TypeScript代碼示例。
示例1:
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
import { Adt, Arr, Fun, Option, Options, Struct } from '@ephox/katamari';
import { Compare, Element, SelectorFilter, SelectorFind } from '@ephox/sugar';
import { Range } from '@ephox/dom-globals';
const tableCellRng = Struct.immutable('start', 'end');
const tableSelection = Struct.immutable('rng', 'table', 'cells');
const deleteAction = Adt.generate([
{ removeTable: [ 'element' ] },
{ emptyCells: [ 'cells' ] }
]);
const isRootFromElement = (root) => Fun.curry(Compare.eq, root);
const getClosestCell = (container, isRoot) => {
return SelectorFind.closest(Element.fromDom(container), 'td,th', isRoot);
};
const getClosestTable = (cell, isRoot) => {
return SelectorFind.ancestor(cell, 'table', isRoot);
};
const isExpandedCellRng = (cellRng) => {
return Compare.eq(cellRng.start(), cellRng.end()) === false;
};
示例2: function
};
const forMenu = function (selections, table, cell) {
return {
element: Fun.constant(cell),
mergable: Fun.constant(CellOperations.mergable(table, selections)),
unmergable: Fun.constant(CellOperations.unmergable(cell, selections)),
selection: Fun.constant(CellOperations.selection(cell, selections))
};
};
const notCell = function (element) {
return noMenu(element);
};
const paste = Struct.immutable('element', 'clipboard', 'generators');
const pasteRows = function (selections, table, cell, clipboard, generators) {
return {
element: Fun.constant(cell),
mergable: Option.none,
unmergable: Option.none,
selection: Fun.constant(CellOperations.selection(cell, selections)),
clipboard: Fun.constant(clipboard),
generators: Fun.constant(generators)
};
};
export default {
noMenu,
forMenu,
示例3: isScrolling
PlatformEditor.getActiveApi(platform.editor).each(function (editorApi) {
// TODO: Orientation changes.
// orientation = Orientation.onChange();
priorState.set({
socketHeight: Css.getRaw(platform.socket, 'height'),
iframeHeight: Css.getRaw(editorApi.frame(), 'height'),
outerScroll: document.body.scrollTop
});
scrollEvents.set({
// Allow only things that have scrollable class to be scrollable. Without this,
// the toolbar scrolling gets prevented
exclusives: Scrollables.exclusive(doc, '.' + Scrollable.scrollable())
});
Class.add(platform.container, Styles.resolve('fullscreen-maximized'));
Thor.clobberStyles(platform.container, editorApi.body());
meta.maximize();
/* NOTE: Making the toolbar scrollable is now done when the middle group is created */
Css.set(platform.socket, 'overflow', 'scroll');
Css.set(platform.socket, '-webkit-overflow-scrolling', 'touch');
Focus.focus(editorApi.body());
const setupBag = Struct.immutableBag([
'cWin',
'ceBody',
'socket',
'toolstrip',
'toolbar',
'dropup',
'contentElement',
'cursor',
'keyboardType',
'isScrolling',
'outerWindow',
'outerBody'
], []);
iosApi.set(
IosSetup.setup(setupBag({
cWin: editorApi.win(),
ceBody: editorApi.body(),
socket: platform.socket,
toolstrip: platform.toolstrip,
toolbar: platform.toolbar,
dropup: platform.dropup.element(),
contentElement: editorApi.frame(),
cursor: Fun.noop,
outerBody: platform.body,
outerWindow: platform.win,
keyboardType: IosKeyboard.stubborn,
isScrolling () {
return scrollEvents.get().exists(function (s) {
return s.socket.isScrolling();
});
}
}))
);
iosApi.run(function (api) {
api.syncHeight();
});
iosEvents.set(
IosEvents.initEvents(editorApi, iosApi, platform.toolstrip, platform.socket, platform.dropup)
);
});
示例4: isNaN
/**
* SimpleTableModel.js
*
* Released under LGPL License.
* Copyright (c) 1999-2017 Ephox Corp. All rights reserved
*
* License: http://www.tinymce.com/license
* Contributing: http://www.tinymce.com/contributing
*/
import { Arr, Option, Struct } from '@ephox/katamari';
import { Compare, Insert, InsertAll, Replication, Element, Attr, SelectorFilter } from '@ephox/sugar';
const tableModel = Struct.immutable('element', 'width', 'rows');
const tableRow = Struct.immutable('element', 'cells');
const cellPosition = Struct.immutable('x', 'y');
const getSpan = function (td, key) {
const value = parseInt(Attr.get(td, key), 10);
return isNaN(value) ? 1 : value;
};
const fillout = function (table, x, y, tr, td) {
const rowspan = getSpan(td, 'rowspan');
const colspan = getSpan(td, 'colspan');
const rows = table.rows();
for (let y2 = y; y2 < y + rowspan; y2++) {
if (!rows[y2]) {
rows[y2] = tableRow(Replication.deep(tr), []);
}
示例5: function
import { Arr, Fun, Obj, Option, Strings, Struct, Type } from '@ephox/katamari';
import { PlatformDetection } from '@ephox/sand';
import Tools from './api/util/Tools';
import { Editor } from 'tinymce/core/api/Editor';
export interface ParamTypeMap {
'hash': Record<string, string>;
'string': string;
'number': number;
'boolean': boolean;
'string[]': string[];
'array': any[];
}
const sectionResult = Struct.immutable('sections', 'settings');
const detection = PlatformDetection.detect();
const isTouch = detection.deviceType.isTouch();
const mobilePlugins = [ 'lists', 'autolink', 'autosave' ];
const defaultMobileSettings = { theme: 'mobile' };
const normalizePlugins = function (plugins) {
const pluginNames = Type.isArray(plugins) ? plugins.join(' ') : plugins;
const trimmedPlugins = Arr.map(Type.isString(pluginNames) ? pluginNames.split(' ') : [ ], Strings.trim);
return Arr.filter(trimmedPlugins, function (item) {
return item.length > 0;
});
};
const filterMobilePlugins = function (plugins) {
return Arr.filter(plugins, Fun.curry(Arr.contains, mobilePlugins));
示例6: function
export default function (editor, lazyResize) {
const handlerStruct = Struct.immutableBag(['mousedown', 'mouseover', 'mouseup', 'keyup', 'keydown'], []);
let handlers = Option.none();
const annotations = SelectionAnnotation.byAttr(Ephemera);
editor.on('init', function (e) {
const win = editor.getWin();
const body = Util.getBody(editor);
const isRoot = Util.getIsRoot(editor);
const syncSelection = function () {
const sel = editor.selection;
const start = Element.fromDom(sel.getStart());
const end = Element.fromDom(sel.getEnd());
const startTable = TableLookup.table(start);
const endTable = TableLookup.table(end);
const sameTable = startTable.bind(function (tableStart) {
return endTable.bind(function (tableEnd) {
return Compare.eq(tableStart, tableEnd) ? Option.some(true) : Option.none();
});
});
sameTable.fold(function () {
annotations.clear(body);
}, Fun.noop);
};
const mouseHandlers = InputHandlers.mouse(win, body, isRoot, annotations);
const keyHandlers = InputHandlers.keyboard(win, body, isRoot, annotations);
const hasShiftKey = (event) => event.raw().shiftKey === true;
const handleResponse = function (event, response) {
// Only handle shift key non shiftkey cell navigation is handled by core
if (!hasShiftKey(event)) {
return;
}
if (response.kill()) {
event.kill();
}
response.selection().each(function (ns) {
const relative = Selection.relative(ns.start(), ns.finish());
const rng = SelectionDirection.asLtrRange(win, relative);
editor.selection.setRng(rng);
});
};
const keyup = function (event) {
const wrappedEvent = wrapEvent(event);
// Note, this is an optimisation.
if (wrappedEvent.raw().shiftKey && SelectionKeys.isNavigation(wrappedEvent.raw().which)) {
const rng = editor.selection.getRng();
const start = Element.fromDom(rng.startContainer);
const end = Element.fromDom(rng.endContainer);
keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) {
handleResponse(wrappedEvent, response);
});
}
};
const checkLast = function (last) {
return !Attr.has(last, 'data-mce-bogus') && Node.name(last) !== 'br' && !(Node.isText(last) && Text.get(last).length === 0);
};
const getLast = function () {
const body = Element.fromDom(editor.getBody());
const lastChild = Traverse.lastChild(body);
const getPrevLast = function (last) {
return Traverse.prevSibling(last).bind(function (prevLast) {
return checkLast(prevLast) ? Option.some(prevLast) : getPrevLast(prevLast);
});
};
return lastChild.bind(function (last) {
return checkLast(last) ? Option.some(last) : getPrevLast(last);
});
};
const keydown = function (event) {
const wrappedEvent = wrapEvent(event);
lazyResize().each(function (resize) {
resize.hideBars();
});
if (event.which === 40) {
getLast().each(function (last) {
if (Node.name(last) === 'table') {
if (getForcedRootBlock(editor)) {
editor.dom.add(
editor.getBody(),
getForcedRootBlock(editor),
getForcedRootBlockAttrs(editor),
'<br/>'
);
} else {
editor.dom.add(editor.getBody(), 'br');
}
}
//.........這裏部分代碼省略.........
示例7: BlockPosition
* Released under LGPL License.
* Copyright (c) 1999-2017 Ephox Corp. All rights reserved
*
* License: http://www.tinymce.com/license
* Contributing: http://www.tinymce.com/contributing
*/
import { Option, Options, Struct } from '@ephox/katamari';
import { Compare, Element, Traverse } from '@ephox/sugar';
import CaretFinder from '../caret/CaretFinder';
import CaretPosition from '../caret/CaretPosition';
import DeleteUtils from './DeleteUtils';
import Empty from '../dom/Empty';
import NodeType from '../dom/NodeType';
const BlockPosition = Struct.immutable('block', 'position');
const BlockBoundary = Struct.immutable('from', 'to');
const getBlockPosition = function (rootNode, pos) {
const rootElm = Element.fromDom(rootNode);
const containerElm = Element.fromDom(pos.container());
return DeleteUtils.getParentBlock(rootElm, containerElm).map(function (block) {
return BlockPosition(block, pos);
});
};
const isDifferentBlocks = function (blockBoundary) {
return Compare.eq(blockBoundary.from().block(), blockBoundary.to().block()) === false;
};
const hasSameParent = function (blockBoundary) {
示例8: findParent
* Released under LGPL License.
* Copyright (c) 1999-2017 Ephox Corp. All rights reserved
*
* License: http://www.tinymce.com/license
* Contributing: http://www.tinymce.com/contributing
*/
import { Option } from '@ephox/katamari';
import { Struct } from '@ephox/katamari';
import CaretContainer from '../caret/CaretContainer';
import NodeType from '../dom/NodeType';
import TreeWalker from '../dom/TreeWalker';
import CaretFormat from '../fmt/CaretFormat';
import RangeCompare from './RangeCompare';
const position = Struct.immutable('container', 'offset');
const findParent = function (node, rootNode, predicate) {
while (node && node !== rootNode) {
if (predicate(node)) {
return node;
}
node = node.parentNode;
}
return null;
};
const hasParent = function (node, rootNode, predicate) {
return findParent(node, rootNode, predicate) !== null;
示例9: function
export default function (editor, lazyResize) {
const handlerStruct = Struct.immutableBag(['mousedown', 'mouseover', 'mouseup', 'keyup', 'keydown'], []);
let handlers = Option.none();
const annotations = SelectionAnnotation.byAttr(Ephemera);
editor.on('init', function (e) {
const win = editor.getWin();
const body = Util.getBody(editor);
const isRoot = Util.getIsRoot(editor);
// When the selection changes through either the mouse or keyboard, and the selection is no longer within the table.
// Remove the selection.
const syncSelection = function () {
const sel = editor.selection;
const start = Element.fromDom(sel.getStart());
const end = Element.fromDom(sel.getEnd());
const shared = DomParent.sharedOne(TableLookup.table, [start, end]);
shared.fold(function () {
annotations.clear(body);
}, Fun.noop);
};
const mouseHandlers = InputHandlers.mouse(win, body, isRoot, annotations);
const keyHandlers = InputHandlers.keyboard(win, body, isRoot, annotations);
const hasShiftKey = (event) => event.raw().shiftKey === true;
const handleResponse = function (event, response) {
// Only handle shift key non shiftkey cell navigation is handled by core
if (!hasShiftKey(event)) {
return;
}
if (response.kill()) {
event.kill();
}
response.selection().each(function (ns) {
const relative = Selection.relative(ns.start(), ns.finish());
const rng = SelectionDirection.asLtrRange(win, relative);
editor.selection.setRng(rng);
});
};
const keyup = function (event) {
const wrappedEvent = wrapEvent(event);
// Note, this is an optimisation.
if (wrappedEvent.raw().shiftKey && SelectionKeys.isNavigation(wrappedEvent.raw().which)) {
const rng = editor.selection.getRng();
const start = Element.fromDom(rng.startContainer);
const end = Element.fromDom(rng.endContainer);
keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) {
handleResponse(wrappedEvent, response);
});
}
};
const keydown = function (event: KeyboardEvent) {
const wrappedEvent = wrapEvent(event);
lazyResize().each(function (resize) {
resize.hideBars();
});
const rng = editor.selection.getRng();
const startContainer = Element.fromDom(editor.selection.getStart());
const start = Element.fromDom(rng.startContainer);
const end = Element.fromDom(rng.endContainer);
const direction = Direction.directionAt(startContainer).isRtl() ? SelectionKeys.rtl : SelectionKeys.ltr;
keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) {
handleResponse(wrappedEvent, response);
});
lazyResize().each(function (resize) {
resize.showBars();
});
};
const isMouseEvent = (event: any): event is MouseEvent => event.hasOwnProperty('x') && event.hasOwnProperty('y');
const wrapEvent = function (event: MouseEvent | KeyboardEvent) {
// IE9 minimum
const target = Element.fromDom(event.target as HTMLElement);
const stop = function () {
event.stopPropagation();
};
const prevent = function () {
event.preventDefault();
};
const kill = Fun.compose(prevent, stop); // more of a sequence than a compose, but same effect
// FIX: Don't just expose the raw event. Need to identify what needs standardisation.
return {
target: Fun.constant(target),
x: Fun.constant(isMouseEvent(event) ? event.x : null),
y: Fun.constant(isMouseEvent(event) ? event.y : null),
stop,
prevent,
kill,
raw: Fun.constant(event)
//.........這裏部分代碼省略.........