forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnumberPreviewProvider.js
More file actions
1 lines (1 loc) · 4.33 KB
/
Copy pathnumberPreviewProvider.js
File metadata and controls
1 lines (1 loc) · 4.33 KB
1
define(function(require,exports,module){let PreferencesManager=brackets.getModule("preferences/PreferencesManager"),Strings=brackets.getModule("strings"),AppInit=brackets.getModule("utils/AppInit"),QuickView=brackets.getModule("features/QuickViewManager"),Metrics=brackets.getModule("utils/Metrics"),colorGradientProvider=require("./colorGradientProvider");const PREF_ENABLED_KEY="numberEditor";let prefs=PreferencesManager.getExtensionPrefs("quickview"),enabled;prefs.definePreference("numberEditor","boolean",!0,{description:Strings.DESCRIPTION_NUMBER_QUICK_VIEW});let lastOriginId=0;function _splitNumber(numStr){try{if(numStr.length>15)return null;let split=numStr.match(/(^-?)(\d*\.?\d*)(.*)/),number=split[1]+split[2]||"",decimalPlaces=number.split(".")[1],roundTo;switch(decimalPlaces=decimalPlaces&&decimalPlaces.length||0){case 0:roundTo=1;break;case 1:roundTo=10;break;case 2:default:roundTo=100}return{number:number,units:split[3]||"",decimalPlaces:decimalPlaces,roundTo:roundTo}}catch(e){return null}}function _getWordAfterPos(editor,pos){const wordRange=editor.getWordAt(pos);wordRange.text.startsWith("%")&&(wordRange.text=wordRange.text.slice(0,1),wordRange.endPos.ch=wordRange.startPos.ch+1);const wordFull=editor.getTextBetween(wordRange.startPos,wordRange.endPos);let startChInWord=0;wordRange.startPos.line===pos.line&&wordRange.startPos.ch<pos.ch&&(startChInWord=pos.ch-wordRange.startPos.ch);const effectiveStartPos={line:wordRange.startPos.line,ch:wordRange.startPos.ch+startChInWord},effectiveEndPos=wordRange.endPos,trimmedWord=wordFull.substring(startChInWord);return{text:trimmedWord,startPos:effectiveStartPos,endPos:effectiveEndPos}}function _isCSSUnit(str){const regexPattern=/^(px|cm|mm|Q|in|pc|pt|em|ex|ch|rem|vw|vh|vmin|vmax|lh|%)$/;return regexPattern.test(str)}function getQuickView(editor,pos,token,line){return new Promise((resolve,reject)=>{let startCh=token.start,endCh=token.end,numberStr=token.string;if("string"===token.type&&enabled){const number=editor.getNumberAt(pos);if(!number)return void reject();{numberStr=number.text,startCh=number.startPos.ch,endCh=number.endPos.ch;const nextPos={line:number.endPos.line,ch:number.endPos.ch},nextWord=_getWordAfterPos(editor,nextPos);_isCSSUnit(nextWord.text.trim())&&(numberStr=editor.getTextBetween(number.startPos,nextWord.endPos),endCh=nextWord.endPos.ch)}}else if("number"!==token.type||!enabled)return void reject();let sPos={line:pos.line,ch:startCh},ePos={line:pos.line,ch:endCh},editOrigin="+NumberQuickView_"+lastOriginId++,$content=$(`<div><input type="text" value="${numberStr}" class="dial"><div>`),split=_splitNumber(numberStr);if(!split)return void reject();let changedMetricSent=!1;$content.find(".dial").knob({stopper:!1,step:1/split.roundTo,max:100/split.roundTo,width:100,height:100,fgColor:"#2893ef",fontSize:"1em",format:function(value){return Math.round(value*split.roundTo)/split.roundTo+split.units},getValue:function(userInput){let changedSplit=_splitNumber(userInput);return split.units=changedSplit&&changedSplit.units,changedSplit&&changedSplit.number},change:function(value){editor.document.batchOperation(function(){editor.setSelection(sPos,ePos);let replaceStr=Math.round(value*split.roundTo)/split.roundTo+split.units;editor.replaceRange(replaceStr,sPos,ePos,editOrigin),ePos={line:sPos.line,ch:sPos.ch+replaceStr.length},editor.setSelection(sPos,ePos)}),changedMetricSent||(Metrics.countEvent(Metrics.EVENT_TYPE.QUICK_VIEW,"num","changed"),changedMetricSent=!0)},changeStart:function(){QuickView.lockQuickView()},changeEnd:function(){QuickView.unlockQuickView()}}),resolve({start:sPos,end:ePos,content:$content,exclusive:!0,editsDoc:!0}),Metrics.countEvent(Metrics.EVENT_TYPE.QUICK_VIEW,"num","show")})}function filterQuickView(popovers){let hasColorQuickView=!1;for(let popover of popovers)if(popover.providerInfo.provider.QUICK_VIEW_NAME===colorGradientProvider.QUICK_VIEW_NAME){hasColorQuickView=!0;break}return hasColorQuickView&&(popovers=popovers.filter(popover=>popover.providerInfo.provider.QUICK_VIEW_NAME!==exports.QUICK_VIEW_NAME)),popovers}prefs.on("change","numberEditor",function(){enabled=prefs.get("numberEditor")}),AppInit.appReady(function(){enabled=prefs.get("numberEditor"),QuickView.registerQuickViewProvider(exports,["html","xhtml","xml","css","less","scss","sass"])}),exports.getQuickView=getQuickView,exports.filterQuickView=filterQuickView,exports.QUICK_VIEW_NAME="numberPreviewProvider"});