Commit a36bc4ae2e302055eb6c44bf0a7ff2fb36b81111

Golmote 2015-10-17T10:36:03

Merge pull request #804 from Golmote/prism-lua Add support for Lua

diff --git a/components.js b/components.js
index d8fe66d..b2adddf 100644
--- a/components.js
+++ b/components.js
@@ -274,6 +274,10 @@ var components = {
 			"title": "LOLCODE",
 			"owner": "Golmote"
 		},
+		"lua": {
+			"title": "Lua",
+			"owner": "Golmote"
+		},
 		"makefile": {
 			"title": "Makefile",
 			"owner": "Golmote"
diff --git a/components/prism-lua.js b/components/prism-lua.js
new file mode 100644
index 0000000..302842f
--- /dev/null
+++ b/components/prism-lua.js
@@ -0,0 +1,17 @@
+Prism.languages.lua = {
+	'comment': /^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,
+	// \z may be used to skip the following space
+	'string': /(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[\s\S]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,
+	'number': /\b0x[a-f\d]+\.?[a-f\d]*(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|\.?\d*(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,
+	'keyword': /\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,
+	'function': /(?!\d)\w+(?=\s*(?:[({]))/,
+	'operator': [
+		/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
+		{
+			// Match ".." but don't break "..."
+			pattern: /(^|[^.])\.\.(?!\.)/,
+			lookbehind: true
+		}
+	],
+	'punctuation': /[\[\](){},;]|\.+|:+/
+};
\ No newline at end of file
diff --git a/components/prism-lua.min.js b/components/prism-lua.min.js
new file mode 100644
index 0000000..1b80f54
--- /dev/null
+++ b/components/prism-lua.min.js
@@ -0,0 +1 @@
+Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[\s\S]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,number:/\b0x[a-f\d]+\.?[a-f\d]*(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|\.?\d*(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,"function":/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/};
\ No newline at end of file
diff --git a/examples/prism-lua.html b/examples/prism-lua.html
new file mode 100644
index 0000000..4b418af
--- /dev/null
+++ b/examples/prism-lua.html
@@ -0,0 +1,95 @@
+<h1>Lua</h1>
+<p>To use this language, use the class "language-lua".</p>
+
+<h2>Comments</h2>
+<pre><code>#!/usr/local/bin/lua
+--
+-- Single line comment
+--[[ Multi line
+comment ]]
+--[====[ Multi line
+comment ]====]</code></pre>
+
+<h2>Strings</h2>
+<pre><code>""
+"Foo\"bar"
+"Foo\
+bar \z
+baz"
+''
+'Foo\'bar'
+'Foo\
+bar \z
+baz'
+[[Multi "line"
+string]]
+[==[Multi [["line"]]
+string]==]</code></pre>
+
+<h2>Numbers</h2>
+<pre><code>3
+345
+0xff
+0xBEBADA
+3, 3., 3.1, .3,
+3e12, 3.e-41, 3.1E+1, .3e1
+0x0.1E
+0xA23p-4
+0X1.921FB54442D18P+1</code></pre>
+
+<h2>Full example</h2>
+<pre><code>function To_Functable(t, fn)
+  return setmetatable(t,
+    {
+     __index = function(t, k) return fn(k) end,
+     __call = function(t, k) return t[k] end
+    })
+end
+
+-- Functable bottles of beer implementation
+
+spell_out = {
+  "One", "Two", "Three", "Four", "Five",
+  "Six", "Seven", "Eight", "Nine", "Ten",
+  [0] = "No more",
+  [-1] = "Lots more"
+}
+
+spell_out = To_Functable(spell_out, function(i) return i end)
+
+bottles = To_Functable({"Just one bottle of beer"},
+                       function(i)
+                         return spell_out(i) .. " bottles of beer"
+                       end)
+
+function line1(i)
+  return bottles(i) .. " on the wall, " .. bottles(i) .. "\n"
+end
+
+line2 = To_Functable({[0] = "Go to the store, Buy some more,\n"},
+                     function(i)
+                       return "Take one down and pass it around,\n"
+                     end)
+
+function line3(i)
+  return bottles(i) .. " on the wall.\n"
+end
+
+function song(n)
+  for i = n, 0, -1 do
+    io.write(line1(i), line2(i), line3(i - 1), "\n")
+  end
+end</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>Functions with a single string parameter not using parentheses are not highlighted</h3>
+<pre><code>foobar"param";</code></pre>
diff --git a/tests/languages/lua/comment_feature.test b/tests/languages/lua/comment_feature.test
new file mode 100644
index 0000000..3c639f7
--- /dev/null
+++ b/tests/languages/lua/comment_feature.test
@@ -0,0 +1,22 @@
+#!/usr/local/bin/lua
+--
+-- Foobar
+--[[Foo
+bar]]
+--[====[Foo
+bar]=====] ]===]
+baz]====]
+
+----------------------------------------------------
+
+[
+	["comment", "#!/usr/local/bin/lua"],
+	["comment", "--"],
+	["comment", "-- Foobar"],
+	["comment", "--[[Foo\r\nbar]]"],
+	["comment", "--[====[Foo\r\nbar]=====] ]===]\r\nbaz]====]"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/tests/languages/lua/function_feature.test b/tests/languages/lua/function_feature.test
new file mode 100644
index 0000000..90e2383
--- /dev/null
+++ b/tests/languages/lua/function_feature.test
@@ -0,0 +1,17 @@
+foo ()
+Foo_bar_42()
+foo {}
+Foo_bar_42{}
+
+----------------------------------------------------
+
+[
+	["function", "foo"], ["punctuation", "("], ["punctuation", ")"],
+	["function", "Foo_bar_42"], ["punctuation", "("], ["punctuation", ")"],
+	["function", "foo"], ["punctuation", "{"], ["punctuation", "}"],
+	["function", "Foo_bar_42"], ["punctuation", "{"], ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for functions.
\ No newline at end of file
diff --git a/tests/languages/lua/keyword_feature.test b/tests/languages/lua/keyword_feature.test
new file mode 100644
index 0000000..0020aca
--- /dev/null
+++ b/tests/languages/lua/keyword_feature.test
@@ -0,0 +1,53 @@
+and
+break
+do
+else
+elseif
+end
+false
+for
+function
+goto
+if
+in
+local
+nil
+not
+or
+repeat
+return
+then
+true
+until
+while
+
+----------------------------------------------------
+
+[
+	["keyword", "and"],
+	["keyword", "break"],
+	["keyword", "do"],
+	["keyword", "else"],
+	["keyword", "elseif"],
+	["keyword", "end"],
+	["keyword", "false"],
+	["keyword", "for"],
+	["keyword", "function"],
+	["keyword", "goto"],
+	["keyword", "if"],
+	["keyword", "in"],
+	["keyword", "local"],
+	["keyword", "nil"],
+	["keyword", "not"],
+	["keyword", "or"],
+	["keyword", "repeat"],
+	["keyword", "return"],
+	["keyword", "then"],
+	["keyword", "true"],
+	["keyword", "until"],
+	["keyword", "while"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/tests/languages/lua/number_feature.test b/tests/languages/lua/number_feature.test
new file mode 100644
index 0000000..913b5b8
--- /dev/null
+++ b/tests/languages/lua/number_feature.test
@@ -0,0 +1,35 @@
+0
+42
+3.14159
+3.
+.42
+4e14
+3.14e+8
+.7E-1
+4.e12
+0xBadFace
+0x0.1E
+0xA23p-4
+0X1.921FB54442D18P+1
+
+----------------------------------------------------
+
+[
+	["number", "0"],
+	["number", "42"],
+	["number", "3.14159"],
+	["number", "3."],
+	["number", ".42"],
+	["number", "4e14"],
+	["number", "3.14e+8"],
+	["number", ".7E-1"],
+	["number", "4.e12"],
+	["number", "0xBadFace"],
+	["number", "0x0.1E"],
+	["number", "0xA23p-4"],
+	["number", "0X1.921FB54442D18P+1"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/tests/languages/lua/operator_feature.test b/tests/languages/lua/operator_feature.test
new file mode 100644
index 0000000..dec2836
--- /dev/null
+++ b/tests/languages/lua/operator_feature.test
@@ -0,0 +1,25 @@
++ - * %
+^ & | #
+/ //
+< << <=
+> >> >=
+= ==
+~ ~=
+..
+
+----------------------------------------------------
+
+[
+	["operator", "+"], ["operator", "-"], ["operator", "*"], ["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/lua/string_feature.test b/tests/languages/lua/string_feature.test
new file mode 100644
index 0000000..ccd34e8
--- /dev/null
+++ b/tests/languages/lua/string_feature.test
@@ -0,0 +1,32 @@
+""
+"Fo\"obar"
+"Foo\
+bar\z
+baz"
+''
+'Fo\'obar'
+'Foo\
+bar\z
+baz'
+[[Foo
+bar]]
+[====[Foo
+bar]=====] ]===]
+baz]====]
+
+----------------------------------------------------
+
+[
+	["string", "\"\""],
+	["string", "\"Fo\\\"obar\""],
+	["string", "\"Foo\\\r\nbar\\z\r\nbaz\""],
+	["string", "''"],
+	["string", "'Fo\\'obar'"],
+	["string", "'Foo\\\r\nbar\\z\r\nbaz'"],
+	["string", "[[Foo\r\nbar]]"],
+	["string", "[====[Foo\r\nbar]=====] ]===]\r\nbaz]====]"]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file