ntriples.js 8.5 KB

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