diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c7c550d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.vsix
+*.vscode-test
+node_modules
+npm-debug.log
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..1cc3543
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,13 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+{
+ "version": "0.1.0",
+ "configurations": [
+ {
+ "name": "Launch Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": ["--extensionDevelopmentPath=${workspaceRoot}" ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscodeignore b/.vscodeignore
new file mode 100644
index 0000000..3d299a5
--- /dev/null
+++ b/.vscodeignore
@@ -0,0 +1,9 @@
+.vscode/**
+typings/**
+out/test/**
+test/**
+src/**
+**/*.map
+.gitignore
+tsconfig.json
+.vscode-test/**
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..d9bb92f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Change Log
+
+## [0.0.9](https://github.com/dcortes92/vs-freemarker/tree/0.0.9) (2017-04-11)
+[Full Changelog](https://github.com/dcortes92/vs-freemarker/compare/0.0.8...0.0.9)
+
+**Merged pull requests:**
+
+- VsCode upgrade prevents to use snippets starting with not alphanumeric characters [\#10](https://github.com/dcortes92/vs-freemarker/pull/10) ([vinlos](https://github.com/vinlos))
+
+## [0.0.8](https://github.com/dcortes92/vs-freemarker/tree/0.0.8) (2017-02-03)
+[Full Changelog](https://github.com/dcortes92/vs-freemarker/compare/0.0.7...0.0.8)
+
+**Closed issues:**
+
+- Fix readme [\#8](https://github.com/dcortes92/vs-freemarker/issues/8)
+
+## [0.0.7](https://github.com/dcortes92/vs-freemarker/tree/0.0.7) (2017-02-02)
+[Full Changelog](https://github.com/dcortes92/vs-freemarker/compare/0.0.6...0.0.7)
+
+**Merged pull requests:**
+
+- New snippets and improved readme file [\#7](https://github.com/dcortes92/vs-freemarker/pull/7) ([vinlos](https://github.com/vinlos))
+
+## [0.0.6](https://github.com/dcortes92/vs-freemarker/tree/0.0.6) (2017-01-31)
+[Full Changelog](https://github.com/dcortes92/vs-freemarker/compare/0.0.5...0.0.6)
+
+**Closed issues:**
+
+- Redesign logo [\#6](https://github.com/dcortes92/vs-freemarker/issues/6)
+- Add a Changelog [\#4](https://github.com/dcortes92/vs-freemarker/issues/4)
+
+## [0.0.5](https://github.com/dcortes92/vs-freemarker/tree/0.0.5) (2017-01-30)
+**Merged pull requests:**
+
+- Added new snippets: elseif, include, assign\(short\) [\#3](https://github.com/dcortes92/vs-freemarker/pull/3) ([vinlos](https://github.com/vinlos))
+- amend freemarker comment [\#1](https://github.com/dcortes92/vs-freemarker/pull/1) ([Martin0417](https://github.com/Martin0417))
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a6ba71c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Daniel Cortes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6a4068b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,60 @@
+# FreeMarker New for Visual Studio Code
+FreeMarker language colorization extension for Visual Studio Code. You can read more about FreeMarker [here](http://freemarker.incubator.apache.org/).
+
+## Usage
+[Install](https://marketplace.visualstudio.com/items?itemName=dcortes92.FreeMarker) the extension and open any `.ftl` file.
+
+
+
+This is based on the TextMate bundle found on [this](https://github.com/bburbach/textmate-freemarker-bundle) repo.
+
+Alternative FreeMarker syntax with square brackets is fully supported.
+
+### Snippets
+Type **#** followed by the first letters of a FreeMarker tag name and the editor will propose you all the available autocomplete options. Snippets are also available for alternative FreeMarker syntax. They will have the same shortcuts of regular ones, with an underscore \_ character at the end. For instance:
+* with **#if** shortcut, you will get:
+ ```
+ <#if (condition)>
+
+ #if>
+ ```
+* while with **#if\_** shortcut the result will be:
+ ```
+ [#if (condition)]
+
+ [/#if]
+ ```
+
+
+
+#### Snippets list
+
+Shortcut | Description
+---------|---------
+dir | Directive
+d | Simple Directive
+mdef | Macro definition
+ma | Macro
+m | Simple Macro
+a | #assign short
+assign | #assign long
+l | #local short
+local | #local long
+g | #global short
+global | #global long
+set | #setting short
+setting | #setting long
+if | #if
+e | #else
+eif | #elseif
+li | #list
+include | #include
+imp | #import
+function | #function / #return
+sw | #switch / #case / #default
+ca | #case
+att | #attempt / #recover
+
+## Contributing
+
+Contributions are welcome. Fork the repo and create a pull request with your changes.
diff --git a/examples/index.ftl b/examples/index.ftl
new file mode 100644
index 0000000..e24df03
--- /dev/null
+++ b/examples/index.ftl
@@ -0,0 +1,9 @@
+
+
+
${pageTitle}
+
+
+ <#assign var=value/>
+
+
+
\ No newline at end of file
diff --git a/ftl.configuration.json b/ftl.configuration.json
new file mode 100644
index 0000000..6a432bc
--- /dev/null
+++ b/ftl.configuration.json
@@ -0,0 +1,14 @@
+{
+ "comments": {
+ // symbol used for single line comment. Remove this entry if your language does not support line comments
+ // "lineComment": "//",
+ // symbols used for start and end a block comment. Remove this entry if your language does not support block comments
+ "blockComment": [ "<#-- ", " -->" ]
+ },
+ // symbols used as brackets
+ "brackets": [
+ ["{", "}"],
+ ["[", "]"],
+ ["(", ")"]
+ ]
+}
\ No newline at end of file
diff --git a/images/logo.svg b/images/logo.svg
new file mode 100644
index 0000000..4e5a612
--- /dev/null
+++ b/images/logo.svg
@@ -0,0 +1,12 @@
+
+
+
+
+ <#>
+
diff --git a/images/vs-freemarker-snippet-example.gif b/images/vs-freemarker-snippet-example.gif
new file mode 100644
index 0000000..6d50a00
Binary files /dev/null and b/images/vs-freemarker-snippet-example.gif differ
diff --git a/images/vscode-freemarker-syntax.png b/images/vscode-freemarker-syntax.png
new file mode 100644
index 0000000..c7d47ff
Binary files /dev/null and b/images/vscode-freemarker-syntax.png differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..771323f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,97 @@
+{
+ "name": "FreeMarker2023",
+ "displayName": "Free Marker 2023",
+ "description": "Syntax highlight for FreeMarker",
+ "version": "0.0.10",
+ "publisher": "affiahmedkhan",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/affiahmedkhan/vs-freemarker-new.git"
+ },
+ "engines": {
+ "vscode": "^0.10.1"
+ },
+ "categories": [
+ "Languages"
+ ],
+ "contributes": {
+ "languages": [
+ {
+ "id": "ftl",
+ "aliases": [
+ "FreeMarker",
+ "ftl"
+ ],
+ "extensions": [
+ ".ftl"
+ ],
+ "configuration": "./ftl.configuration.json"
+ },
+ {
+ "id": "ftl.html",
+ "aliases": [
+ "FreeMarkerHtml",
+ "ftl.html"
+ ],
+ "extensions": [
+ ".ftl.html"
+ ],
+ "configuration": "./ftl.configuration.json"
+ }
+ ],
+ "grammars": [
+ {
+ "language": "ftl",
+ "scopeName": "text.html.ftl",
+ "path": "./syntaxes/ftl.tmLanguage"
+ },
+ {
+ "language": "ftl.html",
+ "scopeName": "text.ftl.html",
+ "path": "./syntaxes/ftl.tmLanguage"
+ }
+ ],
+ "snippets": [
+ {
+ "language": "ftl",
+ "path": "./snippets/ftl.json"
+ },
+ {
+ "language": "ftl",
+ "path": "./snippets/html.json"
+ },
+ {
+ "language": "ftl.html",
+ "path": "./snippets/ftl.html.json"
+ },
+ {
+ "language": "ftl.html",
+ "path": "./snippets/html.json"
+ },
+ {
+ "language": "html",
+ "path": "./snippets/ftl.html.json"
+ }
+ ]
+ },
+ "bugs": {
+ "url": "https://github.com/dcortes92/vs-freemarker/issues"
+ },
+ "homepage": "https://github.com/dcortes92/vs-freemarker#readme",
+ "dependencies": {},
+ "devDependencies": {},
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [
+ "visual",
+ "studio",
+ "code",
+ "vs",
+ "freemarker",
+ "ftl"
+ ],
+ "author": "Daniel Cortes (http://dcortes92.github.io/)",
+ "license": "MIT",
+ "icon": "images/logo.svg"
+}
\ No newline at end of file
diff --git a/snippets/ftl.html.json b/snippets/ftl.html.json
new file mode 100644
index 0000000..f9b0959
--- /dev/null
+++ b/snippets/ftl.html.json
@@ -0,0 +1,314 @@
+{
+ "@sb": {
+ "prefix": "@sb",
+ "body": "<@spring.bind \"${1:object.field}\"/>$0",
+ "description": "@spring.bind",
+ "scope": "text.ftl.html"
+ },
+ "@sfi": {
+ "prefix": "@sfi",
+ "body": "<@spring.formInput path=\"${1:path}\"/>$0",
+ "description": "@spring.formInput",
+ "scope": "text.ftl.html"
+ },
+ "@sfp": {
+ "prefix": "@sfp",
+ "body": "<@spring.formPasswordInput path=\"${1:path}\"/>$0",
+ "description": "@spring.formPasswordInput",
+ "scope": "text.ftl.html"
+ },
+ "@sm": {
+ "prefix": "@sm",
+ "body": "<@spring.message code=\"$1\"/>$0",
+ "description": "@spring.message",
+ "scope": "text.ftl.html"
+ },
+ "@sma": {
+ "prefix": "@sma",
+ "body": "<@spring.messageArgs \"${1:code}\", [${2:args}]/>$0",
+ "description": "@spring.messageArgs",
+ "scope": "text.ftl.html"
+ },
+ "@st": {
+ "prefix": "@st",
+ "body": "<@spring.theme code=\"$1\"/>$0",
+ "description": "@spring.theme",
+ "scope": "text.ftl.html"
+ },
+ "#dir": {
+ "prefix": "#dir",
+ "body": "<#$1>$0${1/\\s.*$//}>",
+ "description": "Directive (dir)",
+ "scope": "text.ftl.html"
+ },
+ "#dir_": {
+ "prefix": "#dir_",
+ "body": "[#$1]$0[/${1/\\s.*$//}]",
+ "description": "Directive [dir]",
+ "scope": "text.ftl.html"
+ },
+ "@ma": {
+ "prefix": "@ma",
+ "body": "<@$1>$0${1/\\s.*$//}>",
+ "description": "Macro (ma)",
+ "scope": "text.ftl.html"
+ },
+ "@ma_": {
+ "prefix": "@ma_",
+ "body": "[@$1]$0[/${1/\\s.*$//}]",
+ "description": "Macro [ma]",
+ "scope": "text.ftl.html"
+ },
+ "#d": {
+ "prefix": "#d",
+ "body": "<#$1/>$0",
+ "description": "Simple Directive (d)",
+ "scope": "text.ftl.html"
+ },
+ "#d_": {
+ "prefix": "#d_",
+ "body": "[#$1/]$0",
+ "description": "Simple Directive [d]",
+ "scope": "text.ftl.html"
+ },
+ "@m": {
+ "prefix": "@m",
+ "body": "<@$1/>$0",
+ "description": "Simple Macro (m)",
+ "scope": "text.ftl.html"
+ },
+ "@m_": {
+ "prefix": "@m_",
+ "body": "[$1/]$0",
+ "description": "Simple Macro [m]",
+ "scope": "text.ftl.html"
+ },
+ "#m": {
+ "prefix": "#mdef",
+ "body": "<#macro ${1:name} ${2:parameters}>\n\t$0\n#macro>",
+ "description": "Macro definition (mdef)",
+ "scope": "text.ftl.html"
+ },
+ "#m_": {
+ "prefix": "#mdef_",
+ "body": "[#macro ${1:name} ${2:parameters}]\n\t$0\n[/#macro]",
+ "description": "Macro definition [mdef]",
+ "scope": "text.ftl.html"
+ },
+ "#assign": {
+ "prefix": "#assign",
+ "body": "<#assign ${1:var}>${2:value}#assign>$0",
+ "description": "assign long (assign)",
+ "scope": "text.ftl.html"
+ },
+ "#assign_": {
+ "prefix": "#assign_",
+ "body": "[#assign ${1:var}]${2:value}[/#assign]$0",
+ "description": "assign long [assign]",
+ "scope": "text.ftl.html"
+ },
+ "a": {
+ "prefix": "#a",
+ "body": "<#assign ${1:var}=${2:value}/>$0",
+ "description": "assign short (a)",
+ "scope": "text.ftl.html"
+ },
+ "#a_": {
+ "prefix": "#a_",
+ "body": "[#assign ${1:var}=${2:value}/]$0",
+ "description": "#assign short [assign]",
+ "scope": "text.ftl.html"
+ },
+ "#set": {
+ "prefix": "#set",
+ "body": "<#setting ${1:var}=${2:value}/>$0",
+ "description": "#setting short (set)",
+ "scope": "text.ftl.html"
+ },
+ "#set_": {
+ "prefix": "#set_",
+ "body": "[#setting ${1:var}=${2:value}/]$0",
+ "description": "#setting short [set]",
+ "scope": "text.ftl.html"
+ },
+ "#setting": {
+ "prefix": "#setting",
+ "body": "<#setting ${1:var}>${2:value}#setting>$0",
+ "description": "setting long (setting)",
+ "scope": "text.ftl.html"
+ },
+ "#setting_": {
+ "prefix": "#setting_",
+ "body": "[#setting ${1:var}]${2:value}[/#setting]$0",
+ "description": "setting long [setting]",
+ "scope": "text.ftl.html"
+ },
+ "#e": {
+ "prefix": "#el",
+ "body": "<#else/>$0",
+ "description": "#else (el)",
+ "scope": "text.ftl.html"
+ },
+ "#e_": {
+ "prefix": "#el_",
+ "body": "[#else/]$0",
+ "description": "#else [el]",
+ "scope": "text.ftl.html"
+ },
+ "#eif": {
+ "prefix": "#eif",
+ "body": "<#elseif (${1:condition})/>$0",
+ "description": "#elseif (eif)",
+ "scope": "text.ftl.html"
+ },
+ "#eif_": {
+ "prefix": "#eif_",
+ "body": "[#elseif (${1:condition})/]$0",
+ "description": "#elseif [eif]",
+ "scope": "text.ftl.html"
+ },
+ "#if": {
+ "prefix": "#if",
+ "body": "<#if (${1:condition})>\n\t$0\n#if>",
+ "description": "#if (if)",
+ "scope": "text.ftl.html"
+ },
+ "#if_": {
+ "prefix": "#if_",
+ "body": "[#if (${1:condition})]\n\t$0\n[/#if]",
+ "description": "#if [if]",
+ "scope": "text.ftl.html"
+ },
+ "#li": {
+ "prefix": "#li",
+ "body": "<#list ${1:collection} as ${2:element}>\n\t$0\n#list>",
+ "description": "#list (li)",
+ "scope": "text.ftl.html"
+ },
+ "#li_": {
+ "prefix": "#li_",
+ "body": "[#list ${1:collection} as ${2:element}]\n\t$0\n[/#list]",
+ "description": "#list [li]",
+ "scope": "text.ftl.html"
+ },
+ "#g": {
+ "prefix": "#g",
+ "body": "<#global ${1:var}=${2:value}/>$0",
+ "description": "#global short (g)",
+ "scope": "text.ftl.html"
+ },
+ "#g_": {
+ "prefix": "#g_",
+ "body": "[#global ${1:var}=${2:value}/]$0",
+ "description": "#global short [g]",
+ "scope": "text.ftl.html"
+ },
+ "#global": {
+ "prefix": "#global",
+ "body": "<#global ${1:var}>${2:value}#global>$0",
+ "description": "global long (global)",
+ "scope": "text.ftl.html"
+ },
+ "#global_": {
+ "prefix": "#global",
+ "body": "[#global ${1:var}]${2:value}[/#global]$0",
+ "description": "global long [global]",
+ "scope": "text.ftl.html"
+ },
+ "#l": {
+ "prefix": "#l",
+ "body": "<#local ${1:var}=${2:value}/>$0",
+ "description": "#local short (l)",
+ "scope": "text.ftl.html"
+ },
+ "#l_": {
+ "prefix": "#l_",
+ "body": "[#local ${1:var}=${2:value}/]$0",
+ "description": "#local short [l]",
+ "scope": "text.ftl.html"
+ },
+ "#local": {
+ "prefix": "#local",
+ "body": "<#local ${1:var}>${2:value}#local>$0",
+ "description": "local long (local)",
+ "scope": "text.ftl.html"
+ },
+ "#local_": {
+ "prefix": "#local_",
+ "body": "[#local ${1:var}]${2:value}[/#local]$0",
+ "description": "local long [local]",
+ "scope": "text.ftl.html"
+ },
+ "#include": {
+ "prefix": "#include",
+ "body": "<#include \"${1:resource}\"/>",
+ "description": "#include (include)",
+ "scope": "text.ftl.html"
+ },
+ "#include_": {
+ "prefix": "#include_",
+ "body": "[#include \"${1:resource}\"/]",
+ "description": "#include [include]",
+ "scope": "text.ftl.html"
+ },
+ "#function": {
+ "prefix": "#function",
+ "body": "<#function ${1:name} ${2:param1} ${3:param2}>\n\t<#return ($2 + $3)>$0\n#function>",
+ "description": "#function / #return (function)",
+ "scope": "text.ftl.html"
+ },
+ "#function_": {
+ "prefix": "#function_",
+ "body": "[#function ${1:name} ${2:param1} ${3:param2}]\n\t[#return ($2 + $3)]$0\n[/#function]",
+ "description": "#function / #return [function]",
+ "scope": "text.ftl.html"
+ },
+ "#sw": {
+ "prefix": "#sw",
+ "body": "<#switch ${1:var}>\n\t<#case ${2:value1}/>$0\n\t\t<#break/>\n\t<#case ${3:value2}/>\n\t\t<#break/>\n\t<#default/>\n#switch>",
+ "description": "#switch / #case / #default (sw)",
+ "scope": "text.ftl.html"
+ },
+ "#sw_": {
+ "prefix": "#sw_",
+ "body": "[#switch ${1:var}]\n\t[#case ${2:value1}/]$0\n\t\t[#break/]\n\t[#case ${3:value2}/]\n\t\t[#break/]\n\t[#default/]\n[/#switch]",
+ "description": "#switch / #case / #default [sw]",
+ "scope": "text.ftl.html"
+ },
+ "#ca": {
+ "prefix": "#ca",
+ "body": "<#case ${1:value}/>\n\t$0\n\t<#break/>",
+ "description": "#case (case)",
+ "scope": "text.ftl.html"
+ },
+ "#ca_": {
+ "prefix": "#ca_",
+ "body": "[#case ${1:value}/]\n\t$0\n\t[#break/]",
+ "description": "#case [case]",
+ "scope": "text.ftl.html"
+ },
+ "#imp": {
+ "prefix": "#imp",
+ "body": "<#import \"${1:libPath}\" as ${2:alias}/>\n$0",
+ "description": "#import (imp)",
+ "scope": "text.ftl.html"
+ },
+ "#imp_": {
+ "prefix": "#imp_",
+ "body": "[#import \"${1:libPath}\" as ${2:alias}/]\n$0",
+ "description": "#import [imp]",
+ "scope": "text.ftl.html"
+ },
+ "#att": {
+ "prefix": "#att",
+ "body": "<#attempt>\n\t$0\n<#recover/>\n\t\n#attempt>",
+ "description": "#attempt / #recover (att)",
+ "scope": "text.ftl.html"
+ },
+ "#att_": {
+ "prefix": "#att_",
+ "body": "[#attempt]\n\t$0\n[#recover/]\n\t\n[/#attempt]",
+ "description": "#attempt / #recover [att]",
+ "scope": "text.ftl.html"
+ }
+}
diff --git a/snippets/ftl.json b/snippets/ftl.json
new file mode 100644
index 0000000..93f7195
--- /dev/null
+++ b/snippets/ftl.json
@@ -0,0 +1,314 @@
+{
+ "@sb": {
+ "prefix": "sb",
+ "body": "<@spring.bind \"${1:object.field}\"/>$0",
+ "description": "@spring.bind",
+ "scope": "text.html.ftl"
+ },
+ "@sfi": {
+ "prefix": "sfi",
+ "body": "<@spring.formInput path=\"${1:path}\"/>$0",
+ "description": "@spring.formInput",
+ "scope": "text.html.ftl"
+ },
+ "@sfp": {
+ "prefix": "sfp",
+ "body": "<@spring.formPasswordInput path=\"${1:path}\"/>$0",
+ "description": "@spring.formPasswordInput",
+ "scope": "text.html.ftl"
+ },
+ "@sm": {
+ "prefix": "sm",
+ "body": "<@spring.message code=\"$1\"/>$0",
+ "description": "@spring.message",
+ "scope": "text.html.ftl"
+ },
+ "@sma": {
+ "prefix": "sma",
+ "body": "<@spring.messageArgs \"${1:code}\", [${2:args}]/>$0",
+ "description": "@spring.messageArgs",
+ "scope": "text.html.ftl"
+ },
+ "@st": {
+ "prefix": "st",
+ "body": "<@spring.theme code=\"$1\"/>$0",
+ "description": "@spring.theme",
+ "scope": "text.html.ftl"
+ },
+ "#dir": {
+ "prefix": "dir",
+ "body": "<#$1>$0${1/\\s.*$//}>",
+ "description": "Directive (dir)",
+ "scope": "text.html.ftl"
+ },
+ "#dir_": {
+ "prefix": "dir_",
+ "body": "[#$1]$0[/${1/\\s.*$//}]",
+ "description": "Directive [dir]",
+ "scope": "text.html.ftl"
+ },
+ "@ma": {
+ "prefix": "ma",
+ "body": "<@$1>$0${1/\\s.*$//}>",
+ "description": "Macro (ma)",
+ "scope": "text.html.ftl"
+ },
+ "@ma_": {
+ "prefix": "ma_",
+ "body": "[@$1]$0[/${1/\\s.*$//}]",
+ "description": "Macro [ma]",
+ "scope": "text.html.ftl"
+ },
+ "#d": {
+ "prefix": "d",
+ "body": "<#$1/>$0",
+ "description": "Simple Directive (d)",
+ "scope": "text.html.ftl"
+ },
+ "#d_": {
+ "prefix": "d_",
+ "body": "[#$1/]$0",
+ "description": "Simple Directive [d]",
+ "scope": "text.html.ftl"
+ },
+ "@m": {
+ "prefix": "m",
+ "body": "<@$1/>$0",
+ "description": "Simple Macro (m)",
+ "scope": "text.html.ftl"
+ },
+ "@m_": {
+ "prefix": "m_",
+ "body": "[$1/]$0",
+ "description": "Simple Macro [m]",
+ "scope": "text.html.ftl"
+ },
+ "#m": {
+ "prefix": "mdef",
+ "body": "<#macro ${1:name} ${2:parameters}>\n\t$0\n#macro>",
+ "description": "Macro definition (mdef)",
+ "scope": "text.html.ftl"
+ },
+ "#m_": {
+ "prefix": "mdef_",
+ "body": "[#macro ${1:name} ${2:parameters}]\n\t$0\n[/#macro]",
+ "description": "Macro definition [mdef]",
+ "scope": "text.html.ftl"
+ },
+ "#assign": {
+ "prefix": "assign",
+ "body": "<#assign ${1:var}>${2:value}#assign>$0",
+ "description": "assign long (assign)",
+ "scope": "text.html.ftl"
+ },
+ "#assign_": {
+ "prefix": "assign_",
+ "body": "[#assign ${1:var}]${2:value}[/#assign]$0",
+ "description": "assign long [assign]",
+ "scope": "text.html.ftl"
+ },
+ "a": {
+ "prefix": "a",
+ "body": "<#assign ${1:var}=${2:value}/>$0",
+ "description": "assign short (a)",
+ "scope": "text.html.ftl"
+ },
+ "#a_": {
+ "prefix": "a_",
+ "body": "[#assign ${1:var}=${2:value}/]$0",
+ "description": "#assign short [assign]",
+ "scope": "text.html.ftl"
+ },
+ "#set": {
+ "prefix": "set",
+ "body": "<#setting ${1:var}=${2:value}/>$0",
+ "description": "#setting short (set)",
+ "scope": "text.html.ftl"
+ },
+ "#set_": {
+ "prefix": "set_",
+ "body": "[#setting ${1:var}=${2:value}/]$0",
+ "description": "#setting short [set]",
+ "scope": "text.html.ftl"
+ },
+ "#setting": {
+ "prefix": "setting",
+ "body": "<#setting ${1:var}>${2:value}#setting>$0",
+ "description": "setting long (setting)",
+ "scope": "text.html.ftl"
+ },
+ "#setting_": {
+ "prefix": "setting_",
+ "body": "[#setting ${1:var}]${2:value}[/#setting]$0",
+ "description": "setting long [setting]",
+ "scope": "text.html.ftl"
+ },
+ "#e": {
+ "prefix": "el",
+ "body": "<#else/>$0",
+ "description": "#else (el)",
+ "scope": "text.html.ftl"
+ },
+ "#e_": {
+ "prefix": "el_",
+ "body": "[#else/]$0",
+ "description": "#else [el]",
+ "scope": "text.html.ftl"
+ },
+ "#eif": {
+ "prefix": "eif",
+ "body": "<#elseif (${1:condition})/>$0",
+ "description": "#elseif (eif)",
+ "scope": "text.html.ftl"
+ },
+ "#eif_": {
+ "prefix": "eif_",
+ "body": "[#elseif (${1:condition})/]$0",
+ "description": "#elseif [eif]",
+ "scope": "text.html.ftl"
+ },
+ "#if": {
+ "prefix": "if",
+ "body": "<#if (${1:condition})>\n\t$0\n#if>",
+ "description": "#if (if)",
+ "scope": "text.html.ftl"
+ },
+ "#if_": {
+ "prefix": "if_",
+ "body": "[#if (${1:condition})]\n\t$0\n[/#if]",
+ "description": "#if [if]",
+ "scope": "text.html.ftl"
+ },
+ "#li": {
+ "prefix": "li",
+ "body": "<#list ${1:collection} as ${2:element}>\n\t$0\n#list>",
+ "description": "#list (li)",
+ "scope": "text.html.ftl"
+ },
+ "#li_": {
+ "prefix": "li_",
+ "body": "[#list ${1:collection} as ${2:element}]\n\t$0\n[/#list]",
+ "description": "#list [li]",
+ "scope": "text.html.ftl"
+ },
+ "#g": {
+ "prefix": "g",
+ "body": "<#global ${1:var}=${2:value}/>$0",
+ "description": "#global short (g)",
+ "scope": "text.html.ftl"
+ },
+ "#g_": {
+ "prefix": "g_",
+ "body": "[#global ${1:var}=${2:value}/]$0",
+ "description": "#global short [g]",
+ "scope": "text.html.ftl"
+ },
+ "#global": {
+ "prefix": "global",
+ "body": "<#global ${1:var}>${2:value}#global>$0",
+ "description": "global long (global)",
+ "scope": "text.html.ftl"
+ },
+ "#global_": {
+ "prefix": "global",
+ "body": "[#global ${1:var}]${2:value}[/#global]$0",
+ "description": "global long [global]",
+ "scope": "text.html.ftl"
+ },
+ "#l": {
+ "prefix": "l",
+ "body": "<#local ${1:var}=${2:value}/>$0",
+ "description": "#local short (l)",
+ "scope": "text.html.ftl"
+ },
+ "#l_": {
+ "prefix": "l_",
+ "body": "[#local ${1:var}=${2:value}/]$0",
+ "description": "#local short [l]",
+ "scope": "text.html.ftl"
+ },
+ "#local": {
+ "prefix": "local",
+ "body": "<#local ${1:var}>${2:value}#local>$0",
+ "description": "local long (local)",
+ "scope": "text.html.ftl"
+ },
+ "#local_": {
+ "prefix": "local_",
+ "body": "[#local ${1:var}]${2:value}[/#local]$0",
+ "description": "local long [local]",
+ "scope": "text.html.ftl"
+ },
+ "#include": {
+ "prefix": "include",
+ "body": "<#include \"${1:resource}\"/>",
+ "description": "#include (include)",
+ "scope": "text.html.ftl"
+ },
+ "#include_": {
+ "prefix": "include_",
+ "body": "[#include \"${1:resource}\"/]",
+ "description": "#include [include]",
+ "scope": "text.html.ftl"
+ },
+ "#function": {
+ "prefix": "function",
+ "body": "<#function ${1:name} ${2:param1} ${3:param2}>\n\t<#return ($2 + $3)>$0\n#function>",
+ "description": "#function / #return (function)",
+ "scope": "text.html.ftl"
+ },
+ "#function_": {
+ "prefix": "function_",
+ "body": "[#function ${1:name} ${2:param1} ${3:param2}]\n\t[#return ($2 + $3)]$0\n[/#function]",
+ "description": "#function / #return [function]",
+ "scope": "text.html.ftl"
+ },
+ "#sw": {
+ "prefix": "sw",
+ "body": "<#switch ${1:var}>\n\t<#case ${2:value1}/>$0\n\t\t<#break/>\n\t<#case ${3:value2}/>\n\t\t<#break/>\n\t<#default/>\n#switch>",
+ "description": "#switch / #case / #default (sw)",
+ "scope": "text.html.ftl"
+ },
+ "#sw_": {
+ "prefix": "sw_",
+ "body": "[#switch ${1:var}]\n\t[#case ${2:value1}/]$0\n\t\t[#break/]\n\t[#case ${3:value2}/]\n\t\t[#break/]\n\t[#default/]\n[/#switch]",
+ "description": "#switch / #case / #default [sw]",
+ "scope": "text.html.ftl"
+ },
+ "#ca": {
+ "prefix": "ca",
+ "body": "<#case ${1:value}/>\n\t$0\n\t<#break/>",
+ "description": "#case (case)",
+ "scope": "text.html.ftl"
+ },
+ "#ca_": {
+ "prefix": "ca_",
+ "body": "[#case ${1:value}/]\n\t$0\n\t[#break/]",
+ "description": "#case [case]",
+ "scope": "text.html.ftl"
+ },
+ "#imp": {
+ "prefix": "imp",
+ "body": "<#import \"${1:libPath}\" as ${2:alias}/>\n$0",
+ "description": "#import (imp)",
+ "scope": "text.html.ftl"
+ },
+ "#imp_": {
+ "prefix": "imp_",
+ "body": "[#import \"${1:libPath}\" as ${2:alias}/]\n$0",
+ "description": "#import [imp]",
+ "scope": "text.html.ftl"
+ },
+ "#att": {
+ "prefix": "att",
+ "body": "<#attempt>\n\t$0\n<#recover/>\n\t\n#attempt>",
+ "description": "#attempt / #recover (att)",
+ "scope": "text.html.ftl"
+ },
+ "#att_": {
+ "prefix": "att_",
+ "body": "[#attempt]\n\t$0\n[#recover/]\n\t\n[/#attempt]",
+ "description": "#attempt / #recover [att]",
+ "scope": "text.html.ftl"
+ }
+}
diff --git a/snippets/html.json b/snippets/html.json
new file mode 100644
index 0000000..ae61fff
--- /dev/null
+++ b/snippets/html.json
@@ -0,0 +1,737 @@
+{
+ "doctype": {
+ "prefix": "doctype",
+ "body": [
+ "",
+ "$1"
+ ],
+ "description": "HTML - Defines the document type"
+ },
+ "a": {
+ "prefix": "a",
+ "body": "$2 $3",
+ "description": "HTML - Defines a hyperlink"
+ },
+ "abbr": {
+ "prefix": "abbr",
+ "body": "$2 $3",
+ "description": "HTML - Defines an abbreviation"
+ },
+ "address": {
+ "prefix": "address",
+ "body": [
+ "",
+ "$1",
+ " "
+ ],
+ "description": "HTML - Defines an address element"
+ },
+ "area": {
+ "prefix": "area",
+ "body": " $5",
+ "description": "HTML - Defines an area inside an image map"
+ },
+ "article": {
+ "prefix": "article",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines an article"
+ },
+ "aside": {
+ "prefix": "aside",
+ "body": [
+ "$2"
+ ],
+ "description": "HTML - Defines content aside from the page content"
+ },
+ "audio": {
+ "prefix": "audio",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines sounds content"
+ },
+ "b": {
+ "prefix": "b",
+ "body": "$1 $2",
+ "description": "HTML - Defines bold text"
+ },
+ "base": {
+ "prefix": "base",
+ "body": " $3",
+ "description": "HTML - Defines a base URL for all the links in a page"
+ },
+ "bdi": {
+ "prefix": "bdi",
+ "body": "$1 $2",
+ "description": "HTML - Used to isolate text that is of unknown directionality"
+ },
+ "bdo": {
+ "prefix": "bdo",
+ "body": [
+ "",
+ "$2",
+ " "
+ ],
+ "description": "HTML - Defines the direction of text display"
+ },
+ "big": {
+ "prefix": "big",
+ "body": "$1 $2",
+ "description": "HTML - Used to make text bigger"
+ },
+ "blockquote": {
+ "prefix": "blockquote",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a long quotation"
+ },
+ "body": {
+ "prefix": "body",
+ "body": [
+ "",
+ "\t$1",
+ ""
+ ],
+ "description": "HTML - Defines the body element"
+ },
+ "br": {
+ "prefix": "br",
+ "body": " ",
+ "description": "HTML - Inserts a single line break"
+ },
+ "button": {
+ "prefix": "button",
+ "body": "$2 $3",
+ "description": "HTML - Defines a push button"
+ },
+ "canvas": {
+ "prefix": "canvas",
+ "body": "$2 $3",
+ "description": "HTML - Defines graphics"
+ },
+ "caption": {
+ "prefix": "caption",
+ "body": "$1 $2",
+ "description": "HTML - Defines a table caption"
+ },
+ "cite": {
+ "prefix": "cite",
+ "body": "$1 $2",
+ "description": "HTML - Defines a citation"
+ },
+ "code": {
+ "prefix": "code",
+ "body": "$1
$2",
+ "description": "HTML - Defines computer code text"
+ },
+ "col": {
+ "prefix": "col",
+ "body": " $2",
+ "description": "HTML - Defines attributes for table columns"
+ },
+ "colgroup": {
+ "prefix": "colgroup",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines group of table columns"
+ },
+ "command": {
+ "prefix": "command",
+ "body": "$1 $2",
+ "description": "HTML - Defines a command button [not supported]"
+ },
+ "datalist": {
+ "prefix": "datalist",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a dropdown list"
+ },
+ "dd": {
+ "prefix": "dd",
+ "body": "$1 $2",
+ "description": "HTML - Defines a definition description"
+ },
+ "del": {
+ "prefix": "del",
+ "body": "$1$2",
+ "description": "HTML - Defines deleted text"
+ },
+ "details": {
+ "prefix": "details",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines details of an element"
+ },
+ "dialog": {
+ "prefix": "dialog",
+ "body": "$1 $2",
+ "description": "HTML - Defines a dialog (conversation)"
+ },
+ "dfn": {
+ "prefix": "dfn",
+ "body": "$1 $2",
+ "description": "HTML - Defines a definition term"
+ },
+ "div": {
+ "prefix": "div",
+ "body": [
+ "",
+ "\t$2",
+ "
"
+ ],
+ "description": "HTML - Defines a section in a document"
+ },
+ "dl": {
+ "prefix": "dl",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a definition list"
+ },
+ "dt": {
+ "prefix": "dt",
+ "body": "$1 $2",
+ "description": "HTML - Defines a definition term"
+ },
+ "em": {
+ "prefix": "em",
+ "body": "$1 $2",
+ "description": "HTML - Defines emphasized text"
+ },
+ "embed": {
+ "prefix": "embed",
+ "body": "$2",
+ "description": "HTML - Defines external interactive content ot plugin"
+ },
+ "fieldset": {
+ "prefix": "fieldset",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a fieldset"
+ },
+ "figcaption": {
+ "prefix": "figcaption",
+ "body": "$1 $2",
+ "description": "HTML - Defines a caption for a figure"
+ },
+ "figure": {
+ "prefix": "figure",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a group of media content, and their caption"
+ },
+ "footer": {
+ "prefix": "footer",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a footer for a section or page"
+ },
+ "form": {
+ "prefix": "form",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a form"
+ },
+ "h1": {
+ "prefix": "h1",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 1"
+ },
+ "h2": {
+ "prefix": "h2",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 2"
+ },
+ "h3": {
+ "prefix": "h3",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 3"
+ },
+ "h4": {
+ "prefix": "h4",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 4"
+ },
+ "h5": {
+ "prefix": "h5",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 5"
+ },
+ "h6": {
+ "prefix": "h6",
+ "body": "$1 $2",
+ "description": "HTML - Defines header 6"
+ },
+ "head": {
+ "prefix": "head",
+ "body": [
+ "",
+ "\t$1",
+ ""
+ ],
+ "description": "HTML - Defines information about the document"
+ },
+ "header": {
+ "prefix": "header",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a header for a section of page"
+ },
+ "hgroup": {
+ "prefix": "hgroup",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines information about a section in a document"
+ },
+ "hr": {
+ "prefix": "hr",
+ "body": " ",
+ "description": "HTML - Defines a horizontal rule"
+ },
+ "html": {
+ "prefix": "html",
+ "body": [
+ "",
+ "\t$1",
+ ""
+ ],
+ "description": "HTML - Defines an html document"
+ },
+ "html5": {
+ "prefix": "html5",
+ "body": [
+ "",
+ "",
+ "\t",
+ "\t\t$2 ",
+ "\t\t ",
+ "\t\t ",
+ "\t\t ",
+ "\t",
+ "\t",
+ "\t$4",
+ "\t",
+ ""
+ ],
+ "description": "HTML - Defines a template for a html5 document"
+ },
+ "i": {
+ "prefix": "i",
+ "body": "$1 $2",
+ "description": "HTML - Defines italic text"
+ },
+ "iframe": {
+ "prefix": "iframe",
+ "body": "$3",
+ "description": "HTML - Defines an inline sub window"
+ },
+ "img": {
+ "prefix": "img",
+ "body": " $3",
+ "description": "HTML - Defines an image"
+ },
+ "input": {
+ "prefix": "input",
+ "body": " $4",
+ "description": "HTML - Defines an input field"
+ },
+ "ins": {
+ "prefix": "ins",
+ "body": "$1 $2",
+ "description": "HTML - Defines inserted text"
+ },
+ "keygen": {
+ "prefix": "keygen",
+ "body": "$2",
+ "description": "HTML - Defines a generated key in a form"
+ },
+ "kbd": {
+ "prefix": "kbd",
+ "body": "$1 $2",
+ "description": "HTML - Defines keyboard text"
+ },
+ "label": {
+ "prefix": "label",
+ "body": "$2 $3",
+ "description": "HTML - Defines an inline window"
+ },
+ "legend": {
+ "prefix": "legend",
+ "body": "$1 $2",
+ "description": "HTML - Defines a title in a fieldset"
+ },
+ "li": {
+ "prefix": "li",
+ "body": "$1 $2",
+ "description": "HTML - Defines a list item"
+ },
+ "link": {
+ "prefix": "link",
+ "body": " $4",
+ "description": "HTML - Defines a resource reference"
+ },
+ "main": {
+ "prefix": "main",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines an image map"
+ },
+ "map": {
+ "prefix": "map",
+ "body": [
+ "",
+ "\t$2",
+ " "
+ ],
+ "description": "HTML - Defines an image map"
+ },
+ "mark": {
+ "prefix": "mark",
+ "body": "$1 $2",
+ "description": "HTML - Defines marked text"
+ },
+ "menu": {
+ "prefix": "menu",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a menu list"
+ },
+ "menuitem": {
+ "prefix": "menuitem",
+ "body": "$1 $2",
+ "description": "HTML - Defines a menu item [firefox only]"
+ },
+ "meta": {
+ "prefix": "meta",
+ "body": " $3",
+ "description": "HTML - Defines meta information"
+ },
+ "meter": {
+ "prefix": "meter",
+ "body": "$2 $3",
+ "description": "HTML - Defines measurement within a predefined range"
+ },
+ "nav": {
+ "prefix": "nav",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines navigation links"
+ },
+ "noscript": {
+ "prefix": "noscript",
+ "body": [
+ "",
+ "$1",
+ " "
+ ],
+ "description": "HTML - Defines a noscript section"
+ },
+ "object": {
+ "prefix": "object",
+ "body": "$4 $5",
+ "description": "HTML - Defines an embedded object"
+ },
+ "ol": {
+ "prefix": "ol",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines an ordered list"
+ },
+ "optgroup": {
+ "prefix": "optgroup",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines an option group"
+ },
+ "option": {
+ "prefix": "option",
+ "body": "$2 $3",
+ "description": "HTML - Defines an option in a drop-down list"
+ },
+ "output": {
+ "prefix": "output",
+ "body": "$3 $4",
+ "description": "HTML - Defines some types of output"
+ },
+ "p": {
+ "prefix": "p",
+ "body": "$1
$2",
+ "description": "HTML - Defines a paragraph"
+ },
+ "param": {
+ "prefix": "param",
+ "body": " $3",
+ "description": "HTML - Defines a parameter for an object"
+ },
+ "pre": {
+ "prefix": "pre",
+ "body": [
+ "$1 "
+ ],
+ "description": "HTML - Defines preformatted text"
+ },
+ "progress": {
+ "prefix": "progress",
+ "body": "$3 $4",
+ "description": "HTML - Defines progress of a task of any kind"
+ },
+ "q": {
+ "prefix": "q",
+ "body": "$1 $2",
+ "description": "HTML - Defines a short quotation"
+ },
+ "rp": {
+ "prefix": "rp",
+ "body": "$1 $2",
+ "description": "HTML - Used in ruby annotations to define what to show browsers that do not support the ruby element"
+ },
+ "rt": {
+ "prefix": "rt",
+ "body": "$1 $2",
+ "description": "HTML - Defines explanation to ruby annotations"
+ },
+ "ruby": {
+ "prefix": "ruby",
+ "body": [
+ "",
+ "$1",
+ " "
+ ],
+ "description": "HTML - Defines ruby annotations"
+ },
+ "s": {
+ "prefix": "s",
+ "body": "$1 $2",
+ "description": "HTML - Used to define strikethrough text"
+ },
+ "samp": {
+ "prefix": "samp",
+ "body": "$1 $2",
+ "description": "HTML - Defines sample computer code"
+ },
+ "script": {
+ "prefix": "script",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a script"
+ },
+ "section": {
+ "prefix": "section",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a section"
+ },
+ "select": {
+ "prefix": "select",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a selectable list"
+ },
+ "small": {
+ "prefix": "small",
+ "body": "$1 $2",
+ "description": "HTML - Defines small text"
+ },
+ "source": {
+ "prefix": "source",
+ "body": "$3",
+ "description": "HTML - Defines media resource"
+ },
+ "span": {
+ "prefix": "span",
+ "body": "$1 $2",
+ "description": "HTML - Defines a section in a document"
+ },
+ "strong": {
+ "prefix": "strong",
+ "body": "$1 $2",
+ "description": "HTML - Defines strong text"
+ },
+ "style": {
+ "prefix": "style",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a style definition"
+ },
+ "sub": {
+ "prefix": "sub",
+ "body": "$1 $2",
+ "description": "HTML - Defines sub-scripted text"
+ },
+ "sup": {
+ "prefix": "sup",
+ "body": "$1 $2",
+ "description": "HTML - Defines super-scripted text"
+ },
+ "summary": {
+ "prefix": "summary",
+ "body": "$1 $2",
+ "description": "HTML - Defines a visible heading for the detail element [limited support]"
+ },
+ "table": {
+ "prefix": "table",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines a table"
+ },
+ "tbody": {
+ "prefix": "tbody",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a table body"
+ },
+ "td": {
+ "prefix": "td",
+ "body": "$1 $2",
+ "description": "HTML - Defines a table cell"
+ },
+ "textarea": {
+ "prefix": "textarea",
+ "body": "$4",
+ "description": "HTML - Defines a text area"
+ },
+ "tfoot": {
+ "prefix": "tfoot",
+ "body": [
+ "",
+ "\t$1",
+ " "
+ ],
+ "description": "HTML - Defines a table footer"
+ },
+ "thead": {
+ "prefix": "thead",
+ "body": [
+ "",
+ "$1",
+ " "
+ ],
+ "description": "HTML - Defines a table head"
+ },
+ "th": {
+ "prefix": "th",
+ "body": "$1 $2",
+ "description": "HTML - Defines a table header"
+ },
+ "time": {
+ "prefix": "time",
+ "body": "$2 $3",
+ "description": "HTML - Defines a date/time"
+ },
+ "title": {
+ "prefix": "title",
+ "body": "$1 $2",
+ "description": "HTML - Defines the document title"
+ },
+ "tr": {
+ "prefix": "tr",
+ "body": "$1 $2",
+ "description": "HTML - Defines a table row"
+ },
+ "track": {
+ "prefix": "track",
+ "body": "$5",
+ "description": "HTML - Defines a table row"
+ },
+ "u": {
+ "prefix": "u",
+ "body": "$1 $2",
+ "description": "HTML - Used to define underlined text"
+ },
+ "ul": {
+ "prefix": "ul",
+ "body": [
+ ""
+ ],
+ "description": "HTML - Defines an unordered list"
+ },
+ "var": {
+ "prefix": "var",
+ "body": "$1 $2",
+ "description": "HTML - Defines a variable"
+ },
+ "video": {
+ "prefix": "video",
+ "body": [
+ "",
+ "\t$3",
+ " "
+ ],
+ "description": "HTML - Defines a video"
+ }
+}
\ No newline at end of file
diff --git a/syntaxes/ftl.tmLanguage b/syntaxes/ftl.tmLanguage
new file mode 100644
index 0000000..36c6e41
--- /dev/null
+++ b/syntaxes/ftl.tmLanguage
@@ -0,0 +1,147 @@
+
+
+
+
+ fileTypes
+
+ ftl
+
+ foldingStartMarker
+ (?x)
+ (<(?i:head|body|table|thead|tbody|tfoot|tr|div|nav|section|aside|header|select|fieldset|style|script|ul|ol|form|dl)\b.*?>
+ |<!--(?!.*-->)
+ |\{\s*($|\?>\s*$|//|/\*(.*\*/\s*$|(?!.*?\*/)))
+ |(\[|<)(\#|@)\w+.*\(\]|>)
+ )
+ foldingStopMarker
+ (?x)
+ (</(?i:head|body|table|thead|tbody|tfoot|tr|div|nav|section|aside|header|select|fieldset|style|script|ul|ol|form|dl)>
+ |^\s*-->
+ |(^|\s)\}
+ |(\[|<)/(\#|@)\w+.*(\]|>)
+ )
+ keyEquivalent
+ ^~F
+ name
+ FreeMarker
+ patterns
+
+
+ begin
+ [<\[]#--
+ captures
+
+ 0
+
+ name
+ punctuation.definition.comment.ftl
+
+
+ end
+ --[>\]]
+ name
+ comment.block.ftl
+
+
+ captures
+
+ 1
+
+ name
+ punctuation.definition.function.ftl
+
+ 2
+
+ name
+ punctuation.definition.function.ftl
+
+ 3
+
+ name
+ entity.name.function.ftl
+
+ 5
+
+ name
+ variable.parameter.function.ftl
+
+ 8
+
+ name
+ entity.name.function.ftl
+
+ 9
+
+ name
+ punctuation.definition.function.ftl
+
+
+ match
+ ([<\[](#|@))(\w+(\.\w+)*)((\s+[^>\]]+)*?)\s*((\/)?([>\]]))
+ name
+ meta.function.ftl
+
+
+ captures
+
+ 1
+
+ name
+ punctuation.definition.function.ftl
+
+ 2
+
+ name
+ punctuation.definition.function.ftl
+
+ 3
+
+ name
+ entity.name.function.ftl
+
+ 5
+
+ name
+ punctuation.definition.function.ftl
+
+
+ match
+ ([<\[]\/(#|@))(\w+(\.\w+)*)\s*([>\]])
+ name
+ meta.function.ftl
+
+
+ captures
+
+ 1
+
+ name
+ punctuation.definition.variable.ftl
+
+ 3
+
+ name
+ entity.name.function.ftl
+
+ 4
+
+ name
+ punctuation.definition.variable.ftl
+
+
+ match
+ (\$\{)\.?[a-zA-Z_\(][\w\(\)+-\/\*]+(\.?[\w\(\)+-\/\*]+)*(.*?|\?\?|\!)?(\})
+ name
+ variable.other.readwrite.local.ftl
+
+
+ include
+ text.html.basic
+
+
+ scopeName
+ text.html.ftl
+ uuid
+ C011BB07-875D-4DEB-9582-0E1FEC0D1E4E
+
+
diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md
new file mode 100644
index 0000000..10a63e8
--- /dev/null
+++ b/vsc-extension-quickstart.md
@@ -0,0 +1,27 @@
+# Welcome to your VS Code Extension
+
+## What's in the folder
+* This folder contains all of the files necessary for your extension
+* `package.json` - this is the manifest file in which you declare your language support and define
+the location of the grammar file that has been copied into you extension.
+* `syntaxes/ftl.tmLanguage` - this is the Text mate grammar file that is used for tokenization
+* `ftl.configuration.json` - this the language configuration, defining the tokens that are used for
+comments and brackets.
+
+## Get up and running straight away
+* Make sure the language configuration settings in `ftl.configuration.json` are accurate
+* press `F5` to open a new window with your extension loaded
+* create a new file with a file name suffix matching your language
+* verify that syntax highlight works and that the language configuration settings are working
+
+## Make changes
+* you can relaunch the extension from the debug toolbar after making changes to the files listed above
+* you can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes
+
+## Add more language features
+* To add features such as intellisense, hovers and validators check out the VS Code extenders documentation at
+https://code.visualstudio.com/docs
+
+## Install your extension
+* To start using your extension with Visual Studio Code copy it into the /.vscode/extensions folder and restart Code.
+* To share your extension with the world, read on https://code.visualstudio.com/docs about publishing an extension.
\ No newline at end of file