diff --git a/components.js b/components.js index d8fe66dcb9..b2adddfdf9 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 0000000000..302842f5ac --- /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 0000000000..1b80f544ad --- /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 0000000000..4b418af20b --- /dev/null +++ b/examples/prism-lua.html @@ -0,0 +1,95 @@ +
To use this language, use the class "language-lua".
+ +#!/usr/local/bin/lua
+--
+-- Single line comment
+--[[ Multi line
+comment ]]
+--[====[ Multi line
+comment ]====]
+
+""
+"Foo\"bar"
+"Foo\
+bar \z
+baz"
+''
+'Foo\'bar'
+'Foo\
+bar \z
+baz'
+[[Multi "line"
+string]]
+[==[Multi [["line"]]
+string]==]
+
+3
+345
+0xff
+0xBEBADA
+3, 3., 3.1, .3,
+3e12, 3.e-41, 3.1E+1, .3e1
+0x0.1E
+0xA23p-4
+0X1.921FB54442D18P+1
+
+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
+
+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. +
+ +"foo -- bar";
+
+foobar"param";
diff --git a/tests/languages/lua/comment_feature.test b/tests/languages/lua/comment_feature.test
new file mode 100644
index 0000000000..3c639f7434
--- /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 0000000000..90e23830e8
--- /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 0000000000..0020acae17
--- /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 0000000000..913b5b8e0f
--- /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 0000000000..dec283644c
--- /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 0000000000..ccd34e8ff2
--- /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