export type LanguageName = string; export type StringRegExp = string | RegExp; export type SyntaxDef = Partial; export type SyntaxDefOrRef = SyntaxDef | 'self'; export type KeywordsDef = string | KeywordsGroupDef; export type KeywordsGroupDef = Partial>; export interface LanguageDef extends SyntaxDef { // Full language name name: LanguageName; // A list of additional names (besides the canonical // one given by the filename) that can be used to identify // a language in HTML classes and in a call to getLanguage. aliases?: LanguageName[]; // Case insensitivity of language keywords and regexps. // Used only on the top-level mode. case_insensitive?: boolean; } export interface FullSyntaxDef { // The name of the mode. It is used as a class name // in HTML markup. // // Multiple modes can have the same name. This is useful // when a language has multiple variants of syntax // for one thing like string in single or double quotes. className: string; // the name of css class // Regular expression starting a mode. For example // a single quote for strings or two forward slashes // for C-style comments. If absent, begin defaults // to a regexp that matches anything, so the mode // starts immediately. begin: StringRegExp; // Regular expression ending a mode. For example // a single quote for strings or “$” (end of line) // for one-line comments. // // It’s often the case that a beginning regular expression // defines the entire mode and doesn’t need any special // ending. For example a number can be defined with begin: // "\\b\\d+" which spans all the digits. // // If absent, end defaults to a regexp that matches anything, // so the mode ends immediately. // // Sometimes a mode can end not by itself but implicitly with // its containing (parent) mode. This is achieved with // `endsWithParent` attribute. end: StringRegExp; // Used instead of begin for modes starting with keywords // to avoid needless repetition. // // Unlike the keywords attribute, this one allows only // a simple list of space separated keywords. If you do need // additional features of keywords or you just need // more keywords for this mode you may include keywords // along with `beginKeywords`. beginKeywords: string; // A flag showing that a mode ends when its parent ends. // // This is best demonstrated by example. In CSS syntax // a selector has a set of rules contained within symbols // “{” and “}”. Individual rules separated by ”;” but // the last one in a set can omit the terminating semicolon. endsWithParent: boolean; // Forces closing of the parent mode right after // the current mode is closed. // // This is used for modes that don’t have an easily expressible // ending lexeme but instead could be closed after // the last interesting sub-mode is found. endsParent: boolean; // A regular expression that extracts individual lexemes // from language text to find keywords among them. Default value // is `IDENT_RE` which works for most languages. lexemes: StringRegExp; // Keyword definition comes in two forms keywords: KeywordsDef; // A regular expression that defines symbols illegal // for the mode. When the parser finds a match // for illegal expression it immediately drops parsing // the whole language altogether. illegal: StringRegExp; // Exclude beginning or ending lexemes out of mode’s // generated markup. For example in CSS syntax // a rule ends with a semicolon. However visually // it’s better not to color it as the rule contents. // Having excludeEnd: true forces a element // for the rule to close before the semicolon. excludeBegin: boolean; excludeEnd: boolean; // Returns just found beginning lexeme back into parser. // This is used when beginning of a sub-mode is a complex // expression that should not only be found within // a parent mode but also parsed according to the rules // of a sub-mode. // // Since the parser is effectively goes back it’s quite possible // to create a infinite loop here so use with caution! returnBegin: boolean; // Returns just found ending lexeme back into parser. // This is used for example to parse Javascript embedded // into HTML. A Javascript block ends with the HTML closing tag // that cannot be parsed with Javascript rules. // So it is returned back into its parent HTML mode that knows // what to do with it. // // Since the parser is effectively goes back it’s quite possible // to create a infinite loop here so use with caution! returnEnd: boolean; // The list of sub-modes that can be found inside the mode. // For detailed explanation see Language definition guide. contains: SyntaxDefOrRef[]; // The name of the mode that will start right after // the current mode ends. The new mode won’t be contained // within the current one. // // Currently this attribute is used to highlight Javascript and CSS // contained within HTML. Tags