forked from phcode-dev/phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTokenUtils.js
More file actions
1 lines (1 loc) · 2.59 KB
/
TokenUtils.js
File metadata and controls
1 lines (1 loc) · 2.59 KB
1
define(function(require,exports,module){var _=require("thirdparty/lodash"),CodeMirror=require("thirdparty/CodeMirror/lib/codemirror"),cache;function _clearCache(cm){cache=null,cm&&cm.off("changes",_clearCache)}function _manageCache(cm,line){if(!cache||!cache.tokens||cache.line!==line||cache.cm!==cm){var tokens=cm.getLineTokens(line,!1);tokens.unshift(cm.getTokenAt({line:line,ch:0},!1)),cache={cm:cm,line:line,timeStamp:Date.now(),tokens:tokens},cm.off("changes",_clearCache),cm.on("changes",_clearCache)}return cache.tokens}function getTokenAt(cm,pos,precise){if(precise)return _clearCache(),cm.getTokenAt(pos,precise);var cachedTokens=_manageCache(cm,pos.line),tokenIndex,token;return cachedTokens[_.sortedIndex(cachedTokens,{end:pos.ch},"end")]||cm.getTokenAt(pos,precise)}function getInitialContext(cm,pos){return{editor:cm,pos:pos,token:cm.getTokenAt(pos,!0)}}function movePrevToken(ctx,precise){if(void 0===precise&&(precise=!0),ctx.pos.ch<=0||ctx.token.start<=0){if(ctx.pos.line<=0)return!1;ctx.pos.line--,ctx.pos.ch=ctx.editor.getLine(ctx.pos.line).length}else ctx.pos.ch=ctx.token.start;return ctx.token=getTokenAt(ctx.editor,ctx.pos,precise),!0}function isAtStart(ctx){return(ctx.pos.ch<=0||ctx.token.start<=0)&&ctx.pos.line<=0}function moveNextToken(ctx,precise){var eol=ctx.editor.getLine(ctx.pos.line).length;if(void 0===precise&&(precise=!0),ctx.pos.ch>=eol||ctx.token.end>=eol){if(ctx.pos.line>=ctx.editor.lineCount()-1)return!1;ctx.pos.line++,ctx.pos.ch=0}else ctx.pos.ch=ctx.token.end+1;return ctx.token=getTokenAt(ctx.editor,ctx.pos,precise),!0}function isAtEnd(ctx){var eol=ctx.editor.getLine(ctx.pos.line).length;return(ctx.pos.ch>=eol||ctx.token.end>=eol)&&ctx.pos.line>=ctx.editor.lineCount()-1}function moveSkippingWhitespace(moveFxn,ctx){if(!moveFxn(ctx))return!1;for(;!ctx.token.type&&!/\S/.test(ctx.token.string);)if(!moveFxn(ctx))return!1;return!0}function offsetInToken(ctx){var offset=ctx.pos.ch-ctx.token.start;return offset<0&&console.log("CodeHintUtils: _offsetInToken - Invalid context: pos not in the current token!"),offset}function getModeAt(cm,pos,precise){precise=precise||!0;var modeData=cm.getMode(),name;return modeData.innerMode&&(modeData=CodeMirror.innerMode(modeData,getTokenAt(cm,pos,precise).state).mode),{mode:modeData,name:name="xml"===modeData.name?modeData.configuration:modeData.name}}exports.getTokenAt=getTokenAt,exports.movePrevToken=movePrevToken,exports.moveNextToken=moveNextToken,exports.isAtStart=isAtStart,exports.isAtEnd=isAtEnd,exports.moveSkippingWhitespace=moveSkippingWhitespace,exports.getInitialContext=getInitialContext,exports.offsetInToken=offsetInToken,exports.getModeAt=getModeAt});