/* 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); } }