Skip to content

Commit 4fff99e

Browse files
authored
feat: add nasal language (#5342)
* feat: add nasal language * fix: update nasal mode * fix: fix linter errors * feat: add nasal tokens
1 parent 25d86b6 commit 4fff99e

File tree

5 files changed

+479
-0
lines changed

5 files changed

+479
-0
lines changed

demo/kitchen-sink/docs/nasal.nas

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var sayHello = func(names, favorite) {
2+
foreach (var name; names) {
3+
printf("Hello %s, %s is the best!", name, favorite);
4+
}
5+
}
6+
7+
sayHello(["World", "FlightGear"], "Nasal");

src/ext/modelist.js

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ var supportedModes = {
150150
MIXAL: ["mixal"],
151151
MUSHCode: ["mc|mush"],
152152
MySQL: ["mysql"],
153+
Nasal: ["nas"],
153154
Nginx: ["nginx|conf"],
154155
Nim: ["nim"],
155156
Nix: ["nix"],

src/mode/_test/tokens_nasal.json

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
[[
2+
"start",
3+
["storage.type.nasal","var"],
4+
["text"," sayHello "],
5+
["keyword.operator.nasal","="],
6+
["text"," func(names, favorite) {"]
7+
],[
8+
"start",
9+
["text"," "],
10+
["keyword.control.nasal","foreach"],
11+
["text"," ("],
12+
["storage.type.nasal","var"],
13+
["text"," name"],
14+
["punctuation.terminator.statement.nasal",";"],
15+
["text"," names) {"]
16+
],[
17+
"start",
18+
["text"," "],
19+
["variable.language.nasal","printf"],
20+
["text","("],
21+
["punctuation.definition.string.begin.nasal","\""],
22+
["string.quoted.double.nasal","Hello "],
23+
["constant.character.escape.nasal","%s"],
24+
["string.quoted.double.nasal",", "],
25+
["constant.character.escape.nasal","%s"],
26+
["string.quoted.double.nasal"," is the best!"],
27+
["punctuation.definition.string.end.nasal","\""],
28+
["text",", name, favorite)"],
29+
["punctuation.terminator.statement.nasal",";"]
30+
],[
31+
"start",
32+
["text"," }"]
33+
],[
34+
"start",
35+
["text","}"]
36+
],[
37+
"start"
38+
],[
39+
"start",
40+
["text","sayHello(["],
41+
["punctuation.definition.string.begin.nasal","\""],
42+
["string.quoted.double.nasal","World"],
43+
["punctuation.definition.string.end.nasal","\""],
44+
["text",", "],
45+
["punctuation.definition.string.begin.nasal","\""],
46+
["string.quoted.double.nasal","FlightGear"],
47+
["punctuation.definition.string.end.nasal","\""],
48+
["text","], "],
49+
["punctuation.definition.string.begin.nasal","\""],
50+
["string.quoted.double.nasal","Nasal"],
51+
["punctuation.definition.string.end.nasal","\""],
52+
["text",")"],
53+
["punctuation.terminator.statement.nasal",";"]
54+
],[
55+
"start"
56+
]]

src/mode/nasal.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/* ***** BEGIN LICENSE BLOCK *****
2+
* Distributed under the BSD license:
3+
*
4+
* Copyright (c) 2012, Ajax.org B.V.
5+
* All rights reserved.
6+
*
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
* * Redistributions of source code must retain the above copyright
10+
* notice, this list of conditions and the following disclaimer.
11+
* * Redistributions in binary form must reproduce the above copyright
12+
* notice, this list of conditions and the following disclaimer in the
13+
* documentation and/or other materials provided with the distribution.
14+
* * Neither the name of Ajax.org B.V. nor the
15+
* names of its contributors may be used to endorse or promote products
16+
* derived from this software without specific prior written permission.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
22+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*
29+
* ***** END LICENSE BLOCK ***** */
30+
31+
/*
32+
THIS FILE WAS AUTOGENERATED BY mode.tmpl.js
33+
*/
34+
35+
"use strict";
36+
37+
var oop = require("../lib/oop");
38+
var TextMode = require("./text").Mode;
39+
var NasalHighlightRules = require("./nasal_highlight_rules").NasalHighlightRules;
40+
// TODO: pick appropriate fold mode
41+
var FoldMode = require("./folding/cstyle").FoldMode;
42+
43+
var Mode = function() {
44+
this.HighlightRules = NasalHighlightRules;
45+
this.foldingRules = new FoldMode();
46+
};
47+
oop.inherits(Mode, TextMode);
48+
49+
(function() {
50+
// this.lineCommentStart = ""//"";
51+
// this.blockComment = {start: ""/*"", end: ""*/""};
52+
// Extra logic goes here.
53+
this.$id = "ace/mode/nasal";
54+
}).call(Mode.prototype);
55+
56+
exports.Mode = Mode;

0 commit comments

Comments
 (0)