@unisnips/ultisnips
Version:
Utilities for converting ultisnips in unisnips project
160 lines • 6.39 kB
JavaScript
;
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