mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 15:24:05 +00:00
04bdf3aa36
This is just a refinement on how the word search is done in the dictionaries that don't actually ability to search words in. Previously they emitted dummy italicized suggestions, which were getting in the way. Now they don't emit anything, but mark the search as uncertain. Any uncertain searches don't mark the word input with the different color to indicate the search has failed.
132 lines
3.8 KiB
C++
132 lines
3.8 KiB
C++
/* This file is (c) 2008-2010 Konstantin Isakov <ikm@users.berlios.de>
|
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
|
|
|
#include "website.hh"
|
|
#include "wstring_qt.hh"
|
|
#include "utf8.hh"
|
|
#include <QUrl>
|
|
#include <QTextCodec>
|
|
|
|
namespace WebSite {
|
|
|
|
using namespace Dictionary;
|
|
|
|
namespace {
|
|
|
|
class WebSiteDictionary: public Dictionary::Class
|
|
{
|
|
string name;
|
|
QByteArray urlTemplate;
|
|
|
|
public:
|
|
|
|
WebSiteDictionary( string const & id, string const & name_,
|
|
QString const & urlTemplate_ ):
|
|
Dictionary::Class( id, vector< string >() ),
|
|
name( name_ ),
|
|
urlTemplate( QUrl( urlTemplate_ ).toEncoded() )
|
|
{
|
|
}
|
|
|
|
virtual string getName() throw()
|
|
{ return name; }
|
|
|
|
virtual map< Property, string > getProperties() throw()
|
|
{ return map< Property, string >(); }
|
|
|
|
virtual unsigned long getArticleCount() throw()
|
|
{ return 0; }
|
|
|
|
virtual unsigned long getWordCount() throw()
|
|
{ return 0; }
|
|
|
|
virtual QIcon getIcon() throw()
|
|
{ return QIcon(":/icons/internet.png"); }
|
|
|
|
virtual sptr< WordSearchRequest > prefixMatch( wstring const & word,
|
|
unsigned long ) throw( std::exception );
|
|
|
|
virtual sptr< DataRequest > getArticle( wstring const &,
|
|
vector< wstring > const & alts,
|
|
wstring const & context )
|
|
throw( std::exception );
|
|
};
|
|
|
|
sptr< WordSearchRequest > WebSiteDictionary::prefixMatch( wstring const & /*word*/,
|
|
unsigned long ) throw( std::exception )
|
|
{
|
|
sptr< WordSearchRequestInstant > sr = new WordSearchRequestInstant;
|
|
|
|
sr->setUncertain( true );
|
|
|
|
return sr;
|
|
}
|
|
|
|
sptr< DataRequest > WebSiteDictionary::getArticle( wstring const & str,
|
|
vector< wstring > const &,
|
|
wstring const & context )
|
|
throw( std::exception )
|
|
{
|
|
sptr< DataRequestInstant > dr = new DataRequestInstant( true );
|
|
|
|
QByteArray urlString;
|
|
|
|
// Context contains the right url to go to
|
|
if ( context.size() )
|
|
urlString = Utf8::encode( context ).c_str();
|
|
else
|
|
{
|
|
urlString = urlTemplate;
|
|
|
|
QString inputWord = gd::toQString( str );
|
|
|
|
urlString.replace( "%25GDWORD%25", inputWord.toUtf8().toPercentEncoding() );
|
|
urlString.replace( "%25GD1251%25", QTextCodec::codecForName( "Windows-1251" )->fromUnicode( inputWord ).toPercentEncoding() );
|
|
|
|
// Handle all ISO-8859 encodings
|
|
for( int x = 1; x <= 16; ++x )
|
|
{
|
|
urlString.replace( QString( "%25GDISO%1%25" ).arg( x ),
|
|
QTextCodec::codecForName( QString( "ISO 8859-%1" ).arg( x ).toAscii() )->fromUnicode( inputWord ).toPercentEncoding() );
|
|
|
|
if ( x == 10 )
|
|
x = 12; // Skip encodings 11..12, they don't exist
|
|
}
|
|
}
|
|
|
|
string result = "<div class=\"website_padding\"></div>";
|
|
|
|
result += string( "<iframe id=\"gdexpandframe-" ) + getId() +
|
|
"\" src=\"" + urlString.data() +
|
|
"\" scrolling=\"no\" marginwidth=\"0\" marginheight=\"0\" "
|
|
"frameborder=\"0\" vspace=\"0\" hspace=\"0\" "
|
|
"style=\"overflow:visible; width:100%; display:none;\">"
|
|
"</iframe>";
|
|
|
|
dr->getData().resize( result.size() );
|
|
|
|
memcpy( &( dr->getData().front() ), result.data(), result.size() );
|
|
|
|
return dr;
|
|
}
|
|
|
|
}
|
|
|
|
vector< sptr< Dictionary::Class > > makeDictionaries( Config::WebSites const & ws )
|
|
throw( std::exception )
|
|
{
|
|
vector< sptr< Dictionary::Class > > result;
|
|
|
|
for( unsigned x = 0; x < ws.size(); ++x )
|
|
{
|
|
if ( ws[ x ].enabled )
|
|
result.push_back( new WebSiteDictionary( ws[ x ].id.toUtf8().data(),
|
|
ws[ x ].name.toUtf8().data(),
|
|
ws[ x ].url ) );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
}
|