mirror of
				https://github.com/JKorf/CryptoExchange.Net
				synced 2025-10-31 10:27:48 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| Language: Ada
 | |
| Author: Lars Schulna <kartoffelbrei.mit.muskatnuss@gmail.org>
 | |
| Description: Ada is a general-purpose programming language that has great support for saftey critical and real-time applications.
 | |
|              It has been developed by the DoD and thus has been used in military and safety-critical applications (like civil aviation).
 | |
|              The first version appeared in the 80s, but it's still actively developed today with
 | |
|              the newest standard being Ada2012.
 | |
| */
 | |
| 
 | |
| // We try to support full Ada2012
 | |
| //
 | |
| // We highlight all appearances of types, keywords, literals (string, char, number, bool)
 | |
| // and titles (user defined function/procedure/package)
 | |
| // CSS classes are set accordingly
 | |
| //
 | |
| // Languages causing problems for language detection:
 | |
| // xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword)
 | |
| // sql (ada default.txt has a lot of sql keywords)
 | |
| 
 | |
| export default function(hljs) {
 | |
|     // Regular expression for Ada numeric literals.
 | |
|     // stolen form the VHDL highlighter
 | |
| 
 | |
|     // Decimal literal:
 | |
|     var INTEGER_RE = '\\d(_|\\d)*';
 | |
|     var EXPONENT_RE = '[eE][-+]?' + INTEGER_RE;
 | |
|     var DECIMAL_LITERAL_RE = INTEGER_RE + '(\\.' + INTEGER_RE + ')?' + '(' + EXPONENT_RE + ')?';
 | |
| 
 | |
|     // Based literal:
 | |
|     var BASED_INTEGER_RE = '\\w+';
 | |
|     var BASED_LITERAL_RE = INTEGER_RE + '#' + BASED_INTEGER_RE + '(\\.' + BASED_INTEGER_RE + ')?' + '#' + '(' + EXPONENT_RE + ')?';
 | |
| 
 | |
|     var NUMBER_RE = '\\b(' + BASED_LITERAL_RE + '|' + DECIMAL_LITERAL_RE + ')';
 | |
| 
 | |
|     // Identifier regex
 | |
|     var ID_REGEX = '[A-Za-z](_?[A-Za-z0-9.])*';
 | |
| 
 | |
|     // bad chars, only allowed in literals
 | |
|     var BAD_CHARS = `[]{}%#'"`;
 | |
| 
 | |
|     // Ada doesn't have block comments, only line comments
 | |
|     var COMMENTS = hljs.COMMENT('--', '$');
 | |
| 
 | |
|     // variable declarations of the form
 | |
|     // Foo : Bar := Baz;
 | |
|     // where only Bar will be highlighted
 | |
|     var VAR_DECLS = {
 | |
|         // TODO: These spaces are not required by the Ada syntax
 | |
|         // however, I have yet to see handwritten Ada code where
 | |
|         // someone does not put spaces around :
 | |
|         begin: '\\s+:\\s+', end: '\\s*(:=|;|\\)|=>|$)',
 | |
|         // endsWithParent: true,
 | |
|         // returnBegin: true,
 | |
|         illegal: BAD_CHARS,
 | |
|         contains: [
 | |
|             {
 | |
|                 // workaround to avoid highlighting
 | |
|                 // named loops and declare blocks
 | |
|                 beginKeywords: 'loop for declare others',
 | |
|                 endsParent: true,
 | |
|             },
 | |
|             {
 | |
|                 // properly highlight all modifiers
 | |
|                 className: 'keyword',
 | |
|                 beginKeywords: 'not null constant access function procedure in out aliased exception'
 | |
|             },
 | |
|             {
 | |
|                 className: 'type',
 | |
|                 begin: ID_REGEX,
 | |
|                 endsParent: true,
 | |
|                 relevance: 0,
 | |
|             }
 | |
|         ]
 | |
|     };
 | |
| 
 | |
|     return {
 | |
|         name: 'Ada',
 | |
|         case_insensitive: true,
 | |
|         keywords: {
 | |
|             keyword:
 | |
|                 'abort else new return abs elsif not reverse abstract end ' +
 | |
|                 'accept entry select access exception of separate aliased exit or some ' +
 | |
|                 'all others subtype and for out synchronized array function overriding ' +
 | |
|                 'at tagged generic package task begin goto pragma terminate ' +
 | |
|                 'body private then if procedure type case in protected constant interface ' +
 | |
|                 'is raise use declare range delay limited record when delta loop rem while ' +
 | |
|                 'digits renames with do mod requeue xor',
 | |
|             literal:
 | |
|                 'True False',
 | |
|         },
 | |
|         contains: [
 | |
|             COMMENTS,
 | |
|             // strings "foobar"
 | |
|             {
 | |
|                 className: 'string',
 | |
|                 begin: /"/, end: /"/,
 | |
|                 contains: [{begin: /""/, relevance: 0}]
 | |
|             },
 | |
|             // characters ''
 | |
|             {
 | |
|                 // character literals always contain one char
 | |
|                 className: 'string',
 | |
|                 begin: /'.'/
 | |
|             },
 | |
|             {
 | |
|                 // number literals
 | |
|                 className: 'number',
 | |
|                 begin: NUMBER_RE,
 | |
|                 relevance: 0
 | |
|             },
 | |
|             {
 | |
|                 // Attributes
 | |
|                 className: 'symbol',
 | |
|                 begin: "'" + ID_REGEX,
 | |
|             },
 | |
|             {
 | |
|                 // package definition, maybe inside generic
 | |
|                 className: 'title',
 | |
|                 begin: '(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?', end: '(is|$)',
 | |
|                 keywords: 'package body',
 | |
|                 excludeBegin: true,
 | |
|                 excludeEnd: true,
 | |
|                 illegal: BAD_CHARS
 | |
|             },
 | |
|             {
 | |
|                 // function/procedure declaration/definition
 | |
|                 // maybe inside generic
 | |
|                 begin: '(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+', end: '(\\bis|\\bwith|\\brenames|\\)\\s*;)',
 | |
|                 keywords: 'overriding function procedure with is renames return',
 | |
|                 // we need to re-match the 'function' keyword, so that
 | |
|                 // the title mode below matches only exactly once
 | |
|                 returnBegin: true,
 | |
|                 contains:
 | |
|                 [
 | |
|                     COMMENTS,
 | |
|                     {
 | |
|                         // name of the function/procedure
 | |
|                         className: 'title',
 | |
|                         begin: '(\\bwith\\s+)?\\b(function|procedure)\\s+',
 | |
|                         end: '(\\(|\\s+|$)',
 | |
|                         excludeBegin: true,
 | |
|                         excludeEnd: true,
 | |
|                         illegal: BAD_CHARS
 | |
|                     },
 | |
|                     // 'self'
 | |
|                     // // parameter types
 | |
|                     VAR_DECLS,
 | |
|                     {
 | |
|                         // return type
 | |
|                         className: 'type',
 | |
|                         begin: '\\breturn\\s+', end: '(\\s+|;|$)',
 | |
|                         keywords: 'return',
 | |
|                         excludeBegin: true,
 | |
|                         excludeEnd: true,
 | |
|                         // we are done with functions
 | |
|                         endsParent: true,
 | |
|                         illegal: BAD_CHARS
 | |
| 
 | |
|                     },
 | |
|                 ]
 | |
|             },
 | |
|             {
 | |
|                 // new type declarations
 | |
|                 // maybe inside generic
 | |
|                 className: 'type',
 | |
|                 begin: '\\b(sub)?type\\s+', end: '\\s+',
 | |
|                 keywords: 'type',
 | |
|                 excludeBegin: true,
 | |
|                 illegal: BAD_CHARS
 | |
|             },
 | |
| 
 | |
|             // see comment above the definition
 | |
|             VAR_DECLS,
 | |
| 
 | |
|             // no markup
 | |
|             // relevance boosters for small snippets
 | |
|             // {begin: '\\s*=>\\s*'},
 | |
|             // {begin: '\\s*:=\\s*'},
 | |
|             // {begin: '\\s+:=\\s+'},
 | |
|         ]
 | |
|     };
 | |
| }
 |