@unisnips/jetbrains
Version:
Utilities for generating JetBrains live templates in unisnips project
168 lines • 6.01 kB
JavaScript
;
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;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var path_1 = __importDefault(require("path"));
var core_1 = require("@unisnips/core");
var xml_1 = require("./util/xml");
/**
* Map UniSnips variables to jetbrains builtin variable
*/
var UNI_BUILTIN_VARIABLE_JB_MAP = {
UNI_SELECTED_TEXT: '$SELECTION$',
};
function detectVariableReplacements(placeholders) {
var resultPairs = [];
placeholders.forEach(function (placeholder) {
var valueType = placeholder.valueType, variable = placeholder.variable, description = placeholder.description, index = placeholder.index;
var newDesc;
var jbVariable;
if (valueType === 'tabstop') {
if (placeholder.transform) {
console.warn('[jetbrains] placeholder transform is not supported');
}
else {
var vName = "TS_" + index;
newDesc = "$" + vName + "$";
jbVariable = {
name: vName,
defaultValue: (description || '').toString(),
alwaysStopAt: true,
};
}
}
else if (valueType === 'variable') {
if (variable.type === 'builtin') {
var matchedName = UNI_BUILTIN_VARIABLE_JB_MAP[variable.name];
if (matchedName) {
newDesc = matchedName;
jbVariable = {
name: matchedName,
defaultValue: '',
};
}
}
}
else if (valueType === 'script') {
console.warn('[jetbrains] script placeholder is not supported');
}
if (jbVariable) {
var replacement = {
type: 'string',
placeholder: placeholder,
replaceContent: newDesc,
};
resultPairs.push({
variable: jbVariable,
replacement: replacement,
});
}
});
return resultPairs;
}
var JB_LANG_MAP = {
other: 'OTHER',
sh: 'SHELL_SCRIPT',
bash: 'SHELL_SCRIPT',
javascript: 'JAVA_SCRIPT',
typescript: 'TypeScript',
css: 'CSS',
python: 'Python',
xml: 'XML',
html: 'HTML',
sql: 'SQL',
};
/* eslint-disable prettier/prettier */
function snippetItemToXml(item) {
var uniqueVariableMap = {};
if (item.variables) {
item.variables.forEach(function (variable) {
if (variable.name === UNI_BUILTIN_VARIABLE_JB_MAP.UNI_SELECTED_TEXT)
return;
var k = [variable.name, variable.defaultValue, variable.expression].join('_');
if (!uniqueVariableMap[k]) {
uniqueVariableMap[k] = variable;
}
});
}
var variableNodes = Object.values(uniqueVariableMap).map(function (variable) {
return xml_1.makeTag('variable', [
xml_1.attr('name', variable.name),
xml_1.attr('expression', variable.expression),
xml_1.attr('defaultValue', variable.defaultValue),
xml_1.attr('alwaysStopAt', variable.alwaysStopAt),
]);
});
var contextNodes = (item.contexts || []).map(function (contextName) {
return xml_1.makeTag('context', [], [xml_1.makeTag('option', [xml_1.attr('name', contextName), xml_1.attr('value', 'true')])]);
});
var escapedValue = item.value.replace(/\n/g, ' ');
var template = xml_1.makeTag('template', [xml_1.attr('name', item.name), xml_1.attr('description', item.description), xml_1.attr('value', escapedValue)], __spread(variableNodes, contextNodes));
return xml_1.nodeTreeToXml(template);
}
/* eslint-enable prettier/prettier */
exports.generateSnippets = function (defs, opts) {
if (opts === void 0) { opts = {}; }
var segs = [];
var langName;
var groupName = 'unisnips';
if (opts.snippetsFilePath) {
langName = path_1.default.basename(opts.snippetsFilePath).replace(/\..*/, '');
groupName = "unisnips-" + langName;
}
defs.forEach(function (def) {
var pairs = detectVariableReplacements(def.placeholders);
var replacements = pairs.map(function (o) { return o.replacement; });
var variables = [];
pairs.forEach(function (_a) {
var variable = _a.variable;
variables.push(variable);
});
var newBody = core_1.applyReplacements(def, replacements);
var item = {
name: def.trigger,
value: newBody,
description: def.description,
variables: variables,
};
var jbContextName = JB_LANG_MAP.other;
if (langName) {
jbContextName = JB_LANG_MAP[langName];
}
if (jbContextName) {
item.contexts = [jbContextName];
}
segs.push(snippetItemToXml(item));
});
var snippetsContent = segs.join('\n');
var content = [
"<templateSet group=\"" + groupName + "\">",
"" + xml_1.indent(snippetsContent, 2),
'</templateSet>',
].join('\n');
return {
content: content,
};
};
//# sourceMappingURL=generate.js.map