University stuff.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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="rad" class="Rad">
  116. <prop name="ruter" type="Rute[]"></prop>
  117. </object>
  118. <object name="kolonne" class="Kolonne">
  119. <prop name="ruter" type="Rute[]"></prop>
  120. </object>
  121. <object name="boks" class="Boks">
  122. <prop name="ruter" type="Rute[]"></prop>
  123. <prop name="bredde" type="int" val="3"></prop>
  124. <prop name="hoyde" type="int" val="2"></prop>
  125. </object>
  126. <object name="rute" class="Rute">
  127. <prop name="verdi" type="int" val="-1"></prop>
  128. <prop name="rad" type="Rad"><arrow to="rad"></arrow></prop>
  129. <prop name="kolonne" type="Kolonne"><arrow to="kolonne"></arrow></prop>
  130. <prop name="boks" type="Boks"><arrow to="boks"></arrow></prop>
  131. <prop name="brett" type="Brett"><arrow to="brett"></arrow></prop>
  132. </object>
  133. <object name="brett" class="Brett">
  134. <prop name="ruter" type="Rute[]"></prop>
  135. </object>
  136. <script>
  137. window.scrollTo(0, 0);
  138. var defaultPos = {
  139. };
  140. document.addEventListener("dragstart", function(evt) {
  141. evt.preventDefault();
  142. });
  143. function draggable(elem) {
  144. var pos;
  145. if (localStorage[elem.id]) {
  146. pos = JSON.parse(localStorage[elem.id]);
  147. } else {
  148. pos = defaultPos[elem.id] || { x: 0, y: 0 };
  149. }
  150. function updatePos() {
  151. elem.style.top = pos.y+"px";
  152. elem.style.left = pos.x+"px";
  153. elem.style.position = "absolute";
  154. drawArrows();
  155. }
  156. setTimeout(updatePos, 10);
  157. var mx, my = 0;
  158. elem.addEventListener("mousedown", function(evt) {
  159. mx = evt.clientX;
  160. my = evt.clientY;
  161. });
  162. elem.addEventListener("mousemove", function(evt) {
  163. if (evt.buttons !== 1)
  164. return;
  165. pos.x += evt.clientX - mx;
  166. pos.y += evt.clientY - my;
  167. mx = evt.clientX;
  168. my = evt.clientY;
  169. updatePos();
  170. });
  171. elem.addEventListener("mouseup", function() {
  172. localStorage[elem.id] = JSON.stringify(pos);
  173. });
  174. }
  175. function htents(str) {
  176. if (!str)
  177. return "";
  178. return str
  179. .replace(/&/g, "&amp;")
  180. .replace(/</g, "&lt;")
  181. .replace(/>/g, "&gt;")
  182. .replace(/{{/g, "&lt;")
  183. .replace(/}}/g, "&gt;")
  184. .replace(/^\t\t/gm, "")
  185. .trim();
  186. }
  187. function attr(elem, attr, noescape) {
  188. if (noescape)
  189. return elem.getAttribute(attr);
  190. else
  191. return htents(elem.getAttribute(attr));
  192. }
  193. function elemPos(elem) {
  194. var rect = elem.getBoundingClientRect();
  195. return {
  196. mid: {
  197. x: rect.left + (rect.width / 2),
  198. y: rect.top + (rect.height / 2)
  199. },
  200. top: rect.top,
  201. bot: rect.top + rect.height,
  202. left: rect.left,
  203. right: rect.right
  204. };
  205. }
  206. function drawArrow(ctx, fromx, fromy, tox, toy){
  207. var headlen = 10; // length of head in pixels
  208. var angle = Math.atan2(toy-fromy,tox-fromx);
  209. ctx.beginPath();
  210. ctx.moveTo(fromx, fromy);
  211. ctx.lineTo(tox, toy);
  212. ctx.lineTo(tox-headlen*Math.cos(angle-Math.PI/6),toy-headlen*Math.sin(angle-Math.PI/6));
  213. ctx.moveTo(tox, toy);
  214. ctx.lineTo(tox-headlen*Math.cos(angle+Math.PI/6),toy-headlen*Math.sin(angle+Math.PI/6));
  215. ctx.closePath();
  216. ctx.stroke();
  217. }
  218. //setup classes
  219. var classes = document.querySelectorAll("class");
  220. for (var i in classes) {
  221. if (!classes.hasOwnProperty(i)) continue;
  222. var c = classes[i];
  223. c.id = attr(c, "name", true);
  224. var eName = document.createElement("name");
  225. eName.innerHTML = "Klassedatastruktur <b>"+attr(c, "name")+"</b>";
  226. c.insertBefore(eName, c.firstChild);
  227. }
  228. //setup objects
  229. var objects = document.querySelectorAll("object");
  230. for (var i in objects) {
  231. if (!objects.hasOwnProperty(i)) continue;
  232. var obj = objects[i];
  233. obj.id = attr(obj, "name", true);
  234. var eName = document.createElement("name");
  235. eName.innerHTML =
  236. "Objekt av klassen <b>"+attr(obj, "class")+"</b>";
  237. obj.insertBefore(eName, obj.firstChild);
  238. }
  239. //setup props
  240. var props = document.querySelectorAll("prop");
  241. for (var i in props) {
  242. if (!props.hasOwnProperty(i)) continue;
  243. var prop = props[i];
  244. var eName = document.createElement("name");
  245. eName.innerHTML = "Navn: <b>"+attr(prop, "name")+"</b>";
  246. prop.appendChild(eName);
  247. var eVal = document.createElement("val");
  248. eVal.innerHTML = attr(prop, "val");
  249. prop.appendChild(eVal);
  250. var eType = document.createElement("type");
  251. eType.innerHTML = "Type: <b>"+attr(prop, "type")+"</b>";
  252. prop.appendChild(eType);
  253. }
  254. //setup methods
  255. var meths = document.querySelectorAll("method");
  256. for (var i in meths) {
  257. if (!meths.hasOwnProperty(i)) continue;
  258. var meth = meths[i];
  259. var body = htents(meth.innerHTML);
  260. meth.innerHTML = "";
  261. var eName = document.createElement("name");
  262. eName.innerHTML = "<span class='spacer'></span>"+
  263. " <span class='pre'>"+attr(meth, "pre")+"</span>"+
  264. " <span class='main'>"+attr(meth, "name")+"</span>"+
  265. "(<span class='args'>"+attr(meth, "args")+"</span>)"+
  266. " <span class='post'>"+attr(meth, "post")+"</span>";
  267. meth.appendChild(eName);
  268. var eBody = document.createElement("bod");
  269. eBody.innerHTML = body;
  270. meth.appendChild(eBody);
  271. }
  272. //create canvas
  273. var canvas = document.createElement("canvas");
  274. document.body.insertBefore(canvas, document.body.firstChild);
  275. var ctx = canvas.getContext("2d");
  276. //draw arrows
  277. function drawArrows() {
  278. canvas.height = window.innerHeight * 2;
  279. canvas.width = window.innerWidth * 2;
  280. var arrows = document.querySelectorAll("arrow");
  281. for (var i in arrows) {
  282. if (!arrows.hasOwnProperty(i)) continue;
  283. var arrow = arrows[i];
  284. var from = elemPos(arrow.parentNode);
  285. try {
  286. var to = elemPos(document.getElementById(arrow.getAttribute("to")));
  287. } catch (err) {
  288. console.log(err.toString());
  289. console.log(arrow);
  290. continue;
  291. }
  292. var fx, fy, tx, ty;
  293. fx = from.mid.x;
  294. fy = from.mid.y;
  295. if (from.mid.x > to.mid.x)
  296. tx = to.right;
  297. else
  298. tx = to.left;
  299. if (from.mid.y > to.mid.y)
  300. ty = to.bot;
  301. else
  302. ty = to.top;
  303. drawArrow(ctx, fx, fy, tx, ty);
  304. }
  305. }
  306. drawArrows();
  307. //draggable
  308. var draggables = document.querySelectorAll("class, object");
  309. for (var i in draggables) {
  310. if (!draggables.hasOwnProperty(i)) continue;
  311. draggable(draggables[i]);
  312. }
  313. </script>
  314. </body>
  315. </html>