亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? visible_text.cpp

?? It is WEB browser core module with source code. Very good!
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
{
    Range r = m_textIterator.range();
    if (!m_textIterator.atEnd()) {
        if (m_textIterator.length() <= 1) {
            assert(m_runOffset == 0);
        } else {
            Node n = r.startContainer();
            assert(n == r.endContainer());
            long offset = r.startOffset() + m_runOffset;
            r.setStart(n, offset);
            r.setEnd(n, offset + 1);
        }
    }
    return r;
}

void CharacterIterator::advance(long count)
{
    assert(!atEnd());

    m_atBreak = false;

    // easy if there is enough left in the current m_textIterator run
    long remaining = m_textIterator.length() - m_runOffset;
    if (count < remaining) {
        m_runOffset += count;
        m_offset += count;
        return;
    }

    // exhaust the current m_textIterator run
    count -= remaining;
    m_offset += remaining;
    
    // move to a subsequent m_textIterator run
    for (m_textIterator.advance(); !atEnd(); m_textIterator.advance()) {
        long runLength = m_textIterator.length();
        if (runLength == 0) {
            m_atBreak = true;
        } else {
            // see whether this is m_textIterator to use
            if (count < runLength) {
                m_runOffset = count;
                m_offset += count;
                return;
            }
            
            // exhaust this m_textIterator run
            count -= runLength;
            m_offset += runLength;
        }
    }

    // ran to the end of the m_textIterator... no more runs left
    m_atBreak = true;
    m_runOffset = 0;
}

QString CharacterIterator::string(long numChars)
{
    QString result;
    result.reserve(numChars);
    while (numChars > 0 && !atEnd()) {
        long runSize = kMin(numChars, length());
        result.append(characters(), runSize);
        numChars -= runSize;
        advance(runSize);
    }
    return result;
}

WordAwareIterator::WordAwareIterator()
: m_previousText(0), m_didLookAhead(false)
{
}

WordAwareIterator::WordAwareIterator(const Range &r)
: m_previousText(0), m_didLookAhead(false), m_textIterator(r)
{
    m_didLookAhead = true;  // so we consider the first chunk from the text iterator
    advance();              // get in position over the first chunk of text
}

// We're always in one of these modes:
// - The current chunk in the text iterator is our current chunk
//      (typically its a piece of whitespace, or text that ended with whitespace)
// - The previous chunk in the text iterator is our current chunk
//      (we looked ahead to the next chunk and found a word boundary)
// - We built up our own chunk of text from many chunks from the text iterator

//FIXME: Perf could be bad for huge spans next to each other that don't fall on word boundaries

void WordAwareIterator::advance()
{
    m_previousText = 0;
    m_buffer = "";      // toss any old buffer we built up

    // If last time we did a look-ahead, start with that looked-ahead chunk now
    if (!m_didLookAhead) {
        assert(!m_textIterator.atEnd());
        m_textIterator.advance();
    }
    m_didLookAhead = false;

    // Go to next non-empty chunk 
    while (!m_textIterator.atEnd() && m_textIterator.length() == 0) {
        m_textIterator.advance();
    }
    m_range = m_textIterator.range();

    if (m_textIterator.atEnd()) {
        return;
    }
    
    while (1) {
        // If this chunk ends in whitespace we can just use it as our chunk.
        if (m_textIterator.characters()[m_textIterator.length()-1].isSpace()) {
            return;
        }

        // If this is the first chunk that failed, save it in previousText before look ahead
        if (m_buffer.isEmpty()) {
            m_previousText = m_textIterator.characters();
            m_previousLength = m_textIterator.length();
        }

        // Look ahead to next chunk.  If it is whitespace or a break, we can use the previous stuff
        m_textIterator.advance();
        if (m_textIterator.atEnd() || m_textIterator.length() == 0 || m_textIterator.characters()[0].isSpace()) {
            m_didLookAhead = true;
            return;
        }

        if (m_buffer.isEmpty()) {
            // Start gobbling chunks until we get to a suitable stopping point
            m_buffer.append(m_previousText, m_previousLength);
            m_previousText = 0;
        }
        m_buffer.append(m_textIterator.characters(), m_textIterator.length());
        m_range.setEnd(m_textIterator.range().endContainer(), m_textIterator.range().endOffset());
    }
}

long WordAwareIterator::length() const
{
    if (!m_buffer.isEmpty()) {
        return m_buffer.length();
    } else if (m_previousText) {
        return m_previousLength;
    } else {
        return m_textIterator.length();
    }
}

const QChar *WordAwareIterator::characters() const
{
    if (!m_buffer.isEmpty()) {
        return m_buffer.unicode();
    } else if (m_previousText) {
        return m_previousText;
    } else {
        return m_textIterator.characters();
    }
}

CircularSearchBuffer::CircularSearchBuffer(const QString &s, bool isCaseSensitive)
    : m_target(s)
{
    assert(!s.isEmpty());

    if (!isCaseSensitive) {
        m_target = s.lower();
    }
    m_target.replace(nonBreakingSpace, ' ');
    m_isCaseSensitive = isCaseSensitive;

    m_buffer = static_cast<QChar *>(malloc(s.length() * sizeof(QChar)));
    m_cursor = m_buffer;
    m_bufferFull = false;
}

void CircularSearchBuffer::append(const QChar &c)
{
    if (m_isCaseSensitive) {
        *m_cursor++ = c.unicode() == nonBreakingSpace ? ' ' : c.unicode();
    } else {
        *m_cursor++ = c.unicode() == nonBreakingSpace ? ' ' : c.lower().unicode();
    }
    if (m_cursor == m_buffer + length()) {
        m_cursor = m_buffer;
        m_bufferFull = true;
    }
}

// This function can only be used when the buffer is not yet full,
// and when then count is small enough to fit in the buffer.
// No need for a more general version for the search algorithm.
void CircularSearchBuffer::append(long count, const QChar *characters)
{
    long tailSpace = m_buffer + length() - m_cursor;

    assert(!m_bufferFull);
    assert(count <= tailSpace);

    if (m_isCaseSensitive) {
        for (long i = 0; i != count; ++i) {
            QChar c = characters[i];
            m_cursor[i] = c.unicode() == nonBreakingSpace ? ' ' : c.unicode();
        }
    } else {
        for (long i = 0; i != count; ++i) {
            QChar c = characters[i];
            m_cursor[i] = c.unicode() == nonBreakingSpace ? ' ' : c.lower().unicode();
        }
    }
    if (count < tailSpace) {
        m_cursor += count;
    } else {
        m_bufferFull = true;
        m_cursor = m_buffer;
    }
}

long CircularSearchBuffer::neededCharacters() const
{
    return m_bufferFull ? 0 : m_buffer + length() - m_cursor;
}

bool CircularSearchBuffer::isMatch() const
{
    assert(m_bufferFull);

    long headSpace = m_cursor - m_buffer;
    long tailSpace = length() - headSpace;
    return memcmp(m_cursor, m_target.unicode(), tailSpace * sizeof(QChar)) == 0
        && memcmp(m_buffer, m_target.unicode() + tailSpace, headSpace * sizeof(QChar)) == 0;
}

long TextIterator::rangeLength(const Range &r)
{
    // Allocate string at the right size, rather than building it up by successive append calls.
    long length = 0;
    for (TextIterator it(r); !it.atEnd(); it.advance()) {
        length += it.length();
    }
    return length;
}

void TextIterator::setRangeFromLocationAndLength (const Range &range, Range &resultRange, long rangeLocation, long rangeLength)
{
    long docTextPosition = 0;
    long rangeEnd = rangeLocation + rangeLength;

    for (TextIterator it(range); !it.atEnd(); it.advance()) {
        long len = it.length();
        if (rangeLocation >= docTextPosition && rangeLocation <= docTextPosition + len) {
            Range textRunRange = it.range();
            if (textRunRange.startContainer().handle()->isTextNode()) {
                long offset = rangeLocation - docTextPosition;
                resultRange.setStart(textRunRange.startContainer(), offset + textRunRange.startOffset());
            } else {
                if (rangeLocation == docTextPosition) {
                    resultRange.setStart(textRunRange.startContainer(), textRunRange.startOffset());
                } else {
                    resultRange.setStart(textRunRange.endContainer(), textRunRange.endOffset());
                }
            }
        }
        if (rangeEnd >= docTextPosition && rangeEnd <= docTextPosition + len) {
            Range textRunRange = it.range();
            if (textRunRange.startContainer().handle()->isTextNode()) {
                long offset = rangeEnd - docTextPosition;
                resultRange.setEnd(textRunRange.startContainer(), offset + textRunRange.startOffset());
            } else {
                if (rangeEnd == docTextPosition) {
                    resultRange.setEnd(textRunRange.startContainer(), textRunRange.startOffset());
                } else {
                    resultRange.setEnd(textRunRange.endContainer(), textRunRange.endOffset());
                }
            }
            if ( !(rangeLength == 0 && rangeEnd == docTextPosition + len) ) {
                break;
            }
        }
        docTextPosition += it.length();
    }
}

QString plainText(const Range &r)
{
    // Allocate string at the right size, rather than building it up by successive append calls.
    long length = 0;
    for (TextIterator it(r); !it.atEnd(); it.advance()) {
        length += it.length();
    }
    QString result("");
    result.reserve(length);
    for (TextIterator it(r); !it.atEnd(); it.advance()) {
        result.append(it.characters(), it.length());
    }
    return result;
}

Range findPlainText(const Range &r, const QString &s, bool forward, bool caseSensitive)
{
    // FIXME: Can we do Boyer-Moore or equivalent instead for speed?

    // FIXME: This code does not allow \n at the moment because of issues with <br>.
    // Once we fix those, we can remove this check.
    if (s.isEmpty() || s.find('\n') != -1) {
        Range result = r;
        result.collapse(forward);
        return result;
    }

    CircularSearchBuffer buffer(s, caseSensitive);

    bool found = false;
    CharacterIterator rangeEnd;

    {
        CharacterIterator it(r);
        while (1) {
            // Fill the buffer.
            while (long needed = buffer.neededCharacters()) {
                if (it.atBreak()) {
                    if (it.atEnd()) {
                        goto done;
                    }
                    buffer.clear();
                }
                long available = it.length();
                long runLength = kMin(needed, available);
                buffer.append(runLength, it.characters());
                it.advance(runLength);
            }

            // Do the search.
            while (1) {
                if (buffer.isMatch()) {
                    // Compute the range for the result.
                    found = true;
                    rangeEnd = it;
                    // If searching forward, stop on the first match.
                    // If searching backward, don't stop, so we end up with the last match.
                    if (forward) {
                        goto done;
                    }
                }
                if (it.atBreak())
                    break;
                buffer.append(it.characters()[0]);
                it.advance(1);
            }
            buffer.clear();
        }
    }

done:
    Range result = r;
    if (!found) {
        result.collapse(!forward);
    } else {
        CharacterIterator it(r);
        it.advance(rangeEnd.characterOffset() - buffer.length());
        result.setStart(it.range().startContainer(), it.range().startOffset());
        it.advance(buffer.length() - 1);
        result.setEnd(it.range().endContainer(), it.range().endOffset());
    }
    return result;
}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产一区二区| 337p粉嫩大胆色噜噜噜噜亚洲 | 欧美狂野另类xxxxoooo| 亚洲一区二区免费视频| 欧美三区免费完整视频在线观看| 一区二区三区免费| 欧美高清视频一二三区| 极品瑜伽女神91| 国产欧美一区二区精品婷婷| 99久久久精品免费观看国产蜜| 亚洲激情六月丁香| 欧美丰满少妇xxxxx高潮对白| 另类小说图片综合网| 亚洲国产精品成人综合色在线婷婷 | 视频一区中文字幕国产| 精品国产sm最大网站免费看| 成人福利在线看| 亚洲成av人片在线观看无码| 久久综合资源网| 色欧美日韩亚洲| 麻豆久久久久久| 中文字幕一区免费在线观看| 精品视频1区2区3区| 国产麻豆成人精品| 亚洲尤物在线视频观看| 精品国精品国产| av亚洲精华国产精华精华| 五月婷婷欧美视频| 国产亲近乱来精品视频| 欧美剧在线免费观看网站 | 精品盗摄一区二区三区| 91网站最新地址| 日本午夜一区二区| 亚洲日本青草视频在线怡红院| 欧美精品视频www在线观看| 国产91精品入口| 婷婷国产v国产偷v亚洲高清| 国产色综合一区| 欧美日韩久久一区二区| 成人午夜电影小说| 欧美aaaaaa午夜精品| 亚洲免费电影在线| 久久综合九色综合欧美98| 91福利视频在线| 国产成人亚洲精品青草天美| 亚洲成人av在线电影| 国产精品久久看| 精品国产一区二区在线观看| 欧美午夜一区二区三区 | 美女在线视频一区| 一区二区三区国产| 国产精品电影院| 久久婷婷成人综合色| 欧美日韩久久一区| 91农村精品一区二区在线| 国产一区二区三区国产| 天天做天天摸天天爽国产一区| 亚洲美女电影在线| 国产精品―色哟哟| 久久影院午夜片一区| 精品乱人伦一区二区三区| 欧美一区欧美二区| 91精品国产综合久久福利| 欧美日韩国产影片| 欧美这里有精品| 日本黄色一区二区| 91视频免费播放| 不卡的av在线播放| 成人av网址在线| 9色porny自拍视频一区二区| 国产成人久久精品77777最新版本| 激情综合网激情| 青草av.久久免费一区| 免费观看在线综合| 久热成人在线视频| 久久99久久精品| 国产在线播放一区三区四| 狠狠色丁香九九婷婷综合五月| 免费人成黄页网站在线一区二区 | 久久99久久久久| 精品在线播放免费| 精品一区二区在线观看| 国产原创一区二区| 成人免费看视频| 99久久99久久综合| 在线视频国内自拍亚洲视频| 欧美羞羞免费网站| 91麻豆精品国产综合久久久久久 | 一区二区高清免费观看影视大全| 一区二区三区在线免费观看| 亚洲一区影音先锋| 天堂资源在线中文精品| 日韩成人一级片| 激情五月播播久久久精品| 国产大陆亚洲精品国产| www.久久精品| 在线视频一区二区三| 欧美一区二区三区不卡| 精品久久久三级丝袜| 国产亚洲短视频| 亚洲福中文字幕伊人影院| 日本中文字幕一区二区视频| 国产精品综合二区| 99久久99久久精品国产片果冻| 欧美亚洲动漫精品| 日韩精品中午字幕| 国产精品久久久久aaaa| 一区二区在线免费观看| 美女一区二区在线观看| 成人一道本在线| 色婷婷av一区二区三区gif| 69精品人人人人| 26uuu欧美| 亚洲欧美日韩小说| 久久国产视频网| 91亚洲精品久久久蜜桃网站| 日韩一区二区视频在线观看| 国产精品色在线| 蜜臀久久久久久久| 成人av网站免费| 日韩午夜激情免费电影| 中文字幕在线播放不卡一区| 天天影视网天天综合色在线播放| 国产精品一区二区x88av| 欧美综合色免费| 国产丝袜美腿一区二区三区| 婷婷综合另类小说色区| 国产成人精品一区二区三区四区 | 狠狠色综合播放一区二区| 91国偷自产一区二区三区成为亚洲经典 | 韩国欧美一区二区| 欧美日韩一区成人| 国产精品久久久久四虎| 国内精品伊人久久久久av一坑 | 亚洲人被黑人高潮完整版| 久久国产精品免费| 欧美日韩高清一区二区| 中文字幕第一区综合| 精品影视av免费| 337p亚洲精品色噜噜| 夜夜精品浪潮av一区二区三区| 国产久卡久卡久卡久卡视频精品| 欧美精品 日韩| 亚洲最快最全在线视频| 成人毛片在线观看| 久久精品在这里| 日本大胆欧美人术艺术动态| 欧美性视频一区二区三区| 中日韩av电影| 国产大片一区二区| 精品国产一区二区亚洲人成毛片| 视频一区二区中文字幕| 91福利资源站| 一级女性全黄久久生活片免费| 成人18视频日本| 国产日韩精品久久久| 狠狠狠色丁香婷婷综合久久五月| 欧美一区二区三区四区视频| 亚洲国产成人tv| 欧美日韩免费一区二区三区视频| 一区二区免费在线| 色8久久精品久久久久久蜜| 亚洲视频 欧洲视频| 成人午夜电影久久影院| 国产精品视频一二| 成人深夜视频在线观看| 欧美国产精品一区| 成人在线一区二区三区| 国产精品青草综合久久久久99| 国产成人精品一区二区三区四区 | 国产精品久久久久影院老司| 成人性视频免费网站| 国产精品久久久久影院亚瑟| av在线不卡免费看| 亚洲摸摸操操av| 欧美日韩精品一区二区天天拍小说| 亚洲成av人片一区二区三区| 制服丝袜亚洲精品中文字幕| 蜜桃av噜噜一区| 国产日韩av一区二区| 91丨九色丨蝌蚪丨老版| 一区二区日韩av| 日韩免费看网站| 国产suv精品一区二区883| 亚洲国产精品ⅴa在线观看| 99re热这里只有精品免费视频| 亚洲视频 欧洲视频| 欧美日韩高清一区二区| 蜜桃av一区二区在线观看| 久久伊99综合婷婷久久伊| 国产福利不卡视频| 亚洲视频一区在线| 欧美精品久久天天躁| 精品一区二区三区日韩| 亚洲人妖av一区二区| 欧美美女喷水视频| 国产精品综合av一区二区国产馆| 亚洲男人都懂的| 欧美电影免费观看高清完整版在线| 成人福利视频在线看|