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/container/vpContainer'
, 'nbextensions/visualpython/src/pandas/common/pandasGenerator'
, 'nbextensions/visualpython/src/common/component/vpSuggestInputText'
], function (requirejs, $, vpCommon, vpConst, sb, vpFuncJS, vpContainer, pdGen, vpSuggestInputText) {
// ìµì
ìì±
const funcOptProp = {
stepCount : 1
, funcName : "Import Matplotlib"
, funcID : "mp_importMatplotlib" // 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)), "pandas/common/commonEmptyPage.html", optionLoadCallback, callback, meta);
}
/**
* 본 ìµì
ì²ë¦¬ ìí í´ëì¤
* @param {String} uuid ê³ ì id
*/
var MatplotPackage = function(uuid) {
this.uuid = uuid; // Load html ììì uuid.
this.package = {
code: [
'import matplotlib.pyplot as ${i0}'
, '%matplotlib ${magic}'
],
input: [
{
name: 'i0',
label: 'Matplotlib.pyplot as',
type: 'int',
value: 'plt'
},
{ name: 'magic' },
{ name: 'range' },
{ name: 'stylesheet' },
{ name: 'fontfamily' },
{ name: 'fontsize' }
]
}
}
/**
* vpFuncJS ìì ìì
*/
MatplotPackage.prototype = Object.create(vpFuncJS.VpFuncJS.prototype);
/**
* ì í¨ì± ê²ì¬
* @returns ì í¨ì± ê²ì¬ ê²°ê³¼. ì í©ì true
*/
MatplotPackage.prototype.optionValidation = function() {
return true;
// ë¶ëª¨ í´ëì¤ ì í¨ì± ê²ì¬ í¸ì¶.
// vpFuncJS.VpFuncJS.prototype.optionValidation.apply(this);
}
/**
* html ë´ë¶ binding ì²ë¦¬
*/
MatplotPackage.prototype.initHtml = function() {
var that = this;
this.loadCss(Jupyter.notebook.base_url + vpConst.BASE_PATH + vpConst.STYLE_PATH + "pandas/commonPandas.css");
this.showFunctionTitle();
// this.bindOptions();
var sbPageContent = new sb.StringBuilder();
var sbTagString = new sb.StringBuilder();
// TODO: íì ìµì
í
ì´ë¸ ë ì´ìì
var tblLayoutRequire = this.createVERSimpleLayout("30%");
// 1. import matplotlib.pyplot as plt
sbTagString.clear();
sbTagString.appendFormatLine("", "plt");
tblLayoutRequire.addReqRow("Matplotlib.pyplot as", sbTagString.toString());
// FIXME: vpTableLayoutVerticalSimpleì addDivider ì¶ê° ê°ë¥íì§ íì¸
tblLayoutRequire.addRow("", "
");
// 2. %matplotlib inline/notebook
sbTagString.clear();
sbTagString.appendFormatLine("", "inline", "inline");
sbTagString.appendFormatLine("", "notebook", "notebook");
var tempOptionTag = sbTagString.toString();
sbTagString.clear();
sbTagString.appendFormat('', "magic", tempOptionTag);
tblLayoutRequire.addReqRow("%matplotlib", sbTagString.toString());
// FIXME: vpTableLayoutVerticalSimpleì addDivider ì¶ê° ê°ë¥íì§ íì¸
tblLayoutRequire.addRow("", "
");
// 3. plt.style.use('style')
sbTagString.clear();
sbTagString.appendFormatLine("", "all", "all");
sbTagString.appendFormatLine("", "part", "part");
tempOptionTag = sbTagString.toString();
sbTagString.clear();
sbTagString.appendFormat('', "range", tempOptionTag);
tblLayoutRequire.addRow("Style Range", sbTagString.toString());
sbTagString.clear();
sbTagString.appendFormat('', "stylesheet");
tblLayoutRequire.addRow("Style Sheet", sbTagString.toString());
// FIXME: vpTableLayoutVerticalSimpleì addDivider ì¶ê° ê°ë¥íì§ íì¸
tblLayoutRequire.addRow("", "
");
// 4. rcParams
// #from matplotlib.pylab import rcParams
// #rcParams['font.family'] = 'Gulim'
// #rcParams['font.size'] = 10
// #rcParams['figure.figsize'] = 12, 8
// #rcParams['axes.grid'] = True
sbTagString.clear();
sbTagString.appendFormat('', "fontfamily", "'Gulim'");
tblLayoutRequire.addRow("System Font", sbTagString.toString());
sbTagString.clear();
sbTagString.appendFormat('', "fontsize");
tblLayoutRequire.addRow("Font Size", sbTagString.toString());
// íì ìµì
ìì (ìì½ëì¸ ë°ì¤)
var accBoxRequire = this.createOptionContainer(vpConst.API_REQUIRE_OPTION_BOX_CAPTION);
accBoxRequire.setOpenBox(true);
accBoxRequire.appendContent(tblLayoutRequire.toTagString());
sbPageContent.appendLine(accBoxRequire.toTagString());
// íì´ì§ì 컨í¸ë¡¤ ì½ì
vpFuncJS ìì ì ê³µ
$(this.wrapSelector()).append(sbPageContent.toString());
// ì´ë²¤í¸ ì²ë¦¬
// e1. stylesheet autocomplete with SuggestInput
this.bindStylesheet();
// e2. system font autocomplete with SuggestInput
this.bindSystemfont();
}
/**
* ì íí í¨í¤ì§ëª
ì
ë ¥
*/
MatplotPackage.prototype.showFunctionTitle = function() {
$(this.wrapSelector('.vp-funcNavi')).html(
`
Matplotlib > Import Matplotlib
`
)
// $(this.wrapSelector('.vp_functionName')).text('Import Matplotlib');
}
/**
* get metadata
* @param {String} id id
*/
MatplotPackage.prototype.getMetadata = function(id) {
if (this.metadata == undefined)
return "";
var len = this.metadata.options.length;
for (var i = 0; i < len; i++) {
var obj = this.metadata.options[i];
if (obj.id == id)
return obj.value;
}
return "";
}
/**
* stylesheet autocomplete
*/
MatplotPackage.prototype.bindStylesheet = function() {
var that = this;
// ì¬ì©ê°ë¥í ì¤íì¼ ìí¸ ì¡°í
var stylesheetTag = $(this.wrapSelector('#stylesheet'));
// ì¤íì¼ ìí¸ ì¡°í ì½ë
var code = new sb.StringBuilder();
code.appendLine('import matplotlib.pyplot as plt');
code.appendLine('import json');
// code.append(`print(json.dumps(plt.style.available))`);
code.append(`print(json.dumps([{ 'label': s, 'value': "'"+s+"'" } for s in plt.style.available]))`);
this.kernelExecute(code.toString(), function(result) {
// ì¬ì©ê°ë¥í ì¤íì¼ ìí¸ ëª©ë¡
var varList = JSON.parse(result);
var suggestInput = new vpSuggestInputText.vpSuggestInputText();
suggestInput.setComponentID('stylesheet');
suggestInput.addClass('vp-input');
// metadata check
var mdvalue = that.getMetadata('stylesheet');
if (mdvalue != undefined && mdvalue != '') {
suggestInput.setValue(mdvalue);
}
suggestInput.setSuggestList(function() { return varList; });
// suggestInput.setNormalFilter(false);
$(stylesheetTag).replaceWith(function() {
return suggestInput.toTagString();
});
});
};
/**
* font family autocomplete
*/
MatplotPackage.prototype.bindSystemfont = function() {
var that = this;
// ì¬ì©ê°ë¥í í°í¸ ëª©ë¡ ì¡°í
var fontFamilyTag = $(this.wrapSelector('#fontfamily'));
// í°í¸ ì¡°í ì½ë
var code = new sb.StringBuilder();
code.appendLine('import json');
code.appendLine("import matplotlib.font_manager as fm");
code.appendLine("_ttflist = fm.fontManager.ttflist");
code.append(`print(json.dumps([{"label": f.name, "value":("'" + f.name + "'")} for f in _ttflist]))`);
this.kernelExecute(code.toString(), function(result) {
// ì¬ì©ê°ë¥í í°í¸ 목ë¡
var varList = JSON.parse(result);
var suggestInput = new vpSuggestInputText.vpSuggestInputText();
suggestInput.setComponentID('fontfamily');
suggestInput.addClass('vp-input');
// metadata check
var mdvalue = that.getMetadata('fontfamily');
if (mdvalue != undefined && mdvalue != '') {
suggestInput.setValue(mdvalue);
} else {
suggestInput.setValue("'Gulim'");
}
suggestInput.setSuggestList(function() { return varList; });
// suggestInput.setNormalFilter(false);
$(fontFamilyTag).replaceWith(function() {
return suggestInput.toTagString();
});
});
};
/**
* ì½ë ìì±
* @param {boolean} exec ì¤íì¬ë¶
*/
MatplotPackage.prototype.generateCode = function(addCell, exec) {
try {
var sbCode = new sb.StringBuilder();
// ì½ë ìì±
// íì ì
ë ¥ í목
sbCode.appendFormatLine('import matplotlib.pyplot as {0}', $(this.wrapSelector('#i0')).val());
sbCode.appendFormatLine('%matplotlib {0}', $(this.wrapSelector('#magic')).val());
// style range, sheet
var stylerange = $(this.wrapSelector('#range')).val();
var stylesheet = $(this.wrapSelector('#stylesheet')).val();
if (stylesheet != '') {
if (stylerange == 'all') {
// ì ì²´ ë²ì ì½ë 구ì±
sbCode.appendFormat("plt.style.use('{0}')", stylesheet);
} else {
// ì¼ë¶ ë²ì ì½ë 구ì±
sbCode.appendFormatLine("with plt.style.context({0}):", stylesheet);
sbCode.append(" pass");
}
}
// font family, size
var fontfamily = $(this.wrapSelector('#fontfamily')).val();
var fontsize = $(this.wrapSelector('#fontsize')).val();
sbCode.appendLine('');
sbCode.appendLine("from matplotlib.pylab import rcParams");
if (fontfamily != '') {
sbCode.appendFormatLine("rcParams['font.family'] = {0}", fontfamily);
}
if (fontsize != '') {
sbCode.appendFormatLine("rcParams['font.size'] = {0}", fontsize);
}
sbCode.appendLine("#rcParams['figure.figsize'] = 12, 8");
sbCode.appendLine("#rcParams['axes.grid'] = True");
// ì½ë ì¶ê° ë° ì¤í
if (addCell) this.cellExecute(sbCode.toString(), exec);
} catch (exmsg) {
// ìë¬ íì
vpCommon.renderAlertModal(exmsg);
return "BREAK_RUN"; // ì½ë ìì± ì¤ ì¤ë¥ ë°ì
}
return sbCode.toString();
}
return {
initOption: initOption
};
});