dynamic_SVG_example.html 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <!-- Copyright © 2018-2019 Inria. All rights reserved. -->
  2. <!doctype html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="utf-8">
  6. <title>Dynamic SVG</title>
  7. </head>
  8. <body>
  9. <p>
  10. This page is an example of HTML/JS interacting with the lstopo SVG output.
  11. </p>
  12. <p>
  13. Load a SVG that was exported with lstopo's <b>native</b> SVG backend
  14. (e.g. with <tt>lstopo --of nativesvg foo.svg</tt>):
  15. </p>
  16. <input type="file" name="myFile" accept=".svg" onchange="openFile(event)">
  17. <br>
  18. <br>
  19. <object id="img" type="image/svg+xml">
  20. </object>
  21. <br>
  22. <p id='caption' style='display:none'>
  23. Click on a box to change its background color
  24. and replace its first text line (if any) with its SVG object id.
  25. </p>
  26. <p id='drag' style='display:none'>
  27. <input type='checkbox' id='draggable' onclick='enableDrag()'>Make boxes draggable</input>
  28. </p>
  29. </body>
  30. <footer>
  31. <script type="text/javascript">
  32. function openFile(event) {
  33. let image = document.getElementById('img')
  34. image.data = null
  35. var input = event.target;
  36. var TextReader = new FileReader()
  37. TextReader.onload = async function(){
  38. var parser = new DOMParser()
  39. let blob = new Blob([TextReader.result], {type: 'image/svg+xml'})
  40. let url = URL.createObjectURL(blob)
  41. image.data = await url
  42. setTimeout(function(){
  43. document.getElementById('caption').style = ''
  44. document.getElementById('drag').style = ''
  45. document.getElementById("draggable").checked = false
  46. svgObject = document.getElementById('img').contentDocument
  47. let svgElement = svgObject.getElementById('Machine_0_rect')
  48. if(svgObject.getElementById('Machine_0_rect')){
  49. start(svgObject)
  50. }else{
  51. const h1 = document.createElement('h1')
  52. h1.innerHTML = "Your svg file doesn't have the good format to load javascript"
  53. document.body.appendChild(h1)
  54. }
  55. },200)
  56. }
  57. TextReader.readAsText(input.files[0], "UTF-8")
  58. }
  59. function enableDrag(){
  60. let svgObject = document.getElementById('img').contentDocument
  61. const elements = svgObject.getElementsByTagName('rect')
  62. for (let element of elements) {
  63. element.classList.toggle("draggable")
  64. }
  65. }
  66. function start(svgObject){
  67. makeDraggable(svgObject)
  68. const texts = svgObject.getElementsByTagName('text')
  69. for (let text of texts) {
  70. text.setAttribute("style", text.getAttribute("style") + ";pointer-events:none;")
  71. }
  72. const elements = svgObject.getElementsByTagName('rect')
  73. for (let element of elements) {
  74. if(!element.id.includes("Bridge")){
  75. element.addEventListener('click', function(e) {
  76. changeColor(svgObject, e.target)
  77. changeText(svgObject, e.target)
  78. })
  79. }
  80. }
  81. }
  82. function changeColor(svgObject, element){
  83. oldColor = element.getAttribute("saveColor")
  84. if(!oldColor){
  85. element.setAttribute("saveColor", element.getAttribute("fill"))
  86. element.setAttribute("fill", "red")
  87. }else{
  88. element.setAttribute("fill", oldColor)
  89. element.removeAttribute("saveColor")
  90. }
  91. }
  92. function changeText(svgObject, element){
  93. if(element.id == "")
  94. return
  95. const text = svgObject.getElementById(element.id.replace('rect', 'text'))
  96. let textContent = element.getAttribute("saveText")
  97. if(!textContent){
  98. element.setAttribute("saveText", text.innerHTML)
  99. textContent = element.id
  100. }else{
  101. element.removeAttribute("saveText")
  102. }
  103. let svg = svgObject.documentElement;
  104. let svgNS = svg.namespaceURI;
  105. let newText = text.cloneNode(false)
  106. newText.appendChild(svgObject.createTextNode(textContent))
  107. svg.removeChild(text)
  108. svg.appendChild(newText)
  109. }
  110. function makeDraggable(svgObject) {
  111. let selectedElement = null
  112. let text = null
  113. let marginTextX = null
  114. let marginTextY = null
  115. svgObject.addEventListener('mousedown', startDrag)
  116. svgObject.addEventListener('mousemove', drag)
  117. svgObject.addEventListener('mouseup', endDrag)
  118. svgObject.addEventListener('mouseleave', endDrag)
  119. function startDrag(evt) {
  120. if (evt.target.classList.contains('draggable')) {
  121. selectedElement = evt.target;
  122. text = getText(svgObject, selectedElement.id)
  123. marginTextX = text.getAttribute("x") - selectedElement.getAttribute("x")
  124. marginTextY = text.getAttribute("y") - selectedElement.getAttribute("y")
  125. }
  126. }
  127. function drag(evt) {
  128. if (selectedElement) {
  129. evt.preventDefault();
  130. let textDragX = evt.clientX + marginTextX
  131. let textDragY = evt.clientY + marginTextY
  132. let dragX = evt.clientX;
  133. let dragY = evt.clientY;
  134. selectedElement.setAttribute("x", dragX);
  135. selectedElement.setAttribute("y", dragY);
  136. text.setAttribute("x", textDragX);
  137. text.setAttribute("y", textDragY);
  138. }
  139. }
  140. function endDrag(evt) {
  141. selectedElement = null
  142. }
  143. }
  144. </script>
  145. </footer>
  146. </html>