import React, { Component } from 'react'; import * as Blockly from 'blockly/core'; class BlocklySvg extends Component { constructor(props) { super(props); this.state = { svg: '' }; } componentDidMount() { this.getSvg(); } componentDidUpdate(props) { if(props.initialXml !== this.props.initialXml){ this.getSvg(); } } getSvg = () => { const workspace = Blockly.getMainWorkspace(); workspace.clear(); Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(this.props.initialXml), workspace); var canvas = workspace.svgBlockCanvas_.cloneNode(true); if (canvas.children[0] !== undefined) { canvas.removeAttribute("transform"); // does not work in react // var cssContent = Blockly.Css.CONTENT.join(''); var cssContent = ''; for (var i = 0; i < document.getElementsByTagName('style').length; i++) { if(/^blockly.*$/.test(document.getElementsByTagName('style')[i].id)){ cssContent += document.getElementsByTagName('style')[i].firstChild.data.replace(/\..* \./g, '.'); } } // ensure that fill-opacity is 1, because there cannot be a replacing // https://github.com/google/blockly/pull/3431/files#diff-00254795773903d3c0430915a68c9521R328 cssContent += `.blocklyPath { fill-opacity: 1; } .blocklyPathDark { display: flex; } .blocklyPathLight { display: flex; } `; var css = ''; var bbox = document.getElementsByClassName("blocklyBlockCanvas")[0].getBBox(); var content = new XMLSerializer().serializeToString(canvas); var xml = ` ${css}">${content}`; this.setState({svg: xml}); } } render() { return (
); }; } export default BlocklySvg;