"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.blade_spacer = void 0; const vscode = __importStar(require("vscode")); /** * Blade Auto-Spacing Provider * * Automatically adds spaces inside Blade tags when typing: * {{ -> {{ | }} (cursor at |) * {!! -> {!! | !!} * {{-- -> {{-- | --}} * * Configuration: * Set 'jqhtml.enableBladeAutoSpacing' to false to disable * (or modify the config key below to match your extension's namespace) */ const TAG_DOUBLE = 0; const TAG_UNESCAPED = 1; const TAG_COMMENT = 2; const snippets = { [TAG_DOUBLE]: '{{ ${1:${TM_SELECTED_TEXT/[{}]//g}} }}$0', [TAG_UNESCAPED]: '{!! ${1:${TM_SELECTED_TEXT/[{} !]//g}} !!}$0', [TAG_COMMENT]: '{{-- ${1:${TM_SELECTED_TEXT/(--)|[{} ]//g}} --}}$0', }; const triggers = ['{}', '!', '-', '{']; const regexes = [ /({{(?!\s|-))(.*?)(}})/, /({!!(?!\s))(.*?)?(}?)/, /({{[\s]?--)(.*?)?(}})/, ]; const translate = (position, offset) => { try { return position.translate(0, offset); } catch (error) { // VS Code doesn't like negative numbers passed // to translate (even though it works fine), so // this block prevents debug console errors } return position; }; const chars_for_change = (doc, change) => { if (change.text === '!') { return 2; } if (change.text !== '-') { return 1; } const start = translate(change.range.start, -2); const end = translate(change.range.start, -1); return doc.getText(new vscode.Range(start, end)) === ' ' ? 4 : 3; }; /** * Main entry point - call this from onDidChangeTextDocument * * @param e - The text document change event * @param editor - The active text editor (optional) * @param config_enabled - Whether auto-spacing is enabled (default: true) * Pass your own config check here, e.g.: * vscode.workspace.getConfiguration('jqhtml').get('enableBladeAutoSpacing', true) */ const blade_spacer = (e_1, editor_1, ...args_1) => __awaiter(void 0, [e_1, editor_1, ...args_1], void 0, function* (e, editor, config_enabled = true) { if (!config_enabled || !editor || editor.document.fileName.indexOf('.blade.php') === -1) { return; } let tag_type = -1; let ranges = []; let offsets = []; // Changes (per line) come in right-to-left when we need them left-to-right const changes = e.contentChanges.slice().reverse(); changes.forEach((change) => { if (triggers.indexOf(change.text) === -1) { return; } if (!offsets[change.range.start.line]) { offsets[change.range.start.line] = 0; } const start_offset = offsets[change.range.start.line] - chars_for_change(e.document, change); const start = translate(change.range.start, start_offset); const line_end = e.document.lineAt(start.line).range.end; for (let i = 0; i < regexes.length; i++) { // If we typed a - or a !, don't consider the "double" tag type if (i === TAG_DOUBLE && ['-', '!'].indexOf(change.text) !== -1) { continue; } // Only look at unescaped tags if we need to if (i === TAG_UNESCAPED && change.text !== '!') { continue; } // Only look at comment tags if we need to if (i === TAG_COMMENT && change.text !== '-') { continue; } const tag = regexes[i].exec(e.document.getText(new vscode.Range(start, line_end))); if (tag) { tag_type = i; ranges.push(new vscode.Range(start, start.translate(0, tag[0].length))); offsets[start.line] += tag[1].length; } } }); if (ranges.length > 0 && snippets[tag_type]) { editor.insertSnippet(new vscode.SnippetString(snippets[tag_type]), ranges); } }); exports.blade_spacer = blade_spacer; //# sourceMappingURL=blade_spacer.js.map