Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions demo/kitchen-sink/docs/jinja.jinja
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
TODO add a nice demo!
Try to keep it short!
1 change: 1 addition & 0 deletions src/ext/modelist.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ var supportedModes = {
Java: ["java"],
JavaScript: ["js|jsm|cjs|mjs"],
JEXL: ["jexl"],
jinja: [""],
JSON: ["json"],
JSON5: ["json5"],
JSONiq: ["jq"],
Expand Down
62 changes: 62 additions & 0 deletions src/mode/jinja.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2012, Ajax.org B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Ajax.org B.V. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */

/*
THIS FILE WAS AUTOGENERATED BY mode.tmpl.js
*/

"use strict";

var oop = require("../lib/oop");
var TextMode = require("./text").Mode;

var JinjaCompletions = require("./jinja_completions").JinjaCompletions;
var JinjaHighlightRules = require("./jinja_highlight_rules").JinjaHighlightRules;
// TODO: pick appropriate fold mode
var FoldMode = require("./folding/cstyle").FoldMode;

var Mode = function() {
this.$completer = new JinjaCompletions();
this.HighlightRules = JinjaHighlightRules;
this.foldingRules = new FoldMode();
};
oop.inherits(Mode, TextMode);

(function() {
// this.lineCommentStart = ""{#-?"";
// this.blockComment = {start: ""/*"", end: ""*/""};
// Extra logic goes here.
this.getCompletions = function(state, session, pos, prefix) {
return this.$completer.getCompletions(this.$highlightRules.$keywordList, state, session, pos, prefix);
};
this.$id = "ace/mode/jinja";
}).call(Mode.prototype);

exports.Mode = Mode;
89 changes: 89 additions & 0 deletions src/mode/jinja_completions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@

"use strict";

var TokenIterator = require("../token_iterator").TokenIterator;

var jinjaFilters = [
"abs", "float", "lower", "round", "tojson", "attr",
"forceescape", "map", "safe", "trim", "batch", "format",
"max", "select", "truncate", "capitalize", "groupby", "min",
"selectattr", "unique", "center", "indent", "pprint", "slice",
"upper", "default", "int", "random", "sort", "urlencode",
"dictsort", "join", "reject", "string", "urlize", "escape",
"last", "rejectattr", "striptags", "wordcount", "filesizeformat",
"length", "replace", "sum", "wordwrap", "first", "list", "reverse",
"title", "xmlattr"
];

var JinjaCompletions = function() {

};

(function() {

this.getCompletions = function(keywordList, state, session, pos, prefix) {
var token = session.getTokenAt(pos.row, pos.column);

if (!token)
return [];

if (this.mayBeJinjaKeyword(token)) {
return this.getKeywordCompletions(keywordList, state, session, pos, prefix);
}

if (this.mayBeJinjaFilter(token)) {
return this.getFilterCompletions(state, session, pos, prefix);
}

if (this.mayBeJinjaVariable(token)) {
return this.getVariableCompletions(state, session, pos, prefix);
}
Comment on lines +38 to +40

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note to self: remove. Or better, still: detect variables of for loops or set directives.

But how?


return [];
};

this.mayBeJinjaKeyword = function(token) {
return token.type === "meta.scope.jinja.tag";
};

this.mayBeJinjaFilter = function(token) {
return token.type === "support.function.other.jinja.filter";
};

this.mayBeJinjaVariable = function(token) {
return token.type === "variable";
};

this.getKeywordCompletions = function(keywordList, state, session, pos, prefix) {
return keywordList.map(function(keyword) {
return {
caption: keyword,
snippet: keyword,
meta: "keyword",
score: 1000000
};
});
};

this.getFilterCompletions = function(state, session, pos, prefix) {
return jinjaFilters.map(function(filter) {
return {
caption: filter,
snippet: filter,
meta: "filter",
score: 1000000
};
});
};

this.getVariableCompletions = function(state, session, pos, prefix) {
// This is a placeholder. In a real implementation, you'd need to
// analyze the context to suggest relevant variables.
return [
{ caption: "loop", snippet: "loop", meta: "Nunjucks loop object", score: 1000000 },
{ caption: "super", snippet: "super()", meta: "Nunjucks super function", score: 1000000 }
];
};
}).call(JinjaCompletions.prototype);

exports.JinjaCompletions = JinjaCompletions;
Loading