Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

118 lines (94 sloc) 3.627 kb
#include "utils.hpp"
#include "mapnik_expression.hpp"
#include "mapnik_feature.hpp"
#include "utils.hpp"
#include <boost/make_shared.hpp>
Persistent<FunctionTemplate> Expression::constructor;
void Expression::Initialize(Handle<Object> target) {
HandleScope scope;
constructor = Persistent<FunctionTemplate>::New(FunctionTemplate::New(Expression::New));
constructor->InstanceTemplate()->SetInternalFieldCount(1);
constructor->SetClassName(String::NewSymbol("Expression"));
NODE_SET_PROTOTYPE_METHOD(constructor, "toString", toString);
NODE_SET_PROTOTYPE_METHOD(constructor, "evaluate", evaluate);
target->Set(String::NewSymbol("Expression"),constructor->GetFunction());
}
Expression::Expression() :
ObjectWrap(),
this_() {}
Expression::~Expression()
{
}
Handle<Value> Expression::New(const Arguments& args)
{
HandleScope scope;
if (!args.IsConstructCall())
return ThrowException(String::New("Cannot call constructor as function, you need to use 'new' keyword"));
if (args[0]->IsExternal())
{
//std::clog << "external!\n";
Local<External> ext = Local<External>::Cast(args[0]);
void* ptr = ext->Value();
Expression* e = static_cast<Expression*>(ptr);
e->Wrap(args.This());
return args.This();
}
mapnik::expression_ptr e_ptr;
try
{
if (args.Length() == 1 && args[0]->IsString()){
e_ptr = mapnik::parse_expression(TOSTR(args[0]),"utf8");
} else {
return ThrowException(Exception::Error(
String::New("invalid arguments: accepts a single argument of string type")));
}
}
catch (std::exception const& ex)
{
return ThrowException(Exception::Error(
String::New(ex.what())));
}
catch (...)
{
return ThrowException(Exception::Error(
String::New("unknown exception happened, please file bug")));
}
if (e_ptr)
{
Expression* e = new Expression();
e->Wrap(args.This());
e->this_ = e_ptr;
return args.This();
}
else
{
return ThrowException(Exception::Error(
String::New("unknown exception happened, please file bug")));
}
return Undefined();
}
Handle<Value> Expression::toString(const Arguments& args)
{
HandleScope scope;
Expression* e = ObjectWrap::Unwrap<Expression>(args.This());
return scope.Close(String::New( mapnik::to_expression_string(*e->get()).c_str() ));
}
Handle<Value> Expression::evaluate(const Arguments& args)
{
HandleScope scope;
if (!args.Length() > 0) {
return ThrowException(Exception::Error(
String::New("requires a mapnik.Feature as an argument")));
}
Local<Object> obj = args[0]->ToObject();
if (obj->IsNull() || obj->IsUndefined()) {
return ThrowException(Exception::TypeError(String::New("first argument is invalid, must be a mapnik.Feature not null/undefined")));
}
if (!Feature::constructor->HasInstance(obj)) {
return ThrowException(Exception::TypeError(String::New("first argument is invalid, must be a mapnik.Feature")));
}
Feature* f = ObjectWrap::Unwrap<Feature>(obj);
Expression* e = ObjectWrap::Unwrap<Expression>(args.This());
mapnik::value value_obj = boost::apply_visitor(mapnik::evaluate<mapnik::Feature,mapnik::value>(*(f->get())),*(e->get()));
return scope.Close(boost::apply_visitor(node_mapnik::value_converter(),value_obj.base()));
}
Jump to Line
Something went wrong with that request. Please try again.