Commit f5db346320c3c911b7f0e64c233564f96b609586

Golmote 2015-10-22T07:17:38

Merge pull request #812 from Golmote/prism-roboconf Add support for Roboconf

diff --git a/components.js b/components.js
index 7a221fc..deab8e1 100644
--- a/components.js
+++ b/components.js
@@ -416,6 +416,10 @@ var components = {
 			"title": "Rip",
 			"owner": "ravinggenius"
 		},
+		"roboconf": {
+			"title": "Roboconf",
+			"owner": "Golmote"
+		},
 		"ruby": {
 			"title": "Ruby",
 			"require": "clike",
diff --git a/components/prism-roboconf.js b/components/prism-roboconf.js
new file mode 100644
index 0000000..e52967f
--- /dev/null
+++ b/components/prism-roboconf.js
@@ -0,0 +1,27 @@
+Prism.languages.roboconf = {
+	'comment': /#.*/,
+	'keyword': {
+		'pattern': /(^|\s)(?:(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{)|(?:external|import)\b)/,
+		lookbehind: true
+	},
+	'component': {
+		pattern: /[\w-]+(?=[ \t]*\{)/,
+		alias: 'variable'
+	},
+	'property': /[\w.-]+(?=[ \t]*:)/,
+	'value': {
+		pattern: /(=[ \t]*)[^,;]+/,
+		lookbehind: true,
+		alias: 'attr-value'
+	},
+	'optional': {
+		pattern: /\(optional\)/,
+		alias: 'builtin'
+	},
+	'wildcard': {
+		pattern: /(\.)\*/,
+		lookbehind: true,
+		alias: 'operator'
+	},
+	'punctuation': /[{},.;:=]/
+};
\ No newline at end of file
diff --git a/components/prism-roboconf.min.js b/components/prism-roboconf.min.js
new file mode 100644
index 0000000..39596eb
--- /dev/null
+++ b/components/prism-roboconf.min.js
@@ -0,0 +1 @@
+Prism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\s)(?:(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{)|(?:external|import)\b)/,lookbehind:!0},component:{pattern:/[\w-]+(?=[ \t]*\{)/,alias:"variable"},property:/[\w.-]+(?=[ \t]*:)/,value:{pattern:/(=[ \t]*)[^,;]+/,lookbehind:!0,alias:"attr-value"},optional:{pattern:/\(optional\)/,alias:"builtin"},wildcard:{pattern:/(\.)\*/,lookbehind:!0,alias:"operator"},punctuation:/[{},.;:=]/};
\ No newline at end of file
diff --git a/examples/prism-roboconf.html b/examples/prism-roboconf.html
new file mode 100644
index 0000000..6b5dbe7
--- /dev/null
+++ b/examples/prism-roboconf.html
@@ -0,0 +1,52 @@
+<h1>Roboconf</h1>
+<p>To use this language, use the class "language-roboconf".</p>
+
+<h2>Full example</h2>
+<pre><code>ApacheServer {
+    # Apache instances will be deployed by Roboconf's Puppet extension
+    installer: puppet;
+
+    # Web applications could be deployed over this Apache server
+    children: My-Dash-Board, Marketing-Suite;
+
+    # Properties exported by this component.
+    # 'port' should have a default value, or we will have to set it when we create an instance.
+    exports: port = 19099;
+
+    # 'ip' is a special variable. It will be updated at runtime by a Roboconf agent.
+    exports: ip;
+
+    # Other components properties that this server needs to have so that it can start.
+    imports: LB.port (optional), LB.ip (optional);
+
+    # Here, the Apache may also be notified about components instances of type LB.
+    # The imports are marked as optional. It means that if there is no LB instance, an
+    # Apache instance will be able to start anyway.
+    #
+    # If the import was not optional, e.g.
+    #
+    # imports: LB.port, LB.ip;
+    # or even
+    # imports: LB.port (optional), LB.ip;
+    #
+    # ... then an Apache instance would need at least one LB instance somewhere.
+
+    # Imports may also reference variables from other applications
+    imports: external Lamp.lb-ip;
+}
+
+facet LoadBalanced {
+    exports: ip, port;  # Define we export two variables.
+}
+
+instance of VM {
+
+    # This will create 5 VM instances, called VM 1, VM 2, VM3, VM 4 and VM 5.
+    name: VM ;  # Yes, there is a space at the end... :)
+    count: 5;
+
+    # On every VM instance, we will deploy...
+    instance of Tomcat {
+        name: Tomcat;
+    }
+}</code></pre>
diff --git a/tests/languages/roboconf/comment_feature.test b/tests/languages/roboconf/comment_feature.test
new file mode 100644
index 0000000..09493ab
--- /dev/null
+++ b/tests/languages/roboconf/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/roboconf/component_feature.test b/tests/languages/roboconf/component_feature.test
new file mode 100644
index 0000000..0e93486
--- /dev/null
+++ b/tests/languages/roboconf/component_feature.test
@@ -0,0 +1,13 @@
+ApacheServer {}
+lb--apache-mod-jk--puppet {}
+
+----------------------------------------------------
+
+[
+	["component", "ApacheServer"], ["punctuation", "{"], ["punctuation", "}"],
+	["component", "lb--apache-mod-jk--puppet"], ["punctuation", "{"], ["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Checks for component names.
\ No newline at end of file
diff --git a/tests/languages/roboconf/keyword_feature.test b/tests/languages/roboconf/keyword_feature.test
new file mode 100644
index 0000000..e9f8c79
--- /dev/null
+++ b/tests/languages/roboconf/keyword_feature.test
@@ -0,0 +1,19 @@
+facet Foo {}
+instance of Bar {}
+external
+import
+
+----------------------------------------------------
+
+[
+	["keyword", "facet"],
+	["component", "Foo"], ["punctuation", "{"], ["punctuation", "}"],
+	["keyword", "instance of"],
+	["component", "Bar"], ["punctuation", "{"], ["punctuation", "}"],
+	["keyword", "external"],
+	["keyword", "import"]
+]
+
+----------------------------------------------------
+
+Checks for keywords.
\ No newline at end of file
diff --git a/tests/languages/roboconf/optional_feature.test b/tests/languages/roboconf/optional_feature.test
new file mode 100644
index 0000000..bf3e090
--- /dev/null
+++ b/tests/languages/roboconf/optional_feature.test
@@ -0,0 +1,11 @@
+(optional)
+
+----------------------------------------------------
+
+[
+	["optional", "(optional)"]
+]
+
+----------------------------------------------------
+
+Checks for optional flag.
\ No newline at end of file
diff --git a/tests/languages/roboconf/property_feature.test b/tests/languages/roboconf/property_feature.test
new file mode 100644
index 0000000..aae2508
--- /dev/null
+++ b/tests/languages/roboconf/property_feature.test
@@ -0,0 +1,17 @@
+extends :
+imports:
+installer:
+data.ec2.elastic.ip:
+
+----------------------------------------------------
+
+[
+	["property", "extends"], ["punctuation", ":"],
+	["property", "imports"], ["punctuation", ":"],
+	["property", "installer"], ["punctuation", ":"],
+	["property", "data.ec2.elastic.ip"], ["punctuation", ":"]
+]
+
+----------------------------------------------------
+
+Checks for properties.
\ No newline at end of file
diff --git a/tests/languages/roboconf/value_feature.test b/tests/languages/roboconf/value_feature.test
new file mode 100644
index 0000000..9c63798
--- /dev/null
+++ b/tests/languages/roboconf/value_feature.test
@@ -0,0 +1,20 @@
+port = 8080;
+MySQL.port = 3307, My-Client-Database.port = 3308;
+my-own-variable = something;
+
+----------------------------------------------------
+
+[
+	"port ", ["punctuation", "="],
+	["value", "8080"], ["punctuation", ";"],
+	"\r\nMySQL", ["punctuation", "."], "port ", ["punctuation", "="],
+	["value", "3307"], ["punctuation", ","],
+	" My-Client-Database", ["punctuation", "."], "port ", ["punctuation", "="],
+	["value", "3308"], ["punctuation", ";"],
+	"\r\nmy-own-variable ", ["punctuation", "="],
+	["value", "something"], ["punctuation", ";"]
+]
+
+----------------------------------------------------
+
+Checks for default values.
\ No newline at end of file
diff --git a/tests/languages/roboconf/wildcard_feature.test b/tests/languages/roboconf/wildcard_feature.test
new file mode 100644
index 0000000..e08e18d
--- /dev/null
+++ b/tests/languages/roboconf/wildcard_feature.test
@@ -0,0 +1,12 @@
+load-balance-able.*
+
+----------------------------------------------------
+
+[
+	"load-balance-able", ["punctuation", "."],
+	["wildcard", "*"]
+]
+
+----------------------------------------------------
+
+Checks for wildcards.
\ No newline at end of file