mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-11-04 07:01:31 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			196 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// CodeMirror, copyright (c) by Marijn Haverbeke and others
 | 
						|
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
 | 
						|
 | 
						|
/**********************************************************
 | 
						|
* This script provides syntax highlighting support for
 | 
						|
* the N-Triples format.
 | 
						|
* N-Triples format specification:
 | 
						|
*     https://www.w3.org/TR/n-triples/
 | 
						|
***********************************************************/
 | 
						|
 | 
						|
/*
 | 
						|
    The following expression defines the defined ASF grammar transitions.
 | 
						|
 | 
						|
    pre_subject ->
 | 
						|
        {
 | 
						|
        ( writing_subject_uri | writing_bnode_uri )
 | 
						|
            -> pre_predicate
 | 
						|
                -> writing_predicate_uri
 | 
						|
                    -> pre_object
 | 
						|
                        -> writing_object_uri | writing_object_bnode |
 | 
						|
                          (
 | 
						|
                            writing_object_literal
 | 
						|
                                -> writing_literal_lang | writing_literal_type
 | 
						|
                          )
 | 
						|
                            -> post_object
 | 
						|
                                -> BEGIN
 | 
						|
         } otherwise {
 | 
						|
             -> ERROR
 | 
						|
         }
 | 
						|
*/
 | 
						|
 | 
						|
(function(mod) {
 | 
						|
  if (typeof exports == "object" && typeof module == "object") // CommonJS
 | 
						|
    mod(require("../../lib/codemirror"));
 | 
						|
  else if (typeof define == "function" && define.amd) // AMD
 | 
						|
    define(["../../lib/codemirror"], mod);
 | 
						|
  else // Plain browser env
 | 
						|
    mod(CodeMirror);
 | 
						|
})(function(CodeMirror) {
 | 
						|
"use strict";
 | 
						|
 | 
						|
CodeMirror.defineMode("ntriples", function() {
 | 
						|
 | 
						|
  var Location = {
 | 
						|
    PRE_SUBJECT         : 0,
 | 
						|
    WRITING_SUB_URI     : 1,
 | 
						|
    WRITING_BNODE_URI   : 2,
 | 
						|
    PRE_PRED            : 3,
 | 
						|
    WRITING_PRED_URI    : 4,
 | 
						|
    PRE_OBJ             : 5,
 | 
						|
    WRITING_OBJ_URI     : 6,
 | 
						|
    WRITING_OBJ_BNODE   : 7,
 | 
						|
    WRITING_OBJ_LITERAL : 8,
 | 
						|
    WRITING_LIT_LANG    : 9,
 | 
						|
    WRITING_LIT_TYPE    : 10,
 | 
						|
    POST_OBJ            : 11,
 | 
						|
    ERROR               : 12
 | 
						|
  };
 | 
						|
  function transitState(currState, c) {
 | 
						|
    var currLocation = currState.location;
 | 
						|
    var ret;
 | 
						|
 | 
						|
    // Opening.
 | 
						|
    if     (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI;
 | 
						|
    else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI;
 | 
						|
    else if(currLocation == Location.PRE_PRED    && c == '<') ret = Location.WRITING_PRED_URI;
 | 
						|
    else if(currLocation == Location.PRE_OBJ     && c == '<') ret = Location.WRITING_OBJ_URI;
 | 
						|
    else if(currLocation == Location.PRE_OBJ     && c == '_') ret = Location.WRITING_OBJ_BNODE;
 | 
						|
    else if(currLocation == Location.PRE_OBJ     && c == '"') ret = Location.WRITING_OBJ_LITERAL;
 | 
						|
 | 
						|
    // Closing.
 | 
						|
    else if(currLocation == Location.WRITING_SUB_URI     && c == '>') ret = Location.PRE_PRED;
 | 
						|
    else if(currLocation == Location.WRITING_BNODE_URI   && c == ' ') ret = Location.PRE_PRED;
 | 
						|
    else if(currLocation == Location.WRITING_PRED_URI    && c == '>') ret = Location.PRE_OBJ;
 | 
						|
    else if(currLocation == Location.WRITING_OBJ_URI     && c == '>') ret = Location.POST_OBJ;
 | 
						|
    else if(currLocation == Location.WRITING_OBJ_BNODE   && c == ' ') ret = Location.POST_OBJ;
 | 
						|
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ;
 | 
						|
    else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ;
 | 
						|
    else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ;
 | 
						|
 | 
						|
    // Closing typed and language literal.
 | 
						|
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG;
 | 
						|
    else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE;
 | 
						|
 | 
						|
    // Spaces.
 | 
						|
    else if( c == ' ' &&
 | 
						|
             (
 | 
						|
               currLocation == Location.PRE_SUBJECT ||
 | 
						|
               currLocation == Location.PRE_PRED    ||
 | 
						|
               currLocation == Location.PRE_OBJ     ||
 | 
						|
               currLocation == Location.POST_OBJ
 | 
						|
             )
 | 
						|
           ) ret = currLocation;
 | 
						|
 | 
						|
    // Reset.
 | 
						|
    else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT;
 | 
						|
 | 
						|
    // Error
 | 
						|
    else ret = Location.ERROR;
 | 
						|
 | 
						|
    currState.location=ret;
 | 
						|
  }
 | 
						|
 | 
						|
  return {
 | 
						|
    startState: function() {
 | 
						|
       return {
 | 
						|
           location : Location.PRE_SUBJECT,
 | 
						|
           uris     : [],
 | 
						|
           anchors  : [],
 | 
						|
           bnodes   : [],
 | 
						|
           langs    : [],
 | 
						|
           types    : []
 | 
						|
       };
 | 
						|
    },
 | 
						|
    token: function(stream, state) {
 | 
						|
      var ch = stream.next();
 | 
						|
      if(ch == '<') {
 | 
						|
         transitState(state, ch);
 | 
						|
         var parsedURI = '';
 | 
						|
         stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} );
 | 
						|
         state.uris.push(parsedURI);
 | 
						|
         if( stream.match('#', false) ) return 'variable';
 | 
						|
         stream.next();
 | 
						|
         transitState(state, '>');
 | 
						|
         return 'variable';
 | 
						|
      }
 | 
						|
      if(ch == '#') {
 | 
						|
        var parsedAnchor = '';
 | 
						|
        stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;});
 | 
						|
        state.anchors.push(parsedAnchor);
 | 
						|
        return 'variable-2';
 | 
						|
      }
 | 
						|
      if(ch == '>') {
 | 
						|
          transitState(state, '>');
 | 
						|
          return 'variable';
 | 
						|
      }
 | 
						|
      if(ch == '_') {
 | 
						|
          transitState(state, ch);
 | 
						|
          var parsedBNode = '';
 | 
						|
          stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;});
 | 
						|
          state.bnodes.push(parsedBNode);
 | 
						|
          stream.next();
 | 
						|
          transitState(state, ' ');
 | 
						|
          return 'builtin';
 | 
						|
      }
 | 
						|
      if(ch == '"') {
 | 
						|
          transitState(state, ch);
 | 
						|
          stream.eatWhile( function(c) { return c != '"'; } );
 | 
						|
          stream.next();
 | 
						|
          if( stream.peek() != '@' && stream.peek() != '^' ) {
 | 
						|
              transitState(state, '"');
 | 
						|
          }
 | 
						|
          return 'string';
 | 
						|
      }
 | 
						|
      if( ch == '@' ) {
 | 
						|
          transitState(state, '@');
 | 
						|
          var parsedLang = '';
 | 
						|
          stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;});
 | 
						|
          state.langs.push(parsedLang);
 | 
						|
          stream.next();
 | 
						|
          transitState(state, ' ');
 | 
						|
          return 'string-2';
 | 
						|
      }
 | 
						|
      if( ch == '^' ) {
 | 
						|
          stream.next();
 | 
						|
          transitState(state, '^');
 | 
						|
          var parsedType = '';
 | 
						|
          stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} );
 | 
						|
          state.types.push(parsedType);
 | 
						|
          stream.next();
 | 
						|
          transitState(state, '>');
 | 
						|
          return 'variable';
 | 
						|
      }
 | 
						|
      if( ch == ' ' ) {
 | 
						|
          transitState(state, ch);
 | 
						|
      }
 | 
						|
      if( ch == '.' ) {
 | 
						|
          transitState(state, ch);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
});
 | 
						|
 | 
						|
// define the registered Media Type for n-triples:
 | 
						|
// https://www.w3.org/TR/n-triples/#n-triples-mediatype
 | 
						|
CodeMirror.defineMIME("application/n-triples", "ntriples");
 | 
						|
 | 
						|
// N-Quads is based on the N-Triples format (so same highlighting works)
 | 
						|
// https://www.w3.org/TR/n-quads/
 | 
						|
CodeMirror.defineMIME("application/n-quads", "ntriples");
 | 
						|
 | 
						|
// previously used, though technically incorrect media type for n-triples
 | 
						|
CodeMirror.defineMIME("text/n-triples", "ntriples");
 | 
						|
 | 
						|
});
 |