Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

nspell

wooorm95.6kMIT2.1.5TypeScript support: definitely-typed

Hunspell compatible spell checker

spell, spellcheck, spellchecker, spell check, spell checker, check, spelling, myspell, hunspell

readme

nspell

Travis Coverage Downloads Size

Hunspell-like spell-checker in plain-vanilla JavaScript.

nspell contains most of the essential core of Hunspell. It does not contain a tokeniser but leaves many details up to implementors. The main difference, conceptually, is that Hunspell is based on the user and their preferences, whereas nspell is based on explicitly passed in options, thus producing the same results regardless of OS, file system, or environment.

Contents

Install

npm:

npm install nspell

You probably also want to install some dictionaries:

npm install dictionary-en

Use

var dictionary = require('dictionary-en')
var nspell = require('nspell')

dictionary(ondictionary)

function ondictionary(err, dict) {
  if (err) {
    throw err
  }

  var spell = nspell(dict)

  console.log(spell.correct('colour')) // => false
  console.log(spell.suggest('colour')) // => ['color']
  console.log(spell.correct('color')) // => true
  console.log(spell.correct('npm')) // => false
  spell.add('npm')
  console.log(spell.correct('npm')) // => true
}

API

NSpell(dictionary)

Create a new spell checker. Passing an affix document is required, through any of the below mentioned signatures. nspell is useless without at least one dic passed: make sure to pass one either in the constructor or to nspell#dictionary.

Signatures
  • NSpell(dictionary)
  • NSpell(aff[, dic])
  • NSpell(dictionaries)
Parameters
  • dictionary (Object) — Object with aff (required) and dic (optional) properties
  • aff (Buffer or string) — Affix document to use. Must be in UTF-8 when buffer
  • dic (Buffer or string) — Dictionary document to use. Must be in UTF-8 when buffer
  • dictionaries (Array.<Dictionary>) — List of dictionary objects. The first must have an aff key, other aff keys are ignored
Returns

New instance of NSpell.

NSpell#correct(word)

Check if word is correctly spelled.

Example
spell.correct('color') // => true
spell.correct('html') // => false
spell.correct('abreviation') // => false
Parameters
  • word (string) — Word to check for correct spelling
Returns

boolean — Whether word is correctly spelled.

NSpell#suggest(word)

Suggest correctly spelled words close to word.

Example
spell.suggest('colour') // => ['color']
spell.suggest('color') // => []
spell.suggest('html') // => ['HTML']
spell.suggest('alot') // => ['allot', 'slot', 'clot', …]
Parameters
  • word (string) — Word to suggest spelling corrections for
Returns

Array.<string> — List with zero or more suggestions.

NSpell#spell(word)

Get spelling information for word.

Example
spell.spell('colour') // => {correct: false, forbidden: false, warn: false}
spell.spell('color') // => {correct: true, forbidden: false, warn: false}
Parameters
  • word (string) — Word to check
Returns

Object, with the following properties:

  • correct (boolean) — Whether word is correctly spelled
  • forbidden (boolean) — Whether word is actually correct, but forbidden from showing up as such (often by the users wish)
  • warn (boolean) — Whether word is correct, but should trigger a warning (rarely used in dictionaries)

NSpell#add(word[, model])

Add word to known words. If no model is given, the word will be marked as correct in the future, and will show up in spelling suggestions. If a model is given, word will be handled the same as model.

Example
spell.correct('npm') // => false
spell.suggest('nnpm') // => ['ppm', 'bpm', …]

spell.add('npm')

spell.correct('npm') // => true
spell.suggest('nnpm') // => ['npm']
Parameters
  • word (string) — Word to add
  • model (string, optional) — Known word to model word after
Returns

NSpell — Operated on instance.

NSpell#remove(word)

Remove word from the known words.

Example
spell.correct('color') // => true

spell.remove('color')

spell.correct('color') // => false
Parameters
  • word (string) — Word to add
Returns

NSpell — Operated on instance.

NSpell#wordCharacters()

Get extra word characters defined by the loaded affix file. Most affix files don’t set these, but for example the en dictionary sets 0123456789.

Example
spell.wordCharacters() // => '0123456789'
Returns

string? — Defined word characters, if any.

NSpell#dictionary(dic)

Add an extra dictionary to the spellchecker.

Example
spell.dictionary(
  ['5', 'npm', 'nullish', 'rebase', 'SHA', 'stringification'].join('\n')
)
Parameters
  • dic (Buffer or string) — Dictionary document to use; must be in UTF-8 when buffer
Returns

NSpell — Operated on instance.

Note

The given dic must be designed to work with the already loaded affix. It’s not possible to add dictionary files from different languages together (use two NSpell instances for that).

NSpell#personal(dic)

Add a personal dictionary.

Example
spell.personal(['foo', 'bar/color', '*baz'].join('\n'))
Parameters
  • dic (Buffer or string) — Dictionary document to use; must be in UTF-8 when buffer
Returns

NSpell — Operated on instance.

Note

Lines starting with a * mark a word as forbidden, which results in them being seen as incorrect, and prevents them from showing up in suggestions. Splitting a line in two with a slash, adds the left side and models it after the already known right word.

Dictionaries

nspell supports many parts of Hunspell-style dictionaries. Essentially, the concept of a dictionary consists of one “affix” document, and one or more “dictionary” documents. The documents are tightly linked, so it’s not possible to use a Dutch affix with an English dictionary document.

Below is a short introduction, see hunspell(5) for more information.

Affix documents

Affix documents define the language, keyboard, flags, and much more. For example, a paraphrased Dutch affix document looks as follows:

SET UTF-8

KEY qwertyuiop|asdfghjkl|zxcvbnm|qawsedrftgyhujikolp|azsxdcfvgbhnjmk|aze|qsd|lm|wx|aqz|qws|

WORDCHARS '’0123456789ij.-\/

REP 487
REP e en
REP ji ij
REP u oe
# …

SFX An Y 11
SFX An 0 de d
SFX An 0 fe f
SFX An 0 ge g
# …

Not every option is supported in nspell. See Affix options for a list of all options and which ones are supported.

Dictionary documents

Dictionary documents contain words and flags applying to those words. For example:

3
foo
bar/a
baz/ab

The above document contains three words, as the count on the first line shows. Further lines each start with a word. Some lines contain flags, as denoted by the slashes. What those flags do, and the size of flags, is defined by affix documents.

Personal dictionary documents

Personal dictionaries are not intertwined with affix document. They define new words and words to forbid. For example:

foo
bar/baz
*qux

In the above example, foo is added as a known word; bar is added as well, but modelled after the existing word baz; finally, qux is marked as a forbidden word.

Affix options

The following affix options are known to Hunspell. The checked ones are supported by nspell.

General
  • <input disabled="" type="checkbox"> SET encoding (UTF-8 is implied)
  • <input checked="" disabled="" type="checkbox"> FLAG value
  • <input disabled="" type="checkbox"> COMPLEXPREFIXES
  • <input disabled="" type="checkbox"> LANG langcode
  • <input disabled="" type="checkbox"> IGNORE characters
  • <input disabled="" type="checkbox"> AF number_of_flag_vector_aliases
  • <input disabled="" type="checkbox"> AF flag_vector
  • <input disabled="" type="checkbox"> AF definitions in the affix file:
  • <input disabled="" type="checkbox"> AF flag_vector
Suggestion
  • <input checked="" disabled="" type="checkbox"> KEY characters_separated_by_vertical_line_optionally
  • <input checked="" disabled="" type="checkbox"> TRY characters
  • <input checked="" disabled="" type="checkbox"> NOSUGGEST flag
  • <input disabled="" type="checkbox"> MAXCPDSUGS num
  • <input disabled="" type="checkbox"> MAXNGRAMSUGS num
  • <input disabled="" type="checkbox"> MAXDIFF [0-10]
  • <input disabled="" type="checkbox"> ONLYMAXDIFF
  • <input disabled="" type="checkbox"> NOSPLITSUGS
  • <input disabled="" type="checkbox"> SUGSWITHDOTS
  • <input checked="" disabled="" type="checkbox"> REP number_of_replacement_definitions
  • <input checked="" disabled="" type="checkbox"> REP what replacement
  • <input disabled="" type="checkbox"> MAP number_of_map_definitions
  • <input disabled="" type="checkbox"> MAP string_of_related_chars_or_parenthesized_character_sequences
  • <input disabled="" type="checkbox"> PHONE number_of_phone_definitions
  • <input disabled="" type="checkbox"> PHONE what replacement
  • <input checked="" disabled="" type="checkbox"> WARN flag
  • <input checked="" disabled="" type="checkbox"> FORBIDWARN
Compounding
  • <input disabled="" type="checkbox"> BREAK number_of_break_definitions
  • <input disabled="" type="checkbox"> BREAK character_or_character_sequence
  • <input checked="" disabled="" type="checkbox"> COMPOUNDRULE number_of_compound_definitions
  • <input checked="" disabled="" type="checkbox"> COMPOUNDRULE compound_pattern
  • <input checked="" disabled="" type="checkbox"> COMPOUNDMIN num
  • <input disabled="" type="checkbox"> COMPOUNDFLAG flag
  • <input disabled="" type="checkbox"> COMPOUNDBEGIN flag
  • <input disabled="" type="checkbox"> COMPOUNDLAST flag
  • <input disabled="" type="checkbox"> COMPOUNDMIDDLE flag
  • <input checked="" disabled="" type="checkbox"> ONLYINCOMPOUND flag
  • <input disabled="" type="checkbox"> COMPOUNDPERMITFLAG flag
  • <input disabled="" type="checkbox"> COMPOUNDFORBIDFLAG flag
  • <input disabled="" type="checkbox"> COMPOUNDMORESUFFIXES
  • <input disabled="" type="checkbox"> COMPOUNDROOT flag
  • <input disabled="" type="checkbox"> COMPOUNDWORDMAX number
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDDUP
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDREP
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDCASE
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDTRIPLE
  • <input disabled="" type="checkbox"> SIMPLIFIEDTRIPLE
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDPATTERN number_of_checkcompoundpattern_definitions
  • <input disabled="" type="checkbox"> CHECKCOMPOUNDPATTERN endchars[/flag] beginchars[/flag] [replacement]
  • <input disabled="" type="checkbox"> FORCEUCASE flag
  • <input disabled="" type="checkbox"> COMPOUNDSYLLABLE max_syllable vowels
  • <input disabled="" type="checkbox"> SYLLABLENUM flags
Affix creation
  • <input checked="" disabled="" type="checkbox"> PFX flag cross_product number
  • <input checked="" disabled="" type="checkbox"> PFX flag stripping prefix [condition [morphological_fields…]]
  • <input checked="" disabled="" type="checkbox"> SFX flag cross_product number
  • <input checked="" disabled="" type="checkbox"> SFX flag stripping suffix [condition [morphological_fields…]]
Other
  • <input disabled="" type="checkbox"> CIRCUMFIX flag
  • <input checked="" disabled="" type="checkbox"> FORBIDDENWORD flag
  • <input disabled="" type="checkbox"> FULLSTRIP
  • <input checked="" disabled="" type="checkbox"> KEEPCASE flag
  • <input checked="" disabled="" type="checkbox"> ICONV number_of_ICONV_definitions
  • <input checked="" disabled="" type="checkbox"> ICONV pattern pattern2
  • <input checked="" disabled="" type="checkbox"> OCONV number_of_OCONV_definitions
  • <input checked="" disabled="" type="checkbox"> OCONV pattern pattern2
  • <input disabled="" type="checkbox"> LEMMA_PRESENT flag
  • <input checked="" disabled="" type="checkbox"> NEEDAFFIX flag
  • <input disabled="" type="checkbox"> PSEUDOROOT flag
  • <input disabled="" type="checkbox"> SUBSTANDARD flag
  • <input checked="" disabled="" type="checkbox"> WORDCHARS characters
  • <input disabled="" type="checkbox"> CHECKSHARPS

License

MIT © Titus Wormer

changelog