diff options
author | Martin Jones <martin.jones@nokia.com> | 2012-02-17 13:08:21 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-22 00:03:53 +0100 |
commit | f60588237b230923c6a27f60669fa0230138f1ca (patch) | |
tree | 7fa24633c22c7aa06dcb395fab499c8abb8f9b6a /src/declarative | |
parent | a73ad904c9a4ad188604de6c64a6c91cd514dc1b (diff) |
Implement String.localeCompare() using QString::localeAwareCompare()
v8's localeCompare() implementation is not locale aware, so we use
Qt's locale aware compare.
Change-Id: Ia9092b3d6754545bb797adac26080ac7a29dcd92
Reviewed-by: Glenn Watson <glenn.watson@nokia.com>
Diffstat (limited to 'src/declarative')
-rw-r--r-- | src/declarative/qml/qdeclarativelocale.cpp | 30 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativelocale_p.h | 4 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine.cpp | 1 |
3 files changed, 35 insertions, 0 deletions
diff --git a/src/declarative/qml/qdeclarativelocale.cpp b/src/declarative/qml/qdeclarativelocale.cpp index 8ec51b058c..39d0f6c378 100644 --- a/src/declarative/qml/qdeclarativelocale.cpp +++ b/src/declarative/qml/qdeclarativelocale.cpp @@ -834,6 +834,36 @@ v8::Handle<v8::Value> QDeclarativeLocale::locale(QV8Engine *v8engine, const QStr return v8Value; } +static const char *localeCompareFunction = + "(function(localeCompareFunc) { " + " var orig_localeCompare;" + " orig_localeCompare = String.prototype.localeCompare;" + " String.prototype.localeCompare = (function() {" + " var val = localeCompareFunc.apply(this, arguments);" + " if (val == undefined) val = orig_localeCompare.call(this);" + " return val;" + " })" + "})"; + +void QDeclarativeLocale::registerStringLocaleCompare(QV8Engine *engine) +{ + registerFunction(engine, localeCompareFunction, localeCompare); +} + +v8::Handle<v8::Value> QDeclarativeLocale::localeCompare(const v8::Arguments &args) +{ + if (args.Length() != 1 || (!args[0]->IsString() && !args[0]->IsStringObject())) + return v8::Undefined(); + + if (!args.This()->IsString() && !args.This()->IsStringObject()) + return v8::Undefined(); + + QString thisString = QJSConverter::toString(args.This()->ToString()); + QString thatString = QJSConverter::toString(args[0]->ToString()); + + return v8::Integer::New(QString::localeAwareCompare(thisString, thatString)); +} + /*! \enum QtQuick2::Locale::FormatType diff --git a/src/declarative/qml/qdeclarativelocale_p.h b/src/declarative/qml/qdeclarativelocale_p.h index 904e4e6b11..98370fbf8a 100644 --- a/src/declarative/qml/qdeclarativelocale_p.h +++ b/src/declarative/qml/qdeclarativelocale_p.h @@ -119,8 +119,12 @@ public: static v8::Handle<v8::Value> locale(QV8Engine *v8engine, const QString &lang); + static void registerStringLocaleCompare(QV8Engine *engine); + private: QDeclarativeLocale(); + + static v8::Handle<v8::Value> localeCompare(const v8::Arguments &args); }; diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 92cd336e1c..04589fe244 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -636,6 +636,7 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global) #undef STRING_ARG } + QDeclarativeLocale::registerStringLocaleCompare(this); QDeclarativeDateExtension::registerExtension(this); QDeclarativeNumberExtension::registerExtension(this); |