pax_global_header00006660000000000000000000000064133065713730014522gustar00rootroot0000000000000052 comment=edee683bf242f40cc75bee46a78759f6c1589dca raintpl3-3.1.1/000077500000000000000000000000001330657137300132605ustar00rootroot00000000000000raintpl3-3.1.1/.gitignore000066400000000000000000000000521330657137300152450ustar00rootroot00000000000000.DS_Store nbproject vendor/* test/cache/* raintpl3-3.1.1/.travis.yml000066400000000000000000000000641330657137300153710ustar00rootroot00000000000000language: php php: - 5.3 - 5.4 - 5.5 - 5.6 raintpl3-3.1.1/README.md000066400000000000000000000042171330657137300145430ustar00rootroot00000000000000RainTPL 3 ========= By Federico Ulfo and a lot [awesome contributors](https://github.com/rainphp/raintpl3/network)! [RainTPL](http://raintpl.com) is an easy template engine for PHP that enables designers and developers to work better together, it loads HTML template to separate the presentation from the logic. Features -------- * Easy for designers, only 10 tags, *{$variable}*, *{#constant#}*, *{include}*, *{loop}*, *{if}*, *{* comment *}*, *{noparse}*, *{function}* * Easy for developers, 5 methods to load and draw templates. * Powerful, modifier and operation with variables * Extensible, load plugins and register new tags * Secure, sandbox with blacklist. Installation / Usage -------------------- 1. Install composer https://github.com/composer/composer 2. Create a composer.json inside your application folder: ``` json { "require": { "rain/raintpl": ">=3.0.0" } } ``` 3. Run the following code ``` sh $ php composer.phar install ``` 4. Run one example of RainTPL with your browser: ```http://localhost/raintpl3/example.php``` Documentation ------------- The [documentation](https://github.com/rainphp/raintpl3/wiki/Documentation) of RainTPL is divided in [documentation for web designers](https://github.com/rainphp/raintpl3/wiki/Documentation-for-web-designers) and [documentation for PHP developers](https://github.com/rainphp/raintpl3/wiki/Documentation-for-PHP-developers). Licence ------- RainTPL 3, like its antecessor Rain.TPL version 2, is, as of 2018-06-07, published under the MIT Licence. The above applies to RainTPL 3 itself, not the entire content of this repository. Some of the `example-*.php` files and the content below `templates/` in this repository are copies of external code under various licences, such as: * Twitter Bootstrap, under the Apache v2 licence * LESS - Leaner CSS, under the Apache v2 licence Note that not all external content comes with full source code, it’s usually just a copy of (possibly minified or otherwise modified) parts of their distribution. The example files may be used as starting points without limitation except the licences on the external content. raintpl3-3.1.1/cache/000077500000000000000000000000001330657137300143235ustar00rootroot00000000000000raintpl3-3.1.1/cache/.gitignore000066400000000000000000000000021330657137300163030ustar00rootroot00000000000000* raintpl3-3.1.1/composer.json000066400000000000000000000011031330657137300157750ustar00rootroot00000000000000{ "name": "rain/raintpl", "type": "library", "description": "easy and fast template engine", "homepage":"http://raintpl.com", "license": "MIT", "authors": [ { "name": "Federico Ulfo", "email": "rainelemental@gmail.com" }, { "name": "Rain Community" } ], "require": { "php": ">=5.3" }, "require-dev": { "phpunit/phpunit": "4.4.*" }, "minimum-stability": "dev", "autoload": { "psr-0": { "Rain": "library/" } } } raintpl3-3.1.1/composer.lock000066400000000000000000000667641330657137300160040ustar00rootroot00000000000000{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], "hash": "63b9b594c97e46614b14e16b1b4527c4", "packages": [], "packages-dev": [ { "name": "doctrine/instantiator", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", "reference": "40efa2d8c9e2948b29fdf5d782babaacb08d0c86" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/40efa2d8c9e2948b29fdf5d782babaacb08d0c86", "reference": "40efa2d8c9e2948b29fdf5d782babaacb08d0c86", "shasum": "" }, "require": { "php": ">=5.3,<8.0-DEV" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "http://ocramius.github.com/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "homepage": "https://github.com/doctrine/instantiator", "keywords": [ "constructor", "instantiate" ], "time": "2014-12-12 16:47:07" }, { "name": "phpunit/php-code-coverage", "version": "2.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5", "reference": "0e7d2eec5554f869fa7a4ec2d21e4b37af943ea5", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", "phpunit/php-token-stream": "~1.3", "sebastian/environment": "~1.0", "sebastian/version": "~1.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", "phpunit/phpunit": "~4.1" }, "suggest": { "ext-dom": "*", "ext-xdebug": ">=2.2.1", "ext-xmlwriter": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "time": "2014-12-03 06:41:44" }, { "name": "phpunit/php-file-iterator", "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "File/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "time": "2013-10-10 15:34:57" }, { "name": "phpunit/php-text-template", "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "Text/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "time": "2014-01-30 17:20:04" }, { "name": "phpunit/php-timer", "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "time": "2013-08-02 07:42:54" }, { "name": "phpunit/php-token-stream", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", "reference": "f8d5d08c56de5cfd592b3340424a81733259a876" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876", "reference": "f8d5d08c56de5cfd592b3340424a81733259a876", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.3-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Wrapper around PHP's tokenizer extension.", "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ "tokenizer" ], "time": "2014-08-31 06:12:13" }, { "name": "phpunit/phpunit", "version": "4.4.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "b43c27aa18e1e20c9f7013362918cf3d8898e5f6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b43c27aa18e1e20c9f7013362918cf3d8898e5f6", "reference": "b43c27aa18e1e20c9f7013362918cf3d8898e5f6", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", "phpunit/php-code-coverage": "~2.0", "phpunit/php-file-iterator": "~1.3.2", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "~1.0.2", "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.0", "sebastian/diff": "~1.1", "sebastian/environment": "~1.1", "sebastian/exporter": "~1.0", "sebastian/global-state": "~1.0", "sebastian/version": "~1.0", "symfony/yaml": "~2.0" }, "suggest": { "phpunit/php-invoker": "~1.1" }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "4.4.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "time": "2014-12-22 16:18:53" }, { "name": "phpunit/phpunit-mock-objects", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", "reference": "96c5b81f9842f38fe6c73ad0020306cc4862a9e3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/96c5b81f9842f38fe6c73ad0020306cc4862a9e3", "reference": "96c5b81f9842f38fe6c73ad0020306cc4862a9e3", "shasum": "" }, "require": { "doctrine/instantiator": "~1.0,>=1.0.2", "php": ">=5.3.3", "phpunit/php-text-template": "~1.2" }, "require-dev": { "phpunit/phpunit": "4.4.*@dev" }, "suggest": { "ext-soap": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.4.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Mock Object library for PHPUnit", "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", "keywords": [ "mock", "xunit" ], "time": "2014-10-04 10:04:20" }, { "name": "sebastian/comparator", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "4c7f82f0599413ed5521e464071ee8460c96ce89" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/4c7f82f0599413ed5521e464071ee8460c96ce89", "reference": "4c7f82f0599413ed5521e464071ee8460c96ce89", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/diff": "~1.1", "sebastian/exporter": "~1.0" }, "require-dev": { "phpunit/phpunit": "~4.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "http://www.github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "time": "2014-12-04 15:00:21" }, { "name": "sebastian/diff", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "f38057b48125c2b421361da224a8aa800d70aeca" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/f38057b48125c2b421361da224a8aa800d70aeca", "reference": "f38057b48125c2b421361da224a8aa800d70aeca", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", "homepage": "http://www.github.com/sebastianbergmann/diff", "keywords": [ "diff" ], "time": "2014-11-22 06:25:40" }, { "name": "sebastian/environment", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "a4420fdad8ef5e525cdeb66adbb5ed9e873e6128" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a4420fdad8ef5e525cdeb66adbb5ed9e873e6128", "reference": "a4420fdad8ef5e525cdeb66adbb5ed9e873e6128", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "time": "2014-12-15 10:20:32" }, { "name": "sebastian/exporter", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "time": "2014-09-10 00:51:36" }, { "name": "sebastian/global-state", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "231d48620efde984fd077ee92916099a3ece9a59" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/231d48620efde984fd077ee92916099a3ece9a59", "reference": "231d48620efde984fd077ee92916099a3ece9a59", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "suggest": { "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "time": "2014-10-06 09:49:11" }, { "name": "sebastian/version", "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", "shasum": "" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "time": "2014-03-07 15:35:33" }, { "name": "symfony/yaml", "version": "2.7.x-dev", "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", "reference": "b9c19ce1bd9a51d3f42665973088f2e2b82db240" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Yaml/zipball/b9c19ce1bd9a51d3f42665973088f2e2b82db240", "reference": "b9c19ce1bd9a51d3f42665973088f2e2b82db240", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Yaml\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" } ], "description": "Symfony Yaml Component", "homepage": "http://symfony.com", "time": "2014-12-09 17:32:32" } ], "aliases": [], "minimum-stability": "dev", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=5.3" }, "platform-dev": [] } raintpl3-3.1.1/example-all.php000066400000000000000000000045251330657137300162000ustar00rootroot00000000000000 null, "tpl_dir" => "templates/test/", "cache_dir" => "cache/", "remove_comments" => true, "debug" => true, // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin (necessary to load the CSS with path replace) Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); // set variables $var = array( "variable" => "Hello World!", "bad_variable" => "", "safe_variable" => "", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "user" => (object) array("name"=>"Rain", "citizen" => "Earth", "race" => "Human" ), "numbers" => array( 3, 2, 1 ), "bad_text" => 'Hey this is a malicious XSS ', "table" => array( array( "Apple", "1996" ), array( "PC", "1997" ) ), "title" => "Rain TPL 3 - Easy and Fast template engine", "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); // add a tag Tpl::registerTag( "({@.*?@})", // preg split "{@(.*?)@}", // preg match function( $params ){ // function called by the tag $value = $params[1][0]; return "Translate: $value"; } ); // add a tag Tpl::registerTag( "({%.*?%})", // preg split "{%(.*?)(?:\|(.*?))%}", // preg match function( $params ){ // function called by the tag $value = $params[1][0]; $value2 = $params[2][0]; return "Translate: $value in $value2"; } ); // draw $tpl = new Tpl; $tpl->assign( $var ); echo $tpl->draw( "test" ); class Test{ static public function method( $variable ){ echo "Hi I am a static method, and this is the parameter passed to me: $variable!"; } } // endraintpl3-3.1.1/example-bootstrap.php000066400000000000000000000032011330657137300174330ustar00rootroot00000000000000 null, "tpl_dir" => "templates/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); // set variables $var = array( "variable" => "Hello World!", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "user" => (object) array("name"=>"Rain", "citizen" => "Earth", "race" => "Human" ), "numbers" => array( 3, 2, 1 ), "bad_text" => 'Hey this is a malicious XSS ', "table" => array( array( "Apple", "1996" ), array( "PC", "1997" ) ), "title" => "Rain TPL 3 - Easy and Fast template engine", "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); // add a function Tpl::registerTag( "({@.*?@})", // preg split "{@(.*?)@}", // preg match function( $params ){ // function called by the tag $value = $params[0]; return "Translate: $value"; } ); // draw $tpl = new Tpl; $tpl->assign( $var ); echo $tpl->draw( "bootstrap/hero" ); // endraintpl3-3.1.1/example-draw-string.php000066400000000000000000000104371330657137300176700ustar00rootroot00000000000000 null, "tpl_dir" => "templates/test/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); // set variables $var = array( "variable" => "Hello World!", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "user" => (object) array("name"=>"Rain", "citizen" => "Earth", "race" => "Human" ), "numbers" => array( 3, 2, 1 ), "bad_text" => "Hey this is a malicious XSS ", "table" => array( array( "Apple", "1996" ), array( "PC", "1997" ) ), "title" => "Rain TPL 3 - Easy and Fast template engine", "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); // add a tag Tpl::registerTag( "({@.*?@})", // preg split "{@(.*?)@}", // preg match function( $params ){ // function called by the tag $value = $params[1][0]; return "Translate: $value"; } ); // add a tag Tpl::registerTag( "({%.*?%})", // preg split "{%(.*?)(?:\|(.*?))%}", // preg match function( $params ){ // function called by the tag $value = $params[1][0]; $value2 = $params[2][0]; return "Translate: $value in $value2"; } ); $string = file_get_contents( "templates/test/test.html"); class Test{ static public function method( $variable ){ echo "Hi I am a static method, and this is the parameter passed to me: $variable!"; } } // draw $tpl = new Tpl; $tpl->assign( $var ); echo $tpl->drawString( $string ); // -- end //------------------------------------------------------------- // // BENCHMARK/DEBUG FUNCTIONS // //------------------------------------------------------------- echo "
---------
"; echo memoryUsage(); echo "
"; echo timer(); /** * Useful for debug, print the variable $mixed and die */ function dump( $mixed, $exit = 1 ){ echo "
dump \n---------------------- \n\n" . print_r( $mixed, true ) . "\n----------------------
";
    if( $exit ) exit;
}



/**
 * Save the memory used at this point
 */
function memoryUsageStart( $memName = "execution_time" ){
    return $GLOBALS['memoryCounter'][$memName] = memory_get_usage();
}



/**
 * Get the memory used
 */
function memoryUsage( $memName = "execution_time", $byteFormat = true ){
    $totMem = memory_get_usage() - $GLOBALS['memoryCounter'][ $memName ];
    return $byteFormat ? byteFormat($totMem) : $totMem;
}


//-------------------------------------------------------------
//
//					 TIME FUNCTIONS
//
//-------------------------------------------------------------

/**
 * Start the timer
 */
function timerStart( $timeName = "execution_time" ){
    $stimer = explode( ' ', microtime( ) );
    $GLOBALS['timeCounter'][$timeName] = $stimer[ 1 ] + $stimer[ 0 ];
}

/**
 * Get the time passed
 */
function timer( $timeName = "execution_time", $precision = 10 ){
    $etimer = explode( ' ', microtime( ) );
    $timeElapsed = $etimer[ 1 ] + $etimer[ 0 ] - $GLOBALS['timeCounter'][ $timeName ];
    return substr( $timeElapsed, 0, $precision );
}


/**
 * Convert byte to more readable format, like "1 KB" instead of "1024".
 * cut_zero, remove the 0 after comma ex:  10,00 => 10	  14,30 => 14,3
 */
function byteFormat( $size ){
    if( $size > 0 ){
        $unim = array("B","KB","MB","GB","TB","PB");
        for( $i=0; $size >= 1024; $i++ )
            $size = $size / 1024;
        return number_format($size,$i?2:0, ',', '.' )." ".$unim[$i];
    }
}

// endraintpl3-3.1.1/example-extend-class.php000066400000000000000000000025221330657137300200150ustar00rootroot00000000000000var[$key] : $this->var;
    }

    // set function
    function __set( $key, $value ){
        $this->var[$key] = $value;
    }

}


// conf
$config = array(
    "base_url"	=> null,
    "tpl_dir"	=> "templates/raintpl3/",
    "cache_dir"	=> "cache/",
    "debug"         => true, // set to false to improve the speed
    "charset"	=> "iso-8859-1",
);

//use Rain;
MyRainTPL::configure( $config );


// Add PathReplace plugin
MyRainTPL::registerPlugin( new Tpl\Plugin\PathReplace() );


global $global_variable;
$global_variable = "I'm Global";


// draw
$tpl = new MyRainTPL;
$tpl->variable = "Hello World";
$tpl->version = "3.0 Alpha";
$tpl->menu = array(
    array("name" => "Home", "link" => "index.php", "selected" => true ),
    array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ),
    array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null )
);
$tpl->title = "Rain TPL 3 - Easy and Fast template engine";
$tpl->copyright = "Copyright 2006 - 2012 Rain TPL
Project By Rain Team"; $tpl->draw( 'page' ); raintpl3-3.1.1/example-multiple-template-directories.php000066400000000000000000000011131330657137300233740ustar00rootroot00000000000000 array( "templates/multiple-template-directories/newimplement/", "templates/multiple-template-directories/base/" ), "cache_dir" => "cache/", "debug" => true, // set to false to improve the speed ); Tpl::configure($config); // Add PathReplace plugin (necessary to load the CSS with path replace) Tpl::registerPlugin(new Tpl\Plugin\PathReplace()); // create the Tpl object $tpl = new Tpl; $tpl->draw("subfolder/index"); ?>raintpl3-3.1.1/example-nested-loop.php000066400000000000000000000032141330657137300176530ustar00rootroot00000000000000 null, "tpl_dir" => "templates/nested_loop/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); $user = array( array( 'name' => 'Jupiter', 'color' => 'yellow', 'orders' => array( array('order_id' => '123', 'order_name' => 'o1d'), array('order_id' => '1sn24', 'order_name' => 'o2d') ) ), array( 'name' => 'Mars', 'color' => 'red', 'orders' => array( array('order_id' => '3rf22', 'order_name' => '¶©µ¥Aj') ) ), array( 'name' => 'Empty', 'color' => 'blue', 'orders' => array( ) ), array( 'name' => 'Earth', 'color' => 'blue', 'orders' => array( array('order_id' => '2315', 'order_name' => '¶©µ¥15'), array('order_id' => 'rf2123', 'order_name' => '¶©µ¥215'), array('order_id' => '0231', 'order_name' => '¶©µ¥315'), array('order_id' => 'sn09-0fsd', 'order_name' => '¶©µ¥45415') ) ) ); // draw $tpl = new Tpl; $tpl->assign( "user", $user ); echo $tpl->draw( "test" ); class Test{ static public function method( $variable ){ echo "Hi I am a static method, and this is the parameter passed to me: $variable!"; } } // endraintpl3-3.1.1/example-plugin-compress.php000066400000000000000000000032011330657137300205450ustar00rootroot00000000000000 null, "tpl_dir" => "templates/compress/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); Tpl::registerPlugin( new Tpl\Plugin\PathReplace ); $compress = new Tpl\Plugin\Compress; $compress->configure('css', array('status'=>true)); $compress->configure('html', array('status'=>true)); $compress->configure('javascript', array('status'=>true, 'position' => 'bottom')); Tpl::registerPlugin($compress); global $global_variable; $global_variable = "I'm Global"; // set variables $var = array( "variable" => "Hello", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "title" => "Rain TPL 3 - Easy and Fast template engine", "user" => array( array("name" => "Fede", "color" => "blue" ), array("name" => "Laura", "color" => "red" ), array("name" => "Who", "color" => "yellow" ), ), "empty_array" => array(), "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); // draw $tpl = new Tpl; $tpl->assign( $var ); $tpl->draw( "test_compress" ); raintpl3-3.1.1/example-plugin-img-resize.php000066400000000000000000000033321330657137300207720ustar00rootroot00000000000000 null, "tpl_dir" => "templates/image_resize/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin (necessary to load the CSS with path replace) Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); $plugin_options = array( 'quality' => 100, 'crop' => true ); Tpl::registerPlugin( new Tpl\Plugin\ImageResize( $plugin_options ) ); global $global_variable; $global_variable = "I'm Global"; // set variables $var = array( "variable" => "Hello", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "title" => "Rain TPL 3 - Easy and Fast template engine", "user" => array( array("name" => "Fede", "color" => "blue" ), array("name" => "Sheska", "color" => "red" ), array("name" => "Who", "color" => "yellow" ), ), "empty_array" => array(), "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); $test = function( $params ){ $value = $params[0]; return "Translate: $value"; }; // add a function Tpl::registerTag( "({@.*?@})", "{@(.*?)@}", $test ); // draw $tpl = new Tpl; $tpl->assign( $var ); $tpl->draw( "page" ); // endraintpl3-3.1.1/example-simple.php000066400000000000000000000013501330657137300167120ustar00rootroot00000000000000 "templates/simple/", "cache_dir" => "cache/", "debug" => true, // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin (necessary to load the CSS with path replace) Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); // create the Tpl object $tpl = new Tpl; // assign a variable $tpl->assign( "name", "Obi Wan Kenoby" ); // assign an array $tpl->assign( "week", array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ) ); // draw the template $tpl->draw( "simple_template" ); ?>raintpl3-3.1.1/example-webpage-new.php000066400000000000000000000031021330657137300176170ustar00rootroot00000000000000 null, "tpl_dir" => "templates/raintpl3/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); //use Rain; Tpl::configure( $config ); // Add PathReplace plugin Tpl::registerPlugin( new Rain\Tpl\Plugin\PathReplace() ); global $global_variable; $global_variable = "I'm Global"; // set variables $var = array( "variable" => "Hello", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "title" => "Rain TPL 3 - Easy and Fast template engine", "user" => array( array("name" => "Fede", "color" => "blue" ), array("name" => "Sheska", "color" => "red" ), array("name" => "Who", "color" => "yellow" ), ), "empty_array" => array(), "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); $test = function( $params ){ $value = $params[0]; return "Translate: $value"; }; // add a function Tpl::registerTag( "({@.*?@})", "{@(.*?)@}", $test ); // draw $tpl = new Tpl; $tpl->assign( $var ); echo $tpl->draw( "page" ); // endraintpl3-3.1.1/example-webpage.php000066400000000000000000000030361330657137300170360ustar00rootroot00000000000000 null, "tpl_dir" => "templates/raintpl2/", "cache_dir" => "cache/", "debug" => true // set to false to improve the speed ); Tpl::configure( $config ); // Add PathReplace plugin Tpl::registerPlugin( new Tpl\Plugin\PathReplace() ); global $global_variable; $global_variable = "I'm Global"; // set variables $var = array( "variable" => "Hello", "version" => "3.0 Alpha", "menu" => array( array("name" => "Home", "link" => "index.php", "selected" => true ), array("name" => "FAQ", "link" => "index.php/FAQ/", "selected" => null ), array("name" => "Documentation", "link" => "index.php/doc/", "selected" => null ) ), "week" => array( "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ), "title" => "Rain TPL 3 - Easy and Fast template engine", "user" => array( array("name" => "Fede", "color" => "blue" ), array("name" => "Sheska", "color" => "red" ), array("name" => "Who", "color" => "yellow" ), ), "empty_array" => array(), "copyright" => "Copyright 2006 - 2012 Rain TPL
Project By Rain Team", ); function test( $params ){ $value = $params[0]; return "Translate: $value"; }; // add a function Tpl::registerTag( "({@.*?@})", "{@(.*?)@}", "test" ); // draw $tpl = new Tpl; $tpl->assign( $var ); echo $tpl->draw( "page" );raintpl3-3.1.1/library/000077500000000000000000000000001330657137300147245ustar00rootroot00000000000000raintpl3-3.1.1/library/Rain/000077500000000000000000000000001330657137300156155ustar00rootroot00000000000000raintpl3-3.1.1/library/Rain/Tpl.php000066400000000000000000000271461330657137300170770ustar00rootroot00000000000000 array(), 'charset' => 'UTF-8', 'debug' => false, 'tpl_dir' => 'templates/', 'cache_dir' => 'cache/', 'tpl_ext' => 'html', 'base_url' => '', 'php_enabled' => false, 'auto_escape' => true, 'sandbox' => true, 'remove_comments' => false, 'registered_tags' => array(), ); // tags registered by the developers protected static $registered_tags = array(); /** * Draw the template * * @param string $templateFilePath: name of the template file * @param bool $toString: if the method should return a string * or echo the output * * @return void, string: depending of the $toString */ public function draw($templateFilePath, $toString = FALSE) { extract($this->var); // Merge local and static configurations $this->config = $this->objectConf + static::$conf; ob_start(); require $this->checkTemplate($templateFilePath); $html = ob_get_clean(); // Execute plugins, before_parse $context = $this->getPlugins()->createContext(array( 'code' => $html, 'conf' => $this->config, )); $this->getPlugins()->run('afterDraw', $context); $html = $context->code; if ($toString) return $html; else echo $html; } /** * Draw a string * * @param string $string: string in RainTpl format * @param bool $toString: if the param * * @return void, string: depending of the $toString */ public function drawString($string, $toString = false) { extract($this->var); // Merge local and static configurations $this->config = $this->objectConf + static::$conf; ob_start(); require $this->checkString($string); $html = ob_get_clean(); // Execute plugins, before_parse $context = $this->getPlugins()->createContext(array( 'code' => $html, 'conf' => $this->config, )); $this->getPlugins()->run('afterDraw', $context); $html = $context->code; if ($toString) return $html; else echo $html; } /** * Object specific configuration * * @param string, array $setting: name of the setting to configure * or associative array type 'setting' => 'value' * @param mixed $value: value of the setting to configure * @return \Rain\Tpl $this */ public function objectConfigure($setting, $value = null) { if (is_array($setting)) foreach ($setting as $key => $value) $this->objectConfigure($key, $value); else if (isset(static::$conf[$setting])) { // add ending slash if missing if ($setting == "tpl_dir" || $setting == "cache_dir") { $value = self::addTrailingSlash($value); } $this->objectConf[$setting] = $value; } return $this; } /** * Global configurations * * @param string, array $setting: name of the setting to configure * or associative array type 'setting' => 'value' * @param mixed $value: value of the setting to configure */ public static function configure($setting, $value = null) { if (is_array($setting)) foreach ($setting as $key => $value) static::configure($key, $value); else if (isset(static::$conf[$setting])) { // add ending slash if missing if ($setting == "tpl_dir" || $setting == "cache_dir") { $value = self::addTrailingSlash($value); } static::$conf[$setting] = $value; static::$conf['checksum'][$setting] = $value; // take trace of all config } } /** * Assign variable * eg. $t->assign('name','mickey'); * * @param mixed $variable Name of template variable or associative array name/value * @param mixed $value value assigned to this variable. Not set if variable_name is an associative array * * @return \Rain\Tpl $this */ public function assign($variable, $value = null) { if (is_array($variable)) $this->var = $variable + $this->var; else $this->var[$variable] = $value; return $this; } /** * Clean the expired files from cache * @param type $expireTime Set the expiration time */ public static function clean($expireTime = 2592000) { $files = glob(static::$conf['cache_dir'] . "*.rtpl.php"); $time = time() - $expireTime; foreach ($files as $file) if ($time > filemtime($file) ) unlink($file); } /** * Allows the developer to register a tag. * * @param string $tag nombre del tag * @param regexp $parse regular expression to parse the tag * @param anonymous function $function: action to do when the tag is parsed */ public static function registerTag($tag, $parse, $function) { static::$registered_tags[$tag] = array("parse" => $parse, "function" => $function); } /** * Registers a plugin globally. * * @param \Rain\Tpl\IPlugin $plugin * @param string $name name can be used to distinguish plugins of same class. */ public static function registerPlugin(Tpl\IPlugin $plugin, $name = '') { $name = (string)$name ?: \get_class($plugin); static::getPlugins()->addPlugin($name, $plugin); } /** * Removes registered plugin from stack. * * @param string $name */ public static function removePlugin($name) { static::getPlugins()->removePlugin($name); } /** * Returns plugin container. * * @return \Rain\Tpl\PluginContainer */ protected static function getPlugins() { return static::$plugins ?: static::$plugins = new Tpl\PluginContainer(); } /** * Check if the template exist and compile it if necessary * * @param string $template: name of the file of the template * * @throw \Rain\Tpl\NotFoundException the file doesn't exists * @return string: full filepath that php must use to include */ protected function checkTemplate($template) { // set filename $templateName = basename($template); $templateBasedir = strpos($template, '/') !== false ? dirname($template) . '/' : null; $templateDirectory = null; $templateFilepath = null; $parsedTemplateFilepath = null; // Make directories to array for multiple template directory $templateDirectories = $this->config['tpl_dir']; if (!is_array($templateDirectories)) { $templateDirectories = array($templateDirectories); } $isFileNotExist = true; // absolute path if ($template[0] == '/') { $templateDirectory = $templateBasedir; $templateFilepath = $templateDirectory . $templateName . '.' . $this->config['tpl_ext']; $parsedTemplateFilepath = $this->config['cache_dir'] . $templateName . "." . md5($templateDirectory . serialize($this->config['checksum'])) . '.rtpl.php'; // For check templates are exists if (file_exists($templateFilepath)) { $isFileNotExist = false; } } else { foreach($templateDirectories as $templateDirectory) { $templateDirectory .= $templateBasedir; $templateFilepath = $templateDirectory . $templateName . '.' . $this->config['tpl_ext']; $parsedTemplateFilepath = $this->config['cache_dir'] . $templateName . "." . md5($templateDirectory . serialize($this->config['checksum'])) . '.rtpl.php'; // For check templates are exists if (file_exists($templateFilepath)) { $isFileNotExist = false; break; } } } // if the template doesn't exsist throw an error if ($isFileNotExist === true) { $e = new Tpl\NotFoundException('Template ' . $templateName . ' not found!'); throw $e->templateFile($templateFilepath); } // Compile the template if the original has been updated if ($this->config['debug'] || !file_exists($parsedTemplateFilepath) || ( filemtime($parsedTemplateFilepath) < filemtime($templateFilepath) )) { $parser = new Tpl\Parser($this->config, static::$plugins, static::$registered_tags); $parser->compileFile($templateName, $templateBasedir, $templateDirectory, $templateFilepath, $parsedTemplateFilepath); } return $parsedTemplateFilepath; } /** * Compile a string if necessary * * @param string $string: RainTpl template string to compile * * @return string: full filepath that php must use to include */ protected function checkString($string) { // set filename $templateName = md5($string . implode($this->config['checksum'])); $parsedTemplateFilepath = $this->config['cache_dir'] . $templateName . '.s.rtpl.php'; $templateFilepath = ''; $templateBasedir = ''; // Compile the template if the original has been updated if ($this->config['debug'] || !file_exists($parsedTemplateFilepath)) { $parser = new Tpl\Parser($this->config, static::$plugins, static::$registered_tags); $parser->compileString($templateName, $templateBasedir, $templateFilepath, $parsedTemplateFilepath, $string); } return $parsedTemplateFilepath; } private static function addTrailingSlash($folder) { if (is_array($folder)) { foreach($folder as &$f) { $f = self::addTrailingSlash($f); } } elseif ( strlen($folder) > 0 && $folder[0] != '/' ) { $folder = $folder . "/"; } return $folder; } } raintpl3-3.1.1/library/Rain/Tpl/000077500000000000000000000000001330657137300163545ustar00rootroot00000000000000raintpl3-3.1.1/library/Rain/Tpl/Exception.php000066400000000000000000000033201330657137300210210ustar00rootroot00000000000000templateFile; $this->templateFile = (string) $templateFile; return $this; } } // -- end raintpl3-3.1.1/library/Rain/Tpl/IPlugin.php000066400000000000000000000042041330657137300204340ustar00rootroot00000000000000 * public function declare_hooks() { * return array('before_parse', 'after_parse' => 'custom_method'); * } * * * Template will then call the registered method with a context object as parameter. * Context object implements \ArrayAccess. * It's properties depends on hook api. * * Method can modify some properties. No return value is expected. */ interface IPlugin { /** * Returns a list of hooks that are implemented by the plugin. * This should be an array containing: * - a key/value pair where key is hook name and value is implementing method, * - a value only when hook has same name as method. */ public function declareHooks(); /** * Sets plugin options. * * @var array */ public function setOptions($options); } raintpl3-3.1.1/library/Rain/Tpl/NotFoundException.php000066400000000000000000000024521330657137300225030ustar00rootroot00000000000000 array( '({loop.*?})', '/{loop="(?\${0,1}[^"]*)"(?: as (?\$.*?)(?: => (?\$.*?)){0,1}){0,1}}/' ), 'loop_close' => array('({\/loop})', '/{\/loop}/'), 'loop_break' => array('({break})', '/{break}/'), 'loop_continue' => array('({continue})', '/{continue}/'), 'if' => array('({if.*?})', '/{if="([^"]*)"}/'), 'elseif' => array('({elseif.*?})', '/{elseif="([^"]*)"}/'), 'else' => array('({else})', '/{else}/'), 'if_close' => array('({\/if})', '/{\/if}/'), 'autoescape' => array('({autoescape.*?})', '/{autoescape="([^"]*)"}/'), 'autoescape_close' => array('({\/autoescape})', '/{\/autoescape}/'), 'noparse' => array('({noparse})', '/{noparse}/'), 'noparse_close' => array('({\/noparse})', '/{\/noparse}/'), 'ignore' => array('({ignore}|{\*)', '/{ignore}|{\*/'), 'ignore_close' => array('({\/ignore}|\*})', '/{\/ignore}|\*}/'), 'include' => array('({include.*?})', '/{include="([^"]*)"}/'), 'function' => array( '({function.*?})', '/{function="([a-zA-Z_][a-zA-Z_0-9\:]*)(\(.*\)){0,1}"}/' ), 'ternary' => array('({.[^{?]*?\?.*?\:.*?})', '/{(.[^{?]*?)\?(.*?)\:(.*?)}/'), 'variable' => array('({\$.*?})', '/{(\$.*?)}/'), 'constant' => array('({#.*?})', '/{#(.*?)#{0,1}}/'), ); // black list of functions and variables protected static $black_list = array( 'exec', 'shell_exec', 'pcntl_exec', 'passthru', 'proc_open', 'system', 'posix_kill', 'posix_setsid', 'pcntl_fork', 'posix_uname', 'php_uname', 'phpinfo', 'popen', 'file_get_contents', 'file_put_contents', 'rmdir', 'mkdir', 'unlink', 'highlight_contents', 'symlink', 'apache_child_terminate', 'apache_setenv', 'define_syslog_variables', 'escapeshellarg', 'escapeshellcmd', 'eval', 'fp', 'fput', 'ftp_connect', 'ftp_exec', 'ftp_get', 'ftp_login', 'ftp_nb_fput', 'ftp_put', 'ftp_raw', 'ftp_rawlist', 'highlight_file', 'ini_alter', 'ini_get_all', 'ini_restore', 'inject_code', 'mysql_pconnect', 'openlog', 'passthru', 'php_uname', 'phpAds_remoteInfo', 'phpAds_XmlRpc', 'phpAds_xmlrpcDecode', 'phpAds_xmlrpcEncode', 'posix_getpwuid', 'posix_kill', 'posix_mkfifo', 'posix_setpgid', 'posix_setsid', 'posix_setuid', 'posix_uname', 'proc_close', 'proc_get_status', 'proc_nice', 'proc_open', 'proc_terminate', 'syslog', 'xmlrpc_entity_decode' ); public function __construct($config, $plugins, $registered_tags) { $this->config = $config; static::$plugins = $plugins; static::$registered_tags = $registered_tags; } /** * Returns plugin container. * * @return \Rain\Tpl\PluginContainer */ protected static function getPlugins() { return static::$plugins ?: static::$plugins = new PluginContainer(); } /** * Compile the file and save it in the cache * * @param string $templateName: name of the template * @param string $templateBaseDir * @param string $templateDirectory * @param string $templateFilepath * @param string $parsedTemplateFilepath: cache file where to save the template */ public function compileFile( $templateName, $templateBasedir, $templateDirectory, $templateFilepath, $parsedTemplateFilepath ) { // open the template $fp = fopen($templateFilepath, "r"); // lock the file if (flock($fp, LOCK_EX)) { // save the filepath in the info $this->templateInfo['template_filepath'] = $templateFilepath; // read the file $this->templateInfo['code'] = $code = fread($fp, filesize($templateFilepath)); // xml substitution $code = preg_replace("/<\?xml(.*?)\?>/s", /*config['php_enabled']) $code = str_replace(array(""), array("<?", "?>"), $code); // xml re-substitution $code = preg_replace_callback("/##XML(.*?)XML##/s", function( $match ) { return "'; ?>"; }, $code); $parsedCode = $this->compileTemplate($code, $isString = false, $templateBasedir, $templateDirectory, $templateFilepath); $parsedCode = "" . $parsedCode; // fix the php-eating-newline-after-closing-tag-problem $parsedCode = str_replace("?>\n", "?>\n\n", $parsedCode); // create directories if (!is_dir($this->config['cache_dir'])) mkdir($this->config['cache_dir'], 0755, TRUE); // check if the cache is writable if (!is_writable($this->config['cache_dir'])) throw new Exception('Cache directory ' . $this->config['cache_dir'] . 'doesn\'t have write permission. Set write permission or set RAINTPL_CHECK_TEMPLATE_UPDATE to FALSE. More details on http://www.raintpl.com/Documentation/Documentation-for-PHP-developers/Configuration/'); // write compiled file file_put_contents($parsedTemplateFilepath, $parsedCode); // release the file lock flock($fp, LOCK_UN); } // close the file fclose($fp); } /** * Compile a string and save it in the cache * * @param string $templateName: name of the template * @param string $templateBaseDir * @param string $templateFilepath * @param string $parsedTemplateFilepath: cache file where to save the template * @param string $code: code to compile */ public function compileString($templateName, $templateBasedir, $templateFilepath, $parsedTemplateFilepath, $code) { // open the template $fp = fopen($parsedTemplateFilepath, "w"); // lock the file if (flock($fp, LOCK_SH)) { // xml substitution $code = preg_replace("/<\?xml(.*?)\?>/s", "##XML\\1XML##", $code); // disable php tag if (!$this->config['php_enabled']) $code = str_replace(array(""), array("<?", "?>"), $code); // xml re-substitution $code = preg_replace_callback("/##XML(.*?)XML##/s", function( $match ) { return "'; ?>"; }, $code); $parsedCode = $this->compileTemplate($code, $isString = true, $templateBasedir, $templateDirectory = null, $templateFilepath); $parsedCode = "" . $parsedCode; // fix the php-eating-newline-after-closing-tag-problem $parsedCode = str_replace("?>\n", "?>\n\n", $parsedCode); // create directories if (!is_dir($this->config['cache_dir'])) mkdir($this->config['cache_dir'], 0755, true); // check if the cache is writable if (!is_writable($this->config['cache_dir'])) throw new Exception('Cache directory ' . $this->config['cache_dir'] . 'doesn\'t have write permission. Set write permission or set RAINTPL_CHECK_TEMPLATE_UPDATE to false. More details on http://www.raintpl.com/Documentation/Documentation-for-PHP-developers/Configuration/'); // write compiled file fwrite($fp, $parsedCode); // release the file lock flock($fp, LOCK_UN); } // close the file fclose($fp); } /** * Compile template * @access protected * * @param string $code: code to compile */ protected function compileTemplate($code, $isString, $templateBasedir, $templateDirectory, $templateFilepath) { // Execute plugins, before_parse $context = $this->getPlugins()->createContext(array( 'code' => $code, 'template_basedir' => $templateBasedir, 'template_filepath' => $templateFilepath, 'conf' => $this->config, )); $this->getPlugins()->run('beforeParse', $context); $code = $context->code; // set tags foreach (static::$tags as $tag => $tagArray) { list( $split, $match ) = $tagArray; $tagSplit[$tag] = $split; $tagMatch[$tag] = $match; } $keys = array_keys(static::$registered_tags); $tagSplit += array_merge($tagSplit, $keys); //Remove comments if ($this->config['remove_comments']) { $code = preg_replace('//Uis', '', $code); } //split the code with the tags regexp $codeSplit = preg_split("/" . implode("|", $tagSplit) . "/", $code, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); //variables initialization $parsedCode = $commentIsOpen = $ignoreIsOpen = NULL; $openIf = $loopLevel = 0; // if the template is not empty if ($codeSplit) //read all parsed code foreach ($codeSplit as $html) { //close ignore tag if (!$commentIsOpen && preg_match($tagMatch['ignore_close'], $html)) $ignoreIsOpen = FALSE; //code between tag ignore id deleted elseif ($ignoreIsOpen) { //ignore the code } //close no parse tag elseif (preg_match($tagMatch['noparse_close'], $html)) $commentIsOpen = FALSE; //code between tag noparse is not compiled elseif ($commentIsOpen) $parsedCode .= $html; //ignore elseif (preg_match($tagMatch['ignore'], $html)) $ignoreIsOpen = TRUE; //noparse elseif (preg_match($tagMatch['noparse'], $html)) $commentIsOpen = TRUE; //include tag elseif (preg_match($tagMatch['include'], $html, $matches)) { //get the folder of the actual template $actualFolder = $templateDirectory; if (is_array($this->config['tpl_dir'])) { foreach($this->config['tpl_dir'] as $tpl) { if (substr($actualFolder, 0, strlen($tpl)) == $tpl) { $actualFolder = substr($actualFolder, strlen($tpl)); } } } elseif (substr($actualFolder, 0, strlen($this->config['tpl_dir'])) == $this->config['tpl_dir']) { $actualFolder = substr($actualFolder, strlen($this->config['tpl_dir'])); } //get the included template if (strpos($matches[1], '$') !== false) { $includeTemplate = "'$actualFolder'." . $this->varReplace($matches[1], $loopLevel); } else { $includeTemplate = $actualFolder . $this->varReplace($matches[1], $loopLevel); } // reduce the path $includeTemplate = Parser::reducePath( $includeTemplate ); if (strpos($matches[1], '$') !== false) { //dynamic include $parsedCode .= 'checkTemplate(' . $includeTemplate . ');?>'; } else { //dynamic include $parsedCode .= 'checkTemplate("' . $includeTemplate . '");?>'; } } //loop elseif (preg_match($tagMatch['loop'], $html, $matches)) { // increase the loop counter $loopLevel++; //replace the variable in the loop $var = $this->varReplace($matches['variable'], $loopLevel - 1, $escape = FALSE); if (preg_match('#\(#', $var)) { $newvar = "\$newvar{$loopLevel}"; $assignNewVar = "$newvar=$var;"; } else { $newvar = $var; $assignNewVar = null; } // check black list $this->blackList($var); //loop variables $counter = "\$counter$loopLevel"; // count iteration if (isset($matches['key']) && isset($matches['value'])) { $key = $matches['key']; $value = $matches['value']; } elseif (isset($matches['key'])) { $key = "\$key$loopLevel"; // key $value = $matches['key']; } else { $key = "\$key$loopLevel"; // key $value = "\$value$loopLevel"; // value } //loop code $parsedCode .= " $value ){ $counter++; ?>"; } //close loop tag elseif (preg_match($tagMatch['loop_close'], $html)) { //iterator $counter = "\$counter$loopLevel"; //decrease the loop counter $loopLevel--; //close loop code $parsedCode .= ""; } //break loop tag elseif (preg_match($tagMatch['loop_break'], $html)) { //close loop code $parsedCode .= ""; } //continue loop tag elseif (preg_match($tagMatch['loop_continue'], $html)) { //close loop code $parsedCode .= ""; } //if elseif (preg_match($tagMatch['if'], $html, $matches)) { //increase open if counter (for intendation) $openIf++; //tag $tag = $matches[0]; //condition attribute $condition = $matches[1]; // check black list $this->blackList($condition); //variable substitution into condition (no delimiter into the condition) $parsedCondition = $this->varReplace($condition, $loopLevel, $escape = FALSE); //if code $parsedCode .= ""; } //elseif elseif (preg_match($tagMatch['elseif'], $html, $matches)) { //tag $tag = $matches[0]; //condition attribute $condition = $matches[1]; // check black list $this->blackList($condition); //variable substitution into condition (no delimiter into the condition) $parsedCondition = $this->varReplace($condition, $loopLevel, $escape = FALSE); //elseif code $parsedCode .= ""; } //else elseif (preg_match($tagMatch['else'], $html)) { //else code $parsedCode .= ''; } //close if tag elseif (preg_match($tagMatch['if_close'], $html)) { //decrease if counter $openIf--; // close if code $parsedCode .= ''; } // autoescape off elseif (preg_match($tagMatch['autoescape'], $html, $matches)) { // get function $mode = $matches[1]; $this->config['auto_escape_old'] = $this->config['auto_escape']; if ($mode == 'off' or $mode == 'false' or $mode == '0' or $mode == null) { $this->config['auto_escape'] = false; } else { $this->config['auto_escape'] = true; } } // autoescape on elseif (preg_match($tagMatch['autoescape_close'], $html, $matches)) { $this->config['auto_escape'] = $this->config['auto_escape_old']; unset($this->config['auto_escape_old']); } // function elseif (preg_match($tagMatch['function'], $html, $matches)) { // get function $function = $matches[1]; // var replace if (isset($matches[2])) $parsedFunction = $function . $this->varReplace($matches[2], $loopLevel, $escape = FALSE, $echo = FALSE); else $parsedFunction = $function . "()"; // check black list $this->blackList($parsedFunction); // function $parsedCode .= ""; } //ternary elseif (preg_match($tagMatch['ternary'], $html, $matches)) { $parsedCode .= "varReplace($matches[1], $loopLevel, $escape = TRUE, $echo = FALSE) . '?' . $this->varReplace($matches[2], $loopLevel, $escape = TRUE, $echo = FALSE) . ':' . $this->varReplace($matches[3], $loopLevel, $escape = TRUE, $echo = FALSE) . ')' . "; ?>"; } //variables elseif (preg_match($tagMatch['variable'], $html, $matches)) { //variables substitution (es. {$title}) $parsedCode .= "varReplace($matches[1], $loopLevel, $escape = TRUE, $echo = TRUE) . "; ?>"; } //constants elseif (preg_match($tagMatch['constant'], $html, $matches)) { $parsedCode .= "conReplace($matches[1], $loopLevel) . "; ?>"; } // registered tags else { $found = FALSE; foreach (static::$registered_tags as $tags => $array) { if (preg_match_all('/' . $array['parse'] . '/', $html, $matches)) { $found = true; $parsedCode .= ""; } } if (!$found){ $parsedCode .= $html; } } } if ($isString) { if ($openIf > 0) { $trace = debug_backtrace(); $caller = array_shift($trace); $e = new SyntaxException("Error! You need to close an {if} tag in the string, loaded by {$caller['file']} at line {$caller['line']}"); throw $e->templateFile($templateFilepath); } if ($loopLevel > 0) { $trace = debug_backtrace(); $caller = array_shift($trace); $e = new SyntaxException("Error! You need to close the {loop} tag in the string, loaded by {$caller['file']} at line {$caller['line']}"); throw $e->templateFile($templateFilepath); } } else { if ($openIf > 0) { $e = new SyntaxException("Error! You need to close an {if} tag in $templateFilepath template"); throw $e->templateFile($templateFilepath); } if ($loopLevel > 0) { $e = new SyntaxException("Error! You need to close the {loop} tag in $templateFilepath template"); throw $e->templateFile($templateFilepath); } } $html = str_replace('?>code = $parsedCode; $this->getPlugins()->run('afterParse', $context); return $context->code; } protected function varReplace($html, $loopLevel = NULL, $escape = TRUE, $echo = FALSE) { // change variable name if loop level if (!empty($loopLevel)) $html = preg_replace(array('/(\$key)\b/', '/(\$value)\b/', '/(\$counter)\b/'), array('${1}' . $loopLevel, '${1}' . $loopLevel, '${1}' . $loopLevel), $html); // if it is a variable if (preg_match_all('/(\$[a-z_A-Z][^\s]*)/', $html, $matches)) { // substitute . and [] with [" "] for ($i = 0; $i < count($matches[1]); $i++) { $rep = preg_replace('/\[(\${0,1}[a-zA-Z_0-9]*)\]/', '["$1"]', $matches[1][$i]); //$rep = preg_replace('/\.(\${0,1}[a-zA-Z_0-9]*)/', '["$1"]', $rep); $rep = preg_replace( '/\.(\${0,1}[a-zA-Z_0-9]*(?![a-zA-Z_0-9]*(\'|\")))/', '["$1"]', $rep ); $html = str_replace($matches[0][$i], $rep, $html); } // update modifier $html = $this->modifierReplace($html); // if does not initialize a value, e.g. {$a = 1} if (!preg_match('/\$.*=.*/', $html)) { // escape character if ($this->config['auto_escape'] && $escape) //$html = "htmlspecialchars( $html )"; $html = "htmlspecialchars( $html, ENT_COMPAT, '" . $this->config['charset'] . "', FALSE )"; // if is an assignment it doesn't add echo if ($echo) $html = "echo " . $html; } } return $html; } protected function conReplace($html) { $html = $this->modifierReplace($html); return $html; } protected function modifierReplace($html) { $this->blackList($html); if (strpos($html,'|') !== false && substr($html,strpos($html,'|')+1,1) != "|") { preg_match('/([\$a-z_A-Z0-9\(\),\[\]"->]+)\|([\$a-z_A-Z0-9\(\):,\[\]"->\s]+)/i', $html,$result); $function_params = $result[1]; $result[2] = str_replace("::", "@double_dot@", $result[2] ); $explode = explode(":",$result[2]); $function = str_replace('@double_dot@', '::', $explode[0]); $params = isset($explode[1]) ? "," . $explode[1] : null; $html = str_replace($result[0],$function . "(" . $function_params . "$params)",$html); if (strpos($html,'|') !== false && substr($html,strpos($html,'|')+1,1) != "|") { $html = $this->modifierReplace($html); } } return $html; } protected function blackList($html) { if (!$this->config['sandbox'] || !static::$black_list) return true; if (empty($this->config['black_list_preg'])) $this->config['black_list_preg'] = '#[\W\s]*' . implode('[\W\s]*|[\W\s]*', static::$black_list) . '[\W\s]*#'; // check if the function is in the black list (or not in white list) if (preg_match($this->config['black_list_preg'], $html, $match)) { // find the line of the error $line = 0; $rows = explode("\n", $this->templateInfo['code']); while (!strpos($rows[$line], $html) && $line + 1 < count($rows)) $line++; // stop the execution of the script $e = new SyntaxException('Syntax ' . $match[0] . ' not allowed in template: ' . $this->templateInfo['template_filepath'] . ' at line ' . $line); throw $e->templateFile($this->templateInfo['template_filepath']) ->tag($match[0]) ->templateLine($line); return false; } } public static function reducePath( $path ){ // reduce the path $path = str_replace( "://", "@not_replace@", $path ); $path = preg_replace( "#(/+)#", "/", $path ); $path = preg_replace( "#(/\./+)#", "/", $path ); $path = str_replace( "@not_replace@", "://", $path ); while( preg_match('#\w+\.\./#', $path) ) { $path = preg_replace('#\w+/\.\./#', '', $path ); } return $path; } } raintpl3-3.1.1/library/Rain/Tpl/Plugin.php000066400000000000000000000056541330657137300203350ustar00rootroot00000000000000setOptions($options); } /** * Returns a list of hooks that are implemented by the plugin. * This should be an array containing: * - a key/value pair where key is hook name and value is implementing method, * - a value only when hook has same name as method. */ public function declareHooks() { return $this->hooks; } /** * Sets plugin options. * * @var array */ public function setOptions($options) { foreach ((array) $options as $key => $val) { $this->setOption($key, $val); } return $this; } /** * Sets plugin option. * * @param string $name * @param mixed $value * @throws \InvalidArgumentException Wrong option name or value * @return Plugin */ public function setOption($name, $value) { $method = 'set' . ucfirst($name); if (!\method_exists($this, $method)) { throw new \InvalidArgumentException('Key "' . $name . '" is not a valid settings option' ); } $this->{$method}($value); return $this; } } raintpl3-3.1.1/library/Rain/Tpl/Plugin/000077500000000000000000000000001330657137300176125ustar00rootroot00000000000000raintpl3-3.1.1/library/Rain/Tpl/Plugin/Compress.php000066400000000000000000000224031330657137300221170ustar00rootroot00000000000000array('status'=>true), 'css' =>array('status'=>true), 'javascript'=>array('status'=>true, 'position'=>'bottom'), ); /** * Initialize the local configuration */ public function __construct(){ $this->conf = self::$configure; } /** * Function called in the hook afterDraw * @param \ArrayAccess $context */ public function afterDraw(\ArrayAccess $context) { // get the cache directory $this->cache_dir = $context->conf['cache_dir']; $html = $context->code; if( $this->conf['css']['status'] ) $html = $this->compressCSS( $html ); if( $this->conf['javascript']['status'] ) $html = self::compressJavascript( $html ); if( $this->conf['html']['status'] ) $html = $this->compressHTML($html); // save the compressed code $context->code = $html; } /** * Compress the HTML * @param type $html * @return type */ protected function compressHTML($html) { // Set PCRE recursion limit to sane value = STACKSIZE / 500 // ini_set("pcre.recursion_limit", "524"); // 256KB stack. Win32 Apache ini_set("pcre.recursion_limit", "16777"); // 8MB stack. *nix $re = '%# Collapse whitespace everywhere but in blacklisted elements. (?> # Match all whitespans other than single space. [^\S ]\s* # Either one [\t\r\n\f\v] and zero or more ws, | \s{2,} # or two or more consecutive-any-whitespace. ) # Note: The remaining regex consumes no text at all... (?= # Ensure we are not in a blacklist tag. [^<]*+ # Either zero or more non-"<" {normal*} (?: # Begin {(special normal*)*} construct < # or a < starting a non-blacklist tag. (?!/?(?:textarea|pre|script)\b) [^<]*+ # more non-"<" {normal*} )*+ # Finish "unrolling-the-loop" (?: # Begin alternation group. < # Either a blacklist start tag. (?>textarea|pre|script)\b | \z # or end of file. ) # End alternation group. ) # If we made it here, we are not in a blacklist tag. %Six'; $html = preg_replace($re, " ", $html); if ($html === null) exit("PCRE Error! File too big.\n"); return $html; } /** * Compress the CSS * @param type $html * @return type */ protected function compressCSS($html) { // search for all stylesheet if (!preg_match_all("//", $html, $matches)) return $html; // return the HTML if doesn't find any // prepare the variables $externalUrl = array(); $css = $cssName = ""; $urlArray = array(); $cssFiles = $matches[1]; $md5Name = ""; foreach( $cssFiles as $file ){ $md5Name .= basename($file); } $cachedFilename = md5($md5Name); $cacheFolder = $this->cache_dir . "compress/css/"; // css cache folder $cachedFilepath = $cacheFolder . $cachedFilename . ".css"; if( !file_exists($cachedFilepath) ){ // read all the CSS found foreach ($cssFiles as $url) { // if a CSS is repeat it takes only the first if (empty($urlArray[$url])) { $urlArray[$url] = 1; // parse the URL $parse = parse_url($url); // read file $stylesheetFile = file_get_contents($url); // optimize image URL if (preg_match_all("/url\({0,1}(.*?)\)/", $stylesheetFile, $matches)) { foreach ($matches[1] as $imageUrl) { $imageUrl = preg_replace("/'|\"/", "", $imageUrl); dirname($url) . "/" . $imageUrl; $real_path = reduce_path("../../../" . dirname($url) . "/" . $imageUrl); $stylesheetFile = str_replace($imageUrl, $real_path, $stylesheetFile); } } // remove the comments $stylesheetFile = preg_replace("!/\*[^*]*\*+([^/][^*]*\*+)*/!", "", $stylesheetFile); // minify the CSS $stylesheetFile = preg_replace("/\n|\r|\t|\s{4}/", "", $stylesheetFile); $css .= "/*---\n CSS compressed in Rain \n {$url} \n---*/\n\n" . $stylesheetFile . "\n"; } } if (!is_dir($cacheFolder)) mkdir($cacheFolder, 0755, $recursive = true); // save the stylesheet file_put_contents($cachedFilepath, $css); } // remove all the old stylesheet from the page $html = preg_replace("//", "", $html); // create the tag for the stylesheet $tag = ''; // add the tag to the end of the tag $html = str_replace("", $tag . "\n", $html); // return the stylesheet return $html; } /** * Compress the CSS * @param type $html * @return type */ protected function compressJavascript($html) { $htmlToCheck = preg_replace("", "", $html); // search for javascript preg_match_all("//", $htmlToCheck, $matches); $externalUrl = array(); $javascript = ""; $javascriptFiles = $matches[1]; $md5Name = ""; foreach( $javascriptFiles as $file ){ $md5Name .= basename($file); } $cachedFilename = md5($md5Name); $cacheFolder = $this->cache_dir . "compress/js/"; // css cache folder $cachedFilepath = $cacheFolder . $cachedFilename . ".js"; if( !file_exists($cachedFilepath) ){ foreach ($matches[1] as $url) { // if a JS is repeat it takes only the first if (empty($urlArray[$url])) { $urlArray[$url] = $url; // reduce the path $url = \Rain\Tpl\Parser::reducePath( $url ); $javascriptFile = file_get_contents($url); // minify the js $javascriptFile = preg_replace("#/\*.*?\*/#", "", $javascriptFile); $javascriptFile = preg_replace("#\n+|\t+| +#", " ", $javascriptFile); $javascript .= "/*---\n Javascript compressed in Rain \n {$url} \n---*/\n\n" . $javascriptFile . "\n\n"; } } if (!is_dir($cacheFolder)) mkdir($cacheFolder, 0755, $recursive = true); // save the stylesheet file_put_contents($cachedFilepath, $javascript); } $html = preg_replace("//", "", $html); $tag = ''; if( $this->conf['javascript']['position'] == 'bottom' ){ $html = preg_replace("/<\/body>/", $tag . "", $html); } else{ $html = preg_replace("//", "\n".$tag, $html); } return $html; } public function configure( $setting, $value ){ $this->conf[$setting] = self::$configure[$setting] = $value; } public function configureLocal( $setting, $value ){ $this->conf[$setting] = $value; } } raintpl3-3.1.1/library/Rain/Tpl/Plugin/ImageResize.php000066400000000000000000000133041330657137300225300ustar00rootroot00000000000000code; $template_basedir = $context->template_basedir; $quality = $this->quality; $auto_crop = $this->crop; $conf = $context->conf; $img_cache_dir = $template_basedir = $conf['cache_dir']; // get the template base directory $template_directory = $conf['base_url'] . $conf['tpl_dir'] . $template_basedir; // reduce the path $path = preg_replace('/\w+\/\.\.\//', '', $template_directory ); $exp = $sub = array(); $image_resized = false; // match the images if( preg_match_all( '/.*?)"))|(\s*(width="(?.*?)"))|(\s*height="(?.*?)")|(\s*resize="(?.*?)")|(\s*crop="(?.*?)"))*.*?>/', $html, $matches ) ){ for( $i=0,$n=count($matches[0]); $i<$n; $i++ ){ $tag = $matches[0][$i]; $src = $matches['src'][$i]; $w = $matches['width'][$i]; $h = $matches['height'][$i]; $resize = $matches['resize'][$i]; if( $auto_crop ) $crop = $matches['crop'][$i] == 'false' ? false : true; else $crop = $matches['crop'][$i] == 'true' ? true : false; if( $w > 0 && $h > 0 && $resize != 'false' ){ echo $src;exit; $new_tag = preg_replace( '/(.*?)src="(.*?)"(.*?)/', '$1src=""$3', $tag ); $html = str_replace( $tag, $new_tag, $html ); $image_resized = true; } } if( $image_resized ) $html = '' . $html; } $context->code = $html; } public function setQuality($quality) { $this->quality = (int) $quality; return $this; } public function setCrop($crop) { $this->crop = (string) $crop; return $this; } public static function imgResize( $src, $dest, $w, $h, $quality, $crop ){ $ext = substr(strrchr($src, '.'),1); $dest = $dest . 'img.'. md5( $src . $crop . $quality ) . $w . 'x' . $h . '.' . $ext; if( !file_exists( $dest ) ) static::rainImgResize( $src, $dest, $w, $h, $quality, $crop ); return $dest; } public static function rainImgResize($src, $dst, $width, $height, $quality, $crop=0){ if(!list($w, $h) = getimagesize($src)) return "Unsupported picture type!"; $type = strtolower(substr(strrchr($src,"."),1)); if($type == 'jpeg') $type = 'jpg'; switch($type){ case 'bmp': $img = imagecreatefromwbmp($src); break; case 'gif': $img = imagecreatefromgif($src); break; case 'jpg': $img = imagecreatefromjpeg($src); break; case 'png': $img = imagecreatefrompng($src); break; default : return "Unsupported picture type!"; } // resize if($crop){ if($w < $width or $h < $height) return "Picture is too small!"; $ratio = max($width/$w, $height/$h); $h = $height / $ratio; $x = ($w - $width / $ratio) / 2; $w = $width / $ratio; } else{ if($w < $width and $h < $height) return "Picture is too small!"; $ratio = min($width/$w, $height/$h); $width = $w * $ratio; $height = $h * $ratio; $x = 0; } $new = imagecreatetruecolor($width, $height); // preserve transparency if($type == "gif" or $type == "png"){ imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); imagealphablending($new, false); imagesavealpha($new, true); } imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); switch($type){ case 'bmp': imagewbmp($new, $dst, $quality); break; case 'gif': imagegif($new, $dst, $quality); break; case 'jpg': imagejpeg($new, $dst, $quality); break; case 'png': imagepng($new, $dst, $quality); break; } return true; } }raintpl3-3.1.1/library/Rain/Tpl/Plugin/PathReplace.php000066400000000000000000000131101330657137300225070ustar00rootroot00000000000000 template_dir/url * url# => url * http://url => http://url * * @param \ArrayAccess $context */ public function afterParse(\ArrayAccess $context){ // set variables $html = $context->code; $template_basedir = $context->template_basedir; $tags = $this->tags; $basecode = ""; // get the template base directory $template_directory = $basecode . $context->conf['tpl_dir'] . $context->template_basedir; // reduce the path $path = str_replace( "://", "@not_replace@", $template_directory ); $path = preg_replace( "#(/+)#", "/", $path ); $path = preg_replace( "#(/\./+)#", "/", $path ); $path = str_replace( "@not_replace@", "://", $path ); while( preg_match( '#\.\./#', $path ) ){ $path = preg_replace('#\w+/\.\./#', '', $path ); } $exp = $sub = array(); if( in_array( "img", $tags ) ){ $exp = array( '/code = preg_replace( $exp, $sub, $html ); } public function setTags($tags) { $this->tags = (array) $tags; return $this; } } raintpl3-3.1.1/library/Rain/Tpl/PluginContainer.php000066400000000000000000000104411330657137300221660ustar00rootroot00000000000000plugins[(string) $name])) { throw new \InvalidArgumentException('Plugin named "' . $name . '" already exists in container'); } return $this->setPlugin($name, $plugin); } /** * Sets plugin by name. Plugin of same name is replaced when exists. * * @param string $name * @param IPlugin $plugin * @return PluginContainer */ public function setPlugin($name, IPlugin $plugin) { $this->removePlugin($name); $this->plugins[(string) $name] = $plugin; foreach ((array) $plugin->declareHooks() as $hook => $method) { if (is_int($hook)) { // numerical key, method has same name as hook $hook = $method; } $callable = array($plugin, $method); if (!is_callable($callable)) { throw new \InvalidArgumentException(sprintf( 'Wrong callcable suplied by %s for "%s" hook ', get_class($plugin), $hook )); } $this->hooks[$hook][] = $callable; } return $this; } public function removePlugin($name) { $name = (string) $name; if (!isset($this->plugins[$name])) { return; } $plugin = $this->plugins[$name]; unset($this->plugins[$name]); // remove all registered callables foreach ($this->hooks as $hook => &$callables) { foreach ($callables as $i => $callable) { if ($callable[0] === $plugin) { unset($callables[$i]); } } } return $this; } /** * Passes the context object to registered plugins. * * @param string $hook_name * @param \ArrayAccess $context * @return PluginContainer */ public function run($hook_name, \ArrayAccess $context ){ if (!isset($this->hooks[$hook_name])) { return $this; } $context['_hook_name'] = $hook_name; foreach( $this->hooks[$hook_name] as $callable ){ call_user_func($callable, $context); } return $this; } /** * Retuns context object that will be passed to plugins. * * @param array $params * @return \ArrayObject */ public function createContext($params = array()) { return new \ArrayObject((array) $params, \ArrayObject::ARRAY_AS_PROPS); } } raintpl3-3.1.1/library/Rain/Tpl/SyntaxException.php000066400000000000000000000043111330657137300222310ustar00rootroot00000000000000templateLine; $this->templateLine = (int) $line; return $this; } /** * Handles the tag which caused an error. * * @param string | null $tag * * @return \Rain\Tpl_SyntaxException | string | null */ public function tag($tag=null){ if(is_null($tag)) return $this->tag; $this->tag = (string) $tag; return $this; } } // -- end raintpl3-3.1.1/library/Rain/autoload.php000066400000000000000000000036041330657137300201410ustar00rootroot00000000000000"; echo $path; echo "
"; echo $abs_path; echo "

"; } // require the file require_once $abs_path; } }raintpl3-3.1.1/phpunit.xml.dist000066400000000000000000000012141330657137300164310ustar00rootroot00000000000000 ./test/Tpl/ ./library/Rain/ raintpl3-3.1.1/templates/000077500000000000000000000000001330657137300152565ustar00rootroot00000000000000raintpl3-3.1.1/templates/bootstrap/000077500000000000000000000000001330657137300172735ustar00rootroot00000000000000raintpl3-3.1.1/templates/bootstrap/bootstrap.min.css000066400000000000000000001344401330657137300226120ustar00rootroot00000000000000html,body{margin:0;padding:0;} h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;} table{border-collapse:collapse;border-spacing:0;} ol,ul{list-style:none;} q:before,q:after,blockquote:before,blockquote:after{content:"";} html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} a:focus{outline:thin dotted;} a:hover,a:active{outline:0;} article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} audio:not([controls]){display:none;} sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;} sup{top:-0.5em;} sub{bottom:-0.25em;} img{border:0;-ms-interpolation-mode:bicubic;} button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;} button,input{line-height:normal;*overflow:visible;} button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;} button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;} textarea{overflow:auto;vertical-align:top;} body{background-color:#ffffff;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;} .container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;} .container:after{clear:both;} .container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;} .container-fluid:after{clear:both;} .container-fluid>.sidebar{position:absolute;top:0;left:20px;width:220px;} .container-fluid>.content{margin-left:240px;} a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;} .pull-right{float:right;} .pull-left{float:left;} .hide{display:none;} .show{display:block;} .row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;} .row:after{clear:both;} .row>[class*="span"]{display:inline;float:left;margin-left:20px;} .span1{width:40px;} .span2{width:100px;} .span3{width:160px;} .span4{width:220px;} .span5{width:280px;} .span6{width:340px;} .span7{width:400px;} .span8{width:460px;} .span9{width:520px;} .span10{width:580px;} .span11{width:640px;} .span12{width:700px;} .span13{width:760px;} .span14{width:820px;} .span15{width:880px;} .span16{width:940px;} .span17{width:1000px;} .span18{width:1060px;} .span19{width:1120px;} .span20{width:1180px;} .span21{width:1240px;} .span22{width:1300px;} .span23{width:1360px;} .span24{width:1420px;} .row>.offset1{margin-left:80px;} .row>.offset2{margin-left:140px;} .row>.offset3{margin-left:200px;} .row>.offset4{margin-left:260px;} .row>.offset5{margin-left:320px;} .row>.offset6{margin-left:380px;} .row>.offset7{margin-left:440px;} .row>.offset8{margin-left:500px;} .row>.offset9{margin-left:560px;} .row>.offset10{margin-left:620px;} .row>.offset11{margin-left:680px;} .row>.offset12{margin-left:740px;} .span-one-third{width:300px;} .span-two-thirds{width:620px;} .row>.offset-one-third{margin-left:340px;} .row>.offset-two-thirds{margin-left:660px;} p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;} h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;} h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;} h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;} h3,h4,h5,h6{line-height:36px;} h3{font-size:18px;}h3 small{font-size:14px;} h4{font-size:16px;}h4 small{font-size:12px;} h5{font-size:14px;} h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;} ul,ol{margin:0 0 18px 25px;} ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} ul{list-style:disc;} ol{list-style:decimal;} li{line-height:18px;color:#808080;} ul.unstyled{list-style:none;margin-left:0;} dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;} dl dt{font-weight:bold;} dl dd{margin-left:9px;} hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;} strong{font-style:inherit;font-weight:bold;} em{font-style:italic;font-weight:inherit;line-height:inherit;} .muted{color:#bfbfbf;} blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;} blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';} address{display:block;line-height:18px;margin-bottom:18px;} code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;} pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;} form{margin-bottom:18px;} fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;} form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;} form .clearfix:after{clear:both;} label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;} label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;} form .input{margin-left:150px;} input[type=checkbox],input[type=radio]{cursor:pointer;} input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} select{padding:initial;} input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;} input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;} select,input[type=file]{height:27px;*height:auto;line-height:27px;*margin-top:4px;} select[multiple]{height:inherit;background-color:#ffffff;} textarea{height:auto;} .uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} :-moz-placeholder{color:#bfbfbf;} ::-webkit-input-placeholder{color:#bfbfbf;} input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);} input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);} input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;} form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;} form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on{color:#b94a48;background-color:#fce6e6;border-color:#b94a48;} form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline{color:#c09853;} form .clearfix.warning input,form .clearfix.warning textarea{color:#c09853;border-color:#ccae64;}form .clearfix.warning input:focus,form .clearfix.warning textarea:focus{border-color:#be9a3f;-webkit-box-shadow:0 0 6px #e5d6b1;-moz-box-shadow:0 0 6px #e5d6b1;box-shadow:0 0 6px #e5d6b1;} form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on{color:#c09853;background-color:#d2b877;border-color:#c09853;} form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline{color:#468847;} form .clearfix.success input,form .clearfix.success textarea{color:#468847;border-color:#57a957;}form .clearfix.success input:focus,form .clearfix.success textarea:focus{border-color:#458845;-webkit-box-shadow:0 0 6px #9acc9a;-moz-box-shadow:0 0 6px #9acc9a;box-shadow:0 0 6px #9acc9a;} form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on{color:#468847;background-color:#bcddbc;border-color:#468847;} .input-mini,input.mini,textarea.mini,select.mini{width:60px;} .input-small,input.small,textarea.small,select.small{width:90px;} .input-medium,input.medium,textarea.medium,select.medium{width:150px;} .input-large,input.large,textarea.large,select.large{width:210px;} .input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;} .input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;} textarea.xxlarge{overflow-y:auto;} input.span1,textarea.span1{display:inline-block;float:none;width:30px;margin-left:0;} input.span2,textarea.span2{display:inline-block;float:none;width:90px;margin-left:0;} input.span3,textarea.span3{display:inline-block;float:none;width:150px;margin-left:0;} input.span4,textarea.span4{display:inline-block;float:none;width:210px;margin-left:0;} input.span5,textarea.span5{display:inline-block;float:none;width:270px;margin-left:0;} input.span6,textarea.span6{display:inline-block;float:none;width:330px;margin-left:0;} input.span7,textarea.span7{display:inline-block;float:none;width:390px;margin-left:0;} input.span8,textarea.span8{display:inline-block;float:none;width:450px;margin-left:0;} input.span9,textarea.span9{display:inline-block;float:none;width:510px;margin-left:0;} input.span10,textarea.span10{display:inline-block;float:none;width:570px;margin-left:0;} input.span11,textarea.span11{display:inline-block;float:none;width:630px;margin-left:0;} input.span12,textarea.span12{display:inline-block;float:none;width:690px;margin-left:0;} input.span13,textarea.span13{display:inline-block;float:none;width:750px;margin-left:0;} input.span14,textarea.span14{display:inline-block;float:none;width:810px;margin-left:0;} input.span15,textarea.span15{display:inline-block;float:none;width:870px;margin-left:0;} input.span16,textarea.span16{display:inline-block;float:none;width:930px;margin-left:0;} input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} .actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;} .help-inline,.help-block{font-size:13px;line-height:18px;color:#bfbfbf;} .help-inline{padding-left:5px;*position:relative;*top:-5px;} .help-block{display:block;max-width:600px;} .inline-inputs{color:#808080;}.inline-inputs span{padding:0 2px 0 1px;} .input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;} .input-prepend .add-on{*margin-top:1px;} .input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;} .inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;} .inputs-list label{display:block;float:none;width:auto;padding:0;margin-left:20px;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;} .inputs-list label small{font-size:11px;font-weight:normal;} .inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;} .inputs-list:first-child{padding-top:6px;} .inputs-list li+li{padding-top:2px;} .inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;margin-left:-20px;float:left;} .form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;} .form-stacked legend{padding-left:0;} .form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;} .form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;} .form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;} .form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;} .form-stacked .actions{margin-left:-20px;padding-left:20px;} table{width:100%;margin-bottom:18px;padding:0;font-size:13px;border-collapse:collapse;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;} table th{padding-top:9px;font-weight:bold;vertical-align:middle;} table td{vertical-align:top;border-top:1px solid #ddd;} table tbody th{border-top:1px solid #ddd;vertical-align:top;} .condensed-table th,.condensed-table td{padding:5px 5px 4px;} .bordered-table{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.bordered-table th+th,.bordered-table td+td,.bordered-table th+td{border-left:1px solid #ddd;} .bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} .bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} .bordered-table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} .bordered-table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} table .span1{width:20px;} table .span2{width:60px;} table .span3{width:100px;} table .span4{width:140px;} table .span5{width:180px;} table .span6{width:220px;} table .span7{width:260px;} table .span8{width:300px;} table .span9{width:340px;} table .span10{width:380px;} table .span11{width:420px;} table .span12{width:460px;} table .span13{width:500px;} table .span14{width:540px;} table .span15{width:580px;} table .span16{width:620px;} .zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} .zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th{background-color:#f5f5f5;} table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;} table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);} table .header:hover:after{visibility:visible;} table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} table .blue{color:#049cdb;border-bottom-color:#049cdb;} table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;} table .green{color:#46a546;border-bottom-color:#46a546;} table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;} table .red{color:#9d261d;border-bottom-color:#9d261d;} table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;} table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;} table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;} table .orange{color:#f89406;border-bottom-color:#f89406;} table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;} table .purple{color:#7a43b6;border-bottom-color:#7a43b6;} table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;} .topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} .topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;} .topbar h3{position:relative;} .topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;} .topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;} .topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} .topbar form.pull-right{float:right;} .topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;} .topbar input::-webkit-input-placeholder{color:#e6e6e6;} .topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;} .topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);} .topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} .topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;} .topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;} .topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);} .topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;} .topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);} .topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);} .topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;} .topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;} .topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;} .topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;} li.menu,.dropdown{position:relative;} a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} .menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;} .menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;} .topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);} .open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} .open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;} .tabs,.pills{margin:0 0 18px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;} .tabs:after,.pills:after{clear:both;} .tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;} .tabs{border-color:#ddd;border-style:solid;border-width:0 0 1px;}.tabs>li{position:relative;margin-bottom:-1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:34px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;} .tabs .active>a,.tabs .active>a:hover{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} .tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} .tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;} .tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;} .tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;} .pills a{margin:5px 3px 5px 0;padding:0 15px;line-height:30px;text-shadow:0 1px 1px #ffffff;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#00438a;} .pills .active a{color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#0069d6;} .pills-vertical>li{float:none;} .tab-content>.tab-pane,.pill-content>.pill-pane,.tab-content>div,.pill-content>div{display:none;} .tab-content>.active,.pill-content>.active{display:block;} .breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} .breadcrumb .divider{padding:0 5px;color:#bfbfbf;} .breadcrumb .active a{color:#404040;} .hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} .hero-unit p{font-size:18px;font-weight:200;line-height:27px;} footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;} .page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;} .btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;} .btn .close,.alert-message .close{font-family:Arial,sans-serif;line-height:18px;} .btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} .btn:focus{outline:1px dotted #666;} .btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} .btn.active,.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);} .btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} .btn.small{padding:7px 9px 7px;font-size:11px;} :root .alert-message,:root .btn{border-radius:0 \0;} button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} .close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;} .alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{margin-top:1px;*margin-top:0;} .alert-message a{font-weight:bold;color:#404040;} .alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a{color:#ffffff;} .alert-message h5{line-height:18px;} .alert-message p{margin-bottom:0;} .alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;} .alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);} .alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;} .alert-message.block-message ul{margin-bottom:0;} .alert-message.block-message li{color:#404040;} .alert-message.block-message .alert-actions{margin-top:5px;} .alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} .alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;} .alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;} .alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} .alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a{color:#404040;} .pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} .pagination li{display:inline;} .pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;} .pagination a:hover,.pagination .active a{background-color:#c7eefe;} .pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;} .pagination .next a{border:0;} .well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} .modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;} .modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} .modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;} .modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} .modal.fade.in{top:50%;} .modal-header{border-bottom:1px solid #eee;padding:5px 15px;} .modal-body{padding:15px;} .modal-body form{margin-bottom:0;} .modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;} .modal-footer:after{clear:both;} .modal-footer .btn{float:right;margin-left:5px;} .modal .popover,.modal .twipsy{z-index:12000;} .twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} .twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .twipsy-arrow{position:absolute;width:0;height:0;} .popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .popover .arrow{position:absolute;width:0;height:0;} .popover .inner{background:#000000;background:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} .popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;} .popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;} .fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} .label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;text-shadow:none;}.label.important{background-color:#c43c35;} .label.warning{background-color:#f89406;} .label.success{background-color:#46a546;} .label.notice{background-color:#62cffc;} .media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;} .media-grid:after{clear:both;} .media-grid li{display:inline;} .media-grid a{float:left;padding:4px;margin:0 0 18px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;} .media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} raintpl3-3.1.1/templates/bootstrap/hero.html000066400000000000000000000064171330657137300211260ustar00rootroot00000000000000 {$title}

Hello, world!

Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

Learn more »

Heading

Etiam porta sem malesuada magna mollis euismod. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

View details »

Heading

Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.

View details »

Heading

Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

View details »

© Company 2011

raintpl3-3.1.1/templates/bootstrap/js/000077500000000000000000000000001330657137300177075ustar00rootroot00000000000000raintpl3-3.1.1/templates/bootstrap/js/bootstrap-alerts.js000066400000000000000000000064551330657137300235640ustar00rootroot00000000000000/* ========================================================== * bootstrap-alerts.js v1.4.0 * http://twitter.github.com/bootstrap/javascript.html#alerts * ========================================================== * Copyright 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function( $ ){ "use strict" /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) * ======================================================= */ var transitionEnd $(document).ready(function () { $.support.transition = (function () { var thisBody = document.body || document.documentElement , thisStyle = thisBody.style , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined return support })() // set CSS transition event type if ( $.support.transition ) { transitionEnd = "TransitionEnd" if ( $.browser.webkit ) { transitionEnd = "webkitTransitionEnd" } else if ( $.browser.mozilla ) { transitionEnd = "transitionend" } else if ( $.browser.opera ) { transitionEnd = "oTransitionEnd" } } }) /* ALERT CLASS DEFINITION * ====================== */ var Alert = function ( content, options ) { if (options == 'close') return this.close.call(content) this.settings = $.extend({}, $.fn.alert.defaults, options) this.$element = $(content) .delegate(this.settings.selector, 'click', this.close) } Alert.prototype = { close: function (e) { var $element = $(this) , className = 'alert-message' $element = $element.hasClass(className) ? $element : $element.parent() e && e.preventDefault() $element.removeClass('in') function removeElement () { $element.remove() } $.support.transition && $element.hasClass('fade') ? $element.bind(transitionEnd, removeElement) : removeElement() } } /* ALERT PLUGIN DEFINITION * ======================= */ $.fn.alert = function ( options ) { if ( options === true ) { return this.data('alert') } return this.each(function () { var $this = $(this) , data if ( typeof options == 'string' ) { data = $this.data('alert') if (typeof data == 'object') { return data[options].call( $this ) } } $(this).data('alert', new Alert( this, options )) }) } $.fn.alert.defaults = { selector: '.close' } $(document).ready(function () { new Alert($('body'), { selector: '.alert-message[data-alert] .close' }) }) }( window.jQuery || window.ender );raintpl3-3.1.1/templates/bootstrap/js/bootstrap-buttons.js000066400000000000000000000033751330657137300237660ustar00rootroot00000000000000/* ============================================================ * bootstrap-buttons.js v1.4.0 * http://twitter.github.com/bootstrap/javascript.html#buttons * ============================================================ * Copyright 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function( $ ){ "use strict" function setState(el, state) { var d = 'disabled' , $el = $(el) , data = $el.data() state = state + 'Text' data.resetText || $el.data('resetText', $el.html()) $el.html( data[state] || $.fn.button.defaults[state] ) setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d) }, 0) } function toggle(el) { $(el).toggleClass('active') } $.fn.button = function(options) { return this.each(function () { if (options == 'toggle') { return toggle(this) } options && setState(this, options) }) } $.fn.button.defaults = { loadingText: 'loading...' } $(function () { $('body').delegate('.btn[data-toggle]', 'click', function () { $(this).button('toggle') }) }) }( window.jQuery || window.ender );raintpl3-3.1.1/templates/bootstrap/js/bootstrap-dropdown.js000066400000000000000000000032321330657137300241140ustar00rootroot00000000000000/* ============================================================ * bootstrap-dropdown.js v1.4.0 * http://twitter.github.com/bootstrap/javascript.html#dropdown * ============================================================ * Copyright 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function( $ ){ "use strict" /* DROPDOWN PLUGIN DEFINITION * ========================== */ $.fn.dropdown = function ( selector ) { return this.each(function () { $(this).delegate(selector || d, 'click', function (e) { var li = $(this).parent('li') , isActive = li.hasClass('open') clearMenus() !isActive && li.toggleClass('open') return false }) }) } /* APPLY TO STANDARD DROPDOWN ELEMENTS * =================================== */ var d = 'a.menu, .dropdown-toggle' function clearMenus() { $(d).parent('li').removeClass('open') } $(function () { $('html').bind("click", clearMenus) $('body').dropdown( '[data-dropdown] a.menu, [data-dropdown] .dropdown-toggle' ) }) }( window.jQuery || window.ender ); raintpl3-3.1.1/templates/bootstrap/js/bootstrap-modal.js000066400000000000000000000144301330657137300233560ustar00rootroot00000000000000/* ========================================================= * bootstrap-modal.js v1.4.0 * http://twitter.github.com/bootstrap/javascript.html#modal * ========================================================= * Copyright 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ !function( $ ){ "use strict" /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) * ======================================================= */ var transitionEnd $(document).ready(function () { $.support.transition = (function () { var thisBody = document.body || document.documentElement , thisStyle = thisBody.style , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined return support })() // set CSS transition event type if ( $.support.transition ) { transitionEnd = "TransitionEnd" if ( $.browser.webkit ) { transitionEnd = "webkitTransitionEnd" } else if ( $.browser.mozilla ) { transitionEnd = "transitionend" } else if ( $.browser.opera ) { transitionEnd = "oTransitionEnd" } } }) /* MODAL PUBLIC CLASS DEFINITION * ============================= */ var Modal = function ( content, options ) { this.settings = $.extend({}, $.fn.modal.defaults, options) this.$element = $(content) .delegate('.close', 'click.modal', $.proxy(this.hide, this)) if ( this.settings.show ) { this.show() } return this } Modal.prototype = { toggle: function () { return this[!this.isShown ? 'show' : 'hide']() } , show: function () { var that = this this.isShown = true this.$element.trigger('show') escape.call(this) backdrop.call(this, function () { var transition = $.support.transition && that.$element.hasClass('fade') that.$element .appendTo(document.body) .show() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') transition ? that.$element.one(transitionEnd, function () { that.$element.trigger('shown') }) : that.$element.trigger('shown') }) return this } , hide: function (e) { e && e.preventDefault() if ( !this.isShown ) { return this } var that = this this.isShown = false escape.call(this) this.$element .trigger('hide') .removeClass('in') $.support.transition && this.$element.hasClass('fade') ? hideWithTransition.call(this) : hideModal.call(this) return this } } /* MODAL PRIVATE METHODS * ===================== */ function hideWithTransition() { // firefox drops transitionEnd events :{o var that = this , timeout = setTimeout(function () { that.$element.unbind(transitionEnd) hideModal.call(that) }, 500) this.$element.one(transitionEnd, function () { clearTimeout(timeout) hideModal.call(that) }) } function hideModal (that) { this.$element .hide() .trigger('hidden') backdrop.call(this) } function backdrop ( callback ) { var that = this , animate = this.$element.hasClass('fade') ? 'fade' : '' if ( this.isShown && this.settings.backdrop ) { var doAnimate = $.support.transition && animate this.$backdrop = $('