r2rml_generator.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. 'use strict';
  2. var R2RML = new Blockly.Generator('R2RML');
  3. /**
  4. * List of illegal variable names.
  5. * This is not intended to be a security feature. Blockly is 100% client-side,
  6. * so bypassing this list is trivial. This is intended to prevent users from
  7. * accidentally clobbering a built-in object or function.
  8. * @private
  9. */
  10. R2RML.addReservedWords('');
  11. // R2RML.EXAMPLE = "###\n";
  12. /**
  13. * Initialise the database of variable names.
  14. * @param {!Blockly.Workspace} workspace Workspace to generate code from.
  15. */
  16. R2RML.init = function(workspace) {
  17. };
  18. /**
  19. * Prepend the generated code with the variable definitions.
  20. * @param {string} code Generated code.
  21. * @return {string} Completed code.
  22. */
  23. R2RML.finish = function(code) {
  24. return code;
  25. };
  26. /**
  27. * Naked values are top-level blocks with outputs that aren't plugged into
  28. * anything. A trailing semicolon is needed to make this legal.
  29. * @param {string} line Line of generated code.
  30. * @return {string} Legal line of code.
  31. */
  32. R2RML.scrubNakedValue = function(line) {
  33. return line + ';\n';
  34. };
  35. /**
  36. * Encode a string as a properly escaped R2RML string, complete with
  37. * quotes.
  38. * @param {string} string Text to encode.
  39. * @return {string} R2RML string.
  40. * @private
  41. */
  42. R2RML.quote_ = function(string) {
  43. // TODO: This is a quick hack. Replace with goog.string.quote
  44. string = string.replace(/\\/g, '\\\\')
  45. .replace(/\n/g, '\\\n')
  46. .replace(/'/g, '\\\'');
  47. return '\'' + string + '\'';
  48. };
  49. /**
  50. * Common tasks for generating R2RML from blocks.
  51. * Handles comments for the specified block and any connected value blocks.
  52. * Calls any statements following this block.
  53. * @param {!Blockly.Block} block The current block.
  54. * @param {string} code The R2RML code created for this block.
  55. * @return {string} R2RML code with comments and subsequent blocks added.
  56. * @private
  57. */
  58. R2RML.scrub_ = function(block, code) {
  59. var commentCode = '';
  60. // Only collect comments for blocks that aren't inline.
  61. if (!block.outputConnection || !block.outputConnection.targetConnection) {
  62. // Collect comment for this block.
  63. var comment = block.getCommentText();
  64. if (comment) {
  65. commentCode += R2RML.prefixLines(comment, '// ') + '\n';
  66. }
  67. // Collect comments for all value arguments.
  68. // Don't collect comments for nested statements.
  69. for (var x = 0; x < block.inputList.length; x++) {
  70. if (block.inputList[x].type == Blockly.INPUT_VALUE) {
  71. var childBlock = block.inputList[x].connection.targetBlock();
  72. if (childBlock) {
  73. var childComment = R2RML.allNestedComments(childBlock);
  74. if (childComment) {
  75. commentCode += R2RML.prefixLines(childComment, '// ');
  76. }
  77. }
  78. }
  79. }
  80. }
  81. var nextBlock = block.nextConnection && block.nextConnection.targetBlock();
  82. var nextCode = R2RML.blockToCode(nextBlock);
  83. return commentCode + code + nextCode;
  84. };
  85. function isDisconnected(block) {
  86. return block.getParent() == undefined;
  87. }
  88. R2RML.mapping = function(block) {
  89. if (!block) {
  90. return '';
  91. }
  92. var mapping = '# Mapping created using R2RML editor. \n @prefix rr: <http://www.w3.org/ns/r2rml#> . \n';
  93. mapping += R2RML.statementToCode(block, 'mapping');
  94. mapping += "\n" + R2RML.statementToCode(block, 'triplesmap');
  95. return mapping;
  96. };
  97. R2RML.prefix = function(block) {
  98. if (isDisconnected(block)) {
  99. return '';
  100. }
  101. var prefix = block.getFieldValue('PREFIX');
  102. var uri = block.getFieldValue('URI');
  103. return "@prefix "+ prefix +": <" + uri + "> .\n";
  104. };
  105. R2RML.base = function(block) {
  106. if (isDisconnected(block)) {
  107. return '';
  108. }
  109. var uri = block.getFieldValue('URI');
  110. return "@base <" + uri + "> .\n";
  111. };
  112. R2RML.predefinedprefix = function(block) {
  113. if (isDisconnected(block)) {
  114. return '';
  115. }
  116. var prefix = block.getFieldValue('PREFIX');
  117. return "@prefix "+ prefix +" .\n";
  118. };
  119. R2RML.triplemap = function(block) {
  120. if (isDisconnected(block)) {
  121. return '';
  122. }
  123. // countTripleMap++;
  124. var triplemap = block.getFieldValue('TRIPLEMAPNAME'); //"TripleMap" + countTripleMap;
  125. return "<#" + triplemap + ">\n" + "rr:logicalTable [ " + R2RML.statementToCode(block, 'logicaltable') + "];"
  126. + "\n " + R2RML.statementToCode(block, 'subjectmap')
  127. + "\n " + R2RML.statementToCode(block, 'predicateobjectmap') + " . \n\n";
  128. };
  129. R2RML.tablesqlquery = function(block) {
  130. if (isDisconnected(block)) {
  131. return '';
  132. }
  133. var isTable = block.getFieldValue('TABLESQLQUERY') == 'table';
  134. var separator = (isTable ? '\"' : '\"\"\"');
  135. var table = (isTable ? 'rr:tableName ' : 'rr:sqlQuery ');
  136. return "\n" + table + separator + block.sql + separator + ";\n";
  137. };
  138. R2RML.subjectmap = function(block) {
  139. if (isDisconnected(block)) {
  140. return '';
  141. }
  142. return "rr:subjectMap [ \n " + termmap(block) + R2RML.statementToCode(block, 'termmap') + "]; \n";
  143. };
  144. R2RML.class = function(block) {
  145. if (isDisconnected(block)) {
  146. return '';
  147. }
  148. return "rr:class " + block.getFieldValue('CLASS') + ";\n";
  149. };
  150. R2RML.predicateobjectmap = function(block) {
  151. if (isDisconnected(block)) {
  152. return '';
  153. }
  154. return "rr:predicateObjectMap [ \n" + R2RML.statementToCode(block, 'ppredicateobjectmap') +
  155. "\n " + R2RML.statementToCode(block, 'opredicateobjectmap') +
  156. "\n " + R2RML.statementToCode(block, 'graphmap') + "]; \n";
  157. };
  158. R2RML.objectmap = function(block) {
  159. if (isDisconnected(block)) {
  160. return '';
  161. }
  162. return "rr:objectMap [ \n " + termmap(block) + R2RML.statementToCode(block, 'termmap') + "]; \n";
  163. };
  164. R2RML.predicatemap = function(block) {
  165. if (isDisconnected(block)) {
  166. return '';
  167. }
  168. return "rr:predicateMap [ \n " + termmap(block) + R2RML.statementToCode(block, 'termmap') + "]; \n";
  169. };
  170. R2RML.object = function(block) {
  171. if (isDisconnected(block)) {
  172. return '';
  173. }
  174. return "rr:object " + block.getFieldValue('OBJECT') + ";\n";
  175. };
  176. R2RML.predicate = function(block) {
  177. if (isDisconnected(block)) {
  178. return '';
  179. }
  180. return "rr:predicate " + block.getFieldValue('PREDICATE') + ";\n";
  181. };
  182. R2RML.inverseexpression = function(block) {
  183. if (isDisconnected(block)) {
  184. return '';
  185. }
  186. return "rr:inverseExpression \"" + block.getFieldValue('INVERSEEXPRESSION') + "\";\n";
  187. };
  188. R2RML.datatype = function(block) {
  189. if (isDisconnected(block)) {
  190. return '';
  191. }
  192. return "rr:datatype " + block.getFieldValue('DATATYPE') + ";\n";
  193. };
  194. R2RML.objectdatatype = function(block) {
  195. if (isDisconnected(block)) {
  196. return '';
  197. }
  198. return "rr:datatype " + block.getFieldValue('DATATYPE') + ";\n";
  199. };
  200. R2RML.language = function(block) {
  201. if (isDisconnected(block)) {
  202. return '';
  203. }
  204. return "rr:language \"" + block.getFieldValue('LANGUAGE') + "\";\n";
  205. };
  206. R2RML.objectlanguage = function(block) {
  207. if (isDisconnected(block)) {
  208. return '';
  209. }
  210. return "rr:language \"" + block.getFieldValue('LANGUAGE') + "\";\n";
  211. };
  212. R2RML.joincondition = function(block) {
  213. if (isDisconnected(block)) {
  214. return '';
  215. }
  216. return "rr:joinCondition [ \n rr:child \"" + block.getFieldValue('CHILD') + "\";\n rr:parent \"" + block.getFieldValue('PARENT') + "\";\n];\n";
  217. };
  218. R2RML.parenttriplesmap = function(block) {
  219. if (isDisconnected(block)) {
  220. return '';
  221. }
  222. var triplesmap = block.getFieldValue('PARENTTRIPLEMAP');
  223. return "rr:objectMap [\n rr:parentTriplesMap <#" + triplesmap + ">;\n" + R2RML.statementToCode(block, 'joincondition') + "];";
  224. };
  225. function termtype(block) {
  226. if (isDisconnected(block)) {
  227. return '';
  228. }
  229. var code = "rr:termType ";
  230. var termtype = block.getFieldValue('TERMTYPE');
  231. if(termtype == 'termtypeiri'){
  232. code += 'rr:IRI; \n';
  233. } else if(termtype == 'termtypeblanknode'){
  234. code += 'rr:BlankNode; \n';
  235. } else {
  236. code += 'rr:Literal; \n';
  237. if(block.type == 'objecttermtype'){
  238. code += R2RML.statementToCode(block, 'termtypevalue');
  239. }
  240. }
  241. return code;
  242. }
  243. R2RML.subjectgraphtermap = function(block) {
  244. if (isDisconnected(block)) {
  245. return '';
  246. }
  247. return "rr:graphMap [\n\t" + termmap(block) + "];\n";
  248. };
  249. R2RML.predicategraphtermap = function(block) {
  250. if (isDisconnected(block)) {
  251. return '';
  252. }
  253. return "rr:graphMap [\n\t" + termmap(block) + "];\n";
  254. };
  255. function termmap(block) {
  256. if (isDisconnected(block)) {
  257. return '';
  258. }
  259. var code = "";
  260. var termmap = block.getFieldValue('TERMMAP');
  261. if(termmap == 'CONSTANT'){
  262. code += 'rr:constant';
  263. code += ' ' + block.getFieldValue('TERMMAPVALUE') + ";\n";
  264. } else if(termmap == 'TEMPLATE'){
  265. code += 'rr:template';
  266. code += " \"" + block.getFieldValue('TERMMAPVALUE') + "\";\n";
  267. } else if (termmap == 'COLUMN'){
  268. code += 'rr:column';
  269. code += " \"" + block.getFieldValue('TERMMAPVALUE') + "\";\n";
  270. }
  271. if(block.type == 'predicatemap'){
  272. code += ' rr:termType rr:IRI;\n';
  273. }
  274. return code;
  275. }
  276. R2RML.subjecttermtype = function(block) {
  277. return termtype(block);
  278. };
  279. R2RML.subjecttermmap = function(block) {
  280. return termmap(block);
  281. };
  282. R2RML.predicatetermtype = function(block) {
  283. return termtype(block);
  284. };
  285. R2RML.predicatetermmap = function(block) {
  286. return termmap(block);
  287. };
  288. R2RML.objecttermtype = function(block) {
  289. return termtype(block);
  290. };
  291. R2RML.objecttermmap = function(block) {
  292. return termmap(block);
  293. };