Make line breaking obey the -webkit-locale property
[WebKit-https.git] / Source / WebCore / platform / text / TextBreakIterator.h
1 /*
2  * Copyright (C) 2006 Lars Knoll <lars@trolltech.com>
3  * Copyright (C) 2007 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #ifndef TextBreakIterator_h
23 #define TextBreakIterator_h
24
25 #include <wtf/text/AtomicString.h>
26 #include <wtf/unicode/Unicode.h>
27
28 namespace WebCore {
29
30     class TextBreakIterator;
31
32     // Note: The returned iterator is good only until you get another iterator, with the exception of acquireLineBreakIterator.
33
34     // Iterates over "extended grapheme clusters", as defined in UAX #29.
35     // Note that platform implementations may be less sophisticated - e.g. ICU prior to
36     // version 4.0 only supports "legacy grapheme clusters".
37     // Use this for general text processing, e.g. string truncation.
38     TextBreakIterator* characterBreakIterator(const UChar*, int length);
39
40     // This is similar to character break iterator in most cases, but is subject to
41     // platform UI conventions. One notable example where this can be different
42     // from character break iterator is Thai prepend characters, see bug 24342.
43     // Use this for insertion point and selection manipulations.
44     TextBreakIterator* cursorMovementIterator(const UChar*, int length);
45
46     TextBreakIterator* wordBreakIterator(const UChar*, int length);
47     TextBreakIterator* acquireLineBreakIterator(const UChar*, int length, const AtomicString& locale);
48     void releaseLineBreakIterator(TextBreakIterator*);
49     TextBreakIterator* sentenceBreakIterator(const UChar*, int length);
50
51     int textBreakFirst(TextBreakIterator*);
52     int textBreakLast(TextBreakIterator*);
53     int textBreakNext(TextBreakIterator*);
54     int textBreakPrevious(TextBreakIterator*);
55     int textBreakCurrent(TextBreakIterator*);
56     int textBreakPreceding(TextBreakIterator*, int);
57     int textBreakFollowing(TextBreakIterator*, int);
58     bool isTextBreak(TextBreakIterator*, int);
59
60     const int TextBreakDone = -1;
61
62 class LazyLineBreakIterator {
63 public:
64     LazyLineBreakIterator(const UChar* string = 0, int length = 0, const AtomicString& locale = AtomicString())
65         : m_string(string)
66         , m_length(length)
67         , m_locale(locale)
68         , m_iterator(0)
69     {
70     }
71
72     ~LazyLineBreakIterator()
73     {
74         if (m_iterator)
75             releaseLineBreakIterator(m_iterator);
76     }
77
78     const UChar* string() const { return m_string; }
79     int length() const { return m_length; }
80
81     TextBreakIterator* get()
82     {
83         if (!m_iterator)
84             m_iterator = acquireLineBreakIterator(m_string, m_length, m_locale);
85         return m_iterator;
86     }
87
88     void reset(const UChar* string, int length, const AtomicString& locale)
89     {
90         if (m_iterator)
91             releaseLineBreakIterator(m_iterator);
92
93         m_string = string;
94         m_length = length;
95         m_locale = locale;
96         m_iterator = 0;
97     }
98
99 private:
100     const UChar* m_string;
101     int m_length;
102     AtomicString m_locale;
103     TextBreakIterator* m_iterator;
104 };
105
106 }
107
108 #endif