NGToolsCSharp/NGTools/Scripts/Highcharts-7.1.1/code/highcharts-export-clientside.js
2024-09-13 16:44:30 +08:00

540 lines
18 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function (H) {
if (!H.exporting) {
H.exporting = function () { };
}
// This will be redefined later;
var oldExport = H.Chart.prototype.exportChart;
H.Chart.prototype.exportChart = function () { };
// Set the URL of the export server to a non-existant one, just to be sure.
H.getOptions().exporting.url = "http://127.0.0.1:666/";
var MIME_TYPES = {
"PDF": "application/pdf",
"PNG": "image/png",
"JPEG": "image/jpeg",
"SVG": "image/svg+xml",
"CSV": "text/csv",
"XLS": "application/vnd.ms-excel"
};
var MIME_TYPE_TO_EXTENSION = {
"application/pdf": ".pdf",
"image/png": ".png",
"image/jpeg": ".jpeg",
"image/svg+xml": ".svg",
"text/csv": ".csv",
"application/vnd.ms-excel": ".xls"
};
var TRANSLATION_KEY_TO_MIME_TYPES = {
"downloadPDF": "application/pdf",
"downloadPNG": "image/png",
"downloadJPEG": "image/jpeg",
"downloadSVG": "image/svg+xml"
};
TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadCSV || 'Download CSV'] = "text/csv";
TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadXLS || 'Download XLS'] = "application/vnd.ms-excel";
// This var indicates if the browser supports HTML5 download feature
var browserSupportDownload = false;
var a = document.createElement('a');
if (typeof window.btoa != "undefined" && typeof a.download != "undefined") {
browserSupportDownload = true;
}
// This is for IE support of Blob
var browserSupportBlob = window.Blob && window.navigator.msSaveOrOpenBlob;
/**
* Describes the MIME types that this module supports.
* Additionnally, you can call `support(mimeType)` to check
* that this type is available on the current platform.
*/
H.exporting.MIME_TYPES = MIME_TYPES;
var supportStatus = {};
var buildSupportStatus = function () {
var hasDownloadOrBlob = browserSupportDownload || browserSupportBlob;
supportStatus[MIME_TYPES.CSV] = hasDownloadOrBlob && (H.Chart.prototype.getCSV !== undefined);
supportStatus[MIME_TYPES.XLS] = hasDownloadOrBlob && (H.Chart.prototype.getTable !== undefined);
var svgSupport = (H.Chart.prototype.getSVG !== undefined);
supportStatus[MIME_TYPES.SVG] = hasDownloadOrBlob && svgSupport && (window.btoa !== undefined);
// Canvg uses a function named RGBColor, but it's also a not widely known standard object
// http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/css.html#CSS-RGBColor
// Fugly, but heh.
var rbgColorSupport = false;
try {
rbgColorSupport = (new RGBColor("").ok) !== undefined;
}
catch (e) { }
// We also check that a canvas element can be created.
var canvas = document.createElement('canvas');
var canvgSupport = typeof canvg !== "undefined" && typeof RGBColor != "undefined" &&
rbgColorSupport && canvas.getContext && canvas.getContext('2d');
supportStatus[MIME_TYPES.PNG] = hasDownloadOrBlob && svgSupport && canvgSupport;
// On IE, it relies on canvas.msToBlob() which always returns PNG
supportStatus[MIME_TYPES.JPEG] = /* useless, see last param: hasDownloadOrBlob && */
svgSupport && canvgSupport && browserSupportDownload;
supportStatus[MIME_TYPES.PDF] = hasDownloadOrBlob && svgSupport && canvgSupport && (typeof jsPDF !== "undefined");
};
buildSupportStatus();
/**
* Checks if the supplied MIME type is available on the
* current platform for a chart to be exported in.
* @param mimeType {String} The MIME type.
* @returns {boolean} <code>true</code> if the MIME type is available on the
* current platform.
*/
H.exporting.supports = function (mimeType) {
if (supportStatus[mimeType]) {
return supportStatus[mimeType];
}
else {
return false;
}
};
// Remove unsupported download features from the menu
var menuItems = H.getOptions().exporting.buttons.contextButton.menuItems,
menuItem,
textKey,
text,
mimeType,
handlerBuilder = function (mimeType) {
return function () {
this.exportChartLocal({
type: mimeType,
csv: {
itemDelimiter: ';'
}
});
}
};
for (var i in menuItems) {
menuItem = menuItems[i];
textKey = menuItems[i].textKey;
text = menuItems[i].text; // export-csv do not use a textKey attribute
mimeType = TRANSLATION_KEY_TO_MIME_TYPES[textKey] || TRANSLATION_KEY_TO_MIME_TYPES[text];
if (mimeType) {
if (!H.exporting.supports(mimeType)) {
// Setting enabled = false isn't enough.
delete menuItems[i];
}
else {
// Redefines click handler to use our method.
menuItems[i].onclick = handlerBuilder(mimeType);
}
}
}
/*
* Converts a SVG string to a canvas element
* thanks to canvg.
* @param svg {String} A SVG string.
* @param width {Integer} The rasterized width.
* @param height {Integer} The rasterized height.
* @return {DOMNode} a canvas element.
*/
var svgToCanvas = function (svg, width, height) {
var canvas = document.createElement('canvas');
canvas.setAttribute('width', width);
canvas.setAttribute('height', height);
canvas.getContext('2d').drawSvg(svg, 0, 0, width, height);
return canvas;
};
/**
* An object to simplifies the retrieval of options in
* multiple bundles.
* @param opts {Object} Multiple, an object containing options.
*/
var Opt = function (opts1, opt2, dotdotdot) {
this.bundles = arguments;
};
/**
* Fetch the value associated with the specified key in the bundles.
* First one defined is the one returned.
* @param key {String} The key.
* @param value {mixed} The first defined value in the bundles or
* <code>undefined</code> if none is found.
*/
Opt.prototype.get = function (key) {
for (var i = 0; i < this.bundles.length; i++) {
if (this.bundles[i] && this.bundles[i][key] !== undefined) {
return this.bundles[i][key];
}
}
return undefined;
};
// Default options.
var defaultExportOptions = {
type: MIME_TYPES.PNG,
scale: 2,
filename: "chart",
csv: {
useLocalDecimalPoint: true
}
};
/**
*
*@param chartArr {Array}
*/
var getsvg = function (chartArr){
var svgArr = [],
top = 0,
width = 0;
for(var i=0;i<chartArr.length;i++){
var chart=chartArr[i];
var svg = chart.getSVG();
svg = svg.replace('<svg', '<g transform="translate(0,' + top + ')" ');
svg = svg.replace('</svg>', '</g>');
top += chart.chartHeight;
width = Math.max(width, chart.chartWidth);
svgArr.push(svg);
}
return '<svg height="' + top + '" width="' + width + '" version="1.1" xmlns="http://www.w3.org/2000/svg">' + svgArr.join('') + '</svg>';
};
/**
* Redefines the export function of the official exporting module.
*@param fileName {String} file name
* @param type {String} file type
* @param chartOptions {Object} Additionnal chart options.
*/
H.Chart.prototype.exportChartPNG= function(fileName,type,chartArr){
var svg= getsvg(chartArr);
var height =this.chartHeight*chartArr.length,width=this.chartWidth,type = type==null?'image/png':type;
var data = {
content: undefined,
datauri: undefined,
blob: undefined
};
var canvas = svgToCanvas(svg, width, height);
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
if (!data.content && !(data.datauri || data.blob)) {
throw new Error("Something went wrong while exporting the chart");
}
if (browserSupportDownload && (data.datauri || data.content)) {
a = document.createElement('a');
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
a.download = fileName;
document.body.appendChild(a);
a.click();
a.remove();
}
else if (browserSupportBlob && (data.blob || data.content)) {
blobObject = data.blob || new Blob([data.content], { type: type });
window.navigator.msSaveOrOpenBlob(blobObject, filename);
}
else {
window.open(data);
}
}
/**
* Redefines the export function of the official exporting module.
* @param options {Object} Overload the export options defined in the chart.
* @param chartOptions {Object} Additionnal chart options.
*/
H.Chart.prototype.exportChartLocal = function (options, chartOptions,svg) {
var svg = svg;
var opt = new Opt(options, this.options.exporting, defaultExportOptions);
var type = opt.get("type");
if (!H.exporting.supports(type)) {
throw new Error("Unsupported export format on this platform: " + type);
}
var filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type];
var data = {
content: undefined,
datauri: undefined,
blob: undefined
};
if (type == MIME_TYPES.CSV) {
// Copies some values from the options, so we can set it and change those
// through the options argument.
var hasCSVOptions = this.options.exporting && this.options.exporting.csv;
var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv);
var oldOptions = {},
optionsToCopy = ["dateFormat", "itemDelimiter", "lineDelimiter"],
optionToCopy;
for (var i in optionsToCopy) {
optionToCopy = optionsToCopy[i];
if (csvOpt.get(optionToCopy)) {
if (!this.options.exporting) {
this.options.exporting = {};
}
if (!this.options.exporting.csv) {
this.options.exporting.csv = {};
}
oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy];
this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy);
}
}
var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint");
var csv = this.getCSV(useLocalDecimalPoint);
data.content = csv;
if (hasCSVOptions) {
for (var i in optionsToCopy) {
optionToCopy = optionsToCopy[i];
if (csvOpt.get(optionToCopy)) {
this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy];
}
}
}
else {
delete this.options.exporting.csv;
}
}
else if (type == MIME_TYPES.XLS) {
// Same as above
var hasCSVOptions = this.options.exporting && this.options.exporting.csv;
var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv);
var oldOptions = {},
optionsToCopy = ["dateFormat"],
optionToCopy;
for (var i in optionsToCopy) {
optionToCopy = optionsToCopy[i];
if (csvOpt.get(optionToCopy)) {
if (!this.options.exporting) {
this.options.exporting = {};
}
if (!this.options.exporting.csv) {
this.options.exporting.csv = {};
}
oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy];
this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy);
}
}
var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint");
var xls = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">' +
'<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>' +
'<x:Name>Sheet</x:Name>' +
'<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->' +
'<style>td{border:none;font-family: Calibri, sans-serif;} .number{mso-number-format:"0.00";}</style>' +
'<meta name=ProgId content=Excel.Sheet>' +
'</head><body>' +
this.getTable(useLocalDecimalPoint) +
'</body></html>';
data.content = xls;
if (hasCSVOptions) {
for (var i in optionsToCopy) {
optionToCopy = optionsToCopy[i];
if (csvOpt.get(optionToCopy)) {
this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy];
}
}
}
else {
delete this.options.exporting.csv;
}
}
// Image processing
else {
var scale = opt.get("scale"),
sourceWidth = this.options.width || opt.get("sourceWidth") || this.chartWidth,
sourceHeight = this.options.height || opt.get("sourceHeight") || this.chartHeight,
destWidth = sourceWidth * scale,
destHeight = sourceHeight * scale;
var cChartOptions = chartOptions || this.options.exporting && this.options.exporting.chartOptions || {};
if (!cChartOptions.chart) {
cChartOptions.chart = { width: sourceWidth, height: sourceHeight };
}
else {
cChartOptions.chart.width = destWidth;
cChartOptions.chart.height = destHeight;
}
//var svg = this.getSVG(cChartOptions);
if (type == MIME_TYPES.SVG) {
data.content = svg;
}
else if (type == MIME_TYPES.PNG || type == MIME_TYPES.JPEG) {
debugger;
var canvas = svgToCanvas(svg, destWidth, destHeight);
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
}
else if (type == MIME_TYPES.PDF) {
var canvas = svgToCanvas(svg, destWidth, destHeight);
var doc = new jsPDF('l', 'mm', [destWidth, destHeight]);;
doc.addImage(canvas, 'JPEG', 0, 0, destWidth, destHeight);
data.datauri = browserSupportDownload && doc.output('datauristring');
data.blob = !browserSupportDownload && doc.output('blob');
}
}
if (!data.content && !(data.datauri || data.blob)) {
throw new Error("Something went wrong while exporting the chart");
}
if (browserSupportDownload && (data.datauri || data.content)) {
a = document.createElement('a');
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
a.download = filename;
document.body.appendChild(a);
a.click();
a.remove();
}
else if (browserSupportBlob && (data.blob || data.content)) {
blobObject = data.blob || new Blob([data.content], { type: type });
window.navigator.msSaveOrOpenBlob(blobObject, filename);
}
else {
window.open(data);
}
}
H.Chart.prototype.getImageBase64 = function (options, chartOptions) {
var opt = new Opt(options, this.options.exporting, defaultExportOptions);
var type = opt.get("type");
if (!H.exporting.supports(type)) {
throw new Error("Unsupported export format on this platform: " + type);
}
var filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type];
var data = {
content: undefined,
datauri: undefined,
blob: undefined
};
// Image processing
var
sourceWidth = this.options.width || opt.get("sourceWidth") || this.chartWidth,
sourceHeight = this.options.height || opt.get("sourceHeight") || this.chartHeight,
destWidth = sourceWidth,
destHeight = sourceHeight;
var cChartOptions = chartOptions || this.options.exporting && this.options.exporting.chartOptions || {};
if (!cChartOptions.chart) {
cChartOptions.chart = { width: sourceWidth, height: sourceHeight };
}
else {
cChartOptions.chart.width = destWidth;
cChartOptions.chart.height = destHeight;
}
var svg = this.getSVG(cChartOptions);
var canvas = svgToCanvas(svg, destWidth, destHeight);
//if (type == MIME_TYPES.PNG || type == MIME_TYPES.JPEG) {
data.content = svg;
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
//a = document.createElement('a');
//a.href = 'data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content)));
//a.download = filename;
//document.body.appendChild(a);
//a.click();
//a.remove();
//}
return canvas.toDataURL(type);
}
// Forces method from export module to use the local version
H.Chart.prototype.exportChart = H.Chart.prototype.exportChartLocal;
H.getSVGs = function (charts) {
var svgArr = [],
top = 0,
width = 0;
$.each(charts, function (i, chart) {
var svg = chart.getSVG();
svg = svg.replace('<svg', '<g transform="translate(0,' + top + ')" ');
svg = svg.replace('</svg>', '</g>');
//svg = svg.replace('<svg', '<zg ct=' + chart.options.chartype);
//svg = svg.replace('</svg>', '</zg>');(<28><><EFBFBD><EFBFBD>ע<EFBFBD>͵Ĵ<CDB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD>ͼƬ)
top += chart.chartHeight;
width = Math.max(width, chart.chartWidth);
svgArr.push(svg);
});
return '<svg height="' + top + '" width="' + width + '" version="1.1" xmlns="http://www.w3.org/2000/svg">' + svgArr.join('') + '</svg>';
};
/**
* Redefines the export function of the official exporting module.
*@param fileName {String} file name
* @param type {String} file type
* @param chartOptions {Object} Additionnal chart options.
*/
H.exportChartPNG= function(fileName,type,chartArr){
var svg = this.getSVGs(chartArr);
$.messager.alert("<22><>ʾ",111);
var height =this.chartHeight*chartArr.length,width=this.chartWidth,type = type==null?'image/png':type;
var data = {
content: undefined,
datauri: undefined,
blob: undefined
};
var canvas = svgToCanvas(svg, 800, 800);
data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type);
data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob();
if (!data.content && !(data.datauri || data.blob)) {
throw new Error("Something went wrong while exporting the chart");
}
if (browserSupportDownload && (data.datauri || data.content)) {
a = document.createElement('a');
a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content))));
a.download = fileName;
document.body.appendChild(a);
a.click();
a.remove();
}
else if (browserSupportBlob && (data.blob || data.content)) {
blobObject = data.blob || new Blob([data.content], { type: type });
window.navigator.msSaveOrOpenBlob(blobObject, filename);
}
else {
window.open(data);
}
}
}(Highcharts));