summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/smarty
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xpublic/vendor/codemirror/mode/smarty/index.html138
-rwxr-xr-xpublic/vendor/codemirror/mode/smarty/smarty.js225
2 files changed, 363 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/smarty/index.html b/public/vendor/codemirror/mode/smarty/index.html
new file mode 100755
index 00000000..b19c8f09
--- /dev/null
+++ b/public/vendor/codemirror/mode/smarty/index.html
@@ -0,0 +1,138 @@
+<!doctype html>
+
+<title>CodeMirror: Smarty mode</title>
+<meta charset="utf-8"/>
+<link rel=stylesheet href="../../doc/docs.css">
+
+<link rel="stylesheet" href="../../lib/codemirror.css">
+<script src="../../lib/codemirror.js"></script>
+<script src="../xml/xml.js"></script>
+<script src="smarty.js"></script>
+<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+<div id=nav>
+ <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
+
+ <ul>
+ <li><a href="../../index.html">Home</a>
+ <li><a href="../../doc/manual.html">Manual</a>
+ <li><a href="https://github.com/codemirror/codemirror">Code</a>
+ </ul>
+ <ul>
+ <li><a href="../index.html">Language modes</a>
+ <li><a class=active href="#">Smarty</a>
+ </ul>
+</div>
+
+<article>
+<h2>Smarty mode</h2>
+<form><textarea id="code" name="code">
+{extends file="parent.tpl"}
+{include file="template.tpl"}
+
+{* some example Smarty content *}
+{if isset($name) && $name == 'Blog'}
+ This is a {$var}.
+ {$integer = 451}, {$array[] = "a"}, {$stringvar = "string"}
+ {assign var='bob' value=$var.prop}
+{elseif $name == $foo}
+ {function name=menu level=0}
+ {foreach $data as $entry}
+ {if is_array($entry)}
+ - {$entry@key}
+ {menu data=$entry level=$level+1}
+ {else}
+ {$entry}
+ {/if}
+ {/foreach}
+ {/function}
+{/if}</textarea></form>
+
+<p>Mode for Smarty version 2 or 3, which allows for custom delimiter tags.</p>
+
+<p>Several configuration parameters are supported:</p>
+
+<ul>
+ <li><code>leftDelimiter</code> and <code>rightDelimiter</code>,
+ which should be strings that determine where the Smarty syntax
+ starts and ends.</li>
+ <li><code>version</code>, which should be 2 or 3.</li>
+ <li><code>baseMode</code>, which can be a mode spec
+ like <code>"text/html"</code> to set a different background mode.</li>
+</ul>
+
+<p><strong>MIME types defined:</strong> <code>text/x-smarty</code></p>
+
+<h3>Smarty 2, custom delimiters</h3>
+
+<form><textarea id="code2" name="code2">
+{--extends file="parent.tpl"--}
+{--include file="template.tpl"--}
+
+{--* some example Smarty content *--}
+{--if isset($name) && $name == 'Blog'--}
+ This is a {--$var--}.
+ {--$integer = 451--}, {--$array[] = "a"--}, {--$stringvar = "string"--}
+ {--assign var='bob' value=$var.prop--}
+{--elseif $name == $foo--}
+ {--function name=menu level=0--}
+ {--foreach $data as $entry--}
+ {--if is_array($entry)--}
+ - {--$entry@key--}
+ {--menu data=$entry level=$level+1--}
+ {--else--}
+ {--$entry--}
+ {--/if--}
+ {--/foreach--}
+ {--/function--}
+{--/if--}</textarea></form>
+
+<h3>Smarty 3</h3>
+
+<textarea id="code3" name="code3">
+Nested tags {$foo={counter one=1 two={inception}}+3} are now valid in Smarty 3.
+
+<script>
+function test() {
+ console.log("Smarty 3 permits single curly braces followed by whitespace to NOT slip into Smarty mode.");
+}
+</script>
+
+{assign var=foo value=[1,2,3]}
+{assign var=foo value=['y'=>'yellow','b'=>'blue']}
+{assign var=foo value=[1,[9,8],3]}
+
+{$foo=$bar+2} {* a comment *}
+{$foo.bar=1} {* another comment *}
+{$foo = myfunct(($x+$y)*3)}
+{$foo = strlen($bar)}
+{$foo.bar.baz=1}, {$foo[]=1}
+
+Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
+
+{$foo.a.b.c} => $foo['a']['b']['c']
+{$foo.a.$b.c} => $foo['a'][$b]['c']
+{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c']
+{$foo.a.{$b.c}} => $foo['a'][$b['c']]
+
+{$object->method1($x)->method2($y)}</textarea>
+
+<script>
+var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+ lineNumbers: true,
+ mode: "smarty"
+});
+var editor = CodeMirror.fromTextArea(document.getElementById("code2"), {
+ lineNumbers: true,
+ mode: {
+ name: "smarty",
+ leftDelimiter: "{--",
+ rightDelimiter: "--}"
+ }
+});
+var editor = CodeMirror.fromTextArea(document.getElementById("code3"), {
+ lineNumbers: true,
+ mode: {name: "smarty", version: 3, baseMode: "text/html"}
+});
+</script>
+
+</article>
diff --git a/public/vendor/codemirror/mode/smarty/smarty.js b/public/vendor/codemirror/mode/smarty/smarty.js
new file mode 100755
index 00000000..6e0fbed4
--- /dev/null
+++ b/public/vendor/codemirror/mode/smarty/smarty.js
@@ -0,0 +1,225 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+/**
+ * Smarty 2 and 3 mode.
+ */
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+ "use strict";
+
+ CodeMirror.defineMode("smarty", function(config, parserConf) {
+ var rightDelimiter = parserConf.rightDelimiter || "}";
+ var leftDelimiter = parserConf.leftDelimiter || "{";
+ var version = parserConf.version || 2;
+ var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null");
+
+ var keyFunctions = ["debug", "extends", "function", "include", "literal"];
+ var regs = {
+ operatorChars: /[+\-*&%=<>!?]/,
+ validIdentifier: /[a-zA-Z0-9_]/,
+ stringChar: /['"]/
+ };
+
+ var last;
+ function cont(style, lastType) {
+ last = lastType;
+ return style;
+ }
+
+ function chain(stream, state, parser) {
+ state.tokenize = parser;
+ return parser(stream, state);
+ }
+
+ // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode
+ function doesNotCount(stream, pos) {
+ if (pos == null) pos = stream.pos;
+ return version === 3 && leftDelimiter == "{" &&
+ (pos == stream.string.length || /\s/.test(stream.string.charAt(pos)));
+ }
+
+ function tokenTop(stream, state) {
+ var string = stream.string;
+ for (var scan = stream.pos;;) {
+ var nextMatch = string.indexOf(leftDelimiter, scan);
+ scan = nextMatch + leftDelimiter.length;
+ if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break;
+ }
+ if (nextMatch == stream.pos) {
+ stream.match(leftDelimiter);
+ if (stream.eat("*")) {
+ return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter));
+ } else {
+ state.depth++;
+ state.tokenize = tokenSmarty;
+ last = "startTag";
+ return "tag";
+ }
+ }
+
+ if (nextMatch > -1) stream.string = string.slice(0, nextMatch);
+ var token = baseMode.token(stream, state.base);
+ if (nextMatch > -1) stream.string = string;
+ return token;
+ }
+
+ // parsing Smarty content
+ function tokenSmarty(stream, state) {
+ if (stream.match(rightDelimiter, true)) {
+ if (version === 3) {
+ state.depth--;
+ if (state.depth <= 0) {
+ state.tokenize = tokenTop;
+ }
+ } else {
+ state.tokenize = tokenTop;
+ }
+ return cont("tag", null);
+ }
+
+ if (stream.match(leftDelimiter, true)) {
+ state.depth++;
+ return cont("tag", "startTag");
+ }
+
+ var ch = stream.next();
+ if (ch == "$") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("variable-2", "variable");
+ } else if (ch == "|") {
+ return cont("operator", "pipe");
+ } else if (ch == ".") {
+ return cont("operator", "property");
+ } else if (regs.stringChar.test(ch)) {
+ state.tokenize = tokenAttribute(ch);
+ return cont("string", "string");
+ } else if (regs.operatorChars.test(ch)) {
+ stream.eatWhile(regs.operatorChars);
+ return cont("operator", "operator");
+ } else if (ch == "[" || ch == "]") {
+ return cont("bracket", "bracket");
+ } else if (ch == "(" || ch == ")") {
+ return cont("bracket", "operator");
+ } else if (/\d/.test(ch)) {
+ stream.eatWhile(/\d/);
+ return cont("number", "number");
+ } else {
+
+ if (state.last == "variable") {
+ if (ch == "@") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("property", "property");
+ } else if (ch == "|") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("qualifier", "modifier");
+ }
+ } else if (state.last == "pipe") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("qualifier", "modifier");
+ } else if (state.last == "whitespace") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("attribute", "modifier");
+ } if (state.last == "property") {
+ stream.eatWhile(regs.validIdentifier);
+ return cont("property", null);
+ } else if (/\s/.test(ch)) {
+ last = "whitespace";
+ return null;
+ }
+
+ var str = "";
+ if (ch != "/") {
+ str += ch;
+ }
+ var c = null;
+ while (c = stream.eat(regs.validIdentifier)) {
+ str += c;
+ }
+ for (var i=0, j=keyFunctions.length; i<j; i++) {
+ if (keyFunctions[i] == str) {
+ return cont("keyword", "keyword");
+ }
+ }
+ if (/\s/.test(ch)) {
+ return null;
+ }
+ return cont("tag", "tag");
+ }
+ }
+
+ function tokenAttribute(quote) {
+ return function(stream, state) {
+ var prevChar = null;
+ var currChar = null;
+ while (!stream.eol()) {
+ currChar = stream.peek();
+ if (stream.next() == quote && prevChar !== '\\') {
+ state.tokenize = tokenSmarty;
+ break;
+ }
+ prevChar = currChar;
+ }
+ return "string";
+ };
+ }
+
+ function tokenBlock(style, terminator) {
+ return function(stream, state) {
+ while (!stream.eol()) {
+ if (stream.match(terminator)) {
+ state.tokenize = tokenTop;
+ break;
+ }
+ stream.next();
+ }
+ return style;
+ };
+ }
+
+ return {
+ startState: function() {
+ return {
+ base: CodeMirror.startState(baseMode),
+ tokenize: tokenTop,
+ last: null,
+ depth: 0
+ };
+ },
+ copyState: function(state) {
+ return {
+ base: CodeMirror.copyState(baseMode, state.base),
+ tokenize: state.tokenize,
+ last: state.last,
+ depth: state.depth
+ };
+ },
+ innerMode: function(state) {
+ if (state.tokenize == tokenTop)
+ return {mode: baseMode, state: state.base};
+ },
+ token: function(stream, state) {
+ var style = state.tokenize(stream, state);
+ state.last = last;
+ return style;
+ },
+ indent: function(state, text) {
+ if (state.tokenize == tokenTop && baseMode.indent)
+ return baseMode.indent(state.base, text);
+ else
+ return CodeMirror.Pass;
+ },
+ blockCommentStart: leftDelimiter + "*",
+ blockCommentEnd: "*" + rightDelimiter
+ };
+ });
+
+ CodeMirror.defineMIME("text/x-smarty", "smarty");
+});