Commits

Grant Eagon  committed 2d94f34 Draft

Add Liquid syntax to the package. Lots still to do. Completions aren't working properly yet, but good enough for now! :)

  • Participants
  • Parent commits db085b7

Comments (0)

Files changed (27)

File Main.sublime-menu

+[
+    {
+        "caption": "Preferences",
+        "mnemonic": "n",
+        "id": "preferences",
+        "children":
+        [
+            {
+                "caption": "Package Settings",
+                "mnemonic": "P",
+                "id": "package-settings",
+                "children":
+                [
+                    {
+                        "caption": "Liquid",
+                        "children":
+                        [
+                            {
+                                "command": "open_file", "args":
+                                {
+                                    "file": "${packages}/Liquid/Settings/HTML (Liquid).sublime-settings"
+                                },
+                                "caption": "Settings (HTML) – Default"
+                            },
+                            {
+                                "command": "open_file", "args":
+                                {
+                                    "file": "${packages}/User/HTML (Liquid).sublime-settings"
+                                },
+                                "caption": "Settings (HTML) – User"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+]

File Settings/HTML (Liquid).sublime-settings

+{
+    "extensions":
+    [
+        "liquid"
+    ]
+}

File Syntax Preferences/Comments.tmPreferences

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>name</key>
+    <string>Preferences</string>
+    <key>scope</key>
+    <string>text.html.liquid</string>
+    <key>settings</key>
+    <dict>
+        <key>shellVariables</key>
+        <array>
+                <dict>
+                        <key>name</key>
+                        <string>TM_COMMENT_START</string>
+                        <key>value</key>
+                        <string>{% comment %}</string>
+                </dict>
+                <dict>
+                        <key>name</key>
+                        <string>TM_COMMENT_END</string>
+                        <key>value</key>
+                        <string>{% endcomment %}</string>
+                </dict>
+                <dict>
+                        <key>name</key>
+                        <string>TM_COMMENT_MODE</string>
+                        <key>value</key>
+                        <string>block</string>
+                </dict>
+        </array>
+    </dict>
+    <key>uuid</key>
+    <string>A3452E24-5C3A-42AF-B7D4-1C509BEEB638</string>
+</dict>
+</plist>

File Syntax Preferences/Comments.tmPreferences.cache

Binary file added.

File Syntaxes/HTML (Liquid).JSON-tmLanguage

+{
+    "name": "HTML (Liquid)",
+    "scopeName": "text.html.liquid",
+    "fileTypes": ["liquid"],
+    "patterns": [
+        {
+            "name": "comment.block.liquid",
+            "begin": "{% comment %}",
+            "end": "{% endcomment %}"
+        },
+        {
+            "name": "storage.type.variable.liquid",
+            "begin": "{{",
+            "captures": {
+                "0": { "name": "entity.tag.tagbraces.liquid" }
+            },
+            "end": "}}",
+            "patterns": [
+                { "include": "#template_filter" }
+            ]
+        },
+        {
+            "name": "storage.type.templatetag.liquid",
+            "begin": "{%",
+            "captures": {
+                "0": { "name": "entity.tag.tagbraces.liquid" }
+            },
+            "end": "%}",
+            "patterns": [
+                { "include": "#template_tag" },
+                { "include": "#template_filter" }
+            ]
+        },
+        {
+            "include": "text.html.basic"
+        }
+    ],
+    "repository": {
+        "template_filter": {
+            "patterns": [
+                {
+                    "name": "keyword.control.filter.liquid",
+                    "match": "(plus|asset_url|camelize|capitalize|default_pagination|global_asset_url|handleize|img_tag|link_to|link_to_vendor|link_to_type|link_to_tag|link_to_add_tag|link_to_remove_tag|highlight_active_tag|money_with_currency|money_without_currency|money|pluralize|product_img_url|script_tag|stylesheet_tag|url_for_type|url_for_vendor|weight_with_unit|within|escape|append|prepend|size|join|downcase|upcase|strip_html|strip_newlines|truncate|truncatewords|date|first|last|newline_to_br|replace|replace_first|remove|remove_first|plus|minus|times|divided_by|split|json)\\b"
+                },
+                {
+                    "name": "storage.type.attr.liquid",
+                    "begin": ":\"|\"",
+                    "end": "\""
+                },
+                {
+                    "name": "string.unquoted.filter-pipe.liquid",
+                    "match": "\\|"
+                },
+                {
+                    "name": "string.unquoted.tag-string.liquid",
+                    "match": "[a-zA-Z_.]+"
+                }
+            ]
+        },
+        "template_tag": {
+            "patterns": [
+                {
+                    "name": "keyword.control.tag-name.liquid",
+                    "match": "\\b(for|endfor|if|elsif|endif|cycle|unless|endunless|assign|capture|endcapture|include|tablerow|endtablerow|case|when|endcase|raw|endraw)\\b"
+                },
+                {
+                    "name": "keyword.operator.liquid",
+                    "match": "\\b(and|or|not|contains|in)\\b"
+                }
+            ]
+        }
+    }
+}

File Syntaxes/HTML (Liquid).tmLanguage

+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+	<dict>
+		<key>fileTypes</key>
+		<array>
+			<string>liquid</string>
+		</array>
+		<key>foldingStartMarker</key>
+		<string>(?x){%\s*(if|unless|for|paginate|capture|form|case|tablerow|raw|comment)[^(%})]+%}</string>
+		<key>foldingStopMarker</key>
+		<string>(?x){%\s*(endif|endunless|endfor|endpaginate|endcapture|endform|endcase|endtablerow|endraw|endcomment)[^(%})]+%}</string>
+		<key>name</key>
+		<string>HTML (Liquid)</string>
+		<key>patterns</key>
+		<array>
+			<dict>
+				<key>begin</key>
+				<string>{%\s*comment\s*%}</string>
+				<key>end</key>
+				<string>{%\s*endcomment\s*%}</string>
+				<key>name</key>
+				<string>comment.block.liquid</string>
+			</dict>
+			<dict>
+				<key>begin</key>
+				<string>{{</string>
+				<key>end</key>
+				<string>}}</string>
+				<key>name</key>
+				<string>punctuation.output.liquid</string>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>include</key>
+						<string>#template_var</string>
+					</dict>
+				</array>
+			</dict>
+			<dict>
+				<key>begin</key>
+				<string>{%</string>
+				<key>end</key>
+				<string>%}</string>
+				<key>name</key>
+				<string>punctuation.tag.liquid</string>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>include</key>
+						<string>#template_tag_name</string>
+					</dict>
+					<dict>
+						<key>include</key>
+						<string>#template_var</string>
+					</dict>
+				</array>
+			</dict>
+			<dict>
+				<key>include</key>
+				<string>text.html.basic</string>
+			</dict>
+		</array>
+		<key>repository</key>
+		<dict>
+			<key>template_tag_name</key>
+			<dict>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>match</key>
+						<string>(?&lt;={%)\s*(\w+)</string>
+						<key>name</key>
+						<string>entity.name.tag.liquid</string>
+					</dict>
+				</array>
+			</dict>
+			<key>logic_op</key>
+			<dict>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>match</key>
+						<string>\s+(and|or|not|contains|(\!\=|\=\=|&lt;\=|&gt;\=|&lt;|&gt;)\s+</string>
+						<key>name</key>
+						<string>keyword.operator.logical.liquid</string>
+					</dict>
+				</array>
+			</dict>
+			<key>assign_op</key>
+			<dict>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>match</key>
+						<string>/=</string>
+						<key>name</key>
+						<string>keyword.operator.assignment.augmented.liquid</string>
+					</dict>
+				</array>
+			</dict>
+			<key>logic_expression</key>
+			<dict>
+				<key>patterns</key>
+				<array>
+					<dict>
+						<key>match</key>
+						<string>/=</string>
+						<key>name</key>
+						<string>keyword.operator.assignment.augmented.liquid</string>
+					</dict>
+				</array>
+			</dict>
+			<key>template_var</key>
+			<dict>
+				<key>patterns</key>
+				<array>
+					<!-- syntax within brackets -->
+					<dict>
+						<key>captures</key>
+						<dict>
+							<key>2</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.filter.liquid</string>
+							</dict>
+							<key>3</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.filter.liquid</string>
+							</dict>
+						</dict>
+						<key>match</key>
+						<string>(\[)(\|)(?=[^\]]*)(?=\])</string>
+					</dict>
+					<!--- plus, minus, divide and multiply used as filters --->
+					<dict>
+						<key>match</key>
+						<string>(?&lt;=\s)(\+|\-|\/|\*)(?=\s)</string>
+						<key>name</key>
+						<string>invalid.illegal.filter.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>(false|true|nil)</string>
+						<key>name</key>
+						<string>constant.language.liquid</string>
+					</dict>
+					<!-- "in" used in logic tag [instead of contains] -->
+					<dict>
+						<key>captures</key>
+						<dict>
+							<key>1</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.operator.liquid</string>
+							</dict>
+						</dict>
+						<key>match</key>
+						<string>(?&lt;=if|unless|elsif)[^%}]+[a-zA-Z0-9\-\w]+\s(in)\s[a-zA-Z0-9\-\w]+</string>
+					</dict>
+					<!-- illegal equality test in logic tag [broken] -->
+					<dict>
+						<key>captures</key>
+						<dict>
+							<key>2</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.equality.test.liquid</string>
+							</dict>
+						</dict>
+						<key>match</key>
+						<string>(if|unless|elsif)[^%}]+(\s\=\s)</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>(?&lt;=\s)(\+|\-|\/|\*)(?=\s)</string>
+						<key>name</key>
+						<string>invalid.illegal.filter.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>\s+(and|or|not|contains|in|by|((\!|\=|\&lt;|\&gt;)\=))\s+</string>
+						<key>name</key>
+						<string>keyword.operator.liquid</string>
+					</dict>
+					<dict>
+						<key>captures</key>
+						<dict>
+							<key>2</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.assignment.liquid</string>
+							</dict>
+						</dict>
+						<key>match</key>
+						<string>(?&lt;=assign)([^\=]+)(\=\=+)</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>\|\s+(?![\.0-9])[a-zA-Z0-9_-]+\:\s+</string>
+						<key>name</key>
+						<string>support.function.with-args.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>\|\s+(?![\.0-9])[a-zA-Z0-9_-]+\s+</string>
+						<key>name</key>
+						<string>support.function.without-args.liquid</string>
+					</dict>
+					<!-- tag modifiers -->
+					<dict>
+						<key>match</key>
+						<string>(?&lt;=\s)(with|offset\:|limit\:)(?=\s)</string>
+						<key>name</key>
+						<string>keyword.control.liquid</string>
+					</dict>
+					<dict>
+						<key>captures</key>
+						<dict>
+							<key>2</key>
+							<dict>
+								<key>name</key>
+								<string>invalid.illegal.argument.liquid</string>
+							</dict>
+						</dict>
+						<key>match</key>
+						<string>(?&lt;=include)(.*)(with\:|offset|limit)(?=\s)</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>(?&lt;=\s)(\w+\:)(?=\:\s)</string>
+						<key>name</key>
+						<string>invalid.illegal.liquid</string>
+					</dict>
+					<dict>
+						<key>begin</key>
+						<string>"</string>
+						<key>end</key>
+						<string>"</string>
+						<key>name</key>
+						<string>string.quoted.double.liquid</string>
+					</dict>
+					<dict>
+						<key>begin</key>
+						<string>'</string>
+						<key>end</key>
+						<string>'</string>
+						<key>name</key>
+						<string>string.quoted.single.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>(-|\+)?\s*[0-9]+(\.[0-9]+)?</string>
+						<key>name</key>
+						<string>constant.numeric.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>\b(collection|product|linklist|linklists|order|link|customer|customer_address|line_item|shop|collections|page_title|template|image|blog|blogs|cart|pages|theme|themes|variant|items|comment|forloop|settings)\b</string>
+						<key>name</key>
+						<string>support.class.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>((?&lt;=\w\:\s)\w+)</string>
+						<key>name</key>
+						<string>variable.parameter.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>(?&lt;=\.)\w+\b</string>
+						<key>name</key>
+						<string>support.variable.liquid</string>
+					</dict>
+					<dict>
+						<key>match</key>
+						<string>\w+</string>
+						<key>name</key>
+						<string>variable.other.liquid</string>
+					</dict>
+				</array>
+			</dict>
+		</dict>
+		<key>scopeName</key>
+		<string>text.html.liquid</string>
+		<key>uuid</key>
+		<string>f2a39460-98fd-11e1-a8b0-0800200c9a66</string>
+	</dict>
+</plist>

File Syntaxes/HTML (Liquid).tmLanguage.cache

Binary file added.

File liquid.sublime-completions

+{
+        "scope": "text.html.liquid",
+
+        "completions":
+        [
+            {"trigger": "trim", "contents": "replace: \" \", split: \" \" | join: \" \""},
+            { "trigger": "collection.", "contents": "collection.size" },
+            { "trigger": "collection.", "contents": "collection.handle" },
+            { "trigger": "collection.", "contents": "collection.description" },
+            { "trigger": "collection.", "contents": "collection.image" },
+            { "trigger": "collection.", "contents": "collection.products" },
+            { "trigger": "collection.", "contents": "collection.products_count" },
+            { "trigger": "collection.", "contents": "collection.all_products" },
+            { "trigger": "collection.", "contents": "collection.all_products_count" },
+            { "trigger": "collection.", "contents": "collection.tags" },
+            { "trigger": "collection.", "contents": "collection.all_tags" },
+            { "trigger": "collection.", "contents": "collection.next_product" },
+            { "trigger": "collection.", "contents": "collection.previous_product" },
+            { "trigger": "collection.", "contents": "collection.url" },
+            { "trigger": "collection.", "contents": "collection.all_types" },
+            { "trigger": "collection.", "contents": "collection.all_vendors" },
+            { "trigger": "product.id", "contents": "product.id" },
+            { "trigger": "product.title", "contents": "product.title" },
+            { "trigger": "product.handle", "contents": "product.handle" },
+            { "trigger": "product.vendor", "contents": "product.vendor" },
+            { "trigger": "product.price", "contents": "product.price" },
+            { "trigger": "product.price_min", "contents": "product.price_min" },
+            { "trigger": "product.compare_at_price_min", "contents": "product.compare_at_price_min" },
+            { "trigger": "product.price_max", "contents": "product.price_max" },
+            { "trigger": "product.compare_at_price_max", "contents": "product.compare_at_price_max" },
+            { "trigger": "product.price_varies", "contents": "product.price_varies" },
+            { "trigger": "product.compare_at_price_varies", "contents": "product.compare_at_price_varies" },
+            { "trigger": "product.url", "contents": "product.url" },
+            { "trigger": "product.featured_image", "contents": "product.featured_image" },
+            { "trigger": "product.images", "contents": "product.images" },
+            { "trigger": "product.description", "contents": "product.description" },
+            { "trigger": "product.content", "contents": "product.content" },
+            { "trigger": "product.variants", "contents": "product.variants" },
+            { "trigger": "product.available", "contents": "product.available" },
+            { "trigger": "product.collections", "contents": "product.collections" },
+            { "trigger": "product.tags", "contents": "product.tags" },
+            { "trigger": "product.options", "contents": "product.options" },
+            { "trigger": "variant.title", "contents": "variant.title" },
+            { "trigger": "variant.price", "contents": "variant.price" },
+            { "trigger": "variant.compare_at_price_max", "contents": "variant.compare_at_price" },
+            { "trigger": "variant.available", "contents": "variant.available" },
+            { "trigger": "variant.inventory_management", "contents": "variant.inventory_management" },
+            { "trigger": "variant.inventory_quantity", "contents": "variant.inventory_quantity" },
+            { "trigger": "variant.weight", "contents": "variant.weight" },
+            { "trigger": "variant.sku", "contents": "variant.sku" },
+            { "trigger": "variant.option1", "contents": "variant.option1" },
+            { "trigger": "variant.option2", "contents": "variant.option2" },
+            { "trigger": "variant.option3", "contents": "variant.option3" },
+            { "trigger": "variant.options", "contents": "variant.options" },
+            { "trigger": "variant.requires_shipping", "contents": "variant.requires_shipping" },
+            { "trigger": "variant.taxable", "contents": "variant.taxable" },
+            { "trigger": "product_img_url", "contents": "product_img_url" },
+            { "trigger": "asset_url", "contents": "asset_url" },
+            { "trigger": "img_tag", "contents": "img_tag" },
+            { "trigger": "script_tag", "contents": "script_tag" },
+            { "trigger": "stylesheet_tag", "contents": "stylesheet_tag" },
+            { "trigger": "global_asset_url", "contents": "global_asset_url" },
+            { "trigger": "link_to", "contents": "link_to" },
+            { "trigger": "link_to_vendor", "contents": "link_to_vendor" },
+            { "trigger": "link_to_type", "contents": "link_to_type" },
+            { "trigger": "link_to_tag", "contents": "link_to_tag" },
+            { "trigger": "link_to_theme", "contents": "link_to_theme" },
+            { "trigger": "link_to_add_tag", "contents": "link_to_add_tag" },
+            { "trigger": "link_to_remove_tag", "contents": "link_to_remove_tag" },
+            { "trigger": "collection_img_url", "contents": "collection_img_url" },
+            { "trigger": "theme_url", "contents": "theme_url" },
+            { "trigger": "url_for_vendor", "contents": "url_for_vendor" },
+            { "trigger": "url_for_type", "contents": "url_for_type" },
+            { "trigger": "url_for_product", "contents": "url_for_product" },
+            { "trigger": "money_with_currency", "contents": "money_with_currency" },
+            { "trigger": "money_without_currency", "contents": "money_without_currency" },
+            { "trigger": "money", "contents": "money" },
+            { "trigger": "plus", "contents": "plus" },
+            { "trigger": "minus", "contents": "minus" },
+            { "trigger": "times", "contents": "times" },
+            { "trigger": "divided_by", "contents": "divided_by" },
+            { "trigger": "append", "contents": "append: " },
+            { "trigger": "camelize", "contents": "camelize" },
+            { "trigger": "capitalize", "contents": "capitalize" },
+            { "trigger": "date", "contents": "date" },
+            { "trigger": "default_pagination", "contents": "default_pagination" },
+            { "trigger": "downcase", "contents": "downcase" },
+            { "trigger": "escape", "contents": "escape" },
+            { "trigger": "first", "contents": "first" },
+            { "trigger": "handleize", "contents": "handleize" },
+            { "trigger": "highlight_active_tag", "contents": "highlight_active_tag" },
+            { "trigger": "join", "contents": "join" },
+            { "trigger": "last", "contents": "last" },
+            { "trigger": "replace_first", "contents": "replace_first: $0" },
+            { "trigger": "remove", "contents": "remove" },
+            { "trigger": "remove_first", "contents": "remove_first: $0" },
+            { "trigger": "newline_to_br", "contents": "newline_to_br" },
+            { "trigger": "pluralize", "contents": "pluralize" },
+            { "trigger": "prepend", "contents": "prepend" },
+            { "trigger": "size", "contents": "size" },
+            { "trigger": "split", "contents": "split: $0" },
+            { "trigger": "strip_html", "contents": "strip_html" },
+            { "trigger": "strip_newlines", "contents": "strip_newlines" },
+            { "trigger": "replace", "contents": "replace" },
+            { "trigger": "truncate", "contents": "truncate" },
+            { "trigger": "truncatewords", "contents": "truncatewords" },
+            { "trigger": "upcase", "contents": "upcase" },
+            { "trigger": "weight_with_unit", "contents": "weight_with_unit" },
+            { "trigger": "json", "contents": "json" }
+
+        ]
+}

File liquid/assign.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% assign $1 = $2 %}]]></content>
+    <tabTrigger>assign</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>assign</description>
+</snippet>

File liquid/capture.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% capture $1 %}$2{% endcapture %}]]></content>
+    <tabTrigger>capture</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>capture</description>
+</snippet>

File liquid/comment.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[{% comment %}$0{% endcomment %}]]>	</content>
+    <tabTrigger>comment</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>comment</description>
+</snippet>

File liquid/context_variable.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[{{ $1 }}]]></content>
+    <tabTrigger>var</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>context variable (var)</description>
+</snippet>

File liquid/cycle.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[{% cycle $1 %}]]></content>
+    <tabTrigger>cycle</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>cycle</description>
+</snippet>

File liquid/else.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[{% else %}]]></content>
+    <tabTrigger>else</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>else</description>
+</snippet>

File liquid/elsif.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% elsif $1 %}]]></content>
+    <tabTrigger>elsif</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>elsif</description>
+</snippet>

File liquid/endcapture.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% endcapture %}]]></content>
+    <tabTrigger>endcapture</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>endcapture</description>
+</snippet>

File liquid/endfor.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% endfor %}]]></content>
+    <tabTrigger>endfor</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>endfor</description>
+</snippet>

File liquid/endif.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% endif %}]]></content>
+    <tabTrigger>endif</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>endif</description>
+</snippet>

File liquid/endraw.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% endraw %}]]></content>
+    <tabTrigger>endraw</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>endraw</description>
+</snippet>

File liquid/for.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[
+{% for $1 in $2 %}
+	$3
+{% endfor %}
+]]>	</content>
+    <tabTrigger>for</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>for</description>
+</snippet>

File liquid/if.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[
+{% if $1 %}
+	$2
+{% endif %}
+]]>	</content>
+    <tabTrigger>if</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>if</description>
+</snippet>

File liquid/ife.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[
+{% if $1 %}
+	$2
+{% else %}
+	$3
+{% endif %}
+]]>	</content>
+    <tabTrigger>ife</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>if... else...</description>
+</snippet>

File liquid/ifelse.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[
+{% if $1 %}
+	$2
+{% else %}
+	$3
+{% endif %}
+]]>	</content>
+    <tabTrigger>ifelse</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>if... else...</description>
+</snippet>

File liquid/inc.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+	<content><![CDATA[{% include $1${2: with: $3} %}]]></content>
+    <tabTrigger>inc</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>include (inc)</description>
+</snippet>

File liquid/include.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[{% include $1${2: with $3} %}]]></content>
+    <tabTrigger>include</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>include</description>
+</snippet>

File liquid/unless.sublime-snippet

+<!-- See http://www.sublimetext.com/docs/snippets for more information -->
+<snippet>
+    <content><![CDATA[
+{% unless $1 %}${2:
+    }$3${2:
+}{% endunless %}
+]]> </content>
+    <tabTrigger>unless</tabTrigger>
+    <scope>text.html.liquid</scope>
+    <description>unless</description>
+</snippet>

File package-metadata.json

+{
+    "url": "https://bitbucket.org/granteagon/shopify-liquid",
+    "version": "2012.05.08.07.14.00",
+    "description": "Shopify Liquid support for Sublime Text 2"
+}