UNPKG

monaca-lib

Version:

Monaca cloud API bindings for JavaScript

146 lines (130 loc) 4.09 kB
// Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @constructor * @param {!CodeMirror} codeMirror * @param {string=} additionalWordChars */ WebInspector.CodeMirrorDictionary = function(codeMirror, additionalWordChars) { this._codeMirror = codeMirror; this._additionalWordChars = new Set(additionalWordChars); this._dictionary = new WebInspector.TextDictionary(); this._addText(this._codeMirror.getValue()); this._changes = this._changes.bind(this); this._beforeChange = this._beforeChange.bind(this); this._codeMirror.on("beforeChange", this._beforeChange); this._codeMirror.on("changes", this._changes); } WebInspector.CodeMirrorDictionary.prototype = { /** * @param {!CodeMirror} codeMirror * @param {!CodeMirror.BeforeChangeObject} changeObject */ _beforeChange: function(codeMirror, changeObject) { this._updatedLines = this._updatedLines || {}; for (var i = changeObject.from.line; i <= changeObject.to.line; ++i) this._updatedLines[i] = this._codeMirror.getLine(i); }, /** * @param {!CodeMirror} codeMirror * @param {!Array.<!CodeMirror.ChangeObject>} changes */ _changes: function(codeMirror, changes) { if (!changes.length || !this._updatedLines) return; for (var lineNumber in this._updatedLines) this._removeText(this._updatedLines[lineNumber]); delete this._updatedLines; var linesToUpdate = {}; for (var changeIndex = 0; changeIndex < changes.length; ++changeIndex) { var changeObject = changes[changeIndex]; var editInfo = WebInspector.CodeMirrorUtils.changeObjectToEditOperation(changeObject); for (var i = editInfo.newRange.startLine; i <= editInfo.newRange.endLine; ++i) linesToUpdate[i] = this._codeMirror.getLine(i); } for (var lineNumber in linesToUpdate) this._addText(linesToUpdate[lineNumber]); }, /** * @param {string} word * @return {boolean} */ _validWord: function(word) { return !!word.length && (word[0] < '0' || word[0] > '9'); }, /** * @param {string} text */ _addText: function(text) { WebInspector.TextUtils.textToWords(text, this.isWordChar.bind(this), addWord.bind(this)); /** * @param {string} word * @this {WebInspector.CodeMirrorDictionary} */ function addWord(word) { if (this._validWord(word)) this._dictionary.addWord(word); } }, /** * @param {string} text */ _removeText: function(text) { WebInspector.TextUtils.textToWords(text, this.isWordChar.bind(this), removeWord.bind(this)); /** * @param {string} word * @this {WebInspector.CodeMirrorDictionary} */ function removeWord(word) { if (this._validWord(word)) this._dictionary.removeWord(word); } }, /** * @param {string} char * @return {boolean} */ isWordChar: function(char) { return WebInspector.TextUtils.isWordChar(char) || this._additionalWordChars.has(char); }, /** * @param {string} prefix * @return {!Array.<string>} */ wordsWithPrefix: function(prefix) { return this._dictionary.wordsWithPrefix(prefix); }, /** * @param {string} word * @return {boolean} */ hasWord: function(word) { return this._dictionary.hasWord(word); }, /** * @param {string} word * @return {number} */ wordCount: function(word) { return this._dictionary.wordCount(word); }, dispose: function() { this._codeMirror.off("beforeChange", this._beforeChange); this._codeMirror.off("changes", this._changes); this._dictionary.reset(); }, }