Commit dd04c32f250b5adbb340ae6acc33b3783e66dfd1

Golmote 2015-09-09T08:43:29

Merge pull request #630 from Golmote/prism-prolog Add support for Prolog

diff --git a/components.js b/components.js
index 1665375..3746a5d 100644
--- a/components.js
+++ b/components.js
@@ -314,6 +314,10 @@ var components = {
 			"require": "clike",
 			"owner": "Golmote"
 		},
+		"prolog": {
+			"title": "Prolog",
+			"owner": "Golmote"
+		},
 		"pure": {
 			"title": "Pure",
 			"owner": "Golmote"
diff --git a/components/prism-prolog.js b/components/prism-prolog.js
new file mode 100644
index 0000000..86c04d4
--- /dev/null
+++ b/components/prism-prolog.js
@@ -0,0 +1,17 @@
+Prism.languages.prolog = {
+	// Syntax depends on the implementation
+	'comment': [
+		/%.+/,
+		/\/\*[\s\S]*?\*\//
+	],
+	// Depending on the implementation, strings may allow escaped newlines and quote-escape
+	'string': /(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
+	'builtin': /\b(?:fx|fy|xf[xy]?|yfx?)\b/,
+	'variable': /\b[A-Z_]\w*/,
+	// FIXME: Should we list all null-ary predicates (not followed by a parenthesis) like halt, trace, etc.?
+	'function': /\b[a-z]\w*(?:(?=\()|\/\d+)/,
+	'number': /\b\d+\.?\d*/,
+	// Custom operators are allowed
+	'operator': /[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,
+	'punctuation': /[(){}\[\],]/
+};
\ No newline at end of file
diff --git a/components/prism-prolog.min.js b/components/prism-prolog.min.js
new file mode 100644
index 0000000..5afa223
--- /dev/null
+++ b/components/prism-prolog.min.js
@@ -0,0 +1 @@
+Prism.languages.prolog={comment:[/%.+/,/\/\*[\s\S]*?\*\//],string:/(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,builtin:/\b(?:fx|fy|xf[xy]?|yfx?)\b/,variable:/\b[A-Z_]\w*/,"function":/\b[a-z]\w*(?:(?=\()|\/\d+)/,number:/\b\d+\.?\d*/,operator:/[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,punctuation:/[(){}\[\],]/};
\ No newline at end of file
diff --git a/examples/prism-prolog.html b/examples/prism-prolog.html
new file mode 100644
index 0000000..3234885
--- /dev/null
+++ b/examples/prism-prolog.html
@@ -0,0 +1,53 @@
+<h1>Prolog</h1>
+<p>To use this language, use the class "language-prolog".</p>
+
+<h2>Comments</h2>
+<pre><code>% This is a comment
+/* This is a
+multi-line comment */</code></pre>
+
+<h2>Numbers</h2>
+<pre><code>42
+3.1415</code></pre>
+
+<h2>Strings</h2>
+<pre><code>"This is a string."
+"This is a string \
+on multiple lines."
+"A string with \"quotes\" in it."
+"Another string with ""quotes"" in it."</code></pre>
+
+<h2>Example</h2>
+<pre><code>:- dynamic fibo/2.
+fibo(0, 1). fibo(1, 1).
+fibo(N, F) :-
+N >= 2, N1 is N - 1, N2 is N - 2,
+fibo(N1, F1), fibo(N2, F2), F is F1 + F2,
+assert(fibo(N,F):-!). % assert as first clause</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>Comment-like substrings</h3>
+<pre><code>"foo % bar"</code></pre>
+
+<h3>% inside a quoted atom</h3>
+<pre><code>'foo % bar'</code></pre>
+
+<h3>Null-ary predicates are not highlighted</h3>
+<pre><code>halt.
+trace.
+
+:- if(test1).
+section_1.
+:- elif(test2).
+section_2.
+:- elif(test3).
+section_3.
+:- else.
+section_else.
+:- endif.</code></pre>
diff --git a/tests/languages/prolog/builtin_feature.test b/tests/languages/prolog/builtin_feature.test
new file mode 100644
index 0000000..77f08ff
--- /dev/null
+++ b/tests/languages/prolog/builtin_feature.test
@@ -0,0 +1,17 @@
+fx
+fy
+xf xfx xfy
+yf yfx
+
+----------------------------------------------------
+
+[
+	["builtin", "fx"],
+	["builtin", "fy"],
+	["builtin", "xf"], ["builtin", "xfx"], ["builtin", "xfy"],
+	["builtin", "yf"], ["builtin", "yfx"]
+]
+
+----------------------------------------------------
+
+Checks for builtins.
\ No newline at end of file
diff --git a/tests/languages/prolog/comment_feature.test b/tests/languages/prolog/comment_feature.test
new file mode 100644
index 0000000..10668e7
--- /dev/null
+++ b/tests/languages/prolog/comment_feature.test
@@ -0,0 +1,16 @@
+% Foobar
+/**/
+/* Foo
+bar */
+
+----------------------------------------------------
+
+[
+	["comment", "% Foobar"],
+	["comment", "/**/"],
+	["comment", "/* Foo\r\nbar */"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/tests/languages/prolog/function_feature.test b/tests/languages/prolog/function_feature.test
new file mode 100644
index 0000000..a7633b0
--- /dev/null
+++ b/tests/languages/prolog/function_feature.test
@@ -0,0 +1,17 @@
+foobar(
+foo_bar_42(
+abs/1
+atan/2
+
+----------------------------------------------------
+
+[
+	["function", "foobar"], ["punctuation", "("],
+	["function", "foo_bar_42"], ["punctuation", "("],
+	["function", "abs/1"],
+	["function", "atan/2"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/tests/languages/prolog/number_feature.test b/tests/languages/prolog/number_feature.test
new file mode 100644
index 0000000..4d275ed
--- /dev/null
+++ b/tests/languages/prolog/number_feature.test
@@ -0,0 +1,15 @@
+42
+3.14159
+0
+
+----------------------------------------------------
+
+[
+	["number", "42"],
+	["number", "3.14159"],
+	["number", "0"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/tests/languages/prolog/operator_feature.test b/tests/languages/prolog/operator_feature.test
new file mode 100644
index 0000000..8964b34
--- /dev/null
+++ b/tests/languages/prolog/operator_feature.test
@@ -0,0 +1,29 @@
+is mod not xor
+
+: \ =
+> < -
+? * @
+/ ; +
+^ | !
+$ .
+
+=@=
+
+----------------------------------------------------
+
+[
+	["operator", "is"], ["operator", "mod"], ["operator", "not"], ["operator", "xor"],
+
+	["operator", ":"], ["operator", "\\"], ["operator", "="],
+	["operator", ">"], ["operator", "<"], ["operator", "-"],
+	["operator", "?"], ["operator", "*"], ["operator", "@"],
+	["operator", "/"], ["operator", ";"], ["operator", "+"],
+	["operator", "^"], ["operator", "|"], ["operator", "!"],
+	["operator", "$"], ["operator", "."],
+
+	["operator", "=@="]
+]
+
+----------------------------------------------------
+
+Checks for operators.
\ No newline at end of file
diff --git a/tests/languages/prolog/string_feature.test b/tests/languages/prolog/string_feature.test
new file mode 100644
index 0000000..6714b86
--- /dev/null
+++ b/tests/languages/prolog/string_feature.test
@@ -0,0 +1,27 @@
+""
+"fo\"obar"
+"fo""obar"
+"foo\
+bar"
+''
+'fo\'obar'
+'fo''obar'
+'foo\
+bar'
+
+----------------------------------------------------
+
+[
+	["string", "\"\""],
+	["string", "\"fo\\\"obar\""],
+	["string", "\"fo\"\"obar\""],
+	["string", "\"foo\\\r\nbar\""],
+	["string", "''"],
+	["string", "'fo\\'obar'"],
+	["string", "'fo''obar'"],
+	["string", "'foo\\\r\nbar'"]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/tests/languages/prolog/variable_feature.test b/tests/languages/prolog/variable_feature.test
new file mode 100644
index 0000000..555c2ef
--- /dev/null
+++ b/tests/languages/prolog/variable_feature.test
@@ -0,0 +1,15 @@
+Foobar
+Foo_bar_42
+_foo
+
+----------------------------------------------------
+
+[
+	["variable", "Foobar"],
+	["variable", "Foo_bar_42"],
+	["variable", "_foo"]
+]
+
+----------------------------------------------------
+
+Checks for variables.
\ No newline at end of file