[poppler] qt4/src qt4/tests qt5/src qt5/tests
Albert Astals Cid
aacid at kde.org
Wed Jan 21 13:30:35 PST 2015
El Dimarts, 20 de gener de 2015, a les 19:37:34, Adam Reichold va escriure:
> Hello,
>
> I just noticed that there is a typo as my megalomania made me type
> "WholeWorlds" instead of "WholeWords" everywhere... :-\
pushed.
Albert
>
> Best regards, Adam.
>
> Am 20.01.2015 um 00:09 schrieb Albert Astals Cid:
> > qt4/src/poppler-page-private.h | 5 +
> > qt4/src/poppler-page.cc | 114
> > +++++++++++++++++++++++++------------
> > qt4/src/poppler-qt4.h | 44 +++++++++++++-
> > qt4/tests/check_search.cpp | 112
> > +++++++++++++++++++++++++++++++-----
> > qt5/src/poppler-page-private.h | 5 +
> > qt5/src/poppler-page.cc | 116
> > +++++++++++++++++++++++++------------
> > qt5/src/poppler-qt5.h | 46 +++++++++++++-
> > qt5/tests/check_search.cpp | 126
> > ++++++++++++++++++++++++++++++++--------- 8 files changed, 447
> > insertions(+), 121 deletions(-)
> >
> > New commits:
> > commit 027eac4e565576ca2e7042e21426e28abd775d98
> > Author: Adam Reichold <adamreichold at myopera.com>
> > Date: Tue Jan 20 00:09:09 2015 +0100
> >
> > Expose whole-words search option in Qt frontends
> >
> > diff --git a/qt4/src/poppler-page-private.h
> > b/qt4/src/poppler-page-private.h index 91955e0..1cb63e9 100644
> > --- a/qt4/src/poppler-page-private.h
> > +++ b/qt4/src/poppler-page-private.h
> > @@ -2,6 +2,7 @@
> >
> > * Copyright (C) 2005, Net Integration Technologies, Inc.
> > * Copyright (C) 2007, 2012, Albert Astals Cid <aacid at kde.org>
> > * Copyright (C) 2008, Pino Toscano <pino at kde.org>
> >
> > + * Copyright (C) 2015 Adam Reichold <adamreichold at myopera.com>
> >
> > *
> > * This program is free software; you can redistribute it and/or modify
> > * it under the terms of the GNU General Public License as published by
> >
> > @@ -46,7 +47,9 @@ public:
> > static Link* convertLinkActionToLink(::LinkAction * a, DocumentData
> > *parentDoc, const QRectF &linkArea);>
> > - TextPage *prepareTextSearch(const QString &text, Page::SearchMode
> > caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u);
> > + TextPage *prepareTextSearch(const QString &text, Page::Rotation
> > rotate, QVector<Unicode> *u); + GBool performSingleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, double &sLeft, double &sTop, double
> > &sRight, double &sBottom, Page::SearchDirection direction, GBool sCase,
> > GBool sWords); + QList<QRectF> performMultipleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, GBool sCase, GBool sWords);>
> > };
> >
> > }
> >
> > diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
> > index 9c99cda..a4536af 100644
> > --- a/qt4/src/poppler-page.cc
> > +++ b/qt4/src/poppler-page.cc
> > @@ -12,7 +12,7 @@
> >
> > * Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
> > * Copyright (C) 2012 Tobias Koenig <tokoe at kdab.com>
> > * Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
> >
> > - * Copyright (C) 2012 Adam Reichold <adamreichold at myopera.com>
> > + * Copyright (C) 2012, 2015 Adam Reichold <adamreichold at myopera.com>
> >
> > * Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
> > * Copyright (C) 2015 William Bader <williambader at hotmail.com>
> > *
> >
> > @@ -216,16 +216,13 @@ Link* PageData::convertLinkActionToLink(::LinkAction
> > * a, DocumentData *parentDo>
> > return popplerLink;
> >
> > }
> >
> > -TextPage *PageData::prepareTextSearch(const QString &text,
> > Page::SearchMode caseSensitive, Page::Rotation rotate, GBool *sCase,
> > QVector<Unicode> *u) +inline TextPage *PageData::prepareTextSearch(const
> > QString &text, Page::Rotation rotate, QVector<Unicode> *u)>
> > {
> >
> > const QChar * str = text.unicode();
> > const int len = text.length();
> > u->resize(len);
> > for (int i = 0; i < len; ++i) (*u)[i] = str[i].unicode();
> >
> > - if (caseSensitive == Page::CaseSensitive) *sCase = gTrue;
> > - else *sCase = gFalse;
> > -
> >
> > const int rotation = (int)rotate * 90;
> >
> > // fetch ourselves a textpage
> >
> > @@ -235,7 +232,43 @@ TextPage *PageData::prepareTextSearch(const QString
> > &text, Page::SearchMode case>
> > TextPage *textPage=td.takeText();
> >
> > return textPage;
> >
> > -}
> > +}
> > +
> > +inline GBool PageData::performSingleTextSearch(TextPage* textPage,
> > QVector<Unicode> &u, double &sLeft, double &sTop, double &sRight, double
> > &sBottom, Page::SearchDirection direction, GBool sCase, GBool sWords) +{
> > + if (direction == Page::FromTop)
> > + return textPage->findText( u.data(), u.size(),
> > + gTrue, gTrue, gFalse, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); + else if ( direction == Page::NextResult )
> > + return textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); + else if ( direction ==
> > Page::PreviousResult )
> > + return textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gTrue, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); +
> > + return gFalse;
> > +}
> > +
> > +inline QList<QRectF> PageData::performMultipleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, GBool sCase, GBool sWords) +{
> > + QList<QRectF> results;
> > + double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> > +
> > + while(textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom )) + {
> > + QRectF result;
> > +
> > + result.setLeft(sLeft);
> > + result.setTop(sTop);
> > + result.setRight(sRight);
> > + result.setBottom(sBottom);
> > +
> > + results.append(result);
> > + }
> > +
> > + return results;
> > +}
> >
> > Page::Page(DocumentData *doc, int index) {
> >
> > m_page = new PageData();
> >
> > @@ -460,20 +493,27 @@ QString Page::text(const QRectF &r) const
> >
> > bool Page::search(const QString &text, double &sLeft, double &sTop,
> > double &sRight, double &sBottom, SearchDirection direction, SearchMode
> > caseSensitive, Rotation rotate) const {
> >
> > - GBool sCase;
> > + const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue :
> > gFalse; +
> >
> > QVector<Unicode> u;
> >
> > - TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive,
> > rotate, &sCase, &u); -
> > - bool found = false;
> > - if (direction == FromTop)
> > - found = textPage->findText( u.data(), u.size(),
> > - gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); - else if ( direction == NextResult )
> > - found = textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); - else if ( direction == PreviousResult )
> > - found = textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); + TextPage *textPage =
> > m_page->prepareTextSearch(text, rotate, &u); +
> > + const bool found = m_page->performSingleTextSearch(textPage, u, sLeft,
> > sTop, sRight, sBottom, direction, sCase, gFalse); +
> > + textPage->decRefCnt();
> > +
> > + return found;
> > +}
> > +
> > +bool Page::search(const QString &text, double &sLeft, double &sTop,
> > double &sRight, double &sBottom, SearchDirection direction, SearchFlags
> > flags, Rotation rotate) const +{
> > + const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> > + const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> > +
> > + QVector<Unicode> u;
> > + TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> > +
> > + const bool found = m_page->performSingleTextSearch(textPage, u, sLeft,
> > sTop, sRight, sBottom, direction, sCase, sWords);>
> > textPage->decRefCnt();
> >
> > @@ -500,31 +540,33 @@ bool Page::search(const QString &text, QRectF &rect,
> > SearchDirection direction,>
> > QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate) const {
> >
> > - GBool sCase;
> > + const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue :
> > gFalse; +
> >
> > QVector<Unicode> u;
> >
> > - TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive,
> > rotate, &sCase, &u); + TextPage *textPage =
> > m_page->prepareTextSearch(text, rotate, &u);
> >
> > - QList<QRectF> results;
> > - double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> > -
> > - while(textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom )) - {
> > - QRectF result;
> > -
> > - result.setLeft(sLeft);
> > - result.setTop(sTop);
> > - result.setRight(sRight);
> > - result.setBottom(sBottom);
> > -
> > - results.append(result);
> > - }
> > + const QList<QRectF> results =
> > m_page->performMultipleTextSearch(textPage, u, sCase, gFalse);>
> > textPage->decRefCnt();
> >
> > return results;
> >
> > }
> >
> > +QList<QRectF> Page::search(const QString &text, SearchFlags flags,
> > Rotation rotate) const +{
> > + const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> > + const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> > +
> > + QVector<Unicode> u;
> > + TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> > +
> > + const QList<QRectF> results =
> > m_page->performMultipleTextSearch(textPage, u, sCase, sWords); +
> > + textPage->decRefCnt();
> > +
> > + return results;
> > +}
> > +
> >
> > QList<TextBox*> Page::textList(Rotation rotate) const
> > {
> >
> > TextOutputDev *output_dev;
> >
> > diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
> > index ee7558e..48c517a 100644
> > --- a/qt4/src/poppler-qt4.h
> > +++ b/qt4/src/poppler-qt4.h
> > @@ -12,7 +12,7 @@
> >
> > * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral at kde.org>
> > * Copyright (C) 2012, Fabio D'Urso <fabiodurso at hotmail.it>
> > * Copyright (C) 2012, Tobias Koenig <tobias.koenig at kdab.com>
> >
> > - * Copyright (C) 2012, 2014 Adam Reichold <adamreichold at myopera.com>
> > + * Copyright (C) 2012, 2014, 2015 Adam Reichold
> > <adamreichold at myopera.com>
> >
> > * Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
> > *
> > * This program is free software; you can redistribute it and/or modify
> >
> > @@ -579,6 +579,16 @@ delete it;
> >
> > enum SearchMode { CaseSensitive, ///< Case differences cause no
match
> > in searching>
> > CaseInsensitive ///< Case differences are ignored in
matching
> >
> > };
> >
> > +
> > + /**
> > + Flags to modify the search behaviour \since 0.31
> > + */
> > + enum SearchFlag
> > + {
> > + IgnoreCase = 0x00000001, ///< Case differences are ignored
> > + WholeWorlds = 0x00000002 ///< Only whole words are matched
> > + };
> > + Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
> >
> > /**
> >
> > Returns true if the specified text was found.
> >
> > @@ -603,7 +613,21 @@ delete it;
> >
> > \param rotate the rotation to apply for the search order
> > \since 0.14
> >
> > **/
> >
> > - bool search(const QString &text, double &rectLeft, double &rectTop,
> > double &rectRight, double &rectBottom, SearchDirection direction,
> > SearchMode caseSensitive, Rotation rotate = Rotate0) const; +
> > Q_DECL_DEPRECATED bool search(const QString &text, double &rectLeft,
> > double &rectTop, double &rectRight, double &rectBottom, SearchDirection
> > direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const; +
> > + /**
> > + Returns true if the specified text was found.
> > +
> > + \param text the text the search
> > + \param rectXXX in all directions is used to return where the
> > text was found, for NextResult and PreviousResult +
> > indicates where to continue searching for
> > + \param direction in which direction do the search
> > + \param flags the flags to consider during matching
> > + \param rotate the rotation to apply for the search order
> > +
> > + \since 0.31
> > + **/
> > + bool search(const QString &text, double &rectLeft, double
> > &rectTop, double &rectRight, double &rectBottom, SearchDirection
> > direction, SearchFlags flags = 0, Rotation rotate = Rotate0) const;>
> > /**
> >
> > Returns a list of all occurrences of the specified text on the
page.
> >
> > @@ -616,7 +640,20 @@ delete it;
> >
> > \since 0.22
> >
> > **/
> >
> > - QList<QRectF> search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate = Rotate0) const; + Q_DECL_DEPRECATED
> > QList<QRectF> search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate = Rotate0) const; +
> > + /**
> > + Returns a list of all occurrences of the specified text on the
> > page. +
> > + \param text the text to search
> > + \param flags the flags to consider during matching
> > + \param rotate the rotation to apply for the search order
> > +
> > + \warning Do not use the returned QRectF as arguments of
> > another search call because of truncation issues if qreal is defined as
> > float. +
> > + \since 0.31
> > + **/
> > + QList<QRectF> search(const QString &text, SearchFlags flags = 0,
> > Rotation rotate = Rotate0) const;>
> > /**
> >
> > Returns a list of text of the page
> >
> > @@ -1826,6 +1863,7 @@ height = dummy.height();
> >
> > }
> >
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags)
> >
> > +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::SearchFlags)
> >
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints)
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions)
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions)
> >
> > diff --git a/qt4/tests/check_search.cpp b/qt4/tests/check_search.cpp
> > index cabf82d..77e62e3 100644
> > --- a/qt4/tests/check_search.cpp
> > +++ b/qt4/tests/check_search.cpp
> > @@ -8,17 +8,18 @@ class TestSearch: public QObject
> >
> > private slots:
> > void bug7063();
> > void testNextAndPrevious();
> >
> > + void testWholeWordsOnly();
> >
> > };
> >
> > void TestSearch::bug7063()
> > {
> >
> > - Poppler::Document *doc;
> > - doc = Poppler::Document::load(TESTDATADIR
> > "/unittestcases/bug7063.pdf"); - QVERIFY( doc );
> > -
> > - Poppler::Page *page = doc->page(0);
> > - QRectF pageRegion( QPointF(0,0), page->pageSize() );
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR
> > "/unittestcases/bug7063.pdf")); + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> >
> > + QRectF pageRegion( QPointF(0,0), page->pageSize() );
> >
> > QCOMPARE( page->search(QString("non-ascii:"), pageRegion,
> > Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
> >
> > QCOMPARE( page->search(QString("Ascii"), pageRegion,
> > Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );>
> > @@ -32,17 +33,32 @@ void TestSearch::bug7063()
> >
> > QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or
> > \"ç\""), pageRegion, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), true ); QCOMPARE(
> > page->search(QString::fromUtf8("¥µ©"), pageRegion,
> > Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
> > QCOMPARE( page->search(QString::fromUtf8("¥©"), pageRegion,
> > Poppler::Page::FromTop, Poppler::Page::CaseSensitive), false );>
> > -
> > - delete doc;
> > +
> > + double rectLeft = 0.0, rectTop = 0.0, rectRight =
> > page->pageSizeF().width(), rectBottom = page->pageSizeF().height(); +
> > + QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), true ); +
> > + QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false ); + QCOMPARE(
> > page->search(QString("Ascii"), rectLeft, rectTop, rectRight, rectBottom,
> > Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true ); +
> > + QCOMPARE( page->search(QString("latin1:"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false ); +
> > + QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("Ã "), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("ç"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("search \"é\", \"à \" or \"ç\""),
> > rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true
> > ); + QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft,
> > rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); +
> > QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false );>
> > }
> >
> > void TestSearch::testNextAndPrevious()
> > {
> >
> > - Poppler::Document *doc;
> > - doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
> > - QVERIFY( doc );
> > -
> > - Poppler::Page *page = doc->page(0);
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"));
> > + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> > +
> >
> > QRectF region( QPointF(0,0), page->pageSize() );
> >
> > QCOMPARE( page->search(QString("is"), region, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), true );>
> > @@ -83,7 +99,75 @@ void TestSearch::testNextAndPrevious()
> >
> > QVERIFY( qAbs(region.height() - 8.85) < 0.01 );
> > QCOMPARE( page->search(QString("is"), region,
> > Poppler::Page::PreviousResult, Poppler::Page::CaseSensitive), false
> > );>
> > - delete doc;
> > + double rectLeft = 0.0, rectTop = 0.0, rectRight =
> > page->pageSizeF().width(), rectBottom = page->pageSizeF().height(); +
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QVERIFY( qAbs(rectLeft
> > - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), false ); + QCOMPARE(
> > page->search(QString("is"), rectLeft, rectTop, rectRight, rectBottom,
> > Poppler::Page::PreviousResult), true ); + QVERIFY( qAbs(rectLeft -
> > 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), true ); + QVERIFY(
> > qAbs(rectLeft - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), false ); +}
> > +
> > +void TestSearch::testWholeWordsOnly()
> > +{
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR
> > "/unittestcases/WithActualText.pdf")); + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> > +
> > + const Poppler::Page::SearchDirection direction =
> > Poppler::Page::FromTop; +
> > + const Poppler::Page::SearchFlags mode0 = 0;
> > + const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
> > + const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
> > + const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase |
> > Poppler::Page::WholeWorlds; +
> > + double left, top, right, bottom;
> > +
> > + QCOMPARE( page->search(QLatin1String("brown"), left, top, right,
> > bottom, direction, mode0), true ); + QCOMPARE(
> > page->search(QLatin1String("brOwn"), left, top, right, bottom, direction,
> > mode0), false ); +
> > + QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right,
> > bottom, direction, mode1), true ); + QCOMPARE(
> > page->search(QLatin1String("brawn"), left, top, right, bottom, direction,
> > mode1), false ); +
> > + QCOMPARE( page->search(QLatin1String("brown"), left, top, right,
> > bottom, direction, mode2), true ); + QCOMPARE(
> > page->search(QLatin1String("own"), left, top, right, bottom, direction,
> > mode2), false ); +
> > + QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right,
> > bottom, direction, mode3), true ); + QCOMPARE(
> > page->search(QLatin1String("Own"), left, top, right, bottom, direction,
> > mode3), false );>
> > }
> >
> > QTEST_MAIN(TestSearch)
> >
> > diff --git a/qt5/src/poppler-page-private.h
> > b/qt5/src/poppler-page-private.h index 91955e0..1cb63e9 100644
> > --- a/qt5/src/poppler-page-private.h
> > +++ b/qt5/src/poppler-page-private.h
> > @@ -2,6 +2,7 @@
> >
> > * Copyright (C) 2005, Net Integration Technologies, Inc.
> > * Copyright (C) 2007, 2012, Albert Astals Cid <aacid at kde.org>
> > * Copyright (C) 2008, Pino Toscano <pino at kde.org>
> >
> > + * Copyright (C) 2015 Adam Reichold <adamreichold at myopera.com>
> >
> > *
> > * This program is free software; you can redistribute it and/or modify
> > * it under the terms of the GNU General Public License as published by
> >
> > @@ -46,7 +47,9 @@ public:
> > static Link* convertLinkActionToLink(::LinkAction * a, DocumentData
> > *parentDoc, const QRectF &linkArea);>
> > - TextPage *prepareTextSearch(const QString &text, Page::SearchMode
> > caseSensitive, Page::Rotation rotate, GBool *sCase, QVector<Unicode> *u);
> > + TextPage *prepareTextSearch(const QString &text, Page::Rotation
> > rotate, QVector<Unicode> *u); + GBool performSingleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, double &sLeft, double &sTop, double
> > &sRight, double &sBottom, Page::SearchDirection direction, GBool sCase,
> > GBool sWords); + QList<QRectF> performMultipleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, GBool sCase, GBool sWords);>
> > };
> >
> > }
> >
> > diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
> > index eec211e..88f2e73 100644
> > --- a/qt5/src/poppler-page.cc
> > +++ b/qt5/src/poppler-page.cc
> > @@ -12,7 +12,7 @@
> >
> > * Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
> > * Copyright (C) 2012 Tobias Koenig <tokoe at kdab.com>
> > * Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
> >
> > - * Copyright (C) 2012 Adam Reichold <adamreichold at myopera.com>
> > + * Copyright (C) 2012, 2015 Adam Reichold <adamreichold at myopera.com>
> >
> > * Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
> > * Copyright (C) 2015 William Bader <williambader at hotmail.com>
> > *
> >
> > @@ -216,16 +216,13 @@ Link* PageData::convertLinkActionToLink(::LinkAction
> > * a, DocumentData *parentDo>
> > return popplerLink;
> >
> > }
> >
> > -TextPage *PageData::prepareTextSearch(const QString &text,
> > Page::SearchMode caseSensitive, Page::Rotation rotate, GBool *sCase,
> > QVector<Unicode> *u) +inline TextPage *PageData::prepareTextSearch(const
> > QString &text, Page::Rotation rotate, QVector<Unicode> *u)>
> > {
> >
> > const QChar * str = text.unicode();
> > const int len = text.length();
> > u->resize(len);
> > for (int i = 0; i < len; ++i) (*u)[i] = str[i].unicode();
> >
> > - if (caseSensitive == Page::CaseSensitive) *sCase = gTrue;
> > - else *sCase = gFalse;
> > -
> >
> > const int rotation = (int)rotate * 90;
> >
> > // fetch ourselves a textpage
> >
> > @@ -233,9 +230,45 @@ TextPage *PageData::prepareTextSearch(const QString
> > &text, Page::SearchMode case>
> > parentDoc->doc->displayPage( &td, index + 1, 72, 72, rotation, false,
> > true, false,>
> > NULL, NULL, NULL, NULL, gTrue);
> >
> > TextPage *textPage=td.takeText();
> >
> > -
> > +
> >
> > return textPage;
> >
> > -}
> > +}
> > +
> > +inline GBool PageData::performSingleTextSearch(TextPage* textPage,
> > QVector<Unicode> &u, double &sLeft, double &sTop, double &sRight, double
> > &sBottom, Page::SearchDirection direction, GBool sCase, GBool sWords) +{
> > + if (direction == Page::FromTop)
> > + return textPage->findText( u.data(), u.size(),
> > + gTrue, gTrue, gFalse, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); + else if ( direction == Page::NextResult )
> > + return textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); + else if ( direction ==
> > Page::PreviousResult )
> > + return textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gTrue, sWords, &sLeft,
> > &sTop, &sRight, &sBottom ); +
> > + return gFalse;
> > +}
> > +
> > +inline QList<QRectF> PageData::performMultipleTextSearch(TextPage*
> > textPage, QVector<Unicode> &u, GBool sCase, GBool sWords) +{
> > + QList<QRectF> results;
> > + double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> > +
> > + while(textPage->findText( u.data(), u.size(),
> > + gFalse, gTrue, gTrue, gFalse, sCase, gFalse, sWords, &sLeft,
> > &sTop, &sRight, &sBottom )) + {
> > + QRectF result;
> > +
> > + result.setLeft(sLeft);
> > + result.setTop(sTop);
> > + result.setRight(sRight);
> > + result.setBottom(sBottom);
> > +
> > + results.append(result);
> > + }
> > +
> > + return results;
> > +}
> >
> > Page::Page(DocumentData *doc, int index) {
> >
> > m_page = new PageData();
> >
> > @@ -460,20 +493,27 @@ QString Page::text(const QRectF &r) const
> >
> > bool Page::search(const QString &text, double &sLeft, double &sTop,
> > double &sRight, double &sBottom, SearchDirection direction, SearchMode
> > caseSensitive, Rotation rotate) const {
> >
> > - GBool sCase;
> > + const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue :
> > gFalse; +
> >
> > QVector<Unicode> u;
> >
> > - TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive,
> > rotate, &sCase, &u); -
> > - bool found = false;
> > - if (direction == FromTop)
> > - found = textPage->findText( u.data(), u.size(),
> > - gTrue, gTrue, gFalse, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); - else if ( direction == NextResult )
> > - found = textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); - else if ( direction == PreviousResult )
> > - found = textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gTrue, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom ); + TextPage *textPage =
> > m_page->prepareTextSearch(text, rotate, &u); +
> > + const bool found = m_page->performSingleTextSearch(textPage, u, sLeft,
> > sTop, sRight, sBottom, direction, sCase, gFalse); +
> > + textPage->decRefCnt();
> > +
> > + return found;
> > +}
> > +
> > +bool Page::search(const QString &text, double &sLeft, double &sTop,
> > double &sRight, double &sBottom, SearchDirection direction, SearchFlags
> > flags, Rotation rotate) const +{
> > + const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> > + const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> > +
> > + QVector<Unicode> u;
> > + TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> > +
> > + const bool found = m_page->performSingleTextSearch(textPage, u, sLeft,
> > sTop, sRight, sBottom, direction, sCase, sWords);>
> > textPage->decRefCnt();
> >
> > @@ -482,31 +522,33 @@ bool Page::search(const QString &text, double
> > &sLeft, double &sTop, double &sRig>
> > QList<QRectF> Page::search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate) const {
> >
> > - GBool sCase;
> > + const GBool sCase = caseSensitive == Page::CaseSensitive ? gTrue :
> > gFalse; +
> >
> > QVector<Unicode> u;
> >
> > - TextPage *textPage = m_page->prepareTextSearch(text, caseSensitive,
> > rotate, &sCase, &u); + TextPage *textPage =
> > m_page->prepareTextSearch(text, rotate, &u);
> >
> > - QList<QRectF> results;
> > - double sLeft = 0.0, sTop = 0.0, sRight = 0.0, sBottom = 0.0;
> > -
> > - while(textPage->findText( u.data(), u.size(),
> > - gFalse, gTrue, gTrue, gFalse, sCase, gFalse, gFalse, &sLeft,
> > &sTop, &sRight, &sBottom )) - {
> > - QRectF result;
> > -
> > - result.setLeft(sLeft);
> > - result.setTop(sTop);
> > - result.setRight(sRight);
> > - result.setBottom(sBottom);
> > -
> > - results.append(result);
> > - }
> > + const QList<QRectF> results =
> > m_page->performMultipleTextSearch(textPage, u, sCase, gFalse);>
> > textPage->decRefCnt();
> >
> > return results;
> >
> > }
> >
> > +QList<QRectF> Page::search(const QString &text, SearchFlags flags,
> > Rotation rotate) const +{
> > + const GBool sCase = flags.testFlag(IgnoreCase) ? gFalse : gTrue;
> > + const GBool sWords = flags.testFlag(WholeWorlds) ? gTrue : gFalse;
> > +
> > + QVector<Unicode> u;
> > + TextPage *textPage = m_page->prepareTextSearch(text, rotate, &u);
> > +
> > + const QList<QRectF> results =
> > m_page->performMultipleTextSearch(textPage, u, sCase, sWords); +
> > + textPage->decRefCnt();
> > +
> > + return results;
> > +}
> > +
> >
> > QList<TextBox*> Page::textList(Rotation rotate) const
> > {
> >
> > TextOutputDev *output_dev;
> >
> > diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
> > index dee0b19..9ffecff 100644
> > --- a/qt5/src/poppler-qt5.h
> > +++ b/qt5/src/poppler-qt5.h
> > @@ -12,7 +12,7 @@
> >
> > * Copyright (C) 2012, Guillermo A. Amaral B. <gamaral at kde.org>
> > * Copyright (C) 2012, Fabio D'Urso <fabiodurso at hotmail.it>
> > * Copyright (C) 2012, Tobias Koenig <tobias.koenig at kdab.com>
> >
> > - * Copyright (C) 2012, 2014 Adam Reichold <adamreichold at myopera.com>
> > + * Copyright (C) 2012, 2014, 2015 Adam Reichold
> > <adamreichold at myopera.com>
> >
> > * Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
> > * Copyright (C) 2013 Anthony Granger <grangeranthony at gmail.com>
> > *
> >
> > @@ -580,6 +580,16 @@ delete it;
> >
> > enum SearchMode { CaseSensitive, ///< Case differences cause no
match
> > in searching>
> > CaseInsensitive ///< Case differences are ignored in
matching
> >
> > };
> >
> > +
> > + /**
> > + Flags to modify the search behaviour \since 0.31
> > + */
> > + enum SearchFlag
> > + {
> > + IgnoreCase = 0x00000001, ///< Case differences are ignored
> > + WholeWorlds = 0x00000002 ///< Only whole words are matched
> > + };
> > + Q_DECLARE_FLAGS( SearchFlags, SearchFlag )
> >
> > /**
> >
> > Returns true if the specified text was found.
> >
> > @@ -592,8 +602,22 @@ delete it;
> >
> > \param rotate the rotation to apply for the search order
> > \since 0.14
> >
> > **/
> >
> > - bool search(const QString &text, double &rectLeft, double &rectTop,
> > double &rectRight, double &rectBottom, SearchDirection direction,
> > SearchMode caseSensitive, Rotation rotate = Rotate0) const; -
> > + Q_DECL_DEPRECATED bool search(const QString &text, double
> > &rectLeft, double &rectTop, double &rectRight, double &rectBottom,
> > SearchDirection direction, SearchMode caseSensitive, Rotation rotate =
> > Rotate0) const; +
> > + /**
> > + Returns true if the specified text was found.
> > +
> > + \param text the text the search
> > + \param rectXXX in all directions is used to return where the
> > text was found, for NextResult and PreviousResult +
> > indicates where to continue searching for
> > + \param direction in which direction do the search
> > + \param flags the flags to consider during matching
> > + \param rotate the rotation to apply for the search order
> > +
> > + \since 0.31
> > + **/
> > + bool search(const QString &text, double &rectLeft, double
> > &rectTop, double &rectRight, double &rectBottom, SearchDirection
> > direction, SearchFlags flags = 0, Rotation rotate = Rotate0) const; +
> >
> > /**
> >
> > Returns a list of all occurrences of the specified text on the
page.
> >
> > @@ -605,7 +629,20 @@ delete it;
> >
> > \since 0.22
> >
> > **/
> >
> > - QList<QRectF> search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate = Rotate0) const; + Q_DECL_DEPRECATED
> > QList<QRectF> search(const QString &text, SearchMode caseSensitive,
> > Rotation rotate = Rotate0) const; +
> > + /**
> > + Returns a list of all occurrences of the specified text on the
> > page. +
> > + \param text the text to search
> > + \param flags the flags to consider during matching
> > + \param rotate the rotation to apply for the search order
> > +
> > + \warning Do not use the returned QRectF as arguments of
> > another search call because of truncation issues if qreal is defined as
> > float. +
> > + \since 0.31
> > + **/
> > + QList<QRectF> search(const QString &text, SearchFlags flags = 0,
> > Rotation rotate = Rotate0) const;>
> > /**
> >
> > Returns a list of text of the page
> >
> > @@ -1787,6 +1824,7 @@ height = dummy.height();
> >
> > }
> >
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags)
> >
> > +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::SearchFlags)
> >
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints)
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions)
> > Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions)
> >
> > diff --git a/qt5/tests/check_search.cpp b/qt5/tests/check_search.cpp
> > index efb5556..2f6f022 100644
> > --- a/qt5/tests/check_search.cpp
> > +++ b/qt5/tests/check_search.cpp
> > @@ -8,20 +8,19 @@ class TestSearch: public QObject
> >
> > private slots:
> > void bug7063();
> > void testNextAndPrevious();
> >
> > + void testWholeWordsOnly();
> >
> > };
> >
> > void TestSearch::bug7063()
> > {
> >
> > - Poppler::Document *doc;
> > - doc = Poppler::Document::load(TESTDATADIR
> > "/unittestcases/bug7063.pdf"); - QVERIFY( doc );
> > -
> > - Poppler::Page *page = doc->page(0);
> > - double rectLeft, rectTop, rectRight, rectBottom;
> > - rectLeft = 0;
> > - rectTop = 0;
> > - rectRight = page->pageSize().width();
> > - rectBottom = page->pageSize().height();
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR
> > "/unittestcases/bug7063.pdf")); + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> > +
> > + double rectLeft = 0.0, rectTop = 0.0, rectRight =
> > page->pageSizeF().width(), rectBottom = page->pageSizeF().height(); +
> >
> > QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), true );
> >
> > QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), false );>
> > @@ -35,23 +34,32 @@ void TestSearch::bug7063()
> >
> > QCOMPARE( page->search(QString::fromUtf8("search \"é\", \"à \" or
> > \"ç\""), rectLeft, rectTop, rectRight, rectBottom,
> > Poppler::Page::FromTop, Poppler::Page::CaseSensitive), true );
> > QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft,
> > rectTop, rectRight, rectBottom, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), true ); QCOMPARE(
> > page->search(QString::fromUtf8("¥©"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop,
> > Poppler::Page::CaseSensitive), false );>
> > -
> > - delete doc;
> > +
> > + QCOMPARE( page->search(QString("non-ascii:"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), true ); +
> > + QCOMPARE( page->search(QString("Ascii"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false ); + QCOMPARE(
> > page->search(QString("Ascii"), rectLeft, rectTop, rectRight, rectBottom,
> > Poppler::Page::FromTop, Poppler::Page::IgnoreCase), true ); +
> > + QCOMPARE( page->search(QString("latin1:"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false ); +
> > + QCOMPARE( page->search(QString::fromUtf8("é"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("Ã "), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("ç"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QCOMPARE(
> > page->search(QString::fromUtf8("search \"é\", \"à \" or \"ç\""),
> > rectLeft, rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true
> > ); + QCOMPARE( page->search(QString::fromUtf8("¥µ©"), rectLeft,
> > rectTop, rectRight, rectBottom, Poppler::Page::FromTop), true ); +
> > QCOMPARE( page->search(QString::fromUtf8("¥©"), rectLeft, rectTop,
> > rectRight, rectBottom, Poppler::Page::FromTop), false );>
> > }
> >
> > void TestSearch::testNextAndPrevious()
> > {
> >
> > - Poppler::Document *doc;
> > - doc = Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf");
> > - QVERIFY( doc );
> > -
> > - Poppler::Page *page = doc->page(0);
> > - double rectLeft, rectTop, rectRight, rectBottom;
> > - rectLeft = 0;
> > - rectTop = 0;
> > - rectRight = page->pageSize().width();
> > - rectBottom = page->pageSize().height();
> > -
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR "/unittestcases/xr01.pdf"));
> > + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> > +
> > + double rectLeft = 0.0, rectTop = 0.0, rectRight =
> > page->pageSizeF().width(), rectBottom = page->pageSizeF().height(); +
> >
> > QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop, Poppler::Page::CaseSensitive),
> > true ); QVERIFY( qAbs(rectLeft - 161.44) < 0.01 );
> > QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> >
> > @@ -89,8 +97,76 @@ void TestSearch::testNextAndPrevious()
> >
> > QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult,
> > Poppler::Page::CaseSensitive), false );>
> > -
> > - delete doc;
> > +
> > + rectLeft = 0.0, rectTop = 0.0, rectRight = page->pageSizeF().width(),
> > rectBottom = page->pageSizeF().height(); +
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::FromTop), true ); + QVERIFY( qAbs(rectLeft
> > - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::NextResult), false ); + QCOMPARE(
> > page->search(QString("is"), rectLeft, rectTop, rectRight, rectBottom,
> > Poppler::Page::PreviousResult), true ); + QVERIFY( qAbs(rectLeft -
> > 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 139.81) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), true ); + QVERIFY(
> > qAbs(rectLeft - 171.46) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), true ); + QVERIFY(
> > qAbs(rectLeft - 161.44) < 0.01 );
> > + QVERIFY( qAbs(rectTop - 127.85) < 0.01 );
> > + QVERIFY( qAbs(rectRight - rectLeft - 6.70) < 0.01 );
> > + QVERIFY( qAbs(rectBottom - rectTop - 8.85) < 0.01 );
> > + QCOMPARE( page->search(QString("is"), rectLeft, rectTop, rectRight,
> > rectBottom, Poppler::Page::PreviousResult), false ); +}
> > +
> > +void TestSearch::testWholeWordsOnly()
> > +{
> > + QScopedPointer< Poppler::Document >
> > document(Poppler::Document::load(TESTDATADIR
> > "/unittestcases/WithActualText.pdf")); + QVERIFY( document );
> > +
> > + QScopedPointer< Poppler::Page > page(document->page(0));
> > + QVERIFY( page );
> > +
> > + const Poppler::Page::SearchDirection direction =
> > Poppler::Page::FromTop; +
> > + const Poppler::Page::SearchFlags mode0 = 0;
> > + const Poppler::Page::SearchFlags mode1 = Poppler::Page::IgnoreCase;
> > + const Poppler::Page::SearchFlags mode2 = Poppler::Page::WholeWorlds;
> > + const Poppler::Page::SearchFlags mode3 = Poppler::Page::IgnoreCase |
> > Poppler::Page::WholeWorlds; +
> > + double left, top, right, bottom;
> > +
> > + QCOMPARE( page->search(QLatin1String("brown"), left, top, right,
> > bottom, direction, mode0), true ); + QCOMPARE(
> > page->search(QLatin1String("brOwn"), left, top, right, bottom, direction,
> > mode0), false ); +
> > + QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right,
> > bottom, direction, mode1), true ); + QCOMPARE(
> > page->search(QLatin1String("brawn"), left, top, right, bottom, direction,
> > mode1), false ); +
> > + QCOMPARE( page->search(QLatin1String("brown"), left, top, right,
> > bottom, direction, mode2), true ); + QCOMPARE(
> > page->search(QLatin1String("own"), left, top, right, bottom, direction,
> > mode2), false ); +
> > + QCOMPARE( page->search(QLatin1String("brOwn"), left, top, right,
> > bottom, direction, mode3), true ); + QCOMPARE(
> > page->search(QLatin1String("Own"), left, top, right, bottom, direction,
> > mode3), false );>
> > }
> >
> > QTEST_MAIN(TestSearch)
> >
> > _______________________________________________
> > poppler mailing list
> > poppler at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/poppler
More information about the poppler
mailing list