SurroundingText.cpp [plain text]
#include "config.h"
#include "SurroundingText.h"
#include "Document.h"
#include "TextIterator.h"
#include "VisibleSelection.h"
#include "VisibleUnits.h"
namespace WebCore {
SurroundingText::SurroundingText(const VisiblePosition& visiblePosition, unsigned maxLength)
: m_positionOffsetInContent(0)
{
if (visiblePosition.isNull())
return;
const unsigned halfMaxLength = maxLength / 2;
CharacterIterator forwardIterator(makeRange(visiblePosition, endOfDocument(visiblePosition)).get(), TextIteratorStopsOnFormControls);
if (!forwardIterator.atEnd())
forwardIterator.advance(maxLength - halfMaxLength);
Position position = visiblePosition.deepEquivalent().parentAnchoredEquivalent();
Document* document = position.document();
RefPtr<Range> forwardRange = forwardIterator.range();
if (!forwardRange || !Range::create(document, position, forwardRange->startPosition())->text().length()) {
ASSERT(forwardRange);
return;
}
BackwardsCharacterIterator backwardsIterator(makeRange(startOfDocument(visiblePosition), visiblePosition).get(), TextIteratorStopsOnFormControls);
if (!backwardsIterator.atEnd())
backwardsIterator.advance(halfMaxLength);
RefPtr<Range> backwardsRange = backwardsIterator.range();
if (!backwardsRange) {
ASSERT(backwardsRange);
return;
}
m_positionOffsetInContent = Range::create(document, backwardsRange->endPosition(), position)->text().length();
m_contentRange = Range::create(document, backwardsRange->endPosition(), forwardRange->startPosition());
ASSERT(m_contentRange);
}
PassRefPtr<Range> SurroundingText::rangeFromContentOffsets(unsigned startOffsetInContent, unsigned endOffsetInContent)
{
if (startOffsetInContent >= endOffsetInContent || endOffsetInContent > content().length())
return 0;
CharacterIterator iterator(m_contentRange.get());
ASSERT(!iterator.atEnd());
iterator.advance(startOffsetInContent);
ASSERT(iterator.range());
Position start = iterator.range()->startPosition();
ASSERT(!iterator.atEnd());
iterator.advance(endOffsetInContent - startOffsetInContent);
ASSERT(iterator.range());
Position end = iterator.range()->startPosition();
return Range::create(start.document(), start, end);
}
String SurroundingText::content() const
{
if (m_contentRange)
return m_contentRange->text();
return String();
}
unsigned SurroundingText::positionOffsetInContent() const
{
return m_positionOffsetInContent;
}
}