Git Product home page Git Product logo

webidl.js's Introduction

[DEPRECATED] Use https://github.com/darobin/webidl2.js instead.

WebIDLParser.js is, shockingly enough, a Javascript parser for WebIDL (http://dev.w3.org/2006/webapi/WebIDL/).

All the content of this repository is distributed under the MIT License.

In order to use it in a Web context, simply include web/WebIDLParser.js. Note that this file has not been
minified and is quite large. I tested reducing its size here, and easily got it down to 44K minified and
6.4K gzipped (being generated, it is rather repetitive code). A "WebIDLParser" object will become available.

Using it from Node.js or a CommonJS environment is equally simple: just put node/WebIDLParser.js in your
library path and require it. It exports a "Parser" object.

The interface is simple: the only method you need to worry about is parse(str, [start]). It takes a string containing
WebIDL, and returns an AST expressed as a simple JS structure (utilities to traverse it more easily are
forthcoming). Optionally a second argument can specify which rule of the grammar to start with. This is useful
when parsing a small WebIDL fragment that may be incomplete. The names of the rules can be found in lib/grammar.peg.
Just so that you don't have to look, the most common start parameters are:

	- definitions (the default)
	- interface
	- Operation
	- Attribute
	- type
	- implements
	- typedef
	- exception

The grammar isn't exactly the one in the WebIDL draft. In some places it is slightly more permissive (not
by that much though), and its handling of extended attributes is simpler. It also adds support for WebIDL
arrays, even though they are not described in the current draft's grammar.

The parser code is created with the pegjs parser generator from the
grammar in lib/grammar.peg. To modify the grammar:

        - read up on PEG.js at http://pegjs.majda.cz/
        - install node and npm
        - install pegjs with npm install -g pegjs
        - run 'make parsers' in the top-level directory. (This assumes
          that you're in a Unix-like environment with make and sed installed.)

webidl.js's People

Contributors

ayg avatar bpl avatar darobin avatar dontcallmedom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

webidl.js's Issues

Does it support statics?

The parser seems to support "static" declarations on interface members, but not quite correctly... Statics show up on a member as:

member[0] === "static"

Test case:

interface SomeFoo {
static void test();
};

can't handle HTML5 type DOMStringList

The parser can't parse the type DOMSringList, or, in general any type name that has one of the primitive WebIDL types as a prefix. So longStringList would also not parse. I don't know if this is a problem with the grammar or the parser generator. But consider this line from node/WebIDLParser.js:

                if (input.substr(pos, 9) === "DOMString") {
                  var result4 = "DOMString"
                  pos += 9;

It looks ahead for known type names, but doesn't verify that they are at token boundaries.

extAttrs should return array

When extAttrs are missing, the object.extAttrs should return an empty array (for consistency ... note that object.members behaves correctly by returning an empty array).

Dealing with multiple types is annoying.

Extended exceptions not supported

It should be possible to extend exceptions.

Test case:
exception NumberError : Wee { };

Expected to be able to extend.

This also fails:

exception Wee { };
exception NumberError : Wee { };

Backcompat mode

The code now needs to be updated to add a few things from WebIDL that are missing, but the question of what to do with old constructs needs to be handled.

My proposal is this: keep them around, but for each of those when they are processed make a call to checkCompatMode(). If compatibility has been set, then accept the old constructs, otherwise die with a syntax error.

This is useful because it will make it possible to parse older specifications, warn, etc.

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.