/* eslint-disable */
function tab(len){
return [...Array(len)].map(a => " ").join('')
}
export function exportXML(json,canvas,createFile = true) {
const id = canvas.id || "flow";
const name = canvas.name || "flow";
let dataObjs = "";
canvas.dataObjs.forEach(s => {
dataObjs += `${tab(4)}\n`;
});
let signals = "";
canvas.signalDefs.forEach(s => {
signals += `${tab(2)}\n`;
});
let messages = "";
canvas.messageDefs.forEach(s => {
messages += `${tab(2)}\n`;
});
let BPMNShape = ``;
let BPMNEdge = ``;
let processXML = `${tab(2)}\n`;
processXML += dataObjs;
json.nodes.forEach(node => {
BPMNShape += `${tab(6)}\n`+
`${tab(8)}\n`+
`${tab(6)}\n`;
switch (node.clazz) {
case 'start':
processXML += `${tab(4)}\n`;
break;
case 'end':
processXML += `${tab(4)}\n`;
break;
case 'userTask': {
let assignments = "";
if(node.assignValue && node.assignValue.length > 0){
if(node.assignType === 'person'){
assignments += `flowable:candidateUsers="${node.assignValue.join(',')}"`;
}else if(node.assignType === 'assignee'){
assignments += `flowable:assignee="${node.assignValue[0]}"`;
}else if(node.assignType === 'persongroup'){
assignments += `flowable:candidateGroups="${node.assignValue.join(',')}"`;
}
}
processXML += `${tab(4)}\n`;
break;
}
case 'javaTask': {
let javaClass = "";
if(node.javaClass){
javaClass = `flowable:class="${node.javaClass}"`;
}
processXML += `${tab(4)}\n`;
break;
}
case 'scriptTask': {
let script = "";
if(node.script) {
script = `${tab(6)}\n`;
}
processXML += `${tab(4)}\n${script}${tab(4)}\n`;
break;
}
case 'receiveTask':
processXML += `${tab(4)}\n`;
break;
case 'mailTask': {
let to = `${tab(8)}\n`;
to += `${tab(10)}\n`;
to += `${tab(8)}\n`;
let subject = `${tab(8)}\n`;
subject += `${tab(10)}\n`;
subject += `${tab(8)}\n`;
let text = `${tab(8)}\n`;
text += `${tab(10)}\n`;
text += `${tab(8)}\n`;
let extension = `${tab(6)}\n${to}${subject}${text}${tab(6)}\n`;
processXML += `${tab(4)}\n${extension}${tab(4)}\n`;
break;
}
case 'timerStart': {
const timer = `${tab(6)}\n${tab(8)}${node.cycle}\n${tab(6)}\n`;
processXML += `${tab(4)}\n${timer}${tab(4)}\n`;
break;
}
case 'timerCatch': {
const timer = `${tab(6)}\n${tab(8)}${node.cycle}\n${tab(6)}\n`;
processXML += `${tab(4)}\n${timer}${tab(4)}\n`;
break;
}
case 'signalStart': {
const signal = `${tab(6)}\n`;
processXML += `${tab(4)}\n${signal}${tab(4)}\n`;
break;
}
case 'signalCatch': {
const signal = `${tab(6)}\n`;
processXML += `${tab(4)}\n${signal}${tab(4)}\n`;
break;
}
case 'messageStart': {
const message = `${tab(6)}\n`;
processXML += `${tab(4)}\n${message}${tab(4)}\n`;
break;
}
case 'messageCatch': {
const message = `${tab(6)}\n`;
processXML += `${tab(4)}\n${message}${tab(4)}\n`;
break;
}
case 'gateway':
processXML += `${tab(4)}\n`;
break;
case 'exclusiveGateway':
processXML += `${tab(4)}\n`;
break;
case 'parallelGateway':
processXML += `${tab(4)}\n`;
break;
case 'inclusiveGateway':
processXML += `${tab(4)}\n`;
break;
default:
break;
}
});
json.edges.forEach(edge => {
BPMNEdge += `${tab(6)}\n`+
`${tab(8)}\n`+
`${tab(8)}\n`+
`${tab(6)}\n`;
let condition = "";
if(edge.conditionExpression){
condition = `${tab(6)}\n`;
}
processXML += `${tab(4)}${condition}\n`;
});
processXML += `${tab(2)}\n`;
let BPMNDiagram = `${tab(2)}\n`+
`${tab(4)}\n${BPMNShape}${BPMNEdge}${tab(4)}\n`+
`${tab(2)}\n`;
let xml = `\n`;
xml += `\n`;
xml += signals;
xml += messages;
xml += processXML;
xml += BPMNDiagram;
xml += ``;
if(createFile) {
downloadFile(xml, 'application/xml;charset=utf-8;', `${name}.bpmn20.xml`)
}
return xml;
}
export function exportImg(canvasPanel,filename,createFile = true) {
filename = filename || 'flow'
let canvas = canvasPanel.querySelector('canvas')
let context = canvas.getContext('2d')
let imgData = context.getImageData(0, 0, canvas.width, canvas.height).data
let left = canvas.width;
let right = 0;
let top = canvas.height;
let bottom = 0
for (let i = 0; i < canvas.width; i++) {
for (let j = 0; j < canvas.height; j++) {
let pos = (i + canvas.width * j) * 4
if (imgData[pos] > 0 || imgData[pos + 1] > 0 || imgData[pos + 2] || imgData[pos + 3] > 0) {
bottom = Math.max(j, bottom) // 找到有色彩的最下端
right = Math.max(i, right) // 找到有色彩的最右端
top = Math.min(j, top) // 找到有色彩的最上端
left = Math.min(i, left) // 找到有色彩的最左端
}
}
}
let c = document.createElement('canvas')
// 四周空白余量
let blankWidth = 60
c.width = right - left + blankWidth*2
c.height = bottom - top + blankWidth*2
let ctx = c.getContext('2d')
// 设置白底
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, c.width, c.height);
ctx.drawImage(canvas, left-blankWidth, top-blankWidth, c.width, c.height, 0, 0, c.width, c.height)
let data = c.toDataURL("image/jpeg")
if(createFile) {
let parts = data.split(';base64,');
let contentType = parts[0].split(':')[1];
let raw = window.atob(parts[1]);
let uInt8Array = new Uint8Array(raw.length);
for (let i = 0; i < raw.length; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
downloadFile(uInt8Array, contentType, `${filename}.jpg`)
}
return data
}
function downloadFile(data, type, filename) {
const blob = new Blob([data], { type });
let link = document.createElement('a');
if (link.download !== undefined) {
let url = URL.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute('download', filename);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}