define([ 'jquery' , 'nbextensions/visualpython/src/common/vpCommon' , 'nbextensions/visualpython/src/common/constant' , 'nbextensions/visualpython/src/common/StringBuilder' , 'nbextensions/visualpython/src/common/vpXMLHandler' , 'nbextensions/visualpython/src/common/component/vpAccordionBox' , 'nbextensions/visualpython/src/common/component/vpLineNumberTextArea' , 'nbextensions/visualpython/src/common/component/vpIconInputText' , 'nbextensions/visualpython/src/common/vpFuncJS' , './constData.js' ], function ( $, vpCommon, vpConst, sb, xmlHandler, vpAccordionBox, vpLineNumberTextArea,vpIconInputText, vpFuncJS , constData ) { const { BLOCK_CODELINE_TYPE , VP_ID_APIBLOCK_LEFT_TAB_API , VP_CLASS_APIBLOCK_OPTION_TAB_SELECTOR } = constData; let xmlLibraries; let loadedFuncJS; let generatedMetaData; let loadedFuncID; var events; let librarySearchComplete = new Array(); let searchBoxUUID; let block_closure; try { // events 에 대한 예외 발생 가능할 것으로 예상. // console.log('requirejs',requirejs); events = requirejs('base/js/events'); } catch (err) { if (window.events === undefined) { var Events = function () { }; window.events = $([new Events()]); } events = window.events; } // mathjaxutils 경로 문제 처리 - notebook 패키지 버전 6.1.6부터는 base/js로 이동됨 try { // 6.1.6 version path for mathjaxutils mathjaxutils = requirejs('base/js/mathjaxutils'); } catch (err) { // console.log('behind 6.1.6... reload mathjaxutils.'); mathjaxutils = requirejs('notebook/js/mathjaxutils') } var getOptionPageURL = function(funcID) { // console.log('funcID', funcID); var sbURL = new sb.StringBuilder(); sbURL.append(Jupyter.notebook.base_url); sbURL.append(vpConst.BASE_PATH); sbURL.append(vpConst.SOURCE_PATH); // 함수 경로 바인딩 var optionData = $(xmlLibraries.getXML()).find(vpConst.LIBRARY_ITEM_TAG + "[" + vpConst.LIBRARY_ITEM_ID_ATTR + "=" + funcID + "]"); var filePath = $(optionData).find(vpConst.LIBRARY_ITEM_FILE_URL_NODE).text(); sbURL.append(filePath); return sbURL.toString(); } var addAutoCompleteItem = function(item) { // 이미 등록된 항목은 제외한다. if (!librarySearchComplete.includes(item)) { librarySearchComplete.push(item); } } var setLibraryLoadComplete = function() { libraryLoadComplete = true; events.trigger('library_load_complete.vp'); } var librariesBind = function(node, container) { $(node).children(vpConst.LIBRARY_ITEM_TAG + "[" + vpConst.LIBRARY_ITEM_TYPE_ATTR + "=" + vpConst.LIBRARY_ITEM_TYPE_PACKAGE + "]").each(function() { var thisNode = $(this); var accboxTopGrp; if ($(thisNode).attr(vpConst.LIBRARY_ITEM_DEPTH_ATTR) == 0) { accboxTopGrp = makeLibraryTopGroupBox($(thisNode)); $(container).append(accboxTopGrp.toTagString()); } }); } var bindSearchAutoComplete = function() { $(xmlLibraries.getXML()).find(vpConst.LIBRARY_ITEM_TAG + "[" + vpConst.LIBRARY_ITEM_TYPE_ATTR + "=" + vpConst.LIBRARY_ITEM_TYPE_FUNCTION + "]").each(function() { addAutoCompleteItem($(this).attr(vpConst.LIBRARY_ITEM_NAME_ATTR)); $(this).attr(vpConst.LIBRARY_ITEM_TAG_ATTR).split(",").forEach(function(tag) { addAutoCompleteItem(tag.trim()); }); }); $(vpCommon.wrapSelector(vpCommon.formatString(".{0} input", searchBoxUUID))).autocomplete({ source: librarySearchComplete , classes: { "ui-autocomplete": "vp-search-autocomplete" } }); } var libraryLoadCallback = function(container) { setLibraryLoadComplete(); librariesBind($(xmlLibraries.getXML()).children(vpConst.LIBRARY_ITEM_WRAP_NODE), container); bindSearchAutoComplete(); }; var loadLibraries = function(container) { var libraryURL = window.location.origin + vpConst.PATH_SEPARATOR + vpConst.BASE_PATH + vpConst.DATA_PATH + vpConst.VP_LIBRARIES_XML_URL; xmlLibraries = new xmlHandler.VpXMLHandler(libraryURL); xmlLibraries.loadFile(libraryLoadCallback, container); /** 추가 */ return xmlLibraries; } var loadLibrariesToJson = function(callback, param) { var libraryURL = window.location.origin + vpConst.PATH_SEPARATOR + vpConst.BASE_PATH + vpConst.DATA_PATH + vpConst.VP_LIBRARIES_XML_URL; xmlLibraries = new xmlHandler.VpXMLHandler(libraryURL); param = xmlLibraries; xmlLibraries.loadFile(callback, param); } /** * 최상위 패키지는 아코디언 박스로 생성한다. * @param {xmlNode} topGrpNode 최상위 페키지 */ var makeLibraryTopGroupBox = function(topGrpNode) { var accBox = new vpAccordionBox.vpAccordionBox($(topGrpNode).attr(vpConst.LIBRARY_ITEM_NAME_ATTR), false, true); // 추가 클래스 설정 // accBox.addClass(vpConst.ACCORDION_GRAY_BGCOLOR); accBox.addClass(vpConst.ACCORDION_SMALL_ARROW); // 속성 부여 accBox.addAttribute(vpConst.LIBRARY_ITEM_DATA_ID, $(topGrpNode).attr(vpConst.LIBRARY_ITEM_ID_ATTR)); // 자식 그룹 노드 생성 accBox.appendContent(makeLibraryListsGroupNode(topGrpNode)); return accBox; } /** * api list 그룹 하위 표시 토글 * @param {object} trigger 이벤트 트리거 객체 */ var toggleApiListSubGroupShow = function(trigger) { $(trigger).parent().children(vpCommon.formatString("li.{0}", vpConst.LIST_ITEM_LIBRARY_GROUP)).not($(trigger)).find(vpCommon.formatString(".{0}", vpConst.LIST_ITEM_LIBRARY)).hide(); $(trigger).children(vpCommon.formatString(".{0}", vpConst.LIST_ITEM_LIBRARY)).toggle(); // 하이라이트 처리 $(vpCommon.wrapSelector(vpCommon.formatString("#{0}", VP_ID_APIBLOCK_LEFT_TAB_API))) .find(vpCommon.formatString(".{0}", vpConst.COLOR_FONT_ORANGE)) .not($(trigger)).removeClass(vpConst.COLOR_FONT_ORANGE); $(trigger).addClass(vpConst.COLOR_FONT_ORANGE); } /** * 옵션 페이지 로드 완료 callback. * @param {funcJS} funcJS 옵션 js 객체 */ var optionPageLoadCallback_block = function(funcJS) { /** --------------- 기존의 optionPageLoadCallback코드 에서 변경한 코드 --------------------- */ /** 블럭이 package를 지역변수로 잡음 * package(== funcJS)는 API List(common, numpy, pandas... 등등) 혹은 Markdown 을 의미 */ block_closure.setImportPakage(funcJS); const importPakage = block_closure.getImportPakage(); /** Text 블럭일 경우 */ if (block_closure.getBlockType() == BLOCK_CODELINE_TYPE.TEXT) { /** Markdown package와 Text 블럭이 데이터를 통신하기 위해 서로의 this 포인트를 지역변수로 참조 함*/ importPakage.setBlock(block_closure); } /** ---------------- 이하 기존의 optionPageLoadCallback코드 -----------------------------*/ $(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_LOAD_AREA))).empty(); $(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_NAVIGATOR_INFO_PANEL), vpCommon.formatString(".{0}", vpConst.OPTION_NAVIGATOR_INFO_NODE))).remove(); $(vpCommon.wrapSelector(vpConst.OPTION_CONTAINER)).children(vpConst.OPTION_PAGE).remove(); // load 옵션 변경시 기존 옵션 이벤트 언바인드 호출. if (loadedFuncJS != undefined) { // loadedFuncJS.unbindOptionEvent(); } loadedFuncJS = funcJS; var naviInfoTag = makeOptionPageNaviInfo($(xmlLibraries.getXML()).find(vpConst.LIBRARY_ITEM_TAG + "[" + vpConst.LIBRARY_ITEM_ID_ATTR + "=" + loadedFuncID + "]")); $(vpCommon.wrapSelector(vpCommon.formatString("#{0}", vpConst.OPTION_NAVIGATOR_INFO_PANEL))).append(naviInfoTag); // metadata 존재하면 load if (loadedFuncJS.metadata !== undefined && loadedFuncJS.metadata != "") { loadedFuncJS.loadMeta(loadedFuncJS, generatedMetaData); } var blockOptionPageDom = makeUpGreenRoomHTML(); /** --------------- 다시 기존의 optionPageLoadCallback코드 에서 변경한 코드 --------------------- */ block_closure.setBlockOptionPageDom(blockOptionPageDom); block_closure.renderOptionPage(); loadedFuncJS.bindOptionEvent(); } /** * 그룹 노드 리스트 아이템으로 생성 * @param {xmlNode} grpNode 그룹 노드 */ var makeLibraryListsGroupNode = function(grpNode) { var sbGrpNode = new sb.StringBuilder(); sbGrpNode.appendLine(makeLibraryListsFunctionNode(grpNode)); sbGrpNode.appendFormatLine("