@lynx-json/lynx-parser

A simple parser for application/lynx+json documents.

Stats

StarsIssuesVersionUpdatedCreatedSize
@lynx-json/lynx-parser
140.4.12 years ago4 years agoMinified + gzip package size for @lynx-json/lynx-parser in KB

Readme

Lynx Parser

Build Status

Sauce Test Status

Sauce Browser Matrix

Lynx Parser parses a string of lynx content and returns a promise for a normalized lynx document.

Structure

Normalization

During parsing, each specified node is expanded to an object with a value and a spec.

Consider the following source document:

{
  "items": [
    "one",
    "two",
    "three"
  ],
  "spec": {
    "hints": [
      "container"
    ],
    "children": [
      {
        "name": "items",
        "hints": [
          "container"
        ],
        "children": {
          "hints": [
            "text"
          ]
        }
      }
    ]
  }
}

Calling LYNX.parse(source) results in the following normalized structure:

{
  "spec": {
    "hints": [
      {
        "name": "container"
      }
    ],
    "children": [
      {
        "name": "items",
        "hints": [
          "container"
        ],
        "children": {
          "hints": [
            "text"
          ]
        }
      }
    ]
  },
  "value": {
    "items": {
      "spec": {
        "name": "items",
        "hints": [
          "container"
        ],
        "children": {
          "hints": [
            "text"
          ]
        }
      },
      "value": [
        {
          "spec": {
            "hints": [
              "text"
            ]
          },
          "value": "one"
        },
        {
          "spec": {
            "hints": [
              "text"
            ]
          },
          "value": "two"
        },
        {
          "spec": {
            "hints": [
              "text"
            ]
          },
          "value": "three"
        }
      ]
    }
  }
}

Data Properties

Data properties are left intact.

Consider the following link document with an unspecified href value.

{
  "href": "http://example.com",
  "spec": {
    "hints": [
      "link"
    ]
  }
}

The resulting parsed document is left with its original href value:

{
  "spec": {
    "hints": [
      {
        "name": "link"
      }
    ]
  },
  "value": {
    "href": "http://example.com"
  }
}

Document-Level Properties

The document-level properties realm, base, focus, and context are left on the document-level value/spec pair:

Consider the following document:

{
  "realm": "http://example.com/greeting/",
  "base": "http://example.com/hello-world/",
  "focus": "message",
  "context": "http://example.com/",
  "message": "Hello, World!",
  "spec": {
    "hints": [
      "container"
    ],
    "children": [
      {
        "name": "message",
        "hints": [
          "text"
        ]
      }
    ]
  }
}

The resulting parsed document is left with four document-level properties, base, realm, focus, and context. The value has a single property, message.

{
  "spec": {
    "hints": [
      "container"
    ],
    "children": [
      {
        "name": "message",
        "hints": [
          "text"
        ]
      }
    ]
  },
  "value": {
    "message": {
      "spec": {
        "name": "message",
        "hints": [
          "text"
        ]
      },
      "value": "Hello, World!"
    }
  },
  "realm": "http://example.com/greeting/",
  "base": "http://example.com/hello-world/",
  "focus": "message",
  "context": "http://example.com/"
}

Usage

A Simple Lynx Document

const LYNX = require("lynx-parser");

var input = {
  "value": "Hello, World!",
  "spec": {
    "hints": [ "text" ]
  }
};

var output = await LYNX.parse(JSON.stringify(input));

console.log(output.value === "Hello, World!");
console.log(output.spec.hints[0].name === "text");

Resolving Spec URLs

To resolve specs referenced by URL, provide options with a resolveSpecURL function, accepting a URL and returning a promise for an object.

const LYNX = require("lynx-parser");

var input = {
  "value": "Hello, World!",
  "spec": "http://example.com/specs/greeting"
};

var options = {
  resolveSpecURL: async url => {
    return {
      hints: [ "text" ]
    };
  }
};

var output = await LYNX.parse(JSON.stringify(input), options);

console.log(output.value === "Hello, World!");
console.log(output.spec.hints[0].name === "text");

Content-Type Parameters

The content type application/lynx+json includes optional parameters that may be necessary to effectively parse the content. You may include the full type name as an option.

const LYNX = require("lynx-parser");

var input = {
  "value": "Hello, World!",
  "spec": {
    "hints": [ "text" ]
  }
};

var options = {
  type: 'application/lynx+json;realm="http://example.com/greeting/";base="http://example.com/hello-world/"'
};

var output = await LYNX.parse(JSON.stringify(input), options);
console.log(output.realm === "http://example.com/greeting/");
console.log(output.base === "http://example.com/hello-world/");

Base URI and Document Location

You should provide a document location to be used as a base URI in the case where base is specified in neither a content type parameter nor in content.

const LYNX = require("lynx-parser");

var input = {
  "value": "Hello, World!",
  "spec": {
    "hints": [ "text" ]
  }
};

var options = {
  location: "http://example.com/hello-world/"
};

var output = await LYNX.parse(JSON.stringify(input), options);
console.log(output.base === "http://example.com/hello-world/");

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.