Socket
Book a DemoInstallSign in
Socket

icu-messageformat-parser

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

icu-messageformat-parser

A PEG.js parser for ICU MessageFormat strings

2.0.0
latest
Source
npmnpm
Version published
Weekly downloads
1.7K
99.28%
Maintainers
1
Weekly downloads
 
Created
Source

messageformat-parser Build Status

A PEG.js parser for ICU MessageFormat strings. Outputs an AST defined by parser.pegjs.

The generated parser function takes two parameters, first the string to be parsed, and a second optional parameter options, an object.

The options object contains arrays of keywords for cardinal and ordinal rules for the current locale – these are used to validate plural and selectordinal keys. If options or its fields are missing or set to false, the full set of valid Unicode CLDR keys is used: 'zero', 'one', 'two', 'few', 'many', 'other'. To disable this check, pass in an empty array.

The options object also supports two settings that make the parser follow the ICU MessageFormat spec more closely: strictNumberSign and strictFunctionParams.

Inside a plural or selectordinal statement, a pound symbol (#) is replaced with the input number. By default, # is parsed as a special character in nested statements too, and can be escaped using apostrophes ('#').

Setting strictNumberSign to true will only parse # as a special character directly inside a plural or selectordinal statement. Outside those, # and '#' are parsed as literal text.

By default, function parameters are split on commas and trimmed, so the parameters in {x,fn, a, b } are parsed as ['a','b']. Setting strictFunctionParams to true will result in a params array with a single element: [' a, b '].

The parser only supports the DOUBLE_OPTIONAL apostrophe mode. A single apostrophe only starts quoted literal text if preceded by a curly brace ({}) or a pound symbol (#) inside a plural or selectordinal statement, depending on the value of strictNumberSign. Otherwise, it is a literal apostrophe. A double apostrophe is always a literal apostrophe.

Installation

npm install icu-messageformat-parser

Usage

> var parse = require('messageformat-parser').parse;

> parse('So {wow}.')
[ 'So ', { type: 'argument', arg: 'wow' }, '.' ]

> parse('Such { thing }. { count, selectordinal, one {First} two {Second}' +
        '                  few {Third} other {#th} } word.')
[ 'Such ',
  { type: 'argument', arg: 'thing' },
  '. ',
  { type: 'selectordinal',
    arg: 'count',
    offset: 0,
    cases:
     [ { key: 'one', tokens: [ 'First' ] },
       { key: 'two', tokens: [ 'Second' ] },
       { key: 'few', tokens: [ 'Third' ] },
       { key: 'other', tokens: [ { type: 'octothorpe' }, 'th' ] } ] },
  ' word.' ]

> parse('Many{type,select,plural{ numbers}selectordinal{ counting}' +
                         'select{ choices}other{ some {type}}}.')
[ 'Many',
  { type: 'select',
    arg: 'type',
    cases:
     [ { key: 'plural', tokens: [ ' numbers' ] },
       { key: 'selectordinal', tokens: [ ' counting' ] },
       { key: 'select', tokens: [ ' choices' ] },
       { key: 'other', tokens: [ ' some',
                                 { type: 'argument', arg: 'type' } ] } ] },
  '.' ]

> parse('{Such compliance')
// SyntaxError: Expected ",", "}" or [ \t\n\r] but "c" found.

> var msg = '{words, plural, zero{No words} one{One word} other{# words}}';
> var englishKeys = { cardinal: [ 'one', 'other' ],
                      ordinal: [ 'one', 'two', 'few', 'other' ] };
> parse(msg)
[ { type: 'plural',
    arg: 'words',
    offset: 0,
    cases:
     [ { key: 'zero', tokens: [ 'No words' ] },
       { key: 'one', tokens: [ 'One word' ] },
       { key: 'other', tokens: [ { type: 'octothorpe' }, ' words' ] } ] } ]

> parse(msg, englishKeys)
// Error: Invalid key `zero` for argument `words`. Valid plural keys for this
//        locale are `one`, `other`, and explicit keys like `=0`.

Keywords

icu

FAQs

Package last updated on 03 Jul 2017

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.