fix(spellchecker): Preliminary Linux support

The Linux component of Atom's spellchecker depends on Hunspell for
corrections. It requires a dictionary to be set, unlike Mac OS X
and Windows that have spellcheckers built in to the OS, and they
have the dictionaries built-in as well. This commit uses Atom's
spellchecker default dictionary method (which I wish was a public
API) to reset the dictionary to its default setting. It also ignores
the dictionaries available command for the Linux platform, which
seems to always return an empty Array.
This commit is contained in:
mbilker 2015-12-10 23:37:54 -05:00 committed by Evan Morikawa
parent fedb4197f8
commit 44fccfb54f

View file

@ -1,3 +1,5 @@
path = require('path')
spellchecker = require('spellchecker') spellchecker = require('spellchecker')
class NylasSpellchecker class NylasSpellchecker
@ -14,9 +16,9 @@ class NylasSpellchecker
isSpelledCorrectly: (args...) => not @isMisspelled(args...) isSpelledCorrectly: (args...) => not @isMisspelled(args...)
setLanguage: (lang="") -> setLanguage: (lang="", dict=@_getDictionaryPath()) ->
@languageAvailable = @isLanguageAvailable(lang) @languageAvailable = @isLanguageAvailable(lang)
if @languageAvailable if @languageAvailable or process.platform is 'linux'
spellCheck = @isSpelledCorrectly spellCheck = @isSpelledCorrectly
else else
spellCheck = -> true spellCheck = -> true
@ -26,26 +28,41 @@ class NylasSpellchecker
if lang.length is 0 then lang = "en-US" if lang.length is 0 then lang = "en-US"
@_setWebframeSpellchecker(lang, spellCheck) @_setWebframeSpellchecker(lang, spellCheck)
spellchecker.setDictionary(lang) spellchecker.setDictionary(lang, dict)
# Separate method for testing # Separate method for testing
_setWebframeSpellchecker: (lang, spellCheck) -> _setWebframeSpellchecker: (lang, spellCheck) ->
require('web-frame').setSpellCheckProvider(lang, false, {spellCheck}) require('web-frame').setSpellCheckProvider(lang, false, {spellCheck})
# node-spellchecker's method for resolving the builtin hunspell dictionaries for Linux
# (From https://github.com/atom/node-spellchecker/blob/master/lib/spellchecker.js#L50-L61)
_getDictionaryPath: ->
dict = path.join(require.resolve('spellchecker'), '..', '..', 'vendor', 'hunspell_dictionaries')
try
# HACK: Special case being in an asar archive
unpacked = dict.replace('.asar' + path.sep, '.asar.unpacked' + path.sep);
if require('fs').statSyncNoException(unpacked)
dict = unpacked;
catch
dict
#### spellchecker methods #### #### spellchecker methods ####
setDictionary: (lang) => @setLanguage(lang) setDictionary: (lang, dict) => @setLanguage(lang, dict)
add: spellchecker.add add: spellchecker.add
isMisspelled: (text) => isMisspelled: (text) =>
if @languageAvailable then spellchecker.isMisspelled(text) if @languageAvailable or process.platform is 'linux'
else return false spellchecker.isMisspelled(text)
else
return false
getAvailableDictionaries: -> getAvailableDictionaries: ->
spellchecker.getAvailableDictionaries() ? [] spellchecker.getAvailableDictionaries() ? []
getCorrectionsForMisspelling: (args...) => getCorrectionsForMisspelling: (args...) =>
if @languageAvailable if @languageAvailable or process.platform is 'linux'
spellchecker.getCorrectionsForMisspelling(args...) spellchecker.getCorrectionsForMisspelling(args...)
else return [] else return []