void KTextEditingPlugin::checkSection(QTextDocument *document, int startPosition, int endPosition) { QTextBlock block = document->findBlock(startPosition); int pos = block.position(); while (true) { if (!block.contains(startPosition - 1) && !block.contains(endPosition + 1)) // only parags that are completely in finishedParagraph(document, block.position()); QString text = block.text(); bool space = true; QString::Iterator iter = text.begin(); while (pos < endPosition && iter != text.end()) { bool isSpace = iter->isSpace(); if (pos >= startPosition && space && !isSpace) // for each word, call finishedWord finishedWord(document, pos); else if (!isSpace && pos == startPosition) finishedWord(document, startPosition); space = isSpace; pos++; iter++; } if (!(block.isValid() && block.position() + block.length() < endPosition)) break; block = block.next(); } }
void KTextEditingPlugin::selectWord(QTextCursor &cursor, int cursorPosition) const { cursor.setPosition(cursorPosition); QTextBlock block = cursor.block(); cursor.setPosition(block.position()); cursorPosition -= block.position(); QString string = block.text(); int pos = 0; bool space = false; QString::Iterator iter = string.begin(); while (iter != string.end()) { if (iter->isSpace()) { if (space) ;// double spaces belong to the previous word else if (pos < cursorPosition) cursor.setPosition(pos + block.position() + 1); // +1 because we don't want to set it on the space itself else space = true; } else if (space) break; pos++; iter++; } cursor.setPosition(pos + block.position(), QTextCursor::KeepAnchor); }
void Changecase::sentenceCase() { QTextBlock block = m_document->findBlock(m_startPosition); QTextCursor backCursor(m_cursor); int pos = block.position() + block.length() - 1; // TODO // * Exception? while (true) { QString text = block.text(); int prevLetterIndex = -1; QChar currentWord; pos = block.position() + block.length() - 1; QString::Iterator iter = text.end(); if (text.isEmpty()) { // empty block, go to next block if (!(block.isValid() && block.position() + block.length() < m_endPosition)) break; block = block.next(); continue; } iter--; while (iter != text.begin()) { while (iter != text.begin() && !iter->isSpace()) { iter--; pos--; } prevLetterIndex = pos; currentWord = QChar(*(iter + 1)); while (iter != text.begin() && iter->isSpace()) { iter--; pos--; } // found end of sentence, go back to last found letter (indicating start of a word) if (iter != text.begin() && (*iter == QChar('.') || *iter == QChar('!') || *iter == QChar('?'))) { if (prevLetterIndex >= m_startPosition && prevLetterIndex <= m_endPosition && currentWord.isLower()) { // kDebug() <<"Found end of sentence" << *iter <<" :" << currentWord; m_cursor.setPosition(prevLetterIndex); m_cursor.deleteChar(); m_cursor.insertText(currentWord.toUpper()); iter--; pos--; } else if (prevLetterIndex < m_startPosition) break; } } if (iter == text.begin() && --pos >= m_startPosition) { // start of paragraph, must be start of a sentence also if (pos + 1 == prevLetterIndex && (*iter).isLower()) { m_cursor.setPosition(pos); m_cursor.deleteChar(); m_cursor.insertText((*iter).toUpper()); } else if (!(*iter).isLetter() && currentWord.isLower()) { m_cursor.setPosition(prevLetterIndex); m_cursor.deleteChar(); m_cursor.insertText(currentWord.toUpper()); } } if (!(block.isValid() && block.position() + block.length() < m_endPosition)) break; block = block.next(); } }