Repository: mozilla/nunjucks
Pull request #524 (2015-09-18 21:03:52)

Fix creating WebLoader without opts.
Fixes https://github.com/mozilla/nunjucks/issues/517.


Patch:
diff --git a/docs/Makefile b/docs/Makefile
index c3d8d0b..f73f279 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -1,8 +1,8 @@
 
 all:
-	jekyll serve --watch
+	LC_ALL="UTF-8" jekyll serve --watch
 
 prod:
 	cp ../browser/* files
 	rsync -avz ../tests/ files/tests
-	jekyll build --config _config.yml,_config-prod.yml
+	LC_ALL="UTF-8" jekyll build --config _config.yml,_config-prod.yml
diff --git a/docs/cn/api.md b/docs/cn/api.md
index 08734d0..685ef6a 100644
--- a/docs/cn/api.md
+++ b/docs/cn/api.md
@@ -48,16 +48,9 @@ nunjucks.configure([path], [opts]);
 
 传入 **path** 指定存放模板的目录，**opts** 可让某些功能开启或关闭，这两个变量都是可选的。**path** 的默认值为当前的工作目录，**opts** 提供以下功能：
 
-* **autoescape** *(默认值: true)* 控制输出是否被转义，查看 [Autoescaping](#autoescaping)
-* **throwOnUndefined** *(default: false)* 当输出为 null 或 undefined 会抛出异常
-* **trimBlocks** *(default: false)* 自动去除 block/tag 后面的换行符
-* **lstripBlocks** *(default: false)* 自动去除 block/tag 签名的空格
-* **watch** *(默认值: false)* 当模板变化时重新加载
-* **noCache** *(default: false)* 不使用缓存，每次都重新编译
-* **web** 浏览器模块的配置项
-  * **useCache** *(default: false)* 是否使用缓存，否则会重新请求下载模板
-  * **async** *(default: false)* 是否使用 ajax 异步下载模板
+* **watch** *(默认值: true)* 当模板变化时重新加载
 * **express** 传入 express 实例初始化模板设置
+* **autoescape** *(默认值: false)* 控制输出是否被转义，查看 [Autoescaping](#autoescaping)
 * **tags:** *(默认值: see nunjucks syntax)* 定义模板语法，查看 [Customizing Syntax](#customizing-syntax)
 
 `configure` 返回一个 `Environment` 实例, 他提供了简单的 api 添加过滤器 (filters) 和扩展 (extensions)，可在 `Environment` 查看更多的使用方法。
@@ -80,15 +73,6 @@ var env = nunjucks.configure('views');
 // do stuff with env
 ```
 
-{% endapi %}
-
-{% api %}
-installJinjaCompat
-nunjucks.installJinjaCompat()
-
-这个方法为了与 Jinja 更好的兼容，增加了一些适配 Python 的 API。但是 nunjucks 不是为了完全兼容 Jinja/Pyhton，这只为了帮助使用者查看。
-
-增加了 `True` 和 `False`，与 js 的 `true` 和 `false` 相对应。并增加 Array 和 Object 使之适配 Python 风格的。[查看源码](https://github.com/mozilla/nunjucks/blob/master/src/jinja-compat.js)能看到所有功能。
 {% endapi %}
 {% raw %}
 
@@ -107,7 +91,7 @@ new Environment([loaders], [opts])
 
 实例化 `Environment` 时传入两个参数，一组 **loaders** 和配置项 **opts**。如果 **loaders** 不存在，则默认从当前目录或地址加载。**loaders** 可为一个或多个，如果传入一个数组，nunjucks 会按顺序查找直到找到模板。更多查看 [`Loader`](#loader)
 
-**opts** 的配置有 **autoescape**、**throwOnUndefined**、**trimBlocks** 和 **lstripBlocks**，在 [`configure`](#configure) 查看具体配置（express 和 watch 配置在这里不适用，而是在 [`env.express`](#express) 进行配置）。
+**opts** 的配置有 **autoescape** and **tags**，在 [`configure`](#configure) 查看具体配置（express 和 watch 配置在这里不适用，而是在 [`env.express`](#express) 进行配置）。
 
 在 node 端使用 [`FileSystemLoader`](#filesystemloader) 加载模板，浏览器端则使用 [`WebLoader`](#webloader) 通过 http 加载（或使用编译后的模板）。如果你使用了 [`configure`](#configure) 的 api，nunjucks 会根据平台（node 或浏览器）自动选择对应的 loader。查看更多 [`Loader`](#loader)。
 
@@ -180,14 +164,6 @@ env.addExtension(name, ext)
 
 {% endapi %}
 
-{% api %}
-removeExtension
-env.removeExtension(name)
-
-删除之前添加的扩展 **name**。
-
-{% endapi %}
-
 {% api %}
 getExtension
 env.getExtension(name)
@@ -196,13 +172,6 @@ env.getExtension(name)
 
 {% endapi %}
 
-{% api %}
-hasExtension
-env.hasExtension(name)
-
-如果 **name** 扩展已经被添加，那返回 true。
-{% endapi %}
-
 {% api %}
 addGlobal
 env.addGlobal(name, value)
@@ -210,13 +179,6 @@ env.addGlobal(name, value)
 添加一个全局变量，可以在所有模板使用。注意：这个会覆盖已有的 `name` 变量。
 {% endapi %}
 
-{% api %}
-getGlobal
-env.getGlobal(name)
-
-返回一个名为 **name** 的全局变量。
-{% endapi %}
-
 {% api %}
 getTemplate
 env.getTemplate(name, [eagerCompile], [callback])
@@ -248,14 +210,6 @@ app.get('/', function(req, res) {
 });
 ```
 {% endapi %}
-
-{% api %}
-opts.autoescape
-env.opts.autoescape
-
-你可以通过这个配置控制是否全局开启模板转义，这对于创建高级过滤（如 html 操作）非常有用。
-正常情况你可以返回 SafeString，输出保持和输入一致不做任何处理，但这只在很少场景下有用。
-{% endapi %}
 {% raw %}
 
 ## Template
@@ -299,14 +253,9 @@ loaders exist, each for different contexts.
 {% endraw %}
 {% api %}
 FileSystemLoader
-new FileSystemLoader([searchPaths], [opt])
-
-只在 node 端可用，他可从文件系统中加载模板，**searchPaths** 为查找模板的路径，可以是一个也可以是多个，默认为当前的工作目录。
-
-**opt** 为一个对象，包含如下属性：
+new FileSystemLoader([searchPaths], [noWatch])
 
-* **watch** - 如果为 `true`，当文件系统上的模板变化了，系统会自动更新他。
-* **noCache** - 如果为 `true`，不使用缓存，模板每次都会重新编译。
+只在 node 端可用，他可从文件系统中加载模板，**searchPaths** 为查找模板的路径，可以是一个也可以是多个，默认为当前的工作目录。如果 **noWatch** 为 `true`，模板会永久缓存，否则使用 `fs.watch` 来监听文件的变化。
 
 ```js
 // Loads templates from the "views" folder
@@ -317,17 +266,9 @@ var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));
 
 {% api %}
 WebLoader
-new WebLoader([baseURL], [opts])
-
-只在浏览器端可用，通过 **baseURL**（必须为同域）加载模板，默认为当前相对目录。
-
-**opt** 为一个对象，包含如下属性：
-
-* **useCache** 如果为 `true`，模板将会永远缓存，你将看不到他们更新。缓存默认关闭，因为这样就无法监听变化并更新缓存。
-    记住，你应该在生产环境预编译模板。
-* **async** 如果为 `true`，模板会异步请求，而非同步，同时你必须使用异步 render API（调用 `render` 时传入一个 callback）。
+new WebLoader([baseURL], [neverUpdate])
 
-如果 **neverUpdate** 为 `true`，模板只会加载一次，以后不会变化，默认每次渲染的时候都会加载。
+只在浏览器端可用，通过 **baseURL**（必须为同域）加载模板，默认为当前相对目录。如果 **neverUpdate** 为 `true`，模板只会加载一次，以后不会变化，默认每次渲染的时候都会加载。
 
 他还能加载预编译后的模板，自动使用这些模板而不是通过 http 获取，在生产环境应该使用预编译。查看 [Precompiling Templates](#precompiling-templates)。
 
diff --git a/docs/cn/faq.md b/docs/cn/faq.md
index 6517c14..21d1603 100644
--- a/docs/cn/faq.md
+++ b/docs/cn/faq.md
@@ -17,14 +17,13 @@ pageid: faq
 
 首先，nunjucks 可以操作原生的 Javascript 而 [jinja2](http://jinja.pocoo.org/) 操作的是 python，比如在 nunjucks 中布尔值为 `true` 而 jinja2 为 `True`，在调用数组原生方法的时候也不同。
 
-但是，如果你避免使用原生语言的特性（如 `{{ str.trim() }}`） 而完全使用模板的特性和过滤器，那么两者的模块可以兼容。
-
-Nunjucks 支持与 Jinja 兼容，查看 [installJinjaCompat](/api.html#installjinjacompat) 获取更多信息。
+但是，如果你避免使用原生语言的特性（如 `{{ str.trim() }}`） 而完全使用模板的特性和过滤器，那么两者的模块可以兼容。在 [Firefox Marketplace](https://marketplace.firefox.com/) 中，开发者开发了一个兼容层来覆盖 nunjucks 的一些内部实现，能更好的兼容 jinja2（如可使用 `True`），可查看[源码](https://github.com/mozilla/fireplace/blob/master/hearth/media/js/lib/nunjucks.compat.js).
 
 除此之外，nunjucks 还有一些未实现的功能：
 
 * `self` 变量
 * `for` 不支持 `if not` and `else`
+* 不存在 `with context`
 * `if i is divisibleby(3)` 式的条件判断
 * 可命名的结束区块： `{% endblock content %}`
 * 沙箱模式 (Sandboxed mode)
diff --git a/docs/files/.keep b/docs/files/.keep
deleted file mode 100644
index e69de29..0000000
diff --git a/src/web-loaders.js b/src/web-loaders.js
index 8c09e95..53af252 100644
--- a/src/web-loaders.js
+++ b/src/web-loaders.js
@@ -6,19 +6,20 @@ var PrecompiledLoader = require('./precompiled-loader.js');
 var WebLoader = Loader.extend({
     init: function(baseURL, opts) {
         this.baseURL = baseURL || '.';
+        opts = opts || {};
 
         // By default, the cache is turned off because there's no way
         // to "watch" templates over HTTP, so they are re-downloaded
         // and compiled each time. (Remember, PRECOMPILE YOUR
         // TEMPLATES in production!)
-        this.useCache = opts.useCache;
+        this.useCache = !!opts.useCache;
 
         // We default `async` to false so that the simple synchronous
         // API can be used when you aren't doing anything async in
         // your templates (which is most of the time). This performs a
         // sync ajax request, but that's ok because it should *only*
         // happen in development. PRECOMPILE YOUR TEMPLATES.
-        this.async = opts.async;
+        this.async = !!opts.async;
     },
 
     resolve: function(from, to) { // jshint ignore:line


Test patch:
diff --git a/tests/loader.js b/tests/loader.js
index ea2ac54..e492f26 100644
--- a/tests/loader.js
+++ b/tests/loader.js
@@ -1,21 +1,34 @@
 (function() {
     'use strict';
 
-    var expect, Environment, Loader, templatesPath;
+    var expect, Environment, WebLoader, FileSystemLoader, templatesPath;
 
     if(typeof require !== 'undefined') {
         expect = require('expect.js');
         Environment = require('../src/environment').Environment;
+        WebLoader = require('../src/web-loaders').WebLoader;
+        FileSystemLoader = require('../src/node-loaders').FileSystemLoader;
         templatesPath = 'tests/templates';
     }
     else {
         expect = window.expect;
         Environment = nunjucks.Environment;
-        Loader = nunjucks.WebLoader;
+        WebLoader = nunjucks.WebLoader;
+        FileSystemLoader = nunjucks.FileSystemLoader;
         templatesPath = '../templates';
     }
 
     describe('loader', function() {
+        it('should have default opts', function() {
+            var webLoader = new WebLoader(templatesPath);
+            var fileSystemLoader = new FileSystemLoader(templatesPath);
+            expect(webLoader).to.be.a(WebLoader);
+            expect(webLoader.useCache).to.be(false);
+            expect(webLoader.async).to.be(false);
+            expect(fileSystemLoader).to.be.a(FileSystemLoader);
+            expect(fileSystemLoader.noCache).to.be(false);
+        });
+
         it('should allow a simple loader to be created', function() {
             // From Docs: http://mozilla.github.io/nunjucks/api.html#writing-a-loader
             // We should be able to create a loader that only exposes getSource