1/*
2 * Copyright (C) 2004 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "EditingBoundary.h"
29#include "VisibleSelection.h"
30
31namespace WebCore {
32
33class Node;
34class VisiblePosition;
35class SimplifiedBackwardsTextIterator;
36class TextIterator;
37
38enum EWordSide { RightWordIfOnBoundary = false, LeftWordIfOnBoundary = true };
39
40// words
41WEBCORE_EXPORT VisiblePosition startOfWord(const VisiblePosition &, EWordSide = RightWordIfOnBoundary);
42WEBCORE_EXPORT VisiblePosition endOfWord(const VisiblePosition &, EWordSide = RightWordIfOnBoundary);
43WEBCORE_EXPORT VisiblePosition previousWordPosition(const VisiblePosition &);
44WEBCORE_EXPORT VisiblePosition nextWordPosition(const VisiblePosition &);
45VisiblePosition rightWordPosition(const VisiblePosition&, bool skipsSpaceWhenMovingRight);
46VisiblePosition leftWordPosition(const VisiblePosition&, bool skipsSpaceWhenMovingRight);
47bool isStartOfWord(const VisiblePosition&);
48
49// sentences
50WEBCORE_EXPORT VisiblePosition startOfSentence(const VisiblePosition &);
51WEBCORE_EXPORT VisiblePosition endOfSentence(const VisiblePosition &);
52WEBCORE_EXPORT VisiblePosition previousSentencePosition(const VisiblePosition &);
53WEBCORE_EXPORT VisiblePosition nextSentencePosition(const VisiblePosition &);
54
55// lines
56WEBCORE_EXPORT VisiblePosition startOfLine(const VisiblePosition &);
57WEBCORE_EXPORT VisiblePosition endOfLine(const VisiblePosition &);
58WEBCORE_EXPORT VisiblePosition previousLinePosition(const VisiblePosition&, int lineDirectionPoint, EditableType = ContentIsEditable);
59WEBCORE_EXPORT VisiblePosition nextLinePosition(const VisiblePosition&, int lineDirectionPoint, EditableType = ContentIsEditable);
60WEBCORE_EXPORT bool inSameLine(const VisiblePosition &, const VisiblePosition &);
61WEBCORE_EXPORT bool isStartOfLine(const VisiblePosition &);
62WEBCORE_EXPORT bool isEndOfLine(const VisiblePosition &);
63VisiblePosition logicalStartOfLine(const VisiblePosition &, bool* reachedBoundary = nullptr);
64VisiblePosition logicalEndOfLine(const VisiblePosition &, bool* reachedBoundary = nullptr);
65bool isLogicalEndOfLine(const VisiblePosition &);
66VisiblePosition leftBoundaryOfLine(const VisiblePosition&, TextDirection, bool* reachedBoundary);
67VisiblePosition rightBoundaryOfLine(const VisiblePosition&, TextDirection, bool* reachedBoundary);
68
69// paragraphs (perhaps a misnomer, can be divided by line break elements)
70WEBCORE_EXPORT VisiblePosition startOfParagraph(const VisiblePosition&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
71WEBCORE_EXPORT VisiblePosition endOfParagraph(const VisiblePosition&, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
72VisiblePosition startOfNextParagraph(const VisiblePosition&);
73WEBCORE_EXPORT VisiblePosition previousParagraphPosition(const VisiblePosition &, int x);
74WEBCORE_EXPORT VisiblePosition nextParagraphPosition(const VisiblePosition &, int x);
75WEBCORE_EXPORT bool isStartOfParagraph(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
76WEBCORE_EXPORT bool isEndOfParagraph(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
77bool inSameParagraph(const VisiblePosition &, const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
78bool isBlankParagraph(const VisiblePosition &);
79
80// blocks (true paragraphs; line break elements don't break blocks)
81VisiblePosition startOfBlock(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
82VisiblePosition endOfBlock(const VisiblePosition &, EditingBoundaryCrossingRule = CannotCrossEditingBoundary);
83bool inSameBlock(const VisiblePosition &, const VisiblePosition &);
84bool isStartOfBlock(const VisiblePosition &);
85bool isEndOfBlock(const VisiblePosition &);
86
87// document
88WEBCORE_EXPORT VisiblePosition startOfDocument(const Node*);
89WEBCORE_EXPORT VisiblePosition endOfDocument(const Node*);
90WEBCORE_EXPORT VisiblePosition startOfDocument(const VisiblePosition &);
91WEBCORE_EXPORT VisiblePosition endOfDocument(const VisiblePosition &);
92bool inSameDocument(const VisiblePosition &, const VisiblePosition &);
93WEBCORE_EXPORT bool isStartOfDocument(const VisiblePosition &);
94WEBCORE_EXPORT bool isEndOfDocument(const VisiblePosition &);
95
96// editable content
97WEBCORE_EXPORT VisiblePosition startOfEditableContent(const VisiblePosition&);
98WEBCORE_EXPORT VisiblePosition endOfEditableContent(const VisiblePosition&);
99WEBCORE_EXPORT bool isEndOfEditableOrNonEditableContent(const VisiblePosition&);
100
101WEBCORE_EXPORT bool atBoundaryOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
102WEBCORE_EXPORT bool withinTextUnitOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
103WEBCORE_EXPORT VisiblePosition positionOfNextBoundaryOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
104WEBCORE_EXPORT RefPtr<Range> enclosingTextUnitOfGranularity(const VisiblePosition&, TextGranularity, SelectionDirection);
105WEBCORE_EXPORT int distanceBetweenPositions(const VisiblePosition&, const VisiblePosition&);
106WEBCORE_EXPORT RefPtr<Range> wordRangeFromPosition(const VisiblePosition&);
107WEBCORE_EXPORT VisiblePosition closestWordBoundaryForPosition(const VisiblePosition& position);
108WEBCORE_EXPORT void charactersAroundPosition(const VisiblePosition&, UChar32& oneAfter, UChar32& oneBefore, UChar32& twoBefore);
109WEBCORE_EXPORT RefPtr<Range> rangeExpandedAroundPositionByCharacters(const VisiblePosition&, int numberOfCharactersToExpand);
110WEBCORE_EXPORT RefPtr<Range> rangeExpandedByCharactersInDirectionAtWordBoundary(const VisiblePosition&, int numberOfCharactersToExpand, SelectionDirection);
111
112// helper function
113enum BoundarySearchContextAvailability { DontHaveMoreContext, MayHaveMoreContext };
114typedef unsigned (*BoundarySearchFunction)(StringView, unsigned offset, BoundarySearchContextAvailability, bool& needMoreContext);
115unsigned startWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
116unsigned endWordBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
117unsigned startSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
118unsigned endSentenceBoundary(StringView, unsigned, BoundarySearchContextAvailability, bool&);
119unsigned suffixLengthForRange(const Range&, Vector<UChar, 1024>&);
120unsigned prefixLengthForRange(const Range&, Vector<UChar, 1024>&);
121unsigned backwardSearchForBoundaryWithTextIterator(SimplifiedBackwardsTextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
122unsigned forwardSearchForBoundaryWithTextIterator(TextIterator&, Vector<UChar, 1024>&, unsigned, BoundarySearchFunction);
123Node* findStartOfParagraph(Node*, Node*, Node*, int&, Position::AnchorType&, EditingBoundaryCrossingRule);
124Node* findEndOfParagraph(Node*, Node*, Node*, int&, Position::AnchorType&, EditingBoundaryCrossingRule);
125
126} // namespace WebCore
127