Showing preview only (2,605K chars total). Download the full file or copy to clipboard to get everything.
Repository: mozilla/nunjucks
Branch: master
Commit: 2025c933fba3
Files: 301
Total size: 2.4 MB
Directory structure:
gitextract_d6mkhpa4/
├── .babelrc
├── .gitattributes
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── tests.yml
├── .gitignore
├── .npmignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTENANCE.md
├── README.md
├── bench/
│ ├── case.html
│ ├── index.html
│ ├── jinja/
│ │ ├── index.html
│ │ └── jinja.py
│ └── run.js
├── bin/
│ ├── precompile
│ └── precompile.cmd
├── bower.json
├── codecov.yml
├── contribute.json
├── docs/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── _config-prod.yml
│ ├── _config.yml
│ ├── _layouts/
│ │ ├── page.html
│ │ └── subpage.html
│ ├── _plugins/
│ │ ├── api.rb
│ │ ├── cleanup.rb
│ │ ├── locale.rb
│ │ └── page_toc.rb
│ ├── api.md
│ ├── bower_components/
│ │ ├── bootstrap/
│ │ │ ├── .bower.json
│ │ │ ├── CNAME
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── Gruntfile.js
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── _config.yml
│ │ │ ├── _includes/
│ │ │ │ ├── ads.html
│ │ │ │ ├── footer.html
│ │ │ │ ├── header.html
│ │ │ │ ├── nav-components.html
│ │ │ │ ├── nav-css.html
│ │ │ │ ├── nav-customize.html
│ │ │ │ ├── nav-getting-started.html
│ │ │ │ ├── nav-javascript.html
│ │ │ │ ├── nav-main.html
│ │ │ │ ├── old-bs-docs.html
│ │ │ │ └── social-buttons.html
│ │ │ ├── _layouts/
│ │ │ │ ├── default.html
│ │ │ │ └── home.html
│ │ │ ├── assets/
│ │ │ │ ├── css/
│ │ │ │ │ ├── docs.css
│ │ │ │ │ └── pygments-manni.css
│ │ │ │ └── js/
│ │ │ │ ├── application.js
│ │ │ │ ├── customizer.js
│ │ │ │ ├── filesaver.js
│ │ │ │ ├── holder.js
│ │ │ │ ├── html5shiv.js
│ │ │ │ ├── jquery.js
│ │ │ │ ├── jszip.js
│ │ │ │ ├── less.js
│ │ │ │ ├── raw-files.js
│ │ │ │ └── uglify.js
│ │ │ ├── bower.json
│ │ │ ├── browserstack.json
│ │ │ ├── composer.json
│ │ │ ├── dist/
│ │ │ │ ├── css/
│ │ │ │ │ ├── bootstrap-theme.css
│ │ │ │ │ └── bootstrap.css
│ │ │ │ └── js/
│ │ │ │ └── bootstrap.js
│ │ │ ├── examples/
│ │ │ │ ├── carousel/
│ │ │ │ │ ├── carousel.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── grid/
│ │ │ │ │ ├── grid.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── jumbotron/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── jumbotron.css
│ │ │ │ ├── jumbotron-narrow/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── jumbotron-narrow.css
│ │ │ │ ├── justified-nav/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── justified-nav.css
│ │ │ │ ├── navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar.css
│ │ │ │ ├── navbar-fixed-top/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar-fixed-top.css
│ │ │ │ ├── navbar-static-top/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar-static-top.css
│ │ │ │ ├── non-responsive/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── non-responsive.css
│ │ │ │ ├── offcanvas/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── offcanvas.css
│ │ │ │ │ └── offcanvas.js
│ │ │ │ ├── signin/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── signin.css
│ │ │ │ ├── starter-template/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── starter-template.css
│ │ │ │ ├── sticky-footer/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer.css
│ │ │ │ ├── sticky-footer-navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer-navbar.css
│ │ │ │ └── theme/
│ │ │ │ ├── index.html
│ │ │ │ └── theme.css
│ │ │ ├── js/
│ │ │ │ ├── .jshintrc
│ │ │ │ ├── affix.js
│ │ │ │ ├── alert.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── tests/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── phantom.js
│ │ │ │ │ ├── server.js
│ │ │ │ │ ├── unit/
│ │ │ │ │ │ ├── affix.js
│ │ │ │ │ │ ├── alert.js
│ │ │ │ │ │ ├── button.js
│ │ │ │ │ │ ├── carousel.js
│ │ │ │ │ │ ├── collapse.js
│ │ │ │ │ │ ├── dropdown.js
│ │ │ │ │ │ ├── modal.js
│ │ │ │ │ │ ├── phantom.js
│ │ │ │ │ │ ├── popover.js
│ │ │ │ │ │ ├── scrollspy.js
│ │ │ │ │ │ ├── tab.js
│ │ │ │ │ │ ├── tooltip.js
│ │ │ │ │ │ └── transition.js
│ │ │ │ │ └── vendor/
│ │ │ │ │ ├── jquery.js
│ │ │ │ │ ├── qunit.css
│ │ │ │ │ └── qunit.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── transition.js
│ │ │ ├── less/
│ │ │ │ ├── alerts.less
│ │ │ │ ├── badges.less
│ │ │ │ ├── bootstrap.less
│ │ │ │ ├── breadcrumbs.less
│ │ │ │ ├── button-groups.less
│ │ │ │ ├── buttons.less
│ │ │ │ ├── carousel.less
│ │ │ │ ├── close.less
│ │ │ │ ├── code.less
│ │ │ │ ├── component-animations.less
│ │ │ │ ├── dropdowns.less
│ │ │ │ ├── forms.less
│ │ │ │ ├── glyphicons.less
│ │ │ │ ├── grid.less
│ │ │ │ ├── input-groups.less
│ │ │ │ ├── jumbotron.less
│ │ │ │ ├── labels.less
│ │ │ │ ├── list-group.less
│ │ │ │ ├── media.less
│ │ │ │ ├── mixins.less
│ │ │ │ ├── modals.less
│ │ │ │ ├── navbar.less
│ │ │ │ ├── navs.less
│ │ │ │ ├── normalize.less
│ │ │ │ ├── pager.less
│ │ │ │ ├── pagination.less
│ │ │ │ ├── panels.less
│ │ │ │ ├── popovers.less
│ │ │ │ ├── print.less
│ │ │ │ ├── progress-bars.less
│ │ │ │ ├── responsive-utilities.less
│ │ │ │ ├── scaffolding.less
│ │ │ │ ├── tables.less
│ │ │ │ ├── theme.less
│ │ │ │ ├── thumbnails.less
│ │ │ │ ├── tooltip.less
│ │ │ │ ├── type.less
│ │ │ │ ├── utilities.less
│ │ │ │ ├── variables.less
│ │ │ │ └── wells.less
│ │ │ └── package.json
│ │ └── jquery/
│ │ ├── .bower.json
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── bower.json
│ │ ├── component.json
│ │ ├── composer.json
│ │ ├── jquery-migrate.js
│ │ ├── jquery.js
│ │ └── package.json
│ ├── cn/
│ │ ├── api.md
│ │ ├── faq.md
│ │ ├── getting-started.md
│ │ └── templating.md
│ ├── css/
│ │ ├── app.css
│ │ └── highlight.css
│ ├── faq.md
│ ├── fr/
│ │ ├── api.md
│ │ ├── faq.md
│ │ ├── getting-started.md
│ │ └── templating.md
│ ├── getting-started.md
│ ├── index.html
│ ├── js/
│ │ ├── app.js
│ │ └── subpage.js
│ └── templating.md
├── eslint.config.js
├── nunjucks/
│ ├── index.js
│ └── src/
│ ├── compiler.js
│ ├── environment.js
│ ├── express-app.js
│ ├── filters.js
│ ├── globals.js
│ ├── jinja-compat.js
│ ├── lexer.js
│ ├── lib.js
│ ├── loader.js
│ ├── loaders.js
│ ├── node-loaders.js
│ ├── nodes.js
│ ├── object.js
│ ├── parser.js
│ ├── precompile-global.js
│ ├── precompile.js
│ ├── precompiled-loader.js
│ ├── runtime.js
│ ├── tests.js
│ ├── transformer.js
│ └── web-loaders.js
├── package.json
├── samples/
│ └── express/
│ ├── js/
│ │ ├── app.js
│ │ └── extensions.js
│ ├── main.js
│ ├── pre.js
│ └── views/
│ ├── about.html
│ ├── base.html
│ ├── import-context-set.html
│ ├── index.html
│ ├── item-base.html
│ ├── item.html
│ └── set.html
├── scripts/
│ ├── bundle.js
│ ├── lib/
│ │ ├── is-main-module.js
│ │ ├── mocha-phantomjs.js
│ │ ├── precompile.js
│ │ ├── runtests.js
│ │ ├── static-server.js
│ │ └── utils.js
│ └── testrunner.js
└── tests/
├── api.js
├── browser/
│ ├── index.html
│ └── slim.html
├── cli.js
├── compiler.js
├── core.js
├── eslint.config.js
├── express.js
├── filters.js
├── globals.js
├── jinja-compat.js
├── lexer.js
├── loader.js
├── parser.js
├── precompile.js
├── runtime.js
├── setup.js
├── templates/
│ ├── async.njk
│ ├── base-inherit.njk
│ ├── base-set-and-show.njk
│ ├── base-set-inside-block.njk
│ ├── base-set-wraps-block.njk
│ ├── base-set.njk
│ ├── base-show.njk
│ ├── base.njk
│ ├── base2.njk
│ ├── base3.njk
│ ├── broken-conditional-include.njk
│ ├── broken-import.njk
│ ├── filter-block.html
│ ├── for-async-content.njk
│ ├── import-context-set.njk
│ ├── import-context.njk
│ ├── import-macro-call-undefined-macro.njk
│ ├── import.njk
│ ├── include-in-loop.njk
│ ├── include-set.njk
│ ├── include.njk
│ ├── includeMany.njk
│ ├── item.njk
│ ├── macro-call-undefined-macro.njk
│ ├── relative/
│ │ ├── dir1/
│ │ │ ├── index.njk
│ │ │ └── macros.njk
│ │ ├── dir2/
│ │ │ ├── index.njk
│ │ │ └── macros.njk
│ │ ├── test-cache.njk
│ │ ├── test1.njk
│ │ └── test2.njk
│ ├── set.njk
│ ├── simple-base.njk
│ ├── throws.njk
│ └── undefined-macro.njk
├── test-node-pkgs/
│ └── dummy-pkg/
│ ├── index.js
│ ├── package.json
│ └── simple-template.html
├── tests.js
└── util.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": [
["@babel/env", {
"loose": true,
"targets": {
"browsers": ["last 2 versions", "safari >= 7", "ie 9"],
"node": "6"
}
}]
],
"env": {
"test": {
"plugins": ["istanbul"]
}
},
"ignore": [
"scripts/lib/arrow-function-coverage-fix.js"
]
}
================================================
FILE: .gitattributes
================================================
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Checkout example and test fixtures with linux line ending
# to guarantee test successes
tests/** text eol=lf
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Summary
Proposed change:
<!--
Please replace this with a human-friendly description of your proposed change.
* If you have multiple changes, try to split them into separate PRs.
* If this change closes an issue, please write "Closes #{number}".
-->
Closes # .
## Checklist
I've completed the checklist below to ensure I didn't forget anything. This makes reviewing this PR as easy as possible for the maintainers. And it gets this change released as soon as possible.
* [ ] Proposed change helps towards [*purpose of this project*](https://github.com/mozilla/nunjucks/blob/master/CONTRIBUTING.md#purpose).
* [ ] [*Documentation*](https://github.com/mozilla/nunjucks/tree/master/docs/) is added / updated to describe proposed change.
* [ ] [*Tests*](https://github.com/mozilla/nunjucks/tree/master/tests) are added / updated to cover proposed change.
* [ ] [*Changelog*](https://github.com/mozilla/nunjucks/blob/master/CHANGELOG.md) has an entry for proposed change (if user-facing fix or feature).
<!-- Tick of items by replacing `[ ]` by `[x]` -->
================================================
FILE: .github/workflows/tests.yml
================================================
name: Tests
on:
push:
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
tests:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- node: 16
os: windows-2022
- node: 16
os: windows-2025
- node: 18
os: ubuntu-22.04
- node: 18.20.1 # TODO: spawn node18+/win: github.com/nodejs/nodejs.org/pull/6660
os: windows-2022
- node: 20
os: macos-14
- node: 20
os: ubuntu-latest
- node: 20.12.1 # TODO: spawn node18+/win: github.com/nodejs/nodejs.org/pull/6660
os: windows-2025
- node: 22
os: macos-15-intel
- node: 22
os: ubuntu-24.04
- node: 24
os: ubuntu-latest
- node: 24
os: macos-latest
- node: 25
os: macos-26
name: Test (node-${{ matrix.node }}/${{ matrix.os }})
steps:
- if: runner.os == 'Linux' # PhantomJS OpenSSL 1.1.1 vs 3.x Ubuntu 22+ compat
run: echo "OPENSSL_CONF=/dev/null" >> "$GITHUB_ENV"
- if: runner.os == 'Windows' # Tests would fail LF vs CRLF linebreak-style
run: git config --global core.autocrlf false && git config --global core.eol lf
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: npm
- run: npm ci
- run: npm test
- if: success()
uses: codecov/codecov-action@v5
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
================================================
FILE: .gitignore
================================================
node_modules
coverage
.#*
docs/_site
docs/files
/src/
/index.js
/index.js.map
/tests/browser/nunjucks*
.nyc_output
/browser
/tests/browser/precompiled-templates.js
/samples/express/js/nunjucks.js
/samples/express/js/templates.js
================================================
FILE: .npmignore
================================================
node_modules
coverage
.nyc_output
docs
tests
bench
nunjucks
scripts
================================================
FILE: CHANGELOG.md
================================================
Changelog
=========
3.2.4 (Apr 13 2023)
------------------
* HTML encode backslashes when expressions are passed through the escape
filter (including when this is done automatically with autoescape). Merge
of [#1437](https://github.com/mozilla/nunjucks/pull/1437).
3.2.3 (Feb 15 2021)
-------------------
* Add support for nested attributes on
[`sort` filter](https://mozilla.github.io/nunjucks/templating.html#sort-arr-reverse-casesens-attr);
respect `throwOnUndefined` if sort attribute is undefined.
* Add `base` arg to
[`int` filter](https://mozilla.github.io/nunjucks/templating.html#int).
* Move `chokidar` to `peerDependencies` and mark it `optional` in `peerDependenciesMeta`.
* Fix prototype pollution issue for template variables. Merge of
[#1330](https://github.com/mozilla/nunjucks/pull/1330); fixes
[#1331](https://github.com/mozilla/nunjucks/issues/1331). Thanks
[ChenKS12138](https://github.com/ChenKS12138)!
3.2.2 (Jul 20 2020)
-------------------
* Add [`select`](https://mozilla.github.io/nunjucks/templating.html#select) and
[`reject`](https://mozilla.github.io/nunjucks/templating.html#reject) filters.
Merge of [#1278](https://github.com/mozilla/nunjucks/pull/1278) and
[#1279](https://github.com/mozilla/nunjucks/pull/1279); fixes
[#282](https://github.com/mozilla/nunjucks/issues/282). Thanks
[ogonkov](https://github.com/ogonkovv)!
* Fix precompile binary script `TypeError: name.replace is not a function`.
Fixes [#1295](https://github.com/mozilla/nunjucks/issues/1295).
* Add support for nested attributes on
[`groupby` filter](https://mozilla.github.io/nunjucks/templating.html#groupby);
respect `throwOnUndefined` option, if the groupby attribute is undefined.
Merge of [#1276](https://github.com/mozilla/nunjucks/pull/1276); fixes
[#1198](https://github.com/mozilla/nunjucks/issues/1198). Thanks
[ogonkov](https://github.com/ogonkovv)!
* Fix bug that prevented errors in included templates from being raised when
rendering templates synchronously. Fixes
[#1272](https://github.com/mozilla/nunjucks/issues/1272).
* The `indent` filter no longer appends an additional newline. Fixes
[#1231](https://github.com/mozilla/nunjucks/issues/1231).
3.2.1 (Mar 17 2020)
-------------------
* Replace yargs with commander to reduce number of dependencies. Merge of
[#1253](https://github.com/mozilla/nunjucks/pull/1253). Thanks
[AlynxZhou](@AlynxZhou).
* Update optional dependency chokidar from `^2.0.0` to `^3.3.0`. Merge of
[#1254](https://github.com/mozilla/nunjucks/pull/1254). Thanks
[eklingen](@eklingen).
* Prevent optional dependency Chokidar from loading when not watching. Merge
of [#1250](https://github.com/mozilla/nunjucks/pull/1250). Thanks
[eklingen](@eklingen).
3.2.0 (Mar 5 2019)
------------------
* Adds [`NodeResolveLoader`](http://mozilla.github.io/nunjucks/api.html#noderesolveloader),
a Loader that loads templates using node's
[`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).
Fixes [#1175](https://github.com/mozilla/nunjucks/issues/1175).
* Emit 'load' events on `Environment` instances, to allow runtime dependency
tracking. Fixes [#1153](https://github.com/mozilla/nunjucks/issues/1153).
3.1.7 (Jan 12 2019)
------------------
* Fix bug where exceptions were silently swallowed with synchronous render.
Fixes [#678](https://github.com/mozilla/nunjucks/issues/678),
[#1116](https://github.com/mozilla/nunjucks/issues/1116),
[#1127](https://github.com/mozilla/nunjucks/issues/1127), and
[#1164](https://github.com/mozilla/nunjucks/issues/1164)
* Removes deprecated postinstall-build package in favor of
[npm prepare](https://docs.npmjs.com/misc/scripts#prepublish-and-prepare).
Merge of [#1172](https://github.com/mozilla/nunjucks/pull/1172).
Fixes [#1167](https://github.com/mozilla/nunjucks/issues/1167).
- Note: this means that npm@5 or later is required to install nunjucks
directly from github.
3.1.6 (Dec 13 2018)
-------------------
No code changes; fixed npm packaging issue.
3.1.5 (Dec 13 2018)
-------------------
* Fix engine dependency version for Node versions > 11.1.0;
Fixes [#1168](https://github.com/mozilla/nunjucks/issues/1168).
3.1.4 (Nov 9 2018)
------------------
* Fix engine version for Node v11.1.0
* Fix "Unexpected token" error for U+2028 unicode newline. Fixes [#126](https://github.com/mozilla/nunjucks/issues/126) and [#736](https://github.com/mozilla/nunjucks/issues/736)
3.1.3 (May 19 2018)
-------------------
* Add `forceescape` filter. Fixes [#782](https://github.com/mozilla/nunjucks/issues/782)
* Fix regression that prevented template errors from reporting line and column number.
Fixes [#1087](https://github.com/mozilla/nunjucks/issues/1087) and
[#1095](https://github.com/mozilla/nunjucks/issues/1095).
* Fix "Invalid type: Is" error for `{% if value is defined %}`. Fixes
[#1110](https://github.com/mozilla/nunjucks/issues/1110)
* Formally drop support for node v4 (the upgrade to babel 7 in 3.1.0 made the
build process incompatible with node < 6.9.0).
3.1.2 (Feb 23 2018)
-------------------
* Fix regression to make `chokidar` an optional dependency again. Fixes
[#1073](https://github.com/mozilla/nunjucks/issues/1073)
* Fix issue when running `npm install nunjucks` with the `--no-bin-links` flag
* Fix regression that broke template caching. Fixes
[#1074](https://github.com/mozilla/nunjucks/issues/1074)
3.1.0 (Feb 19 2018)
-------------------
* Support nunjucks.installJinjaCompat() with slim build. Fixes
[#1019](https://github.com/mozilla/nunjucks/issues/1019)
* Fix calling render callback twice when a conditional import throws an error.
Solves [#1029](https://github.com/mozilla/nunjucks/issues/1029)
* Support objects created with Object.create(null). fixes [#468](https://github.com/mozilla/nunjucks/issues/468)
* Support ESNext iterators, using Array.from. Merge of
[#1058](https://github.com/mozilla/nunjucks/pull/1058)
3.0.1 (May 24 2017)
-------------------
* Fix handling methods and attributes of static arrays, objects and primitives.
Solves the issue [#937](https://github.com/mozilla/nunjucks/issues/937)
* Add support for python-style array slices with Jinja compat enabled.
Fixes [#188](https://github.com/mozilla/nunjucks/issues/188); merge of
[#976](https://github.com/mozilla/nunjucks/pull/976).
* Fix call blocks having access to their parent scope. Fixes
[#906](https://github.com/mozilla/nunjucks/issues/906); merge of
[#994](https://github.com/mozilla/nunjucks/pull/994).
* Fix a bug that caused capturing block tags (e.g. set/endset,
filter/endfilter) to write to the global buffer rather than capturing
their contents. Fixes
[#914](https://github.com/mozilla/nunjucks/issues/914) and
[#972](https://github.com/mozilla/nunjucks/issues/972); merge of
[#990](https://github.com/mozilla/nunjucks/pull/990). Thanks [Noah
Lange](@noahlange).
3.0.0 (Nov 5 2016)
----------------
* Allow including many templates without reaching recursion limits. Merge of
[#787](https://github.com/mozilla/nunjucks/pull/787). Thanks Gleb Khudyakov.
* Allow explicitly setting `null` (aka `none`) as the value of a variable;
don't ignore that value and look on up the frame stack or context. Fixes
[#478](https://github.com/mozilla/nunjucks/issues/478). Thanks Jonny Gerig
Meyer for the report.
* Execute blocks in a child frame that can't write to its parent. This means
that vars set inside blocks will not leak outside of the block, base
templates can no longer see vars set in templates that inherit them, and
`super()` can no longer set vars in its calling scope. Fixes the inheritance
portion of [#561](https://github.com/mozilla/nunjucks/issues/561), which
fully closes that issue. Thanks legutierr for the report.
* Prevent macros from seeing or affecting their calling scope. Merge of
[#667](https://github.com/mozilla/nunjucks/pull/667).
* Fix handling of macro arg with default value which shares a name with another
macro. Merge of [#791](https://github.com/mozilla/nunjucks/pull/791).
* Add support for the spaces parameter in the dump template filter.
Merge of [#868](https://github.com/mozilla/nunjucks/pull/868).
Thanks Jesse Eikema
* Add `verbatim` as an alias of `raw` for compatibility with Twig.
Merge of [#874](https://github.com/mozilla/nunjucks/pull/874).
* Add new `nl2br` filter. Thanks Marc-Aurèle Darche
* Add support for python's `list.append` with Jinja compat enabled. Thanks
Conor Flannigan.
* Add variables whitespace control.
2.5.2 (Sep 14 2016)
----------------
* Call `.toString` in safe filter.
Merge of [#849](https://github.com/mozilla/nunjucks/pull/849).
2.5.1 (Sep 13 2016)
----------------
* Fix `undefined` and `null` behavior in escape and safe filter.
Merge of [#843](https://github.com/mozilla/nunjucks/pull/843).
2.5.0 (Sep 7 2016)
----------------
* Add `elseif` as an alias of `elif` for parity with Twig. Thanks kswedberg.
Merge of [#826](https://github.com/mozilla/nunjucks/pull/826).
* Add nunjucks env to express app settings as `nunjucksEnv`.
Merge of [#829](https://github.com/mozilla/nunjucks/pull/829).
* Add support for finding an object's "length" in length filter.
Merge of [#813](https://github.com/mozilla/nunjucks/pull/813).
* Ensure that precompiling on Windows still outputs POSIX-style path
separators. Merge of [#761](https://github.com/mozilla/nunjucks/pull/761).
* Add support for strict type check comparisons (=== and !==). Thanks
oughter. Merge of [#746](https://github.com/mozilla/nunjucks/pull/746).
* Allow full expressions (incl. filters) in import and from tags. Thanks legutierr.
Merge of [#710](https://github.com/mozilla/nunjucks/pull/710).
* OS agnostic file paths in precompile. Merge of [#825](https://github.com/mozilla/nunjucks/pull/825).
2.4.3 (Sep 7 2016)
----------------
* Fix potential cast-related XSS vulnerability in autoescape mode, and with `escape` filter.
Thanks Matt Austin for the report and Thomas Hunkapiller for the fix.
[#836](https://github.com/mozilla/nunjucks/pull/836)
2.4.2 (Apr 15 2016)
-------------------
* Fix use of `in` operator with strings. Fixes
[#714](https://github.com/mozilla/nunjucks/issues/714). Thanks Zubrik for the
report.
* Support ES2015 Map and Set in `length` filter. Merge of
[#705](https://github.com/mozilla/nunjucks/pull/705). Thanks ricordisamoa.
* Remove truncation of long function names in error messages. Thanks Daniel
Bendavid. Merge of [#702](https://github.com/mozilla/nunjucks/pull/702).
2.4.1 (Mar 17 2016)
-------------------
* Don't double-escape. Thanks legutierr. Merge of
[#701](https://github.com/mozilla/nunjucks/pull/701).
* Prevent filter.escape from escaping SafeString. Thanks atian25. Merge of
[#623](https://github.com/mozilla/nunjucks/pull/623).
* Throw an error if a block is defined multiple times. Refs
[#696](https://github.com/mozilla/nunjucks/issues/696).
* Officially recommend the `.njk` extension. Thanks David Kebler. Merge of
[#691](https://github.com/mozilla/nunjucks/pull/691).
* Allow block-set to wrap an inheritance block. Unreported; fixed as a side
effect of the fix for [#576](https://github.com/mozilla/nunjucks/issues/576).
* Fix `filter` tag with non-trivial contents. Thanks Stefan Cruz and Fabien
Franzen for report and investigation, Jan Oopkaup for failing tests. Fixes
[#576](https://github.com/mozilla/nunjucks/issues/576).
2.4.0 (Mar 10 2016)
-------------------
* Allow retrieving boolean-false as a global. Thanks Marius Büscher. Merge of
[#694](https://github.com/mozilla/nunjucks/pull/694).
* Don't automatically convert any for-loop that has an include statement into
an async loop. Reverts
[7d4716f4fd](https://github.com/mozilla/nunjucks/commit/7d4716f4fd), re-opens
[#372](https://github.com/mozilla/nunjucks/issues/372), fixes
[#527](https://github.com/mozilla/nunjucks/issues/527). Thanks Tom Delmas for
the report.
* Switch from Optimist to Yargs for argument-parsing. Thanks Bogdan
Chadkin. Merge of [#672](https://github.com/mozilla/nunjucks/pull/672).
* Prevent includes from writing to their including scope. Merge of
[#667](https://github.com/mozilla/nunjucks/pull/667) (only partially
backported to 2.x; macro var visibility not backported).
* Fix handling of `dev` environment option, to get full tracebacks on errors
(including nunjucks internals). Thanks Tobias Petry and Chandrasekhar Ambula
V for the report, Aleksandr Motsjonov for draft patch.
* Support using `in` operator to search in both arrays and objects,
and it will throw an error for other data types.
Fix [#659](https://github.com/mozilla/nunjucks/pull/659).
Thanks Alex Mayfield for report and test, Ouyang Yadong for fix.
Merge of [#661](https://github.com/mozilla/nunjucks/pull/661).
* Add support for `{% set %}` block assignments as in jinja2. Thanks Daniele
Rapagnani. Merge of [#656](https://github.com/mozilla/nunjucks/pull/656)
* Fix `{% set %}` scoping within macros.
Fixes [#577](https://github.com/mozilla/nunjucks/issues/577) and
the macro portion of [#561](https://github.com/mozilla/nunjucks/issues/561).
Thanks Ouyang Yadong. Merge of [#653](https://github.com/mozilla/nunjucks/pull/653).
* Add support for named `endblock` (e.g. `{% endblock foo %}`). Thanks
ricordisamoa. Merge of [#641](https://github.com/mozilla/nunjucks/pull/641).
* Fix `range` global with zero as stop-value. Thanks Thomas Hunkapiller. Merge
of [#638](https://github.com/mozilla/nunjucks/pull/638).
* Fix a bug in urlize that collapsed whitespace. Thanks Paulo Bu. Merge of
[#637](https://github.com/mozilla/nunjucks/pull/637).
* Add `sum` filter. Thanks Pablo Matías Lazo. Merge of
[#629](https://github.com/mozilla/nunjucks/pull/629).
* Don't suppress errors inside {% if %} tags. Thanks Artemy Tregubenko for
report and test, Ouyang Yadong for fix. Merge of
[#634](https://github.com/mozilla/nunjucks/pull/634).
* Allow whitespace control on comment blocks, too. Thanks Ouyang Yadong. Merge
of [#632](https://github.com/mozilla/nunjucks/pull/632).
* Fix whitespace control around nested tags/variables/comments. Thanks Ouyang
Yadong. Merge of [#631](https://github.com/mozilla/nunjucks/pull/631).
v2.3.0 (Jan 6 2016)
-------------------
* Return `null` from `WebLoader` on missing template instead of throwing an
error, for consistency with other loaders. This allows `WebLoader` to support
the new `ignore missing` flag on the `include` tag. If `ignore missing` is
not set, a generic "template not found" error will still be thrown, just like
for any other loader. Ajax errors other than 404 will still cause `WebLoader`
to throw an error directly.
* Add preserve-linebreaks option to `striptags` filter. Thanks Ivan
Kleshnin. Merge of [#619](https://github.com/mozilla/nunjucks/pull/619).
v2.2.0 (Nov 23 2015)
--------------------
* Add `striptags` filter. Thanks Anthony Giniers. Merge of
[#589](https://github.com/mozilla/nunjucks/pull/589).
* Allow compiled templates to be imported, included and extended. Thanks Luis
Gutierrez-Sheris. Merge of
[#581](https://github.com/mozilla/nunjucks/pull/581).
* Fix issue with different nunjucks environments sharing same globals. Each
environment is now independent. Thanks Paul Pechin. Merge of
[#574](https://github.com/mozilla/nunjucks/pull/574).
* Add negative steps support for range function. Thanks Nikita Mostovoy. Merge
of [#575](https://github.com/mozilla/nunjucks/pull/575).
* Remove deprecation warning when using the `default` filter without specifying
a third argument. Merge of
[#567](https://github.com/mozilla/nunjucks/pull/567).
* Add support for chaining of addGlobal, addFilter, etc. Thanks Rob Graeber. Merge of
[#537](https://github.com/mozilla/nunjucks/pull/537)
* Fix error propagation. Thanks Tom Delmas. Merge of
[#534](https://github.com/mozilla/nunjucks/pull/534).
* trimBlocks now also trims windows style line endings. Thanks Magnus Tovslid. Merge of
[#548](https://github.com/mozilla/nunjucks/pull/548)
* `include` now supports an option to suppress errors if the template does not
exist. Thanks Mathias Nestler. Merge of
[#559](https://github.com/mozilla/nunjucks/pull/559)
v2.1.0 (Sep 21 2015)
--------------------
* Fix creating `WebLoader` without `opts`. Merge of
[#524](https://github.com/mozilla/nunjucks/pull/524).
* Add `hasExtension` and `removeExtension` methods to `Environment`. Merge of
[#512](https://github.com/mozilla/nunjucks/pull/512).
* Add support for kwargs in `sort` filter. Merge of
[#510](https://github.com/mozilla/nunjucks/pull/510).
* Add `none` as a lexed constant evaluating to `null`. Merge of
[#480](https://github.com/mozilla/nunjucks/pull/480).
* Fix rendering of multiple `raw` blocks. Thanks Aaron O'Mullan. Merge of
[#503](https://github.com/mozilla/nunjucks/pull/503).
* Avoid crashing on async loader error. Thanks Samy Pessé. Merge of
[#504](https://github.com/mozilla/nunjucks/pull/504).
* Add support for keyword arguments for sort filter. Thanks Andres Pardini. Merge of
[#510](https://github.com/mozilla/nunjucks/pull/510)
v2.0.0 (Aug 30 2015)
--------------------
Most of the changes can be summed up in the
[issues tagged 2.0](https://github.com/mozilla/nunjucks/issues?q=is%3Aissue+milestone%3A2.0+is%3Aclosed).
Or you can
[see all commits](https://github.com/mozilla/nunjucks/compare/v1.3.4...f8aabccefc31a9ffaccdc6797938b5187e07ea87).
Most important changes:
* **autoescape is now on by default.** You need to explicitly pass `{
autoescape: false }` in the options to turn it off.
* **watch is off by default.** You need to explicitly pass `{ watch: true }` to
start the watcher.
* The `default` filter has changed. It will show the default value only if the
argument is **undefined**. Any other value, even false-y values like `false`
and `null`, will be returned. You can get back the old behavior by passing
`true` as a 3rd argument to activate the loose-y behavior: `foo |
default("bar", true)`. In 2.0 if you don't pass the 3rd argument, a warning
will be displayed about this change in behavior. In 2.1 this warning will be
removed.
* [New filter tag](http://mozilla.github.io/nunjucks/templating.html#filter)
* Lots of other bug fixes and small features, view the above issue list!
v1.3.4 (Apr 27 2015)
--------------------
This is an extremely minor release that only adds an .npmignore so that the
bench, tests, and docs folders do not get published to npm. Nunjucks should
download a lot faster now.
v1.3.3 (Apr 3 2015)
-------------------
This is exactly the same as v1.3.1, just fixing a typo in the git version tag.
v1.3.2 (Apr 3 2015)
-------------------
(no notes)
v1.3.1 (Apr 3 2015)
-------------------
We added strict mode to all the files, but that broke running nunjucks in the
browser. Should work now with this small fix.
v1.3.0 (Apr 3 2015)
-------------------
* Relative templates: you can now load a template relatively by starting the
path with ., like ./foo.html
* FileSystemLoader now takes a noCache option, if true will disable caching
entirely
* Additional lstripBlocks and trimBlocks available to clean output
automatically
* New selectattr and rejectattr filters
* Small fixes to the watcher
* Several bug fixes
v1.2.0 (Feb 4 2015)
-------------------
* The special non-line-breaking space is considered whitespace now
* The in operator has a lower precedence now. This is potentially a breaking
change, thus the minor version bump. See
[#336](https://github.com/mozilla/nunjucks/pull/336)
* import with context now implemented:
[#319](https://github.com/mozilla/nunjucks/pull/319)
* async rendering doesn't throw compile errors
v1.1.0 (Sep 30 2014)
--------------------
User visible changes:
* Fix a bug in urlize that would remove periods
* custom tag syntax (like {% and %}) was made Environment-specific
internally. Previously they were global even though you set them through the
Environment.
* Remove aggressive optimization that only emitted loop variables when uses. It
introduced several bugs and didn't really improve perf.
* Support the regular expression syntax like /foo/g.
* The replace filter can take a regex as the first argument
* The call tag was implemented
* for tags can now take an else clause
* The cycler object now exposes the current item as the current property
* The chokidar library was updated and should fix various issues
Dev changes:
* Test coverage now available via istanbul. Will automatically display after
running tests.
v1.0.7 (Aug 15 2014)
--------------------
Mixed up a few things in the 1.0.6 release, so another small bump. This merges
in one thing:
* The length filter will not throw an error is used on an undefined
variable. It will return 0 if the variable is undefined.
v1.0.6 (Aug 15 2014)
--------------------
* Added the addGlobal method to the Environment object
* import/extends/include now can take an arbitrary expression
* fix bugs in set
* improve express integration (allows rendering templates without an extension)
v1.0.5 (May 1 2014)
-------------------
* Added support for browserify
* Added option to specify template output path when precompiling templates
* Keep version comment in browser minified files
* Speed up SafeString implementation
* Handle null and non-matching cases for word count filter
* Added support for node-webkit
* Other various minor bugfixes
chokidar repo fix - v1.0.4 (Apr 4 2014)
---------------------------------------
* The chokidar dependency moved repos, and though the git URL should have been
forwarded some people were having issues. This fixed the repo and
version.
(v1.0.3 is skipped because it was published with a bad URL, quickly fixed with
another version bump)
Bug fixes - v1.0.2 (Mar 25 2014)
--------------------------------
* Use chokidar for watching file changes. This should fix a lot of problems on
OS X machines.
* Always use / in paths when precompiling templates
* Fix bug where async filters hang indefinitely inside if statements
* Extensions now can override autoescaping with an autoescape property
* Other various minor bugfixes
v1.0.1 (Dec 16, 2013)
---------------------
(no notes)
We've reached 1.0! Better APIs, asynchronous control, and more (Oct 24, 2013)
-----------------------------------------------------------------------------
* An asynchronous API is now available, and async filters, extensions, and
loaders is supported. The async API is optional and if you don't do anything
async (the default), nothing changes for you. You can read more about this
[here](http://jlongster.github.io/nunjucks/api.html#asynchronous-support). (fixes
[#41](https://github.com/mozilla/nunjucks/issues/41))
* Much simpler higher-level API for initiating/configuring nunjucks is
available. Read more
[here](http://jlongster.github.io/nunjucks/api.html#simple-api).
* An official grunt plugin is available for precompiling templates:
[grunt-nunjucks](https://github.com/jlongster/grunt-nunjucks)
* **The browser files have been renamed.** nunjucks.js is now the full library
with compiler, and nunjucks-slim.js is the small version that only works with
precompiled templates
* urlencode filter has been added
* The express integration has been refactored and isn't a kludge
anymore. Should avoid some bugs and be more future-proof;
* The order in which variables are lookup up in the context and frame lookup
has been reversed. It will now look in the frame first, and then the
context. This means that if a for loop introduces a new var, like {% for name
in names %}, and if you have name in the context as well, it will properly
reference name from the for loop inside the loop. (fixes
[#122](https://github.com/mozilla/nunjucks/pull/122) and
[#119](https://github.com/mozilla/nunjucks/issues/119))
v0.1.10 (Aug 9 2013)
--------------------
(no notes)
v0.1.9 (May 30 2013)
--------------------
(no notes)
v0.1.8 - whitespace controls, unpacking, better errors, and more! (Feb 6 2013)
------------------------------------------------------------------------------
There are lots of cool new features in this release, as well as many critical
bug fixes.
Full list of changes:
* Whitespace control is implemented. Use {%- and -%} to strip whitespace before/after the block.
* `for` loops implement Python-style array unpacking. This is a really nice
feature which lets you do this:
{% for x, y, z in [[2, 2, 2], [3, 3, 3]] %}
--{{ x }} {{ y }} {{ z }}--
{% endfor %}
The above would output: --2 2 2----3 3 3--
You can pass any number of variable names to for and it will destructure each
array in the list to the variables.
This makes the syntax between arrays and objects more
consistent. Additionally, it allows us to implement the `dictsort` filter
which sorts an object by keys or values. Technically, it returns an array of
2-value arrays and the unpacking takes care of it. Example:
{% for k, v in { b: 2, a: 1 } %}
--{{ k }}: {{ v }}--
{% endfor %}
Output: `--b: 2----a: 1--` (note: the order could actually be anything
because it uses javascript’s `for k in obj` syntax to iterate, and ordering
depends on the js implementation)
{% for k, v in { b: 2, a: 1} | dictsort %}
--{{ k }}: {{ v }}--
{% endfor %}
Output: `--a: 1----b: 2--`
The above output will always be ordered that way. See the documentation for
more details.
Thanks to novocaine for this!
* Much better error handling with at runtime (shows template/line/col information for attempting to call undefined values, etc)
* Fixed a regression which broke the {% raw %} block
* Fix some edge cases with variable lookups
* Fix a regression with loading precompiled templates
* Tweaks to allow usage with YUICompressor
* Use the same error handling as normal when precompiling (shows proper errors)
* Fix template loading on Windows machines
* Fix int/float filters
* Fix regression with super()
v0.1.7 - helpful errors, many bug fixes (Dec 12 2012)
-----------------------------------------------------
The biggest change in v0.1.7 comes from devoidfury (thanks!) which implements
consistent and helpful error messages. The errors are still simply raw text,
and not pretty HTML, but they at least contain all the necessary information to
track down an error, such as template names, line and column numbers, and the
inheritance stack. So if an error happens in a child template, it will print
out all the templates that it inherits. In the future, we will most likely
display the actual line causing an error.
Full list of changes:
* Consistent and helpful error messages
* Expressions are more consistent now. Previously, there were several places
that wouldn’t accept an arbitrary expression that should. For example, you
can now do {% include templateNames['foo'] %}, whereas previously you could
only give it a simply variable name.
* app.locals is fixed with express 2.5
* Method calls on objects now have correct scope for this. Version 0.1.6 broke
this and this was referencing the global scope.
* A check was added to enforce loading of templates within the correct
path. Previously you could load a file outside of the template with something
like ../../crazyPrivateFile.txt
You can
[view all the code changes here](https://github.com/jlongster/nunjucks/compare/v0.1.6...v0.1.7). Please
[file an issue](https://github.com/jlongster/nunjucks/issues?page=1&state=open)
if something breaks!
v0.1.6 - undefined handling, bugfixes (Nov 13, 2012)
----------------------------------------------------
This is mostly a bugfix release, but there are a few small tweaks based on
feedback:
* In some cases, backslashes in the template would not appear in the
output. This has been fixed.
* An error is thrown if a filter is not found
* Old versions of express are now supported (2.5.11 was tested)
* References on undefined objects are now suppressed. For example, {{ foo }},
{{ foo.bar }}, {{ foo.bar.baz }} all output nothing if foo is
undefined. Previously only the first form would be suppressed, and a cryptic
error thrown for the latter 2 references. Note: I believe this is a departure
from jinja, which throws errors when referencing undefined objects. I feel
that this is a good and non-breaking addition though. (thanks to devoidfury)
* A bug in set where you couldn’t not reference other variables is fixed
(thanks chriso and panta)
* Other various small bugfixes
You can view
[all the code changes here](https://github.com/jlongster/nunjucks/compare/v0.1.5...v0.1.6). As
always, [file an issue](https://github.com/jlongster/nunjucks/issues) if
something breaks!
v0.1.5 - macros, keyword arguments, bugfixes (Oct 11 2012)
----------------------------------------------------------
v0.1.5 has been pushed to npm, and it’s a big one. Please file any issues you
find, and I’ll fix them as soon as possible!
* The node data structure has been completely refactored to reduce redundancy
and make it easier to add more types in the future.
* Thanks to Brent Hagany, macros now have been implemented. They should act
exactly the way jinja2 macros do.
* A calling convention which implements keyword arguments now exists. All
keyword args are converted into a hash and passed as the last
argument. Macros needed this to implement keyword/default arguments.
* Function and filter calls apply the new keyword argument calling convention
* The “set” block now appropriately only sets a variable for the current scope.
* Many other bugfixes.
I’m watching this release carefully because of the large amount of code that
has changed, so please
[file an issue](https://github.com/jlongster/nunjucks/issues) if you have a
problem with it.
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Community Participation Guidelines
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
For more details, please read the
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
## How to Report
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
<!--
## Project Specific Etiquette
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
Please update for your project.
-->
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
Thanks for your interest in contributing! The advice below will help you get your issue fixed / pull request merged.
## Purpose
Nunjucks has the following purpose:
* Aim for templating feature parity with Jinja2.
* Aim for templating feature parity with Twig, but only when not conflicting with Jinja2 parity.
* Works in all node releases that are
[actively maintained by the Node Foundation](https://github.com/nodejs/Release#release-schedule)
* Works in all modern browsers (with [ES5 support](http://kangax.github.io/compat-table/es5/)).
* Works in IE8 with [es5-shim](https://github.com/es-shims/es5-shim).
* Keep footprint browser files as small as possible (save on bandwidth, download time).
* Keep performance as fast as possible (see benchmarks).
* Keep maintenance as easy as possible (avoid complexity, automate what we can).
Notes:
* We don't aim for parity of all language specific syntax.
* We don't aim for parity of language specific filters like [Twig's PHP date format](http://twig.sensiolabs.org/doc/functions/date.html).
Issues and pull requests contributing to this purpose have the best chance to make it into Nunjucks.
## Questions?
Please DO NOT ask "how do I?" or usage questions via GitHub issues. Instead,
use the [mailing list](https://groups.google.com/forum/#!forum/nunjucks).
## Submitting Issues
Issues are easier to reproduce/resolve when they have:
- A pull request with a failing test demonstrating the issue
- A code example that produces the issue consistently
- A traceback (when applicable)
## Pull Requests
When creating a pull request:
- Write tests (see below).
- Note user-facing changes in the [`CHANGELOG.md`](CHANGELOG.md) file.
- Update the documentation (in [`docs/`](docs/)) as needed.
## Testing
Please add tests for any changes you submit. The tests should fail before your
code changes, and pass with your changes. Existing tests should not break. Test
coverage (output at the end of every test run) should never decrease after your
changes.
To install all the requirements for running the tests:
```bash
npm install
```
To run the tests:
```bash
npm test
```
================================================
FILE: LICENSE
================================================
Copyright (c) 2012-2015, James Long
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.
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 THE COPYRIGHT
HOLDER OR CONTRIBUTORS 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.
================================================
FILE: MAINTENANCE.md
================================================
# Pushing a New Version
Nunjucks attempts to adhere to semantic versioning. The API is very stable, so
from here on out it will most likely be point releases.
1. Do a `pull` from github to make sure you have all the latest updates.
2. View all the changes since the last version:
```
$ git log --oneline v1.2.3..master
```
Replace `v1.2.3` with whatever the last version was, and you'll see all the
changes going out in this version. Ensure that all significant user-facing
changes (new features and bugfixes) are mentioned in `CHANGELOG.md`. Change the
"master (unreleased)" heading in `CHANGELOG.md` to the new version number and
date.
3. Update the version in `package.json`.
3. Run the command to update the ready-made files for the browser.
```
$ npm run browserfiles
```
5. Commit above changes and push to `master` (or a release branch, if using one).
6. Draft a new release on GitHub and copy the changelog to the description. The
tag and title should both be the version, in the form `v2.3.0`. Publish the
release.
7. Publish to npm:
```
npm publish
```
8. Make sure docs are up-to-date. You need to copy all the `nunjucks*.js` files
in `browser/` to the docs. This is where the "download" link points to in
the docs. You also need to copy the tests into the docs, for the online
browser tests. ``make prod`` in the ``docs/`` dir will handle these tasks
for you. Push (force push if necessary) the build out _site folder onto the
`gh-pages` branch of the `nunjucks` repo to get it live. One way to do that
is the following commands. These commands presume that you have another
nunjucks git clone inside the (git-ignored) `docs/_site` directory, checked
out to the `gh-pages` branch (and tracking `origin/gh-pages`). (To set that
up the first time, `cd docs/_site`, `rm -rf *`, `git clone
git@github.com:mozilla/nunjucks.git .`, and `git checkout gh-pages`).
```
cd docs && make prod
cd files
python -m SimpleHTTPServer
# load http://localhost:8000/tests/browser/ and verify tests pass in browser
cd ../_site && git add -A && git commit && git push
```
9. Add a new "master (unreleased)" section at the top of `CHANGELOG.md`.
10. Bump the version number in `package.json` to a development pre-release of
the next anticipated release number (e.g. "2.2.0-dev.1").
================================================
FILE: README.md
================================================
# Nunjucks
[![NPM Version][npm-image]][npm-url]
[![NPM Downloads][downloads-image]][downloads-url]
[![CI][github-actions-image]][github-actions-url]
[![Codecov][codecov-image]][codecov-url]
[Nunjucks](https://mozilla.github.io/nunjucks/) is a full featured
templating engine for javascript. It is heavily inspired by
[jinja2](https://jinja.palletsprojects.com/). View the docs
[here](https://mozilla.github.io/nunjucks/).
## Installation
`npm install nunjucks`
To use the file watcher built-in to Nunjucks, Chokidar must be installed separately.
`npm install nunjucks chokidar`
(View the [CHANGELOG](https://github.com/mozilla/nunjucks/releases))
## Documentation
Nunjucks info and documentation source is in [`/docs`](/docs) and publishes to https://mozilla.github.io/nunjucks/
## Browser Support
Supported in all modern browsers. For IE8 support, use [es5-shim](https://github.com/es-shims/es5-shim).
## Tests
Run the tests with `npm test`.
## Get in touch
If you have ideas or questions, or need help, you can reach us in the [#nunjucks:mozilla.org](https://matrix.to/#/#nunjucks:mozilla.org) room on [Matrix](https://wiki.mozilla.org/Matrix).
## Want to help?
Contributions are always welcome! Before you submit an issue or pull request, please read our [contribution guidelines](CONTRIBUTING.md).
## Contributors
[](https://github.com/mozilla/nunjucks/graphs/contributors)
[npm-image]: https://img.shields.io/npm/v/nunjucks.svg
[npm-url]: https://npmjs.org/package/nunjucks
[downloads-image]: https://img.shields.io/npm/dm/nunjucks.svg
[downloads-url]: https://npmjs.org/package/nunjucks
[github-actions-image]: https://github.com/mozilla/nunjucks/actions/workflows/tests.yml/badge.svg
[github-actions-url]: https://github.com/mozilla/nunjucks/actions
[codecov-image]: https://img.shields.io/codecov/c/gh/mozilla/nunjucks.svg
[codecov-url]: https://codecov.io/gh/mozilla/nunjucks/branch/master
================================================
FILE: bench/case.html
================================================
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
<h1>{{ header }}</h1>
{% if items.length %}
<ul>
{% for item in items %}
{% if item.current %}
<li><strong>{{ item.name }}</strong></li>
{% else %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>The list is empty.</p>
{% endif %}
================================================
FILE: bench/index.html
================================================
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button id="start">Start</button>
<button id="stop">Stop</button>
<script type="text/javascript" src="../browser/nunjucks-dev.js"></script>
<script>
var tmpl = '<h1>{{ header }}</h1>' +
'<h1>{{ header }}</h1>' +
'{% if items.length %}' +
'<ul>' +
'{% for item in items %}' +
' {% if item.current %}' +
' <li><strong>{{ item.name }}</strong></li>' +
' {% else %}' +
' <li><a href="{{ item.url }}">{{ item.name }}</a></li>' +
' {% endif %}' +
'{% endfor %}' +
'</ul>' +
'{% else %}' +
'<p>The list is empty.</p>' +
'{% endif %}';
var env = new nunjucks.Environment();
var running = false;
var timer = null;
var t;
function start() {
for(var i=0; i<20000; i++) {
t = new nunjucks.Template(tmpl, env, null, null, true);
}
}
function stop() {
if(timer) {
timer && clearTimeout(timer);
}
}
document.getElementById('start').addEventListener('click', function() {
running = true;
start();
});
document.getElementById('stop').addEventListener('click', stop);
</script>
</body>
</html>
================================================
FILE: bench/jinja/index.html
================================================
{% for x in foo %}{{ x }}{% endfor %}
================================================
FILE: bench/jinja/jinja.py
================================================
import time
from jinja2 import Template, Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('.'))
print env.get_template('index.html').render()
# src = open('index.html').read()
# print(env._generate(env._parse(src, 'poop', 'hello.html'),
# 'poop',
# 'hello.html'))
# print([x for x in env._tokenize(src, 'poop', 'hello.html')])
# env = Environment(loader=FileSystemLoader('.'))
# times = []
# arr = [5]*1000
# for i in range(100):
# env = Environment(loader=FileSystemLoader('.'))
# t1 = time.time()
# tmpl = env.get_template('index.html')
# tmpl.render({'username': 'james',
# 'arr': arr})
# t2 = time.time()
# times.append(t2-t1)
# print( reduce(lambda x, y: x+y, times) / len(times))
================================================
FILE: bench/run.js
================================================
'use strict';
var fs = require('fs');
var bench = require('bench');
var oldNunjucks = require('nunjucks');
var nunjucks = require('../index');
var src = fs.readFileSync('case.html', 'utf-8');
var oldEnv = new oldNunjucks.Environment(null);
var oldTmpl = new oldNunjucks.Template(src, env, null, null, true);
var env = new nunjucks.Environment(null);
var tmpl = new nunjucks.Template(src, env, null, null, true);
var ctx = {
items: [
{
current: true,
name: 'James'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
},
{
name: 'Foo',
url: 'http://example.com'
}
]
};
exports.time = 1000;
exports.compareCount = 8;
exports.compare = {
'old-nunjucks': function() {
oldTmpl.render(ctx);
},
'new-nunjucks': function(done) {
tmpl.render(ctx, done);
}
};
// var start = Date.now();
// function g() {}
// for(var i=0; i<3000; i++) {
// oldTmpl.render(ctx);
// //tmpl.render(ctx, g);
// }
// console.log(Date.now() - start);
bench.runMain();
================================================
FILE: bin/precompile
================================================
#!/usr/bin/env node
var {program} = require('commander');
var precompile = require('../src/precompile').precompile;
var Environment = require('../src/environment').Environment;
var lib = require('../src/lib');
var cmdpath = null;
program
.storeOptionsAsProperties(false)
.passCommandToAction(false);
program
.name('precompile')
.usage('[-f|--force] [-a|--filters <filters>] [-n|--name <name>] [-i|--include <regex>] [-x|--exclude <regex>] [-w|--wrapper <wrapper>] <path>')
.arguments('<path>')
.helpOption('-?, -h, --help', 'Display this help message')
.option('-f, --force', 'Force compilation to continue on error')
.option('-a, --filters <filters>', 'Give the compiler a comma-delimited list of asynchronous filters, required for correctly generating code')
.option('-n, --name <name>', 'Specify the template name when compiling a single file')
.option('-i, --include <regex>', 'Include a file or folder which match the regex but would otherwise be excluded. You can use this flag multiple times', concat, ['\\.html$', '\\.jinja$'])
.option('-x, --exclude <regex>', 'Exclude a file or folder which match the regex but would otherwise be included. You can use this flag multiple times', concat, [])
.option('-w, --wrapper <wrapper>', 'Load a external plugin to change the output format of the precompiled templates (for example, "-w custom" will load a module named "nunjucks-custom")')
.action(function (path) {
cmdpath = path;
})
.parse(process.argv);
function concat(value, previous) {
return previous.concat(value);
}
if (cmdpath == null) {
program.outputHelp();
console.error('\nerror: no path given');
process.exit(1);
}
var env = new Environment([]);
const opts = program.opts();
lib.each([].concat(opts.filters).join(',').split(','), function (name) {
env.addFilter(name.trim(), function () {}, true);
});
if (opts.wrapper) {
opts.wrapper = require('nunjucks-' + opts.wrapper).wrapper;
}
console.log(precompile(cmdpath, {
env : env,
force : opts.force,
name : opts.name,
wrapper: opts.wrapper,
include : [].concat(opts.include),
exclude : [].concat(opts.exclude)
}));
================================================
FILE: bin/precompile.cmd
================================================
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\precompile" %*
) ELSE (
node "%~dp0\precompile" %*
)
================================================
FILE: bower.json
================================================
{
"name": "nunjucks",
"main": "browser/nunjucks.js",
"ignore": [
"Makefile",
"package.json",
"tests",
"docs",
"index.js",
"nunjucks"
],
"keywords": [
"jinja",
"template",
"templates",
"templating",
"browser"
]
}
================================================
FILE: codecov.yml
================================================
comment:
require_changes: yes
================================================
FILE: contribute.json
================================================
{
"name": "Nunjucks",
"description": "Nunjucks is a full featured templating engine for javascript. It is heavily inspired by jinja2.",
"repository": {
"url": "https://github.com/mozilla/nunjucks",
"license": "BSD 2-Clause",
"tests": "https://travis-ci.org/mozilla/nunjucks"
},
"participate": {
"home": "https://github.com/mozilla/nunjucks",
"docs": "https://github.com/mozilla/nunjucks"
},
"bugs": {
"list": "https://github.com/mozilla/nunjucks/issues",
"report": "https://github.com/mozilla/nunjucks/issues/new"
},
"keywords": [
"javascript",
"node.js",
"jinja"
]
}
================================================
FILE: docs/.gitignore
================================================
_site
.DS_Store
================================================
FILE: docs/Makefile
================================================
all:
jekyll serve --watch
prod:
cp ../browser/* files
rsync -avz ../tests/ files/tests
jekyll build --config _config.yml,_config-prod.yml
================================================
FILE: docs/README.md
================================================
This is a jekyll 2 site that generates the docs for
[nunjucks](https://github.com/mozilla/nunjucks). If you find a bug
in the docs, please file an issue, or even better, fork it and fix it!
Run `make` to publish and look it at locally.
Run `make prod` to publish the production version, and then push the
generated `_site` folder on the `gh-pages` branch of the
[nunjucks](https://github.com/mozilla/nunjucks) repo.
================================================
FILE: docs/_config-prod.yml
================================================
baseurl: /nunjucks/
================================================
FILE: docs/_config.yml
================================================
encoding: utf-8
markdown: redcarpet
highlighter: pygments
redcarpet:
extensions: [with_toc_data]
baseurl: /
================================================
FILE: docs/_layouts/page.html
================================================
<!DOCTYPE html>
<html>
<head>
<title>Nunjucks</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" type="text/css"
href="{{ site.baseurl }}bower_components/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="{{ site.baseurl }}css/highlight.css" />
<link rel="stylesheet" type="text/css" href="{{ site.baseurl }}css/app.css" />
<link rel="icon" type="image/png" href="{{ site.baseurl }}img/favicon.png" />
</head>
<body id="{{ page.pageid }}">
<nav class="navbar navbar-default {% if page.pageid == 'home' %}navbar-fixed-top{% endif %}">
<a class="pull-left logo" href="{{ site.baseurl }}">Nunjucks</a>
<ul class="nav navbar-nav navbar-right pull-right">
<li><a href="{{ site.baseurl }}#download" class="download">Download</a></li>
<li><a href="https://github.com/mozilla/nunjucks">GitHub</a></li>
<li class="dropdown">
<a href="getting-started.html" data-toggle="dropdown">Docs</a>
<ul class="dropdown-menu">
<li><a href="getting-started.html">Getting Started</a></li>
<li><a href="templating.html">Templating</a></li>
<li><a href="api.html">API</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</li>
</ul>
</nav>
{{ content }}
<footer>
Found a bug in the
documentation? <a href="https://github.com/mozilla/nunjucks/tree/master/docs">Fix
it or file an issue</a>!
</footer>
<script src="{{ site.baseurl }}bower_components/jquery/jquery.min.js"></script>
<script src="{{ site.baseurl }}bower_components/bootstrap/js/affix.js"></script>
<script src="{{ site.baseurl }}js/app.js"></script>
<script src="{{ site.baseurl }}js/subpage.js"></script>
<!-- commented out temporarily while we figure out how to get GA for mozilla.github.io
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-9014321-3', 'jlongster.github.io');
ga('send', 'pageview');
</script>
-->
</body>
</html>
================================================
FILE: docs/_layouts/subpage.html
================================================
---
layout: page
---
<div class="content clearfix">
<aside class="col-sm-3">
<div class="pages">
<p><strong>Documentation</strong></p>
<ul>
<li><a href="getting-started.html">Getting Started</a></li>
<li><a href="templating.html">Templating</a></li>
<li><a href="api.html">API</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</div>
<div class="toc">
<p><strong>{{ page.title }}</strong></p>
{% page_toc %}
</div>
</aside>
<div class="col-sm-9 main">
<div class="locale btn-group">{{ page.url | locale_buttons: site.baseurl }}</div>
{{ content }}
</div>
</div>
================================================
FILE: docs/_plugins/api.rb
================================================
require 'redcarpet';
require 'pygments';
module Jekyll
class ApiTag < Liquid::Block
@@renderer = Class.new(Redcarpet::Render::HTML) do
def add_code_tags(code, lang)
code = code.sub(/<pre>/, "<pre><code class=\"#{lang} language-#{lang}\" data-lang=\"#{lang}\">")
code = code.sub(/<\/pre>/,"</code></pre>")
end
def block_code(code, lang)
require 'pygments'
lang = lang && lang.split.first || "text"
output = add_code_tags(Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
lang) + "\n"
end
end
def render(context)
content = @nodelist.map { |token|
token.respond_to?(:render) ? token.render(context) : token
}.join.strip!
content = content.split(/\n/)
name = content[0]
sig = content[1]
desc = content[2..-1].join("\n")
desc = Redcarpet::Markdown.new(@@renderer.new,
fenced_code_blocks: true).render(desc)
'### ' + name + "\n\n<div class=\"api-sig\"><code>" + sig + "</code></div>\n" +
"<div class=\"api-desc\">" + desc + "</div>\n"
end
end
end
Liquid::Template.register_tag('api', Jekyll::ApiTag)
================================================
FILE: docs/_plugins/cleanup.rb
================================================
module Jekyll
module Converters
class Markdown
def convert(content)
setup
content = @parser.convert(content)
names = {}
content.gsub(/toc_\d*">([^<]*)/) {
name = $1
slug = name.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
if names.has_key?(slug)
i = 1
newSlug = slug + i.to_s
while names.has_key?(newSlug)
i = i + 1
newSlug = slug + i.to_s
end
slug = newSlug
end
names[slug] = true
slug + '">' + name
}
end
end
end
end
================================================
FILE: docs/_plugins/locale.rb
================================================
# -*- coding: utf-8 -*-
module Jekyll
module LocaleFilter
def locale_buttons(url, baseurl)
if url.start_with?('/cn/')
en_url = File.join(baseurl, url.sub(/^\/cn\//, '/'))
cn_url = File.join(baseurl, url)
fr_url = File.join(baseurl, url.sub(/^\/cn\//, '/fr/'))
'<a href="' + en_url + '" class="btn btn-default">English</a>' +
'<a href="' + cn_url + '" class="btn btn-success">中文</a>' +
'<a href="' + fr_url + '" class="btn btn-default">Français</a>'
else
if url.start_with?('/fr/')
en_url = File.join(baseurl, url.sub(/^\/fr\//, '/'))
cn_url = File.join(baseurl, url.sub(/^\/fr\//, '/cn/'))
fr_url = File.join(baseurl, url)
'<a href="' + en_url + '" class="btn btn-default">English</a>' +
'<a href="' + cn_url + '" class="btn btn-default">中文</a>' +
'<a href="' + fr_url + '" class="btn btn-success">Français</a>'
else
en_url = File.join(baseurl, url)
cn_url = File.join(baseurl, url.sub(/^\//, '/cn/'))
fr_url = File.join(baseurl, url.sub(/^\//, '/fr/'))
'<a href="' + en_url + '" class="btn btn-success">English</a>' +
'<a href="' + cn_url + '" class="btn btn-default">中文</a>' +
'<a href="' + fr_url + '" class="btn btn-default">Français</a>'
end
end
end
end
end
Liquid::Template::register_filter(Jekyll::LocaleFilter)
================================================
FILE: docs/_plugins/page_toc.rb
================================================
require 'redcarpet';
module Jekyll
class PageTocTag < Liquid::Tag
def initialize(tag_name, args, tokens)
end
def render(context)
content = File.open(context.environments.first["page"]["path"]).read
content = content.gsub(/^---.*\n---/m, '')
content = content.gsub(/^{% api %}\n([^\n]*)/m, '### \1')
names = {}
content = Redcarpet::Markdown.new(Redcarpet::Render::HTML_TOC).render(content)
content.gsub(/toc_\d*">([^<]*)/) {
name = $1
slug = name.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
if names.has_key?(slug)
i = 1
newSlug = slug + i.to_s
while names.has_key?(newSlug)
i = i + 1
newSlug = slug + i.to_s
end
slug = newSlug
end
names[slug] = true
slug + '">' + name
}
end
end
end
Liquid::Template.register_tag('page_toc', Jekyll::PageTocTag)
================================================
FILE: docs/api.md
================================================
---
layout: subpage
title: API
---
{% raw %}
# API
The API for nunjucks covers rendering templates, adding filters and
extensions, customizing template loading, and more.
## User-Defined Templates Warning
nunjucks does not sandbox execution so **it is not safe to run
user-defined templates or inject user-defined content into template
definitions**. On the server, you can expose attack vectors for
accessing sensitive data and remote code execution. On the client,
you can expose cross-site scripting vulnerabilities even for
precompiled templates (which can be mitigated with a strong
[CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)). See
[this issue](https://github.com/mozilla/nunjucks-docs/issues/17) for
more information.
## Simple API
If you don't need deep customization of the system, you can use this simple
higher-level API for loading and rendering templates.
{% endraw %}
{% api %}
render
nunjucks.render(name, [context], [callback])
Renders the template named **name** with the **context** hash. If
**callback** is provided, it will be called when done with any
possible error as the first argument and the result as the second.
Otherwise, the result is returned from `render` and errors are thrown.
See [asynchronous support](#asynchronous-support) for more info.
See the warning about **not allowing [users to define their own
templates](#user-defined-templates-warning).**
```js
var res = nunjucks.render('foo.html');
var res = nunjucks.render('foo.html', { username: 'James' });
nunjucks.render('async.html', function(err, res) {
});
```
{% endapi %}
{% api %}
renderString
nunjucks.renderString(str, context, [callback])
Same as [`render`](#render), but renders a raw string instead of
loading a template.
The same warning about **not allowing [users to define their own
templates](#user-defined-templates-warning)** applies.
{% raw %}
```js
var res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });
```
{% endraw %}
{% endapi %}
{% api %}
compile
nunjucks.compile(str, [env], [path])
Compile the given string into a reusable nunjucks Template object.
{% raw %}
```js
var template = nunjucks.compile('Hello {{ username }}');
template.render({ username: 'James' });
```
{% endraw %}
{% endapi %}
{% api %}
configure
nunjucks.configure([path], [opts]);
Tell nunjucks that your templates live at **path** and flip any
feature on or off with the **opts** hash. You can provide both
arguments or either of them. **path** defaults to the current working
directory, and the following options are available in **opts**:
* **autoescape** *(default: true)* controls if output with dangerous characters are
escaped automatically. See [Autoescaping](#autoescaping)
* **throwOnUndefined** *(default: false)* throw errors when outputting a null/undefined value
* **trimBlocks** *(default: false)* automatically remove trailing newlines from a block/tag
* **lstripBlocks** *(default: false)* automatically remove leading whitespace from a block/tag
* **watch** *(default: false)* reload templates when they are changed (server-side). To use watch, make sure optional dependency *chokidar* is installed.
* **noCache** *(default: false)* never use a cache and recompile templates each time (server-side)
* **web** an object for configuring loading templates in the browser:
* **useCache** *(default: false)* will enable cache and templates will never see updates.
* **async** *(default: false)* will load templates asynchronously instead of synchronously (requires use of the [asynchronous API](#asynchronous-support) for rendering).
* **express** an express app that nunjucks should install to
* **tags:** *(default: see nunjucks syntax)* defines the syntax for
nunjucks tags. See [Customizing Syntax](#customizing-syntax)
`configure` returns an `Environment` instance, which lets you add
filters and extensions while still using the simple API. See below for
more information on `Environment`.
**Warning**: The simple API (above; e.g. `nunjucks.render`) always uses the
configuration from the most recent call to `nunjucks.configure`. Since this
is implicit and can result in unexpected side effects, use of the simple API
is discouraged in most cases (especially if `configure` is used); instead,
explicitly create an environment using `var env = nunjucks.configure(...)`
and then call `env.render(...)` etc.
```js
nunjucks.configure('views');
// if in the browser, you probably want to use an absolute URL
nunjucks.configure('/views');
nunjucks.configure({ autoescape: true });
nunjucks.configure('views', {
autoescape: true,
express: app,
watch: true
});
var env = nunjucks.configure('views');
// do stuff with env
```
{% endapi %}
{% api %}
installJinjaCompat
nunjucks.installJinjaCompat()
This installs experimental support for more consistent Jinja
compatibility by adding Pythonic APIs to the environment. While
nunjucks does not aim for complete Jinja/Python compatibility, this
might help users seeking just that.
This adds `True` and `False` which map to the JS `true` and `false`
values, allows use of Python slice syntax, and augments arrays and
objects with Python-style methods.
[Check out the source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/jinja-compat.js)
to see everything it adds.
{% endapi %}
{% raw %}
*That's it for the simple API! If you want total control over how
templates are loaded, and more customization, you need to manually
set up the system as seen below.*
## Environment
The `Environment` class is the central object which handles templates.
It knows how to load your templates, and internally templates depend
on it for inheritance and including templates. The simple API above
dispatches everything to an `Environment` instance that it keeps for
you.
You can manually handle it if you want, which allows you to specify
custom template loaders.
{% endraw %}
{% api %}
constructor
new Environment([loaders], [opts])
The constructor takes a list of **loaders** and a hash of
configuration parameters as **opts**. If **loaders** is null, it
defaults to loading from the current directory or URL. You can pass a
single loader or an array of loaders. If you pass an array of loaders,
nunjucks will walk through them in order until one of them finds a
template. See [`Loader`](#loader) for more info about loaders.
The available flags in **opts** is **autoescape**,
**throwOnUndefined**, **trimBlocks**, and **lstripBlocks**.
Read more about those options in [`configure`](#configure) (the
express and watch options are not applicable here and configured
elsewhere like [`env.express`](#express)).
In node, the [`FileSystemLoader`](#filesystemloader) is available to
load templates off the filesystem, and in the browser the [`WebLoader`](#webloader)
is available to load over HTTP (or use precompiled templates). If you
use the simple [`configure`](#configure) API, nunjucks automatically
creates the appropriate loader for you, depending if you're in node or
the browser. See [`Loader`](#loader) for more information.
Also only in node, [`NodeResolveLoader`](#noderesolveloader) is
provided to allow templates to be included using
[node `require` resolution](https://nodejs.org/api/modules.html#modules_all_together).
This is not enabled by default with [`configure`](#configure), it must be
explicitly passed into the `Environment` constructor.
```js
// the FileSystemLoader is available if in node
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'),
{ autoescape: false });
var env = new nunjucks.Environment([new nunjucks.FileSystemLoader('views'),
new MyCustomLoader()]);
// the WebLoader is available if in the browser
var env = new nunjucks.Environment(new nunjucks.WebLoader('/views'));
```
{% endapi %}
{% api %}
render
env.render(name, [context], [callback])
Render the template named **name** with the optional **context** hash.
If **callback** is supplied, call it when done with any errors and the
result (see [asynchronous support](#asynchronous-support)), otherwise
return the rendered string.
```js
var res = nunjucks.render('foo.html');
var res = nunjucks.render('foo.html', { username: 'James' });
nunjucks.render('async.html', function(err, res) {
});
```
{% endapi %}
{% api %}
renderString
env.renderString(src, [context], [callback])
Same as [`render`](#render1), but renders a raw string instead of
loading a template.
{% raw %}
```js
var res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });
```
{% endraw %}
{% endapi %}
{% api %}
addFilter
env.addFilter(name, func, [async])
Add a custom filter named **name** which calls **func** whenever
invoked. If the filter needs to be async, **async** must be `true`
(see [asynchronous support](#asynchronous-support)). Returns `env` for further method chaining. See
[Custom Filters](#custom-filters).
{% endapi %}
{% api %}
getFilter
env.getFilter(name)
Get the filter, which is just a function, named **name**.
{% endapi %}
{% api %}
addExtension
env.addExtension(name, ext)
Add the custom extension **ext** named **name**. **ext** is an object
with a few specific methods that are called by the extension system. Returns `env` for further method chaining.
See [Custom Tags](#custom-tags).
{% endapi %}
{% api %}
removeExtension
env.removeExtension(name)
Remove a previously added custom extension named **name**.
{% endapi %}
{% api %}
getExtension
env.getExtension(name)
Get an extension named **name**.
{% endapi %}
{% api %}
hasExtension
env.hasExtension(name)
Return true if a custom extension named **name** has been added.
{% endapi %}
{% api %}
addGlobal
env.addGlobal(name, value)
Add a global value that will be available to all templates. Note: this will overwrite any existing global called `name`.
Returns `env` for further method chaining.
{% endapi %}
{% api %}
getGlobal
env.getGlobal(name)
Get a global named **name**.
{% endapi %}
{% api %}
getTemplate
env.getTemplate(name, [eagerCompile], [callback])
Retrieve the template named **name**. If **eagerCompile** is `true`,
compile it now instead of on render. If **callback** is supplied, call
it with any errors and a template (if found), otherwise return
synchronously. If using any async loaders, you must use the async API.
The builtin loaders do not require this. See
[asynchronous support](#asynchronous-support) and [loaders](#loader).
```js
var tmpl = env.getTemplate('page.html');
var tmpl = env.getTemplate('page.html', true);
env.getTemplate('from-async-loader.html', function(err, tmpl) {
});
```
{% endapi %}
{% api %}
express
env.express(app)
Install nunjucks as the rendering engine for the express **app**.
After doing this, you can use express normally. Note that you can do
this automatically with the simple API call [`configure`](#configure)
by passing in the app as the **express** option. Returns `env` for further method chaining.
```js
var app = express();
env.express(app);
app.get('/', function(req, res) {
res.render('index.html');
});
```
{% endapi %}
{% api %}
opts.autoescape
env.opts.autoescape
You can use this boolean property to see if autoescaping is turned on
globally or not. This may be helpful in creating advanced filtering
that do HTML manipulation. Normally you should simply return a
SafeString (to be documented) if one was passed in, so the output will
copy the safeness of the input, but this property is helpful in rare
circumstances.
{% endapi %}
{% api %}
'load' event
env.on('load', function(name, source, loader))
The 'load' event gets emitted whenever a Loader retrieves the source of a
template. It can be listened to in order to determine template dependencies
at runtime. The arguments emitted to the callback are:
* **name** *(String)* The template name, as passed to the loader
* **source** *(Object)* The object that gets returned from Loader.getSource
* **src** *(String)* The template source
* **path** *(String)* The full path to the template
* **noCache** *(Bool)* If `true`, the template wasn't cached.
* **loader** The Loader instance that triggered the event.
{% endapi %}
{% raw %}
## Template
A `Template` is an object that handles the compiling of template
strings and rendering them. Usually the `Environment` handles them for
you, but you can easily use it yourself. If you don't connect a
template with an environment, you can't include or inherit any other
templates.
{% endraw %}
{% api %}
constructor
new Template(src, [env], [path], [eagerCompile])
The constructor takes a template string **src**, an optional
`Environment` instance **env** to use for loading other templates, a
string **path** describing the location/path for debugging purposes,
and a boolean **eagerCompile** which, if `true`, kicks off compilation
immediately instead of waiting until the template is rendered.
{% raw %}
```js
var tmpl = new nunjucks.Template('Hello {{ username }}');
tmpl.render({ username: "James" }); // -> "Hello James"
```
{% endraw %}
{% endapi %}
{% api %}
render
tmpl.render(context, [callback])
Renders the template with the optional **context** hash. If
**callback** is supplied, call it when done with any errors and the
result (see [asynchronous support](#asynchronous-support)), otherwise
return the rendered string.
{% endapi %}
{% raw %}
## Loader
A loader is an object that takes a template name and loads it from a
source, such as the filesystem or network. The following two builtin
loaders exist, each for different contexts.
{% endraw %}
{% api %}
FileSystemLoader
new FileSystemLoader([searchPaths], [opts])
This is only available to node. It will load templates from the
filesystem, using the **searchPaths** array as paths to look for
templates. **searchPaths** can also be a single path for where
templates live, and it defaults to the current working directory.
**opts** is an object with the following optional properties:
* **watch** - if `true`, the system will automatically update templates. To use watch, make sure optional dependency *chokidar* is installed.
when they are changed on the filesystem
* **noCache** - if `true`, the system will avoid using a cache and templates
will be recompiled every single time
```js
// Loads templates from the "views" folder
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));
```
{% endapi %}
{% api %}
NodeResolveLoader
new NodeResolveLoader([opts])
As the name suggests, this is also only available in node. It will load
templates from the filesystem using node's
[`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).
**opts** is an object which takes the same properties as
[`FileSystemLoader`](#filesystemloader).
{% endapi %}
{% api %}
WebLoader
new WebLoader([baseURL], [opts])
This is only available in the browser. **baseURL** is the URL to load
templates from (must be the same domain), and it defaults to the
current relative directory.
**opts** is an object with the following optional properties:
* **useCache** if `true`, templates will be forever cached and you
won't see updates to them. The cache is disabled by default
because there is no way to watch for changes and dirty the cache.
Remember, you should be precompiling your templates for production.
* **async** if `true`, templates will be loaded asynchronously instead
synchronously. You must use the asynchronous render API when using
this (pass a callback to `render`).
This loader also recognizes when precompiled templates are available
and automatically uses them instead of fetching over HTTP. In
production, this should always be the case. See
[Precompiling](#precompiling).
```js
// Load templates from /views
var env = new nunjucks.Environment(new nunjucks.WebLoader('/views'))
```
{% endapi %}
{% raw %}
### Writing a Loader
You can write loaders for more complex loading, like from a database.
If you want to do this, just create an object that has a method
`getSource(name)`, where **name** is the name of the template. That's it.
```js
function MyLoader(opts) {
// configuration
}
MyLoader.prototype.getSource = function(name) {
// load the template
// return an object with:
// - src: String. The template source.
// - path: String. Path to template.
// - noCache: Bool. Don't cache the template (optional).
}
```
It can get a little more complex. If you want to track updates to
templates and bust the internal cache so that you can see updates, you
need to extend the `Loader` class. This gives you `emit` method that
can fire events. You need to call it
```js
var MyLoader = nunjucks.Loader.extend({
init: function() {
// setup a process which watches templates here
// and call `this.emit('update', name)` when a template
// is changed
},
getSource: function(name) {
// load the template
}
});
```
#### Asynchronous
There's one last piece: asynchronous loaders. So far, all of the
loaders have been synchronous; `getSource` returns the source
immediately. The benefit of this is that the user isn't forced to use
the asynchronous API and be aware of edge cases about async templates.
You might want to load from a database, however.
Just add an `async: true` property to your loader and it will be used
asynchronously.
```js
var MyLoader = nunjucks.Loader.extend({
async: true,
getSource: function(name, callback) {
// load the template
// ...
callback(err, res);
}
});
```
Remember that you now have to use the asynchronous API. See
[asynchronous support](#asynchronous-support).
**Warning**: if you are using an asynchronous loader, you can't load
templates inside `for` loops. You need to explicitly use the
`asyncEach` tag if you need to load templates, which is exactly the
same as `for` but asynchronous. More info can be found at
[Be Careful!](#be-careful).
## Browser Usage
Using nunjucks in the browser takes a little more thought because you
care about load and compile time. On the server-side, templates are
compiled once and cached in memory and you never have to worry about
it. On the client-side however, you don't want to compile templates
even once, as it would result in slow page render time.
The solution is to precompile your templates into JavaScript, and load
them as a simple `.js` file on page load.
Maybe you do want to dynamically load templates while developing,
however, so that you can see changes immediately without recompiling.
Nunjucks tries to adapt to whatever workflow you want.
The only rule you must follow: **always precompile your templates in
production**. Why? Not only is it slow to compile all your templates
on page load, they are loaded *synchronously* over HTTP, blocking the
whole page. It is slow. It does this because nunjucks isn't async by
default.
### Recommended Setups
These are two of the most popular ways to set up nunjucks on the
client-side. Note that there are two different js files: one with the
compiler, nunjucks.js, and one without the compiler, nunjucks-slim.js.
Read [Getting Started](getting-started.html) for a brief overview of
the differences.
See [Precompiling](#precompiling) for information on precompiling
templates.
#### Setup #1: only precompile in production
This method will give you a setup that dynamically loads templates
while developing (you can see changes immediately), but uses
precompiled templates in production.
1. Load [nunjucks.js](files/nunjucks.js) with either a script tag or a module loader.
2. Render templates ([example](#simple-api))!
3. When pushing to production, [precompile](#precompiling) the templates into a js file
and load it on the page
> An optimization is to use `nunjucks-slim.js` instead of
> `nunjucks.js` in production since you are using precompiled
> templates there. It's 8K instead of 20K because it doesn't contain
> the compiler. This complicates the setup though because you are
> using different js files between dev and prod, so it may or may not
> be worth it.
#### Setup #2: always precompile
This method always uses precompiled templates while developing and in
production, which simplifies the setup. However, you're going to want
something that automatically recompiles templates while developing
unless you want to manually recompile them after every change.
1. For development, use the [grunt](https://github.com/jlongster/grunt-nunjucks) or
[gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks to watch your template
directory for changes and automatically [precompile](#precompiling) them into a js file
2. Load [nunjucks-slim.js](files/nunjucks-slim.js) and `templates.js`, or whatever you named
the precompiled js file, with either a script tag or a module loader.
3. Render templates ([example](#simple-api))!
With this method, there are no differences between development and
production code. Simply commit the templates.js file and deploy the
same code to production.
## Precompiling
To precompile your templates, use the `nunjucks-precompile` script
that comes with nunjucks. You can pass it a directory or a file and it
will generate all the JavaScript for your templates.
```
// Precompiling a whole directory
$ nunjucks-precompile views > templates.js
// Precompiling individual templates
$ nunjucks-precompile views/base.html >> templates.js
$ nunjucks-precompile views/index.html >> templates.js
$ nunjucks-precompile views/about.html >> templates.js
```
All you have to do is simply load `templates.js` on the page, and the
system will automatically use the precompiled templates. There are
zero changes necessary.
There are various options available to the script. Simply invoke
`nunjucks-precompile` to see more info about them. Note that **names
of all asynchronous filters need to passed to the script** since they
need to be known at compile-time. You can pass a comma-delimited list
of async filters with `-a`, like `-a foo,bar,baz`. If you only use
normal synchronous filters, you don't need to do anything.
Extensions cannot be specified with this script. You must use the
precompile API below if you use them.
### API
There is also an API if you want to programmatically precompile
templates. You'll want to do this if you use extensions or you use
asynchronous filters, both of which need to be known at compile-time.
You can pass an `Environment` object straight into the precompiler and
it will get the extensions and filters from it. You should share the
same `Environment` object between the client and server to keep
everything in sync.
{% endraw %}
{% api %}
precompile
nunjucks.precompile(path, [opts])
Precompile a file or directory at **path**. **opts** is a hash with any of the following options:
* **name**: name of the template, when compiling a string (required)
or a file (optional, defaults to **path**). names are
auto-generated when compiling a directory.
* **asFunction**: generate a callable function
* **force**: keep compiling on error
* **env**: the Environment to use (gets extensions and async filters from it)
* **include**: array of file/folders to include (folders are auto-included, files are auto-excluded)
* **exclude**: array of file/folders to exclude (folders are auto-included, files are auto-excluded)
* **wrapper**: `function(templates, opts)` Customize the output format of the precompiled templates. This function must return a string
* **templates**: array of objects with the following properties:
* **name**: name of the template
* **template**: string source of the precompiled template in javascript
* **opts**: object of all the above options
```js
var env = new nunjucks.Environment();
// extensions must be known at compile-time
env.addExtension('MyExtension', new MyExtension());
// async filters must be known at compile-time
env.addFilter('asyncFilter', function(val, cb) {
// do something
}, true);
nunjucks.precompile('/dir/to/views', { env: env });
```
{% endapi %}
{% api %}
precompileString
nunjucks.precompileString(str, [opts])
Exactly the same as [`precompile`](#precompile), but compiles a raw string.
{% endapi %}
{% raw %}
## Asynchronous Support
You only need to read this section if you are interested in
asynchronous rendering. There is no performance benefit to this, it is
solely to allow custom filters and extensions to make async calls. If
you don't care about this, you should simply use the normal API like
`var res = env.render('foo.html');`. There's no need to force the
`callback` on you, and it's why it's optional in all the rendering
functions.
As of version 1.0, nunjucks provides a way to render templates
asynchronously. This means that custom filters and extensions can do
stuff like fetch things from the database, and template rendering is
"paused" until the callback is called.
Template loaders can be async as well, allowing you to load templates
from a database or somewhere else. See
[Writing a Loader](#writing-a-loader). If you are using an async
template loader, you must use the async API. The builtin loaders that
load from the filesystem and over HTTP are synchronous, which is not a
performance problem because they are cached from the filesystem and
you should precompile your templates and never use HTTP in production.
If you are using anything async, you need to use the async API like this:
```js
nunjucks.render('foo.html', function(err, res) {
// check err and handle result
});
```
Read more about async [`filters`](#asynchronous1), [`extensions`](#asynchronous2), and
[`loaders`](#asynchronous).
### Be Careful!
Nunjucks is synchronous by default. Because of this, you need to
follow a few rules when writing asynchronous templates:
* Always use the async API. `render` should take a function that takes
a callback.
* Async filters and extensions need to be known at compile-time, so
you need to specify them explicitly when precompiling (see
[Precompiling](#precompiling)).
* If you are using a custom template loader that is asynchronous, you
can't include templates inside a `for` loop. This is because `for`
will compile to an imperative JavaScript `for` loop. You need to
explicitly use the async `asyncEach` tag to iterate, which is
exactly the same as `for` except asynchronous.
## Autoescaping
By default, nunjucks will escape all output. It's recommended
that you do this for security reasons. If you turn off autoescaping,
nunjucks will render all output as it is by default.
To deactivate it, all you have to do is pass the `autoescape` option as
`false` to the `Environment` object.
```js
var env = nunjucks.configure('/path/to/templates', { autoescape: false });
```
## Customizing Syntax
If you want different tokens than `{{` and the rest for variables,
blocks, and comments, you can specify different tokens as the `tags`
option:
```js
var env = nunjucks.configure('/path/to/templates', {
tags: {
blockStart: '<%',
blockEnd: '%>',
variableStart: '<$',
variableEnd: '$>',
commentStart: '<#',
commentEnd: '#>'
}
});
```
Using this environment, templates will look like this:
```
<ul>
<% for item in items %>
<li><$ item $></li>
<% endfor %>
</ul>
```
## Custom Filters
To install a custom filter, use the `Environment` method `addFilter`.
A filter is simply a function that takes the target object as the
first argument and any arguments passed to the filter as the other
arguments, in order.
```js
var nunjucks = require('nunjucks');
var env = new nunjucks.Environment();
env.addFilter('shorten', function(str, count) {
return str.slice(0, count || 5);
});
```
This adds a filter `shorten` which returns the first `count`
characters in a string, with `count` defaulting to 5. Here is how it
is used:
```jinja
{# Show the first 5 characters #}
A message for you: {{ message|shorten }}
{# Show the first 20 characters #}
A message for you: {{ message|shorten(20) }}
```
### Keyword/Default Arguments
As described in the
[templating section](templating#keyword-arguments), nunjucks supports
keyword/default arguments. You can write a normal javascript filter
that leverages them.
All keyword arguments are passed in as a hash as the last argument.
This is a filter `foo` that uses keyword arguments:
```js
env.addFilter('foo', function(num, x, y, kwargs) {
return num + (kwargs.bar || 10);
})
```
The template can use it like this:
```jinja
{{ 5 | foo(1, 2) }} -> 15
{{ 5 | foo(1, 2, bar=3) }} -> 8
```
You *must* pass all of the positional arguments before keyword
arguments (`foo(1)` is valid but `foo(1, bar=10)` is not). Also, you
cannot set a positional argument with a keyword argument like you can
in Python (such as `foo(1, y=1)`)
### Asynchronous
Asynchronous filters receive a callback to resume rendering, and are
created by passing `true` as the third argument to `addFilter`.
```js
var env = nunjucks.configure('views');
env.addFilter('lookup', function(name, callback) {
db.getItem(name, callback);
}, true);
env.renderString('{{ item|lookup }}', function(err, res) {
// do something with res
});
```
Make sure to call the callback with two arguments: `callback(err, res)`. `err` can be null, of course.
Note: When precompiling, **you must tell the precompiler the names of
all asynchronous filters**. See
[Precompiling](#precompiling).
## Custom Tags
You can create more complicated extensions by creating custom tags.
This exposes the parser API and allows you to do anything you want
with the template.
Note: When precompiling, **you must install the extensions at
compile-time**. You have to use the [precompiling API](#api1) (or the
[grunt](https://github.com/jlongster/grunt-nunjucks) or
[gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks) instead of
the script. You'll want to create an [`Environment`](#environment)
object, install your extensions, and pass it to the precompiler.
An extension is a javascript object with at least two fields: `tags`
and `parse`. Extensions basically register new tag names and take
control of the parser when they are hit.
`tags` is an array of tag names that the extension should handle.
`parse` is the method that actually parses them when the template is
compiled. Additionally, there is a special node type `CallExtension`
that you can use to call any method on your extension at runtime. This
is explained more below.
Because you have to interact directly with the parse API and construct
ASTs manually, this is a bit cumbersome. It's necessary if you want to
do really complex stuff, however. Here are a few key parser methods
you'll want to use:
* `parseSignature([throwErrors], [noParens])` - Parse a list of
arguments. By default it requires the parser to be pointing at the
left opening parenthesis, and parses up the right one. However, for
custom tags you shouldn't use parentheses, so passing `true` to the
second argument tells it to parse a list of arguments up until the
block end tag. A comma is required between arguments. Example: `{%
mytag foo, bar, baz=10 %}`
* `parseUntilBlocks(names)` - Parse content up until it hits a block
with a name in the `names` array. This is useful for parsing content
between tags.
The parser API needs to be more documented, but for now read the above
and check out the example below. You can also look at the
[source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/parser.js).
The most common usage is to process the content within some tags at
runtime. It's like filters, but on steroids because you aren't
confined to a single expression. You basically want to lightly parse
the template and then get a callback into your extension with the
content. This is done with the `CallExtension` node, which takes an
extension instance, the method to call, list of arguments parsed from
the tag, and a list of content blocks (parsed with
`parseUntilBlocks`).
For example, here's how you would implement an extension that fetches
content from a URL and injects it into the page:
```js
function RemoteExtension() {
this.tags = ['remote'];
this.parse = function(parser, nodes, lexer) {
// get the tag token
var tok = parser.nextToken();
// parse the args and move after the block end. passing true
// as the second arg is required if there are no parentheses
var args = parser.parseSignature(null, true);
parser.advanceAfterBlockEnd(tok.value);
// parse the body and possibly the error block, which is optional
var body = parser.parseUntilBlocks('error', 'endremote');
var errorBody = null;
if(parser.skipSymbol('error')) {
parser.skip(lexer.TOKEN_BLOCK_END);
errorBody = parser.parseUntilBlocks('endremote');
}
parser.advanceAfterBlockEnd();
// See above for notes about CallExtension
return new nodes.CallExtension(this, 'run', args, [body, errorBody]);
};
this.run = function(context, url, body, errorBody) {
var id = 'el' + Math.floor(Math.random() * 10000);
var ret = new nunjucks.runtime.SafeString('<div id="' + id + '">' + body() + '</div>');
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if(ajax.readyState == 4) {
if(ajax.status == 200) {
document.getElementById(id).innerHTML = ajax.responseText;
}
else {
document.getElementById(id).innerHTML = errorBody();
}
}
};
ajax.open('GET', url, true);
ajax.send();
return ret;
};
}
env.addExtension('RemoteExtension', new RemoteExtension());
```
Use it like this:
```jinja
{% remote "/stuff" %}
This content will be replaced with the content from /stuff
{% error %}
There was an error fetching /stuff
{% endremote %}
```
### Asynchronous
Another available node is `CallExtensionAsync` which is an
asynchronous version of `CallExtension`. It calls back into your
extension at runtime, with an additional parameter: a callback.
Template rendering is paused until you call the callback to resume.
The `run` function from the above example would now look like:
```js
this.run = function(context, url, body, errorBody, callback) {
// do async stuff and then call callback(err, res)
};
```
If you create anything interesting, make sure to
[add it to the wiki!](https://github.com/mozilla/nunjucks/wiki/Custom-Tags)
{% endraw %}
================================================
FILE: docs/bower_components/bootstrap/.bower.json
================================================
{
"name": "bootstrap",
"version": "3.0.0",
"main": [
"./dist/js/bootstrap.js",
"./dist/css/bootstrap.css"
],
"ignore": [
"**/.*"
],
"dependencies": {
"jquery": ">= 1.9.0"
},
"homepage": "https://github.com/twbs/bootstrap",
"_release": "3.0.0",
"_resolution": {
"type": "version",
"tag": "v3.0.0",
"commit": "e8a1df5f060bf7e6631554648e0abde150aedbe4"
},
"_source": "git://github.com/twbs/bootstrap.git",
"_target": "~3.0.0",
"_originalSource": "bootstrap",
"_direct": true
}
================================================
FILE: docs/bower_components/bootstrap/CNAME
================================================
getbootstrap.com
================================================
FILE: docs/bower_components/bootstrap/CONTRIBUTING.md
================================================
# Contributing to Bootstrap
Looking to contribute something to Bootstrap? **Here's how you can help.**
## Reporting issues
We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Bootstrap core. Please read the following guidelines before opening any issue.
1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available.
2. **Create an isolated and reproducible test case.** Be sure the problem exists in Bootstrap's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report.
3. **Include a live example.** Make use of jsFiddle or jsBin to share your isolated test cases.
4. **Share as much information as possible.** Include operating system and version, browser and version, version of Bootstrap, customized or vanilla build, etc. where appropriate. Also include steps to reproduce the bug.
## Key branches
- `master` is the latest, deployed version.
- `gh-pages` is the hosted docs (not to be used for pull requests).
- `*-wip` is the official work in progress branch for the next release.
## Pull requests
- Try to submit pull requests against the latest `*-wip` branch for easier merging
- CSS changes must be done in .less files first, never just the compiled files
- If modifying the .less files, always recompile and commit the compiled files bootstrap.css and bootstrap.min.css
- Try not to pollute your pull request with unintended changes--keep them simple and small
- Try to share which browsers your code has been tested in before submitting a pull request
## Coding standards
### HTML
- Two spaces for indentation, never tabs
- Double quotes only, never single quotes
- Always use proper indentation
- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags)
### CSS
- Adhere to the [Recess CSS property order](http://markdotto.com/2011/11/29/css-property-order/)
- Multiple-line approach (one property and value per line)
- Always a space after a property's colon (.e.g, `display: block;` and not `display:block;`)
- End all lines with a semi-colon
- For multiple, comma-separated selectors, place each selector on its own line
- Attribute selectors, like `input[type="text"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks).
### JS
- No semicolons
- Comma first
- 2 spaces (no tabs)
- strict mode
- "Attractive"
## License
By contributing your code, you agree to license your contribution under the terms of the APLv2: https://github.com/twbs/bootstrap/blob/master/LICENSE
================================================
FILE: docs/bower_components/bootstrap/Gruntfile.js
================================================
/* jshint node: true */
module.exports = function(grunt) {
"use strict";
// Project configuration.
grunt.initConfig({
// Metadata.
pkg: grunt.file.readJSON('package.json'),
banner: '/**\n' +
'* <%= pkg.name %>.js v<%= pkg.version %> by @fat and @mdo\n' +
'* Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
'* <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' +
'*/\n',
jqueryCheck: 'if (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n',
// Task configuration.
clean: {
dist: ['dist']
},
jshint: {
options: {
jshintrc: 'js/.jshintrc'
},
gruntfile: {
src: 'Gruntfile.js'
},
src: {
src: ['js/*.js']
},
test: {
src: ['js/tests/unit/*.js']
}
},
concat: {
options: {
banner: '<%= banner %><%= jqueryCheck %>',
stripBanners: false
},
bootstrap: {
src: [
'js/transition.js',
'js/alert.js',
'js/button.js',
'js/carousel.js',
'js/collapse.js',
'js/dropdown.js',
'js/modal.js',
'js/tooltip.js',
'js/popover.js',
'js/scrollspy.js',
'js/tab.js',
'js/affix.js'
],
dest: 'dist/js/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '<%= banner %>'
},
bootstrap: {
src: ['<%= concat.bootstrap.dest %>'],
dest: 'dist/js/<%= pkg.name %>.min.js'
}
},
recess: {
options: {
compile: true
},
bootstrap: {
src: ['less/bootstrap.less'],
dest: 'dist/css/<%= pkg.name %>.css'
},
min: {
options: {
compress: true
},
src: ['less/bootstrap.less'],
dest: 'dist/css/<%= pkg.name %>.min.css'
},
theme: {
src: ['less/theme.less'],
dest: 'dist/css/<%= pkg.name %>-theme.css'
},
theme_min: {
options: {
compress: true
},
src: ['less/theme.less'],
dest: 'dist/css/<%= pkg.name %>-theme.min.css'
}
},
copy: {
fonts: {
expand: true,
src: ["fonts/*"],
dest: 'dist/'
}
},
qunit: {
options: {
inject: 'js/tests/unit/phantom.js'
},
files: ['js/tests/*.html']
},
connect: {
server: {
options: {
port: 3000,
base: '.'
}
}
},
jekyll: {
docs: {}
},
validation: {
options: {
reset: true
},
files: {
src: ["_gh_pages/**/*.html"]
}
},
watch: {
src: {
files: '<%= jshint.src.src %>',
tasks: ['jshint:src', 'qunit']
},
test: {
files: '<%= jshint.test.src %>',
tasks: ['jshint:test', 'qunit']
},
recess: {
files: 'less/*.less',
tasks: ['recess']
}
}
});
// These plugins provide necessary tasks.
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-html-validation');
grunt.loadNpmTasks('grunt-jekyll');
grunt.loadNpmTasks('grunt-recess');
grunt.loadNpmTasks('browserstack-runner');
// Docs HTML validation task
grunt.registerTask('validate-html', ['jekyll', 'validation']);
// Test task.
var testSubtasks = ['dist-css', 'jshint', 'qunit', 'validate-html'];
// Only run BrowserStack tests under Travis
if (process.env.TRAVIS) {
// Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key
if ((process.env.TRAVIS_REPO_SLUG === 'twbs/bootstrap' && process.env.TRAVIS_PULL_REQUEST === 'false') || process.env.TWBS_HAVE_OWN_BROWSERSTACK_KEY) {
testSubtasks.push('browserstack_runner');
}
}
grunt.registerTask('test', testSubtasks);
// JS distribution task.
grunt.registerTask('dist-js', ['concat', 'uglify']);
// CSS distribution task.
grunt.registerTask('dist-css', ['recess']);
// Fonts distribution task.
grunt.registerTask('dist-fonts', ['copy']);
// Full distribution task.
grunt.registerTask('dist', ['clean', 'dist-css', 'dist-fonts', 'dist-js']);
// Default task.
grunt.registerTask('default', ['test', 'dist', 'build-customizer']);
// task for building customizer
grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () {
var fs = require('fs')
function getFiles(type) {
var files = {}
fs.readdirSync(type)
.filter(function (path) {
return type == 'fonts' ? true : new RegExp('\\.' + type + '$').test(path)
})
.forEach(function (path) {
return files[path] = fs.readFileSync(type + '/' + path, 'utf8')
})
return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'
}
var customize = fs.readFileSync('customize.html', 'utf-8')
var files = getFiles('js') + getFiles('less') + getFiles('fonts')
fs.writeFileSync('assets/js/raw-files.js', files)
});
};
================================================
FILE: docs/bower_components/bootstrap/LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
================================================
FILE: docs/bower_components/bootstrap/README.md
================================================
# [Bootstrap v3.0.0](http://getbootstrap.com) [](http://travis-ci.org/twbs/bootstrap)
Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat).
To get started, check out [http://getbootstrap.com](http://getbootstrap.com)!
## Quick start
Three quick start options are available:
* [Download the latest release](https://github.com/twbs/bootstrap/zipball/3.0.0-wip).
* Clone the repo: `git clone git://github.com/twbs/bootstrap.git`.
* Install with [Bower](http://bower.io): `bower install bootstrap`.
Read the [Getting Started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.
## Bugs and feature requests
Have a bug or a feature request? [Please open a new issue](https://github.com/twbs/bootstrap/issues). Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/).
You may use [this JS Bin](http://jsbin.com/aKiCIDO/1/edit) as a template for your bug reports.
## Documentation
Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at [http://getbootstrap.com](http://getbootstrap.com). The docs may also be run locally.
### Running documentation locally
1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x).
2. From the root `/bootstrap` directory, run `jekyll serve` in the command line.
- **Windows users:** run `chcp 65001` first to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors.
3. Open [http://localhost:9001](http://localhost:9001) in your browser, and voilà.
Learn more about using Jekyll by reading their [documentation](http://jekyllrb.com/docs/home/).
### Documentation for previous releases
Documentation for v2.3.2 has been made available for the time being at [http://getbootstrap.com/2.3.2/](http://getbootstrap.com/2.3.2/) while folks transition to Bootstrap 3.
[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.
## Compiling CSS and JavaScript
Bootstrap uses [Grunt](http://gruntjs.com/) with convenient methods for working with the framework. It's how we compile our code, run tests, and more. To use it, install the required dependencies as directed and then run some Grunt commands.
### Install Grunt
From the command line:
1. Install `grunt-cli` globally with `npm install -g grunt-cli`.
2. Install the [necessary local dependencies](package.json) via `npm install`
When completed, you'll be able to run the various Grunt commands provided from the command line.
**Unfamiliar with `npm`? Don't have node installed?** That's a-okay. npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding.
### Available Grunt commands
#### Build - `grunt`
Run `grunt` to run tests locally and compile the CSS and JavaScript into `/dist`. **Requires [recess](https://github.com/twitter/recess) and [uglify-js](https://github.com/mishoo/UglifyJS).**
#### Only compile CSS and JavaScript - `grunt dist`
`grunt dist` creates the `/dist` directory with compiled files. **Requires [recess](https://github.com/twitter/recess) and [uglify-js](https://github.com/mishoo/UglifyJS).**
#### Tests - `grunt test`
Runs jshint and qunit tests headlessly in [phantomjs](https://github.com/ariya/phantomjs/) (used for CI). **Requires [phantomjs](https://github.com/ariya/phantomjs/).**
#### Watch - `grunt watch`
This is a convenience method for watching just Less files and automatically building them whenever you save.
### Troubleshooting dependencies
Should you encounter problems with installing dependencies or running Grunt commands, uninstall all previous dependency versions (global and local). Then, rerun `npm install`.
## Contributing
Please read through our guidelines for contributing to Bootstrap. Included are directions for opening issues, coding standards, and notes on development.
More over, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo).
Editor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at [http://editorconfig.org](http://editorconfig.org).
## Community
Keep track of development and community news.
* Follow [@twbootstrap on Twitter](http://twitter.com/twbootstrap).
* Read and subscribe to the [The Official Bootstrap Blog](http://blog.getbootstrap.com).
* Have a question that's not a feature request or bug report? [Ask on the mailing list.](http://groups.google.com/group/twitter-bootstrap)
* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##twitter-bootstrap` channel.
## Versioning
For transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.
Releases will be numbered with the following format:
`<major>.<minor>.<patch>`
And constructed with the following guidelines:
* Breaking backward compatibility bumps the major (and resets the minor and patch)
* New additions without breaking backward compatibility bumps the minor (and resets the patch)
* Bug fixes and misc changes bumps the patch
For more information on SemVer, please visit [http://semver.org/](http://semver.org/).
## Authors
**Mark Otto**
+ [http://twitter.com/mdo](http://twitter.com/mdo)
+ [http://github.com/mdo](http://github.com/mdo)
**Jacob Thornton**
+ [http://twitter.com/fat](http://twitter.com/fat)
+ [http://github.com/fat](http://github.com/fat)
## Copyright and license
Copyright 2012 Twitter, Inc under [the Apache 2.0 license](LICENSE).
================================================
FILE: docs/bower_components/bootstrap/_config.yml
================================================
# Dependencies
markdown: rdiscount
pygments: true
# Permalinks
permalink: pretty
# Server
destination: ./_gh_pages
exclude: [".editorconfig", ".gitignore", ".ruby-version", "bower.json", "composer.json", "CONTRIBUTING.md", "CNAME", "LICENSE", "Gruntfile.js", "package.json", "node_modules", "README.md", "less"]
port: 9001
# Custom vars
repo: https://github.com/twbs/bootstrap
download: https://github.com/twbs/bootstrap/archive/v3.0.0.zip
download_dist: https://github.com/twbs/bootstrap/releases/download/v3.0.0/bootstrap-3.0.0-dist.zip
blog: http://blog.getbootstrap.com
expo: http://expo.getbootstrap.com
cdn_css: //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css
cdn_theme_css: //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css
cdn_js: //netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js
================================================
FILE: docs/bower_components/bootstrap/_includes/ads.html
================================================
<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script>var z = document.createElement("script"); z.async = true; z.src = "http://engine.carbonads.com/z/32341/azcarbon_2_1_0_HORIZ"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
================================================
FILE: docs/bower_components/bootstrap/_includes/footer.html
================================================
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="{{ page.base_url }}assets/js/jquery.js"></script>
<script src="{{ page.base_url }}dist/js/bootstrap.js"></script>
<script src="http://platform.twitter.com/widgets.js"></script>
<script src="{{ page.base_url }}assets/js/holder.js"></script>
<script src="{{ page.base_url }}assets/js/application.js"></script>
{% if page.slug == "customize" %}
<script src="{{ page.base_url }}assets/js/less.js"></script>
<script src="{{ page.base_url }}assets/js/jszip.js"></script>
<script src="{{ page.base_url }}assets/js/uglify.js"></script>
<script src="{{ page.base_url }}assets/js/filesaver.js"></script>
<script src="{{ page.base_url }}assets/js/raw-files.js"></script>
<script src="{{ page.base_url }}assets/js/customizer.js"></script>
{% endif %}
<!-- Analytics
================================================== -->
<script>
var _gauges = _gauges || [];
(function() {
var t = document.createElement('script');
t.async = true;
t.id = 'gauges-tracker';
t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
t.src = '//secure.gaug.es/track.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(t, s);
})();
</script>
================================================
FILE: docs/bower_components/bootstrap/_includes/header.html
================================================
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>
{% if page.title == "Bootstrap" %}
{{ page.title }}
{% else if %}
{{ page.title }} · Bootstrap
{% endif %}
</title>
<!-- Bootstrap core CSS -->
<link href="{{ page.base_url }}dist/css/bootstrap.css" rel="stylesheet">
<!-- Documentation extras -->
<link href="{{ page.base_url }}assets/css/docs.css" rel="stylesheet">
<link href="{{ page.base_url }}assets/css/pygments-manni.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="{{ page.base_url }}assets/js/html5shiv.js"></script>
<script src="{{ page.base_url }}assets/js/respond.min.js"></script>
<![endif]-->
<!-- Favicons -->
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ page.base_url }}assets/ico/apple-touch-icon-144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="{{ page.base_url }}assets/ico/apple-touch-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ page.base_url }}assets/ico/apple-touch-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed" href="{{ page.base_url }}assets/ico/apple-touch-icon-57-precomposed.png">
<link rel="shortcut icon" href="{{ page.base_url }}assets/ico/favicon.png">
<script>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-146052-10']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-components.html
================================================
<li>
<a href="#glyphicons">Glyphicons</a>
<ul class="nav">
<li><a href="#glyphicons-glyphs">Available glyphs</a></li>
<li><a href="#glyphicons-how-to-use">How to use</a></li>
<li><a href="#glyphicons-examples">Examples</a></li>
</ul>
</li>
<li>
<a href="#dropdowns">Dropdowns</a>
<ul class="nav">
<li><a href="#dropdowns-example">Example</a></li>
<li><a href="#dropdowns-alignment">Alignment options</a></li>
<li><a href="#dropdowns-headers">Headers</a></li>
<li><a href="#dropdowns-disabled">Disabled menu items</a></li>
</ul>
</li>
<li>
<a href="#btn-groups">Button groups</a>
<ul class="nav">
<li><a href="#btn-groups-single">Basic example</a></li>
<li><a href="#btn-groups-toolbar">Button toolbar</a></li>
<li><a href="#btn-groups-sizing">Sizing</a></li>
<li><a href="#btn-groups-nested">Nesting</a></li>
<li><a href="#btn-groups-vertical">Vertical variation</a></li>
<li><a href="#btn-groups-justified">Justified link variation</a></li>
</ul>
</li>
<li>
<a href="#btn-dropdowns">Button dropdowns</a>
<ul class="nav">
<li><a href="#btn-dropdowns-single">Single button dropdowns</a></li>
<li><a href="#btn-dropdowns-split">Split button dropdowns</a></li>
<li><a href="#btn-dropdowns-sizing">Sizing</a></li>
<li><a href="#btn-dropdowns-dropup">Dropup variation</a></li>
</ul>
</li>
<li>
<a href="#input-groups">Input groups</a>
<ul class="nav">
<li><a href="#input-groups-basic">Basic example</a></li>
<li><a href="#input-groups-sizing">Sizing</a></li>
<li><a href="#input-groups-checkboxes-radios">Checkbox and radios addons</a></li>
<li><a href="#input-groups-buttons">Button addons</a></li>
<li><a href="#input-groups-buttons-dropdowns">Buttons with dropdowns</a></li>
<li><a href="#input-groups-buttons-segmented">Segmented buttons</a></li>
</ul>
</li>
<li>
<a href="#nav">Navs</a>
<ul class="nav">
<li><a href="#nav-tabs">Tabs</a></li>
<li><a href="#nav-pills">Pills</a></li>
<li><a href="#nav-justified">Justified nav</a></li>
<li><a href="#nav-disabled-links">Disabled links</a></li>
<li><a href="#nav-alignment">Alignment options</a></li>
<li><a href="#nav-dropdowns">Using dropdowns</a></li>
</ul>
</li>
<li>
<a href="#navbar">Navbar</a>
<ul class="nav">
<li><a href="#navbar-default">Default navbar</a></li>
<li><a href="#navbar-buttons">Buttons</a></li>
<li><a href="#navbar-text">Text</a></li>
<li><a href="#navbar-links">Non-nav links</a></li>
<li><a href="#navbar-component-alignment">Component alignment</a></li>
<li><a href="#navbar-fixed-top">Fixed to top</a></li>
<li><a href="#navbar-fixed-bottom">Fixed to bottom</a></li>
<li><a href="#navbar-static-top">Static top</a></li>
<li><a href="#navbar-inverted">Inverted navbar</a></li>
</ul>
</li>
<li><a href="#breadcrumbs">Breadcrumbs</a></li>
<li>
<a href="#pagination">Pagination</a>
<ul class="nav">
<li><a href="#pagination-default">Default pagination</a></li>
<li><a href="#pagination-pager">Pager</a></li>
</ul>
</li>
<li><a href="#labels">Labels</a></li>
<li><a href="#badges">Badges</a></li>
<li><a href="#jumbotron">Jumbotron</a></li>
<li><a href="#page-header">Page header</a></li>
<li>
<a href="#thumbnails">Thumbnails</a>
<ul class="nav">
<li><a href="#thumbnails-default">Default example</a></li>
<li><a href="#thumbnails-custom-content">Custom content</a></li>
</ul>
</li>
<li>
<a href="#alerts">Alerts</a>
<ul class="nav">
<li><a href="#alerts-examples">Examples</a></li>
<li><a href="#alerts-dismissable">Dismissable alerts</a></li>
<li><a href="#alerts-links">Links in alerts</a></li>
</ul>
</li>
<li>
<a href="#progress">Progress bars</a>
<ul class="nav">
<li><a href="#progress-basic">Basic example</a></li>
<li><a href="#progress-alternatives">Contextual alternatives</a></li>
<li><a href="#progress-striped">Striped</a></li>
<li><a href="#progress-animated">Animated</a></li>
<li><a href="#progress-stacked">Stacked</a></li>
</ul>
</li>
<li>
<a href="#media">Media object</a>
<ul class="nav">
<li><a href="#media-default">Default media</a></li>
<li><a href="#media-list">Media list</a></li>
</ul>
</li>
<li>
<a href="#list-group">List group</a>
<ul class="nav">
<li><a href="#list-group-basic">Basic example</a></li>
<li><a href="#list-group-badges">Badges</a></li>
<li><a href="#list-group-linked">Linked items</a></li>
<li><a href="#list-group-custom-content">Custom content</a></li>
</ul>
</li>
<li>
<a href="#panels">Panels</a>
<ul class="nav">
<li><a href="#panels-basic">Basic example</a></li>
<li><a href="#panels-heading">Panel with heading</a></li>
<li><a href="#panels-alternatives">Contextual alternatives</a></li>
<li><a href="#panels-tables">With tables</a>
<li><a href="#panels-list-group">With list groups</a>
</ul>
</li>
<li><a href="#wells">Wells</a></li>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-css.html
================================================
<li>
<a href="#overview">Overview</a>
<ul class="nav">
<li><a href="#overview-doctype">HTML5 doctype</a></li>
<li><a href="#overview-mobile">Mobile first</a></li>
<li><a href="#overview-responsive-images">Responsive images</a></li>
<li><a href="#overview-type-links">Typography and links</a></li>
<li><a href="#overview-normalize">Normalize</a></li>
<li><a href="#overview-container">Containers</a></li>
</ul>
</li>
<li>
<a href="#grid">Grid system</a>
<ul class="nav">
<li><a href="#grid-media-queries">Media queries</a></li>
<li><a href="#grid-options">Grid options</a></li>
<li><a href="#grid-example-basic">Ex: Stacked-to-horizonal</a></li>
<li><a href="#grid-example-mixed">Ex: Mobile and desktops</a></li>
<li><a href="#grid-example-mixed-complete">Ex: Mobile, tablet, desktops</a></li>
<li><a href="#grid-responsive-resets">Responsive column resets</a></li>
<li><a href="#grid-offsetting">Offsetting columns</a></li>
<li><a href="#grid-nesting">Nesting columns</a></li>
<li><a href="#grid-column-ordering">Column ordering</a></li>
<li><a href="#grid-less">LESS mixins and variables</a></li>
</ul>
</li>
<li>
<a href="#type">Typography</a>
<ul class="nav">
<li><a href="#type-headings">Headings</a></li>
<li><a href="#type-body-copy">Body copy</a></li>
<li><a href="#type-emphasis">Emphasis</a></li>
<li><a href="#type-abbreviations">Abbreviations</a></li>
<li><a href="#type-addresses">Addresses</a></li>
<li><a href="#type-blockquotes">Blockquotes</a></li>
<li><a href="#type-lists">Lists</a></li>
</ul>
</li>
<li><a href="#code">Code</a></li>
<li>
<a href="#tables">Tables</a>
<ul class="nav">
<li><a href="#tables-example">Basic example</a></li>
<li><a href="#tables-striped">Striped rows</a></li>
<li><a href="#tables-bordered">Bordered table</a></li>
<li><a href="#tables-hover-rows">Hover rows</a></li>
<li><a href="#tables-condensed">Condensed table</a></li>
<li><a href="#tables-contextual-classes">Contextual classes</a></li>
<li><a href="#tables-responsive">Responsive tables</a></li>
</ul>
</li>
<li>
<a href="#forms">Forms</a>
<ul class="nav">
<li><a href="#forms-example">Basic example</a></li>
<li><a href="#forms-inline">Inline form</a></li>
<li><a href="#forms-horizontal">Horizontal form</a></li>
<li><a href="#forms-controls">Supported controls</a></li>
<li><a href="#forms-controls-static">Static control</a></li>
<li><a href="#forms-control-states">Control states</a></li>
<li><a href="#forms-control-sizes">Control sizing</a></li>
<li><a href="#forms-help-text">Help text</a></li>
</ul>
</li>
<li>
<a href="#buttons">Buttons</a>
<ul class="nav">
<li><a href="#buttons-options">Options</a></li>
<li><a href="#buttons-sizes">Sizes</a></li>
<li><a href="#buttons-disabled">Disabled state</a></li>
<li><a href="#buttons-tags">Button tags</a></li>
</ul>
</li>
<li>
<a href="#images">Images</a>
</li>
<li>
<a href="#helper-classes">Helper classes</a>
</li>
<li>
<a href="#responsive-utilities">Responsive utilities</a>
<ul class="nav">
<li><a href="#responsive-utilities-classes">Available classes</a></li>
<li><a href="#responsive-utilities-print">Print classes</a></li>
<li><a href="#responsive-utilities-tests">Test cases</a></li>
</ul>
</li>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-customize.html
================================================
<li>
<a href="#less">LESS components</a>
</li>
<li>
<a href="#plugins">jQuery plugins</a>
</li>
<li>
<a href="#less-variables">LESS variables</a>
<ul class="nav">
<li><a href="#variables-basics">Basics</a></li>
<li><a href="#variables-buttons">Buttons</a></li>
<li><a href="#variables-form-states">Form states</a></li>
<li><a href="#variables-alerts">Alerts</a></li>
<li><a href="#variables-navbar">Navbar</a></li>
<li><a href="#variables-nav">Nav</a></li>
<li><a href="#variables-tables">Tables</a></li>
<li><a href="#variables-forms">Forms</a></li>
<li><a href="#variables-dropdowns">Dropdowns</a></li>
<li><a href="#variables-panels-wells">Panels and wells</a></li>
<li><a href="#variables-accordion">Accordion</a></li>
<li><a href="#variables-badges">Badges</a></li>
<li><a href="#variables-breadcrumbs">Breadcrumbs</a></li>
<li><a href="#variables-jumbotron">Jumbotron</a></li>
<li><a href="#variables-modals">Modals</a></li>
<li><a href="#variables-carousel">Carousel</a></li>
<li><a href="#variables-list-group">List group</a></li>
<li><a href="#variables-thumbnails">Thumbnails</a></li>
<li><a href="#variables-progress">Progress bars</a></li>
<li><a href="#variables-pagination">Pagination</a></li>
<li><a href="#variables-pager">Pager</a></li>
<li><a href="#variables-labels">Labels</a></li>
<li><a href="#variables-tooltips-popovers">Tooltips and popovers</a></li>
<li><a href="#variables-close">Close button</a></li>
<li><a href="#variables-type">Type</a></li>
<li><a href="#variables-other">Other</a></li>
</ul>
</li>
<li>
<a href="#download">Download</a>
</li>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-getting-started.html
================================================
<li>
<a href="#download">Download Bootstrap</a>
<ul class="nav">
<li><a href="#download-compiled">Compiled CSS, JS, and fonts</a></li>
<li><a href="#download-additional">Additional downloads</a></li>
<li><a href="#download-cdn">Bootstrap CDN</a></li>
</ul>
</li>
<li>
<a href="#whats-included">What's included</a>
</li>
<li>
<a href="#template">Basic template</a>
</li>
<li>
<a href="#examples">Examples</a>
</li>
<li>
<a href="#disable-responsive">Disabling responsiveness</a>
</li>
<li>
<a href="#migration">Migrating from 2.x to 3.0</a>
<ul class="nav">
<li><a href="#migration-classes">Major class changes</a></li>
<li><a href="#migration-new">What's new</a></li>
<li><a href="#migration-dropped">What's removed</a></li>
<li><a href="#migration-notes">Additional notes</a></li>
</ul>
</li>
<li>
<a href="#browsers">Browser support</a>
</li>
<li>
<a href="#third-parties">Third party support</a>
</li>
<li>
<a href="#accessibility">Accessibility</a>
</li>
<li>
<a href="#license-faqs">License FAQs</a>
</li>
<li>
<a href="#customizing">Customizing Bootstrap</a>
</li>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-javascript.html
================================================
<li>
<a href="#js-overview">Overview</a>
<ul class="nav">
<li><a href="#js-individual-compiled">Individual or compiled</a></li>
<li><a href="#js-data-attrs">Data attributes</a></li>
<li><a href="#js-programmatic-api">Programmatic API</a></li>
<li><a href="#js-noconflict">No conflict</a></li>
<li><a href="#js-events">Events</a></li>
</ul>
</li>
<li><a href="#transitions">Transitions</a></li>
<li>
<a href="#modals">Modal</a>
<ul class="nav">
<li><a href="#modals-examples">Examples</a></li>
<li><a href="#modals-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#dropdowns">Dropdown</a>
<ul class="nav">
<li><a href="#dropdowns-examples">Examples</a></li>
<li><a href="#dropdowns-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#scrollspy">Scrollspy</a>
<ul class="nav">
<li><a href="#scrollspy-examples">Examples</a></li>
<li><a href="#scrollspy-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#tabs">Tab</a>
<ul class="nav">
<li><a href="#tabs-examples">Examples</a></li>
<li><a href="#tabs-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#tooltips">Tooltip</a>
<ul class="nav">
<li><a href="#tooltips-examples">Examples</a></li>
<li><a href="#tooltips-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#popovers">Popover</a>
<ul class="nav">
<li><a href="#popovers-examples">Examples</a></li>
<li><a href="#popovers-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#alerts">Alert</a>
<ul class="nav">
<li><a href="#alerts-examples">Examples</a></li>
<li><a href="#alerts-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#buttons">Button</a>
<ul class="nav">
<li><a href="#buttons-examples">Examples</a></li>
<li><a href="#buttons-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#collapse">Collapse</a>
<ul class="nav">
<li><a href="#collapse-examples">Examples</a></li>
<li><a href="#collapse-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#carousel">Carousel</a>
<ul class="nav">
<li><a href="#carousel-examples">Examples</a></li>
<li><a href="#carousel-usage">Usage</a></li>
</ul>
</li>
<li>
<a href="#affix">Affix</a>
<ul class="nav">
<li><a href="#affix-examples">Examples</a></li>
<li><a href="#affix-usage">Usage</a></li>
</ul>
</li>
================================================
FILE: docs/bower_components/bootstrap/_includes/nav-main.html
================================================
<header class="navbar navbar-inverse navbar-fixed-top bs-docs-nav" role="banner">
<div class="container">
<div class="navbar-header">
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="{{ page.base_url }}" class="navbar-brand">Bootstrap</a>
</div>
<nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
<ul class="nav navbar-nav">
<li{% if page.slug == "getting-started" %} class="active"{% endif %}>
<a href="{{ page.base_url }}getting-started">Getting started</a>
</li>
<li{% if page.slug == "css" %} class="active"{% endif %}>
<a href="{{ page.base_url }}css">CSS</a>
</li>
<li{% if page.slug == "components" %} class="active"{% endif %}>
<a href="{{ page.base_url }}components">Components</a>
</li>
<li{% if page.slug == "js" %} class="active"{% endif %}>
<a href="{{ page.base_url }}javascript">JavaScript</a>
</li>
<li{% if page.slug == "customize" %} class="active"{% endif %}>
<a href="{{ page.base_url }}customize">Customize</a>
</li>
</ul>
</nav>
</div>
</header>
================================================
FILE: docs/bower_components/bootstrap/_includes/old-bs-docs.html
================================================
<div class="bs-old-docs">
<div class="container">
<strong>
<a href="{{ page.base_url }}2.3.2/">Looking for Bootstrap 2.3.2 docs?</a>
</strong>
We've moved it to a new home while we push forward with Bootstrap 3. <a href="http://blog.getbootstrap.com/">Read the blog</a> for details.
</div>
</div>
================================================
FILE: docs/bower_components/bootstrap/_includes/social-buttons.html
================================================
<div class="bs-social">
<ul class="bs-social-buttons">
<li>
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=twbs&repo=bootstrap&type=watch&count=true" width="100" height="20" title="Star on GitHub"></iframe>
</li>
<li>
<iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=twbs&repo=bootstrap&type=fork&count=true" width="102" height="20" title="Fork on GitHub"></iframe>
</li>
<li class="follow-btn">
<a href="https://twitter.com/twbootstrap" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">Follow @twbootstrap</a>
</li>
<li class="tweet-btn">
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://getbootstrap.com/" data-count="horizontal" data-via="twbootstrap" data-related="mdo:Creator of Twitter Bootstrap">Tweet</a>
</li>
</ul>
</div>
================================================
FILE: docs/bower_components/bootstrap/_layouts/default.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Meta, title, CSS, favicons, etc. -->
{% include header.html %}
<!-- Place anything custom after this. -->
</head>
<body>
<a class="sr-only" href="#content">Skip navigation</a>
<!-- Docs master nav -->
{% include nav-main.html %}
<!-- Docs page layout -->
<div class="bs-header" id="content">
<div class="container">
<h1>{{ page.title }}</h1>
<p>{{ page.lead }}</p>
{% include ads.html %}
</div>
</div>
<!-- Callout for the old docs link -->
{% include old-bs-docs.html %}
<div class="container bs-docs-container">
<div class="row">
<div class="col-md-3">
<div class="bs-sidebar hidden-print" role="complementary">
<ul class="nav bs-sidenav">
{% if page.slug == "getting-started" %}
{% include nav-getting-started.html %}
{% elsif page.slug == "css" %}
{% include nav-css.html %}
{% elsif page.slug == "components" %}
{% include nav-components.html %}
{% elsif page.slug == "js" %}
{% include nav-javascript.html %}
{% elsif page.slug == "customize" %}
{% include nav-customize.html %}
{% endif %}
</ul>
</div>
</div>
<div class="col-md-9" role="main">
{{ content }}
</div>
</div>
</div>
<!-- Footer
================================================== -->
<footer class="bs-footer" role="contentinfo">
<div class="container">
{% include social-buttons.html %}
<p>Designed and built with all the love in the world by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
<p>Code licensed under <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
<ul class="footer-links">
<li><a href="{{ page.base_url }}2.3.2/">Bootstrap 2.3.2 docs</a></li>
<li class="muted">·</li>
<li><a href="{{ site.blog }}">Blog</a></li>
<li class="muted">·</li>
<li><a href="{{ site.repo }}/issues?state=open">Issues</a></li>
<li class="muted">·</li>
<li><a href="{{ site.repo }}/releases">Releases</a></li>
</ul>
</div>
</footer>
<!-- JS and analytics only. -->
{% include footer.html %}
</body>
</html>
================================================
FILE: docs/bower_components/bootstrap/_layouts/home.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Meta, title, CSS, favicons, etc. -->
{% include header.html %}
<!-- Place anything custom after this. -->
</head>
<body class="bs-docs-home">
<a class="sr-only" href="#content">Skip navigation</a>
<!-- Docs master nav -->
{% include nav-main.html %}
<!-- Page content of course! -->
{{ content }}
<footer class="container" role="contentinfo">
{% include social-buttons.html %}
<ul class="bs-masthead-links">
<li class="current-version">
Currently v3.0.0
</li>
<li>
<a href="{{ page.base_url }}2.3.2/">Bootstrap 2.3.2 docs</a>
</li>
<li>
<a href="{{ site.repo }}" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'GitHub project']);">GitHub project</a>
</li>
<li>
<a href="{{ page.base_url }}getting-started/#examples" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Examples']);">Examples</a>
</li>
<li>
<a href="{{ page.base_url }}components/#glyphicons" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Glyphicons']);">Glyphicons</a>
</li>
<li>
<a href="{{ site.expo }}" onclick="_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Expo']);">Expo</a>
</li>
</ul>
</footer>
<!-- JS and analytics only. -->
{% include footer.html %}
</body>
</html>
================================================
FILE: docs/bower_components/bootstrap/assets/css/docs.css
================================================
/*
* Bootstrap Documentation
* Special styles for presenting Bootstrap's documentation and code examples.
*
* Table of contents:
*
* Scaffolding
* Main navigation
* Footer
* Social buttons
* Homepage
* Page headers
* Old docs callout
* Ads
* Side navigation
* Docs sections
* Callouts
* Grid styles
* Examples
* Code snippets (highlight)
* Responsive tests
* Glyphicons
* Customizer
* Miscellaneous
*/
/*
* Scaffolding
*
* Update the basics of our documents to prep for docs content.
*/
body {
position: relative; /* For scrollyspy */
padding-top: 50px; /* Account for fixed navbar */
}
/* Keep code small in tables on account of limited space */
.table code {
font-size: 13px;
font-weight: normal;
}
/* Outline button for use within the docs */
.btn-outline {
color: #563d7c;
background-color: #fff;
border-color: #e5e5e5;
}
.btn-outline:hover,
.btn-outline:focus,
.btn-outline:active {
color: #fff;
background-color: #563d7c;
border-color: #563d7c;
}
/* Inverted outline button (white on dark) */
.btn-outline-inverse {
color: #fff;
background-color: transparent;
border-color: #cdbfe3;
}
.btn-outline-inverse:hover,
.btn-outline-inverse:focus,
.btn-outline-inverse:active {
color: #563d7c;
text-shadow: none;
background-color: #fff;
border-color: #fff;
}
/*
* Main navigation
*
* Turn the `.navbar` at the top of the docs purple.
*/
.bs-docs-nav {
text-shadow: 0 -1px 0 rgba(0,0,0,.15);
background-color: #563d7c;
border-color: #463265;
box-shadow: 0 1px 0 rgba(255,255,255,.1);
}
.bs-docs-nav .navbar-collapse {
border-color: #463265;
}
.bs-docs-nav .navbar-brand {
color: #fff;
}
.bs-docs-nav .navbar-nav > li > a {
color: #cdbfe3;
}
.bs-docs-nav .navbar-nav > li > a:hover {
color: #fff;
}
.bs-docs-nav .navbar-nav > .active > a,
.bs-docs-nav .navbar-nav > .active > a:hover {
color: #fff;
background-color: #463265;
}
.bs-docs-nav .navbar-toggle {
border-color: #563d7c;
}
.bs-docs-nav .navbar-toggle:hover {
background-color: #463265;
border-color: #463265;
}
/*
* Footer
*
* Separated section of content at the bottom of all pages, save the homepage.
*/
.bs-footer {
padding-top: 40px;
padding-bottom: 30px;
margin-top: 100px;
color: #777;
text-align: center;
border-top: 1px solid #e5e5e5;
}
.footer-links {
margin: 10px 0;
padding-left: 0;
}
.footer-links li {
display: inline;
padding: 0 2px;
}
.footer-links li:first-child {
padding-left: 0;
}
@media (min-width: 768px) {
.bs-footer {
text-align: left;
}
.bs-footer p {
margin-bottom: 0;
}
}
/*
* Social buttons
*
* Twitter and GitHub social action buttons (for homepage and footer).
*/
.bs-social {
margin-top: 20px;
margin-bottom: 20px;
text-align: center;
}
.bs-social-buttons {
display: inline-block;
margin-bottom: 0;
padding-left: 0;
list-style: none;
}
.bs-social-buttons li {
display: inline-block;
line-height: 1;
padding: 5px 8px;
}
.bs-social-buttons .twitter-follow-button {
width: 225px !important;
}
.bs-social-buttons .twitter-share-button {
width: 98px !important;
}
/* Style the GitHub buttons via CSS instead of inline attributes */
.github-btn {
border: 0;
overflow: hidden;
}
@media screen and (min-width: 768px) {
.bs-social {
text-align: left;
}
.bs-social-buttons li:first-child {
padding-left: 0;
}
}
/*
* Topography, yo!
*
* Apply the map background via base64 and relevant colors where we need 'em.
*/
.bs-docs-home,
.bs-header {
color: #cdbfe3;
background-color: #563d7c;
background-image: url(data:image/png;base64,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
gitextract_d6mkhpa4/
├── .babelrc
├── .gitattributes
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ └── tests.yml
├── .gitignore
├── .npmignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTENANCE.md
├── README.md
├── bench/
│ ├── case.html
│ ├── index.html
│ ├── jinja/
│ │ ├── index.html
│ │ └── jinja.py
│ └── run.js
├── bin/
│ ├── precompile
│ └── precompile.cmd
├── bower.json
├── codecov.yml
├── contribute.json
├── docs/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── _config-prod.yml
│ ├── _config.yml
│ ├── _layouts/
│ │ ├── page.html
│ │ └── subpage.html
│ ├── _plugins/
│ │ ├── api.rb
│ │ ├── cleanup.rb
│ │ ├── locale.rb
│ │ └── page_toc.rb
│ ├── api.md
│ ├── bower_components/
│ │ ├── bootstrap/
│ │ │ ├── .bower.json
│ │ │ ├── CNAME
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── Gruntfile.js
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── _config.yml
│ │ │ ├── _includes/
│ │ │ │ ├── ads.html
│ │ │ │ ├── footer.html
│ │ │ │ ├── header.html
│ │ │ │ ├── nav-components.html
│ │ │ │ ├── nav-css.html
│ │ │ │ ├── nav-customize.html
│ │ │ │ ├── nav-getting-started.html
│ │ │ │ ├── nav-javascript.html
│ │ │ │ ├── nav-main.html
│ │ │ │ ├── old-bs-docs.html
│ │ │ │ └── social-buttons.html
│ │ │ ├── _layouts/
│ │ │ │ ├── default.html
│ │ │ │ └── home.html
│ │ │ ├── assets/
│ │ │ │ ├── css/
│ │ │ │ │ ├── docs.css
│ │ │ │ │ └── pygments-manni.css
│ │ │ │ └── js/
│ │ │ │ ├── application.js
│ │ │ │ ├── customizer.js
│ │ │ │ ├── filesaver.js
│ │ │ │ ├── holder.js
│ │ │ │ ├── html5shiv.js
│ │ │ │ ├── jquery.js
│ │ │ │ ├── jszip.js
│ │ │ │ ├── less.js
│ │ │ │ ├── raw-files.js
│ │ │ │ └── uglify.js
│ │ │ ├── bower.json
│ │ │ ├── browserstack.json
│ │ │ ├── composer.json
│ │ │ ├── dist/
│ │ │ │ ├── css/
│ │ │ │ │ ├── bootstrap-theme.css
│ │ │ │ │ └── bootstrap.css
│ │ │ │ └── js/
│ │ │ │ └── bootstrap.js
│ │ │ ├── examples/
│ │ │ │ ├── carousel/
│ │ │ │ │ ├── carousel.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── grid/
│ │ │ │ │ ├── grid.css
│ │ │ │ │ └── index.html
│ │ │ │ ├── jumbotron/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── jumbotron.css
│ │ │ │ ├── jumbotron-narrow/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── jumbotron-narrow.css
│ │ │ │ ├── justified-nav/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── justified-nav.css
│ │ │ │ ├── navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar.css
│ │ │ │ ├── navbar-fixed-top/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar-fixed-top.css
│ │ │ │ ├── navbar-static-top/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── navbar-static-top.css
│ │ │ │ ├── non-responsive/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── non-responsive.css
│ │ │ │ ├── offcanvas/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── offcanvas.css
│ │ │ │ │ └── offcanvas.js
│ │ │ │ ├── signin/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── signin.css
│ │ │ │ ├── starter-template/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── starter-template.css
│ │ │ │ ├── sticky-footer/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer.css
│ │ │ │ ├── sticky-footer-navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer-navbar.css
│ │ │ │ └── theme/
│ │ │ │ ├── index.html
│ │ │ │ └── theme.css
│ │ │ ├── js/
│ │ │ │ ├── .jshintrc
│ │ │ │ ├── affix.js
│ │ │ │ ├── alert.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── tests/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── phantom.js
│ │ │ │ │ ├── server.js
│ │ │ │ │ ├── unit/
│ │ │ │ │ │ ├── affix.js
│ │ │ │ │ │ ├── alert.js
│ │ │ │ │ │ ├── button.js
│ │ │ │ │ │ ├── carousel.js
│ │ │ │ │ │ ├── collapse.js
│ │ │ │ │ │ ├── dropdown.js
│ │ │ │ │ │ ├── modal.js
│ │ │ │ │ │ ├── phantom.js
│ │ │ │ │ │ ├── popover.js
│ │ │ │ │ │ ├── scrollspy.js
│ │ │ │ │ │ ├── tab.js
│ │ │ │ │ │ ├── tooltip.js
│ │ │ │ │ │ └── transition.js
│ │ │ │ │ └── vendor/
│ │ │ │ │ ├── jquery.js
│ │ │ │ │ ├── qunit.css
│ │ │ │ │ └── qunit.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── transition.js
│ │ │ ├── less/
│ │ │ │ ├── alerts.less
│ │ │ │ ├── badges.less
│ │ │ │ ├── bootstrap.less
│ │ │ │ ├── breadcrumbs.less
│ │ │ │ ├── button-groups.less
│ │ │ │ ├── buttons.less
│ │ │ │ ├── carousel.less
│ │ │ │ ├── close.less
│ │ │ │ ├── code.less
│ │ │ │ ├── component-animations.less
│ │ │ │ ├── dropdowns.less
│ │ │ │ ├── forms.less
│ │ │ │ ├── glyphicons.less
│ │ │ │ ├── grid.less
│ │ │ │ ├── input-groups.less
│ │ │ │ ├── jumbotron.less
│ │ │ │ ├── labels.less
│ │ │ │ ├── list-group.less
│ │ │ │ ├── media.less
│ │ │ │ ├── mixins.less
│ │ │ │ ├── modals.less
│ │ │ │ ├── navbar.less
│ │ │ │ ├── navs.less
│ │ │ │ ├── normalize.less
│ │ │ │ ├── pager.less
│ │ │ │ ├── pagination.less
│ │ │ │ ├── panels.less
│ │ │ │ ├── popovers.less
│ │ │ │ ├── print.less
│ │ │ │ ├── progress-bars.less
│ │ │ │ ├── responsive-utilities.less
│ │ │ │ ├── scaffolding.less
│ │ │ │ ├── tables.less
│ │ │ │ ├── theme.less
│ │ │ │ ├── thumbnails.less
│ │ │ │ ├── tooltip.less
│ │ │ │ ├── type.less
│ │ │ │ ├── utilities.less
│ │ │ │ ├── variables.less
│ │ │ │ └── wells.less
│ │ │ └── package.json
│ │ └── jquery/
│ │ ├── .bower.json
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── bower.json
│ │ ├── component.json
│ │ ├── composer.json
│ │ ├── jquery-migrate.js
│ │ ├── jquery.js
│ │ └── package.json
│ ├── cn/
│ │ ├── api.md
│ │ ├── faq.md
│ │ ├── getting-started.md
│ │ └── templating.md
│ ├── css/
│ │ ├── app.css
│ │ └── highlight.css
│ ├── faq.md
│ ├── fr/
│ │ ├── api.md
│ │ ├── faq.md
│ │ ├── getting-started.md
│ │ └── templating.md
│ ├── getting-started.md
│ ├── index.html
│ ├── js/
│ │ ├── app.js
│ │ └── subpage.js
│ └── templating.md
├── eslint.config.js
├── nunjucks/
│ ├── index.js
│ └── src/
│ ├── compiler.js
│ ├── environment.js
│ ├── express-app.js
│ ├── filters.js
│ ├── globals.js
│ ├── jinja-compat.js
│ ├── lexer.js
│ ├── lib.js
│ ├── loader.js
│ ├── loaders.js
│ ├── node-loaders.js
│ ├── nodes.js
│ ├── object.js
│ ├── parser.js
│ ├── precompile-global.js
│ ├── precompile.js
│ ├── precompiled-loader.js
│ ├── runtime.js
│ ├── tests.js
│ ├── transformer.js
│ └── web-loaders.js
├── package.json
├── samples/
│ └── express/
│ ├── js/
│ │ ├── app.js
│ │ └── extensions.js
│ ├── main.js
│ ├── pre.js
│ └── views/
│ ├── about.html
│ ├── base.html
│ ├── import-context-set.html
│ ├── index.html
│ ├── item-base.html
│ ├── item.html
│ └── set.html
├── scripts/
│ ├── bundle.js
│ ├── lib/
│ │ ├── is-main-module.js
│ │ ├── mocha-phantomjs.js
│ │ ├── precompile.js
│ │ ├── runtests.js
│ │ ├── static-server.js
│ │ └── utils.js
│ └── testrunner.js
└── tests/
├── api.js
├── browser/
│ ├── index.html
│ └── slim.html
├── cli.js
├── compiler.js
├── core.js
├── eslint.config.js
├── express.js
├── filters.js
├── globals.js
├── jinja-compat.js
├── lexer.js
├── loader.js
├── parser.js
├── precompile.js
├── runtime.js
├── setup.js
├── templates/
│ ├── async.njk
│ ├── base-inherit.njk
│ ├── base-set-and-show.njk
│ ├── base-set-inside-block.njk
│ ├── base-set-wraps-block.njk
│ ├── base-set.njk
│ ├── base-show.njk
│ ├── base.njk
│ ├── base2.njk
│ ├── base3.njk
│ ├── broken-conditional-include.njk
│ ├── broken-import.njk
│ ├── filter-block.html
│ ├── for-async-content.njk
│ ├── import-context-set.njk
│ ├── import-context.njk
│ ├── import-macro-call-undefined-macro.njk
│ ├── import.njk
│ ├── include-in-loop.njk
│ ├── include-set.njk
│ ├── include.njk
│ ├── includeMany.njk
│ ├── item.njk
│ ├── macro-call-undefined-macro.njk
│ ├── relative/
│ │ ├── dir1/
│ │ │ ├── index.njk
│ │ │ └── macros.njk
│ │ ├── dir2/
│ │ │ ├── index.njk
│ │ │ └── macros.njk
│ │ ├── test-cache.njk
│ │ ├── test1.njk
│ │ └── test2.njk
│ ├── set.njk
│ ├── simple-base.njk
│ ├── throws.njk
│ └── undefined-macro.njk
├── test-node-pkgs/
│ └── dummy-pkg/
│ ├── index.js
│ ├── package.json
│ └── simple-template.html
├── tests.js
└── util.js
SYMBOL INDEX (827 symbols across 60 files)
FILE: docs/_plugins/api.rb
type Jekyll (line 4) | module Jekyll
class ApiTag (line 5) | class ApiTag < Liquid::Block
method add_code_tags (line 7) | def add_code_tags(code, lang)
method block_code (line 12) | def block_code(code, lang)
method render (line 20) | def render(context)
FILE: docs/_plugins/cleanup.rb
type Jekyll (line 2) | module Jekyll
type Converters (line 3) | module Converters
class Markdown (line 4) | class Markdown
method convert (line 5) | def convert(content)
FILE: docs/_plugins/locale.rb
type Jekyll (line 3) | module Jekyll
type LocaleFilter (line 4) | module LocaleFilter
function locale_buttons (line 6) | def locale_buttons(url, baseurl)
FILE: docs/_plugins/page_toc.rb
type Jekyll (line 3) | module Jekyll
class PageTocTag (line 4) | class PageTocTag < Liquid::Tag
method initialize (line 5) | def initialize(tag_name, args, tokens)
method render (line 7) | def render(context)
FILE: docs/bower_components/bootstrap/Gruntfile.js
function getFiles (line 201) | function getFiles(type) {
FILE: docs/bower_components/bootstrap/assets/js/customizer.js
function showError (line 4) | function showError(msg, err) {
function showCallout (line 15) | function showCallout(msg, showUpTop) {
function getQueryParam (line 28) | function getQueryParam(key) {
function createGist (line 34) | function createGist(configData) {
function getCustomizerData (line 58) | function getCustomizerData() {
function parseUrl (line 77) | function parseUrl() {
function generateZip (line 110) | function generateZip(css, js, fonts, complete) {
function generateCustomCSS (line 141) | function generateCustomCSS(vars) {
function generateFonts (line 151) | function generateFonts() {
function generateCSS (line 158) | function generateCSS() {
function generateJavascript (line 205) | function generateJavascript() {
FILE: docs/bower_components/bootstrap/assets/js/holder.js
function contentLoaded (line 25) | function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h...
function selector (line 28) | function selector(a){
function extend (line 34) | function extend(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[...
function text_size (line 43) | function text_size(width, height, template) {
function draw (line 55) | function draw(ctx, dimensions, template, ratio) {
function render (line 80) | function render(mode, el, holder, src) {
function fluid_update (line 134) | function fluid_update(element) {
function parse_flags (line 153) | function parse_flags(flags, options) {
FILE: docs/bower_components/bootstrap/assets/js/html5shiv.js
function m (line 4) | function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}
function i (line 4) | function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}
function p (line 4) | function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=...
function t (line 4) | function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.cr...
function q (line 5) | function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a...
FILE: docs/bower_components/bootstrap/assets/js/jquery.js
function M (line 4) | function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.n...
function at (line 4) | function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)...
function st (line 4) | function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLeng...
function lt (line 4) | function lt(e){return e[b]=!0,e}
function ut (line 4) | function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){re...
function ct (line 4) | function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[...
function pt (line 4) | function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sou...
function ft (line 4) | function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"...
function dt (line 4) | function dt(e){return function(t){var n=t.nodeName.toLowerCase();return(...
function ht (line 4) | function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,...
function gt (line 4) | function gt(){}
function mt (line 4) | function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0)...
function yt (line 4) | function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}
function vt (line 4) | function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.firs...
function bt (line 4) | function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i-...
function xt (line 4) | function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)...
function wt (line 4) | function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)...
function Tt (line 4) | function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relat...
function Ct (line 4) | function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d)...
function Nt (line 4) | function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}
function kt (line 4) | function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0...
function F (line 4) | function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t...
function R (line 5) | function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType...
function W (line 5) | function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e...
function $ (line 5) | function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-...
function I (line 5) | function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&...
function it (line 5) | function it(){return!0}
function ot (line 5) | function ot(){return!1}
function at (line 5) | function at(){try{return a.activeElement}catch(e){}}
function pt (line 5) | function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}
function ft (line 5) | function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){retu...
function dt (line 5) | function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.cre...
function Lt (line 5) | function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType...
function Ht (line 5) | function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}
function qt (line 5) | function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttrib...
function _t (line 5) | function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval...
function Mt (line 5) | function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e)...
function Ot (line 5) | function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCas...
function Ft (line 5) | function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getEl...
function Bt (line 5) | function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}
function tn (line 6) | function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.sl...
function nn (line 6) | function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(...
function rn (line 6) | function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.sty...
function on (line 6) | function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[...
function an (line 6) | function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:...
function sn (line 6) | function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o...
function ln (line 6) | function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(...
function un (line 6) | function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[...
function gn (line 6) | function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn....
function Hn (line 6) | function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
function qn (line 6) | function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!...
function _n (line 6) | function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i...
function k (line 6) | function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t...
function Mn (line 6) | function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[...
function On (line 6) | function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])fo...
function In (line 6) | function In(){try{return new e.XMLHttpRequest}catch(t){}}
function zn (line 6) | function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(...
function Kn (line 6) | function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}
function Zn (line 6) | function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;fo...
function er (line 6) | function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(functio...
function tr (line 6) | function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e...
function nr (line 6) | function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&n...
function rr (line 6) | function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}
function ir (line 6) | function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r...
function or (line 6) | function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.pa...
FILE: docs/bower_components/bootstrap/assets/js/jszip.js
function identity (line 1088) | function identity(input) {
function stringToArrayLike (line 1098) | function stringToArrayLike(str, array) {
function arrayLikeToString (line 1110) | function arrayLikeToString(array) {
function arrayLikeToArrayLike (line 1144) | function arrayLikeToArrayLike(arrayFrom, arrayTo) {
FILE: docs/bower_components/bootstrap/assets/js/less.js
function n (line 8) | function n(t){return e.less[t.split("/")[1]]}
function f (line 8) | function f(){r.env==="development"?(r.optimization=0,r.watchTimer=setInt...
function m (line 8) | function m(){var e=document.getElementsByTagName("style");for(var t=0;t<...
function g (line 8) | function g(e,t){for(var n=0;n<r.sheets.length;n++)w(r.sheets[n],e,t,r.sh...
function y (line 8) | function y(e,t){var n=b(e),r=b(t),i,s,o,u,a="";if(n.hostPart!==r.hostPar...
function b (line 8) | function b(e,t){var n=/^((?:[a-z-]+:)?\/\/(?:[^\/\?#]*\/)|([\/\\]))?((?:...
function w (line 8) | function w(t,n,i,s){var o=t.contents||{},u=t.files||{},a=b(t.href,e.loca...
function E (line 8) | function E(e){return e.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"...
function S (line 8) | function S(e,t,n){var r,i=t.href||"",s="less:"+(t.title||E(i));if((r=doc...
function x (line 8) | function x(e,t,n,i){function a(t,n,r){t.status>=200&&t.status<300?n(t.re...
function T (line 8) | function T(){if(e.XMLHttpRequest)return new XMLHttpRequest;try{return ne...
function N (line 8) | function N(e){return e&&e.parentNode.removeChild(e)}
function C (line 8) | function C(e){r.env=="development"&&typeof console!="undefined"&&console...
function k (line 8) | function k(e,t){var n="less-error-message:"+E(t),i='<li><label>{line}</l...
function g (line 8) | function g(){a=c[u],f=o,h=o}
function y (line 8) | function y(){c[u]=a,o=f,h=o}
function b (line 8) | function b(){o>h&&(c[u]=c[u].slice(o-h),h=o)}
function w (line 8) | function w(e){var t=e.charCodeAt(0);return t===32||t===10||t===9}
function E (line 8) | function E(e){var t,n,r,i,a;if(e instanceof Function)return e.call(p.par...
function S (line 8) | function S(e){var t=o,n=u,r=o+c[u].length,i=o+=e;while(o<r){if(!w(s.char...
function x (line 8) | function x(e,t){var n=E(e);if(!!n)return n;T(t||(typeof e=="string"?"exp...
function T (line 8) | function T(e,t){var n=new Error(e);throw n.index=o,n.type=t||"Syntax",n}
function N (line 8) | function N(e){return typeof e=="string"?s.charAt(o)===e:e.test(c[u])?!0:!1}
function C (line 8) | function C(e,t){return e.filename&&t.filename&&e.filename!==t.filename?p...
function k (line 8) | function k(e,t){for(var n=e,r=-1;n>=0&&t.charAt(n)!=="\n";n--)r++;return...
function L (line 8) | function L(e){return r.mode==="browser"||r.mode==="rhino"?e.filename:n("...
function A (line 8) | function A(e,t,n){return{lineNumber:k(e,t).line+1,fileName:L(n)}}
function O (line 8) | function O(e,t){var n=C(e,t),r=k(e.index,n),i=r.line,s=r.column,o=n.spli...
function t (line 8) | function t(t){return e.functions.hsla(t.h,t.s,t.l,t.a)}
function n (line 8) | function n(t,n){return t instanceof e.Dimension&&t.unit=="%"?parseFloat(...
function r (line 8) | function r(t){if(t instanceof e.Dimension)return parseFloat(t.unit=="%"?...
function i (line 8) | function i(e){return Math.min(1,Math.max(0,e))}
function u (line 8) | function u(e){return e=e<0?e+1:e>1?e-1:e,e*6<1?o+(s-o)*e*6:e*2<1?s:e*3<2...
FILE: docs/bower_components/bootstrap/assets/js/uglify.js
function g (line 14) | function g(a,b){if(a&&a.charAt(0)==="."&&b){b=b.split("/"),b=b.slice(0,b...
function h (line 14) | function h(a,d){return function(){return c.apply(null,b.call(arguments,0...
function i (line 14) | function i(a){return function(b){return g(b,a)}}
function j (line 14) | function j(b){return function(c){a[b]=c}}
function k (line 14) | function k(b,c){var d,e,f=b.indexOf("!");return f!==-1?(d=g(b.slice(0,f)...
function l (line 14) | function l(b,c,d,e){var f=[],g,i,l,m,n,o;e||(e=b);if(typeof d=="function...
function r (line 14) | function r(a){return q.letter.test(a)}
function s (line 14) | function s(a){return a=a.charCodeAt(0),a>=48&&a<=57}
function t (line 14) | function t(a){return s(a)||r(a)}
function u (line 14) | function u(a){return q.non_spacing_mark.test(a)||q.space_combining_mark....
function v (line 14) | function v(a){return q.connector_punctuation.test(a)}
function w (line 14) | function w(a){return a=="$"||a=="_"||r(a)}
function x (line 14) | function x(a){return w(a)||u(a)||s(a)||v(a)||a==""||a==""}
function y (line 14) | function y(a){if(i.test(a))return parseInt(a.substr(2),16);if(j.test(a))...
function z (line 14) | function z(a,b,c,d){this.message=a,this.line=b,this.col=c,this.pos=d,thi...
function A (line 14) | function A(a,b,c,d){throw new z(a,b,c,d)}
function B (line 14) | function B(a,b,c){return a.type==b&&(c==null||a.value==c)}
function D (line 14) | function D(a){function c(){return b.text.charAt(b.pos)}function e(a,c){v...
function K (line 14) | function K(a,b,c){this.name=a,this.start=b,this.end=c}
function L (line 14) | function L(a,b,c){function e(a,b){return B(d.token,a,b)}function f(){ret...
function M (line 14) | function M(a){var b=P(arguments,1);return function(){return a.apply(this...
function N (line 14) | function N(a){a instanceof Function&&(a=a());for(var b=1,c=arguments.len...
function O (line 14) | function O(a){var b={};for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}
function P (line 14) | function P(a,b){return Array.prototype.slice.call(a,b||0)}
function Q (line 14) | function Q(a){return a.split("")}
function R (line 14) | function R(a,b){for(var c=b.length;--c>=0;)if(b[c]===a)return!0;return!1}
function S (line 14) | function S(a,b){return Object.prototype.hasOwnProperty.call(a,b)}
function i (line 14) | function i(){function a(a){return[this[0],K(a,function(a){var b=[a[0]];r...
function j (line 14) | function j(a){this.names={},this.mangled={},this.rev_mangled={},this.cna...
function l (line 14) | function l(a){function f(a){b=new j(b);var c=b.body=a();return c.scope=b...
function m (line 14) | function m(a,b){function g(a,c){return!b.toplevel&&!e.parent?a:b.except&...
function o (line 14) | function o(a,b){return E(a).length>E(b[0]=="stat"?b[1]:b).length?b:a}
function p (line 14) | function p(a){return a[0]=="block"&&a[1]&&a[1].length>0?a[1][a[1].length...
function q (line 14) | function q(a){if(a)switch(p(a)[0]){case"return":case"break":case"continu...
function r (line 14) | function r(a){return a[0]=="unary-prefix"&&f(a[1],["!","delete"])||a[0]=...
function s (line 14) | function s(a){return!a||a[0]=="block"&&(!a[1]||a[1].length==0)}
function t (line 14) | function t(a){return a[0]=="string"||a[0]=="unary-prefix"&&a[1]=="typeof...
function v (line 14) | function v(a){s(a)||n("Dropping unreachable code: "+E(a,!0))}
function w (line 14) | function w(a){function d(a){a=K(a,c);for(var b=0;b<a.length;++b){var e=a...
function x (line 14) | function x(a,b){function g(){throw e}function h(){throw f}function j(){r...
function y (line 14) | function y(a){function e(a,b){var e=d;d=b,a=K(a,c);var f={},g=K(b.names,...
function z (line 14) | function z(a,b){function h(a){var c=["unary-prefix","!",a];switch(a[0]){...
function B (line 14) | function B(a,b){var c=0,d=0;return a=a.replace(/[\\\b\f\n\r\t\x22\x27\u2...
function C (line 14) | function C(a){return a.replace(/[\u0080-\uffff]/g,function(a){var b=a.ch...
function E (line 14) | function E(a,b){function m(a){var c=B(a,b.ascii_only);return b.inline_sc...
function F (line 14) | function F(a,b){var c=[0];return d.parse(function(){function h(a){return...
function G (line 14) | function G(a,b){if(b>0){if(b==1)return a;var c=G(a,b>>1);return c+=c,b&1...
function H (line 14) | function H(a,b){var c={};a===!0&&(a={});for(var d in b)J(b,d)&&(c[d]=a&&...
function I (line 14) | function I(a){return/^[a-z_$][a-z0-9_$]*$/i.test(a)&&a!="this"&&!J(d.KEY...
function J (line 14) | function J(a,b){return Object.prototype.hasOwnProperty.call(a,b)}
function b (line 14) | function b(c){switch(c[0]){case"string":case"num":return c[1];case"name"...
function b (line 14) | function b(a){this.v=a}
function c (line 14) | function c(a){this.v=a}
function j (line 14) | function j(){var j=e.call(f,d[i],i);j instanceof b?(j=j.v,j instanceof c...
function d (line 14) | function d(a,b){b||(b={});var c=d.parser,e=d.uglify,f=c.parse(a,b.strict...
function l (line 14) | function l(a){function f(a,b){var c=d,e;return d=a,e=b(),d=c,e}function ...
FILE: docs/bower_components/bootstrap/dist/js/bootstrap.js
function transitionEnd (line 33) | function transitionEnd() {
function removeElement (line 118) | function removeElement() {
function clearMenus (line 764) | function clearMenus() {
function getParent (line 775) | function getParent($this) {
function complete (line 1336) | function complete() {
function ScrollSpy (line 1604) | function ScrollSpy(element, options) {
function next (line 1805) | function next() {
FILE: docs/bower_components/bootstrap/js/alert.js
function removeElement (line 54) | function removeElement() {
FILE: docs/bower_components/bootstrap/js/dropdown.js
function clearMenus (line 93) | function clearMenus() {
function getParent (line 104) | function getParent($this) {
FILE: docs/bower_components/bootstrap/js/scrollspy.js
function ScrollSpy (line 26) | function ScrollSpy(element, options) {
FILE: docs/bower_components/bootstrap/js/tab.js
function next (line 68) | function next() {
FILE: docs/bower_components/bootstrap/js/tests/phantom.js
function waitFor (line 4) | function waitFor(testFx, onReady, timeOutMillis) {
FILE: docs/bower_components/bootstrap/js/tests/unit/phantom.js
function sendMessage (line 19) | function sendMessage() {
FILE: docs/bower_components/bootstrap/js/tests/vendor/jquery.js
function M (line 4) | function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.n...
function at (line 4) | function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)...
function st (line 4) | function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLeng...
function lt (line 4) | function lt(e){return e[b]=!0,e}
function ut (line 4) | function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){re...
function ct (line 4) | function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[...
function pt (line 4) | function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sou...
function ft (line 4) | function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"...
function dt (line 4) | function dt(e){return function(t){var n=t.nodeName.toLowerCase();return(...
function ht (line 4) | function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,...
function gt (line 4) | function gt(){}
function mt (line 4) | function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0)...
function yt (line 4) | function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}
function vt (line 4) | function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.firs...
function bt (line 4) | function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i-...
function xt (line 4) | function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)...
function wt (line 4) | function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)...
function Tt (line 4) | function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relat...
function Ct (line 4) | function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d)...
function Nt (line 4) | function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}
function kt (line 4) | function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0...
function F (line 4) | function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t...
function R (line 5) | function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType...
function W (line 5) | function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e...
function $ (line 5) | function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-...
function I (line 5) | function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&...
function it (line 5) | function it(){return!0}
function ot (line 5) | function ot(){return!1}
function at (line 5) | function at(){try{return a.activeElement}catch(e){}}
function pt (line 5) | function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}
function ft (line 5) | function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){retu...
function dt (line 5) | function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.cre...
function Lt (line 5) | function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType...
function Ht (line 5) | function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}
function qt (line 5) | function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttrib...
function _t (line 5) | function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval...
function Mt (line 5) | function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e)...
function Ot (line 5) | function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCas...
function Ft (line 5) | function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getEl...
function Bt (line 5) | function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}
function tn (line 6) | function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.sl...
function nn (line 6) | function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(...
function rn (line 6) | function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.sty...
function on (line 6) | function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[...
function an (line 6) | function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:...
function sn (line 6) | function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o...
function ln (line 6) | function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(...
function un (line 6) | function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[...
function gn (line 6) | function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn....
function Hn (line 6) | function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
function qn (line 6) | function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!...
function _n (line 6) | function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i...
function k (line 6) | function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t...
function Mn (line 6) | function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[...
function On (line 6) | function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])fo...
function In (line 6) | function In(){try{return new e.XMLHttpRequest}catch(t){}}
function zn (line 6) | function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(...
function Kn (line 6) | function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}
function Zn (line 6) | function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;fo...
function er (line 6) | function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(functio...
function tr (line 6) | function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e...
function nr (line 6) | function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&n...
function rr (line 6) | function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}
function ir (line 6) | function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r...
function or (line 6) | function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.pa...
FILE: docs/bower_components/bootstrap/js/tests/vendor/qunit.js
function run (line 226) | function run() {
function done (line 759) | function done() {
function validTest (line 814) | function validTest( name ) {
function sourceFromStacktrace (line 840) | function sourceFromStacktrace() {
function escapeHtml (line 858) | function escapeHtml(s) {
function synchronize (line 875) | function synchronize( callback ) {
function process (line 883) | function process() {
function saveGlobal (line 899) | function saveGlobal() {
function checkPollution (line 909) | function checkPollution( name ) {
function diff (line 925) | function diff( a, b ) {
function fail (line 939) | function fail(message, exception, callback) {
function extend (line 950) | function extend(a, b) {
function addEvent (line 962) | function addEvent(elem, type, fn) {
function id (line 972) | function id(name) {
function bindCallbacks (line 988) | function bindCallbacks(o, callbacks, args) {
function useStrictEquality (line 1002) | function useStrictEquality(b, a) {
function quote (line 1165) | function quote( str ) {
function literal (line 1168) | function literal( o ) {
function join (line 1171) | function join( pre, arr, post ) {
function array (line 1181) | function array( arr, stack ) {
function getText (line 1339) | function getText( elems ) {
function inArray (line 1359) | function inArray( elem, array ) {
function diff (line 1388) | function diff(o, n) {
FILE: docs/bower_components/bootstrap/js/tooltip.js
function complete (line 263) | function complete() {
FILE: docs/bower_components/bootstrap/js/transition.js
function transitionEnd (line 26) | function transitionEnd() {
FILE: docs/bower_components/jquery/jquery-migrate.js
function migrateWarn (line 35) | function migrateWarn( msg) {
function migrateWarnProp (line 48) | function migrateWarnProp( obj, prop, value, msg ) {
function jQuerySub (line 268) | function jQuerySub( selector, context ) {
FILE: docs/bower_components/jquery/jquery.js
function isArraylike (line 848) | function isArraylike( obj ) {
function Sizzle (line 1048) | function Sizzle( selector, context, results, seed ) {
function createCache (line 1163) | function createCache() {
function markFunction (line 1181) | function markFunction( fn ) {
function assert (line 1190) | function assert( fn ) {
function addHandle (line 1212) | function addHandle( attrs, handler ) {
function siblingCheck (line 1227) | function siblingCheck( a, b ) {
function createInputPseudo (line 1254) | function createInputPseudo( type ) {
function createButtonPseudo (line 1265) | function createButtonPseudo( type ) {
function createPositionalPseudo (line 1276) | function createPositionalPseudo( fn ) {
function setFilters (line 2259) | function setFilters() {}
function tokenize (line 2263) | function tokenize( selector, parseOnly ) {
function toSelector (line 2330) | function toSelector( tokens ) {
function addCombinator (line 2340) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2390) | function elementMatcher( matchers ) {
function condense (line 2404) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2425) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2518) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2573) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function multipleContexts (line 2701) | function multipleContexts( selector, contexts, results ) {
function select (line 2710) | function select( selector, context, results, seed ) {
function createOptions (line 2850) | function createOptions( options ) {
function Data (line 3312) | function Data() {
function dataAttr (line 3625) | function dataAttr( elem, key, data ) {
function returnTrue (line 4305) | function returnTrue() {
function returnFalse (line 4309) | function returnFalse() {
function safeActiveElement (line 4313) | function safeActiveElement() {
function sibling (line 5268) | function sibling( cur, dir ) {
function winnow (line 5384) | function winnow( elements, qualifier, not ) {
function manipulationTarget (line 5893) | function manipulationTarget( elem, content ) {
function disableScript (line 5903) | function disableScript( elem ) {
function restoreScript (line 5907) | function restoreScript( elem ) {
function setGlobalEval (line 5920) | function setGlobalEval( elems, refElements ) {
function cloneCopyEvent (line 5931) | function cloneCopyEvent( src, dest ) {
function getAll (line 5966) | function getAll( context, tag ) {
function fixInput (line 5977) | function fixInput( src, dest ) {
function vendorPropName (line 6078) | function vendorPropName( style, name ) {
function isHidden (line 6100) | function isHidden( elem, el ) {
function getStyles (line 6109) | function getStyles( elem ) {
function showHide (line 6113) | function showHide( elements, show ) {
function setPositiveNumber (line 6384) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6392) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 6431) | function getWidthOrHeight( elem, name, extra ) {
function css_defaultDisplay (line 6475) | function css_defaultDisplay( nodeName ) {
function actualDisplay (line 6507) | function actualDisplay( name, doc ) {
function buildParams (line 6693) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 6809) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 6841) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 6868) | function ajaxExtend( target, src ) {
function done (line 7314) | function done( status, nativeStatusText, responses, headers ) {
function ajaxHandleResponses (line 7461) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 7517) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function createFxNow (line 7912) | function createFxNow() {
function createTween (line 7919) | function createTween( value, prop, animation ) {
function Animation (line 7933) | function Animation( elem, properties, options ) {
function propFilter (line 8037) | function propFilter( props, specialEasing ) {
function defaultPrefilter (line 8104) | function defaultPrefilter( elem, props, opts ) {
function Tween (line 8227) | function Tween( elem, options, prop, end, easing ) {
function genFx (line 8451) | function genFx( type, includeWidth ) {
function getWindow (line 8749) | function getWindow( elem ) {
FILE: docs/js/app.js
function vadd (line 31) | function vadd(v1, v2) {
function vsub (line 35) | function vsub(v1, v2) {
function vcopy (line 39) | function vcopy(v) {
function vmul (line 43) | function vmul(v, scalar) {
function vrotate (line 47) | function vrotate(v, angle) {
function vnormalize (line 56) | function vnormalize(v) {
function vlength (line 65) | function vlength(v) {
function vequal (line 70) | function vequal(v1, v2) {
function findPoint (line 75) | function findPoint(point, cb) {
function Spark (line 83) | function Spark(pos, dir, len, color) {
function Triangle (line 121) | function Triangle(v1, v2, v3, color, level) {
function init (line 353) | function init() {
function render (line 374) | function render() {
function showDownload (line 402) | function showDownload() {
function saveImage (line 468) | function saveImage() {
FILE: nunjucks/index.js
function configure (line 18) | function configure(templatesPath, opts) {
method reset (line 63) | reset() {
method compile (line 66) | compile(src, env, path, eagerCompile) {
method render (line 72) | render(name, ctx, cb) {
method renderString (line 79) | renderString(src, ctx, cb) {
FILE: nunjucks/src/compiler.js
class Compiler (line 23) | class Compiler extends Obj {
method init (line 24) | init(templateName, throwOnUndefined) {
method fail (line 35) | fail(msg, lineno, colno) {
method _pushBuffer (line 46) | _pushBuffer() {
method _popBuffer (line 54) | _popBuffer() {
method _emit (line 58) | _emit(code) {
method _emitLine (line 62) | _emitLine(code) {
method _emitLines (line 66) | _emitLines(...lines) {
method _emitFuncBegin (line 70) | _emitFuncBegin(node, name) {
method _emitFuncEnd (line 80) | _emitFuncEnd(noReturn) {
method _addScopeLevel (line 93) | _addScopeLevel() {
method _closeScopeLevels (line 97) | _closeScopeLevels() {
method _withScopedSyntax (line 102) | _withScopedSyntax(func) {
method _makeCallback (line 112) | _makeCallback(res) {
method _tmpid (line 119) | _tmpid() {
method _templateName (line 124) | _templateName() {
method _compileChildren (line 128) | _compileChildren(node, frame) {
method _compileAggregate (line 134) | _compileAggregate(node, frame, startChar, endChar) {
method _compileExpression (line 152) | _compileExpression(node, frame) {
method assertType (line 189) | assertType(node, ...types) {
method compileCallExtension (line 195) | compileCallExtension(node, frame, async) {
method compileCallExtensionAsync (line 266) | compileCallExtensionAsync(node, frame) {
method compileNodeList (line 270) | compileNodeList(node, frame) {
method compileLiteral (line 274) | compileLiteral(node) {
method compileSymbol (line 290) | compileSymbol(node, frame) {
method compileGroup (line 302) | compileGroup(node, frame) {
method compileArray (line 306) | compileArray(node, frame) {
method compileDict (line 310) | compileDict(node, frame) {
method compilePair (line 314) | compilePair(node, frame) {
method compileInlineIf (line 332) | compileInlineIf(node, frame) {
method compileIn (line 346) | compileIn(node, frame) {
method compileIs (line 354) | compileIs(node, frame) {
method _binOpEmitter (line 371) | _binOpEmitter(node, frame, str) {
method compileOr (line 379) | compileOr(node, frame) {
method compileAnd (line 383) | compileAnd(node, frame) {
method compileAdd (line 387) | compileAdd(node, frame) {
method compileConcat (line 391) | compileConcat(node, frame) {
method compileSub (line 395) | compileSub(node, frame) {
method compileMul (line 399) | compileMul(node, frame) {
method compileDiv (line 403) | compileDiv(node, frame) {
method compileMod (line 407) | compileMod(node, frame) {
method compileNot (line 411) | compileNot(node, frame) {
method compileFloorDiv (line 416) | compileFloorDiv(node, frame) {
method compilePow (line 424) | compilePow(node, frame) {
method compileNeg (line 432) | compileNeg(node, frame) {
method compilePos (line 437) | compilePos(node, frame) {
method compileCompare (line 442) | compileCompare(node, frame) {
method compileLookupVal (line 451) | compileLookupVal(node, frame) {
method _getNodeName (line 459) | _getNodeName(node) {
method compileFunCall (line 475) | compileFunCall(node, frame) {
method compileFilter (line 496) | compileFilter(node, frame) {
method compileFilterAsync (line 504) | compileFilterAsync(node, frame) {
method compileKeywordArgs (line 519) | compileKeywordArgs(node, frame) {
method compileSet (line 525) | compileSet(node, frame) {
method compileSwitch (line 575) | compileSwitch(node, frame) {
method compileIf (line 596) | compileIf(node, frame, async) {
method compileIfAsync (line 627) | compileIfAsync(node, frame) {
method _emitLoopBindings (line 634) | _emitLoopBindings(node, arr, i, len) {
method compileFor (line 650) | compileFor(node, frame) {
method _compileAsyncLoop (line 747) | _compileAsyncLoop(node, frame, parallel) {
method compileAsyncEach (line 819) | compileAsyncEach(node, frame) {
method compileAsyncAll (line 823) | compileAsyncAll(node, frame) {
method _compileMacro (line 827) | _compileMacro(node, frame) {
method compileMacro (line 904) | compileMacro(node, frame) {
method compileCaller (line 921) | compileCaller(node, frame) {
method _compileGetTemplate (line 928) | _compileGetTemplate(node, frame, eagerCompile, ignoreMissing) {
method compileImport (line 940) | compileImport(node, frame) {
method compileFromImport (line 959) | compileFromImport(node, frame) {
method compileBlock (line 997) | compileBlock(node) {
method compileSuper (line 1022) | compileSuper(node, frame) {
method compileExtends (line 1033) | compileExtends(node, frame) {
method compileInclude (line 1050) | compileInclude(node, frame) {
method compileTemplateData (line 1074) | compileTemplateData(node, frame) {
method compileCapture (line 1078) | compileCapture(node, frame) {
method compileOutput (line 1094) | compileOutput(node, frame) {
method compileRoot (line 1119) | compileRoot(node, frame) {
method compile (line 1168) | compile(node, frame) {
method getCode (line 1177) | getCode() {
FILE: nunjucks/src/environment.js
function callbackAsap (line 18) | function callbackAsap(cb, err, res) {
method root (line 30) | root(env, context, frame, runtime, cb) {
class Environment (line 40) | class Environment extends EmitterObj {
method init (line 41) | init(loaders, opts) {
method _initLoaders (line 98) | _initLoaders() {
method invalidateCache (line 114) | invalidateCache() {
method addExtension (line 120) | addExtension(name, extension) {
method removeExtension (line 127) | removeExtension(name) {
method getExtension (line 137) | getExtension(name) {
method hasExtension (line 141) | hasExtension(name) {
method addGlobal (line 145) | addGlobal(name, value) {
method getGlobal (line 150) | getGlobal(name) {
method addFilter (line 157) | addFilter(name, func, async) {
method getFilter (line 167) | getFilter(name) {
method addTest (line 174) | addTest(name, func) {
method getTest (line 179) | getTest(name) {
method resolveTemplate (line 186) | resolveTemplate(loader, parentName, filename) {
method getTemplate (line 191) | getTemplate(name, eagerCompile, parentName, ignoreMissing, cb) {
method express (line 292) | express(app) {
method render (line 296) | render(name, ctx, cb) {
method renderString (line 321) | renderString(src, ctx, opts, cb) {
method waterfall (line 332) | waterfall(tasks, callback, forceAsync) {
class Context (line 337) | class Context extends Obj {
method init (line 338) | init(ctx, blocks, env) {
method lookup (line 353) | lookup(name) {
method setVariable (line 363) | setVariable(name, val) {
method getVariables (line 367) | getVariables() {
method addBlock (line 371) | addBlock(name, block) {
method getBlock (line 377) | getBlock(name) {
method getSuper (line 385) | getSuper(env, name, block, frame, runtime, cb) {
method addExport (line 397) | addExport(name) {
method getExported (line 401) | getExported() {
class Template (line 410) | class Template extends Obj {
method init (line 411) | init(src, env, path, eagerCompile) {
method render (line 445) | render(ctx, parentFrame, cb) {
method getExported (line 511) | getExported(ctx, parentFrame, cb) { // eslint-disable-line consistent-...
method compile (line 547) | compile() {
method _compile (line 553) | _compile() {
method _getBlocks (line 574) | _getBlocks(props) {
FILE: nunjucks/src/express-app.js
function NunjucksView (line 4) | function NunjucksView(name, opts) {
FILE: nunjucks/src/filters.js
function normalize (line 8) | function normalize(value, defaultValue) {
function isNaN (line 17) | function isNaN(num) {
function batch (line 21) | function batch(arr, linecount, fillWith) {
function capitalize (line 50) | function capitalize(str) {
function center (line 58) | function center(str, width) {
function default_ (line 74) | function default_(val, def, bool) {
function dictsort (line 85) | function dictsort(val, caseSensitive, by) {
function dump (line 127) | function dump(obj, spaces) {
function escape (line 133) | function escape(str) {
function safe (line 143) | function safe(str) {
function first (line 153) | function first(arr) {
function forceescape (line 159) | function forceescape(str) {
function groupby (line 166) | function groupby(arr, attr) {
function indent (line 172) | function indent(str, width, indentfirst) {
function join (line 193) | function join(arr, del, attr) {
function last (line 205) | function last(arr) {
function lengthFilter (line 211) | function lengthFilter(val) {
function list (line 233) | function list(val) {
function lower (line 247) | function lower(str) {
function nl2br (line 254) | function nl2br(str) {
function random (line 263) | function random(arr) {
function getSelectOrReject (line 275) | function getSelectOrReject(expectedTestResult) {
function rejectattr (line 290) | function rejectattr(arr, attr) {
function selectattr (line 298) | function selectattr(arr, attr) {
function replace (line 304) | function replace(str, old, new_, maxCount) {
function reverse (line 376) | function reverse(val) {
function round (line 395) | function round(val, precision, method) {
function slice (line 413) | function slice(arr, slices, fillWith) {
function sum (line 438) | function sum(arr, attr, start = 0) {
function string (line 483) | function string(obj) {
function striptags (line 489) | function striptags(input, preserveLinebreaks) {
function title (line 508) | function title(str) {
function trim (line 516) | function trim(str) {
function truncate (line 522) | function truncate(input, length, killwords, end) {
function upper (line 548) | function upper(str) {
function urlencode (line 555) | function urlencode(obj) {
function urlize (line 576) | function urlize(str, length, nofollow) {
function wordcount (line 620) | function wordcount(str) {
function float (line 628) | function float(val, def) {
FILE: nunjucks/src/globals.js
function cycler (line 3) | function cycler(items) {
function joiner (line 25) | function joiner(sep) {
function globals (line 39) | function globals() {
FILE: nunjucks/src/jinja-compat.js
function installCompat (line 1) | function installCompat() {
FILE: nunjucks/src/lexer.js
constant BLOCK_START (line 9) | let BLOCK_START = '{%';
constant BLOCK_END (line 10) | let BLOCK_END = '%}';
constant VARIABLE_START (line 11) | let VARIABLE_START = '{{';
constant VARIABLE_END (line 12) | let VARIABLE_END = '}}';
constant COMMENT_START (line 13) | let COMMENT_START = '{#';
constant COMMENT_END (line 14) | let COMMENT_END = '#}';
constant TOKEN_STRING (line 16) | let TOKEN_STRING = 'string';
constant TOKEN_WHITESPACE (line 17) | let TOKEN_WHITESPACE = 'whitespace';
constant TOKEN_DATA (line 18) | let TOKEN_DATA = 'data';
constant TOKEN_BLOCK_START (line 19) | let TOKEN_BLOCK_START = 'block-start';
constant TOKEN_BLOCK_END (line 20) | let TOKEN_BLOCK_END = 'block-end';
constant TOKEN_VARIABLE_START (line 21) | let TOKEN_VARIABLE_START = 'variable-start';
constant TOKEN_VARIABLE_END (line 22) | let TOKEN_VARIABLE_END = 'variable-end';
constant TOKEN_COMMENT (line 23) | let TOKEN_COMMENT = 'comment';
constant TOKEN_LEFT_PAREN (line 24) | let TOKEN_LEFT_PAREN = 'left-paren';
constant TOKEN_RIGHT_PAREN (line 25) | let TOKEN_RIGHT_PAREN = 'right-paren';
constant TOKEN_LEFT_BRACKET (line 26) | let TOKEN_LEFT_BRACKET = 'left-bracket';
constant TOKEN_RIGHT_BRACKET (line 27) | let TOKEN_RIGHT_BRACKET = 'right-bracket';
constant TOKEN_LEFT_CURLY (line 28) | let TOKEN_LEFT_CURLY = 'left-curly';
constant TOKEN_RIGHT_CURLY (line 29) | let TOKEN_RIGHT_CURLY = 'right-curly';
constant TOKEN_OPERATOR (line 30) | let TOKEN_OPERATOR = 'operator';
constant TOKEN_COMMA (line 31) | let TOKEN_COMMA = 'comma';
constant TOKEN_COLON (line 32) | let TOKEN_COLON = 'colon';
constant TOKEN_TILDE (line 33) | let TOKEN_TILDE = 'tilde';
constant TOKEN_PIPE (line 34) | let TOKEN_PIPE = 'pipe';
constant TOKEN_INT (line 35) | let TOKEN_INT = 'int';
constant TOKEN_FLOAT (line 36) | let TOKEN_FLOAT = 'float';
constant TOKEN_BOOLEAN (line 37) | let TOKEN_BOOLEAN = 'boolean';
constant TOKEN_NONE (line 38) | let TOKEN_NONE = 'none';
constant TOKEN_SYMBOL (line 39) | let TOKEN_SYMBOL = 'symbol';
constant TOKEN_SPECIAL (line 40) | let TOKEN_SPECIAL = 'special';
constant TOKEN_REGEX (line 41) | let TOKEN_REGEX = 'regex';
function token (line 43) | function token(type, value, lineno, colno) {
class Tokenizer (line 52) | class Tokenizer {
method constructor (line 53) | constructor(str, opts) {
method nextToken (line 78) | nextToken() {
method _parseString (line 333) | _parseString(delimiter) {
method _matches (line 367) | _matches(str) {
method _extractString (line 376) | _extractString(str) {
method _extractUntil (line 384) | _extractUntil(charString) {
method _extract (line 390) | _extract(charString) {
method _extractMatching (line 396) | _extractMatching(breakOnMatch, charString) {
method _extractRegex (line 431) | _extractRegex(regex) {
method isFinished (line 443) | isFinished() {
method forwardN (line 447) | forwardN(n) {
method forward (line 453) | forward() {
method backN (line 464) | backN(n) {
method back (line 470) | back() {
method current (line 488) | current() {
method currentStr (line 496) | currentStr() {
method previous (line 503) | previous() {
method lex (line 509) | lex(src, opts) {
FILE: nunjucks/src/lib.js
function hasOwnProp (line 19) | function hasOwnProp(obj, k) {
function lookupEscape (line 25) | function lookupEscape(ch) {
function _prettifyError (line 29) | function _prettifyError(path, withInternals, err) {
function TemplateError (line 48) | function TemplateError(message, lineno, colno) {
function escape (line 141) | function escape(val) {
function isFunction (line 147) | function isFunction(obj) {
function isArray (line 153) | function isArray(obj) {
function isString (line 159) | function isString(obj) {
function isObject (line 165) | function isObject(obj) {
function _prepareAttributeParts (line 176) | function _prepareAttributeParts(attr) {
function getAttrGetter (line 192) | function getAttrGetter(attribute) {
function groupBy (line 216) | function groupBy(obj, val, throwOnUndefined) {
function toArray (line 232) | function toArray(obj) {
function without (line 238) | function without(array) {
function repeat (line 257) | function repeat(char_, n) {
function each (line 267) | function each(obj, func, context) {
function map (line 283) | function map(obj, func) {
function asyncIter (line 306) | function asyncIter(arr, iter, cb) {
function asyncFor (line 324) | function asyncFor(obj, iter, cb) {
function indexOf (line 345) | function indexOf(arr, searchElement, fromIndex) {
function keys_ (line 351) | function keys_(obj) {
function _entries (line 364) | function _entries(obj) {
function _values (line 370) | function _values(obj) {
function extend (line 376) | function extend(obj1, obj2) {
function inOperator (line 386) | function inOperator(key, val) {
FILE: nunjucks/src/loader.js
method resolve (line 7) | resolve(from, to) {
method isRelative (line 11) | isRelative(filename) {
FILE: nunjucks/src/node-loaders.js
class FileSystemLoader (line 11) | class FileSystemLoader extends Loader {
method constructor (line 12) | constructor(searchPaths, opts) {
method getSource (line 56) | getSource(name) {
class NodeResolveLoader (line 88) | class NodeResolveLoader extends Loader {
method constructor (line 89) | constructor(opts) {
method getSource (line 116) | getSource(name) {
FILE: nunjucks/src/nodes.js
function traverseAndCheck (line 5) | function traverseAndCheck(obj, type, results) {
class Node (line 15) | class Node extends Obj {
method init (line 16) | init(lineno, colno, ...args) {
method findAll (line 34) | findAll(type, results) {
method iterFields (line 46) | iterFields(func) {
class Value (line 54) | class Value extends Node {
method typename (line 55) | get typename() { return 'Value'; }
method fields (line 56) | get fields() {
class NodeList (line 62) | class NodeList extends Node {
method typename (line 63) | get typename() { return 'NodeList'; }
method fields (line 64) | get fields() { return ['children']; }
method init (line 66) | init(lineno, colno, nodes) {
method addChild (line 70) | addChild(node) {
class FromImport (line 93) | class FromImport extends Node {
method typename (line 94) | get typename() { return 'FromImport'; }
method fields (line 95) | get fields() { return ['template', 'names', 'withContext']; }
method init (line 97) | init(lineno, colno, template, names, withContext) {
method init (line 137) | init(ext, prop, args, contentArgs) {
function print (line 150) | function print(str, indent, inline) {
function printNodes (line 163) | function printNodes(node, indent) {
FILE: nunjucks/src/object.js
function parentWrap (line 7) | function parentWrap(parent, prop) {
function extendClass (line 24) | function extendClass(cls, name, props) {
class Obj (line 42) | class Obj {
method constructor (line 43) | constructor(...args) {
method init (line 48) | init() {}
method typename (line 50) | get typename() {
method extend (line 54) | static extend(name, props) {
class EmitterObj (line 63) | class EmitterObj extends EventEmitter {
method constructor (line 64) | constructor(...args) {
method init (line 70) | init() {}
method typename (line 72) | get typename() {
method extend (line 76) | static extend(name, props) {
FILE: nunjucks/src/parser.js
class Parser (line 8) | class Parser extends Obj {
method init (line 9) | init(tokens) {
method nextToken (line 18) | nextToken(withWhitespace) {
method peekToken (line 42) | peekToken() {
method pushToken (line 47) | pushToken(tok) {
method error (line 54) | error(msg, lineno, colno) {
method fail (line 69) | fail(msg, lineno, colno) {
method skip (line 73) | skip(type) {
method expect (line 82) | expect(type) {
method skipValue (line 92) | skipValue(type, val) {
method skipSymbol (line 101) | skipSymbol(val) {
method advanceAfterBlockEnd (line 105) | advanceAfterBlockEnd(name) {
method advanceAfterVariableEnd (line 135) | advanceAfterVariableEnd() {
method parseFor (line 148) | parseFor() {
method parseMacro (line 206) | parseMacro() {
method parseCall (line 223) | parseCall() {
method parseWithContext (line 263) | parseWithContext() {
method parseImport (line 285) | parseImport() {
method parseFrom (line 314) | parseFrom() {
method parseBlock (line 384) | parseBlock() {
method parseExtends (line 415) | parseExtends() {
method parseInclude (line 429) | parseInclude() {
method parseIf (line 447) | parseIf() {
method parseSet (line 488) | parseSet() {
method parseSwitch (line 527) | parseSwitch() {
method parseStatement (line 595) | parseStatement() {
method parseRaw (line 655) | parseRaw(tagName) {
method parsePostfix (line 700) | parsePostfix(node) {
method parseExpression (line 753) | parseExpression() {
method parseInlineIf (line 758) | parseInlineIf() {
method parseOr (line 776) | parseOr() {
method parseAnd (line 788) | parseAnd() {
method parseNot (line 800) | parseNot() {
method parseIn (line 810) | parseIn() {
method parseIs (line 847) | parseIs() {
method parseCompare (line 866) | parseCompare() {
method parseConcat (line 898) | parseConcat() {
method parseAdd (line 910) | parseAdd() {
method parseSub (line 922) | parseSub() {
method parseMul (line 934) | parseMul() {
method parseDiv (line 946) | parseDiv() {
method parseFloorDiv (line 958) | parseFloorDiv() {
method parseMod (line 970) | parseMod() {
method parsePow (line 982) | parsePow() {
method parseUnary (line 994) | parseUnary(noFilters) {
method parsePrimary (line 1017) | parsePrimary(noPostfix) {
method parseFilterName (line 1068) | parseFilterName() {
method parseFilterArgs (line 1079) | parseFilterArgs(node) {
method parseFilter (line 1089) | parseFilter(node) {
method parseFilterStatement (line 1108) | parseFilterStatement() {
method parseAggregate (line 1143) | parseAggregate() {
method parseSignature (line 1206) | parseSignature(tolerant, noParens) {
method parseUntilBlocks (line 1262) | parseUntilBlocks(...blockNames) {
method parseNodes (line 1272) | parseNodes() {
method parse (line 1336) | parse() {
method parseAsRoot (line 1340) | parseAsRoot() {
method parse (line 1360) | parse(src, extensions, opts) {
FILE: nunjucks/src/precompile-global.js
function precompileGlobal (line 3) | function precompileGlobal(templates, opts) {
FILE: nunjucks/src/precompile.js
function match (line 10) | function match(filename, patterns) {
function precompileString (line 17) | function precompileString(str, opts) {
function precompile (line 29) | function precompile(input, opts) {
function _precompile (line 106) | function _precompile(str, name, env) {
FILE: nunjucks/src/precompiled-loader.js
class PrecompiledLoader (line 5) | class PrecompiledLoader extends Loader {
method constructor (line 6) | constructor(compiledTemplates) {
method getSource (line 11) | getSource(name) {
FILE: nunjucks/src/runtime.js
class Frame (line 13) | class Frame {
method constructor (line 14) | constructor(parent, isolateWrites) {
method set (line 23) | set(name, val, resolveUp) {
method get (line 49) | get(name) {
method lookup (line 57) | lookup(name) {
method resolve (line 66) | resolve(name, forWrite) {
method push (line 75) | push(isolateWrites) {
method pop (line 79) | pop() {
function makeMacro (line 84) | function makeMacro(argNames, kwargNames, func) {
function makeKeywordArgs (line 122) | function makeKeywordArgs(obj) {
function isKeywordArgs (line 127) | function isKeywordArgs(obj) {
function getKeywordArgs (line 131) | function getKeywordArgs(args) {
function numArgs (line 142) | function numArgs(args) {
function SafeString (line 159) | function SafeString(val) {
function copySafeness (line 182) | function copySafeness(dest, target) {
function markSafe (line 189) | function markSafe(val) {
function suppressValue (line 209) | function suppressValue(val, autoescape) {
function ensureDefined (line 219) | function ensureDefined(val, lineno, colno) {
function memberLookup (line 230) | function memberLookup(obj, val) {
function callWrap (line 242) | function callWrap(obj, name, context, args) {
function contextOrFrameLookup (line 252) | function contextOrFrameLookup(context, frame, name) {
function handleError (line 259) | function handleError(error, lineno, colno) {
function asyncEach (line 267) | function asyncEach(arr, dimen, iter, cb) {
function asyncAll (line 294) | function asyncAll(arr, dimen, func, cb) {
function fromIterator (line 350) | function fromIterator(arr) {
FILE: nunjucks/src/tests.js
function callable (line 10) | function callable(value) {
function defined (line 21) | function defined(value) {
function divisibleby (line 34) | function divisibleby(one, two) {
function escaped (line 45) | function escaped(value) {
function equalto (line 56) | function equalto(one, two) {
function even (line 71) | function even(value) {
function falsy (line 85) | function falsy(value) {
function ge (line 98) | function ge(one, two) {
function greaterthan (line 111) | function greaterthan(one, two) {
function le (line 127) | function le(one, two) {
function lessthan (line 140) | function lessthan(one, two) {
function lower (line 154) | function lower(value) {
function ne (line 167) | function ne(one, two) {
function nullTest (line 178) | function nullTest(value) {
function number (line 189) | function number(value) {
function odd (line 200) | function odd(value) {
function string (line 211) | function string(value) {
function truthy (line 223) | function truthy(value) {
function undefinedTest (line 234) | function undefinedTest(value) {
function upper (line 245) | function upper(value) {
function iterable (line 261) | function iterable(value) {
function mapping (line 277) | function mapping(value) {
FILE: nunjucks/src/transformer.js
function gensym (line 7) | function gensym() {
function mapCOW (line 12) | function mapCOW(arr, func) {
function walk (line 29) | function walk(ast, func, depthFirst) {
function depthWalk (line 70) | function depthWalk(ast, func) {
function _liftFilters (line 74) | function _liftFilters(node, asyncFilters, prop) {
function liftFilters (line 116) | function liftFilters(ast, asyncFilters) {
function liftSuper (line 134) | function liftSuper(ast) {
function convertStatements (line 158) | function convertStatements(ast) {
function cps (line 202) | function cps(ast, asyncFilters) {
function transform (line 206) | function transform(ast, asyncFilters) {
FILE: nunjucks/src/web-loaders.js
class WebLoader (line 6) | class WebLoader extends Loader {
method constructor (line 7) | constructor(baseURL, opts) {
method resolve (line 26) | resolve(from, to) {
method getSource (line 30) | getSource(name, cb) {
method fetch (line 61) | fetch(url, cb) {
FILE: samples/express/js/extensions.js
function RemoteExtension (line 2) | function RemoteExtension() {
FILE: scripts/bundle.js
function runWebpack (line 19) | function runWebpack(opts) {
FILE: scripts/lib/precompile.js
function precompileTestTemplates (line 7) | function precompileTestTemplates() {
FILE: scripts/lib/runtests.js
function mochaRun (line 10) | function mochaRun({cliTest = false} = {}) {
function runtests (line 60) | function runtests() {
FILE: scripts/lib/static-server.js
function getStaticServer (line 7) | function getStaticServer(port) {
FILE: scripts/lib/utils.js
function lookup (line 6) | function lookup(relPath, isExecutable) {
function promiseSequence (line 19) | function promiseSequence(promises) {
FILE: tests/cli.js
function execPrecompile (line 15) | function execPrecompile(args, cb) {
FILE: tests/compiler.js
function runLoopTests (line 316) | function runLoopTests(block) {
function templateRender (line 800) | function templateRender() {
function foo (line 835) | function foo() {
function templateRender (line 851) | function templateRender() {
function TestExtension (line 1688) | function TestExtension() {
function TestExtension (line 1717) | function TestExtension() {
function TestExtension (line 1743) | function TestExtension() {
function TestExtension (line 1793) | function TestExtension() {
function TestExtension (line 1990) | function TestExtension() {
FILE: tests/core.js
function rmdir (line 21) | function rmdir(dirPath) {
FILE: tests/lexer.js
function _hasTokens (line 18) | function _hasTokens(ws, tokens, types) {
function hasTokens (line 52) | function hasTokens(tokens /* , types */) {
function hasTokensWithWS (line 56) | function hasTokensWithWS(tokens /* , types */) {
FILE: tests/loader.js
function MyLoader (line 33) | function MyLoader() {
function MyLoader (line 54) | function MyLoader() {
FILE: tests/parser.js
function _isAST (line 21) | function _isAST(node1, node2) {
function isAST (line 83) | function isAST(node1, ast) {
function toNodes (line 92) | function toNodes(ast) {
function TestTagExtension (line 863) | function TestTagExtension() {
function TestBlockTagExtension (line 877) | function TestBlockTagExtension() {
function TestArgsExtension (line 894) | function TestArgsExtension() {
FILE: tests/util.js
function equal (line 47) | function equal(str, ctx, opts, str2, env) {
function jinjaEqual (line 64) | function jinjaEqual(str, ctx, str2, env) {
function finish (line 78) | function finish(done) {
function normEOL (line 86) | function normEOL(str) {
function randomTemplateName (line 93) | function randomTemplateName() {
function render (line 99) | function render(str, ctx, opts, env, cb) {
Condensed preview — 301 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,718K chars).
[
{
"path": ".babelrc",
"chars": 317,
"preview": "{\n \"presets\": [\n [\"@babel/env\", {\n \"loose\": true,\n \"targets\": {\n \"browsers\": [\"last 2 versions\", \"s"
},
{
"path": ".gitattributes",
"chars": 197,
"preview": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n# Checkout example and test fixtur"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1062,
"preview": "## Summary\n\nProposed change:\n\n<!--\n\tPlease replace this with a human-friendly description of your proposed change.\n\t* If"
},
{
"path": ".github/workflows/tests.yml",
"chars": 1652,
"preview": "name: Tests\n\non:\n push:\n pull_request:\n workflow_dispatch:\n\npermissions:\n contents: read\n\njobs:\n tests:\n runs-on"
},
{
"path": ".gitignore",
"chars": 229,
"preview": "node_modules\ncoverage\n.#*\ndocs/_site\ndocs/files\n/src/\n/index.js\n/index.js.map\n/tests/browser/nunjucks*\n.nyc_output\n/brow"
},
{
"path": ".npmignore",
"chars": 68,
"preview": "node_modules\ncoverage\n.nyc_output\ndocs\ntests\nbench\nnunjucks\nscripts\n"
},
{
"path": "CHANGELOG.md",
"chars": 29950,
"preview": "Changelog\n=========\n\n3.2.4 (Apr 13 2023)\n------------------\n\n* HTML encode backslashes when expressions are passed throu"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 691,
"preview": "# Community Participation Guidelines\n\nThis repository is governed by Mozilla's code of conduct and etiquette guidelines."
},
{
"path": "CONTRIBUTING.md",
"chars": 2155,
"preview": "# Contributing\n\nThanks for your interest in contributing! The advice below will help you get your issue fixed / pull req"
},
{
"path": "LICENSE",
"chars": 1311,
"preview": "Copyright (c) 2012-2015, James Long\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or wit"
},
{
"path": "MAINTENANCE.md",
"chars": 2376,
"preview": "\n# Pushing a New Version\n\nNunjucks attempts to adhere to semantic versioning. The API is very stable, so\nfrom here on ou"
},
{
"path": "README.md",
"chars": 2035,
"preview": "# Nunjucks\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n[![CI][github-action"
},
{
"path": "bench/case.html",
"chars": 14819,
"preview": "<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n {% if item.current %}\n <li><strong>{{ it"
},
{
"path": "bench/index.html",
"chars": 1225,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n </head>\n <body>\n <button id=\"start\">Start</button>\n <button id=\"stop\">Stop</but"
},
{
"path": "bench/jinja/index.html",
"chars": 38,
"preview": "{% for x in foo %}{{ x }}{% endfor %}\n"
},
{
"path": "bench/jinja/jinja.py",
"chars": 799,
"preview": "\nimport time\nfrom jinja2 import Template, Environment, FileSystemLoader\n\nenv = Environment(loader=FileSystemLoader('.'))"
},
{
"path": "bench/run.js",
"chars": 1862,
"preview": "'use strict';\n\nvar fs = require('fs');\nvar bench = require('bench');\nvar oldNunjucks = require('nunjucks');\nvar nunjucks"
},
{
"path": "bin/precompile",
"chars": 2146,
"preview": "#!/usr/bin/env node\nvar {program} = require('commander');\nvar precompile = require('../src/precompile').precompile;\nvar "
},
{
"path": "bin/precompile.cmd",
"chars": 111,
"preview": "@IF EXIST \"%~dp0\\node.exe\" (\n \"%~dp0\\node.exe\" \"%~dp0\\precompile\" %*\n) ELSE (\n node \"%~dp0\\precompile\" %*\n)"
},
{
"path": "bower.json",
"chars": 268,
"preview": "{\n \"name\": \"nunjucks\",\n \"main\": \"browser/nunjucks.js\",\n \"ignore\": [\n \"Makefile\",\n \"package.json\",\n \"tests\",\n"
},
{
"path": "codecov.yml",
"chars": 32,
"preview": "comment:\n require_changes: yes\n"
},
{
"path": "contribute.json",
"chars": 688,
"preview": "{\n \"name\": \"Nunjucks\",\n \"description\": \"Nunjucks is a full featured templating engine for javascript. It is heavil"
},
{
"path": "docs/.gitignore",
"chars": 16,
"preview": "_site\n.DS_Store\n"
},
{
"path": "docs/Makefile",
"chars": 144,
"preview": "\nall:\n\tjekyll serve --watch\n\nprod:\n\tcp ../browser/* files\n\trsync -avz ../tests/ files/tests\n\tjekyll build --config _conf"
},
{
"path": "docs/README.md",
"chars": 419,
"preview": "\nThis is a jekyll 2 site that generates the docs for\n[nunjucks](https://github.com/mozilla/nunjucks). If you find a bug\n"
},
{
"path": "docs/_config-prod.yml",
"chars": 19,
"preview": "baseurl: /nunjucks/"
},
{
"path": "docs/_config.yml",
"chars": 113,
"preview": "encoding: utf-8\nmarkdown: redcarpet\nhighlighter: pygments\nredcarpet:\n extensions: [with_toc_data]\n\nbaseurl: /\n"
},
{
"path": "docs/_layouts/page.html",
"chars": 2430,
"preview": "<!DOCTYPE html>\n<html>\n <head>\n <title>Nunjucks</title>\n\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" cont"
},
{
"path": "docs/_layouts/subpage.html",
"chars": 662,
"preview": "---\nlayout: page\n---\n\n<div class=\"content clearfix\">\n <aside class=\"col-sm-3\">\n <div class=\"pages\">\n <p><strong"
},
{
"path": "docs/_plugins/api.rb",
"chars": 1246,
"preview": "require 'redcarpet';\nrequire 'pygments';\n\nmodule Jekyll\n class ApiTag < Liquid::Block\n @@renderer = Class.new(Redcar"
},
{
"path": "docs/_plugins/cleanup.rb",
"chars": 640,
"preview": "\nmodule Jekyll\n module Converters\n class Markdown\n def convert(content) \n setup\n content = @parse"
},
{
"path": "docs/_plugins/locale.rb",
"chars": 1458,
"preview": "# -*- coding: utf-8 -*-\n\nmodule Jekyll\n module LocaleFilter\n\n def locale_buttons(url, baseurl)\n if url.start_wi"
},
{
"path": "docs/_plugins/page_toc.rb",
"chars": 940,
"preview": "require 'redcarpet';\n\nmodule Jekyll\n class PageTocTag < Liquid::Tag\n def initialize(tag_name, args, tokens)\n end\n"
},
{
"path": "docs/api.md",
"chars": 34734,
"preview": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nThe API for nunjucks covers rendering templates, adding filters and"
},
{
"path": "docs/bower_components/bootstrap/.bower.json",
"chars": 533,
"preview": "{\n \"name\": \"bootstrap\",\n \"version\": \"3.0.0\",\n \"main\": [\n \"./dist/js/bootstrap.js\",\n \"./dist/css/bootstrap.css\"\n"
},
{
"path": "docs/bower_components/bootstrap/CNAME",
"chars": 17,
"preview": "getbootstrap.com\n"
},
{
"path": "docs/bower_components/bootstrap/CONTRIBUTING.md",
"chars": 2929,
"preview": "# Contributing to Bootstrap\n\nLooking to contribute something to Bootstrap? **Here's how you can help.**\n\n\n\n## Reporting "
},
{
"path": "docs/bower_components/bootstrap/Gruntfile.js",
"chars": 5475,
"preview": "/* jshint node: true */\n\nmodule.exports = function(grunt) {\n \"use strict\";\n\n // Project configuration.\n grunt.initCon"
},
{
"path": "docs/bower_components/bootstrap/LICENSE",
"chars": 10173,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "docs/bower_components/bootstrap/README.md",
"chars": 6440,
"preview": "# [Bootstrap v3.0.0](http://getbootstrap.com) [](http://"
},
{
"path": "docs/bower_components/bootstrap/_config.yml",
"chars": 960,
"preview": "# Dependencies\nmarkdown: rdiscount\npygments: true\n\n# Permalinks\npermalink: pretty\n\n# Server\ndesti"
},
{
"path": "docs/bower_components/bootstrap/_includes/ads.html",
"chars": 317,
"preview": "<div id=\"carbonads-container\"><div class=\"carbonad\"><div id=\"azcarbon\"></div><script>var z = document.createElement(\"scr"
},
{
"path": "docs/bower_components/bootstrap/_includes/footer.html",
"chars": 1352,
"preview": "<!-- Bootstrap core JavaScript\n================================================== -->\n<!-- Placed at the end of the docu"
},
{
"path": "docs/bower_components/bootstrap/_includes/header.html",
"chars": 1917,
"preview": "<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<meta name=\"description\" c"
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-components.html",
"chars": 4991,
"preview": "<li>\n <a href=\"#glyphicons\">Glyphicons</a>\n <ul class=\"nav\">\n <li><a href=\"#glyphicons-glyphs\">Available glyphs</a>"
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-css.html",
"chars": 3394,
"preview": "<li>\n <a href=\"#overview\">Overview</a>\n <ul class=\"nav\">\n <li><a href=\"#overview-doctype\">HTML5 doctype</a></li>\n "
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-customize.html",
"chars": 1691,
"preview": "<li>\n <a href=\"#less\">LESS components</a>\n</li>\n<li>\n <a href=\"#plugins\">jQuery plugins</a>\n</li>\n<li>\n <a href=\"#les"
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-getting-started.html",
"chars": 1129,
"preview": "<li>\n <a href=\"#download\">Download Bootstrap</a>\n <ul class=\"nav\">\n <li><a href=\"#download-compiled\">Compiled CSS, "
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-javascript.html",
"chars": 2320,
"preview": "<li>\n <a href=\"#js-overview\">Overview</a>\n <ul class=\"nav\">\n <li><a href=\"#js-individual-compiled\">Individual or co"
},
{
"path": "docs/bower_components/bootstrap/_includes/nav-main.html",
"chars": 1417,
"preview": "<header class=\"navbar navbar-inverse navbar-fixed-top bs-docs-nav\" role=\"banner\">\n <div class=\"container\">\n <div cla"
},
{
"path": "docs/bower_components/bootstrap/_includes/old-bs-docs.html",
"chars": 319,
"preview": "<div class=\"bs-old-docs\">\n <div class=\"container\">\n <strong>\n <a href=\"{{ page.base_url }}2.3.2/\">Looking for B"
},
{
"path": "docs/bower_components/bootstrap/_includes/social-buttons.html",
"chars": 925,
"preview": "<div class=\"bs-social\">\n <ul class=\"bs-social-buttons\">\n <li>\n <iframe class=\"github-btn\" src=\"http://ghbtns.co"
},
{
"path": "docs/bower_components/bootstrap/_layouts/default.html",
"chars": 2661,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <!-- Meta, title, CSS, favicons, etc. -->\n {% include header.html %}\n "
},
{
"path": "docs/bower_components/bootstrap/_layouts/home.html",
"chars": 1526,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <!-- Meta, title, CSS, favicons, etc. -->\n {% include header.html %}\n "
},
{
"path": "docs/bower_components/bootstrap/assets/css/docs.css",
"chars": 76774,
"preview": "/*\n * Bootstrap Documentation\n * Special styles for presenting Bootstrap's documentation and code examples.\n *\n * Table "
},
{
"path": "docs/bower_components/bootstrap/assets/css/pygments-manni.css",
"chars": 3005,
"preview": ".hll { background-color: #ffffcc }\n /*{ background: #f0f3f3; }*/\n.c { color: #999; } /* Comment */\n.err { color: #AA0000"
},
{
"path": "docs/bower_components/bootstrap/assets/js/application.js",
"chars": 1887,
"preview": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// +++++++++++++++++++++++++++++++++++"
},
{
"path": "docs/bower_components/bootstrap/assets/js/customizer.js",
"chars": 8930,
"preview": "window.onload = function () { // wait for load in a dumb way because B-0\n var cw = '/*!\\n * Bootstrap v3.0.0\\n *\\n * Co"
},
{
"path": "docs/bower_components/bootstrap/assets/js/filesaver.js",
"chars": 8033,
"preview": "/* Blob.js\n * A Blob implementation.\n * 2013-06-20\n *\n * By Eli Grey, http://eligrey.com\n * By Devin Samarin, https://gi"
},
{
"path": "docs/bower_components/bootstrap/assets/js/holder.js",
"chars": 12522,
"preview": "/*\n\nHolder - 2.0 - client side image placeholders\n(c) 2012-2013 Ivan Malopinsky / http://imsky.co\n\nProvided under the Ap"
},
{
"path": "docs/bower_components/bootstrap/assets/js/html5shiv.js",
"chars": 2376,
"preview": "/*\n HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n(function(l,f){function m(){var a=e.e"
},
{
"path": "docs/bower_components/bootstrap/assets/js/jquery.js",
"chars": 93106,
"preview": "/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery-1.10.2.min."
},
{
"path": "docs/bower_components/bootstrap/assets/js/jszip.js",
"chars": 49549,
"preview": "/**\n\nJSZip - A Javascript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2012 Stuart Kn"
},
{
"path": "docs/bower_components/bootstrap/assets/js/less.js",
"chars": 58184,
"preview": "//\n// LESS - Leaner CSS v1.3.3\n// http://lesscss.org\n//\n// Copyright (c) 2009-2013, Alexis Sellier\n// Licensed under the"
},
{
"path": "docs/bower_components/bootstrap/assets/js/raw-files.js",
"chars": 455851,
"preview": "var __js = {\"affix.js\":\"/* ========================================================================\\n * Bootstrap: affix"
},
{
"path": "docs/bower_components/bootstrap/assets/js/uglify.js",
"chars": 50609,
"preview": "/** @license uglifyweb Copyright (c) 2011, The Dojo Foundation All Rights Reserved.\n * The parts that are unique to this"
},
{
"path": "docs/bower_components/bootstrap/bower.json",
"chars": 197,
"preview": "{\n \"name\": \"bootstrap\",\n \"version\": \"3.0.0\",\n \"main\": [\"./dist/js/bootstrap.js\", \"./dist/css/bootstrap.css\"],\n \"igno"
},
{
"path": "docs/bower_components/bootstrap/browserstack.json",
"chars": 752,
"preview": "{\n \"username\": \"--secure--\",\n \"key\": \"--secure--\",\n \"test_path\": \"js/tests/index.html\",\n \"browsers\": [\n {\n "
},
{
"path": "docs/bower_components/bootstrap/composer.json",
"chars": 547,
"preview": "{\n \"name\": \"twbs/bootstrap\"\n , \"description\": \"Sleek, intuitive, and powerful mobile first front-end framework for f"
},
{
"path": "docs/bower_components/bootstrap/dist/css/bootstrap-theme.css",
"chars": 16819,
"preview": ".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0"
},
{
"path": "docs/bower_components/bootstrap/dist/css/bootstrap.css",
"chars": 119892,
"preview": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "docs/bower_components/bootstrap/dist/js/bootstrap.js",
"chars": 58458,
"preview": "/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/"
},
{
"path": "docs/bower_components/bootstrap/examples/carousel/carousel.css",
"chars": 2397,
"preview": "/* GLOBAL STYLES\n-------------------------------------------------- */\n/* Padding below the footer and lighter body text"
},
{
"path": "docs/bower_components/bootstrap/examples/carousel/index.html",
"chars": 9749,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/grid/grid.css",
"chars": 422,
"preview": ".container {\n padding-left: 15px;\n padding-right: 15px;\n}\n\nh4 {\n margin-top: 25px;\n}\n.row {\n margin-bottom: 20px;\n}\n"
},
{
"path": "docs/bower_components/bootstrap/examples/grid/index.html",
"chars": 4968,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/jumbotron/index.html",
"chars": 4822,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/jumbotron/jumbotron.css",
"chars": 127,
"preview": "/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n padding-top: 50px;\n padding-bottom: 2"
},
{
"path": "docs/bower_components/bootstrap/examples/jumbotron-narrow/index.html",
"chars": 2732,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css",
"chars": 1411,
"preview": "/* Space out content a bit */\nbody {\n padding-top: 20px;\n padding-bottom: 20px;\n}\n\n/* Everything but the jumbotron get"
},
{
"path": "docs/bower_components/bootstrap/examples/justified-nav/index.html",
"chars": 3223,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/justified-nav/justified-nav.css",
"chars": 2424,
"preview": "body {\n padding-top: 20px;\n}\n\n.footer {\n border-top: 1px solid #eee;\n margin-top: 40px;\n padding-top: 40px;\n paddin"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar/index.html",
"chars": 3255,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar/navbar.css",
"chars": 57,
"preview": "body {\npadding: 30px;\n}\n\n.navbar {\nmargin-bottom: 30px;\n}"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar-fixed-top/index.html",
"chars": 3414,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css",
"chars": 52,
"preview": "body {\n min-height: 2000px;\n padding-top: 70px;\n}\n"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar-static-top/index.html",
"chars": 3418,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/navbar-static-top/navbar-static-top.css",
"chars": 77,
"preview": "body {\n min-height: 2000px;\n}\n\n.navbar-static-top {\n margin-bottom: 19px;\n}"
},
{
"path": "docs/bower_components/bootstrap/examples/non-responsive/index.html",
"chars": 3868,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"description\" content=\"\">\n <meta "
},
{
"path": "docs/bower_components/bootstrap/examples/non-responsive/non-responsive.css",
"chars": 2424,
"preview": "\n/* Template-specific stuff\n *\n * Customizations just for the template—these are not necessary for anything\n * with disa"
},
{
"path": "docs/bower_components/bootstrap/examples/offcanvas/index.html",
"chars": 6127,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/offcanvas/offcanvas.css",
"chars": 844,
"preview": "/*\n * Style twaks\n * --------------------------------------------------\n */\nbody {\n padding-top: 70px;\n}\nfooter {\n pad"
},
{
"path": "docs/bower_components/bootstrap/examples/offcanvas/offcanvas.js",
"chars": 137,
"preview": "$(document).ready(function() {\n $('[data-toggle=offcanvas]').click(function() {\n $('.row-offcanvas').toggleClass('ac"
},
{
"path": "docs/bower_components/bootstrap/examples/signin/index.html",
"chars": 1516,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/signin/signin.css",
"chars": 791,
"preview": "body {\n padding-top: 40px;\n padding-bottom: 40px;\n background-color: #eee;\n}\n\n.form-signin {\n max-width: 330px;\n pa"
},
{
"path": "docs/bower_components/bootstrap/examples/starter-template/index.html",
"chars": 2192,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/starter-template/starter-template.css",
"chars": 96,
"preview": "body {\n padding-top: 50px;\n}\n.starter-template {\n padding: 40px 15px;\n text-align: center;\n}\n"
},
{
"path": "docs/bower_components/bootstrap/examples/sticky-footer/index.html",
"chars": 1722,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/sticky-footer/sticky-footer.css",
"chars": 777,
"preview": "/* Sticky footer styles\n-------------------------------------------------- */\n\nhtml,\nbody {\n height: 100%;\n /* The htm"
},
{
"path": "docs/bower_components/bootstrap/examples/sticky-footer-navbar/index.html",
"chars": 3453,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css",
"chars": 854,
"preview": "/* Sticky footer styles\n-------------------------------------------------- */\n\nhtml,\nbody {\n height: 100%;\n /* The htm"
},
{
"path": "docs/bower_components/bootstrap/examples/theme/index.html",
"chars": 16860,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "docs/bower_components/bootstrap/examples/theme/theme.css",
"chars": 199,
"preview": "body {\n padding-top: 70px;\n padding-bottom: 30px;\n}\n\n.theme-dropdown .dropdown-menu {\n display: block;\n position: st"
},
{
"path": "docs/bower_components/bootstrap/js/.jshintrc",
"chars": 256,
"preview": "{\n \"validthis\": true,\n \"laxcomma\" : true,\n \"laxbreak\" : true,\n \"browser\" : true,\n \"eqeqeq\" : false,\n \"eqnull\" "
},
{
"path": "docs/bower_components/bootstrap/js/affix.js",
"chars": 3881,
"preview": "/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs"
},
{
"path": "docs/bower_components/bootstrap/js/alert.js",
"chars": 2602,
"preview": "/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs"
},
{
"path": "docs/bower_components/bootstrap/js/button.js",
"chars": 3068,
"preview": "/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twb"
},
{
"path": "docs/bower_components/bootstrap/js/carousel.js",
"chars": 6465,
"preview": "/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://t"
},
{
"path": "docs/bower_components/bootstrap/js/collapse.js",
"chars": 5248,
"preview": "/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://t"
},
{
"path": "docs/bower_components/bootstrap/js/dropdown.js",
"chars": 4504,
"preview": "/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://t"
},
{
"path": "docs/bower_components/bootstrap/js/modal.js",
"chars": 6995,
"preview": "/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs"
},
{
"path": "docs/bower_components/bootstrap/js/popover.js",
"chars": 3508,
"preview": "/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://tw"
},
{
"path": "docs/bower_components/bootstrap/js/scrollspy.js",
"chars": 4642,
"preview": "/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://"
},
{
"path": "docs/bower_components/bootstrap/js/tab.js",
"chars": 3438,
"preview": "/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.g"
},
{
"path": "docs/bower_components/bootstrap/js/tests/index.html",
"chars": 1696,
"preview": "<!DOCTYPE HTML>\n<html>\n<head>\n <title>Bootstrap Plugin Test Suite</title>\n\n <!-- jquery -->\n <!--<script src=\"http://"
},
{
"path": "docs/bower_components/bootstrap/js/tests/phantom.js",
"chars": 2147,
"preview": "// Simple phantom.js integration script\n// Adapted from Modernizr\n\nfunction waitFor(testFx, onReady, timeOutMillis) {\n "
},
{
"path": "docs/bower_components/bootstrap/js/tests/server.js",
"chars": 332,
"preview": "/*\n * Simple connect server for phantom.js\n * Adapted from Modernizr\n */\n\nvar connect = require('connect')\n , http = re"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/affix.js",
"chars": 791,
"preview": "$(function () {\n\n module(\"affix\")\n\n test(\"should provide no conflict\", function () {\n var affix = $.fn.af"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/alert.js",
"chars": 2101,
"preview": "$(function () {\n\n module(\"alert\")\n\n test(\"should provide no conflict\", function () {\n var alert = $.fn.al"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/button.js",
"chars": 4445,
"preview": "$(function () {\n\n module(\"button\")\n\n test(\"should provide no conflict\", function () {\n var button = $.fn."
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/carousel.js",
"chars": 6381,
"preview": "$(function () {\n\n module(\"carousel\")\n\n test(\"should provide no conflict\", function () {\n var carousel = $"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/collapse.js",
"chars": 5903,
"preview": "$(function () {\n\n module(\"collapse\")\n\n test(\"should provide no conflict\", function () {\n var collapse = $"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/dropdown.js",
"chars": 8414,
"preview": "$(function () {\n\n module(\"dropdowns\")\n\n test(\"should provide no conflict\", function () {\n var dropdown = "
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/modal.js",
"chars": 6132,
"preview": "$(function () {\n\n module(\"modal\")\n\n test(\"should provide no conflict\", function () {\n var modal = $.fn.modal.no"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/phantom.js",
"chars": 2137,
"preview": "/*\n * grunt-contrib-qunit\n * http://gruntjs.com/\n *\n * Copyright (c) 2013 \"Cowboy\" Ben Alman, contributors\n * Licensed u"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/popover.js",
"chars": 5292,
"preview": "$(function () {\n\n module(\"popover\")\n\n test(\"should provide no conflict\", function () {\n var popover = $.f"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/scrollspy.js",
"chars": 1194,
"preview": "$(function () {\n\n module(\"scrollspy\")\n\n test(\"should provide no conflict\", function () {\n var scrollspy ="
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/tab.js",
"chars": 2849,
"preview": "$(function () {\n\n module(\"tabs\")\n\n test(\"should provide no conflict\", function () {\n var tab = $.fn.tab.n"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/tooltip.js",
"chars": 17063,
"preview": "$(function () {\n\n module(\"tooltip\")\n\n test(\"should provide no conflict\", function () {\n var tooltip = $.f"
},
{
"path": "docs/bower_components/bootstrap/js/tests/unit/transition.js",
"chars": 365,
"preview": "$(function () {\n\n module(\"transition\")\n\n test(\"should be defined on jquery support object\", function () {\n "
},
{
"path": "docs/bower_components/bootstrap/js/tests/vendor/jquery.js",
"chars": 93106,
"preview": "/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery-1.10.2.min."
},
{
"path": "docs/bower_components/bootstrap/js/tests/vendor/qunit.css",
"chars": 4560,
"preview": "/**\n * QUnit - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resi"
},
{
"path": "docs/bower_components/bootstrap/js/tests/vendor/qunit.js",
"chars": 38065,
"preview": "/**\n * QUnit - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resi"
},
{
"path": "docs/bower_components/bootstrap/js/tooltip.js",
"chars": 11928,
"preview": "/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://tw"
},
{
"path": "docs/bower_components/bootstrap/js/transition.js",
"chars": 1984,
"preview": "/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http:/"
},
{
"path": "docs/bower_components/bootstrap/less/alerts.less",
"chars": 1429,
"preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
},
{
"path": "docs/bower_components/bootstrap/less/badges.less",
"chars": 1007,
"preview": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n display: inline-block;\n "
},
{
"path": "docs/bower_components/bootstrap/less/bootstrap.less",
"chars": 1296,
"preview": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "docs/bower_components/bootstrap/less/breadcrumbs.less",
"chars": 518,
"preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: 8px 15px;\n margin-bo"
},
{
"path": "docs/bower_components/bootstrap/less/button-groups.less",
"chars": 5235,
"preview": "//\n// Button groups\n// --------------------------------------------------\n\n// Button carets\n//\n// Match the button text "
},
{
"path": "docs/bower_components/bootstrap/less/buttons.less",
"chars": 3328,
"preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
},
{
"path": "docs/bower_components/bootstrap/less/carousel.less",
"chars": 3901,
"preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators"
},
{
"path": "docs/bower_components/bootstrap/less/close.less",
"chars": 683,
"preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-s"
},
{
"path": "docs/bower_components/bootstrap/less/code.less",
"chars": 1210,
"preview": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
},
{
"path": "docs/bower_components/bootstrap/less/component-animations.less",
"chars": 509,
"preview": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `."
},
{
"path": "docs/bower_components/bootstrap/less/dropdowns.less",
"chars": 4147,
"preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display:"
},
{
"path": "docs/bower_components/bootstrap/less/forms.less",
"chars": 8482,
"preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline"
},
{
"path": "docs/bower_components/bootstrap/less/glyphicons.less",
"chars": 14842,
"preview": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus a"
},
{
"path": "docs/bower_components/bootstrap/less/grid.less",
"chars": 12239,
"preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Set the container width, and override it fo"
},
{
"path": "docs/bower_components/bootstrap/less/input-groups.less",
"chars": 3079,
"preview": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.i"
},
{
"path": "docs/bower_components/bootstrap/less/jumbotron.less",
"chars": 882,
"preview": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n ma"
},
{
"path": "docs/bower_components/bootstrap/less/labels.less",
"chars": 992,
"preview": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3e"
},
{
"path": "docs/bower_components/bootstrap/less/list-group.less",
"chars": 1925,
"preview": "//\n// List groups\n// --------------------------------------------------\n\n// Base class\n//\n// Easily usable on <ul>, <ol>"
},
{
"path": "docs/bower_components/bootstrap/less/media.less",
"chars": 848,
"preview": "// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------"
},
{
"path": "docs/bower_components/bootstrap/less/mixins.less",
"chars": 22467,
"preview": "//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clear"
},
{
"path": "docs/bower_components/bootstrap/less/modals.less",
"chars": 3279,
"preview": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scr"
},
{
"path": "docs/bower_components/bootstrap/less/navbar.less",
"chars": 14196,
"preview": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static n"
},
{
"path": "docs/bower_components/bootstrap/less/navs.less",
"chars": 4382,
"preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// ------------------------------------"
},
{
"path": "docs/bower_components/bootstrap/less/normalize.less",
"chars": 7079,
"preview": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\n// ======================================================="
},
{
"path": "docs/bower_components/bootstrap/less/pager.less",
"chars": 865,
"preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @li"
},
{
"path": "docs/bower_components/bootstrap/less/pagination.less",
"chars": 1822,
"preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-"
},
{
"path": "docs/bower_components/bootstrap/less/panels.less",
"chars": 3406,
"preview": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-heigh"
},
{
"path": "docs/bower_components/bootstrap/less/popovers.less",
"chars": 3282,
"preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left"
},
{
"path": "docs/bower_components/bootstrap/less/print.less",
"chars": 1489,
"preview": "//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-"
},
{
"path": "docs/bower_components/bootstrap/less/progress-bars.less",
"chars": 2082,
"preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -----------------------"
},
{
"path": "docs/bower_components/bootstrap/less/responsive-utilities.less",
"chars": 5042,
"preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 Metro responsive\n// Re"
},
{
"path": "docs/bower_components/bootstrap/less/scaffolding.less",
"chars": 2054,
"preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n\n*,\n*:before,\n*:after "
},
{
"path": "docs/bower_components/bootstrap/less/tables.less",
"chars": 4114,
"preview": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n max-width: 100%;\n background-color: @tab"
},
{
"path": "docs/bower_components/bootstrap/less/theme.less",
"chars": 6009,
"preview": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@"
},
{
"path": "docs/bower_components/bootstrap/less/thumbnails.less",
"chars": 563,
"preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.th"
},
{
"path": "docs/bower_components/bootstrap/less/tooltip.less",
"chars": 2440,
"preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n "
},
{
"path": "docs/bower_components/bootstrap/less/type.less",
"chars": 5029,
"preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n"
},
{
"path": "docs/bower_components/bootstrap/less/utilities.less",
"chars": 510,
"preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.c"
},
{
"path": "docs/bower_components/bootstrap/less/variables.less",
"chars": 18691,
"preview": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// ----------------------------"
},
{
"path": "docs/bower_components/bootstrap/less/wells.less",
"chars": 535,
"preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding:"
},
{
"path": "docs/bower_components/bootstrap/package.json",
"chars": 1093,
"preview": "{\n \"name\": \"bootstrap\"\n , \"description\": \"Sleek, intuitive, and powerful front-end framework for faster and easier w"
},
{
"path": "docs/bower_components/jquery/.bower.json",
"chars": 487,
"preview": "{\n \"name\": \"jquery\",\n \"version\": \"2.0.3\",\n \"description\": \"jQuery component\",\n \"keywords\": [\n \"jquery\",\n \"comp"
},
{
"path": "docs/bower_components/jquery/.gitignore",
"chars": 6,
"preview": "build\n"
},
{
"path": "docs/bower_components/jquery/README.md",
"chars": 320,
"preview": "jQuery Component\n================\n\nShim repository for the [jQuery](http://jquery.com).\n\nPackage Managers\n--------------"
},
{
"path": "docs/bower_components/jquery/bower.json",
"chars": 176,
"preview": "{\n \"name\": \"jquery\",\n \"version\": \"2.0.3\",\n \"description\": \"jQuery component\",\n \"keywords\": [\n \"jquery\",\n \"comp"
},
{
"path": "docs/bower_components/jquery/component.json",
"chars": 243,
"preview": "{\n \"name\": \"jquery\",\n \"repo\": \"components/jquery\",\n \"version\": \"2.0.3\",\n \"description\": \"jQuery component\",\n \"keywo"
},
{
"path": "docs/bower_components/jquery/composer.json",
"chars": 881,
"preview": "{\n \"name\": \"components/jquery\",\n \"description\": \"jQuery JavaScript Library\",\n \"type\": \"component\",\n \"homepag"
},
{
"path": "docs/bower_components/jquery/jquery-migrate.js",
"chars": 16178,
"preview": "/*!\n * jQuery Migrate - v1.1.1 - 2013-02-16\n * https://github.com/jquery/jquery-migrate\n * Copyright 2005, 2013 jQuery F"
},
{
"path": "docs/bower_components/jquery/jquery.js",
"chars": 242142,
"preview": "/*!\n * jQuery JavaScript Library v2.0.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Cop"
},
{
"path": "docs/bower_components/jquery/package.json",
"chars": 144,
"preview": "{\n \"name\": \"components-jquery\",\n \"version\": \"2.0.3\",\n \"description\": \"jQuery component\",\n \"keywords\": [\"jquery\"],\n "
},
{
"path": "docs/cn/api.md",
"chars": 19478,
"preview": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nNunjucks 的 API 包括渲染模板,添加过滤器和扩展,自定义模板加载器等等。\n\n**注意**: nunjucks并不是在沙盒中"
},
{
"path": "docs/cn/faq.md",
"chars": 700,
"preview": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# 常见问题\n\n## nunjucks 是否可同时在 node 端和浏览器端使用?\n\n是.\n\n## 是否可在 nunjuck"
},
{
"path": "docs/cn/getting-started.md",
"chars": 1982,
"preview": "---\nlayout: subpage\npageid: getting-started\n---\n\n# 快速上手\n\n## Node 端使用\n\n```\n$ npm install nunjucks\n```\n\n下载后可直接 `require('n"
},
{
"path": "docs/cn/templating.md",
"chars": 16031,
"preview": "---\nlayout: subpage\ntitle: Templates\n---\n{% raw %}\n\n# 模板\n\n这里包括 Nunjuck 所有可用的功能。\n\n> Nunjucks 是\n> [jinja2](http://jinja.po"
},
{
"path": "docs/css/app.css",
"chars": 7203,
"preview": "@font-face {\n\tfont-family: 'Sullivan-Fill';\n\tsrc: url('fonts/Sullivan-Fill.eot');\n\tsrc: local('☺'), url('fonts/Sullivan-"
},
{
"path": "docs/css/highlight.css",
"chars": 3906,
"preview": ".highlight .hll { background-color: #ffffcc }\n.highlight { background: #f8f8f8; }\n.highlight .c { color: #408080; font-"
},
{
"path": "docs/faq.md",
"chars": 2145,
"preview": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# Questions Asked Frequently Enough\n\n## Can I use nunjucks in "
},
{
"path": "docs/fr/api.md",
"chars": 39077,
"preview": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nL'API pour nunjucks couvre le rendu des templates, l'ajout des filt"
},
{
"path": "docs/fr/faq.md",
"chars": 1808,
"preview": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# Questions posées fréquemment\n\n## Puis-je utiliser nunjucks d"
},
{
"path": "docs/fr/getting-started.md",
"chars": 4392,
"preview": "---\nlayout: subpage\npageid: getting-started\n---\n\n# Prise en main\n\n## Lorsque nous utilisons Node ...\n\n```\n$ npm install "
},
{
"path": "docs/fr/templating.md",
"chars": 40072,
"preview": "---\nlayout: subpage\ntitle: Templates\n---\n{% raw %}\n\n# Templating\n\nCeci est un aperçu des caractéristiques des templates "
},
{
"path": "docs/getting-started.md",
"chars": 4386,
"preview": "---\nlayout: subpage\npageid: getting-started\n---\n\n# Getting Started\n\n## User-Defined Templates Warning\n\n nunjucks does n"
},
{
"path": "docs/index.html",
"chars": 8527,
"preview": "---\nlayout: page\npageid: home\n---\n\n<div class=\"twitter\">\n <a href=\"https://twitter.com/share\" class=\"twitter-share-butt"
},
{
"path": "docs/js/app.js",
"chars": 12662,
"preview": "\nvar requestAnimFrame = (window.requestAnimationFrame ||\n window.webkitAnimationFrame ||\n "
},
{
"path": "docs/js/subpage.js",
"chars": 289,
"preview": "$(function() {\n\n var toc = $('.toc');\n if(toc.length) {\n var base = $('body')[0].getBoundingClientRect().to"
}
]
// ... and 101 more files (download for full content)
About this extraction
This page contains the full source code of the mozilla/nunjucks GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 301 files (2.4 MB), approximately 652.9k tokens, and a symbol index with 827 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.