ntriples.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**********************************************************
  2. * This script provides syntax highlighting support for
  3. * the Ntriples format.
  4. * Ntriples format specification:
  5. * http://www.w3.org/TR/rdf-testcases/#ntriples
  6. ***********************************************************/
  7. /*
  8. The following expression defines the defined ASF grammar transitions.
  9. pre_subject ->
  10. {
  11. ( writing_subject_uri | writing_bnode_uri )
  12. -> pre_predicate
  13. -> writing_predicate_uri
  14. -> pre_object
  15. -> writing_object_uri | writing_object_bnode |
  16. (
  17. writing_object_literal
  18. -> writing_literal_lang | writing_literal_type
  19. )
  20. -> post_object
  21. -> BEGIN
  22. } otherwise {
  23. -> ERROR
  24. }
  25. */
  26. (function(mod) {
  27. if (typeof exports == "object" && typeof module == "object") // CommonJS
  28. mod(require("../../lib/codemirror"));
  29. else if (typeof define == "function" && define.amd) // AMD
  30. define(["../../lib/codemirror"], mod);
  31. else // Plain browser env
  32. mod(CodeMirror);
  33. })(function(CodeMirror) {
  34. "use strict";
  35. CodeMirror.defineMode("ntriples", function() {
  36. var Location = {
  37. PRE_SUBJECT : 0,
  38. WRITING_SUB_URI : 1,
  39. WRITING_BNODE_URI : 2,
  40. PRE_PRED : 3,
  41. WRITING_PRED_URI : 4,
  42. PRE_OBJ : 5,
  43. WRITING_OBJ_URI : 6,
  44. WRITING_OBJ_BNODE : 7,
  45. WRITING_OBJ_LITERAL : 8,
  46. WRITING_LIT_LANG : 9,
  47. WRITING_LIT_TYPE : 10,
  48. POST_OBJ : 11,
  49. ERROR : 12
  50. };
  51. function transitState(currState, c) {
  52. var currLocation = currState.location;
  53. var ret;
  54. // Opening.
  55. if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI;
  56. else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI;
  57. else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI;
  58. else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI;
  59. else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE;
  60. else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL;
  61. // Closing.
  62. else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED;
  63. else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED;
  64. else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ;
  65. else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ;
  66. else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ;
  67. else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ;
  68. else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ;
  69. else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ;
  70. // Closing typed and language literal.
  71. else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG;
  72. else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE;
  73. // Spaces.
  74. else if( c == ' ' &&
  75. (
  76. currLocation == Location.PRE_SUBJECT ||
  77. currLocation == Location.PRE_PRED ||
  78. currLocation == Location.PRE_OBJ ||
  79. currLocation == Location.POST_OBJ
  80. )
  81. ) ret = currLocation;
  82. // Reset.
  83. else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT;
  84. // Error
  85. else ret = Location.ERROR;
  86. currState.location=ret;
  87. }
  88. return {
  89. startState: function() {
  90. return {
  91. location : Location.PRE_SUBJECT,
  92. uris : [],
  93. anchors : [],
  94. bnodes : [],
  95. langs : [],
  96. types : []
  97. };
  98. },
  99. token: function(stream, state) {
  100. var ch = stream.next();
  101. if(ch == '<') {
  102. transitState(state, ch);
  103. var parsedURI = '';
  104. stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} );
  105. state.uris.push(parsedURI);
  106. if( stream.match('#', false) ) return 'variable';
  107. stream.next();
  108. transitState(state, '>');
  109. return 'variable';
  110. }
  111. if(ch == '#') {
  112. var parsedAnchor = '';
  113. stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});
  114. state.anchors.push(parsedAnchor);
  115. return 'variable-2';
  116. }
  117. if(ch == '>') {
  118. transitState(state, '>');
  119. return 'variable';
  120. }
  121. if(ch == '_') {
  122. transitState(state, ch);
  123. var parsedBNode = '';
  124. stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;});
  125. state.bnodes.push(parsedBNode);
  126. stream.next();
  127. transitState(state, ' ');
  128. return 'builtin';
  129. }
  130. if(ch == '"') {
  131. transitState(state, ch);
  132. stream.eatWhile( function(c) { return c != '"'; } );
  133. stream.next();
  134. if( stream.peek() != '@' && stream.peek() != '^' ) {
  135. transitState(state, '"');
  136. }
  137. return 'string';
  138. }
  139. if( ch == '@' ) {
  140. transitState(state, '@');
  141. var parsedLang = '';
  142. stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;});
  143. state.langs.push(parsedLang);
  144. stream.next();
  145. transitState(state, ' ');
  146. return 'string-2';
  147. }
  148. if( ch == '^' ) {
  149. stream.next();
  150. transitState(state, '^');
  151. var parsedType = '';
  152. stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} );
  153. state.types.push(parsedType);
  154. stream.next();
  155. transitState(state, '>');
  156. return 'variable';
  157. }
  158. if( ch == ' ' ) {
  159. transitState(state, ch);
  160. }
  161. if( ch == '.' ) {
  162. transitState(state, ch);
  163. }
  164. }
  165. };
  166. });
  167. CodeMirror.defineMIME("text/n-triples", "ntriples");
  168. });