wajs

0.0.17 • Public • Published

wajs — Wolfram|Alpha via JS

wajs provides JavaScript bindings for the Wolfram|Alpha web-service API. wajs exposes the Wolfram|Alpha web-service API via a small JavaScript library (Node.js environment). The wajs library also offers an interface for querying Wolfram|Alpha, and manipulating query results programmatically without needing to wrangle raw XML.

Current Stable Release Version Current Stable npm Release

Created by Clark Feusier

All other language bindings for Wolfram|Alpha can be found here.


  1. Overview
  2. Installation
  3. Documentation
    1. Example Usage
    2. API Reference
  4. Roadmap
  5. Contributing
  6. Development Requirements
    1. Installing Dependencies
    2. Running Tests
    3. Building
  7. License

Overview

Here is a list of the core features of wajs:

If you have directly consumed the Wolfram|Alpha web-service API, you might have appreciation for the features listed above. If you haven't yet interacted with the Wolfram|Alpha API, save yourself some pain and use wajs. Installation instructions, example usage, and API reference can be found below.


Installation

wajs is available as an npm package.

* Note: Wolfram|Alpha does not support CORS for serving browser requests. wajs is only available in the Node environment until client-side requests are supported by the Wolfram|Alpha API.

Install module from command-line

npm install wajs

Require or import module for use in desired file

// commonjs require
var wajs = require('wajs')
// es2015 import
import wajs from 'wajs'

Documentation

Example Usage

// require wajs module -- assuming commonjs/node environment
var wajs = require('wajs')
 
// the Wolfram|Alpha App Id -- generated in Wolfram|Alpha developer portal
// NOTE: copy your app id and set your WA_APP_ID environment variable
// from the command-line, as follows:
// `export WA_APP_ID='<YOUR APP ID GOES HERE>'`
var waAppId = process.env.WA_APP_ID
 
// create a client to query the Wolfram|Alpha web-service
// NOTE: you can create as many clients as you want, though you only need one
var waClient = new wajs(waAppId)
 
// the only required argument to `<wajs-client>.query` is a query string
var queryString = 'weather' // maybe this comes from user input
 
// if you want to customize the query further, provide query options
// for documentation on query options, please see
// the API Reference for `<wajs-client>.query`
// NOTE: this is an optional argument
var queryOptions = {
  format: 'image,plaintext,sound,wav',
  units: 'metric'
}
 
// use the client to send a query
waClient.query(queryString, queryOptions)
.then(function(resp) {
  // do something with the `<query-result>` response
  // for documentation on `<query-result>`, please see
  // the API reference for `<query-result>`
})
.catch(function(err) {
  // do something with the `<query-error>` response
})

API Reference

wajs

new wajs(appId: string): wajs-client<T>

This is the constructor function for generating a <wajs-client>.

<wajs-client>.query

<wajs-client>.query(input: string, options: object): Promise<T>

This method will query the Wolfram|Alpha web-service API with the provided query.

// query with string and default options
waClient.query('whatever')
.then(function(qr) {
  // qr === <query-result>
})
.catch(function(err) {})
// query with string and custom options
waClient.query('pi', {
  format: 'image,plaintext,sound,wav',
  assumption: '*C.pi-_*Movie-',
  width: '900',
  maxWidth: '1200'
})
.then(function(qr) {
  // qr === <query-result>
})
.catch(function(err) {})

options

var queryOptions = {
  // podTitle
  // repeatable, globable, comma-separated
  // default: all pod titles
  podTitle: '',
 
  // podIndex
  // repeatable, globable, comma-separated
  // default: all pod indices
  podIndex: '',
 
  // format
  // repeatable, comma-separated
  // default: 'image,plaintext'
  // possible options:
    // image
    // plaintext
    // minput
    // moutput
    // cell
    // mathml
    // imagemap
    // sound
    // wav
  format: '',
 
  // assumption
  // single string -- must match an assumption string from Wolfram|Alpha assumptions
  assumption: '',
 
  // includePodId
  // list of strings or single string, globable
  // default: all pod ids
  includePodId: [], // '',
 
  // excludePodId
  // list of strings or single string, globable
  // default: none are excluded
  excludePodId: [], // '',
 
  // scanner
  // list of strings or single string, globable
  // default: all scanners
  scanner: [], // ''
 
  // async
  // boolean -- if set to true, results will contain 'async' flags for the
  // properties that require another request to get content. If you want all the query
  // results in a single response, do not use the async flag
  // default: false
  async: true,
 
  // ip
  // string -- should represent the ip address to be used for restricting the query
  // default: the requesting ip address
  ip: '',
 
  // location
  // string -- should represent the location to be used for
  // restricting the query, e.g., 'CA'
  // default: none
  location: '',
 
  // coordinates
  // string -- should represent the latitude and longitude pair
  // to be used for restricting the query, e.g., '40.42,-3.71'
  // default: none
  coordinates: '',
 
  // podState
  // string -- should match a pod state string from a Wolfram|Alpha pod
  // default: none
  podState: '',
 
  // units
  // string
  // default: based on requesting location
  // possible options:
    // 'metric'
    // 'nonmetric'
  units: '',
 
  // width
  // string
  // default: '500'
  width: '',
 
  // maxWidth
  // string
  // default: '500'
  maxWidth: '',
 
  // plotWidth
  // string
  // default: '200'
  plotWidth: '',
 
  // magnitude
  // string
  // default: '1.0'
  magnitude: '',
 
  // scanTimeout
  // string
  // default: '3.0'
  scanTimeout: '',
 
  // podTimeout
  // string
  // default: '4.0'
  podTimeout: '',
 
  // parseTimeout
  // string
  // default: '5.0'
  parseTimeout: '',
 
  // formatTimeout
  // string
  // default: '8.0'
  formatTimeout: '',
 
  // reinterpret
  // boolean -- if true, and there are no results for a query, Wolfram|Alpha
  // can switch to a related query for which some results are available
  // default: false
  reinterpret: '',
 
  // translation
  // boolean -- if false, auto-translation of simple queries is turned off
  // default: true
  translation: '',
 
  // ignoreCase
  // boolean -- if true, case will not be significant for the given query
  // default: false
  ignoreCase: '',
 
  // sig
  // string -- used to sign and validate identity of request/response
  // default: none
  sig: ''
}

<query-result>

When the promise, returned by <wajs-client>.query, resolves, the resolution handler function is provided a <query-result> instance, with the following API.

<query-result>.succeeded

<query-result>.succeeded(): boolean

This method will return a boolean indicating the success of the query operation (not the success of the overall HTTP request, which is indicated by the query promise resolution).

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.succeeded())
})
 
// output
true

<query-result>.failed

<query-result>.failed(): boolean

This method will return a boolean indicating the failure of the query operation (not the failure of the overall HTTP request, which is indicated by the query promise rejection).

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.failed())
})
 
// output
false

<query-result>.error

<query-result>.error(): { Error, null }

This method will return an Error object if the query operation failed, and null otherwise.

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.error())
})
 
// output
null

<query-result>.numPods

<query-result>.numPods(): number

This method will return the number of pods in the given query result.

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.numPods())
})
 
// output
8

<query-result>.dataTypes

<query-result>.dataTypes(): array<DataType>

This method will return a list of DataType strings representing the categories and types of data represented in the query result.

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.dataTypes())
})
 
// output
['MathematicalFunctionIdentity']

<query-result>.toJson

<query-result>.toJson(): json-string

This method will convert the entire query result to JSON.

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.toJson())
})
 
// output (truncated)
{
  "pod":[...],
  "assumptions":[...],
  "success":"true",
  "error":"false",
  "numpods":"8",
  "datatypes":"MathematicalFunctionIdentity",
  "timedout":"Numeric",
  "timedoutpods":"",
  "timing":"3.4170000000000003",
  "parsetiming":"0.14",
  "parsetimedout":"false",
  "recalculate":"http://www4b.wolframalpha.com/api/v2/recalc.jsp?id=...",
  "id":"...",
  "host":"http://www4b.wolframalpha.com",
  "server":"30",
  "related":"http://www4b.wolframalpha.com/api/v2/relatedQueries.jsp?id=...",
  "version":"2.6"
}

<query-result>.rawXml

<query-result>.rawXml(): xml-string

This method will return the entire original xml query result.

// e.g.,
waClient.query('pi').then(function(qr) {
  console.log(qr.rawXml())
})
<!-- output (truncated) -->
<?xml version='1.0' encoding='UTF-8'?>
<queryresult
  success='true'
  error='false'
  numpods='8'
  ...>
  <pod title='Input'>...</pod>
  <assumptions count='1'>...</assumptions>
</queryresult>

<query-result>.pods

<query-result>.pods(xmlFormat: boolean): array<pod>

This method return a list of pod objects from the query result.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of pods will be a list of xml string representations of the pods
// e.g., default
waClient.query('pi').then(function(qr) {
  console.log(qr.pods())
})
 
// output (truncated)
[
  {
    subpod: [ [subpod1...] ],
    title: 'Input',
    scanner: 'Identity',
    id: 'Input',
    position: '100',
    error: 'false',
    numsubpods: '1',
    __parent: ...
  },
  ...
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  console.log(qr.pods(true))
})
 
// output (truncated)
[
  '<pod title="Input" scanner="Identity" id="Input" position="100" error="false" numsubpods="1">...</pod>',
  ...
]

<query-result>.assumptions

<query-result>.assumptions(xmlFormat: boolean): array<assumption>

This method return a list of assumption objects from the query result.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of assumptions will be a list of xml string representations of the assumptions
// e.g., default
waClient.query('pi').then(function(qr) {
  console.log(qr.assumptions())
})
 
// output (truncated)
[
  {
    value: [[...], [...], [...], [...], [...], [...]],
    type: 'Clash',
    word: 'pi',
    template: 'Assuming "${word}" is ${desc1}. Use as ${desc2} instead',
    count: '6',
    __parent: ...
  }
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  console.log(qr.assumptions(true))
})
 
// output (truncated)
[
  '<assumption type="Clash" word="pi" template="Assuming &quot;${word}&quot; is ${desc1}. Use as ${desc2} instead" count="6">...</assumption>',
  ...
]

<query-result>.sources

<query-result>.sources(xmlFormat: boolean): array<source>

This method return a list of source objects from the query result.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of sources will be a list of xml string representations of each source object
// e.g., default
waClient.query('weather').then(function(qr) {
  console.log(qr.sources())
})
 
// output (truncated)
[
  {
    source: [[...], [...], [...], [...]],
    count: '4'
  },
  ...
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  console.log(qr.sources(true))
})
 
// output (truncated)
[
  '<sources count="4">...</sources>',
  ...
]

<query-result>.warnings

<query-result>.warnings(xmlFormat: boolean): array<warning>

This method return a list of warning objects from the query result.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of warnings will be a list of xml string representations of each warning object
// e.g., default
waClient.query('pi').then(function(qr) {
  console.log(qr.warnings())
})
 
// output (truncated)
undefined // (there are no warnings for this query result)
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  console.log(qr.warnings(true))
})
 
// output (truncated)
undefined // (there are no warnings for this query result)

<pod>

Each <query-result> provides a .pods() method to access the <query-result> pods, if any. Each <pod> provides the following API.

<pod>.succeeded

<pod>.succeeded(): boolean

This method returns true if the pod was loaded successfully from Wolfram|Alpha.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.succeeded())
})
 
// output (truncated)
true // this pod was fetched successfully

<pod>.failed

<pod>.failed(): boolean

This method returns true if the pod was not successfully fetched from Wolfram|Alpha.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.failed())
})
 
// output (truncated)
false // this pod was fetched successfully

<pod>.getTitle

<pod>.getTitle(): string

This method returns the title of the pod, represented as a string.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getTitle())
})
 
// output (truncated)
'Example Pod Title'

<pod>.numSubPods

<pod>.numSubPods(): number = 0

This method returns the number of <subPods> contained by the <pod>.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.numSubPods())
})
 
// output (truncated)
2

<pod>.rawXml

<pod>.rawXml(): xml-string

This method returns the raw XML string representation of the <pod>.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.rawXml())
})
<!-- output (truncated) -->
<pod title='Input'>...</pod>

<pod>.getScanner

<pod>.getScanner(): string

This method returns a string representation of the <pod>'s scanner.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getScanner())
})
 
// output (truncated)
'Numeric'

<pod>.getPosition

<pod>.getPosition(): number = 0

This method returns a number representation of the <pod>'s position in the <query-result>.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getPosition())
})
 
// output (truncated)
1

<pod>.asyncEndpoint

<pod>.asyncEndpoint(): string

This method returns a string representation of the <pod>'s asynchronous url -- the endpoint for asynchronously fetching the <pod>'s data, assuming the query used async=true.

// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.asyncEndpoint())
})
 
// output (truncated)
'http://www1.wolframalpha.com/api/v2/asyncPod.jsp?id=MSPa1071c679e3ea1d0h94h00002h3ggc950ehaibf9&s=13'

<pod>.subPods

<pod>.subPods(xmlFormat: boolean): array<subpod>

This method returns a list of <subpod>s from the pod.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of subpods will be a list of xml string representations of each subpod object
// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.subPods())
})
 
// output (truncated)
[
  {
    "title" : "",
    "img" : {
      "src" : "http:\/\/www4c.wolframalpha.com\/Calculate\/MSP\/MSP4541i6ff0cbeghe4a6a0000248ahgicidag8e12?MSPStoreType=image\/gif&s=61",
      "alt" : "",
      "title" : "",
      "width" : 300,
      "height" : 56
    },
      "plaintext" : ""
  }
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.subPods(true))
})
 
// output (truncated)
[
  '<subpod title=''...>...</subpod>'
]

<pod>.getStates

<pod>.getStates(xmlFormat: boolean): array<state>

This method returns a list of <state>s from the pod.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of state objects will be a list of xml string representations of each state object
// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getStates())
})
 
// output (truncated)
[
  {
    "name" : "Fraction form",
    "input" : "ContinuedFraction__Fraction form"
  }
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getStates(true))
})
// output (truncated)
<states count='1'>
  <state name='More'
    input='AlternativeRepresentations:MathematicalFunctionIdentityData__More'
  />
</states>

<pod>.getInfos

<pod>.getInfos(xmlFormat: boolean): array<info>

This method returns a list of <info>s from the pod.

  • xmlFormat:
    • type: boolean
    • optional
    • default: false
    • if true, the list of info objects will be a list of xml string representations of each info object
// e.g.,
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getInfos())
})
 
// output (truncated)
[
  {
    "text" : "(n\nm) is the binomial coefficient",
    "img" : {
      "src" : "http:\/\/www4b.wolframalpha.com\/Calculate\/MSP\/MSP22591ca2276efe0853cd000045fid320b029578h?MSPStoreType=image\/gif&s=61",
      "alt" : "(n\nm) is the binomial coefficient",
      "title" : "(n\nm) is the binomial coefficient",
      "width" : "204",
      "height" : "36"
    },
    "links" : [
      {
        "url" : "http:\/\/reference.wolfram.com\/language\/ref\/Binomial.html",
        "text" : "Documentation",
        "title" : "Mathematica"
      },
      {
        "url" : "http:\/\/functions.wolfram.com\/GammaBetaErf\/Binomial",
        "text" : "Properties",
        "title" : "Wolfram Functions Site"
      },
      {
        "url" : "http:\/\/mathworld.wolfram.com\/BinomialCoefficient.html",
        "text" : "Definition",
        "title" : "MathWorld"
      }
    ]
  }
]
 
// e.g., xmlFormat is true
waClient.query('pi').then(function(qr) {
  const [pod] = qr.pods()
  console.log(pod.getInfos(true))
})
// output (truncated)
<infos count='1'>
  <info text='i is the imaginary unit'>
    <img src='http://www5b.wolframalpha.com/Calculate/MSP/MSP11872374eggi4a3i61a900000eg99g28e5669i23?MSPStoreType=image/gif&amp;s=32'
      alt='i is the imaginary unit'
      title='i is the imaginary unit'
      width='147'
      height='18'
    />
    <link url='http://reference.wolfram.com/language/ref/I.html'
      text='Documentation'
      title='Documentation'
    />
    <link url='http://mathworld.wolfram.com/i.html'
      text='Definition'
      title='MathWorld'
    />
  </info>
</infos>

Roadmap

The future of wajs is managed through this repository's Issuesview the roadmap here.

Contributing to wajs

I welcome contributions, but please submit an issue before beginning so that I don't duplicate your work. The development requirements and instructions are below.

Development Requirements

JavaScript Engine:

  • node > 0.10.x

Package Manager:

  • npm > 2.x.x

Global Packages:

  • webpack

Project Package Dependencies:

  • bluebird
  • cheerio
  • popsicle
  • traverse
  • xml2js

Development Package Dependencies:

  • babel-core
  • babel-loader
  • babel-plugin-transform-runtime
  • babel-polyfill
  • babel-preset-es2015
  • babel-preset-stage-0
  • babel-runtime
  • watch
  • webpack-node-externals

Installing Dependencies

Install Node (bundled with npm) using Homebrew:

brew install node

Install global project dependencies using npm:

npm install -g webpack

Install all local project dependencies using npm:

npm install

Running Tests

After installing the above dependencies, tests can be run using the following command:

npm run test

Building

For a one-off build, run the following command:

npm run build

For a continuous build on changes during development, run the following command:

npm run build:watch

License

MIT LICENSE

wajs -- JavaScript bindings for the Wolfram|Alpha web-service API

Copyright (C) 2016 Clark Feusier cfeusier@gmail.com - All Rights Reserved

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Back to Top

Package Sidebar

Install

npm i wajs

Weekly Downloads

4

Version

0.0.17

License

MIT

Last publish

Collaborators

  • cfeusier