UNPKG

@unisnips/jetbrains

Version:

Utilities for generating JetBrains live templates in unisnips project

168 lines 6.01 kB
"use strict"; 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, '&#10;'); 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