JSValue RegExpObject::matchGlobal(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { RegExp* regExp = this->regExp(); ASSERT(regExp->global()); VM* vm = &globalObject->vm(); setLastIndex(exec, 0); if (exec->hadException()) return jsUndefined(); String s = string->value(exec); RegExpConstructor* regExpConstructor = globalObject->regExpConstructor(); if (regExp->unicode()) { unsigned stringLength = s.length(); return collectMatches( *vm, exec, string, s, regExpConstructor, regExp, [&] (size_t end) -> size_t { return advanceStringUnicode(s, stringLength, end); }); } return collectMatches( *vm, exec, string, s, regExpConstructor, regExp, [&] (size_t end) -> size_t { return end + 1; }); }
JSValue RegExpObject::matchGlobal(ExecState* exec, JSGlobalObject* globalObject, JSString* string) { VM& vm = globalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); RegExp* regExp = this->regExp(); ASSERT(regExp->global()); setLastIndex(exec, 0); RETURN_IF_EXCEPTION(scope, { }); String s = string->value(exec); RegExpConstructor* regExpConstructor = globalObject->regExpConstructor(); if (regExp->unicode()) { unsigned stringLength = s.length(); scope.release(); return collectMatches( vm, exec, string, s, regExpConstructor, regExp, [&] (size_t end) -> size_t { return advanceStringUnicode(s, stringLength, end); }); } scope.release(); return collectMatches( vm, exec, string, s, regExpConstructor, regExp, [&] (size_t end) -> size_t { return end + 1; }); }
void PlasmaRunner::collectMatches(QList<Plasma::QueryMatch> &matches, const QString &query, const GeoDataFolder *folder) { const QString queryLower = query.toLower(); QVector<GeoDataFeature*>::const_iterator it = folder->constBegin(); QVector<GeoDataFeature*>::const_iterator end = folder->constEnd(); for (; it != end; ++it) { GeoDataFolder *folder = dynamic_cast<GeoDataFolder*>(*it); if ( folder ) { collectMatches(matches, query, folder); continue; } GeoDataPlacemark *placemark = dynamic_cast<GeoDataPlacemark*>( *it ); if ( placemark ) { // For short query strings only match exactly, to get a sane number of matches if (query.length() < minContainsMatchLength) { if ( placemark->name().toLower() != queryLower && ( placemark->descriptionIsCDATA() || // TODO: support also with CDATA placemark->description().toLower() != queryLower ) ) { continue; } } else { if ( ! placemark->name().toLower().contains(queryLower) && ( placemark->descriptionIsCDATA() || // TODO: support also with CDATA ! placemark->description().toLower().contains(queryLower) ) ) { continue; } } const GeoDataCoordinates coordinates = placemark->coordinate(); const qreal lon = coordinates.longitude(GeoDataCoordinates::Degree); const qreal lat = coordinates.latitude(GeoDataCoordinates::Degree); const QVariant coordinatesData = QVariantList() << QVariant(lon) << QVariant(lat) << QVariant(placemark->lookAt()->range()*METER2KM); Plasma::QueryMatch match(this); match.setIcon(QIcon::fromTheme(QStringLiteral("marble"))); match.setText(placemark->name()); match.setSubtext(i18n("Show in OpenStreetMap with Marble")); match.setData(coordinatesData); match.setId(placemark->name()+QString::number(lat)+QString::number(lon)); match.setRelevance(1.0); match.setType(Plasma::QueryMatch::ExactMatch); matches << match; } } }
void PlasmaRunner::match(Plasma::RunnerContext &context) { QList<Plasma::QueryMatch> matches; const QString query = context.query(); bool success = false; // TODO: how to estimate that input is in Degree, not Radian? GeoDataCoordinates coordinates = GeoDataCoordinates::fromString(query, success); if (success) { const QVariant coordinatesData = QVariantList() << QVariant(coordinates.longitude(GeoDataCoordinates::Degree)) << QVariant(coordinates.latitude(GeoDataCoordinates::Degree)) << QVariant(0.1); // TODO: make this distance value configurable Plasma::QueryMatch match(this); match.setIcon(QIcon::fromTheme(QStringLiteral("marble"))); match.setText(i18n("Show the coordinates %1 in OpenStreetMap with Marble", query)); match.setData(coordinatesData); match.setId(query); match.setRelevance(1.0); match.setType(Plasma::QueryMatch::ExactMatch); matches << match; } // TODO: BookmarkManager does not yet listen to updates, also does not sync between processes :( // So for now always load on demand, even if expensive possibly BookmarkManager bookmarkManager(new GeoDataTreeModel); bookmarkManager.loadFile( QStringLiteral("bookmarks/bookmarks.kml") ); for (GeoDataFolder* folder: bookmarkManager.folders()) { collectMatches(matches, query, folder); } if ( ! matches.isEmpty() ) { context.addMatches(matches); } }