Commit aff673389a1e266cde55682c56d6c3aef2750229

Golmote 2015-07-03T21:46:20

Add support for BASIC

diff --git a/components.js b/components.js
index 919b3c1..b901eca 100644
--- a/components.js
+++ b/components.js
@@ -84,6 +84,10 @@ var components = {
 			"require": "clike",
 			"owner": "zeitgeist87"
 		},
+		"basic": {
+			"title": "BASIC",
+			"owner": "Golmote"
+		},
 		"brainfuck": {
 			"title": "Brainfuck",
 			"owner": "Golmote"
diff --git a/components/prism-basic.js b/components/prism-basic.js
new file mode 100644
index 0000000..4dbd300
--- /dev/null
+++ b/components/prism-basic.js
@@ -0,0 +1,13 @@
+Prism.languages.basic = {
+	'string': /"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,
+	'comment': {
+		pattern: /(?:!|REM\b).+/i,
+		inside: {
+			'keyword': /^REM/i
+		}
+	},
+	'number': /(?:\b|\B[.-])(?:\d+\.?\d*)(?:E[+-]?\d+)?/i,
+	'keyword': /\b(?:ABS|ACCESS|ACOS|AND|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CALL|CASE|CAUSE|CEIL|CHAIN|CHR|CLEAR|CLIP|CLOSE|CLS|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATA|DATE|DATUM|DEBUG|DECIMAL|DECLARE|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DIM|DISPLAY|DO|DOT|ELAPSED|ELSE|ELSEIF|END|EPS|ERASE|ERASABLE|EXIT|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FOR|FP|FUNCTION|GO|GOSUB|GOTO|GRAPH|HANDLER|IDN|IF|IMAGE|IN|INPUT|INT|INTERNAL|IP|IS|KEY|KEYED|LBOUND|LCASE|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LOOP|LTRIM|MARGIN|MAT|MAX|MAXNUM|MIN|MISSING|MOD|NAME|NATIVE|NEXT|NOT|NUL|NUMERIC|OF|OFF|ON|OPEN|OPTION|OR|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|READ|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RESTORE|RETRY|RETURN|REWRITE|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STEP|STOP|STR|STREAM|STRING|STYLE|SUB|TAB|TAN|TANH|TEMPLATE|TEXT|THEN|THERE|TIME|TIMEOUT|TO|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|UNTIL|USE|USING|VAL|VARIABLE|VIEWPORT|WHEN|WHILE|WINDOW|WITH|WRITE|ZER|ZONEWIDTH)(?:\$|\b)/i,
+	'operator': /[<>]=?|<>|[+\-*\/^=&]/,
+	'punctuation': /[,;:()]/
+};
\ No newline at end of file
diff --git a/components/prism-basic.min.js b/components/prism-basic.min.js
new file mode 100644
index 0000000..1f11876
--- /dev/null
+++ b/components/prism-basic.min.js
@@ -0,0 +1 @@
+Prism.languages.basic={string:/"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,comment:{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},number:/(?:\b|\B[.-])(?:\d+\.?\d*)(?:E[+-]?\d+)?/i,keyword:/\b(?:ABS|ACCESS|ACOS|AND|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CALL|CASE|CAUSE|CEIL|CHAIN|CHR|CLEAR|CLIP|CLOSE|CLS|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATA|DATE|DATUM|DEBUG|DECIMAL|DECLARE|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DIM|DISPLAY|DO|DOT|ELAPSED|ELSE|ELSEIF|END|EPS|ERASE|ERASABLE|EXIT|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FOR|FP|FUNCTION|GO|GOSUB|GOTO|GRAPH|HANDLER|IDN|IF|IMAGE|IN|INPUT|INT|INTERNAL|IP|IS|KEY|KEYED|LBOUND|LCASE|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LOOP|LTRIM|MARGIN|MAT|MAX|MAXNUM|MIN|MISSING|MOD|NAME|NATIVE|NEXT|NOT|NUL|NUMERIC|OF|OFF|ON|OPEN|OPTION|OR|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|READ|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RESTORE|RETRY|RETURN|REWRITE|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STEP|STOP|STR|STREAM|STRING|STYLE|SUB|TAB|TAN|TANH|TEMPLATE|TEXT|THEN|THERE|TIME|TIMEOUT|TO|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|UNTIL|USE|USING|VAL|VARIABLE|VIEWPORT|WHEN|WHILE|WINDOW|WITH|WRITE|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/[<>]=?|<>|[+\-*\/^=&]/,punctuation:/[,;:()]/};
\ No newline at end of file
diff --git a/examples/prism-basic.html b/examples/prism-basic.html
new file mode 100644
index 0000000..434f9ef
--- /dev/null
+++ b/examples/prism-basic.html
@@ -0,0 +1,83 @@
+<h1>BASIC</h1>
+<p>To use this language, use the class "language-basic".</p>
+
+<p>Note: this component focuses on first and second-generation BASICs (such as MSX BASIC, GW-BASIC, SuperBASIC, QuickBASIC, PowerBASIC...).</p>
+
+<h2>Comments</h2>
+<pre><code>! This is a comment
+REM This is a remark</code></pre>
+
+<h2>Strings</h2>
+<pre><code>"This a string."
+"This is a string with ""quotes"" in it."</code></pre>
+
+<h2>Numbers</h2>
+<pre><code>42
+3.14159
+-42
+-3.14159
+.5
+10.
+2E10
+4.2E-14
+-3E+2</code></pre>
+
+<h2>Dartmouth Basic example</h2>
+<pre><code>5 LET S = 0
+10 MAT INPUT V
+20 LET N = NUM
+30 IF N = 0 THEN 99
+40 FOR I = 1 TO N
+45 LET S = S + V(I)
+50 NEXT I
+60 PRINT S/N
+70 GO TO 5
+99 END</code></pre>
+
+<h2>GW-BASIC example</h2>
+<pre><code>10 INPUT "What is your name: ", U$
+20 PRINT "Hello "; U$
+30 INPUT "How many stars do you want: ", N
+40 S$ = ""
+50 FOR I = 1 TO N
+60 S$ = S$ + "*"
+70 NEXT I
+80 PRINT S$
+90 INPUT "Do you want more stars? ", A$
+100 IF LEN(A$) = 0 THEN GOTO 90
+110 A$ = LEFT$(A$, 1)
+120 IF A$ = "Y" OR A$ = "y" THEN GOTO 30
+130 PRINT "Goodbye "; U$
+140 END</code></pre>
+
+<h2>QuickBASIC example</h2>
+<pre><code>DECLARE SUB PrintSomeStars (StarCount!)
+REM QuickBASIC example
+INPUT "What is your name: ", UserName$
+PRINT "Hello "; UserName$
+DO
+   INPUT "How many stars do you want: ", NumStars
+   CALL PrintSomeStars(NumStars)
+   DO
+      INPUT "Do you want more stars? ", Answer$
+   LOOP UNTIL Answer$ <> ""
+   Answer$ = LEFT$(Answer$, 1)
+LOOP WHILE UCASE$(Answer$) = "Y"
+PRINT "Goodbye "; UserName$
+
+SUB PrintSomeStars (StarCount)
+   REM This procedure uses a local variable called Stars$
+   Stars$ = STRING$(StarCount, "*")
+   PRINT Stars$
+END SUB</code></pre>
+
+<h2>Known failures</h2>
+<p>There are certain edge cases where Prism will fail.
+	There are always such cases in every regex-based syntax highlighter.
+	However, Prism dares to be open and honest about them.
+	If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug.
+</p>
+
+<h3>Two double quotes inside a comment</h3>
+<pre><code>! This "comment" is broken
+REM This "remark" is broken</code></pre>
\ No newline at end of file