UNPKG

@unisnips/ultisnips

Version:

Utilities for converting ultisnips in unisnips project

160 lines 6.39 kB
"use strict"; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); var position_1 = require("../util/position"); var tokenizer_1 = require("./tokenizer"); var marker_1 = require("../marker"); /** * Turns 'text' into a stream of tokens and creates the text objects from * those tokens that are mentioned in 'tokenMarkerMap' assuming the * current 'indent' * * The 'allowedTokensInText' define which tokens will be recognized * in 'text' while 'allowedTokensInTabstops' are the tokens that * will be recognized in TabStop placeholder text. */ function tokenizeSnippetText(snippetInstance, text, indent, allowedTokensInText, allowedTokensInTabstops, tokenMarkerMap) { var pairs = []; var seenTabstops = {}; var doParse = function (parent, innerText, allowedTokens) { var e_1, _a; // newStart is different with UltiSnips, // coz we are focusing on parsing rather than editing, // so we tend to keep track of original position, // but UltiSnips treat `text_object.start` as the position in interpreted text during editing var newStart = parent.start.add(new position_1.TextPosition(0, parent.innerContentOffset)); newStart.offset = (parent.start.offset || 0) + parent.innerContentOffset; var tokens = tokenizer_1.tokenize(innerText, indent, newStart, allowedTokens); try { for (var tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next(); !tokens_1_1.done; tokens_1_1 = tokens_1.next()) { var token = tokens_1_1.value; var item = { parent: parent, token: token, marker: null }; pairs.push(item); if (token instanceof tokenizer_1.TabStopToken) { var ts = new marker_1.TabStop({ parent: parent, token: token }); item.marker = ts; seenTabstops[token.number] = ts; if (ts.initialText) { doParse(ts, ts.initialText, allowedTokensInTabstops); } } else if (tokenMarkerMap) { var ctor = tokenMarkerMap.get(token.constructor); if (ctor) { item.marker = new ctor({ parent: parent, token: token }); } } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1); } finally { if (e_1) throw e_1.error; } } }; doParse(snippetInstance, text, allowedTokensInText); // console.log('pairs', pairs, seenTabstops) return { pairs: pairs, seenTabstops: seenTabstops, }; } exports.tokenizeSnippetText = tokenizeSnippetText; var ALLOWED_TOKENS = [ tokenizer_1.EscapeCharToken, tokenizer_1.UniSnipsVariableToken, tokenizer_1.VisualToken, tokenizer_1.TabStopToken, tokenizer_1.MirrorToken, tokenizer_1.ScriptCodeToken, ]; function definitionToSnippetInstance(snip) { var position = snip.position; // SnippetInstance's start and end should be relative to snip.body, // so we should remove snippet head and end var start = position.start ? position_1.TextPosition.fromUnistPoint(position.start) : null; if (position.start) { start.line += 1; } var end = position.end ? position_1.TextPosition.fromUnistPoint(position.end) : null; if (position.end) { var bodyContents = snip.body.split('\n'); var bodyLastLine = bodyContents[bodyContents.length - 1]; end.line -= 1; end.column = bodyLastLine.length; } var snipInstance = new marker_1.SnippetInstance({ parent: null, start: start, end: end, }); return snipInstance; } var TOKEN_MARKER_PAIRS = [ [tokenizer_1.VisualToken, marker_1.Visual], [tokenizer_1.MirrorToken, marker_1.Mirror], [tokenizer_1.TabStopToken, marker_1.TabStop], [tokenizer_1.ScriptCodeToken, marker_1.ScriptCode], [tokenizer_1.UniSnipsVariableToken, marker_1.UniSnipsVariable], ]; var TOKEN_MARKER_MAP = new Map(); TOKEN_MARKER_PAIRS.forEach(function (_a) { var _b = __read(_a, 2), tokenCls = _b[0], markerCls = _b[1]; TOKEN_MARKER_MAP.set(tokenCls, markerCls); }); /** * WIP: won't need ultisnips text objects by now * @private */ function parseUltiSnips(snip) { var snipInstance = definitionToSnippetInstance(snip); var result = tokenizeSnippetText(snipInstance, snip.body, snipInstance.start, ALLOWED_TOKENS, ALLOWED_TOKENS, TOKEN_MARKER_MAP); return result; } exports.parseUltiSnips = parseUltiSnips; function parseUltiSnipsTokens(snip) { var snipInstance = definitionToSnippetInstance(snip); var result = tokenizeSnippetText(snipInstance, snip.body, snipInstance.start, ALLOWED_TOKENS, ALLOWED_TOKENS); // result.pairs.forEach((pair: ResultPair) => { // const { token, parent } = pair // if (token instanceof TabStop) { // if (token && parent.token) { // token.parent = parent.token // } // } // // console.log(null, null, parent) // }) var tokens = result.pairs.map(function (item) { return item.token; }); // console.log('tokens', tokens) return tokens; } exports.parseUltiSnipsTokens = parseUltiSnipsTokens; //# sourceMappingURL=ultisnips.js.map