1/* 2 * Copyright (C) 2006 Lars Knoll <lars@trolltech.com> 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 * 19 */ 20 21#include "config.h" 22#include "TextBreakIterator.h" 23 24#include <QtCore/qtextboundaryfinder.h> 25#include <qdebug.h> 26 27// #define DEBUG_TEXT_ITERATORS 28#ifdef DEBUG_TEXT_ITERATORS 29#define DEBUG qDebug 30#else 31#define DEBUG if (1) {} else qDebug 32#endif 33 34namespace WebCore { 35 36 class TextBreakIterator : public QTextBoundaryFinder { 37 }; 38 static QTextBoundaryFinder* iterator = 0; 39 static unsigned char buffer[1024]; 40 41 TextBreakIterator* wordBreakIterator(const UChar* string, int length) 42 { 43 if (!string) 44 return 0; 45 if (!iterator) 46 iterator = new QTextBoundaryFinder; 47 48 *iterator = QTextBoundaryFinder(QTextBoundaryFinder::Word, (const QChar *)string, length, buffer, sizeof(buffer)); 49 return static_cast<TextBreakIterator*>(iterator); 50 } 51 52 TextBreakIterator* characterBreakIterator(const UChar* string, int length) 53 { 54 if (!string) 55 return 0; 56 if (!iterator) 57 iterator = new QTextBoundaryFinder; 58 59 *iterator = QTextBoundaryFinder(QTextBoundaryFinder::Grapheme, (const QChar *)string, length, buffer, sizeof(buffer)); 60 return static_cast<TextBreakIterator*>(iterator); 61 } 62 63 TextBreakIterator* cursorMovementIterator(const UChar* string, int length) 64 { 65 return characterBreakIterator(string, length); 66 } 67 68 TextBreakIterator* lineBreakIterator(const UChar* string, int length) 69 { 70 static QTextBoundaryFinder *iterator = 0; 71 if (!string) 72 return 0; 73 if (!iterator) 74 iterator = new QTextBoundaryFinder; 75 76 *iterator = QTextBoundaryFinder(QTextBoundaryFinder::Line, (const QChar *)string, length, buffer, sizeof(buffer)); 77 return static_cast<TextBreakIterator*>(iterator); 78 } 79 80 TextBreakIterator* sentenceBreakIterator(const UChar* string, int length) 81 { 82 if (!string) 83 return 0; 84 if (!iterator) 85 iterator = new QTextBoundaryFinder; 86 87 *iterator = QTextBoundaryFinder(QTextBoundaryFinder::Sentence, (const QChar *)string, length, buffer, sizeof(buffer)); 88 return static_cast<TextBreakIterator*>(iterator); 89 } 90 91 int textBreakFirst(TextBreakIterator* bi) 92 { 93 bi->toStart(); 94 DEBUG() << "textBreakFirst" << bi->position(); 95 return bi->position(); 96 } 97 98 int textBreakNext(TextBreakIterator* bi) 99 { 100 int pos = bi->toNextBoundary(); 101 DEBUG() << "textBreakNext" << pos; 102 return pos; 103 } 104 105 int textBreakPreceding(TextBreakIterator* bi, int pos) 106 { 107 bi->setPosition(pos); 108 int newpos = bi->toPreviousBoundary(); 109 DEBUG() << "textBreakPreceding" << pos << newpos; 110 return newpos; 111 } 112 113 int textBreakFollowing(TextBreakIterator* bi, int pos) 114 { 115 bi->setPosition(pos); 116 int newpos = bi->toNextBoundary(); 117 DEBUG() << "textBreakFollowing" << pos << newpos; 118 return newpos; 119 } 120 121 int textBreakCurrent(TextBreakIterator* bi) 122 { 123 return bi->position(); 124 } 125 126 bool isTextBreak(TextBreakIterator*, int) 127 { 128 return true; 129 } 130 131} 132