1/* 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Dominik Röttsches <dominik.roettsches@access-company.com> 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "config.h" 28#include "TextBoundaries.h" 29 30#include "StringImpl.h" 31#include "TextBreakIterator.h" 32#include <wtf/unicode/Unicode.h> 33 34using namespace WTF; 35using namespace Unicode; 36 37namespace WebCore { 38 39int findNextWordFromIndex(const UChar* chars, int len, int position, bool forward) 40{ 41 TextBreakIterator* it = wordBreakIterator(chars, len); 42 43 if (forward) { 44 position = textBreakFollowing(it, position); 45 while (position != TextBreakDone) { 46 // We stop searching when the character preceeding the break 47 // is alphanumeric. 48 if (position < len && isAlphanumeric(chars[position - 1])) 49 return position; 50 51 position = textBreakFollowing(it, position); 52 } 53 54 return len; 55 } else { 56 position = textBreakPreceding(it, position); 57 while (position != TextBreakDone) { 58 // We stop searching when the character following the break 59 // is alphanumeric. 60 if (position > 0 && isAlphanumeric(chars[position])) 61 return position; 62 63 position = textBreakPreceding(it, position); 64 } 65 66 return 0; 67 } 68} 69 70void findWordBoundary(const UChar* chars, int len, int position, int* start, int* end) 71{ 72 TextBreakIterator* it = wordBreakIterator(chars, len); 73 *end = textBreakFollowing(it, position); 74 if (*end < 0) 75 *end = textBreakLast(it); 76 *start = textBreakPrevious(it); 77} 78 79} // namespace WebCore 80