forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhelper.js
More file actions
1 lines (1 loc) · 16.4 KB
/
Copy pathhelper.js
File metadata and controls
1 lines (1 loc) · 16.4 KB
1
define(function(require,exports,module){const StringMatch=require("utils/StringMatch"),Global=require("./global"),UIHelper=require("./UIHelper"),Strings=require("strings"),DefaultSnippets=require("./defaultSnippets"),ALLOWED_NAVIGATION_KEYS=["Backspace","Delete","Tab","Escape","Enter","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"];let snippetsByLanguage=new Map,snippetsByAbbreviation=new Map,snippetsByInsertionKey=new Map,allSnippetsOptimized=[],prefixTriggerSnippets=[];function preprocessSnippet(snippet){const optimizedSnippet={...snippet};if(optimizedSnippet.abbreviationLower=snippet.abbreviation.toLowerCase(),optimizedSnippet.insertionKey=snippet.id||snippet.abbreviation,"all"===snippet.fileExtension.toLowerCase())optimizedSnippet.supportedLangSet=new Set(["all"]),optimizedSnippet.supportsAllLanguages=!0;else{const extensions=snippet.fileExtension.toLowerCase().split(",").map(ext=>ext.trim()).filter(ext=>ext);optimizedSnippet.supportedLangSet=new Set(extensions),optimizedSnippet.supportsAllLanguages=!1}return optimizedSnippet}function rebuildOptimizedStructures(){snippetsByLanguage.clear(),snippetsByAbbreviation.clear(),snippetsByInsertionKey.clear(),allSnippetsOptimized.length=0,prefixTriggerSnippets.length=0,Global.SnippetHintsList.concat(DefaultSnippets.DEFAULT_SNIPPETS).forEach(snippet=>{const optimizedSnippet=preprocessSnippet(snippet);allSnippetsOptimized.push(optimizedSnippet),optimizedSnippet.prefixTrigger&&prefixTriggerSnippets.push(optimizedSnippet),snippetsByInsertionKey.set(optimizedSnippet.insertionKey,optimizedSnippet),snippetsByAbbreviation.has(optimizedSnippet.abbreviationLower)||snippetsByAbbreviation.set(optimizedSnippet.abbreviationLower,[]),snippetsByAbbreviation.get(optimizedSnippet.abbreviationLower).push(optimizedSnippet),optimizedSnippet.supportsAllLanguages?(snippetsByLanguage.has("all")||snippetsByLanguage.set("all",new Set),snippetsByLanguage.get("all").add(optimizedSnippet)):optimizedSnippet.supportedLangSet.forEach(ext=>{snippetsByLanguage.has(ext)||snippetsByLanguage.set(ext,new Set),snippetsByLanguage.get(ext).add(optimizedSnippet)})})}function mapLanguageToExtension(languageId){const languageMap={javascript:".js",css:".css",html:".html",php:".php",python:".py",java:".java",c:".c",cpp:".cpp",csharp:".cs",typescript:".ts",json:".json",xml:".xml",sql:".sql",sass:".sass",scss:".scss",less:".less",stylus:".styl",coffeescript:".coffee",markdown:".md",yaml:".yml",ruby:".rb",go:".go",rust:".rs",swift:".swift",kotlin:".kt",dart:".dart",vue:".vue",jsx:".jsx",tsx:".tsx"};return languageMap[languageId]||languageId}function processFileExtensionInput(extension){if(!extension||"all"===extension)return extension;extension.includes(" ")&&(extension=extension.replace(/\s+/g,","));let result="";return result=(result=(result=extension.includes(",")?extension.split(",").map(ext=>"."===(ext=ext.trim())||""===ext?"":ext.startsWith(".")?ext:"."+ext).filter(ext=>""!==ext).join(", "):"."===extension?"":extension.startsWith(".")?extension:"."+extension).replace(/,\s*,+/g,",").replace(/,\s*$/,"").replace(/^\s*,/,"").trim()).endsWith(".")?result.slice(0,-1):result}function getSnippetData(){const abbreviation=$("#abbr-box").val().trim(),description=$("#desc-box").val().trim(),templateText=$("#template-text-box").val().trim(),fileExtension=$("#file-extn-box").val().trim(),processedFileExtension=processFileExtensionInput(fileExtension);return{abbreviation:abbreviation,description:description||"",templateText:templateText,fileExtension:processedFileExtension||"all"}}function toggleSaveButtonDisability(){const $abbrInput=$("#abbr-box"),$templateInput=$("#template-text-box"),$saveBtn=$("#save-custom-snippet-btn"),hasAbbr=$abbrInput.val().trim().length>0,hasTemplate=$templateInput.val().trim().length>0;$saveBtn.prop("disabled",!(hasAbbr&&hasTemplate))}function getCurrentLanguageContext(editor){const language=editor.getLanguageForPosition(),languageId=language?language.getId():null;return languageId}function getCurrentFileExtension(editor){const filePath=editor&&editor.document&&editor.document.file?editor.document.file.fullPath:void 0;return filePath?filePath.substring(filePath.lastIndexOf(".")).toLowerCase():null}function isSnippetSupportedInLanguageContext(snippet,languageContext,editor){if(!0===snippet.supportsAllLanguages||snippet.fileExtension&&"all"===snippet.fileExtension.toLowerCase())return!0;if(languageContext){const effectiveExtension=mapLanguageToExtension(languageContext);if(effectiveExtension.startsWith(".")){if(snippet.supportedLangSet)return snippet.supportedLangSet.has(effectiveExtension);const supportedExtensions=snippet.fileExtension.toLowerCase().split(",").map(ext=>ext.trim());return supportedExtensions.some(ext=>ext===effectiveExtension)}}if(editor){const fileExtension=getCurrentFileExtension(editor);return isSnippetSupportedInFile(snippet,fileExtension)}return!1}function isSnippetSupportedInFile(snippet,fileExtension){if("all"===snippet.fileExtension.toLowerCase())return!0;if(fileExtension){const supportedExtensions=snippet.fileExtension.toLowerCase().split(",").map(ext=>ext.trim());return supportedExtensions.some(ext=>ext===fileExtension)}return!1}const MIN_PREFIX_TRIGGER_LENGTH=2;function hasExactMatchingSnippet(query,editor){const queryLower=query.toLowerCase(),languageContext=getCurrentLanguageContext(editor),exactCandidates=snippetsByAbbreviation.get(queryLower);if(exactCandidates&&exactCandidates.some(snippet=>isSnippetSupportedInLanguageContext(snippet,languageContext,editor)))return!0;if(queryLower.length>=MIN_PREFIX_TRIGGER_LENGTH){const hasPrefixMatch=prefixTriggerSnippets.some(snippet=>snippet.abbreviationLower.startsWith(queryLower)&&isSnippetSupportedInLanguageContext(snippet,languageContext,editor));if(hasPrefixMatch)return!0}return!1}function getSnippetByInsertionKey(insertionKey){return snippetsByInsertionKey.get(insertionKey)||null}function getMatchingSnippets(query,editor){const queryLower=query.toLowerCase(),languageContext=getCurrentLanguageContext(editor);let candidateSnippets=new Set;const universalSnippets=snippetsByLanguage.get("all");if(universalSnippets&&universalSnippets.forEach(snippet=>candidateSnippets.add(snippet)),languageContext){const effectiveExtension=mapLanguageToExtension(languageContext);if(effectiveExtension.startsWith(".")){const languageSnippets=snippetsByLanguage.get(effectiveExtension);languageSnippets&&languageSnippets.forEach(snippet=>candidateSnippets.add(snippet))}}0===candidateSnippets.size&&(candidateSnippets=new Set(allSnippetsOptimized));const matchingSnippets=Array.from(candidateSnippets).filter(snippet=>snippet.abbreviationLower.startsWith(queryLower));return matchingSnippets.sort((a,b)=>{const aExact=a.abbreviationLower===queryLower,bExact=b.abbreviationLower===queryLower;return aExact&&!bExact?-1:bExact&&!aExact?1:a.abbreviationLower.localeCompare(b.abbreviationLower)})}function createHintItem(abbr,query,description,insertionKey){var $hint=$("<span>").addClass("brackets-css-hints brackets-hints custom-snippets-hint").attr("data-val",abbr).attr("data-isCustomSnippet",!0);if(null!=insertionKey&&$hint.attr("data-insertion-key",insertionKey),description&&""!==description.trim()&&$hint.attr("title",description.trim()),query&&query.length>0){const matchResult=StringMatch.stringMatch(abbr,query,{preferPrefixMatches:!0});matchResult&&matchResult.stringRanges?matchResult.stringRanges.forEach(function(item){item.matched?$hint.append($("<span>").text(item.text).addClass("matched-hint")):$hint.append(item.text)}):$hint.text(abbr)}else $hint.text(abbr);let $icon=$(`<a href="#" class="custom-snippet-code-hint" style="text-decoration: none">${Strings.CUSTOM_SNIPPETS_HINT_LABEL}</a>`);if($hint.append($icon),description&&""!==description.trim()){const fullDescription=description.trim(),displayDescription=fullDescription.length>80?fullDescription.substring(0,80)+"...":fullDescription,$desc=$(`<span class="snippet-description">${displayDescription}</span>`);$hint.append($desc)}return $hint}function clearAllInputFields(){$("#abbr-box").val(""),$("#desc-box").val(""),$("#template-text-box").val(""),$("#file-extn-box").val("")}function populateEditForm(snippetData){$("#edit-abbr-box").val(snippetData.abbreviation),$("#edit-desc-box").val(snippetData.description||""),$("#edit-template-text-box").val(snippetData.templateText),$("#edit-file-extn-box").val("all"===snippetData.fileExtension?"":snippetData.fileExtension)}function getEditSnippetData(){const abbreviation=$("#edit-abbr-box").val().trim(),description=$("#edit-desc-box").val().trim(),templateText=$("#edit-template-text-box").val().trim(),fileExtension=$("#edit-file-extn-box").val().trim(),processedFileExtension=processFileExtensionInput(fileExtension);return{abbreviation:abbreviation,description:description||"",templateText:templateText,fileExtension:processedFileExtension||"all"}}function toggleEditSaveButtonDisability(){const $abbrInput=$("#edit-abbr-box"),$templateInput=$("#edit-template-text-box"),$saveBtn=$("#save-edit-snippet-btn"),hasAbbr=$abbrInput.val().trim().length>0,hasTemplate=$templateInput.val().trim().length>0;$saveBtn.prop("disabled",!(hasAbbr&&hasTemplate))}function clearEditInputFields(){$("#edit-abbr-box").val(""),$("#edit-desc-box").val(""),$("#edit-template-text-box").val(""),$("#edit-file-extn-box").val("")}function sanitizeFileExtensionInput(value){return value=(value=(value=value.replace(/[^a-zA-Z,.\s]/g,"")).replace(/\.{2,}/g,".")).replace(/(\.)\1+/g,"$1")}function handleFileExtensionInput($input){let value;const sanitizedValue=sanitizeFileExtensionInput($input.val());$input.val(sanitizedValue),"edit-file-extn-box"===$input.attr("id")?toggleEditSaveButtonDisability():toggleSaveButtonDisability()}function handleFileExtensionKeypress(e,input){const char=String.fromCharCode(e.which),allowed=/^[a-zA-Z,.\s]$/;return"."===char&&"."===input.value.slice(-1)?(e.preventDefault(),!1):!!allowed.test(char)||(e.preventDefault(),!1)}function handleFileExtensionPaste(e,$input){e.preventDefault();const clipboardData=(e.originalEvent||e).clipboardData.getData("text");let sanitized=sanitizeFileExtensionInput(clipboardData);const input=$input[0],start=input.selectionStart,end=input.selectionEnd,currentValue=input.value;input.value=currentValue.substring(0,start)+sanitized+currentValue.substring(end);const newPos=start+sanitized.length;input.setSelectionRange(newPos,newPos),"edit-file-extn-box"===$input.attr("id")?toggleEditSaveButtonDisability():toggleSaveButtonDisability()}function handleTextareaTabKey(e,textarea){if(9===e.keyCode||9===e.which){e.preventDefault();const start=textarea.selectionStart,end=textarea.selectionEnd,value=textarea.value;textarea.value=value.substring(0,start)+"\t"+value.substring(end),textarea.selectionStart=textarea.selectionEnd=start+1,$(textarea).trigger("input")}}function validateAbbrInput(e,abbrBox){if(!(e.ctrlKey||e.metaKey||e.altKey||ALLOWED_NAVIGATION_KEYS.includes(e.key)))if(" "!==e.key){if(abbrBox.value.length>=30&&1===e.key.length&&e.key.match(/[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/)){e.preventDefault();const isEditForm="edit-abbr-box"===abbrBox.id,inputId=isEditForm?"edit-abbr-box":"abbr-box",wrapperId=isEditForm?"edit-abbr-box-wrapper":"abbr-box-wrapper",errorId=isEditForm?"edit-abbreviation-length-error":"abbreviation-length-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_ABBR_LENGTH_ERROR,errorId)}}else{e.preventDefault();const isEditForm="edit-abbr-box"===abbrBox.id,inputId=isEditForm?"edit-abbr-box":"abbr-box",wrapperId=isEditForm?"edit-abbr-box-wrapper":"abbr-box-wrapper",errorId=isEditForm?"edit-abbreviation-space-error":"abbreviation-space-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_SPACE_ERROR,errorId)}}function validateDescInput(e,descBox){if(!(e.ctrlKey||e.metaKey||e.altKey)&&!ALLOWED_NAVIGATION_KEYS.includes(e.key)&&descBox.value.length>=80&&1===e.key.length&&e.key.match(/[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?\ ]/)){e.preventDefault();const isEditForm="edit-desc-box"===descBox.id,inputId=isEditForm?"edit-desc-box":"desc-box",wrapperId=isEditForm?"edit-desc-box-wrapper":"desc-box-wrapper",errorId=isEditForm?"edit-description-length-error":"description-length-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_DESC_LENGTH_ERROR,errorId)}}function handleAbbrPaste(e,$input){e.preventDefault();const clipboardData=(e.originalEvent||e).clipboardData.getData("text");let sanitized=clipboardData.replace(/\s/g,""),wasTruncated=!1,hadSpaces=clipboardData!==sanitized;sanitized.length>30&&(sanitized=sanitized.substring(0,30),wasTruncated=!0);const input=$input[0],start=input.selectionStart,end=input.selectionEnd,currentValue=input.value,beforeCursor=currentValue.substring(0,start),afterCursor=currentValue.substring(end),finalValue=beforeCursor+sanitized+afterCursor;if(finalValue.length>30){const availableSpace=30-(beforeCursor.length+afterCursor.length);availableSpace>0?(sanitized=sanitized.substring(0,availableSpace),wasTruncated=!0):(sanitized="",wasTruncated=!0)}input.value=beforeCursor+sanitized+afterCursor;const newPos=start+sanitized.length;if(input.setSelectionRange(newPos,newPos),wasTruncated||hadSpaces){const isEditForm="edit-abbr-box"===$input.attr("id"),inputId=isEditForm?"edit-abbr-box":"abbr-box",wrapperId=isEditForm?"edit-abbr-box-wrapper":"abbr-box-wrapper";if(wasTruncated){const errorId=isEditForm?"edit-abbreviation-paste-length-error":"abbreviation-paste-length-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_ABBR_LENGTH_ERROR,errorId)}else if(hadSpaces){const errorId=isEditForm?"edit-abbreviation-paste-space-error":"abbreviation-paste-space-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_SPACE_ERROR,errorId)}}"edit-abbr-box"===$input.attr("id")?toggleEditSaveButtonDisability():toggleSaveButtonDisability()}function handleDescPaste(e,$input){e.preventDefault();const clipboardData=(e.originalEvent||e).clipboardData.getData("text");let sanitized=clipboardData,wasTruncated=!1;sanitized.length>80&&(sanitized=sanitized.substring(0,80),wasTruncated=!0);const input=$input[0],start=input.selectionStart,end=input.selectionEnd,currentValue=input.value,beforeCursor=currentValue.substring(0,start),afterCursor=currentValue.substring(end),finalValue=beforeCursor+sanitized+afterCursor;if(finalValue.length>80){const availableSpace=80-(beforeCursor.length+afterCursor.length);availableSpace>0?(sanitized=sanitized.substring(0,availableSpace),wasTruncated=!0):(sanitized="",wasTruncated=!0)}input.value=beforeCursor+sanitized+afterCursor;const newPos=start+sanitized.length;if(input.setSelectionRange(newPos,newPos),wasTruncated){const isEditForm="edit-desc-box"===$input.attr("id"),inputId=isEditForm?"edit-desc-box":"desc-box",wrapperId=isEditForm?"edit-desc-box-wrapper":"desc-box-wrapper",errorId=isEditForm?"edit-description-paste-length-error":"description-paste-length-error";UIHelper.showError(inputId,wrapperId,Strings.CUSTOM_SNIPPETS_DESC_LENGTH_ERROR,errorId)}"edit-desc-box"===$input.attr("id")?toggleEditSaveButtonDisability():toggleSaveButtonDisability()}function categorizeFileExtensionForMetrics(fileExtension){return fileExtension&&"all"!==fileExtension?"file":"all"}exports.toggleSaveButtonDisability=toggleSaveButtonDisability,exports.createHintItem=createHintItem,exports.clearAllInputFields=clearAllInputFields,exports.getSnippetData=getSnippetData,exports.getCurrentLanguageContext=getCurrentLanguageContext,exports.getCurrentFileExtension=getCurrentFileExtension,exports.mapLanguageToExtension=mapLanguageToExtension,exports.rebuildOptimizedStructures=rebuildOptimizedStructures,exports.isSnippetSupportedInLanguageContext=isSnippetSupportedInLanguageContext,exports.isSnippetSupportedInFile=isSnippetSupportedInFile,exports.hasExactMatchingSnippet=hasExactMatchingSnippet,exports.getSnippetByInsertionKey=getSnippetByInsertionKey,exports.getMatchingSnippets=getMatchingSnippets,exports.sanitizeFileExtensionInput=sanitizeFileExtensionInput,exports.handleFileExtensionInput=handleFileExtensionInput,exports.handleFileExtensionKeypress=handleFileExtensionKeypress,exports.handleFileExtensionPaste=handleFileExtensionPaste,exports.populateEditForm=populateEditForm,exports.getEditSnippetData=getEditSnippetData,exports.toggleEditSaveButtonDisability=toggleEditSaveButtonDisability,exports.categorizeFileExtensionForMetrics=categorizeFileExtensionForMetrics,exports.clearEditInputFields=clearEditInputFields,exports.handleTextareaTabKey=handleTextareaTabKey,exports.validateAbbrInput=validateAbbrInput,exports.validateDescInput=validateDescInput,exports.handleAbbrPaste=handleAbbrPaste,exports.handleDescPaste=handleDescPaste});