Comparing version 1.9.8 to 1.10.0
@@ -5,3 +5,3 @@ export * from './Settings'; | ||
export { mergeSettings, readSettings, readSettingsFiles, defaultFileName as defaultSettingsFilename, clearCachedFiles as clearCachedSettings, calcOverrideSettings } from './Settings'; | ||
export { SpellingDictionary, createSpellingDictionary, createSpellingDictionaryRx, getDictionary } from './SpellingDictionary'; | ||
export { SpellingDictionary, createSpellingDictionary, createSpellingDictionaryRx, getDictionary, SuggestionResult, SuggestionCollector } from './SpellingDictionary'; | ||
export { getDefaultSettings, getGlobalSettings } from './Settings'; | ||
@@ -8,0 +8,0 @@ export { combineTextAndLanguageSettings } from './Settings/TextDocumentSettings'; |
@@ -15,8 +15,8 @@ "use strict"; | ||
function getDictionary(settings) { | ||
const { words = [], userWords = [], dictionaries = [], dictionaryDefinitions = [] } = settings; | ||
const { words = [], userWords = [], dictionaries = [], dictionaryDefinitions = [], flagWords = [] } = settings; | ||
const spellDictionaries = loadDictionaries(dictionaries, dictionaryDefinitions); | ||
const settingsDictionary = Promise.resolve(SpellingDictionary_1.createSpellingDictionary(words.concat(userWords), 'user_words')); | ||
return SpellingDictionaryCollection_1.createCollectionP([...spellDictionaries, settingsDictionary], 'dictionary collection'); | ||
return SpellingDictionaryCollection_1.createCollectionP([...spellDictionaries, settingsDictionary], 'dictionary collection', flagWords); | ||
} | ||
exports.getDictionary = getDictionary; | ||
//# sourceMappingURL=Dictionaries.js.map |
import * as Rx from 'rxjs/Rx'; | ||
import { IterableLike } from '../util/IterableLike'; | ||
import { Trie } from 'cspell-trie'; | ||
import { Trie, SuggestionCollector, SuggestionResult } from 'cspell-trie'; | ||
import { ReplaceMap } from '../util/repMap'; | ||
export interface SuggestionResult { | ||
word: string; | ||
cost: number; | ||
} | ||
export { SuggestionCollector, suggestionCollector, SuggestionResult } from 'cspell-trie'; | ||
export declare type FilterSuggestionsPredicate = (word: SuggestionResult) => boolean; | ||
export interface SpellingDictionary { | ||
@@ -13,2 +11,3 @@ readonly name: string; | ||
suggest(word: string, numSuggestions?: number): SuggestionResult[]; | ||
genSuggestions(collector: SuggestionCollector): void; | ||
mapWord(word: string): string; | ||
@@ -31,2 +30,3 @@ readonly size: number; | ||
suggest(word: string, numSuggestions?: number): SuggestionResult[]; | ||
genSuggestions(collector: SuggestionCollector): void; | ||
readonly size: number; | ||
@@ -49,3 +49,4 @@ } | ||
suggest(word: string, numSuggestions?: number): SuggestionResult[]; | ||
genSuggestions(collector: SuggestionCollector): void; | ||
} | ||
export declare function createSpellingDictionaryTrie(data: Rx.Observable<string>, name: string, options?: SpellingDictionaryOptions): Promise<SpellingDictionary>; |
@@ -6,2 +6,4 @@ "use strict"; | ||
const repMap_1 = require("../util/repMap"); | ||
var cspell_trie_2 = require("cspell-trie"); | ||
exports.suggestionCollector = cspell_trie_2.suggestionCollector; | ||
const defaultSuggestions = 10; | ||
@@ -27,2 +29,5 @@ class SpellingDictionaryFromSet { | ||
} | ||
genSuggestions(collector) { | ||
this.trie.genSuggestions(collector); | ||
} | ||
get size() { | ||
@@ -98,2 +103,5 @@ return this.words.size; | ||
} | ||
genSuggestions(collector) { | ||
this.trie.genSuggestions(collector); | ||
} | ||
} | ||
@@ -100,0 +108,0 @@ SpellingDictionaryFromTrie.unknownWordsLimit = 1000; |
@@ -1,2 +0,2 @@ | ||
import { SpellingDictionary, SuggestionResult } from './SpellingDictionary'; | ||
import { SpellingDictionary, SuggestionResult, SuggestionCollector } from './SpellingDictionary'; | ||
export declare class SpellingDictionaryCollection implements SpellingDictionary { | ||
@@ -7,10 +7,11 @@ readonly dictionaries: SpellingDictionary[]; | ||
readonly mapWord: (word: string) => string; | ||
constructor(dictionaries: SpellingDictionary[], name: string); | ||
readonly wordsToFlag: Set<string>; | ||
constructor(dictionaries: SpellingDictionary[], name: string, wordsToFlag: string[]); | ||
has(word: string): boolean; | ||
suggest(word: string, numSuggestions: number): SuggestionResult[]; | ||
readonly size: number; | ||
genSuggestions(collector: SuggestionCollector): SuggestionCollector; | ||
} | ||
export declare function createCollection(dictionaries: SpellingDictionary[], name: string): SpellingDictionaryCollection; | ||
export declare function createCollection(dictionaries: SpellingDictionary[], name: string, wordsToFlag?: string[]): SpellingDictionaryCollection; | ||
export declare function isWordInAnyDictionary(dicts: SpellingDictionary[], word: string): boolean; | ||
export declare function makeSuggestions(dicts: SpellingDictionary[], word: string, numSuggestions: number): SuggestionResult[]; | ||
export declare function createCollectionP(dicts: Promise<SpellingDictionary>[], name: string): Promise<SpellingDictionaryCollection>; | ||
export declare function createCollectionP(dicts: Promise<SpellingDictionary>[], name: string, wordsToFlag: string[]): Promise<SpellingDictionaryCollection>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const SpellingDictionary_1 = require("./SpellingDictionary"); | ||
const gensequence_1 = require("gensequence"); | ||
class SpellingDictionaryCollection { | ||
constructor(dictionaries, name) { | ||
constructor(dictionaries, name, wordsToFlag) { | ||
this.dictionaries = dictionaries; | ||
@@ -11,8 +12,11 @@ this.name = name; | ||
this.dictionaries = this.dictionaries.filter(a => !!a.size); | ||
this.wordsToFlag = new Set(wordsToFlag.map(w => w.toLowerCase())); | ||
} | ||
has(word) { | ||
return isWordInAnyDictionary(this.dictionaries, word); | ||
word = word.toLowerCase(); | ||
return !this.wordsToFlag.has(word) && isWordInAnyDictionary(this.dictionaries, word); | ||
} | ||
suggest(word, numSuggestions) { | ||
return makeSuggestions(this.dictionaries, word, numSuggestions); | ||
const collector = this.genSuggestions(SpellingDictionary_1.suggestionCollector(word, numSuggestions, word => !this.wordsToFlag.has(word))); | ||
return collector.suggestions; | ||
} | ||
@@ -22,6 +26,10 @@ get size() { | ||
} | ||
genSuggestions(collector) { | ||
this.dictionaries.forEach(dict => dict.genSuggestions(collector)); | ||
return collector; | ||
} | ||
} | ||
exports.SpellingDictionaryCollection = SpellingDictionaryCollection; | ||
function createCollection(dictionaries, name) { | ||
return new SpellingDictionaryCollection(dictionaries, name); | ||
function createCollection(dictionaries, name, wordsToFlag = []) { | ||
return new SpellingDictionaryCollection(dictionaries, name, wordsToFlag); | ||
} | ||
@@ -34,22 +42,7 @@ exports.createCollection = createCollection; | ||
exports.isWordInAnyDictionary = isWordInAnyDictionary; | ||
function makeSuggestions(dicts, word, numSuggestions) { | ||
// Make a map of the unique suggestions. If there are duplicates, keep the lowest cost. | ||
const allSuggestions = gensequence_1.genSequence(dicts) | ||
.concatMap(dict => dict.suggest(word, numSuggestions)) | ||
.reduceToSequence((map, sug) => { | ||
const cost = Math.min(sug.cost, (map.get(sug.word) || sug).cost); | ||
map.set(sug.word, Object.assign({}, sug, { cost })); | ||
return map; | ||
}, new Map()) | ||
.map(([, v]) => v) | ||
.toArray() | ||
.sort((a, b) => a.cost - b.cost); | ||
return allSuggestions.slice(0, numSuggestions); | ||
} | ||
exports.makeSuggestions = makeSuggestions; | ||
function createCollectionP(dicts, name) { | ||
function createCollectionP(dicts, name, wordsToFlag) { | ||
return Promise.all(dicts) | ||
.then(dicts => new SpellingDictionaryCollection(dicts, name)); | ||
.then(dicts => new SpellingDictionaryCollection(dicts, name, wordsToFlag)); | ||
} | ||
exports.createCollectionP = createCollectionP; | ||
//# sourceMappingURL=SpellingDictionaryCollection.js.map |
@@ -17,5 +17,6 @@ "use strict"; | ||
]; | ||
const dictCollection = new SpellingDictionaryCollection_1.SpellingDictionaryCollection(dicts, 'test'); | ||
const dictCollection = new SpellingDictionaryCollection_1.SpellingDictionaryCollection(dicts, 'test', ['Avocado']); | ||
chai_1.expect(dictCollection.has('mango')).to.be.true; | ||
chai_1.expect(dictCollection.has('tree')).to.be.false; | ||
chai_1.expect(dictCollection.has('avocado')).to.be.false; | ||
chai_1.expect(dictCollection.size).to.be.equal(wordsA.length + wordsB.length + wordsC.length); | ||
@@ -30,3 +31,3 @@ }); | ||
]; | ||
const dictCollection = SpellingDictionaryCollection_1.createCollection(dicts, 'test'); | ||
const dictCollection = SpellingDictionaryCollection_1.createCollection(dicts, 'test', ['Avocado']); | ||
const sugsForTango = dictCollection.suggest('tango', 10); | ||
@@ -38,2 +39,13 @@ chai_1.expect(sugsForTango).to.be.not.empty; | ||
}); | ||
it('checks for suggestions with flagged words', () => { | ||
const dicts = [ | ||
SpellingDictionary_1.createSpellingDictionary(wordsA, 'wordsA'), | ||
SpellingDictionary_1.createSpellingDictionary(wordsB, 'wordsB'), | ||
SpellingDictionary_1.createSpellingDictionary(wordsA, 'wordsA'), | ||
SpellingDictionary_1.createSpellingDictionary(wordsC, 'wordsC'), | ||
]; | ||
const dictCollection = SpellingDictionaryCollection_1.createCollection(dicts, 'test', ['Avocado']); | ||
const sugs = dictCollection.suggest('avocado', 10); | ||
chai_1.expect(sugs.map(r => r.word)).to.be.not.contain('avocado'); | ||
}); | ||
it('checks for suggestions from mixed sources', () => { | ||
@@ -46,3 +58,3 @@ return Promise.all([ | ||
.then(dicts => { | ||
const dictCollection = new SpellingDictionaryCollection_1.SpellingDictionaryCollection(dicts, 'test'); | ||
const dictCollection = new SpellingDictionaryCollection_1.SpellingDictionaryCollection(dicts, 'test', []); | ||
chai_1.expect(dictCollection.has('mango')); | ||
@@ -69,3 +81,3 @@ chai_1.expect(dictCollection.has('lion')); | ||
]; | ||
return SpellingDictionaryCollection_1.createCollectionP(dicts, 'test').then(dictCollection => { | ||
return SpellingDictionaryCollection_1.createCollectionP(dicts, 'test', []).then(dictCollection => { | ||
chai_1.expect(dictCollection.has('mango')).to.be.true; | ||
@@ -72,0 +84,0 @@ chai_1.expect(dictCollection.has('tree')).to.be.false; |
@@ -108,3 +108,3 @@ "use strict"; | ||
]; | ||
return new SpellingDictionary_1.SpellingDictionaryCollection(dicts, 'collection'); | ||
return SpellingDictionary_1.createCollection(dicts, 'collection'); | ||
} | ||
@@ -111,0 +111,0 @@ const colors = ['red', 'green', 'blue', 'black', 'white', 'orange', 'purple', 'yellow', 'gray', 'brown']; |
{ | ||
"name": "cspell", | ||
"version": "1.9.8", | ||
"version": "1.10.0", | ||
"description": "A Spelling Checker for Code!", | ||
@@ -91,6 +91,6 @@ "main": "dist/index.js", | ||
"cspell-dict-en_us": "^1.1.4", | ||
"cspell-dict-golang": "^1.1.1", | ||
"cspell-dict-golang": "^1.1.2", | ||
"cspell-dict-python": "^1.0.2", | ||
"cspell-lib": "^1.0.2", | ||
"cspell-trie": "^1.5.1", | ||
"cspell-trie": "^1.6.1", | ||
"fs-extra": "^3.0.0", | ||
@@ -97,0 +97,0 @@ "gensequence": "^2.1.1", |
@@ -12,3 +12,10 @@ export * from './Settings'; | ||
} from './Settings'; | ||
export { SpellingDictionary, createSpellingDictionary, createSpellingDictionaryRx, getDictionary } from './SpellingDictionary'; | ||
export { | ||
SpellingDictionary, | ||
createSpellingDictionary, | ||
createSpellingDictionaryRx, | ||
getDictionary, | ||
SuggestionResult, | ||
SuggestionCollector | ||
} from './SpellingDictionary'; | ||
export { getDefaultSettings, getGlobalSettings } from './Settings'; | ||
@@ -15,0 +22,0 @@ export { combineTextAndLanguageSettings } from './Settings/TextDocumentSettings'; |
@@ -17,6 +17,6 @@ import { DictionaryDefinition, DictionaryId, CSpellUserSettings } from '../Settings'; | ||
export function getDictionary(settings: CSpellUserSettings): Promise<SpellingDictionary> { | ||
const { words = [], userWords = [], dictionaries = [], dictionaryDefinitions = [] } = settings; | ||
const { words = [], userWords = [], dictionaries = [], dictionaryDefinitions = [], flagWords = [] } = settings; | ||
const spellDictionaries = loadDictionaries(dictionaries, dictionaryDefinitions); | ||
const settingsDictionary = Promise.resolve(createSpellingDictionary(words.concat(userWords), 'user_words')); | ||
return createCollectionP([...spellDictionaries, settingsDictionary], 'dictionary collection'); | ||
return createCollectionP([...spellDictionaries, settingsDictionary], 'dictionary collection', flagWords); | ||
} |
import { genSequence } from 'gensequence'; | ||
import * as Rx from 'rxjs/Rx'; | ||
import { IterableLike } from '../util/IterableLike'; | ||
import {Trie, importTrieRx} from 'cspell-trie'; | ||
import {Trie, importTrieRx, SuggestionCollector, SuggestionResult} from 'cspell-trie'; | ||
import {ReplaceMap, createMapper} from '../util/repMap'; | ||
export interface SuggestionResult { | ||
word: string; | ||
cost: number; | ||
} | ||
export {SuggestionCollector, suggestionCollector, SuggestionResult } from 'cspell-trie'; | ||
export type FilterSuggestionsPredicate = (word: SuggestionResult) => boolean; | ||
export interface SpellingDictionary { | ||
@@ -16,2 +15,3 @@ readonly name: string; | ||
suggest(word: string, numSuggestions?: number): SuggestionResult[]; | ||
genSuggestions(collector: SuggestionCollector): void; | ||
mapWord(word: string): string; | ||
@@ -51,2 +51,6 @@ readonly size: number; | ||
public genSuggestions(collector: SuggestionCollector): void { | ||
this.trie.genSuggestions(collector); | ||
} | ||
public get size() { | ||
@@ -75,4 +79,2 @@ return this.words.size; | ||
export class SpellingDictionaryFromTrie implements SpellingDictionary { | ||
@@ -129,2 +131,6 @@ static readonly unknownWordsLimit = 1000; | ||
} | ||
public genSuggestions(collector: SuggestionCollector): void { | ||
this.trie.genSuggestions(collector); | ||
} | ||
} | ||
@@ -131,0 +137,0 @@ |
@@ -17,5 +17,6 @@ import { expect } from 'chai'; | ||
const dictCollection = new SpellingDictionaryCollection(dicts, 'test'); | ||
const dictCollection = new SpellingDictionaryCollection(dicts, 'test', ['Avocado']); | ||
expect(dictCollection.has('mango')).to.be.true; | ||
expect(dictCollection.has('tree')).to.be.false; | ||
expect(dictCollection.has('avocado')).to.be.false; | ||
expect(dictCollection.size).to.be.equal(wordsA.length + wordsB.length + wordsC.length); | ||
@@ -32,3 +33,3 @@ }); | ||
const dictCollection = createCollection(dicts, 'test'); | ||
const dictCollection = createCollection(dicts, 'test', ['Avocado']); | ||
const sugsForTango = dictCollection.suggest('tango', 10); | ||
@@ -41,3 +42,15 @@ expect(sugsForTango).to.be.not.empty; | ||
it('checks for suggestions with flagged words', () => { | ||
const dicts = [ | ||
createSpellingDictionary(wordsA, 'wordsA'), | ||
createSpellingDictionary(wordsB, 'wordsB'), | ||
createSpellingDictionary(wordsA, 'wordsA'), | ||
createSpellingDictionary(wordsC, 'wordsC'), | ||
]; | ||
const dictCollection = createCollection(dicts, 'test', ['Avocado']); | ||
const sugs = dictCollection.suggest('avocado', 10); | ||
expect(sugs.map(r => r.word)).to.be.not.contain('avocado'); | ||
}); | ||
it('checks for suggestions from mixed sources', () => { | ||
@@ -50,3 +63,3 @@ return Promise.all([ | ||
.then(dicts => { | ||
const dictCollection = new SpellingDictionaryCollection(dicts, 'test'); | ||
const dictCollection = new SpellingDictionaryCollection(dicts, 'test', []); | ||
expect(dictCollection.has('mango')); | ||
@@ -77,3 +90,3 @@ expect(dictCollection.has('lion')); | ||
return createCollectionP(dicts, 'test').then(dictCollection => { | ||
return createCollectionP(dicts, 'test', []).then(dictCollection => { | ||
expect(dictCollection.has('mango')).to.be.true; | ||
@@ -80,0 +93,0 @@ expect(dictCollection.has('tree')).to.be.false; |
@@ -1,2 +0,2 @@ | ||
import { SpellingDictionary, SuggestionResult } from './SpellingDictionary'; | ||
import { SpellingDictionary, SuggestionResult, SuggestionCollector, suggestionCollector } from './SpellingDictionary'; | ||
import { genSequence } from 'gensequence'; | ||
@@ -7,12 +7,20 @@ | ||
readonly mapWord = (word: string) => word; | ||
constructor(readonly dictionaries: SpellingDictionary[], readonly name: string) { | ||
readonly wordsToFlag: Set<string>; | ||
constructor( | ||
readonly dictionaries: SpellingDictionary[], | ||
readonly name: string, | ||
wordsToFlag: string[], | ||
) { | ||
this.dictionaries = this.dictionaries.filter(a => !!a.size); | ||
this.wordsToFlag = new Set(wordsToFlag.map(w => w.toLowerCase())); | ||
} | ||
public has(word: string) { | ||
return isWordInAnyDictionary(this.dictionaries, word); | ||
word = word.toLowerCase(); | ||
return !this.wordsToFlag.has(word) && isWordInAnyDictionary(this.dictionaries, word); | ||
} | ||
public suggest(word: string, numSuggestions: number) { | ||
return makeSuggestions(this.dictionaries, word, numSuggestions); | ||
public suggest(word: string, numSuggestions: number): SuggestionResult[] { | ||
const collector = this.genSuggestions(suggestionCollector(word, numSuggestions, word => !this.wordsToFlag.has(word) )); | ||
return collector.suggestions; | ||
} | ||
@@ -23,6 +31,11 @@ | ||
} | ||
public genSuggestions(collector: SuggestionCollector): SuggestionCollector { | ||
this.dictionaries.forEach(dict => dict.genSuggestions(collector)); | ||
return collector; | ||
} | ||
} | ||
export function createCollection(dictionaries: SpellingDictionary[], name: string) { | ||
return new SpellingDictionaryCollection(dictionaries, name); | ||
export function createCollection(dictionaries: SpellingDictionary[], name: string, wordsToFlag: string[] = []) { | ||
return new SpellingDictionaryCollection(dictionaries, name, wordsToFlag); | ||
} | ||
@@ -35,23 +48,9 @@ | ||
export function makeSuggestions(dicts: SpellingDictionary[], word: string, numSuggestions: number) { | ||
// Make a map of the unique suggestions. If there are duplicates, keep the lowest cost. | ||
const allSuggestions = genSequence(dicts) | ||
.concatMap(dict => dict.suggest(word, numSuggestions)) | ||
.reduceToSequence<[string, SuggestionResult], Map<string, SuggestionResult>>((map, sug) => { | ||
const cost = Math.min(sug.cost, (map.get(sug.word) || sug).cost); | ||
map.set(sug.word, { ...sug, cost }); | ||
return map; | ||
}, new Map<string, SuggestionResult>()) | ||
// Convert the [k, v] to the v | ||
.map(([, v]) => v) | ||
.toArray() | ||
.sort((a, b) => a.cost - b.cost); | ||
return allSuggestions.slice(0, numSuggestions); | ||
} | ||
export function createCollectionP(dicts: Promise<SpellingDictionary>[], name: string): Promise<SpellingDictionaryCollection> { | ||
export function createCollectionP( | ||
dicts: Promise<SpellingDictionary>[], | ||
name: string, | ||
wordsToFlag: string[], | ||
): Promise<SpellingDictionaryCollection> { | ||
return Promise.all(dicts) | ||
.then(dicts => new SpellingDictionaryCollection(dicts, name)); | ||
.then(dicts => new SpellingDictionaryCollection(dicts, name, wordsToFlag)); | ||
} |
import { expect } from 'chai'; | ||
import { wordSplitter, validateText, hasWordCheck } from './textValidator'; | ||
import { SpellingDictionaryCollection } from './SpellingDictionary'; | ||
import { createCollection } from './SpellingDictionary'; | ||
import { createSpellingDictionary } from './SpellingDictionary'; | ||
@@ -120,3 +120,3 @@ import { FreqCounter } from './util/FreqCounter'; | ||
return new SpellingDictionaryCollection(dicts, 'collection'); | ||
return createCollection(dicts, 'collection'); | ||
} | ||
@@ -123,0 +123,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
647882
7711
Updatedcspell-dict-golang@^1.1.2
Updatedcspell-trie@^1.6.1