Code Monkey home page Code Monkey logo

expression-jamsession's Introduction

@mapbox/expression-jamsession

Build Status

Write Mapbox GL expressions in a more familiar, handwritable, spreadsheet-like, programming-like syntax. This library translates these handwritten formulas into valid spec-compliant Mapbox GL expressions that you can use in a Mapbox style.

Formula syntax features

  • Most expressions are represented like function invocations in programming, e.g. get("population"), log2(get("population")).
  • Symbolic math operators (+ - * / %) and parentheses work like in high school math, e.g. ((3 + 4) * 2) / 7. That is, the formula should contain 3 + 4 instead of +(3, 4).
  • Symbolic decision operators also work with operands on both sides, instead of like function invocations. So get("foo") != 4 instead of !=(get("foo"), 4).
  • Strings must always be wrapped in quotation marks, e.g. concat("egg", "s") not concat(egg, s).
  • & operator concatenates strings, as in spreadsheet programs.
// Input
2 + 2

// Output
["+", 2, 2]
// Input
max(3, log2(6))

// Output
["max", 3, ["log2", 6]]
// Input
((3 + get("num")) * 2) / 7

// Output
["/", ["*", ["+", 3, get("num")], 2], 7]
// Input
"name: " & get("name")

// Output
["concat", ["name ", ["get", "name"]]]

Usage

The module exports two functions so you can transform in both directions:

  • formulaToExpression transforms (string) formulas to (array) expressions.
  • expressionToFormula transforms expressions to formulas.
import jamsession from '@mapbox/expression-jamsession';

jamsession.formulaToExpression("3 + 4"); // ["+", 3, 4]

jamsession.expressionToFormula(["+", 3, 4]); // "3 + 4"

Browser compatibility

This library should work in IE11+. It uses a Set, so you might get it working in older browsers by adding a polyfill.

Caveats

  • You can use this library to create expressions that are syntactically acceptable but invalid as Mapbox GL expressions, e.g. get(true) outputs ["get", true], which fails.
  • You cannot use JSON object literal arguments to the literal expression. This is allowed in the spec; but objects are not supported by jsep and the use case for this type of expression is kind of an edge case — so it's probably not worth trying to adjust the parser to support this edge case. If you disagree, please consider filing an issue and/or PR.

expression-jamsession's People

Contributors

davidtheclark avatar samanpwbb avatar emilymdubois avatar jseppi avatar dependabot[bot] avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.