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