University stuff.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

datastruktur.html 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style>
  6. body {
  7. margin: 0px;
  8. padding: 0px;
  9. }
  10. canvas {
  11. position: absolute;
  12. }
  13. * {
  14. white-space: nowrap;
  15. }
  16. class,
  17. Object {
  18. -moz-user-select: none;
  19. -ms-user-select: none;
  20. -webkit-touch-callout: none;
  21. -webkit-user-select: none;
  22. user-select: none;
  23. vertical-align: top;
  24. border-radius: 20px;
  25. border: 1px solid #333;
  26. display: inline-block;
  27. padding: 20px;
  28. margin: 10px;
  29. margin-top: 30px;
  30. min-width: 250px;
  31. cursor: pointer;
  32. }
  33. class {
  34. border-style: dashed;
  35. }
  36. class>name,
  37. object>name {
  38. position: absolute;
  39. margin-top: -40px;
  40. margin-left: -30px;
  41. }
  42. class>prop,
  43. object>prop {
  44. margin-bottom: 20px;
  45. width: 200px;
  46. display: block;
  47. }
  48. class>prop>name,
  49. class>prop>val,
  50. class>prop>type,
  51. object>prop>name,
  52. object>prop>val,
  53. object>prop>type {
  54. display: block;
  55. text-align: right;
  56. }
  57. class>prop>val,
  58. object>prop>val {
  59. border: 1px solid #333;
  60. height: 24px;
  61. line-height: 24px;
  62. text-align: center;
  63. }
  64. class>method,
  65. object>method {
  66. margin-bottom: 20px;
  67. display: block;
  68. }
  69. class>method:last-child,
  70. object>method:last-child {
  71. margin-bottom: 0px;
  72. }
  73. class>method>name,
  74. object>method>name {
  75. display: block;
  76. border-bottom: 1px solid #000;
  77. margin-left: -20px;
  78. margin-bottom: -1px;
  79. }
  80. class>method>name>.spacer,
  81. object>method>name>.spacer {
  82. width: 20px;
  83. display: inline-block;
  84. }
  85. class>method>name>.pre,
  86. class>method>name>.post,
  87. class>method>name>.args,
  88. object>method>name>.pre,
  89. object>method>name>.post,
  90. object>method>name>.args {
  91. font-weight: bold;
  92. }
  93. class>method>name>.pre,
  94. object>method>name>.pre {
  95. color: green;
  96. }
  97. class>method>name>.args,
  98. object>method>name>.args {
  99. color: #2ea2cc;
  100. }
  101. class>method>name>.post,
  102. object>method>name>.post {
  103. color: blue;
  104. }
  105. class>method>bod,
  106. object>method>bod {
  107. display: block;
  108. border: 1px solid #000;
  109. padding: 5px;
  110. white-space: pre-wrap;
  111. }
  112. </style>
  113. </head>
  114. <body>
  115. <object name="efrl-node-1" class="Node">
  116. <prop name="val" type="Resept"><arrow to="efrl-node-1-val"></arrow></prop>
  117. <prop name="next" type="Node"><arrow to="efrl-node-2"></arrow></prop>
  118. </object>
  119. <object name="efrl-node-1-val" class="HvitResept">
  120. <prop name="id" val="0" type="int"></prop>
  121. <prop name="utskriverNavn" val="utskriver1" type="String"></prop>
  122. </object>
  123. <object name="efrl-node-2" class="Node">
  124. <prop name="val" type="Resept"><arrow to="efrl-node-2-val"></arrow></prop>
  125. <prop name="next" type="Node"><arrow to="efrl-node-3"></arrow></prop>
  126. </object>
  127. <object name="efrl-node-2-val" class="HvitResept">
  128. <prop name="id" val="1" type="int"></prop>
  129. <prop name="utskriverNavn" val="utskriver2" type="String"></prop>
  130. </object>
  131. <object name="efrl-node-3" class="Node">
  132. <prop name="val" type="Resept"><arrow to="efrl-node-3-val"></arrow></prop>
  133. <prop name="next" type="Node" val="null"></prop>
  134. </object>
  135. <object name="efrl-node-3-val" class="HvitResept">
  136. <prop name="id" val="2" type="int"></prop>
  137. <prop name="utskriverNavn" val="utskriver3" type="String"></prop>
  138. </object>
  139. <object name="efrl" class="EldsteForstReseptListe">
  140. <prop name="first" type="Node"><arrow to="efrl-node-1"></arrow></prop>
  141. <prop name="last" type="Node"><arrow to="efrl-node-3"></arrow></prop>
  142. </object>
  143. <class name="Demo">
  144. <prop name="efrl" type="EldsteForstReseptListe"><arrow to="efrl"></arrow></prop>
  145. <prop name="yfrl" type="YngsteForstReseptListe"><arrow to="yfrl"></arrow></prop>
  146. </class>
  147. <object name="yfrl" class="YngsteForstReseptListe">
  148. <prop name="first" type="Node"><arrow to="yfrl-node-1"></arrow></prop>
  149. <prop name="last" type="Node"><arrow to="yfrl-node-3"></arrow></prop>
  150. </object>
  151. <object name="yfrl-node-1" class="Node">
  152. <prop name="val" type="Resept"><arrow to="yfrl-node-1-val"></arrow></prop>
  153. <prop name="next" type="Node"><arrow to="yfrl-node-2"></arrow></prop>
  154. </object>
  155. <object name="yfrl-node-1-val" class="HvitResept">
  156. <prop name="id" val="5" type="int"></prop>
  157. <prop name="utskriverNavn" val="utskriver3" type="String">
  158. </object>
  159. <object name="yfrl-node-2" class="Node">
  160. <prop name="val" type="Resept"><arrow to="yfrl-node-2-val"></arrow></prop>
  161. <prop name="next" type="Node"><arrow to="yfrl-node-3"></arrow></prop>
  162. </object>
  163. <object name="yfrl-node-2-val" class="HvitResept">
  164. <prop name="id" val="4" type="int"></prop>
  165. <prop name="utskriverNavn" val="utskriver2" type="String">
  166. </object>
  167. <object name="yfrl-node-3" class="Node">
  168. <prop name="val" type="Resept"><arrow to="yfrl-node-3-val"></arrow></prop>
  169. <prop name="next" type="Node" val="null"></prop>
  170. </object>
  171. <object name="yfrl-node-3-val" class="HvitResept">
  172. <prop name="id" val="3" type="int"></prop>
  173. <prop name="utskriverNavn" val="utskriver1" type="String">
  174. </object>
  175. <script>
  176. window.scrollTo(0, 0);
  177. var defaultPos = {
  178. "Demo": {
  179. "x": 1044,
  180. "y": 312
  181. },
  182. "efrl": {
  183. "x": 689,
  184. "y": 317
  185. },
  186. "efrl-node-1": {
  187. "x": 367,
  188. "y": 36
  189. },
  190. "efrl-node-1-val": {
  191. "x": 20,
  192. "y": 37
  193. },
  194. "efrl-node-2": {
  195. "x": 369,
  196. "y": 303
  197. },
  198. "efrl-node-2-val": {
  199. "x": 34,
  200. "y": 307
  201. },
  202. "efrl-node-3": {
  203. "x": 369,
  204. "y": 569
  205. },
  206. "efrl-node-3-val": {
  207. "x": 38,
  208. "y": 560
  209. },
  210. "rotte": {
  211. "x": 23,
  212. "y": 10
  213. },
  214. "yfrl": {
  215. "x": 1381,
  216. "y": 315
  217. },
  218. "yfrl-node-1": {
  219. "x": 1788,
  220. "y": 65
  221. },
  222. "yfrl-node-1-val": {
  223. "x": 2108,
  224. "y": 53
  225. },
  226. "yfrl-node-2": {
  227. "x": 1775,
  228. "y": 311
  229. },
  230. "yfrl-node-2-val": {
  231. "x": 2108,
  232. "y": 310
  233. },
  234. "yfrl-node-3": {
  235. "x": 1797,
  236. "y": 560
  237. },
  238. "yfrl-node-3-val": {
  239. "x": 2112,
  240. "y": 551
  241. }
  242. };
  243. document.addEventListener("dragstart", function(evt) {
  244. evt.preventDefault();
  245. });
  246. function draggable(elem) {
  247. var pos;
  248. if (localStorage[elem.id]) {
  249. pos = JSON.parse(localStorage[elem.id]);
  250. } else {
  251. pos = defaultPos[elem.id] || { x: 0, y: 0 };
  252. }
  253. function updatePos() {
  254. elem.style.top = pos.y+"px";
  255. elem.style.left = pos.x+"px";
  256. elem.style.position = "absolute";
  257. drawArrows();
  258. }
  259. setTimeout(updatePos, 10);
  260. var mx, my = 0;
  261. elem.addEventListener("mousedown", function(evt) {
  262. mx = evt.clientX;
  263. my = evt.clientY;
  264. });
  265. elem.addEventListener("mousemove", function(evt) {
  266. if (evt.buttons !== 1)
  267. return;
  268. pos.x += evt.clientX - mx;
  269. pos.y += evt.clientY - my;
  270. mx = evt.clientX;
  271. my = evt.clientY;
  272. updatePos();
  273. });
  274. elem.addEventListener("mouseup", function() {
  275. localStorage[elem.id] = JSON.stringify(pos);
  276. });
  277. }
  278. function htents(str) {
  279. if (!str)
  280. return "";
  281. return str
  282. .replace(/&/g, "&amp;")
  283. .replace(/</g, "&lt;")
  284. .replace(/>/g, "&gt;")
  285. .replace(/{{/g, "&lt;")
  286. .replace(/}}/g, "&gt;")
  287. .replace(/^\t\t/gm, "")
  288. .trim();
  289. }
  290. function attr(elem, attr, noescape) {
  291. if (noescape)
  292. return elem.getAttribute(attr);
  293. else
  294. return htents(elem.getAttribute(attr));
  295. }
  296. function elemPos(elem) {
  297. var rect = elem.getBoundingClientRect();
  298. return {
  299. mid: {
  300. x: rect.left + (rect.width / 2),
  301. y: rect.top + (rect.height / 2)
  302. },
  303. top: rect.top,
  304. bot: rect.top + rect.height,
  305. left: rect.left,
  306. right: rect.right
  307. };
  308. }
  309. function drawArrow(ctx, fromx, fromy, tox, toy){
  310. var headlen = 10; // length of head in pixels
  311. var angle = Math.atan2(toy-fromy,tox-fromx);
  312. ctx.beginPath();
  313. ctx.moveTo(fromx, fromy);
  314. ctx.lineTo(tox, toy);
  315. ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/6),toy-headlen*Math.sin(angle-Math.PI/6));
  316. ctx.moveTo(tox, toy);
  317. ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/6),toy-headlen*Math.sin(angle+Math.PI/6));
  318. ctx.closePath();
  319. ctx.stroke();
  320. }
  321. //setup classes
  322. var classes = document.querySelectorAll("class");
  323. for (var i in classes) {
  324. if (!classes.hasOwnProperty(i)) continue;
  325. var c = classes[i];
  326. c.id = attr(c, "name", true);
  327. var eName = document.createElement("name");
  328. eName.innerHTML = "Klassedatastruktur <b>"+attr(c, "name")+"</b>";
  329. c.insertBefore(eName, c.firstChild);
  330. }
  331. //setup objects
  332. var objects = document.querySelectorAll("object");
  333. for (var i in objects) {
  334. if (!objects.hasOwnProperty(i)) continue;
  335. var obj = objects[i];
  336. obj.id = attr(obj, "name", true);
  337. var eName = document.createElement("name");
  338. eName.innerHTML =
  339. "Objekt av klassen <b>"+attr(obj, "class")+"</b>";
  340. obj.insertBefore(eName, obj.firstChild);
  341. }
  342. //setup props
  343. var props = document.querySelectorAll("prop");
  344. for (var i in props) {
  345. if (!props.hasOwnProperty(i)) continue;
  346. var prop = props[i];
  347. var eName = document.createElement("name");
  348. eName.innerHTML = "Navn: <b>"+attr(prop, "name")+"</b>";
  349. prop.appendChild(eName);
  350. var eVal = document.createElement("val");
  351. eVal.innerHTML = attr(prop, "val");
  352. prop.appendChild(eVal);
  353. var eType = document.createElement("type");
  354. eType.innerHTML = "Type: <b>"+attr(prop, "type")+"</b>";
  355. prop.appendChild(eType);
  356. }
  357. //setup methods
  358. var meths = document.querySelectorAll("method");
  359. for (var i in meths) {
  360. if (!meths.hasOwnProperty(i)) continue;
  361. var meth = meths[i];
  362. var body = htents(meth.innerHTML);
  363. meth.innerHTML = "";
  364. var eName = document.createElement("name");
  365. eName.innerHTML = "<span class='spacer'></span>"+
  366. " <span class='pre'>"+attr(meth, "pre")+"</span>"+
  367. " <span class='main'>"+attr(meth, "name")+"</span>"+
  368. "(<span class='args'>"+attr(meth, "args")+"</span>)"+
  369. " <span class='post'>"+attr(meth, "post")+"</span>";
  370. meth.appendChild(eName);
  371. var eBody = document.createElement("bod");
  372. eBody.innerHTML = body;
  373. meth.appendChild(eBody);
  374. }
  375. //create canvas
  376. var canvas = document.createElement("canvas");
  377. document.body.insertBefore(canvas, document.body.firstChild);
  378. var ctx = canvas.getContext("2d");
  379. //draw arrows
  380. function drawArrows() {
  381. canvas.height = window.innerHeight * 2;
  382. canvas.width = window.innerWidth * 2;
  383. var arrows = document.querySelectorAll("arrow");
  384. for (var i in arrows) {
  385. if (!arrows.hasOwnProperty(i)) continue;
  386. var arrow = arrows[i];
  387. var from = elemPos(arrow.parentNode);
  388. try {
  389. var to = elemPos(document.getElementById(arrow.getAttribute("to")));
  390. } catch (err) {
  391. console.log(err.toString());
  392. console.log(arrow);
  393. continue;
  394. }
  395. var fx, fy, tx, ty;
  396. fx = from.mid.x;
  397. fy = from.mid.y;
  398. if (from.mid.x > to.mid.x)
  399. tx = to.right;
  400. else
  401. tx = to.left;
  402. if (from.mid.y > to.mid.y)
  403. ty = to.bot;
  404. else
  405. ty = to.top;
  406. drawArrow(ctx, fx, fy, tx, ty);
  407. }
  408. }
  409. drawArrows();
  410. //draggable
  411. var draggables = document.querySelectorAll("class, object");
  412. for (var i in draggables) {
  413. if (!draggables.hasOwnProperty(i)) continue;
  414. draggable(draggables[i]);
  415. }
  416. </script>
  417. </body>
  418. </html>