define([ 'require' , 'jquery' , 'nbextensions/visualpython/src/common/vpCommon' , 'nbextensions/visualpython/src/common/constant' , 'nbextensions/visualpython/src/common/StringBuilder' , 'nbextensions/visualpython/src/common/vpFuncJS' , 'nbextensions/visualpython/src/pandas/common/pandasGenerator' , 'nbextensions/visualpython/src/pandas/fileNavigation/index' ], function (requirejs, $, vpCommon, vpConst, sb, vpFuncJS, pdGen, fileNavigation) { // 옵션 속성 const funcOptProp = { stepCount : 1 , funcName : "plt.savefig()" , funcID : "mp_saveImg" // TODO: ID 규칙 생성 필요 } /** * html load 콜백. 고유 id 생성하여 부과하며 js 객체 클래스 생성하여 컨테이너로 전달 * @param {function} callback 호출자(컨테이너) 의 콜백함수 */ var optionLoadCallback = function(callback, meta) { // document.getElementsByTagName("head")[0].appendChild(link); // 컨테이너에서 전달된 callback 함수가 존재하면 실행. if (typeof(callback) === 'function') { var uuid = vpCommon.getUUID(); // 최대 10회 중복되지 않도록 체크 for (var idx = 0; idx < 10; idx++) { // 이미 사용중인 uuid 인 경우 다시 생성 if ($(vpConst.VP_CONTAINER_ID).find("." + uuid).length > 0) { uuid = vpCommon.getUUID(); } } $(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_GREEN_ROOM))).find(vpCommon.formatString(".{0}", vpConst.API_OPTION_PAGE)).addClass(uuid); // 옵션 객체 생성 var mpPackage = new MatplotPackage(uuid); mpPackage.metadata = meta; // 옵션 속성 할당. mpPackage.setOptionProp(funcOptProp); // html 설정. mpPackage.initHtml(); callback(mpPackage); // 공통 객체를 callback 인자로 전달 } } /** * html 로드. * @param {function} callback 호출자(컨테이너) 의 콜백함수 */ var initOption = function(callback, meta) { vpCommon.loadHtml(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_GREEN_ROOM)), "matplotlib/saveImg.html", optionLoadCallback, callback, meta); } /** * 본 옵션 처리 위한 클래스 * @param {String} uuid 고유 id */ var MatplotPackage = function(uuid) { this.uuid = uuid; // Load html 영역의 uuid. this.package = { input: [ { name: 'figureVar' }, { name: 'imgFileName' } ] } // file navigation : state 데이터 목록 this.state = { paramData:{ encoding: "utf-8" // 인코딩 , delimiter: "," // 구분자 }, returnVariable:"", // 반환값 isReturnVariable: false, fileExtension: "png" // 확장자 }; this.fileResultState = { pathInputId : this.wrapSelector('#imgFileName'), fileInputId : this.wrapSelector('#fileName') }; } /** * vpFuncJS 에서 상속 */ MatplotPackage.prototype = Object.create(vpFuncJS.VpFuncJS.prototype); /** * 유효성 검사 * @returns 유효성 검사 결과. 적합시 true */ MatplotPackage.prototype.optionValidation = function() { // 파일명 var imgFileName = $(this.wrapSelector('#imgFileName')).val(); if (imgFileName == '') { vpCommon.renderAlertModal('이미지 파일명을 입력해 주세요.'); return false; } return true; // 부모 클래스 유효성 검사 호출. // vpFuncJS.VpFuncJS.prototype.optionValidation.apply(this); } /** * html 내부 binding 처리 */ MatplotPackage.prototype.initHtml = function() { this.showFunctionTitle(); this.bindOptions(); this.loadCss(Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.STYLE_PATH + "pandas/commonPandas.css"); this.loadCss(Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.STYLE_PATH + "matplotlib/plot.css"); } /** * 선택한 패키지명 입력 */ MatplotPackage.prototype.showFunctionTitle = function() { $(this.wrapSelector('.vp_functionName')).text(this.funcName); } /** * Pandas 기본 패키지 바인딩 */ MatplotPackage.prototype.bindOptions = function() { var that = this; // 파일 네비게이션 오픈 $(this.wrapSelector('#vp_openFileNavigationBtn')).click(async function() { var loadURLstyle = Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.STYLE_PATH; var loadURLhtml = Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.SOURCE_PATH + "component/fileNavigation/index.html"; that.loadCss( loadURLstyle + "component/fileNavigation.css"); await $(`
`) .load(loadURLhtml, () => { $('#vp_fileNavigation').removeClass("hide"); $('#vp_fileNavigation').addClass("show"); var { vp_init , vp_bindEventFunctions } = fileNavigation; fileNavigation.vp_init(that, "SAVE_FILE"); // fileNavigation.vp_init(that.getStateAll()); fileNavigation.vp_bindEventFunctions(); }) .appendTo("#site"); }); }; /** * 코드 생성 * @param {boolean} exec 실행여부 */ MatplotPackage.prototype.generateCode = function(addCell, exec) { var sbCode = new sb.StringBuilder(); // Figure 변수명 var figure = $(this.wrapSelector('#figureVar')).val(); // 파일명 var imgFileName = $(this.wrapSelector('#imgFileName')).val(); // 변수명 없으면 플롯 내용 출력 if (figure == '') { sbCode.appendFormat("plt.savefig('{0}')", imgFileName); } else { // figure 변수명으로 이미지 출력 sbCode.appendFormat("{0}.savefig('{1}')", figure, imgFileName); } // cell metadata 작성하기 // pdGen.vp_setCellMetadata(_VP_CODEMD); if (addCell) this.cellExecute(sbCode.toString(), exec); return sbCode.toString(); } return { initOption: initOption }; });