cpee 2.0.19 → 2.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. checksums.yaml +4 -4
  2. data/cockpit/css/wfadaptor.css +17 -0
  3. data/cockpit/js/instance.js +0 -1
  4. data/cockpit/js_libs.zip +0 -0
  5. data/cockpit/themes/model/rngs/call.rng +2 -1
  6. data/cockpit/themes/model/rngs/callmanipulate.rng +2 -1
  7. data/cockpit/themes/model/theme.js +1 -1
  8. data/cpee.gemspec +2 -2
  9. data/lib/cpee/controller.rb +6 -3
  10. data/lib/cpee/implementation.rb +23 -8
  11. data/lib/cpee/implementation_notifications.rb +1 -1
  12. data/lib/cpee/persistence.rb +2 -1
  13. data/lib/cpee/redis.rb +57 -0
  14. data/server/routing/end.rb +16 -4
  15. data/server/routing/forward-events.rb +19 -7
  16. data/server/routing/forward-votes.rb +19 -7
  17. data/server/routing/persist.rb +26 -14
  18. data/tools/cpee +5 -5
  19. data/tools/test/README +4 -0
  20. data/tools/test/config.json +3 -0
  21. data/tools/test/contrib/graph_example.svg +1166 -0
  22. data/tools/test/contrib/legend.svg +817 -0
  23. data/tools/test/contrib/symbols.svg +224 -0
  24. data/tools/test/contrib/transformation1.xsl +264 -0
  25. data/tools/test/contrib/transformation2.xsl +10 -0
  26. data/tools/test/contrib/tree_example.svg +788 -0
  27. data/tools/test/css/model.css +24 -0
  28. data/tools/test/css/track.css +60 -0
  29. data/tools/test/css/ui.css +214 -0
  30. data/tools/test/css/wfadaptor.css +422 -0
  31. data/tools/test/edit.html +258 -0
  32. data/tools/test/graph.html +69 -0
  33. data/tools/test/index.html +258 -0
  34. data/tools/test/js/details.js +109 -0
  35. data/tools/test/js/instance.js +1344 -0
  36. data/tools/test/js/model.js +41 -0
  37. data/tools/test/js/parameters.js +82 -0
  38. data/tools/test/js/track.js +18 -0
  39. data/tools/test/js/ui.js +104 -0
  40. data/tools/test/js/wfadaptor.js +763 -0
  41. data/tools/test/js_libs.zip +0 -0
  42. data/tools/test/js_libs/Makefile +2 -0
  43. data/tools/test/js_libs/ansi_up.js +333 -0
  44. data/tools/test/js_libs/console.js +80 -0
  45. data/tools/test/js_libs/custommenu.css +84 -0
  46. data/tools/test/js_libs/custommenu.js +104 -0
  47. data/tools/test/js_libs/experiments1/relaxngui.css +185 -0
  48. data/tools/test/js_libs/experiments1/relaxngui.js +488 -0
  49. data/tools/test/js_libs/experiments1/rngtest9.html +60 -0
  50. data/tools/test/js_libs/experiments1/rngtest9.rng +35 -0
  51. data/tools/test/js_libs/experiments1/rngtest9.xml +8 -0
  52. data/tools/test/js_libs/jquery-2.2.4.min.js +4 -0
  53. data/tools/test/js_libs/jquery-3.2.1.min.js +4 -0
  54. data/tools/test/js_libs/jquery-3.3.1.min.js +2 -0
  55. data/tools/test/js_libs/jquery.browser.js +40 -0
  56. data/tools/test/js_libs/jquery.caret.min.js +10 -0
  57. data/tools/test/js_libs/jquery.cookie.js +117 -0
  58. data/tools/test/js_libs/jquery.min.js +1 -0
  59. data/tools/test/js_libs/jquery.svg.min.js +6 -0
  60. data/tools/test/js_libs/jquery.svgdom.min.js +6 -0
  61. data/tools/test/js_libs/markdown.min.js +1 -0
  62. data/tools/test/js_libs/parsequery.js +21 -0
  63. data/tools/test/js_libs/printf.js +368 -0
  64. data/tools/test/js_libs/relaxngui.css +213 -0
  65. data/tools/test/js_libs/relaxngui.js +543 -0
  66. data/tools/test/js_libs/strftime.min.js +1 -0
  67. data/tools/test/js_libs/tests/dataelements.html +59 -0
  68. data/tools/test/js_libs/tests/dataelements.rng +8 -0
  69. data/tools/test/js_libs/tests/dataelements.xml +3 -0
  70. data/tools/test/js_libs/tests/relaxngui.css +203 -0
  71. data/tools/test/js_libs/tests/relaxngui.js +502 -0
  72. data/tools/test/js_libs/tests/rngtest1.html +66 -0
  73. data/tools/test/js_libs/tests/rngtest1.rng +147 -0
  74. data/tools/test/js_libs/tests/rngtest1.xml +13 -0
  75. data/tools/test/js_libs/tests/rngtest2.html +60 -0
  76. data/tools/test/js_libs/tests/rngtest2.rng +6 -0
  77. data/tools/test/js_libs/tests/rngtest2.xml +3 -0
  78. data/tools/test/js_libs/tests/rngtest3.html +60 -0
  79. data/tools/test/js_libs/tests/rngtest3.rng +23 -0
  80. data/tools/test/js_libs/tests/rngtest3.xml +9 -0
  81. data/tools/test/js_libs/tests/rngtest4.html +60 -0
  82. data/tools/test/js_libs/tests/rngtest4.rng +19 -0
  83. data/tools/test/js_libs/tests/rngtest4.xml +12 -0
  84. data/tools/test/js_libs/tests/rngtest5.html +60 -0
  85. data/tools/test/js_libs/tests/rngtest5.rng +75 -0
  86. data/tools/test/js_libs/tests/rngtest5.xml +40 -0
  87. data/tools/test/js_libs/tests/rngtest6.html +60 -0
  88. data/tools/test/js_libs/tests/rngtest6.rng +24 -0
  89. data/tools/test/js_libs/tests/rngtest6.xml +6 -0
  90. data/tools/test/js_libs/tests/rngtest8.html +60 -0
  91. data/tools/test/js_libs/tests/rngtest8.rng +13 -0
  92. data/tools/test/js_libs/tests/rngtest8.xml +2 -0
  93. data/tools/test/js_libs/tests/rngtest9.html +60 -0
  94. data/tools/test/js_libs/tests/rngtest9.rng +31 -0
  95. data/tools/test/js_libs/tests/rngtest9.xml +8 -0
  96. data/tools/test/js_libs/ui.css +333 -0
  97. data/tools/test/js_libs/ui.html +168 -0
  98. data/tools/test/js_libs/ui.js +177 -0
  99. data/tools/test/js_libs/underscore.min.js +27 -0
  100. data/tools/test/js_libs/util.js +81 -0
  101. data/tools/test/js_libs/vkbeautify.0.99.00.beta.js +358 -0
  102. data/tools/test/js_libs/vkbeautify.js +1 -0
  103. data/tools/test/js_libs/webcomponents.min.js +196 -0
  104. data/tools/test/model.html +192 -0
  105. data/tools/test/rngs/attributes.rng +8 -0
  106. data/tools/test/rngs/dataelements.rng +8 -0
  107. data/tools/test/rngs/endpoints.rng +8 -0
  108. data/tools/test/templates.legacy/Async.xml +46 -0
  109. data/tools/test/templates.legacy/BCO.xml +70 -0
  110. data/tools/test/templates.legacy/BCS.xml +70 -0
  111. data/tools/test/templates.legacy/Centurio.xml +75 -0
  112. data/tools/test/templates.legacy/Concurrent.xml +40 -0
  113. data/tools/test/templates.legacy/Coopis Testset.xml +76 -0
  114. data/tools/test/templates.legacy/Endpoints and Data Manipulation.xml +30 -0
  115. data/tools/test/templates.legacy/ICSOC Testset.xml +95 -0
  116. data/tools/test/templates.legacy/Infinity.xml +28 -0
  117. data/tools/test/templates.legacy/Lego Boxer.xml +31 -0
  118. data/tools/test/templates.legacy/Lego Conveyor.xml +31 -0
  119. data/tools/test/templates.legacy/Lego Crane.xml +87 -0
  120. data/tools/test/templates.legacy/Lego Ejector.xml +55 -0
  121. data/tools/test/templates.legacy/Lego Full.xml +142 -0
  122. data/tools/test/templates.legacy/Lego Liddy.xml +40 -0
  123. data/tools/test/templates.legacy/Lego Plate.xml +31 -0
  124. data/tools/test/templates.legacy/Lego Transporter.xml +43 -0
  125. data/tools/test/templates.legacy/Lego_Part_1.xml +85 -0
  126. data/tools/test/templates.legacy/LgLinear.xml +65 -0
  127. data/tools/test/templates.legacy/Linear.xml +77 -0
  128. data/tools/test/templates.legacy/Log.xml +117 -0
  129. data/tools/test/templates.legacy/Mangler 1.xml +87 -0
  130. data/tools/test/templates.legacy/Mangler 2.xml +103 -0
  131. data/tools/test/templates.legacy/Manuel Labels.xml +55 -0
  132. data/tools/test/templates.legacy/Promise.xml +275 -0
  133. data/tools/test/templates.legacy/SOPROMO Test Sonification.xml +83 -0
  134. data/tools/test/templates.legacy/Subprocess.xml +56 -0
  135. data/tools/test/templates.legacy/Syncing P34 1.xml +77 -0
  136. data/tools/test/templates.legacy/Syncing P34 2.xml +77 -0
  137. data/tools/test/templates.legacy/Syncing P34 3.xml +77 -0
  138. data/tools/test/templates.legacy/Syncing P34.xml +77 -0
  139. data/tools/test/templates.legacy/TEST - Bad Loop.xml +173 -0
  140. data/tools/test/templates.legacy/TEST - Wrong Positions.xml +174 -0
  141. data/tools/test/templates.legacy/Take_5.xml +48 -0
  142. data/tools/test/templates.legacy/Update.xml +32 -0
  143. data/tools/test/templates.legacy/Worklist Parallel.xml +104 -0
  144. data/tools/test/templates.legacy/Worklist Test CPEE.xml +40 -0
  145. data/tools/test/templates.legacy/Worklist Test.xml +42 -0
  146. data/tools/test/templates.legacy/Worklist Test2.xml +43 -0
  147. data/tools/test/templates.legacy/convert_cpee2.rb +15 -0
  148. data/tools/test/templates.legacy/convert_preset.rb +32 -0
  149. data/tools/test/templates.legacy/testsets.xml +37 -0
  150. data/tools/test/templates.legacy/transformations.xml +4 -0
  151. data/tools/test/templates/Coopis 2010.xml +76 -0
  152. data/tools/test/templates/IUPC arXiv:1104.3609 P34 1.xml +77 -0
  153. data/tools/test/templates/IUPC arXiv:1104.3609 P34 2.xml +77 -0
  154. data/tools/test/templates/IUPC arXiv:1104.3609 P34 3.xml +77 -0
  155. data/tools/test/templates/Track Test Local.xml +82 -0
  156. data/tools/test/templates/Track Test.xml +82 -0
  157. data/tools/test/templates/UR-VUE 2020 Manual Adjust.xml +182 -0
  158. data/tools/test/templates/UR-VUE 2020 Solution Baseline.xml +203 -0
  159. data/tools/test/templates/UR-VUE 2020 Solution NN.xml +197 -0
  160. data/tools/test/templates/UR-VUE 2020 Solution View.xml +151 -0
  161. data/tools/test/templates/UR-VUE 2020.xml +26 -0
  162. data/tools/test/templates/Worklist.xml +42 -0
  163. data/tools/test/templates/instantiate.local/Take_Sub.xml +59 -0
  164. data/tools/test/templates/instantiate/Take_Perf.xml +46 -0
  165. data/tools/test/templates/instantiate/Take_Sub.xml +58 -0
  166. data/tools/test/templates/instantiate/Take_X.xml +48 -0
  167. data/tools/test/themes/compact/theme.js +1285 -0
  168. data/tools/test/themes/diana/theme.js +1650 -0
  169. data/tools/test/themes/extended/theme.js +1325 -0
  170. data/tools/test/themes/model/rngs/alternative.rng +1 -0
  171. data/tools/test/themes/model/rngs/call.rng +67 -0
  172. data/tools/test/themes/model/rngs/callmanipulate.rng +72 -0
  173. data/tools/test/themes/model/rngs/choose.rng +1 -0
  174. data/tools/test/themes/model/rngs/critical.rng +1 -0
  175. data/tools/test/themes/model/rngs/escape.rng +1 -0
  176. data/tools/test/themes/model/rngs/group.rng +1 -0
  177. data/tools/test/themes/model/rngs/loop.rng +1 -0
  178. data/tools/test/themes/model/rngs/manipulate.rng +1 -0
  179. data/tools/test/themes/model/rngs/otherwise.rng +1 -0
  180. data/tools/test/themes/model/rngs/parallel.rng +1 -0
  181. data/tools/test/themes/model/rngs/parallel_branch.rng +1 -0
  182. data/tools/test/themes/model/rngs/scripts.rng +7 -0
  183. data/tools/test/themes/model/rngs/stop.rng +1 -0
  184. data/tools/test/themes/model/rngs/terminate.rng +1 -0
  185. data/tools/test/themes/model/theme.js +1268 -0
  186. data/tools/test/themes/packed/theme.js +1286 -0
  187. data/tools/test/themes/preset/rngs/alternative.rng +25 -0
  188. data/tools/test/themes/preset/rngs/call.rng +122 -0
  189. data/tools/test/themes/preset/rngs/callmanipulate.rng +145 -0
  190. data/tools/test/themes/preset/rngs/choose.rng +14 -0
  191. data/tools/test/themes/preset/rngs/closed_loop.rng +62 -0
  192. data/tools/test/themes/preset/rngs/closed_loop_cancel.rng +5 -0
  193. data/tools/test/themes/preset/rngs/closed_loop_control.rng +31 -0
  194. data/tools/test/themes/preset/rngs/closed_loop_measuring.rng +12 -0
  195. data/tools/test/themes/preset/rngs/critical.rng +5 -0
  196. data/tools/test/themes/preset/rngs/escape.rng +1 -0
  197. data/tools/test/themes/preset/rngs/group.rng +3 -0
  198. data/tools/test/themes/preset/rngs/loop.rng +22 -0
  199. data/tools/test/themes/preset/rngs/manipulate.rng +9 -0
  200. data/tools/test/themes/preset/rngs/otherwise.rng +22 -0
  201. data/tools/test/themes/preset/rngs/parallel.rng +21 -0
  202. data/tools/test/themes/preset/rngs/parallel_branch.rng +8 -0
  203. data/tools/test/themes/preset/rngs/scripts.rng +23 -0
  204. data/tools/test/themes/preset/rngs/stop.rng +5 -0
  205. data/tools/test/themes/preset/rngs/terminate.rng +1 -0
  206. data/tools/test/themes/preset/symbols/alternative.svg +5 -0
  207. data/tools/test/themes/preset/symbols/arrow.svg +3 -0
  208. data/tools/test/themes/preset/symbols/call.svg +6 -0
  209. data/tools/test/themes/preset/symbols/callmanipulate.svg +8 -0
  210. data/tools/test/themes/preset/symbols/choose.svg +5 -0
  211. data/tools/test/themes/preset/symbols/choose_exclusive.svg +5 -0
  212. data/tools/test/themes/preset/symbols/choose_inclusive.svg +4 -0
  213. data/tools/test/themes/preset/symbols/closed_loop.svg +5 -0
  214. data/tools/test/themes/preset/symbols/closed_loop_cancel.svg +5 -0
  215. data/tools/test/themes/preset/symbols/closed_loop_control.svg +5 -0
  216. data/tools/test/themes/preset/symbols/closed_loop_measuring.svg +6 -0
  217. data/tools/test/themes/preset/symbols/complex.svg +8 -0
  218. data/tools/test/themes/preset/symbols/critical.svg +4 -0
  219. data/tools/test/themes/preset/symbols/end.svg +3 -0
  220. data/tools/test/themes/preset/symbols/escape.svg +5 -0
  221. data/tools/test/themes/preset/symbols/event_end.svg +3 -0
  222. data/tools/test/themes/preset/symbols/loop.svg +5 -0
  223. data/tools/test/themes/preset/symbols/manipulate.svg +4 -0
  224. data/tools/test/themes/preset/symbols/otherwise.svg +5 -0
  225. data/tools/test/themes/preset/symbols/parallel.svg +5 -0
  226. data/tools/test/themes/preset/symbols/parallel_branch.svg +5 -0
  227. data/tools/test/themes/preset/symbols/parallel_branch_compact.svg +4 -0
  228. data/tools/test/themes/preset/symbols/parallel_branch_event.svg +14 -0
  229. data/tools/test/themes/preset/symbols/parallel_branch_normal.svg +5 -0
  230. data/tools/test/themes/preset/symbols/scripts.svg +4 -0
  231. data/tools/test/themes/preset/symbols/start.svg +3 -0
  232. data/tools/test/themes/preset/symbols/stop.svg +5 -0
  233. data/tools/test/themes/preset/symbols/terminate.svg +4 -0
  234. data/tools/test/themes/preset/theme.js +1287 -0
  235. data/tools/test/track.html +142 -0
  236. metadata +221 -2
@@ -0,0 +1,104 @@
1
+ /*
2
+ This file is part of CPEE.
3
+
4
+ CPEE is free software: you can redistribute it and/or modify it under the terms
5
+ of the GNU General Public License as published by the Free Software Foundation,
6
+ either version 3 of the License, or (at your option) any later version.
7
+
8
+ CPEE is distributed in the hope that it will be useful, but WITHOUT ANY
9
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
10
+ PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+
12
+ You should have received a copy of the GNU General Public License along with
13
+ CPEE (file COPYING in the main directory). If not, see
14
+ <http://www.gnu.org/licenses/>.
15
+ */
16
+
17
+ function CustomMenu(e) {
18
+ var target = $(e.target);
19
+ var x = e.pageX;
20
+ var y = e.pageY;
21
+ var remove = function(event) {};
22
+ this.remove = remove;
23
+ e.stopPropagation();
24
+
25
+ this.contextmenu = function(items) {
26
+ remove = function(event) {
27
+ if (!event) {
28
+ $('.contextmenu:first').remove();
29
+ $('body', document).unbind('mousedown',remove);
30
+ return;
31
+ }
32
+
33
+ if($(event.target).parent('tr.contextmenuitem') && (event.button == 0)) { $(event.target).click(); }
34
+ $('.contextmenu:first').remove();
35
+ $('body', document).unbind('mousedown',remove);
36
+ }
37
+ $('body', document).bind('mousedown',remove);
38
+
39
+ if($('div.contextmenu').length > 0) remove();
40
+ var div = $('<div class="contextmenu"><table class="contextmenu"/></div>');
41
+ for(head in items) {
42
+ div.children(':first').append('<tr class="contextmenuheader"><td colspan="2">' + head + '</td></tr>');
43
+ for(item in items[head]) {
44
+ var icon = null;
45
+ if(items[head][item].menu_icon) {
46
+ icon = $X('<svg xmlns="http://www.w3.org/2000/svg" version="1.1">' +
47
+ '<g transform="translate(1,1) scale(0.5, 0.5)"/>' +
48
+ '</svg>');
49
+ icon.children('g').append(items[head][item].menu_icon.clone().children());
50
+ icon = icon.serializeXML();
51
+ }
52
+ if(items[head][item].text_icon) {
53
+ icon = items[head][item].text_icon;
54
+ }
55
+ var row = $('<tr class="contextmenuitem"><td class="contextmenuicon"><div>' + (icon == null ? '' : icon) + '</div></td><td>' + items[head][item].label + '</td></tr>');
56
+ div.children(':first').append(row);
57
+ row.bind('click', items[head][item], function(event){
58
+ event.data.function_call.apply(null, event.data.params);
59
+ });
60
+ }
61
+ }
62
+ div.css({'left':x+5,'top':y+5, 'display':'block'});
63
+ $('body', document).append(div);
64
+ if(($(window).height() < (y + div.height()))) { // contextmenu is position
65
+ div.css({'top':$(window).height()-div.height()-5});
66
+ }
67
+ if((document.body.clientWidth < (x + div.width())) && (x-div.width()-5 >= 0)) { // contextmenu is position
68
+ div.css({'left':x-div.width()-5});
69
+ }
70
+ }
71
+
72
+ this.menu = function(menu,call) {
73
+ remove = function(event) {
74
+ if ($(event.target).parent('div.menu') && (event.button == 0)) { $(event.target).click(); }
75
+ menu.hide();
76
+ $('body', document).unbind('mousedown',remove);
77
+ $("div.menuitem",$(menu)).each(function(ind,ele){
78
+ $(ele).unbind('click',mitemclick);
79
+ });
80
+ }
81
+
82
+ menu.show();
83
+ var mitemclick = function(ele){
84
+ $("div.menuitem[data-selected=selected]",$(menu)).each(function(ind,rem){ $(rem).removeAttr('data-selected'); });
85
+ $(ele.target).attr('data-selected','selected');
86
+ call(ele.target);
87
+ };
88
+ $('body', document).bind('mousedown',remove);
89
+
90
+ $("div.menuitem",$(menu)).each(function(ind,ele){
91
+ $(ele).bind('click',mitemclick);
92
+ });
93
+
94
+ var off = target.offset();
95
+
96
+ menu.css({'left':off.left,'top':off.top+target.outerHeight() + 1,'min-width': target.width()});
97
+ if(($(window).height() < (y + menu.height()))) {
98
+ menu.css({'top':$(window).height()-menu.height()-5});
99
+ }
100
+ if((document.body.clientWidth < (x + menu.width())) && (x-menu.width()-5 >= 0)) {
101
+ menu.css({'left':x-menu.width()-5});
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,185 @@
1
+ /*
2
+ This file is part of RelaxNGui.
3
+
4
+ RelaxNGui is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ RelaxNGui is distributed in the hope that it will be useful, but WITHOUT ANY
10
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License along with
14
+ RelaxNGui (file COPYING in the main directory). If not, see
15
+ <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ .relaxngui_table { }
19
+ .relaxngui_table .relaxngui_table { }
20
+
21
+ .relaxngui_table.closed > .relaxngui_table,
22
+ .relaxngui_table.closed > .relaxngui_dyn,
23
+ .relaxngui_table.closed > .relaxngui_row,
24
+ .relaxngui_table.closed > .relaxngui_control {
25
+ display: none;
26
+ }
27
+ .relaxngui_header.fold {
28
+ cursor: pointer;
29
+ }
30
+ .relaxngui_table.closed .relaxngui_fold:after {
31
+ content: "▶";
32
+ font-weight: bold;
33
+ vertical-align:top;
34
+ margin-right: 0.5em;
35
+ position: relative;
36
+ top: -0.13em;
37
+ }
38
+ .relaxngui_table .relaxngui_fold:after {
39
+ content: "▽";
40
+ font-weight: bold;
41
+ vertical-align:top;
42
+ margin-right: 0.5em;
43
+ position: relative;
44
+ top: -0.13em;
45
+ }
46
+
47
+ .relaxngui_table > .relaxngui_table > .relaxngui_table {
48
+ padding: 0;
49
+ padding-top: 0.2em;
50
+ padding-bottom: 0.5em;
51
+ padding-left: 1em;
52
+ }
53
+ .relaxngui_dyn {
54
+ margin: 0;
55
+ padding: 0;
56
+ display: flex;
57
+ flex-direction: row;
58
+ align-items: center;
59
+ padding-bottom: 0.25em;
60
+ padding-top: 0.25em;
61
+ margin-left: 0.5em;
62
+ }
63
+ .relaxngui_dyn > *:nth-child(1) {
64
+ margin: 0;
65
+ padding: 0;
66
+ font-size: 1em;
67
+ margin-right: 0.2em;
68
+ margin-left: 0.2em;
69
+ vertical-align: baseline;
70
+ cursor: pointer;
71
+ display: inline-block;
72
+ }
73
+ .relaxngui_dyn > *:nth-child(2) {
74
+ flex: 1 1 auto;
75
+ }
76
+
77
+ .relaxngui_dyn > .relaxngui_table { padding: 0; margin: 0; }
78
+ .relaxngui_dyn:nth-child(even) { background-color: #fff; }
79
+ .relaxngui_dyn:nth-child(odd) { background-color: #e9e9e9; }
80
+ .relaxngui_table.even > .relaxngui_row:nth-child(even) { background-color: #fff; }
81
+ .relaxngui_table.even > .relaxngui_row:nth-child(odd) { background-color: #e9e9e9; }
82
+ .relaxngui_table.odd > .relaxngui_row:nth-child(even) { background-color: #e9e9e9; }
83
+ .relaxngui_table.odd > .relaxngui_row:nth-child(odd) { background-color: #fff; }
84
+ .relaxngui_table.even > .relaxngui_hint:nth-child(odd) { background-color: #fff; }
85
+ .relaxngui_table.even > .relaxngui_hint:nth-child(even) { background-color: #e9e9e9; }
86
+ .relaxngui_table.odd > .relaxngui_hint:nth-child(odd) { background-color: #e9e9e9; }
87
+ .relaxngui_table.odd > .relaxngui_hint:nth-child(even) { background-color: #fff; }
88
+
89
+ .relaxngui_dyn:nth-child(even) > .relaxngui_table > .relaxngui_row:nth-child(1):nth-last-child(1) {
90
+ background-color: #fff;
91
+ }
92
+ .relaxngui_dyn:nth-child(odd) > .relaxngui_table > .relaxngui_row:nth-child(1):nth-last-child(1) {
93
+ background-color: #e9e9e9;
94
+ }
95
+
96
+ .relaxngui_table.even { background-color: #e9e9e9; }
97
+ .relaxngui_table.odd { background-color: #fff; }
98
+
99
+ .relaxngui_row {
100
+ width: 100%;
101
+ display: flex;
102
+ flex-direction: row;
103
+ }
104
+ .relaxngui_hint {
105
+ padding-left: 0.2em;
106
+ }
107
+ .relaxngui_hint::before {
108
+ content: "↳ ";
109
+ }
110
+ .relaxngui_header {
111
+ margin: 0;
112
+ padding: 0;
113
+ padding-top: 0.7em;
114
+ padding-bottom: 0.2em;
115
+ padding-left: 0.1em;
116
+ display: block;
117
+ font-weight: bold;
118
+ }
119
+ .relaxngui_header[data-relaxngui-level="1"] {
120
+ font-size: 1.2em;
121
+ }
122
+ .relaxngui_dyn .relaxngui_header {
123
+ font-size: 1em;
124
+ }
125
+ button.relaxngui_control {
126
+ margin: 0.5em 0;
127
+ align-self: flex-start;
128
+ }
129
+
130
+ .relaxngui_cell { }
131
+
132
+ .relaxngui_cell.optional { text-decoration: line-through; }
133
+
134
+ .relaxngui_cell:nth-child(1), .relaxngui_cell:nth-child(2) {
135
+ margin: 0;
136
+ padding: 0.1em 0.2em;
137
+ font-size: 1em;
138
+ font-family: sans-serif;
139
+ }
140
+ input.relaxngui_cell:nth-child(1) {
141
+ border: 0 none;
142
+ background: none;
143
+ }
144
+ .relaxngui_cell:nth-child(3) {
145
+ margin: 0;
146
+ padding: 0.1em 0.2em;
147
+ flex: 1 1 auto;
148
+ font-size: 1em;
149
+ font-family: sans-serif;
150
+ }
151
+ select.relaxngui_cell:nth-child(3) {
152
+ -webkit-appearance: none; /*Removes default chrome and safari style*/
153
+ -moz-appearance: none; /* Removes Default Firefox style*/
154
+ padding: 0;
155
+ }
156
+ select.relaxngui_cell:nth-child(3), button.relaxngui_cell:nth-child(3), textarea.relaxngui_cell:nth-child(3), input.relaxngui_cell:nth-child(3), [contenteditable].relaxngui_cell:nth-child(3) {
157
+ border: 0 none;
158
+ background: none;
159
+ }
160
+
161
+ [contenteditable].relaxngui_cell:nth-child(3) {
162
+ overflow-x: auto;
163
+ overflow-wrap: normal;
164
+ white-space: pre;
165
+ font-family: monospace,monospace;
166
+ }
167
+ [contenteditable][data-relaxngui-wrap='true'].relaxngui_cell:nth-child(3) {
168
+ white-space: normal;
169
+ }
170
+ [contenteditable].relaxngui_cell:focus {
171
+ outline: 0px solid transparent;
172
+ }
173
+ [contenteditable].relaxngui_cell:empty:before {
174
+ font-family: sans-serif;
175
+ color: #a1a1a1;
176
+ white-space: normal;
177
+ content: attr(placeholder);
178
+ display: block;
179
+ }
180
+
181
+ .relaxngui_template {
182
+ display: none;
183
+ }
184
+
185
+ .relaxngui_hidden { display: none; }
@@ -0,0 +1,488 @@
1
+ /*
2
+ This file is part of RelaxNGui.
3
+
4
+ RelaxNGui is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ RelaxNGui is distributed in the hope that it will be useful, but WITHOUT ANY
10
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License along with
14
+ RelaxNGui (file COPYING in the main directory). If not, see
15
+ <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ var RelaxNGui = function(rng,target,ceval,ignore=false) {
19
+ if (!(rng instanceof XMLDocument)) { // rng has to be XMLDocument //{{{
20
+ rng = $XR($(rng).serializeXML());
21
+ } //}}}
22
+
23
+ var lenextract = function(tag, lencount) { //{{{
24
+ $.each(tag.attributes,function(k,v){
25
+ if ((v.localName == 'label') && (v.namespaceURI == 'http://rngui.org')) { lencount = v.nodeValue.length > lencount ? v.nodeValue.length : lencount; }
26
+ });
27
+ return lencount;
28
+ }; //}}}
29
+
30
+ var labextract = function(type,tag) { //{{{
31
+ var ret = { 'type': type, 'wrap': false, 'readonly': false, 'label': '', default: '' };
32
+ $.each(tag.attributes,function(k,v){
33
+ if ((v.localName == 'label') && (v.namespaceURI == 'http://rngui.org')) { ret['label'] = v.nodeValue; }
34
+ if ((v.localName == 'readonly') && (v.namespaceURI == 'http://rngui.org')) { ret['readonly'] = v.nodeValue == 'true' ? true : false; }
35
+ if ((v.localName == 'wrap') && (v.namespaceURI == 'http://rngui.org')) { ret['wrap'] = v.nodeValue == 'true' ? true : false; }
36
+ });
37
+ $.each(tag.children,function(k,v){
38
+ if ((v.localName == 'param') && (v.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
39
+ $.each(v.attributes,function(l,w){
40
+ if ((w.localName == 'name') && (w.nodeValue == 'minInclusive')) {
41
+ ret['min'] = v.lastChild.nodeValue;
42
+ }
43
+ if ((w.localName == 'name') && (w.nodeValue == 'maxInclusive')) {
44
+ ret['max'] = v.lastChild.nodeValue;
45
+ }
46
+ });
47
+ }
48
+ });
49
+ return ret;
50
+ }; //}}}
51
+
52
+ var addelements = function(target,container) { //{{{
53
+ var template = target.parent().find('> .relaxngui_template').clone(true,true);
54
+ template.removeClass('relaxngui_template');
55
+ template.find('[data-relaxngui-template]').each(function(j,t){
56
+ $(t).attr('data-relaxngui-template',false);
57
+ });
58
+ template.find('.relaxngui_template [data-relaxngui-template]').each(function(j,t){
59
+ $(t).attr('data-relaxngui-template',true);
60
+ });
61
+ template.addClass('relaxngui_dyn');
62
+ template.on('click', '> *:first-child', function(ev){ delelements($(ev.target)); });
63
+
64
+ if (container.find('> .relaxngui_dyn').length % 2 == 1) {
65
+ var evens = template.find('.even');
66
+ var odds = template.find('.odd');
67
+ evens.each(function(k,v){
68
+ $(v).removeClass('even');
69
+ $(v).addClass('odd');
70
+ });
71
+ odds.each(function(k,v){
72
+ $(v).removeClass('odd');
73
+ $(v).addClass('even');
74
+ });
75
+ }
76
+
77
+ container.append(template);
78
+ }; //}}}
79
+
80
+ var delelements = function(target) { //{{{
81
+ var it = target.parent();
82
+ var par = target.parent().parent();
83
+ it.remove();
84
+ par.trigger('relaxngui_remove');
85
+ }; //}}}
86
+
87
+ var recshow_header = function(tag,ret,level){ //{{{
88
+ var header;
89
+ var fold;
90
+ $.each(tag.attributes,function(k,v){
91
+ if ((v.localName == 'header') && (v.namespaceURI == 'http://rngui.org')) { header = v.nodeValue; }
92
+ if ((v.localName == 'fold') && (v.namespaceURI == 'http://rngui.org')) { fold = v.nodeValue; }
93
+ });
94
+ if (header) {
95
+ if (fold != undefined) {
96
+ var xxx = $("<div data-relaxngui-level='" + level + "' class='relaxngui_header fold'>" + header + "</div>");
97
+ xxx.prepend($("<span class='relaxngui_fold'></span>"));
98
+ ret.append(xxx);
99
+ if (fold == 'closed' || fold == 'closed_conditional') {
100
+ ret.addClass('closed');
101
+ }
102
+ if (fold == 'closed_conditional') {
103
+ ret.addClass(fold);
104
+ }
105
+ } else {
106
+ ret.append($("<div data-relaxngui-level='" + level + "' class='relaxngui_header'>" + header + "</div>"));
107
+ }
108
+ }
109
+ return fold;
110
+ } //}}}
111
+
112
+ var recshow_single = function(tag,ret,template,path,lencount,optional){ //{{{
113
+ var node = $('<div class="relaxngui_row"/>');
114
+ var name;
115
+ var label;
116
+ var labeltype;
117
+ var second = {};
118
+ var datalist = [];
119
+ var defaul = '';
120
+ var hint = '';
121
+ var retcount = 0;
122
+ $.each(tag.attributes,function(k,v){
123
+ if ((v.localName == 'label') && (v.namespaceURI == 'http://rngui.org')) { label = v.nodeValue; }
124
+ if ((v.localName == 'date') && (v.namespaceURI == 'http://rngui.org')) { label = v.nodeValue; }
125
+ if ((v.localName == 'labeltype') && (v.namespaceURI == 'http://rngui.org')) { labeltype = v.nodeValue; }
126
+ if ((v.localName == 'default') && (v.namespaceURI == 'http://rngui.org')) { defaul = v.nodeValue; }
127
+ if ((v.localName == 'hint') && (v.namespaceURI == 'http://rngui.org')) { hint = v.nodeValue; }
128
+ if (v.localName == 'name') { name = v.nodeValue.replace(/:/,'\\:'); }
129
+ });
130
+
131
+ $.each($(tag).children('data[type=string]'), function(k,v) { second = labextract('string',v); });
132
+ $.each($(tag).children('data[type=integer]'), function(k,v) { second = labextract('integer',v); });
133
+ $.each($(tag).children('data[type=nonNegativeInteger]'), function(k,v) { second = labextract('nonNegativeInteger',v); });
134
+ $.each($(tag).children('data[type=positiveInteger]'), function(k,v) { second = labextract('positiveInteger',v); });
135
+ $.each($(tag).children('data[type=float]'), function(k,v) { second = labextract('float',v); });
136
+ $.each($(tag).children('data[type=date]'), function(k,v) { second = labextract('date',v); });
137
+ $.each($(tag).children('text'), function(k,v) { second = labextract('text',v); });
138
+ $.each($(tag).find('choice > value'), function(k,v) {
139
+ second = labextract('datalist',$(v).parent()[0]);
140
+ datalist.push([v.textContent,$(v).attr('id') ? $(v).attr('id') : v.textContent]);
141
+ });
142
+ if (name && label) {
143
+ node.append($("<label class='relaxngui_cell" + (optional && defaul == '' ? " optional": "") + "' style='min-width: " + (lencount+1) + "ex' for=''>" + label + "</label><span class='relaxngui_cell'>⇒</span>"));
144
+ } else if (name) {
145
+ // a tag without information is ignored
146
+ node.addClass('relaxngui_hidden');
147
+ } else if (label) {
148
+ if (labeltype == 'xml') {
149
+ node.append($("<input data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + path + " > *[data-name]' class='relaxngui_cell' type='text' pattern='^[a-zA-Z_][a-zA-Z0-9_-]*$' id='' placeholder='" + label + "'></input><span class='relaxngui_cell'>⇒</span>"));
150
+ } else {
151
+ node.append($("<input data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + path + " > *[data-name]' class='relaxngui_cell' type='text' pattern='^[a-z_][a-zA-Z0-9_]*$' id='' placeholder='" + label + "'></input><span class='relaxngui_cell'>⇒</span>"));
152
+ }
153
+ }
154
+
155
+ var tpath = ((typeof name === 'undefined') ? path + ' > *' : (tag.localName == 'element' ? path + ' > ' + name : path + '[' + name + ']'));
156
+ if (label) {
157
+ if (defaul && typeof defaul == 'string' && defaul.match(/^javascript:/)) {
158
+ defaul = defaul.replace(/^javascript:/,'');
159
+ defaul = ceval ? ceval(defaul) : eval(defaul);
160
+ }
161
+ var os = (optional ? " onkeyup='var sl = $(this).siblings(\"label\"); if ($(this).get_val() == \"\") { if (!sl.hasClass(\"optional\")) { sl.addClass(\"optional\") } } else { sl.removeClass(\"optional\") }' data-optional='true'" : " data-optional='false'");
162
+ if (second.readonly)
163
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='text' id='' readonly='readonly'" + os + "></input>"));
164
+ else {
165
+ if (second.type == 'string') {
166
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='text' id='' placeholder='" + second.label + "'" + os + "></input>"));
167
+ } else if (second.type == 'integer') {
168
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='number' id='' placeholder='" + second.label + "'" + (second.min != undefined ? (" min='" + second.min + "'") : '') + (second.max != undefined ? (" max='" + second.max + "'") : '') + os + "></input>"));
169
+ } else if (second.type == 'positiveInteger') {
170
+ if (second.min == undefined) second.min = 1;
171
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='number' id='' placeholder='" + second.label + "'" + (second.min != undefined ? (" min='" + second.min + "'") : '') + (second.max != undefined ? (" max='" + second.max + "'") : '') + os + "></input>"));
172
+ } else if (second.type == 'nonNegativeInteger') {
173
+ if (second.min == undefined) second.min = 0;
174
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='number' id='' placeholder='" + second.label + "'" + (second.min != undefined ? (" min='" + second.min + "'") : '') + (second.max != undefined ? (" max='" + second.max + "'") : '') + os + "></input>"));
175
+ } else if (second.type == 'date') {
176
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='date' id='' placeholder='" + second.label + "'" + os + "></input>"));
177
+ } else if (second.type == 'float') {
178
+ node.append($("<input " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' type='number' step='any' id='' placeholder='" + second.label + "'" + (second.min != undefined ? (" min='" + second.min + "'") : '') + (second.max != undefined ? (" max='" + second.max + "'") : '') + os + "></input>"));
179
+ } else if (second.type == 'text') {
180
+ node.append($("<div contenteditable='true' data-relaxngui-wrap='" + second.wrap + "' " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' id='' placeholder='" + second.label + "'" + os + "></div>"));
181
+ } else if (second.type == 'datalist') {
182
+ var tnode = $("<select " + (defaul && typeof defaul == 'string' ? 'value="' + defaul + '"' : '') + " data-relaxngui-template='" + template + "' data-relaxngui-parent='" + path + "' data-relaxngui-path='" + tpath + "' class='relaxngui_cell' id='' size='1'" + os + "></select>");
183
+ $.each(datalist,function(didx,dname){
184
+ if (dname[1] == defaul)
185
+ tnode.append('<option value="' + dname[1] + '" selected="selected">' + dname[0] + '</value>');
186
+ else
187
+ tnode.append('<option value="' + dname[1] + '">' + dname[0] + '</value>');
188
+ });
189
+ node.append(tnode);
190
+ }
191
+ }
192
+ ret.append(node);
193
+ retcount += 1;
194
+ } else {
195
+ if (tag.localName != 'element') { // its an attribute, simulate its empty-ness
196
+ node.attr('data-relaxngui-template',template);
197
+ node.attr('data-relaxngui-parent',path);
198
+ node.attr('data-relaxngui-path',tpath);
199
+ ret.append(node);
200
+ retcount += 1;
201
+ }
202
+ }
203
+ if (hint) {
204
+ var n = $('<div class="relaxngui_hint"/>');
205
+ var s1 = $('<em>Hint: </em>');
206
+ var s2 = $('<span/>');
207
+ s2.text(hint);
208
+
209
+ n.append(s1);
210
+ n.append(s2);
211
+ ret.append(n);
212
+ retcount += 1;
213
+ }
214
+ return retcount;
215
+ } //}}}
216
+
217
+ var recshow = function(elements,template,path,attr) { //{{{
218
+ // delete all elements with relaxngui:ignore
219
+ if (attr.ignore) {
220
+ var tele = $.grep(elements,function(tagv){
221
+ var include = true;
222
+ $.each(tagv.attributes,function(k,v){
223
+ if ((v.localName == 'ignore') && (v.namespaceURI == 'http://rngui.org')) {
224
+ include = false;
225
+ }
226
+ });
227
+ return include;
228
+ });
229
+ elements = $(tele);
230
+ }
231
+
232
+ var ret = $('<div/>');
233
+
234
+ var lencount = 0;
235
+ $.each(elements,function(k,v){
236
+ var tag = $(v)[0];
237
+ if ((tag.localName == 'element') && (tag.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
238
+ $(tag).children('attribute').each(function(l,w){
239
+ lencount = lenextract($(w)[0],lencount);
240
+ });
241
+ lencount = lenextract(tag,lencount);
242
+ }
243
+ });
244
+ $.each(elements,function(k,v){
245
+ if (attr.mode == 'even') { attr.mode = 'odd' }
246
+ else { attr.mode = 'even'; }
247
+
248
+ var tag = $(v)[0];
249
+ if ((tag.localName == 'element') && (tag.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
250
+ var xxx;
251
+ if (template) {
252
+ var yyy = $('<div class="relaxngui_table ' + attr.mode + '" data-relaxngui-template="true" data-relaxngui-parent="' + path + '" data-relaxngui-path="' + (path == '' ? ' > ' + (typeof elements.attr('name') === 'undefined' ? '*' : elements.attr('name')) : path + ' > ' + (typeof $(tag).attr('name') === 'undefined' ? '*' : $(tag).attr('name'))) + '[data-main]">');
253
+ xxx = $('<div class="relaxngui_template"><span>✖</span></div>');
254
+ xxx.append(yyy);
255
+ ret.append(xxx);
256
+ xxx = yyy;
257
+ } else {
258
+ xxx = $('<div class="relaxngui_table ' + attr.mode + '" data-relaxngui-template="false" data-relaxngui-parent="' + path + '" data-relaxngui-path="' + (path == '' ? ' > ' + elements.attr('name') : path + ' > ' + $(tag).attr('name')) + '[data-main]">');
259
+ ret.append(xxx);
260
+ }
261
+
262
+ recshow_header(tag,xxx,attr.level);
263
+ var rcount = 0;
264
+ $(tag).children('attribute').each(function(l,w){
265
+ var ttag = $(w)[0];
266
+ rcount += recshow_single(ttag,xxx,template,path + ' > ' + $(tag).attr('name'),lencount,attr.optional ? true : false);
267
+ });
268
+ rcount += recshow_single(tag,xxx,template,path,lencount,attr.optional ? true : false);
269
+
270
+ var sub;
271
+ if (sub = recshow($(tag).children('element, zeroOrMore, optional, choice'),false,path + ' > ' + $(tag).attr('name'),{ ignore: attr.ignore, mode: (attr.mode == 'even' && rcount % 2 == 0 ? 'odd' : 'even' ), level: attr.level + 1 })) {
272
+ var inode = xxx.append(sub);
273
+ if (template) {
274
+ inode.find('[data-relaxngui-template]').each(function(j,t){
275
+ $(t).attr('data-relaxngui-template',true);
276
+ });
277
+ }
278
+ }
279
+ } else if ((tag.localName == 'zeroOrMore') && (tag.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
280
+ var label;
281
+ $.each(tag.attributes,function(k,v){
282
+ if ((v.localName == 'label') && (v.namespaceURI == 'http://rngui.org')) { label = v.nodeValue; }
283
+ });
284
+ var but = $('<button class="relaxngui_control">' + label + '</button>');
285
+ but.on('click',function(ev){ addelements($(ev.target),$(ev.target).parent()); });
286
+
287
+ ret.append(recshow($(tag).children(),true,path,{ ignore: attr.ignore, mode: attr.mode, level: attr.level }));
288
+ ret.append(but);
289
+ } else if ((tag.localName == 'optional') && (tag.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
290
+ ret.append(recshow($(tag).children('element, zeroOrMore'),false,path,{ ignore: attr.ignore, mode: (attr.mode == 'even' ? 'odd' : 'even'), optional: true, level: attr.level + 1 }));
291
+ } else if ((tag.localName == 'choice') && (tag.namespaceURI == 'http://relaxng.org/ns/structure/1.0')) {
292
+ if (!($(tag).children()[0].localName == 'value' && $(tag).children()[0].namespaceURI)) {
293
+ $.each($(tag).children(),function(j,u){
294
+ var label;
295
+ $.each(u.attributes,function(k,v){
296
+ if ((v.localName == 'label') && (v.namespaceURI == 'http://rngui.org')) { label = v.nodeValue; }
297
+ });
298
+ var but = $('<button class="relaxngui_control">' + label + '</button>');
299
+ but.on('click',function(ev){ addelements($(ev.target),$(ev.target).parent().parent()); });
300
+ var col = $('<span></span');
301
+ col.append(recshow($(u).children(),true,path,{ ignore: attr.ignore, mode: attr.mode }));
302
+ col.append(but);
303
+ ret.append(col);
304
+ });
305
+ }
306
+ }
307
+ });
308
+ return ret.children().length > 0 ? ret.children() : undefined;
309
+ }; //}}}
310
+
311
+ var serializeXML = function (xml) { //{{{
312
+ var out = '';
313
+ if (typeof XMLSerializer == 'function') {
314
+ var xs = new XMLSerializer();
315
+ $(xml).each(function() {
316
+ out += xs.serializeToString(this);
317
+ });
318
+ } else if (xml && xml.xml != 'undefined') {
319
+ $(xml).each(function() {
320
+ out += this.xml;
321
+ });
322
+ }
323
+ return out;
324
+ }; //}}}
325
+ this.save = function() { //{{{
326
+ var xml;
327
+ var curr;
328
+ var tar = target.find('[data-relaxngui-path]:not([data-relaxngui-template=true])');
329
+ for (var i = 0; i<tar.length;) {
330
+ var path = $(tar[i]).attr('data-relaxngui-path');
331
+ var parent_path = $(tar[i]).attr('data-relaxngui-parent');
332
+ if (i == 0) {
333
+ var par = path.replace(/\[data-main\]/,'').replace(/ > /,'');
334
+ xml = $XR('<' + par + '/>');
335
+ } else {
336
+ var ma = path.match(/([^\s]+)$/)[1];
337
+ var att;
338
+ if (ma.match(/\*\[data-main\]/)) {
339
+ // do nothing. seriously. explicitly.
340
+ } else if (ma.match(/\[data-main\]/)) {
341
+ var par = ma.replace(/\[data-main\]/,'');
342
+ var curr = $($XR('<' + par + '/>').documentElement);
343
+ $(parent_path,xml).last().append(curr);
344
+ } else if (ma.match(/\[data-name\]/)) {
345
+ if ($(tar[i]).get_val()) {
346
+ var nn = $($XR('<' + $(tar[i]).get_val() + '/>').documentElement).text($(tar[i+1]).get_val());
347
+ $(parent_path,xml).append(nn);
348
+ }
349
+ i+=1;
350
+ } else if (att = ma.match(/\[([^\]]+)\]$/)) {
351
+ att[1] = att[1].replace(/\\/,'');
352
+ $(parent_path + ':last-child',xml).last().attr(att[1],$(tar[i]).get_val());
353
+ } else {
354
+ if ($(tar[i]).attr('data-optional') == 'true' && $(tar[i]).get_val() == '') {
355
+ $(path + ':last-child',xml).last().remove();
356
+ } else {
357
+ $(path + ':last-child',xml).last().text($(tar[i]).get_val())
358
+ }
359
+ }
360
+ }
361
+ i+=1;
362
+ }
363
+ return xml;
364
+ }; //}}}
365
+ this.save_text = function() { //{{{
366
+ return serializeXML(self.save());
367
+ } //}}}
368
+
369
+ this.content = function(data) { //{{{
370
+ if (!(data instanceof XMLDocument)) { // data has to be XMLDocument //{{{
371
+ data = $XR($(data).serializeXML());
372
+ } //}}}
373
+
374
+ if (data) {
375
+ var x = $(data).serializePrettyXML();
376
+ x = x.replace(/\s+xmlns(:[a-zA-Z0-9]+)?=\"[^\"]+\"/g, "");
377
+ x = x.replace(/<\?[^>]+>/g, "");
378
+ x = x.trim();
379
+ y = $(self.save()).serializePrettyXML();
380
+ if (x != y) {
381
+ target.find('.relaxngui_dyn').remove();
382
+ target.find('[data-relaxngui-path]').each(function(k,pa){
383
+ var path = $(pa).attr('data-relaxngui-path');
384
+ if (!path.match(/data-\w+\]$/)) {
385
+ if ($(pa).attr('data-relaxngui-template') == 'true' && path.match(/\*$/)) {
386
+ $(data).find(path).each(function(index,ele){
387
+ $(target.find('[data-relaxngui-path="' + path + '[data-name]"][data-relaxngui-template="false"]').get(index)).set_val(ele.localName);
388
+ $(target.find('[data-relaxngui-path="' + path + '"][data-relaxngui-template="false"]').get(index)).set_val($(ele).text());
389
+ });
390
+ } else if ($(pa).attr('data-relaxngui-template') == 'true' && !path.match(/\*$/)) {
391
+ $(data).find(path).each(function(index,ele){
392
+ var att;
393
+ var val;
394
+ if (att = path.match(/(.*)\[([^\]]+)\]$/)) {
395
+ val = $(ele).attr(att[2]);
396
+ } else {
397
+ val = $(ele).text();
398
+ }
399
+ if (val && val != '') {
400
+ $(target.find('[data-relaxngui-path="' + path + '"][data-relaxngui-template="false"]').get(index)).set_val(val);
401
+ }
402
+ });
403
+ } else {
404
+ var att;
405
+ var val;
406
+ if (att = path.match(/(.*)\[([^\]]+)\]$/)) {
407
+ val = $(data).find(att[1]).attr(att[2]);
408
+ } else {
409
+ val = $(data).find(path).text();
410
+ }
411
+ if (val && val != '') {
412
+ var t = target.find('[data-relaxngui-path="' + path + '"]');
413
+ t.set_val(val);
414
+ if (t.attr('data-optional') == 'true') {
415
+ t.siblings('label').removeClass('optional');
416
+ }
417
+ }
418
+ }
419
+ } else {
420
+ console.log('-----');
421
+ console.log(path);
422
+ if ($(pa).attr('data-relaxngui-template') == 'true') {
423
+ var buts;
424
+ var buts1 = target.find('.relaxngui_table[data-relaxngui-template="false"] > .relaxngui_template > [data-relaxngui-path="' + path + '"][data-relaxngui-template="true"]').parent().parent().find('> button');
425
+ var buts2 = target.find('.relaxngui_table[data-relaxngui-template="false"] > span > .relaxngui_template > [data-relaxngui-path="' + path + '"][data-relaxngui-template="true"]').parent().parent().find('> button');
426
+ if (buts1.length > 0) { buts = buts1; }
427
+ if (buts2.length > 0) { buts = buts2; }
428
+ if(!buts){ buts = $(); }
429
+ console.log(buts);
430
+ buts.each(function(_,b) {
431
+ var but = $(b);
432
+ var dpath = path.replace(/\[data-main\]$/,'');
433
+ var par = undefined;
434
+ var ind = -1;
435
+ console.log('a');
436
+
437
+ $(data).find(dpath).each(function(ke,ele){
438
+ if (par != $(ele).parent()[0]) {
439
+ ind += 1;
440
+ par = $(ele).parent()[0];
441
+ }
442
+ console.log(but.get(ind));
443
+ if ($(but.get(ind)).attr('disabled')) {
444
+ $(but.get(ind)).removeAttr('disabled');
445
+ but.get(ind).click();
446
+ $(but.get(ind)).attr('disabled','disabled');
447
+ } else {
448
+ but.get(ind).click();
449
+ }
450
+ });
451
+ });
452
+ }
453
+ }
454
+ });
455
+ self.set_checkpoint();
456
+ }
457
+ target.find('.relaxngui_table.closed_conditional').each(function(k,e) {
458
+ $(e).find('input:not([readonly]), [contenteditable]:not([readonly])').each(function(l,f) {
459
+ if ($(f).get_val() != '') {
460
+ $(e).removeClass('closed');
461
+ }
462
+ });
463
+ });
464
+ }
465
+ }; //}}}
466
+
467
+ // stuff to determine if user changed something
468
+ var orig = '';
469
+ this.set_checkpoint = function() { //{{{
470
+ orig = self.save_text();
471
+ } //}}}
472
+ this.has_changed = function() { //{{{
473
+ if (orig != self.save_text()) {
474
+ return true;
475
+ } else {
476
+ return false;
477
+ }
478
+ } //}}}
479
+
480
+ target.append(recshow($(rng.documentElement),false,'',{ ignore: ignore, mode: 'even', level: 0}));
481
+
482
+ var self = this;
483
+
484
+ target.unbind('click.relaxngui');
485
+ target.on('click.relaxngui','.relaxngui_header.fold',function(){
486
+ $(this).parent().toggleClass('closed');
487
+ });
488
+ };