Intl MessageFormat Parser ========================= Parses [ICU Message strings][ICU] into an AST via JavaScript. [![npm Version][npm-badge]][npm] [![Build Status][travis-badge]][travis] [![Dependency Status][david-badge]][david] Overview -------- This package implements a parser in JavaScript that parses the industry standard [ICU Message strings][ICU] — used for internationalization — into an AST. The produced AST can then be used by a compiler, like [`intl-messageformat`][intl-mf], to produce localized formatted strings for display to users. This parser is written in [PEG.js][], a parser generator for JavaScript. This parser's implementation was inspired by and derived from Alex Sexton's [messageformat.js][] project. The differences from Alex's implementation are: - This project is standalone. - It's authored as ES6 modules compiled to CommonJS and the Bundle format for the browser. - The produced AST is more descriptive and uses recursive structures. - The keywords used in the AST match the ICU Message "spec". Usage ----- ### Loading in the Browser The `dist/` folder contains the version of this package for use in the browser, and it can be loaded and used like this: ```html ``` ### Loading in Node.js This package can also be `require()`-ed in Node.js: ```js var parser = require('intl-messageformat-parser'); parser.parse('...'); ``` ### Example Given an ICU Message string like this: ``` On {takenDate, date, short} {name} took {numPhotos, plural, =0 {no photos.} =1 {one photo.} other {# photos.} } ``` ```js // Assume `msg` is the string above. parser.parse(msg); ``` This parser will produce this AST: ```json { "type": "messageFormatPattern", "elements": [ { "type": "messageTextElement", "value": "On " }, { "type": "argumentElement", "id": "takenDate", "format": { "type": "dateFormat", "style": "short" } }, { "type": "messageTextElement", "value": " " }, { "type": "argumentElement", "id": "name", "format": null }, { "type": "messageTextElement", "value": " took " }, { "type": "argumentElement", "id": "numPhotos", "format": { "type": "pluralFormat", "offset": 0, "options": [ { "type": "optionalFormatPattern", "selector": "=0", "value": { "type": "messageFormatPattern", "elements": [ { "type": "messageTextElement", "value": "no photos." } ] } }, { "type": "optionalFormatPattern", "selector": "=1", "value": { "type": "messageFormatPattern", "elements": [ { "type": "messageTextElement", "value": "one photo." } ] } }, { "type": "optionalFormatPattern", "selector": "other", "value": { "type": "messageFormatPattern", "elements": [ { "type": "messageTextElement", "value": "# photos." } ] } } ] } } ] } ``` License ------- This software is free to use under the Yahoo! Inc. BSD license. See the [LICENSE file][] for license text and copyright information. [npm]: https://www.npmjs.org/package/intl-messageformat-parser [npm-badge]: https://img.shields.io/npm/v/intl-messageformat-parser.svg?style=flat-square [david]: https://david-dm.org/yahoo/intl-messageformat-parser [david-badge]: https://img.shields.io/david/yahoo/intl-messageformat-parser.svg?style=flat-square [travis]: https://travis-ci.org/yahoo/intl-messageformat-parser [travis-badge]: https://img.shields.io/travis/yahoo/intl-messageformat-parser.svg?style=flat-square [ICU]: http://userguide.icu-project.org/formatparse/messages [intl-mf]: https://github.com/yahoo/intl-messageformat [PEG.js]: http://pegjs.majda.cz [messageformat.js]: https://github.com/SlexAxton/messageformat.js [LICENSE file]: https://github.com/yahoo/intl-messageformat-parser/blob/master/LICENSE