18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Dominik Röttsches <dominik.roettsches@access-company.com>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextBoundaries.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextBreakIterator.h"
31f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringImpl.h>
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/unicode/Unicode.h>
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WTF;
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace Unicode;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochint endOfFirstWordBoundaryContext(const UChar* characters, int length)
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < length; ) {
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int first = i;
43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        UChar32 ch;
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        U16_NEXT(characters, i, length, ch);
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!requiresContextForWordBoundary(ch))
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return first;
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return length;
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochint startOfLastWordBoundaryContext(const UChar* characters, int length)
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = length; i > 0; ) {
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        int last = i;
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        UChar32 ch;
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        U16_PREV(characters, 0, i, ch);
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!requiresContextForWordBoundary(ch))
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            return last;
59f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return 0;
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !PLATFORM(BREWMP) && !PLATFORM(MAC) && !PLATFORM(QT)
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint findNextWordFromIndex(const UChar* chars, int len, int position, bool forward)
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    TextBreakIterator* it = wordBreakIterator(chars, len);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (forward) {
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        position = textBreakFollowing(it, position);
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        while (position != TextBreakDone) {
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We stop searching when the character preceeding the break
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // is alphanumeric.
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (position < len && isAlphanumeric(chars[position - 1]))
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return position;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            position = textBreakFollowing(it, position);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return len;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        position = textBreakPreceding(it, position);
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        while (position != TextBreakDone) {
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We stop searching when the character following the break
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // is alphanumeric.
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (position > 0 && isAlphanumeric(chars[position]))
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return position;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            position = textBreakPreceding(it, position);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid findWordBoundary(const UChar* chars, int len, int position, int* start, int* end)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    TextBreakIterator* it = wordBreakIterator(chars, len);
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    *end = textBreakFollowing(it, position);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*end < 0)
101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        *end = textBreakLast(it);
102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    *start = textBreakPrevious(it);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // !PLATFORM(BREWMP) && !PLATFORM(MAC) && !PLATFORM(QT)
106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
108