Skip to content

admariner/stdlib

 
 

Repository files navigation

@observablehq/notebook-stdlib

The Observable notebook standard library.

Installing

If you use NPM, npm install @observablehq/notebook-stdlib.

API Reference

# runtimeLibrary([resolve])

Returns a new standard library object, defining the following properties:

  • DOM - create HTML and SVG elements.
  • Files - read local files into memory.
  • Generators - utilities for generators and iterators.
  • Promises - utilities for promises.
  • require - load third-party libraries.
  • html - render HTML.
  • md - render Markdown.
  • svg - render SVG.
  • tex - render TeX.
  • now - the current value of Date.now.
  • width - the current page width.

If resolve is specified, it is a function that returns the URL of the module with the specified name; this is used internally by require.

DOM

# DOM.canvas(width, height)

Returns a new canvas element with the specified width and height. For example, to create a 960×500 canvas:

DOM.canvas(960, 500)

This is equivalent to:

{
  let canvas = document.createElement("canvas");
  canvas.width = 960;
  canvas.height = 500;
  return canvas;
}

# DOM.context2d(width, height[, dpi])

Returns a new canvas context with the specified width and height and the specified device pixel ratio dpi. If dpi is not specified, it defaults to window.devicePixelRatio. For example, to create a 960×500 canvas:

{
  let context = DOM.context2d(960, 500);
  return context.canvas;
}

If the device pixel ratio is two, this is equivalent to:

{
  let canvas = document.createElement("canvas");
  canvas.width = 1920;
  canvas.height = 1000;
  canvas.style.width = "960px";
  let context = canvas.getContext("2d");
  context.scale(2, 2);
  return canvas;
}

To access the context’s canvas, use context.canvas.

# DOM.download(object[, name][, value])

Returns an anchor element containing a button that when clicked will download a file representing the specified object. The object should be anything supported by URL.createObjectURL such as a file or a blob.

# DOM.element(name[, attributes])

Returns a new element with the specified name. For example, to create an empty H1 element:

DOM.element("h1")

This is equivalent to:

document.createElement("h1")

If the name has the prefix svg:, math: or xhtml:, uses document.createElementNS instead of document.createElement. For example, to create an empty SVG element (see also DOM.svg):

DOM.element("svg:svg")

This is equivalent to:

document.createElementNS("http://www.w3.org/2000/svg", "svg")

If attributes is specified, sets any attributes in the specified object before returning the new element.

# DOM.input([type])

Returns a new input element with the specified type. If type is not specified or null, a text input is created. For example, to create a new file input:

DOM.input("file")

This is equivalent to:

{
  let input = document.createElement("input");
  input.type = "file";
  return input;
}

# DOM.range([min, ][max][, step])

Returns a new range input element. (See also DOM.input.) If max is specified, sets the maximum value of the range to the specified number; if max is not specified or null, sets the maximum value of the range to 1. If min is specified, sets the minimum value of the range to the specified number; if min is not specified or null, sets the minimum value of the range to 0. If step is specified, sets the step value of the range to the specified number; if step is not specified or null, sets the step value of the range to any. For example, to create a slider that ranges the integers from -180 to +180, inclusive:

DOM.range(-180, 180, 1)

This is equivalent to:

{
  let input = document.createElement("input");
  input.min = -180;
  input.max = 180;
  input.step = 1;
  input.type = "range";
  return input;
}

Or using html:

html`<input type=range min=-180 max=180 step=1>`

# DOM.select(values)

Returns a new select element with an option for each string in the specified values array. For example, to create a drop-down menu of three colors:

DOM.select(["red", "green", "blue"])

This is equivalent to:

{
  let select = document.createElement("select");
  let optionRed = select.appendChild(document.createElement("option"));
  optionRed.value = optionRed.textContent = "red";
  let optionGreen = select.appendChild(document.createElement("option"));
  optionGreen.value = optionGreen.textContent = "green";
  let optionBlue = select.appendChild(document.createElement("option"));
  optionBlue.value = optionBlue.textContent = "blue";
  return select;
}

For greater control, consider using html instead. For example, here is an equivalent way to define the above drop-down menu:

html`<select>
  <option value="red">red</option>
  <option value="green">green</option>
  <option value="blue">blue</option>
</select>`

# DOM.svg(width, height)

Returns a new SVG element with the specified width and height. For example, to create a 960×500 blank SVG:

DOM.svg(960, 500)

This is equivalent to:

{
  let svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
  set.setAttribute("viewBox", "0,0,960,500")
  svg.setAttribute("width", "960");
  svg.setAttribute("height", "500");
  return svg;
}

# DOM.text(string)

Returns a new text node with the specified string value. For example, to say hello:

DOM.text("Hello, world!")

This is equivalent to:

document.createTextNode("Hello, world!")

Files

# Files.buffer(file)

Reads the specified file, returning a promise of the ArrayBuffer yielded by fileReader.readAsArrayBuffer. This is useful for reading binary files, such as shapefiles and ZIP archives.

# Files.text(file)

Reads the specified file, returning a promise of the string yielded by fileReader.readAsText. This is useful for reading text files, such as plain text, CSV, Markdown and HTML.

# Files.url(file)

Reads the specified file, returning a promise of the data URL yielded by fileReader.readAsDataURL. This is useful for reading a file into memory, represented as a data URL. For example, to display a local file as an image:

Files.url(file).then(url => {
  var image = new Image;
  image.src = url;
  return image;
})

However, note that it may be more efficient to use the synchronous URL.createObjectURL method instead, such as:

{
  let image = new Image;
  image.src = URL.createObjectURL(file);
  return image;
}

Generators

# Generators.filter(iterator, test)

# Generators.input(input)

# Generators.map(iterator, transform)

# Generators.observe(initialize)

# Generators.queue(initialize)

# Generators.range([start, ]stop[, step])

# Generators.valueAt(iterator, index)

Promises

# Promises.delay(duration[, value])

Returns a promise that resolves with the specified value after the specified duration in milliseconds.

# Promises.never

A promise that never resolves. Equivalent to new Promise(() => {}).

# Promises.tick(duration[, value])

Returns a promise that resolves with the specified value at the next integer multiple of milliseconds since the UNIX epoch. This is much like Promises.delay, except it allows promises to be synchronized.

# Promises.when(date[, value])

… Note: the current implementation relies on setTimeout, and thus the specified date must be no longer than 2,147,483,647 milliseconds (24.9 days) from now.

Live Values

# now

The current value of Date.now.

# width

The current width of cells.

HTML

# html(strings, values…)

Returns the HTML element represented by the specified strings and values. This function is intended to be used as a tagged template literal. For example, to create an H1 element whose content is “Hello, world!”:

html`<h1>Hello, world!</h1>`

If the resulting HTML fragment is not a single HTML element or node, is it wrapped in a DIV element. For example, this expression:

html`Hello, <b>world</b>!`

Is equivalent to this expression:

html`<div>Hello, <b>world</b>!</div>`

If an embedded expression is a DOM element, it is embedded in generated HTML. For example, to embed TeX within HTML:

html`I like ${tex`\KaTeX`} for math.`

If an embedded expression is an array, the elements of the array are embedded in the generated HTML. For example, to create a table from an array of values:

html`<table>
  <tbody>${["zero", "one", "two"].map((name, i) => html`<tr>
    <td>${name}</td><td>${i}</td>
  </tr>`)}</tbody>
</table>`

# svg(strings, values…)

Returns the SVG element represented by the specified strings and values. This function is intended to be used as a tagged template literal. For example, to create an SVG element whose content is a circle:

svg`<svg width=16 height=16>
  <circle cx=8 cy=8 r=4></circle>
</svg>`

If the resulting SVG fragment is not a single SVG element, is it wrapped in a G element. For example, this expression:

svg`
<circle cx=8 cy=4 r=4></circle>
<circle cx=8 cy=8 r=4></circle>
`

Is equivalent to this expression:

svg`<g>
  <circle cx=8 cy=4 r=4></circle>
  <circle cx=8 cy=8 r=4></circle>
</g>`

If an embedded expression is a DOM element, it is embedded in generated SVG. If an embedded expression is an array, the elements of the array are embedded in the generated SVG.

Markdown

# md(strings, values…)

md`Hello, *world*!`

If an embedded expression is a DOM element, it is embedded in generated HTML. If an embedded expression is an array, the elements of the array are embedded in the generated HTML.

TeX

# tex(strings, values…)

tex`E = mc^2`

# tex.block(strings, values…)

Equivalent to tex, but uses KaTeX’s display mode to produce a bigger block element rather than a smaller inline element.

tex.block`E = mc^2`

require

# require(names…)

Returns a promise of the asynchronous module definition (AMD) with the specified names, loaded from unpkg. Each module name can be a package (or scoped package) name optionally followed by the at sign (@) and a semver range. For example, to load d3-array:

require("d3-array").then(d3 => {
  console.log(d3.range(100));
});

Or, to load d3-array and d3-color and merge them into a single object:

require("d3-array", "d3-color").then(d3 => {
  console.log(d3.range(360).map(h => d3.hsl(h, 1, 0.5)));
});

Or, to load d3-array 1.1.x:

require("[email protected]").then(d3 => {
  console.log(d3.range(100));
});

See d3-require for more information.

# resolve(name)

Returns the resolved URL to require the module with the specified name.

About

The Observable standard library.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%