blob: 2b50830f7646159560c881d3d7b9c7ab6ae6d8b1 [file] [log] [blame]
/**
* @deprecated
*/
'use strict';
Error.stackTraceLimit = 200;
var glob = require('glob');
var fs = require('fs');
var path = require('path');
var etpl = require('etpl');
var DOMParser = require('xmldom').DOMParser;
var _ = require('lodash');
var Canvas = require('canvas');
require('app-module-path').addPath('../public/vendors/echarts/');
var tpl = fs.readFileSync('../public/javascripts/chart-list.tpl.js', 'utf-8');
var echarts = require('echarts');
etpl.config({
commandOpen: '/**',
commandClose: '*/'
});
global.document = {
createElement: function (nodeType) {
if (nodeType === 'canvas') {
return new Canvas(150, 150);
}
}
}
global.Image = Canvas.Image;
var _intervalIdList = [];
var _timeoutIdList = [];
var _oldSetTimeout = global.setTimeout;
var _oldSetInterval = global.setInterval;
global.setTimeout = function (func, delay) {
var id = _oldSetTimeout(func, delay);
_timeoutIdList.push(id);
return id;
};
global.setInterval = function (func, gap) {
var id = _oldSetInterval(func, gap);
_intervalIdList.push(id);
return id;
};
function _clearTimeTickers() {
for (var i = 0; i < _intervalIdList.length; i++) {
clearInterval(_intervalIdList[i]);
}
for (var i = 0; i < _timeoutIdList.length; i++) {
clearTimeout(_timeoutIdList[i]);
}
_intervalIdList = [];
_timeoutIdList = [];
}
var $ = {
get: function (url, callback, dataType) {
if (!url.match(/^http/)) {
var content = fs.readFileSync('../public/' + url, 'utf-8');
if (url.match(/.json$/) || dataType === 'json') {
content = JSON.parse(content);
}
else if (url.match(/.(xml|gexf)$/) || dataType === 'xml') {
content = new DOMParser().parseFromString(content, 'text/xml');
}
if (callback) {
callback(content);
}
return content;
}
}
};
$.getJSON = $.get;
$.when = function () {
var args = Array.prototype.slice.call(arguments);
return {
done: function (cb) {
cb.apply(null, args.map(function (a) {
return [a];
}));
}
};
};
function getTmpMyChart() {
var canvas = new Canvas(700, 525);
var myChart = echarts.init(canvas);
myChart.setOption = function () {};
myChart.dispatchAction = function (action) {
this.pendingActions.push(action);
};
myChart.on = function (name, handler, context) {
this.eventsHandlers.push({
name: name,
func: handler,
context: context
});
}
return myChart;
}
function _setTimeout(cb) {
cb && cb();
}
var myChart = getTmpMyChart();
var noThumbList = ['bmap'];
glob('../public/data/*.js', function (err, files) {
var code = etpl.compile(tpl)({
examples: files.map(function (fileName) {
console.log(fileName);
var optionGenCode = fs.readFileSync(fileName);
var option;
var optionGenFunc = new Function(
'myChart', 'app', 'echarts', '$', 'Image', 'setTimeout',
optionGenCode + ';return option;'
);
var app = {
inNode: true
};
myChart.pendingActions = [];
myChart.eventsHandlers = [];
var option = optionGenFunc(myChart, app, echarts, $, Canvas.Image, _setTimeout);
var id = path.basename(fileName, '.js');
var optionNeedFix = option;
// In timeline
if (option.options) {
optionNeedFix = option.options[0];
_.merge(optionNeedFix, option.baseOption, true);
}
if (!_.isArray(optionNeedFix.series)) {
optionNeedFix.series = [optionNeedFix.series];
}
optionNeedFix.series.forEach(function (seriesOpt) {
if (seriesOpt.type === 'graph') {
seriesOpt.force = seriesOpt.force || {};
seriesOpt.force.layoutAnimation = false;
}
seriesOpt.animation = false;
});
optionNeedFix.animation = false;
optionNeedFix.textStyle = {
fontFamily: 'noto-thin',
fontSize: 14
};
_clearTimeTickers();
if (!_.find(noThumbList, function (name) {
return fileName.indexOf(name) >= 0;
})) {
createThumb(id, option, myChart.pendingActions, myChart.eventsHandlers);
}
var type = optionNeedFix.series.length && optionNeedFix.series[0].type;
var defaultName = id.split('-').map(function (item) {
return item.charAt(0).toUpperCase() + item.slice(1);
}).join(' ');
// FIXME
if (type === 'lines' || type === 'effectScatter') {
type = 'map';
}
var ret = {
id: id,
title: app.title || (optionNeedFix.title && optionNeedFix.title.text) || defaultName,
type: app.category || type
};
fs.writeFileSync('../public/data/meta/' + id + '.md',
`---
title: ${ret.title}
category: ${ret.type}
---`, 'utf-8');
return ret;
})
});
fs.writeFileSync('../public/javascripts/chart-list.js', code, 'utf-8');
myChart.dispose();
console.log('Finish update ' + files.length + ' examples.');
});
// Generate thumb
require('../public/vendors/echarts/extension/dataTool.js');
require('../public/vendors/echarts/theme/vintage');
require('../public/vendors/echarts/theme/dark');
global.ecStat = require('echarts-stat/dist/ecStat');
var maps = ['china', 'world'];
maps.forEach(function (name) {
var json = fs.readFileSync('../public/vendors/echarts/map/json/' + name + '.json', 'utf-8');
echarts.registerMap(name, JSON.parse(json));
});
// Font must be add expicity
var font = new Canvas.Font('noto-thin', __dirname + '/noto-thin.ttf');
font.addFace(__dirname + '/noto-thin.ttf', 'bolder');
echarts.setCanvasCreator(function () {
var canvas = new Canvas(128, 128);
var ctx = canvas.getContext('2d');
ctx.addFont(font);
return canvas;
});
function createThumb(id, option, actions, handlers) {
var canvas = new Canvas(700, 560);
var ctx = canvas.getContext('2d');
ctx.addFont(font);
var myChart = echarts.init(canvas);
try {
console.time('Updated thumb');
var needsRefresh = false;
// No throttle
option.brush && (option.brush.throttleType = null);
handlers.forEach(function (handler) {
needsRefresh = true;
myChart.on(handler.name, handler.func, handler.context);
});
// FIXME blend mode seems wrong in large mode
if (id.match('lines-airline')) {
option.series[0].large = false;
}
myChart.setOption(option);
actions.forEach(function (action) {
needsRefresh = true;
myChart.dispatchAction(action);
});
if (needsRefresh) {
myChart.getZr().refreshImmediately();
}
console.timeEnd('Updated thumb');
fs.writeFileSync('../public/data/thumb/' + id + '.png', canvas.toBuffer());
}
catch (e) {
console.error(e.toString());
console.error('-------------------------------------Thumb error');
}
// Must dispose after used, or the animation instance will always run
myChart.dispose();
}