Commit bfb559bf53fb16f3c64d82af28e92cd3193ff858

Golmote 2016-06-11T01:17:24

Add support for GraphQL

diff --git a/components.js b/components.js
index 1a2a881..4762273 100644
--- a/components.js
+++ b/components.js
@@ -210,6 +210,10 @@ var components = {
 			"require": "clike",
 			"owner": "arnehormann"
 		},
+		"graphql": {
+			"title": "GraphQL",
+			"owner": "Golmote"
+		},
 		"groovy": {
 			"title": "Groovy",
 			"require": "clike",
diff --git a/components/prism-graphql.js b/components/prism-graphql.js
new file mode 100644
index 0000000..6fbe93b
--- /dev/null
+++ b/components/prism-graphql.js
@@ -0,0 +1,24 @@
+Prism.languages.graphql = {
+	'comment': /#.*/,
+	'string': {
+		pattern: /"(?:\\.|[^\\"])*"/,
+		greedy: true
+	},
+	'number': /(?:\B-|\b)\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/,
+	'boolean': /\b(?:true|false)\b/,
+	'variable': /\$[a-z_]\w*/i,
+	'directive': {
+		pattern: /@[a-z_]\w*/i,
+		alias: 'function'
+	},
+	'attr-name': /[a-z_]\w*(?=\s*:)/i,
+	'keyword': [
+		{
+			pattern: /(fragment\s+(?!on)[a-z_]\w*\s+|\.\.\.\s*)on\b/,
+			lookbehind: true
+		},
+		/\b(?:query|fragment|mutation)\b/
+	],
+	'operator': /!|=|\.{3}/,
+	'punctuation': /[!(){}\[\]:=,]/
+};
\ No newline at end of file
diff --git a/components/prism-graphql.min.js b/components/prism-graphql.min.js
new file mode 100644
index 0000000..2658c23
--- /dev/null
+++ b/components/prism-graphql.min.js
@@ -0,0 +1 @@
+Prism.languages.graphql={comment:/#.*/,string:{pattern:/"(?:\\.|[^\\"])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/,"boolean":/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":/[a-z_]\w*(?=\s*:)/i,keyword:[{pattern:/(fragment\s+(?!on)[a-z_]\w*\s+|\.\.\.\s*)on\b/,lookbehind:!0},/\b(?:query|fragment|mutation)\b/],operator:/!|=|\.{3}/,punctuation:/[!(){}\[\]:=,]/};
\ No newline at end of file
diff --git a/examples/prism-graphql.html b/examples/prism-graphql.html
new file mode 100644
index 0000000..8ad337c
--- /dev/null
+++ b/examples/prism-graphql.html
@@ -0,0 +1,34 @@
+<h1>GraphQL</h1>
+<p>To use this language, use the class "language-graphql".</p>
+
+<h2>Comments</h2>
+<pre><code># This is a comment</code></pre>
+
+<h2>Strings</h2>
+<pre><code>""
+"foo \"bar\" baz"</code></pre>
+
+<h2>Numbers</h2>
+<pre><code>0
+42
+3.14159
+-9e-5
+0.9E+7</code></pre>
+
+<h2>Keywords</h2>
+<pre><code>query withFragments {
+  user(id: 4) {
+    friends(first: 10) {
+      ...friendFields
+    }
+    mutualFriends(first: 10) {
+      ...friendFields
+    }
+  }
+}
+
+fragment friendFields on User {
+  id
+  name
+  profilePic(size: 50)
+}</code></pre>
\ No newline at end of file
diff --git a/plugins/show-language/prism-show-language.js b/plugins/show-language/prism-show-language.js
index ec33657..a448bb7 100644
--- a/plugins/show-language/prism-show-language.js
+++ b/plugins/show-language/prism-show-language.js
@@ -5,7 +5,7 @@ if (typeof self === 'undefined' || !self.Prism || !self.document) {
 }
 
 // The languages map is built automatically with gulp
-var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","asciidoc":"AsciiDoc","aspnet":"ASP.NET (C#)","autoit":"AutoIt","autohotkey":"AutoHotkey","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","fsharp":"F#","glsl":"GLSL","http":"HTTP","inform7":"Inform 7","json":"JSON","latex":"LaTeX","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","parigp":"PARI/GP","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","protobuf":"Protocol Buffers","jsx":"React JSX","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vhdl":"VHDL","vim":"vim","wiki":"Wiki markup","yaml":"YAML"}/*]*/;
+var Languages = /*languages_placeholder[*/{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","css":"CSS","clike":"C-like","javascript":"JavaScript","abap":"ABAP","actionscript":"ActionScript","apacheconf":"Apache Configuration","apl":"APL","applescript":"AppleScript","asciidoc":"AsciiDoc","aspnet":"ASP.NET (C#)","autoit":"AutoIt","autohotkey":"AutoHotkey","basic":"BASIC","csharp":"C#","cpp":"C++","coffeescript":"CoffeeScript","css-extras":"CSS Extras","fsharp":"F#","glsl":"GLSL","graphql":"GraphQL","http":"HTTP","inform7":"Inform 7","json":"JSON","latex":"LaTeX","lolcode":"LOLCODE","matlab":"MATLAB","mel":"MEL","nasm":"NASM","nginx":"nginx","nsis":"NSIS","objectivec":"Objective-C","ocaml":"OCaml","parigp":"PARI/GP","php":"PHP","php-extras":"PHP Extras","powershell":"PowerShell","protobuf":"Protocol Buffers","jsx":"React JSX","rest":"reST (reStructuredText)","sas":"SAS","sass":"Sass (Sass)","scss":"Sass (Scss)","sql":"SQL","typescript":"TypeScript","vhdl":"VHDL","vim":"vim","wiki":"Wiki markup","yaml":"YAML"}/*]*/;
 Prism.hooks.add('before-highlight', function(env) {
 	var pre = env.element.parentNode;
 	if (!pre || !/pre/i.test(pre.nodeName)) {
diff --git a/plugins/show-language/prism-show-language.min.js b/plugins/show-language/prism-show-language.min.js
index 0123d6b..6343379 100644
--- a/plugins/show-language/prism-show-language.min.js
+++ b/plugins/show-language/prism-show-language.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",protobuf:"Protocol Buffers",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",yaml:"YAML"};Prism.hooks.add("before-highlight",function(s){var a=s.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,i,r=a.getAttribute("data-language")||e[s.language]||s.language.substring(0,1).toUpperCase()+s.language.substring(1),l=a.previousSibling;l&&/\s*\bprism-show-language\b\s*/.test(l.className)&&l.firstChild&&/\s*\bprism-show-language-label\b\s*/.test(l.firstChild.className)?i=l.firstChild:(t=document.createElement("div"),i=document.createElement("div"),i.className="prism-show-language-label",t.className="prism-show-language",t.appendChild(i),a.parentNode.insertBefore(t,a)),i.innerHTML=r}})}}();
\ No newline at end of file
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",protobuf:"Protocol Buffers",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",yaml:"YAML"};Prism.hooks.add("before-highlight",function(s){var a=s.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,i,r=a.getAttribute("data-language")||e[s.language]||s.language.substring(0,1).toUpperCase()+s.language.substring(1),l=a.previousSibling;l&&/\s*\bprism-show-language\b\s*/.test(l.className)&&l.firstChild&&/\s*\bprism-show-language-label\b\s*/.test(l.firstChild.className)?i=l.firstChild:(t=document.createElement("div"),i=document.createElement("div"),i.className="prism-show-language-label",t.className="prism-show-language",t.appendChild(i),a.parentNode.insertBefore(t,a)),i.innerHTML=r}})}}();
\ No newline at end of file
diff --git a/tests/languages/graphql/attr-name_feature.test b/tests/languages/graphql/attr-name_feature.test
new file mode 100644
index 0000000..7f976e6
--- /dev/null
+++ b/tests/languages/graphql/attr-name_feature.test
@@ -0,0 +1,27 @@
+{
+	zuck: user(id: 4) {
+		name
+	}
+}
+
+----------------------------------------------------
+
+[
+	["punctuation", "{"],
+	["attr-name", "zuck"],
+	["punctuation", ":"],
+	" user",
+	["punctuation", "("],
+	["attr-name", "id"],
+	["punctuation", ":"],
+	["number", "4"],
+	["punctuation", ")"],
+	["punctuation", "{"],
+	"\r\n\t\tname\r\n\t",
+	["punctuation", "}"],
+	["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for aliases, parameter names, etc.
\ No newline at end of file
diff --git a/tests/languages/graphql/boolean_feature.test b/tests/languages/graphql/boolean_feature.test
new file mode 100644
index 0000000..4019c44
--- /dev/null
+++ b/tests/languages/graphql/boolean_feature.test
@@ -0,0 +1,13 @@
+true
+false
+
+----------------------------------------------------
+
+[
+	["boolean", "true"],
+	["boolean", "false"]
+]
+
+----------------------------------------------------
+
+Checks for booleans.
\ No newline at end of file
diff --git a/tests/languages/graphql/comment_feature.test b/tests/languages/graphql/comment_feature.test
new file mode 100644
index 0000000..054d602
--- /dev/null
+++ b/tests/languages/graphql/comment_feature.test
@@ -0,0 +1,13 @@
+#
+# foobar
+
+----------------------------------------------------
+
+[
+	["comment", "#"],
+	["comment", "# foobar"]
+]
+
+----------------------------------------------------
+
+Checks for comments.
\ No newline at end of file
diff --git a/tests/languages/graphql/directive_feature.test b/tests/languages/graphql/directive_feature.test
new file mode 100644
index 0000000..ca9b700
--- /dev/null
+++ b/tests/languages/graphql/directive_feature.test
@@ -0,0 +1,13 @@
+@skip
+@include
+
+----------------------------------------------------
+
+[
+	["directive", "@skip"],
+	["directive", "@include"]
+]
+
+----------------------------------------------------
+
+Checks for directives
\ No newline at end of file
diff --git a/tests/languages/graphql/keyword_feature.test b/tests/languages/graphql/keyword_feature.test
new file mode 100644
index 0000000..06d16f2
--- /dev/null
+++ b/tests/languages/graphql/keyword_feature.test
@@ -0,0 +1,24 @@
+query
+fragment
+mutation
+fragment foo on Bar
+... on Foo
+
+----------------------------------------------------
+
+[
+	["keyword", "query"],
+	["keyword", "fragment"],
+	["keyword", "mutation"],
+	["keyword", "fragment"],
+	" foo ",
+	["keyword", "on"],
+	" Bar\r\n",
+	["operator", "..."],
+	["keyword", "on"],
+	" Foo"
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/tests/languages/graphql/number_feature.test b/tests/languages/graphql/number_feature.test
new file mode 100644
index 0000000..c58cc24
--- /dev/null
+++ b/tests/languages/graphql/number_feature.test
@@ -0,0 +1,23 @@
+0
+42
+-5
+3.14159
+5e4
+6E-78
+0.3e+1
+
+----------------------------------------------------
+
+[
+	["number", "0"],
+	["number", "42"],
+	["number", "-5"],
+	["number", "3.14159"],
+	["number", "5e4"],
+	["number", "6E-78"],
+	["number", "0.3e+1"]
+]
+
+----------------------------------------------------
+
+Checks for numbers.
\ No newline at end of file
diff --git a/tests/languages/graphql/string_feature.test b/tests/languages/graphql/string_feature.test
new file mode 100644
index 0000000..a3d26be
--- /dev/null
+++ b/tests/languages/graphql/string_feature.test
@@ -0,0 +1,15 @@
+""
+"foo bar"
+"foo\"bar\\baz"
+
+----------------------------------------------------
+
+[
+	["string", "\"\""],
+	["string", "\"foo bar\""],
+	["string", "\"foo\\\"bar\\\\baz\""]
+]
+
+----------------------------------------------------
+
+Checks for strings.
\ No newline at end of file
diff --git a/tests/languages/graphql/variable_feature.test b/tests/languages/graphql/variable_feature.test
new file mode 100644
index 0000000..642d173
--- /dev/null
+++ b/tests/languages/graphql/variable_feature.test
@@ -0,0 +1,13 @@
+$foo
+$Foo_bar42
+
+----------------------------------------------------
+
+[
+	["variable", "$foo"],
+	["variable", "$Foo_bar42"]
+]
+
+----------------------------------------------------
+
+Checks for variables.
\ No newline at end of file