You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

svg_viewer.html 6.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <html>
  2. <title>Visualizer</title>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  5. </head>
  6. <script>
  7. window.onload = () => {
  8. var board = document.getElementById('board');
  9. var fileInput = document.getElementById('fileInput');
  10. var desc = document.getElementById('desc');
  11. var hRange = document.getElementById('hRange');
  12. var vRange = document.getElementById('vRange');
  13. var lastColor = undefined;
  14. var lastElem = undefined;
  15. var scale = 1;
  16. var svg = undefined;
  17. var svgWidth = undefined;
  18. var svgHeight = undefined;
  19. var resetBtn = document.getElementById('resetBtn');
  20. var relocBtn = document.getElementById('relocBtn');
  21. var loadDesc = (svgElem) => {
  22. var mgeType = svgElem.attributes['tag:type'];
  23. if (mgeType === undefined) {
  24. return;
  25. }
  26. var elemList = [];
  27. for (attrName of svgElem.getAttributeNames()) {
  28. var prefix = 'tag:';
  29. if (!attrName.startsWith(prefix)) {
  30. continue;
  31. }
  32. var elem = '<p>' + attrName.substr(prefix.length) + ': ' + svgElem.attributes[attrName].value + '</p>'
  33. elemList.push(elem);
  34. }
  35. desc.innerHTML = elemList.join('');
  36. };
  37. var selectElem = svgElem => {
  38. loadDesc(svgElem);
  39. lastColor = svgElem.attributes['fill'].value;
  40. lastElem = svgElem;
  41. svgElem.attributes['fill'].value = 'green';
  42. };
  43. var unselectLast = svgElem => {
  44. if (lastElem) {
  45. lastElem.attributes['fill'].value = lastColor;
  46. }
  47. lastElem = undefined;
  48. lastColor = undefined;
  49. };
  50. var recLoadSVG = svgElem => {
  51. if (svgElem.children === undefined) {
  52. return;
  53. }
  54. svgElem.onmousedown = e => {
  55. var mgeType = svgElem.attributes['tag:type'];
  56. if (mgeType === undefined) {
  57. return;
  58. }
  59. unselectLast();
  60. selectElem(svgElem);
  61. e.stopPropagation();
  62. };
  63. for (child of svgElem.children) {
  64. recLoadSVG(child);
  65. }
  66. }
  67. var scaleBoard = (x, y) => {
  68. var transform = 'scale(' + x + ',' + y + ')';
  69. svg.setAttribute('transform', transform);
  70. board.style['width'] = svgWidth * x;
  71. board.style['height'] = svgHeight * y;
  72. }
  73. var autoScaleBoard = () => {
  74. var hRangeValue = Math.sqrt(Number(hRange.value) / 10);
  75. var vRangeValue = Math.sqrt(Number(vRange.value) / 10);
  76. scaleBoard(Number(hRangeValue), Number(vRangeValue));
  77. }
  78. var zoomBoard = dScale => {
  79. scale *= dScale;
  80. scaleBoard(scale, scale);
  81. };
  82. var reset = () => {
  83. if (!svgHeight || !svgWidth) {
  84. return;
  85. }
  86. var vScale = window.screen.availHeight / svgHeight;
  87. var hScale = window.screen.availWidth / svgWidth;
  88. var minScale = Math.min(hScale, vScale);
  89. zoomBoard(minScale / scale);
  90. window.scrollTo({
  91. top: 0,
  92. left: 0,
  93. });
  94. };
  95. var loadSVG = () => {
  96. var file = fileInput.files[0];
  97. var reader = new FileReader();
  98. reader.readAsText(file, "UTF-8");
  99. reader.onload = e => {
  100. board.innerHTML = '<p style="margin: 0;">' + e.target.result + '</p>';
  101. svg = board.children[0].children[0];
  102. svgWidth = svg.attributes['width'].value;
  103. svgHeight = svg.attributes['height'].value;
  104. for (child of board.children) {
  105. recLoadSVG(child);
  106. var svgInfo = child.attributes['svg:info'];
  107. if (svgInfo !== undefined) {
  108. var elemList = [];
  109. for (attrName of child.getAttributeNames()) {
  110. var prefix = 'svg:';
  111. if (!attrName.startsWith(prefix)) {
  112. continue;
  113. }
  114. var elem = '<p>' + attrName.substr(prefix.length) + ': ' + child.attributes[attrName].value + '</p>'
  115. elemList.push(elem);
  116. }
  117. info.innerHTML = elemList.join('');
  118. }
  119. }
  120. setTimeout(reset, 1);
  121. };
  122. }
  123. window.addEventListener('wheel', e => {
  124. if (e.ctrlKey) {
  125. e.preventDefault();
  126. e.stopPropagation();
  127. var factor = 1;
  128. if (e.deltaY < 0) {
  129. factor = 1.1;
  130. } else if (e.deltaY > 0) {
  131. factor = 1 / 1.1;
  132. }
  133. zoomBoard(factor);
  134. var newPageX = e.pageX * factor;
  135. var newPageY = e.pageY * factor;
  136. x = newPageX - e.x;
  137. y = newPageY - e.y;
  138. window.scrollTo({
  139. top: y,
  140. left: x,
  141. });
  142. } else if (e.altKey) {
  143. }
  144. }, { 'passive': false });
  145. fileInput.onchange = loadSVG;
  146. resetBtn.onclick = reset;
  147. relocBtn.onclick = () => {
  148. if (!lastElem) {
  149. return;
  150. }
  151. y = scale * lastElem.attributes['y'].value;
  152. x = scale * lastElem.attributes['x'].value;
  153. window.scrollTo({
  154. top: y - window.screen.availHeight/2,
  155. left: x - window.screen.availWidth/2,
  156. behavior: 'smooth',
  157. });
  158. };
  159. };
  160. </script>
  161. <body>
  162. <p id="board"
  163. style="white-space: nowrap; display: flex; justify-content: center; align-content: center; align-items: center; margin: 0; left: 0;">
  164. </p>
  165. <div style="display: flex; position: fixed; top: 0; left: 0; right: 0; background-color: white; flex-grow: 2;">
  166. <input type='file' id='fileInput'></input>
  167. <div style="flex-grow: 1;"></div>
  168. <button id='resetBtn'>reset</button>
  169. <button id='relocBtn'>reloc</button>
  170. </div>
  171. <p id="desc" style="position: fixed; bottom: 0; background-color: white;">desc</p>
  172. <p id="info" style="position: fixed;top: 0; right: 0; background-color: white;">info</p>
  173. </body>
  174. </html>