OXIESEC PANEL
- Current Dir:
/
/
var
/
www
/
reader
/
_backup
/
tinymce
/
tinymce
/
src
/
core
/
main
/
ts
/
caret
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/20/2020 05:44:43 AM
rwxr-xr-x
📄
BlockBoundary.ts
1.53 KB
02/20/2020 05:42:20 AM
rw-r--r--
📄
CaretBr.ts
1.47 KB
02/20/2020 05:42:20 AM
rw-r--r--
📄
CaretCandidate.ts
2.68 KB
02/20/2020 05:42:21 AM
rw-r--r--
📄
CaretContainer.ts
5.4 KB
02/20/2020 05:42:21 AM
rw-r--r--
📄
CaretContainerInline.ts
2.23 KB
02/20/2020 05:42:22 AM
rw-r--r--
📄
CaretContainerInput.ts
1.87 KB
02/20/2020 05:42:22 AM
rw-r--r--
📄
CaretContainerRemove.ts
3.3 KB
02/20/2020 05:42:23 AM
rw-r--r--
📄
CaretFinder.ts
4.09 KB
02/20/2020 05:42:25 AM
rw-r--r--
📄
CaretPosition.ts
13.27 KB
02/20/2020 05:42:26 AM
rw-r--r--
📄
CaretPositionPredicates.ts
2.24 KB
02/20/2020 05:42:27 AM
rw-r--r--
📄
CaretUtils.ts
8.54 KB
02/20/2020 05:42:27 AM
rw-r--r--
📄
CaretWalker.ts
7.67 KB
02/20/2020 05:42:28 AM
rw-r--r--
📄
FakeCaret.ts
6.26 KB
02/20/2020 05:42:28 AM
rw-r--r--
📄
InsertText.ts
1.32 KB
02/20/2020 05:42:29 AM
rw-r--r--
📄
LineReader.ts
5.88 KB
02/20/2020 05:42:29 AM
rw-r--r--
📄
LineUtils.ts
4.11 KB
02/20/2020 05:42:30 AM
rw-r--r--
📄
LineWalker.ts
4.56 KB
02/20/2020 05:42:30 AM
rw-r--r--
📄
TableCells.ts
3.58 KB
02/20/2020 05:42:31 AM
rw-r--r--
Editing: CaretFinder.ts
Close
/** * 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 { Fun, Option } from '@ephox/katamari'; import * as CaretCandidate from './CaretCandidate'; import CaretPosition from './CaretPosition'; import * as CaretUtils from './CaretUtils'; import { CaretWalker } from './CaretWalker'; import NodeType from '../dom/NodeType'; import { Node, Element, Text } from '@ephox/dom-globals'; const walkToPositionIn = (forward: boolean, root: Node, start: Node) => { const position = forward ? CaretPosition.before(start) : CaretPosition.after(start); return fromPosition(forward, root, position); }; const afterElement = (node): CaretPosition => { return NodeType.isBr(node) ? CaretPosition.before(node) : CaretPosition.after(node); }; const isBeforeOrStart = (position: CaretPosition): boolean => { if (CaretPosition.isTextPosition(position)) { return position.offset() === 0; } else { return CaretCandidate.isCaretCandidate(position.getNode()); } }; const isAfterOrEnd = (position: CaretPosition): boolean => { if (CaretPosition.isTextPosition(position)) { const container = position.container() as Text; return position.offset() === container.data.length; } else { return CaretCandidate.isCaretCandidate(position.getNode(true)); } }; const isBeforeAfterSameElement = (from: CaretPosition, to: CaretPosition): boolean => { return !CaretPosition.isTextPosition(from) && !CaretPosition.isTextPosition(to) && from.getNode() === to.getNode(true); }; const isAtBr = (position: CaretPosition): boolean => { return !CaretPosition.isTextPosition(position) && NodeType.isBr(position.getNode()); }; const shouldSkipPosition = (forward: boolean, from: CaretPosition, to: CaretPosition) => { if (forward) { return !isBeforeAfterSameElement(from, to) && !isAtBr(from) && isAfterOrEnd(from) && isBeforeOrStart(to); } else { return !isBeforeAfterSameElement(to, from) && isBeforeOrStart(from) && isAfterOrEnd(to); } }; // Finds: <p>a|<b>b</b></p> -> <p>a<b>|b</b></p> const fromPosition = function (forward: boolean, root: Node, pos: CaretPosition) { const walker = CaretWalker(root); return Option.from(forward ? walker.next(pos) : walker.prev(pos)); }; // Finds: <p>a|<b>b</b></p> -> <p>a<b>b|</b></p> const navigate = (forward: boolean, root: Element, from: CaretPosition) => { return fromPosition(forward, root, from).bind(function (to) { if (CaretUtils.isInSameBlock(from, to, root) && shouldSkipPosition(forward, from, to)) { return fromPosition(forward, root, to); } else { return Option.some(to); } }); }; const navigateIgnore = (forward: boolean, root: Element, from: CaretPosition, ignoreFilter: (pos: CaretPosition) => boolean) => { return navigate(forward, root, from).bind((pos) => { return ignoreFilter(pos) ? navigateIgnore(forward, root, pos, ignoreFilter) : Option.some(pos); }); }; const positionIn = (forward: boolean, element: Element): Option<CaretPosition> => { const startNode = forward ? element.firstChild : element.lastChild; if (NodeType.isText(startNode)) { return Option.some(CaretPosition(startNode, forward ? 0 : startNode.data.length)); } else if (startNode) { if (CaretCandidate.isCaretCandidate(startNode)) { return Option.some(forward ? CaretPosition.before(startNode) : afterElement(startNode)); } else { return walkToPositionIn(forward, element, startNode); } } else { return Option.none(); } }; const nextPosition = Fun.curry(fromPosition, true) as (root: Node, pos: CaretPosition) => Option<CaretPosition>; const prevPosition = Fun.curry(fromPosition, false) as (root: Node, pos: CaretPosition) => Option<CaretPosition>; export default { fromPosition, nextPosition, prevPosition, navigate, navigateIgnore, positionIn, firstPositionIn: Fun.curry(positionIn, true) as (element: Element) => Option<CaretPosition>, lastPositionIn: Fun.curry(positionIn, false) as (element: Element) => Option<CaretPosition> };