diff --git a/include/smarty/.github/workflows/ci.yml b/include/smarty/.github/workflows/ci.yml
deleted file mode 100644
index e27b60bfc..000000000
--- a/include/smarty/.github/workflows/ci.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
-
-on:
- - pull_request
- - push
-
-name: CI
-
-jobs:
- tests:
- name: Tests
-
- runs-on: ${{ matrix.os }}
-
- env:
- PHP_EXTENSIONS: dom, json, libxml, mbstring, pdo_sqlite, soap, xml, xmlwriter
- PHP_INI_VALUES: assert.exception=1, zend.assertions=1
-
- strategy:
- fail-fast: false
- matrix:
- os:
- - ubuntu-latest
-
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
- - "8.0"
- - "8.1"
-
- compiler:
- - default
-
- include:
- - os: ubuntu-latest
- php-version: "8.0"
- compiler: jit
- - os: ubuntu-latest
- php-version: "8.1"
- compiler: jit
-
- steps:
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Override PHP ini values for JIT compiler
- if: matrix.compiler == 'jit'
- run: echo "PHP_INI_VALUES::assert.exception=1, zend.assertions=1, opcache.enable=1, opcache.enable_cli=1, opcache.optimization_level=-1, opcache.jit=1255, opcache.jit_buffer_size=32M" >> $GITHUB_ENV
-
- - name: Install PHP with extensions
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php-version }}
- coverage: pcov
- extensions: ${{ env.PHP_EXTENSIONS }}
- ini-values: ${{ env.PHP_INI_VALUES }}
-
- - name: Validate composer.json and composer.lock
- run: composer validate
-
- - name: Cache Composer packages
- id: composer-cache
- uses: actions/cache@v2
- with:
- path: vendor
- key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
- restore-keys: |
- ${{ runner.os }}-php-${{ matrix.php-version }}-
-
- - name: Install dependencies
- if: steps.composer-cache.outputs.cache-hit != 'true'
- run: composer install --prefer-dist --no-progress --no-suggest
-
- - name: Run tests with phpunit
- run: ./phpunit.sh
diff --git a/include/smarty/CHANGELOG.md b/include/smarty/CHANGELOG.md
index 39e834837..899cfd7e7 100644
--- a/include/smarty/CHANGELOG.md
+++ b/include/smarty/CHANGELOG.md
@@ -6,6 +6,72 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [4.3.1] - 2023-03-28
+
+### Security
+- Fixed Cross site scripting vulnerability in Javascript escaping. This addresses CVE-2023-28447.
+
+### Fixed
+- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP7 notices for undefined array indexes [#736](https://github.com/smarty-php/smarty/issues/736)
+- `$smarty->muteUndefinedOrNullWarnings()` now treats undefined vars and array access of a null or false variables
+ equivalent across all supported PHP versions
+- `$smarty->muteUndefinedOrNullWarnings()` now allows dereferencing of non-objects across all supported PHP versions [#831](https://github.com/smarty-php/smarty/issues/831)
+- PHP 8.1 deprecation warnings on null strings in modifiers [#834](https://github.com/smarty-php/smarty/pull/834)
+
+## [4.3.0] - 2022-11-22
+
+### Added
+- PHP8.2 compatibility [#775](https://github.com/smarty-php/smarty/pull/775)
+
+### Changed
+- Include docs and demo in the releases [#799](https://github.com/smarty-php/smarty/issues/799)
+- Using PHP functions as modifiers now triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
+- Dropped remaining references to removed PHP-support in Smarty 4 from docs, lexer and security class. [#816](https://github.com/smarty-php/smarty/issues/816)
+- Support umask when writing (template) files and set dir permissions to 777 [#548](https://github.com/smarty-php/smarty/issues/548) [#819](https://github.com/smarty-php/smarty/issues/819)
+
+### Fixed
+- Output buffer is now cleaned for internal PHP errors as well, not just for Exceptions [#514](https://github.com/smarty-php/smarty/issues/514)
+- Fixed recursion and out of memory errors when caching in complicated template set-ups using inheritance and includes [#801](https://github.com/smarty-php/smarty/pull/801)
+- Fixed PHP8.1 deprecation errors in strip_tags
+- Fix Variable Usage in Exception message when unable to load subtemplate [#808](https://github.com/smarty-php/smarty/pull/808)
+- Fixed PHP8.1 deprecation notices for strftime [#672](https://github.com/smarty-php/smarty/issues/672)
+- Fixed PHP8.1 deprecation errors passing null to parameter in trim [#807](https://github.com/smarty-php/smarty/pull/807)
+- Adapt Smarty upper/lower functions to be codesafe (e.g. for Turkish locale) [#586](https://github.com/smarty-php/smarty/pull/586)
+- Bug fix for underscore and limited length in template name in custom resources [#581](https://github.com/smarty-php/smarty/pull/581)
+
+## [4.2.1] - 2022-09-14
+
+### Security
+- Applied appropriate javascript and html escaping in mailto plugin to counter injection attacks [#454](https://github.com/smarty-php/smarty/issues/454)
+
+### Fixed
+- Fixed PHP8.1 deprecation notices in modifiers (upper, explode, number_format and replace) [#755](https://github.com/smarty-php/smarty/pull/755) and [#788](https://github.com/smarty-php/smarty/pull/788)
+- Fixed PHP8.1 deprecation notices in capitalize modifier [#789](https://github.com/smarty-php/smarty/issues/789)
+- Fixed use of `rand()` without a parameter in math function [#794](https://github.com/smarty-php/smarty/issues/794)
+- Fixed unselected year/month/day not working in html_select_date [#395](https://github.com/smarty-php/smarty/issues/395)
+
+## [4.2.0] - 2022-08-01
+
+### Fixed
+- Fixed problems with smarty_mb_str_replace [#549](https://github.com/smarty-php/smarty/issues/549)
+- Fixed second parameter of unescape modifier not working [#777](https://github.com/smarty-php/smarty/issues/777)
+
+### Changed
+- Updated HTML of the debug template [#599](https://github.com/smarty-php/smarty/pull/599)
+
+## [4.1.1] - 2022-05-17
+
+### Security
+- Prevent PHP injection through malicious block name or include file name. This addresses CVE-2022-29221
+
+### Fixed
+- Exclude docs and demo from export and composer [#751](https://github.com/smarty-php/smarty/pull/751)
+- PHP 8.1 deprecation notices in demo/plugins/cacheresource.pdo.php [#706](https://github.com/smarty-php/smarty/issues/706)
+- PHP 8.1 deprecation notices in truncate modifier [#699](https://github.com/smarty-php/smarty/issues/699)
+- Math equation `max(x, y)` didn't work anymore [#721](https://github.com/smarty-php/smarty/issues/721)
+- Fix PHP 8.1 deprecated warning when calling rtrim [#743](https://github.com/smarty-php/smarty/pull/743)
+- PHP 8.1: fix deprecation in escape modifier [#727](https://github.com/smarty-php/smarty/pull/727)
+
## [4.1.0] - 2022-02-06
### Added
diff --git a/include/smarty/README.md b/include/smarty/README.md
index 782f0b2cb..0ef3cfab6 100644
--- a/include/smarty/README.md
+++ b/include/smarty/README.md
@@ -7,7 +7,7 @@ Smarty is a template engine for PHP, facilitating the separation of presentation
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
## Requirements
-Smarty can be run with PHP 7.1 to PHP 8.1.
+Smarty can be run with PHP 7.1 to PHP 8.2.
## Installation
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
diff --git a/include/smarty/SECURITY.md b/include/smarty/SECURITY.md
index d98ea0189..80b5ef5c8 100644
--- a/include/smarty/SECURITY.md
+++ b/include/smarty/SECURITY.md
@@ -2,18 +2,19 @@
## Supported Versions
-Smarty currently supports the latest minor version of Smarty 3 and Smarty 4. (Smarty 4 has not been released yet.)
+Smarty currently supports the latest minor version of Smarty 3 and Smarty 4.
| Version | Supported |
-| ------- | ------------------ |
-| 4.0.x | :white_check_mark: |
+|---------|--------------------|
+| 4.3.x | :white_check_mark: |
| 3.1.x | :white_check_mark: |
| < 3.1 | :x: |
## Reporting a Vulnerability
- If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
- disclose your findings publicly and PLEASE PLEASE do not file an Issue.
+If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
+disclose your findings publicly and **PLEASE** do not file an Issue (because that would disclose your findings
+publicly.)
We will try to confirm the vulnerability and develop a fix if appropriate. When we release the fix, we will publish
a security release. Please let us know if you want to be credited.
diff --git a/include/smarty/docs/appendixes/tips.md b/include/smarty/docs/appendixes/tips.md
index b0ea40cc7..3c6e6b96f 100644
--- a/include/smarty/docs/appendixes/tips.md
+++ b/include/smarty/docs/appendixes/tips.md
@@ -1,23 +1,22 @@
-Tips & Tricks {#tips}
-=============
+# Tips & Tricks
-Blank Variable Handling {#tips.blank.var.handling}
-=======================
+## Blank Variable Handling
There may be times when you want to print a default value for an empty
variable instead of printing nothing, such as printing ` ` so that
html table backgrounds work properly. Many would use an
-[`{if}`](#language.function.if) statement to handle this, but there is a
+[`{if}`](../designers/language-builtin-functions/language-function-if.md) statement to handle this, but there is a
shorthand way with Smarty, using the
-[`default`](#language.modifier.default) variable modifier.
+[`default`](../designers/language-modifiers/language-modifier-default.md) variable modifier.
> **Note**
>
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
-> PHP\'s [`error_reporting()`](&url.php-manual;error_reporting) level or
-> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
+> PHP's [`error_reporting()`](https://www.php.net/error_reporting) level or
+> Smarty's [`$error_reporting`](../programmers/api-variables/variable-error-reporting.md) property and
> a variable had not been assigned to Smarty.
+```smarty
{* the long way *}
{if $title eq ''}
@@ -29,19 +28,18 @@ shorthand way with Smarty, using the
{* the short way *}
{$title|default:' '}
-
+```
-See also [`default`](#language.modifier.default) modifier and [default
-variable handling](#tips.default.var.handling).
+See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [default
+variable handling](#default-variable-handling).
-Default Variable Handling {#tips.default.var.handling}
-=========================
+## Default Variable Handling
If a variable is used frequently throughout your templates, applying the
-[`default`](#language.modifier.default) modifier every time it is
+[`default`](../designers/language-modifiers/language-modifier-default.md) modifier every time it is
mentioned can get a bit ugly. You can remedy this by assigning the
variable its default value with the
-[`{assign}`](#language.function.assign) function.
+[`{assign}`](../designers/language-builtin-functions/language-function-assign.md) function.
{* do this somewhere at the top of your template *}
@@ -52,214 +50,159 @@ variable its default value with the
-See also [`default`](#language.modifier.default) modifier and [blank
-variable handling](#tips.blank.var.handling).
+See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [blank
+variable handling](#blank-variable-handling).
-Passing variable title to header template {#tips.passing.vars}
-=========================================
+## Passing variable title to header template
When the majority of your templates use the same headers and footers, it
is common to split those out into their own templates and
-[`{include}`](#language.function.include) them. But what if the header
+[`{include}`](../designers/language-builtin-functions/language-function-include.md) them. But what if the header
needs to have a different title, depending on what page you are coming
from? You can pass the title to the header as an
-[attribute](#language.syntax.attributes) when it is included.
+[attribute](../designers/language-basic-syntax/language-syntax-attributes.md) when it is included.
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
is passed to the `header.tpl`, and will subsequently be used as the
title.
+```smarty
- {include file='header.tpl' title='Main Page'}
- {* template body goes here *}
- {include file='footer.tpl'}
+{include file='header.tpl' title='Main Page'}
+{* template body goes here *}
+{include file='footer.tpl'}
-
+```
`archives.tpl` - When the archives page is drawn, the title will be
"Archives". Notice in the archive example, we are using a variable from
the `archives_page.conf` file instead of a hard coded variable.
+```smarty
- {config_load file='archive_page.conf'}
+{config_load file='archive_page.conf'}
- {include file='header.tpl' title=#archivePageTitle#}
- {* template body goes here *}
- {include file='footer.tpl'}
+{include file='header.tpl' title=#archivePageTitle#}
+{* template body goes here *}
+{include file='footer.tpl'}
+```
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
-variable is not set, using the [`default`](#language.modifier.default)
+variable is not set, using the [`default`](../designers/language-modifiers/language-modifier-default.md)
variable modifier.
+```smarty
-
+
- {$title|default:'Smarty News'}
+ {$title|default:'Smarty News'}
-
-
+
+
+```
`footer.tpl`
+```smarty
-
+
+```
-Dates {#tips.dates}
-=====
+## Dates
As a rule of thumb, always pass dates to Smarty as
-[timestamps](&url.php-manual;time). This allows template designers to
-use the [`date_format`](#language.modifier.date.format) modifier for
+[timestamps](https://www.php.net/time). This allows template designers to
+use the [`date_format`](../designers/language-modifiers/language-modifier-date-format.md) modifier for
full control over date formatting, and also makes it easy to compare
dates if necessary.
-
- {$startDate|date_format}
-
+```smarty
+{$startDate|date_format}
+```
This will output:
+```
+Jan 4, 2009
+```
- Jan 4, 2009
+```smarty
-
-
-
- {$startDate|date_format:"%Y/%m/%d"}
+{$startDate|date_format:"%Y/%m/%d"}
+```
This will output:
-
- 2009/01/04
-
-
+```
+2009/01/04
+```
Dates can be compared in the template by timestamps with:
+```smarty
- {if $order_date < $invoice_date}
- ...do something..
- {/if}
+{if $order_date < $invoice_date}
+ ...do something..
+{/if}
-
+```
-When using [`{html_select_date}`](#language.function.html.select.date)
+When using [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md)
in a template, the programmer will most likely want to convert the
output from the form back into timestamp format. Here is a function to
help you with that.
+```php
-
+ return mktime(0, 0, 0, $month, $day, $year);
+}
-
+```
+
-See also [`{html_select_date}`](#language.function.html.select.date),
-[`{html_select_time}`](#language.function.html.select.time),
-[`date_format`](#language.modifier.date.format) and
-[`$smarty.now`](#language.variables.smarty.now),
+See also [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md),
+[`{html_select_time}`](../designers/language-custom-functions/language-function-html-select-time.md),
+[`date_format`](../designers/language-modifiers/language-modifier-date-format.md) and
+[`$smarty.now`](../designers/language-variables/language-variables-smarty.md#smarty-now),
-WAP/WML {#tips.wap}
-=======
-
-WAP/WML templates require a php [Content-Type
-header](&url.php-manual;header) to be passed along with the template.
-The easist way to do this would be to write a custom function that
-prints the header. If you are using [caching](#caching), that won\'t
-work so we\'ll do it using the [`{insert}`](#language.function.insert)
-tag; remember `{insert}` tags are not cached! Be sure that there is
-nothing output to the browser before the template, or else the header
-may fail.
-
-
-
-
-
-
-your Smarty template *must* begin with the insert tag :
-
-
- {insert name=header content="Content-Type: text/vnd.wap.wml"}
-
-
-
-
-
-
-
-
-
-
-
-
- Welcome to WAP with Smarty!
- Press OK to continue...
-
-
-
-
-
- Pretty easy isn't it?
-
-
-
-
-
-
-Componentized Templates {#tips.componentized.templates}
-=======================
+## Componentized Templates
Traditionally, programming templates into your applications goes as
follows: First, you accumulate your variables within your PHP
application, (maybe with database queries.) Then, you instantiate your
-Smarty object, [`assign()`](#api.assign) the variables and
-[`display()`](#api.display) the template. So lets say for example we
+Smarty object, [`assign()`](../programmers/api-functions/api-assign.md) the variables and
+[`display()`](../programmers/api-functions/api-display.md) the template. So lets say for example we
have a stock ticker on our template. We would collect the stock data in
our application, then assign these variables in the template and display
-it. Now wouldn\'t it be nice if you could add this stock ticker to any
+it. Now wouldn't it be nice if you could add this stock ticker to any
application by merely including the template, and not worry about
fetching the data up front?
@@ -267,60 +210,59 @@ You can do this by writing a custom plugin for fetching the content and
assigning it to a template variable.
`function.load_ticker.php` - drop file in
-[`$plugins directory`](#variable.plugins.dir)
+[`$plugins directory`](../programmers/api-variables/variable-plugins-dir.md)
+```php
- assign($params['assign'], $ticker_info);
- }
- ?>
+ // assign template variable
+ $smarty->assign($params['assign'], $ticker_info);
+}
-
+```
`index.tpl`
+```smarty
- {load_ticker symbol='SMARTY' assign='ticker'}
+{load_ticker symbol='SMARTY' assign='ticker'}
- Stock Name: {$ticker.name} Stock Price: {$ticker.price}
+Stock Name: {$ticker.name} Stock Price: {$ticker.price}
-
+```
-See also [`{include_php}`](#language.function.include.php),
-[`{include}`](#language.function.include) and
-[`{php}`](#language.function.php).
+See also: [`{include}`](../designers/language-builtin-functions/language-function-include.md).
-Obfuscating E-mail Addresses {#tips.obfuscating.email}
-============================
+## Obfuscating E-mail Addresses
Do you ever wonder how your email address gets on so many spam mailing
lists? One way spammers collect email addresses is from web pages. To
help combat this problem, you can make your email address show up in
scrambled javascript in the HTML source, yet it it will look and work
correctly in the browser. This is done with the
-[`{mailto}`](#language.function.mailto) plugin.
+[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md) plugin.
+```smarty
-
Send inquiries to
- {mailto address=$EmailAddress encode='javascript' subject='Hello'}
-
+
Send inquiries to
+{mailto address=$EmailAddress encode='javascript' subject='Hello'}
+
-
+```
> **Note**
>
@@ -328,5 +270,5 @@ correctly in the browser. This is done with the
> his e-mail collector to decode these values, but not likely\....
> hopefully..yet \... wheres that quantum computer :-?.
-See also [`escape`](#language.modifier.escape) modifier and
-[`{mailto}`](#language.function.mailto).
+See also [`escape`](../designers/language-modifiers/language-modifier-escape.md) modifier and
+[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md).
diff --git a/include/smarty/docs/appendixes/troubleshooting.md b/include/smarty/docs/appendixes/troubleshooting.md
index fe012c12c..8364534af 100644
--- a/include/smarty/docs/appendixes/troubleshooting.md
+++ b/include/smarty/docs/appendixes/troubleshooting.md
@@ -1,20 +1,18 @@
-Troubleshooting
-===============
+# Troubleshooting
-Smarty/PHP errors {#smarty.php.errors}
-=================
+## Smarty/PHP errors
Smarty can catch many errors such as missing tag attributes or malformed
variable names. If this happens, you will see an error similar to the
following:
+```
+Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
+ in /path/to/smarty/Smarty.class.php on line 1041
- Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
- in /path/to/smarty/Smarty.class.php on line 1041
-
- Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
- in /path/to/smarty/Smarty.class.php on line 1041
-
+Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
+ in /path/to/smarty/Smarty.class.php on line 1041
+```
Smarty shows you the template name, the line number and the error. After
@@ -25,96 +23,82 @@ There are certain errors that Smarty cannot catch, such as missing close
tags. These types of errors usually end up in PHP compile-time parsing
errors.
-
- Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
-
-
-
+`Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75`
+
When you encounter a PHP parsing error, the error line number will
correspond to the compiled PHP script, NOT the template itself. Usually
you can look at the template and spot the syntax error. Here are some
common things to look for: missing close tags for
-[`{if}{/if}`](#language.function.if) or
-[`{section}{/section}`](#language.function.if), or syntax of logic
-within an `{if}` tag. If you can\'t find the error, you might have to
+[`{if}{/if}`](../designers/language-builtin-functions/language-function-if.md) or
+[`{section}{/section}`](../designers/language-builtin-functions/language-function-section.md),
+or syntax of logic within an `{if}` tag. If you can\'t find the error, you might have to
open the compiled PHP file and go to the line number to figure out where
the corresponding error is in the template.
+```
+Warning: Smarty error: unable to read resource: "index.tpl" in...
+```
+or
+```
+Warning: Smarty error: unable to read resource: "site.conf" in...
+```
- Warning: Smarty error: unable to read resource: "index.tpl" in...
- or
- Warning: Smarty error: unable to read resource: "site.conf" in...
-
-- The [`$template_dir`](#variable.template.dir) is incorrect, doesn\'t
+- The [`$template_dir`](../programmers/api-variables/variable-template-dir.md) is incorrect, doesn't
exist or the file `index.tpl` is not in the `templates/` directory
-- A [`{config_load}`](#language.function.config.load) function is
- within a template (or [`configLoad()`](#api.config.load) has been
- called) and either [`$config_dir`](#variable.config.dir) is
+- A [`{config_load}`](../designers/language-builtin-functions/language-function-config-load.md) function is
+ within a template (or [`configLoad()`](../programmers/api-functions/api-config-load.md) has been
+ called) and either [`$config_dir`](../programmers/api-variables/variable-config-dir.md) is
incorrect, does not exist or `site.conf` is not in the directory.
-
+```
+Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
+or is not a directory...
+```
-
- Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
- or is not a directory...
-
-
-
-- Either the [`$compile_dir`](#variable.compile.dir)is incorrectly
+- Either the [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md)is incorrectly
set, the directory does not exist, or `templates_c` is a file and
not a directory.
-
-
-
- Fatal error: Smarty error: unable to write to $compile_dir '....
-
+```
+Fatal error: Smarty error: unable to write to $compile_dir '....
+```
-- The [`$compile_dir`](#variable.compile.dir) is not writable by the
+- The [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md) is not writable by the
web server. See the bottom of the [installing
- smarty](#installing.smarty.basic) page for more about permissions.
-
-
-
-
- Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
- or is not a directory. in /..
+ smarty](../getting-started.md#installation) page for more about permissions.
+```
+Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
+or is not a directory. in /..
+```
-
-- This means that [`$caching`](#variable.caching) is enabled and
- either; the [`$cache_dir`](#variable.cache.dir) is incorrectly set,
+- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and
+ either; the [`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is incorrectly set,
the directory does not exist, or `cache/` is a file and not a
directory.
-
+```
+Fatal error: Smarty error: unable to write to $cache_dir '/...
+```
-
- Fatal error: Smarty error: unable to write to $cache_dir '/...
-
-
-
-- This means that [`$caching`](#variable.caching) is enabled and the
- [`$cache_dir`](#variable.cache.dir) is not writable by the web
+- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and the
+ [`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is not writable by the web
server. See the bottom of the [installing
- smarty](#installing.smarty.basic) page for permissions.
+ smarty](../getting-started.md#installation) page for permissions.
-
+```
+Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
+in /path/to/smarty/libs/sysplugins/smarty_resource.php
+```
-
- Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
- in /path/to/smarty/libs/sysplugins/smarty_resource.php
-
-
-
-- This means that your application registered a custom error hander
- (using [set\_error\_handler()](&url.php-manual;set_error_handler))
+- This means that your application registered a custom error handler
+ (using [set_error_handler()](https://www.php.net/set_error_handler))
which is not respecting the given `$errno` as it should. If, for
whatever reason, this is the desired behaviour of your custom error
handler, please call
- [`muteExpectedErrors()`](#api.mute.expected.errors) after you\'ve
+ [`muteExpectedErrors()`](../programmers/api-functions/api-mute-expected-errors.md) after you've
registered your custom error handler.
-See also [debugging](#chapter.debugging.console).
+See also [debugging](../designers/chapter-debugging-console.md).
diff --git a/include/smarty/docs/designers/chapter-debugging-console.md b/include/smarty/docs/designers/chapter-debugging-console.md
index 6429b4876..6704fce2f 100644
--- a/include/smarty/docs/designers/chapter-debugging-console.md
+++ b/include/smarty/docs/designers/chapter-debugging-console.md
@@ -1,5 +1,4 @@
-Debugging Console {#chapter.debugging.console}
-=================
+# Debugging Console
There is a debugging console included with Smarty. The console informs
you of all the [included](./language-builtin-functions/language-function-include.md) templates,
diff --git a/include/smarty/docs/designers/config-files.md b/include/smarty/docs/designers/config-files.md
index c840e3a67..1e1db2d5a 100644
--- a/include/smarty/docs/designers/config-files.md
+++ b/include/smarty/docs/designers/config-files.md
@@ -1,5 +1,4 @@
-Config Files {#config.files}
-============
+# Config Files
Config files are handy for designers to manage global template variables
from one file. One example is template colors. Normally if you wanted to
@@ -8,39 +7,38 @@ each and every template file and change the colors. With a config file,
the colors can be kept in one place, and only one file needs to be
updated.
+```ini
+# global variables
+pageTitle = "Main Menu"
+bodyBgColor = #000000
+tableBgColor = #000000
+rowBgColor = #00ff00
- # global variables
- pageTitle = "Main Menu"
- bodyBgColor = #000000
- tableBgColor = #000000
- rowBgColor = #00ff00
+[Customer]
+pageTitle = "Customer Info"
- [Customer]
- pageTitle = "Customer Info"
-
- [Login]
- pageTitle = "Login"
- focus = "username"
- Intro = """This is a value that spans more
- than one line. you must enclose
- it in triple quotes."""
-
- # hidden section
- [.Database]
- host=my.example.com
- db=ADDRESSBOOK
- user=php-user
- pass=foobar
+[Login]
+pageTitle = "Login"
+focus = "username"
+Intro = """This is a value that spans more
+ than one line. you must enclose
+ it in triple quotes."""
+# hidden section
+[.Database]
+host=my.example.com
+db=ADDRESSBOOK
+user=php-user
+pass=foobar
+```
Values of [config file variables](./language-variables/language-config-variables.md) can be in
quotes, but not necessary. You can use either single or double quotes.
If you have a value that spans more than one line, enclose the entire
-value with triple quotes (\"\"\"). You can put comments into config
+value with triple quotes \("""\). You can put comments into config
files by any syntax that is not a valid config file syntax. We recommend
-using a `
- #` (hash) at the beginning of the line.
+using a `#` (hash) at the beginning of the line.
The example config file above has two sections. Section names are
enclosed in \[brackets\]. Section names can be arbitrary strings not
@@ -54,8 +52,7 @@ the last one will be used unless
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md) is disabled.
Config files are loaded into templates with the built-in template
-function [`
- {config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
+function [`{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
[`configLoad()`](../programmers/api-functions/api-config-load.md) function.
You can hide variables or entire sections by prepending the variable
diff --git a/include/smarty/docs/designers/language-basic-syntax.md b/include/smarty/docs/designers/language-basic-syntax/index.md
similarity index 56%
rename from include/smarty/docs/designers/language-basic-syntax.md
rename to include/smarty/docs/designers/language-basic-syntax/index.md
index 2509857c3..c0a12a9be 100644
--- a/include/smarty/docs/designers/language-basic-syntax.md
+++ b/include/smarty/docs/designers/language-basic-syntax/index.md
@@ -1,8 +1,7 @@
-Basic Syntax
-============
+# Basic Syntax
A simple Smarty template could look like this:
-```html
+```smarty
{$title|escape}
{foreach $cities as $city}
@@ -15,7 +14,7 @@ A simple Smarty template could look like this:
All Smarty template tags are enclosed within delimiters. By default
these are `{` and `}`, but they can be
-[changed](../programmers/api-variables/variable-left-delimiter.md).
+[changed](../../programmers/api-variables/variable-left-delimiter.md).
For the examples in this manual, we will assume that you are using the
default delimiters. In Smarty, all content outside of delimiters is
@@ -24,10 +23,11 @@ template tags, it attempts to interpret them, and displays the
appropriate output in their place.
The basis components of the Smarty syntax are:
-- [Comments](./language-basic-syntax/language-syntax-comments.md)
-- [Variables](./language-basic-syntax/language-syntax-variables.md)
-- [Functions](./language-basic-syntax/language-syntax-functions.md)
-- [Attributes](./language-basic-syntax/language-syntax-attributes.md)
-- [Quotes](./language-basic-syntax/language-syntax-quotes.md)
-- [Math](./language-basic-syntax/language-math.md)
-- [Escaping](./language-basic-syntax/language-escaping.md)
+
+- [Comments](language-syntax-comments.md)
+- [Variables](language-syntax-variables.md)
+- [Functions](language-syntax-functions.md)
+- [Attributes](language-syntax-attributes.md)
+- [Quotes](language-syntax-quotes.md)
+- [Math](language-math.md)
+- [Escaping](language-escaping.md)
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-escaping.md b/include/smarty/docs/designers/language-basic-syntax/language-escaping.md
index a62e7de89..4c75e09e6 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-escaping.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-escaping.md
@@ -1,11 +1,10 @@
-Escaping Smarty Parsing {#language.escaping}
-=======================
+# Escaping Smarty parsing
It is sometimes desirable or even necessary to have Smarty ignore
sections it would otherwise parse. A classic example is embedding
Javascript or CSS code in a template. The problem arises as those
languages use the { and } characters which are also the default
-[delimiters](#language.function.ldelim) for Smarty.
+[delimiters](../language-builtin-functions/language-function-ldelim.md) for Smarty.
> **Note**
>
@@ -17,37 +16,37 @@ languages use the { and } characters which are also the default
In Smarty templates, the { and } braces will be ignored so long as they
are surrounded by white space. This behavior can be disabled by setting
-the Smarty class variable [`$auto_literal`](#variable.auto.literal) to
+the Smarty class variable [`$auto_literal`](../../programmers/api-variables/variable-auto-literal.md) to
false.
+## Examples
-
-
+```smarty
+
+```
-
-[`{literal}..{/literal}`](#language.function.literal) blocks are used
+[`{literal}..{/literal}`](../language-builtin-functions/language-function-literal.md) blocks are used
for escaping blocks of template logic. You can also escape the braces
individually with
-[`{ldelim}`](#language.function.ldelim),[`{rdelim}`](#language.function.ldelim)
-tags or
-[`{$smarty.ldelim}`,`{$smarty.rdelim}`](#language.variables.smarty.ldelim)
+[`{ldelim}`, `{rdelim}`](../language-builtin-functions/language-function-ldelim.md) tags or
+[`{$smarty.ldelim}`,`{$smarty.rdelim}`](../language-variables/language-variables-smarty.md#smartyldelim-smartyrdelim-languagevariablessmartyldelim)
variables.
-Smarty\'s default delimiters { and } cleanly represent presentational
-content. However if another set of delimiters suit your needs better,
-you can change them with Smarty\'s
-[`$left_delimiter`](#variable.left.delimiter) and
-[`$right_delimiter`](#variable.right.delimiter) values.
+Smarty's default delimiters { and } cleanly represent presentational
+content. However, if another set of delimiters suit your needs better,
+you can change them with Smarty's
+[`$left_delimiter`](../../programmers/api-variables/variable-left-delimiter.md) and
+[`$right_delimiter`](../../programmers/api-variables/variable-right-delimiter.md) values.
> **Note**
>
@@ -55,30 +54,26 @@ you can change them with Smarty\'s
> sure to clear out cache and compiled files if you decide to change
> them.
+```php
+left_delimiter = '';
- $smarty->left_delimiter = '';
-
- $smarty->assign('foo', 'bar');
- $smarty->assign('name', 'Albert');
- $smarty->display('example.tpl');
-
- ?>
-
-
+$smarty->assign('foo', 'bar');
+$smarty->assign('name', 'Albert');
+$smarty->display('example.tpl');
+```
Where the template is:
-
- Welcome to Smarty
-
-
-
+```smarty
+Welcome to Smarty
+
+```
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-math.md b/include/smarty/docs/designers/language-basic-syntax/language-math.md
index dc78a3512..a9a43efd9 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-math.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-math.md
@@ -1,25 +1,24 @@
-Math {#language.math}
-====
+# Math
Math can be applied directly to variable values.
+## Examples
+```smarty
+{$foo+1}
- {$foo+1}
+{$foo*$bar}
- {$foo*$bar}
+{* some more complicated examples *}
- {* some more complicated examples *}
+{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
- {$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
+{if ($foo+$bar.test%$baz*134232+10+$b+10)}
- {if ($foo+$bar.test%$baz*134232+10+$b+10)}
-
- {$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
-
- {assign var="foo" value="`$foo+$bar`"}
+{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
+{assign var="foo" value="`$foo+$bar`"}
+```
-
> **Note**
>
> Although Smarty can handle some very complex expressions and syntax,
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-syntax-attributes.md b/include/smarty/docs/designers/language-basic-syntax/language-syntax-attributes.md
index 0fa7c7734..41f6c458d 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-syntax-attributes.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-syntax-attributes.md
@@ -1,9 +1,8 @@
-Attributes {#language.syntax.attributes}
-==========
+# Attributes
-Most of the [functions](#language.syntax.functions) take attributes that
+Most of the [functions](./language-syntax-functions.md) take attributes that
specify or modify their behavior. Attributes to Smarty functions are
-much like HTML attributes. Static values don\'t have to be enclosed in
+much like HTML attributes. Static values don't have to be enclosed in
quotes, but it is required for literal strings. Variables with or
without modifiers may also be used, and should not be in quotes. You can
even use PHP function results, plugin results and complex expressions.
@@ -12,35 +11,35 @@ Some attributes require boolean values (TRUE or FALSE). These can be
specified as `true` and `false`. If an attribute has no value assigned
it gets the default boolean value of true.
+## Examples
+```smarty
+{include file="header.tpl"}
- {include file="header.tpl"}
+{include file="header.tpl" nocache} // is equivalent to nocache=true
- {include file="header.tpl" nocache} // is equivalent to nocache=true
+{include file="header.tpl" attrib_name="attrib value"}
- {include file="header.tpl" attrib_name="attrib value"}
+{include file=$includeFile}
- {include file=$includeFile}
+{include file=#includeFile# title="My Title"}
- {include file=#includeFile# title="My Title"}
+{assign var=foo value={counter}} // plugin result
- {assign var=foo value={counter}} // plugin result
+{assign var=foo value=substr($bar,2,5)} // PHP function result
- {assign var=foo value=substr($bar,2,5)} // PHP function result
+{assign var=foo value=$bar|strlen} // using modifier
- {assign var=foo value=$bar|strlen} // using modifier
+{assign var=foo value=$buh+$bar|strlen} // more complex expression
- {assign var=foo value=$buh+$bar|strlen} // more complex expression
+{html_select_date display_days=true}
- {html_select_date display_days=true}
-
- {mailto address="smarty@example.com"}
-
-
+{mailto address="smarty@example.com"}
+
+```
-
> **Note**
>
> Although Smarty can handle some very complex expressions and syntax,
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-syntax-comments.md b/include/smarty/docs/designers/language-basic-syntax/language-syntax-comments.md
index 43104dbb6..7052c20ef 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-syntax-comments.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-syntax-comments.md
@@ -1,27 +1,25 @@
-Comments {#language.syntax.comments}
-========
+# Comments
Template comments are surrounded by asterisks, and that is surrounded by
-the [delimiter](#variable.left.delimiter) tags like so:
+the [delimiter](../../programmers/api-variables/variable-left-delimiter.md) tags like so:
-::: {.informalexample}
+## Examples
- {* this is a comment *}
-
-
-:::
+```smarty
+{* this is a comment *}
+```
Smarty comments are NOT displayed in the final output of the template,
unlike ``. These are useful for making internal
notes in the templates which no one will see ;-)
-
- {* I am a Smarty comment, I don't exist in the compiled output *}
-
+```smarty
+{* I am a Smarty comment, I don't exist in the compiled output *}
+
- {$title}
+ {$title}
-
+
{* another single line smarty comment *}
@@ -66,6 +64,6 @@ notes in the templates which no one will see ;-)
*}
-
-
+
+```
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-syntax-functions.md b/include/smarty/docs/designers/language-basic-syntax/language-syntax-functions.md
index 9c8c94049..c3c8c21ce 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-syntax-functions.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-syntax-functions.md
@@ -1,40 +1,40 @@
-Functions {#language.syntax.functions}
-=========
+# Functions
-Every Smarty tag either prints a [variable](#language.variables) or
+Every Smarty tag either prints a [variable](./language-syntax-variables.md) or
invokes some sort of function. These are processed and displayed by
-enclosing the function and its [attributes](#language.syntax.attributes)
+enclosing the function and its [attributes](./language-syntax-attributes.md)
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
+## Examples
- {config_load file="colors.conf"}
+```smarty
+{config_load file="colors.conf"}
- {include file="header.tpl"}
- {insert file="banner_ads.tpl" title="My Site"}
+{include file="header.tpl"}
+{insert file="banner_ads.tpl" title="My Site"}
- {if $logged_in}
- Welcome, {$name}!
- {else}
- hi, {$name}
- {/if}
-
- {include file="footer.tpl"}
+{if $logged_in}
+ Welcome, {$name}!
+{else}
+ hi, {$name}
+{/if}
+{include file="footer.tpl"}
+```
-
-- Both [built-in functions](#language.builtin.functions) and [custom
- functions](#language.custom.functions) have the same syntax within
+- Both [built-in functions](../language-builtin-functions/index.md) and [custom
+ functions](../language-custom-functions/index.md) have the same syntax within
templates.
- Built-in functions are the **inner** workings of Smarty, such as
- [`{if}`](#language.function.if),
- [`{section}`](#language.function.section) and
- [`{strip}`](#language.function.strip). There should be no need to
+ [`{if}`](../language-builtin-functions/language-function-if.md),
+ [`{section}`](../language-builtin-functions/language-function-section.md) and
+ [`{strip}`](../language-builtin-functions/language-function-strip.md). There should be no need to
change or modify them.
- Custom functions are **additional** functions implemented via
- [plugins](#plugins). They can be modified to your liking, or you can
- create new ones. [`{html_options}`](#language.function.html.options)
+ [plugins](../../programmers/plugins.md). They can be modified to your liking, or you can
+ create new ones. [`{html_options}`](../language-custom-functions/language-function-html-options.md)
is an example of a custom function.
-See also [`registerPlugin()`](#api.register.plugin)
+See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md)
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-syntax-quotes.md b/include/smarty/docs/designers/language-basic-syntax/language-syntax-quotes.md
index 6fe185c97..e04e6da76 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-syntax-quotes.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-syntax-quotes.md
@@ -1,55 +1,48 @@
-Embedding Vars in Double Quotes {#language.syntax.quotes}
-===============================
+# Embedding Vars in Double Quotes
-- Smarty will recognize [assigned](#api.assign)
- [variables](#language.syntax.variables) embedded in \"double
- quotes\" so long as the variable name contains only numbers, letters
- and under\_scores. See [naming](&url.php-manual;language.variables)
+- Smarty will recognize [assigned](../../programmers/api-functions/api-assign.md)
+ [variables](./language-syntax-variables.md) embedded in "double
+ quotes" so long as the variable name contains only numbers, letters
+ and under_scores. See [naming](https://www.php.net/language.variables)
for more detail.
- With any other characters, for example a period(.) or
- `$object->reference`, then the variable must be surrounded by
- `` `backticks` ``.
+ `$object->reference`, then the variable must be surrounded by `` `backticks` ``.
-- In addition Smarty3 does allow embedded Smarty tags in double quoted
+- In addition, Smarty does allow embedded Smarty tags in double-quoted
strings. This is useful if you want to include variables with
modifiers, plugin or PHP function results.
-
+## Examples
+```smarty
+{func var="test $foo test"} // sees $foo
+{func var="test $foo_bar test"} // sees $foo_bar
+{func var="test `$foo[0]` test"} // sees $foo[0]
+{func var="test `$foo[bar]` test"} // sees $foo[bar]
+{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
+{func var="test `$foo.bar` test"} // sees $foo.bar
+{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
+{func var="test {$foo|escape} test"} // modifiers inside quotes!
+{func var="test {time()} test"} // PHP function result
+{func var="test {counter} test"} // plugin result
+{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
+{* will replace $tpl_name with value *}
+{include file="subdir/$tpl_name.tpl"}
- {func var="test $foo test"} // sees $foo
- {func var="test $foo_bar test"} // sees $foo_bar
- {func var="test `$foo[0]` test"} // sees $foo[0]
- {func var="test `$foo[bar]` test"} // sees $foo[bar]
- {func var="test $foo.bar test"} // sees $foo (not $foo.bar)
- {func var="test `$foo.bar` test"} // sees $foo.bar
- {func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
- {func var="test {$foo|escape} test"} // modifiers inside quotes!
- {func var="test {time()} test"} // PHP function result
- {func var="test {counter} test"} // plugin result
- {func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
+{* does NOT replace $tpl_name *}
+{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
+{* must have backticks as it contains a dot "." *}
+{cycle values="one,two,`$smarty.config.myval`"}
+
+{* must have backticks as it contains a dot "." *}
+{include file="`$module.contact`.tpl"}
+
+{* can use variable with dot syntax *}
+{include file="`$module.$view`.tpl"}
+```
-
-
- {* will replace $tpl_name with value *}
- {include file="subdir/$tpl_name.tpl"}
-
- {* does NOT replace $tpl_name *}
- {include file='subdir/$tpl_name.tpl'} // vars require double quotes!
-
- {* must have backticks as it contains a dot "." *}
- {cycle values="one,two,`$smarty.config.myval`"}
-
- {* must have backticks as it contains a dot "." *}
- {include file="`$module.contact`.tpl"}
-
- {* can use variable with dot syntax *}
- {include file="`$module.$view`.tpl"}
-
-
-
> **Note**
>
> Although Smarty can handle some very complex expressions and syntax,
@@ -58,4 +51,4 @@ Embedding Vars in Double Quotes {#language.syntax.quotes}
> complex, it may be a good idea to move the bits that do not deal
> explicitly with presentation to PHP by way of plugins or modifiers.
-See also [`escape`](#language.modifier.escape).
+See also [`escape`](../language-modifiers/language-modifier-escape.md).
diff --git a/include/smarty/docs/designers/language-basic-syntax/language-syntax-variables.md b/include/smarty/docs/designers/language-basic-syntax/language-syntax-variables.md
index 671ad8bb8..c0285d078 100644
--- a/include/smarty/docs/designers/language-basic-syntax/language-syntax-variables.md
+++ b/include/smarty/docs/designers/language-basic-syntax/language-syntax-variables.md
@@ -1,99 +1,97 @@
-Variables {#language.syntax.variables}
-=========
+# Variables
-Template variables start with the \$dollar sign. They can contain
+Template variables start with the $dollar sign. They can contain
numbers, letters and underscores, much like a [PHP
-variable](&url.php-manual;language.variables). You can reference arrays
+variable](https://www.php.net/language.variables). You can reference arrays
by index numerically or non-numerically. Also reference object
properties and methods.
-[Config file variables](#language.config.variables) are an exception to
+[Config file variables](../language-variables/language-config-variables.md) are an exception to
the \$dollar syntax and are instead referenced with surrounding
-\#hashmarks\#, or via the
-[`$smarty.config`](#language.variables.smarty.config) variable.
+\#hashmarks\#, or via the [`$smarty.config`](../language-variables/language-variables-smarty.md#smartyconfig-languagevariablessmartyconfig) variable.
+## Examples
- {$foo} <-- displaying a simple variable (non array/object)
- {$foo[4]} <-- display the 5th element of a zero-indexed array
- {$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
- {$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
- {$foo->bar} <-- display the object property "bar"
- {$foo->bar()} <-- display the return value of object method "bar"
- {#foo#} <-- display the config file variable "foo"
- {$smarty.config.foo} <-- synonym for {#foo#}
- {$foo[bar]} <-- syntax only valid in a section loop, see {section}
- {assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
+```smarty
+{$foo} <-- displaying a simple variable (non array/object)
+{$foo[4]} <-- display the 5th element of a zero-indexed array
+{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
+{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
+{$foo->bar} <-- display the object property "bar"
+{$foo->bar()} <-- display the return value of object method "bar"
+{#foo#} <-- display the config file variable "foo"
+{$smarty.config.foo} <-- synonym for {#foo#}
+{$foo[bar]} <-- syntax only valid in a section loop, see {section}
+{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
- Many other combinations are allowed
+Many other combinations are allowed
- {$foo.bar.baz}
- {$foo.$bar.$baz}
- {$foo[4].baz}
- {$foo[4].$baz}
- {$foo.bar.baz[4]}
- {$foo->bar($baz,2,$bar)} <-- passing parameters
- {"foo"} <-- static values are allowed
+{$foo.bar.baz}
+{$foo.$bar.$baz}
+{$foo[4].baz}
+{$foo[4].$baz}
+{$foo.bar.baz[4]}
+{$foo->bar($baz,2,$bar)} <-- passing parameters
+{"foo"} <-- static values are allowed
- {* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
- {$smarty.server.SERVER_NAME}
+{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
+{$smarty.server.SERVER_NAME}
- Math and embedding tags:
+Math and embedding tags:
- {$x+$y} // will output the sum of x and y.
- {assign var=foo value=$x+$y} // in attributes
- {$foo[$x+3]} // as array index
- {$foo={counter}+3} // tags within tags
- {$foo="this is message {counter}"} // tags within double quoted strings
+{$x+$y} // will output the sum of x and y.
+{assign var=foo value=$x+$y} // in attributes
+{$foo[$x+3]} // as array index
+{$foo={counter}+3} // tags within tags
+{$foo="this is message {counter}"} // tags within double quoted strings
- Defining Arrays:
+Defining Arrays:
- {assign var=foo value=[1,2,3]}
- {assign var=foo value=['y'=>'yellow','b'=>'blue']}
- {assign var=foo value=[1,[9,8],3]} // can be nested
+{assign var=foo value=[1,2,3]}
+{assign var=foo value=['y'=>'yellow','b'=>'blue']}
+{assign var=foo value=[1,[9,8],3]} // can be nested
- Short variable assignment:
+Short variable assignment:
- {$foo=$bar+2}
- {$foo = strlen($bar)} // function in assignment
- {$foo = myfunct( ($x+$y)*3 )} // as function parameter
- {$foo.bar=1} // assign to specific array element
- {$foo.bar.baz=1}
- {$foo[]=1} // appending to an array
+{$foo=$bar+2}
+{$foo = strlen($bar)} // function in assignment
+{$foo = myfunct( ($x+$y)*3 )} // as function parameter
+{$foo.bar=1} // assign to specific array element
+{$foo.bar.baz=1}
+{$foo[]=1} // appending to an array
- Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
+Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
- {$foo.a.b.c} => $foo['a']['b']['c']
- {$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
- {$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
- {$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
+{$foo.a.b.c} => $foo['a']['b']['c']
+{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
+{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
+{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
- PHP-like syntax, alternative to "dot" syntax:
+PHP-like syntax, alternative to "dot" syntax:
- {$foo[1]} // normal access
- {$foo['bar']}
- {$foo['bar'][1]}
- {$foo[$x+$x]} // index may contain any expression
- {$foo[$bar[1]]} // nested index
- {$foo[section_name]} // smarty {section} access, not array access!
+{$foo[1]} // normal access
+{$foo['bar']}
+{$foo['bar'][1]}
+{$foo[$x+$x]} // index may contain any expression
+{$foo[$bar[1]]} // nested index
+{$foo[section_name]} // smarty {section} access, not array access!
- Variable variables:
+Variable variables:
- $foo // normal variable
- $foo_{$bar} // variable name containing other variable
- $foo_{$x+$y} // variable name containing expressions
- $foo_{$bar}_buh_{$blar} // variable name with multiple segments
- {$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
+$foo // normal variable
+$foo_{$bar} // variable name containing other variable
+$foo_{$x+$y} // variable name containing expressions
+$foo_{$bar}_buh_{$blar} // variable name with multiple segments
+{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
- Object chaining:
+Object chaining:
- {$object->method1($x)->method2($y)}
+{$object->method1($x)->method2($y)}
- Direct PHP function access:
+Direct PHP function access:
- {time()}
-
-
-
+{time()}
+```
> **Note**
>
@@ -104,8 +102,8 @@ the \$dollar syntax and are instead referenced with surrounding
> explicitly with presentation to PHP by way of plugins or modifiers.
Request variables such as `$_GET`, `$_SESSION`, etc are available via
-the reserved [`$smarty`](#language.variables.smarty) variable.
+the reserved [`$smarty`](../language-variables/language-variables-smarty.md) variable.
-See also [`$smarty`](#language.variables.smarty), [config
-variables](#language.config.variables)
-[`{assign}`](#language.function.assign) and [`assign()`](#api.assign).
+See also [`$smarty`](../language-variables/language-variables-smarty.md), [config
+variables](../language-variables/language-config-variables.md)
+[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`assign()`](../../programmers/api-functions/api-assign.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions.md b/include/smarty/docs/designers/language-builtin-functions.md
deleted file mode 100644
index 6c0879d6c..000000000
--- a/include/smarty/docs/designers/language-builtin-functions.md
+++ /dev/null
@@ -1,39 +0,0 @@
-Built-in Functions {#language.builtin.functions}
-==================
-
-## Table of contents
-- [{$var=...}](./language-builtin-functions/language-function-shortform-assign.md)
-- [{append}](./language-builtin-functions/language-function-append.md)
-- [{assign}](./language-builtin-functions/language-function-assign.md)
-- [{block}](./language-builtin-functions/language-function-block.md)
-- [{call}](./language-builtin-functions/language-function-call.md)
-- [{capture}](./language-builtin-functions/language-function-capture.md)
-- [{config_load}](./language-builtin-functions/language-function-config.load)
-- [{debug}](./language-builtin-functions/language-function-debug.md)
-- [{extends}](./language-builtin-functions/language-function-extends.md)
-- [{for}](./language-builtin-functions/language-function-for.md)
-- [{foreach},{foreachelse}](./language-builtin-functions/language-function-foreach.md)
-- [{function}](./language-builtin-functions/language-function-function.md)
-- [{if},{elseif},{else}](./language-builtin-functions/language-function-if.md)
-- [{include}](./language-builtin-functions/language-function-include.md)
-- [{include_php}](./language-builtin-functions/language-function-include.php)
-- [{insert}](./language-builtin-functions/language-function-insert.md)
-- [{ldelim},{rdelim}](./language-builtin-functions/language-function-ldelim.md)
-- [{literal}](./language-builtin-functions/language-function-literal.md)
-- [{nocache}](./language-builtin-functions/language-function-nocache.md)
-- [{section},{sectionelse}](./language-builtin-functions/language-function-section.md)
-- [{setfilter}](./language-builtin-functions/language-function-setfilter.md)
-- [{strip}](./language-builtin-functions/language-function-strip.md)
-- [{while}](./language-builtin-functions/language-function-while.md)
-
-Smarty comes with several built-in functions. These built-in functions
-are the integral part of the smarty template engine. They are compiled
-into corresponding inline PHP code for maximum performance.
-
-You cannot create your own [custom
-functions](./language-custom-functions.md) with the same name; and you
-should not need to modify the built-in functions.
-
-A few of these functions have an `assign` attribute which collects the
-result the function to a named template variable instead of being
-output; much like the [`{assign}`](./language-builtin-functions/language-function-assign.md) function.
diff --git a/include/smarty/docs/designers/language-builtin-functions/index.md b/include/smarty/docs/designers/language-builtin-functions/index.md
new file mode 100644
index 000000000..10dc3a6f0
--- /dev/null
+++ b/include/smarty/docs/designers/language-builtin-functions/index.md
@@ -0,0 +1,35 @@
+# Built-in Functions
+
+Smarty comes with several built-in functions. These built-in functions
+are the integral part of the smarty template engine. They are compiled
+into corresponding inline PHP code for maximum performance.
+
+You cannot create your own [custom functions](../language-custom-functions/index.md) with the same name; and you
+should not need to modify the built-in functions.
+
+A few of these functions have an `assign` attribute which collects the
+result the function to a named template variable instead of being
+output; much like the [`{assign}`](language-function-assign.md) function.
+
+- [{append}](language-function-append.md)
+- [{assign} or {$var=...}](language-function-assign.md)
+- [{block}](language-function-block.md)
+- [{call}](language-function-call.md)
+- [{capture}](language-function-capture.md)
+- [{config_load}](language-function-config-load.md)
+- [{debug}](language-function-debug.md)
+- [{extends}](language-function-extends.md)
+- [{for}](language-function-for.md)
+- [{foreach}, {foreachelse}](language-function-foreach.md)
+- [{function}](language-function-function.md)
+- [{if}, {elseif}, {else}](language-function-if.md)
+- [{include}](language-function-include.md)
+- [{insert}](language-function-insert.md)
+- [{ldelim}, {rdelim}](language-function-ldelim.md)
+- [{literal}](language-function-literal.md)
+- [{nocache}](language-function-nocache.md)
+- [{section}, {sectionelse}](language-function-section.md)
+- [{setfilter}](language-function-setfilter.md)
+- [{strip}](language-function-strip.md)
+- [{while}](language-function-while.md)
+
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-append.md b/include/smarty/docs/designers/language-builtin-functions/language-function-append.md
index 62f2c7e19..37e1b81e9 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-append.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-append.md
@@ -1,42 +1,42 @@
-{append} {#language.function.append}
-========
+# {append}
`{append}` is used for creating or appending template variable arrays
**during the execution of a template**.
+## Attributes
+
+| Attribute | Required | Description |
+|-----------|------------|----------------------------------------------------------------------------------------------------|
+| var | | The name of the variable being assigned |
+| value | | The value being assigned |
+| index | (optional) | The index for the new array element. If not specified the value is append to the end of the array. |
+| scope | (optional) | The scope of the assigned variable: parent, root or global. Defaults to local if omitted. |
+
+## Option Flags
+
+| Name | Description |
+|---------|-----------------------------------------------------|
+| nocache | Assigns the variable with the 'nocache' attribute |
+
> **Note**
>
> Assignment of variables in-template is essentially placing application
> logic into the presentation that may be better handled in PHP. Use at
> your own discretion.
-**Attributes:**
+## Examples
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ----------------------------------------------------------------------------------------------------
- var string Yes *n/a* The name of the variable being assigned
- value string Yes *n/a* The value being assigned
- index string No *n/a* The index for the new array element. If not specified the value is append to the end of the array.
- scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
-
-**Option Flags:**
-
- Name Description
- --------- -----------------------------------------------------
- nocache Assigns the variable with the \'nocache\' attribute
-
-
- {append var='name' value='Bob' index='first'}
- {append var='name' value='Meyer' index='last'}
- // or
- {append 'name' 'Bob' index='first'} {* short-hand *}
- {append 'name' 'Meyer' index='last'} {* short-hand *}
-
- The first name is {$name.first}.
- The last name is {$name.last}.
+```smarty
+{append var='name' value='Bob' index='first'}
+{append var='name' value='Meyer' index='last'}
+// or
+{append 'name' 'Bob' index='first'} {* short-hand *}
+{append 'name' 'Meyer' index='last'} {* short-hand *}
+The first name is {$name.first}.
+The last name is {$name.last}.
+```
-
The above example will output:
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-assign.md b/include/smarty/docs/designers/language-builtin-functions/language-function-assign.md
index 3d3615bff..f5faa46d5 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-assign.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-assign.md
@@ -1,149 +1,147 @@
-{assign} {#language.function.assign}
-========
+# {assign}, {$var=...}
-`{assign}` is used for assigning template variables **during the
+`{assign}` or `{$var=...}` is used for assigning template variables **during the
execution of a template**.
+## Attributes of the {assign} syntax
+| Attribute Name | Required | Description |
+|----------------|------------|-----------------------------------------------------------------------|
+| var | | The name of the variable being assigned |
+| value | | The value being assigned |
+| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
+
+## Attributes of the {$var=...} syntax
+| Attribute Name | Required | Description |
+|----------------|------------|-----------------------------------------------------------------------|
+| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
+
+## Option Flags
+| Name | Description |
+|---------|---------------------------------------------------|
+| nocache | Assigns the variable with the 'nocache' attribute |
+
+
> **Note**
>
> Assignment of variables in-template is essentially placing application
> logic into the presentation that may be better handled in PHP. Use at
> your own discretion.
-> **Note**
->
-> See also the [`short-form`](#language.function.shortform.assign)
-> method of assigning template vars.
+## Examples
-**Attributes:**
-
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- -----------------------------------------------------------------------
- var string Yes *n/a* The name of the variable being assigned
- value string Yes *n/a* The value being assigned
- scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
-
-**Option Flags:**
-
- Name Description
- --------- -----------------------------------------------------
- nocache Assigns the variable with the \'nocache\' attribute
-
-
- {assign var="name" value="Bob"}
- {assign "name" "Bob"} {* short-hand *}
-
- The value of $name is {$name}.
+```smarty
+{assign var="name" value="Bob"} {* or *}
+{assign "name" "Bob"} {* short-hand, or *}
+{$name='Bob'}
+The value of $name is {$name}.
+```
The above example will output:
-
- The value of $name is Bob.
-
-
+```
+The value of $name is Bob.
+```
- {assign var="name" value="Bob" nocache}
- {assign "name" "Bob" nocache} {* short-hand *}
-
- The value of $name is {$name}.
-
-
+```smarty
+{assign var="name" value="Bob" nocache} {* or *}
+{assign "name" "Bob" nocache} {* short-hand, or *}
+{$name='Bob' nocache}
+The value of $name is {$name}.
+```
The above example will output:
-
-
- The value of $name is Bob.
-
+```
+The value of $name is Bob.
+```
-
- {assign var=running_total value=$running_total+$some_array[$row].some_value}
-
-
+```smarty
+{assign var=running_total value=$running_total+$some_array[$row].some_value} {* or *}
+{$running_total=$running_total+$some_array[row].some_value}
+```
Variables assigned in the included template will be seen in the
including template.
+```smarty
+{include file="sub_template.tpl"}
- {include file="sub_template.tpl"}
- ...
- {* display variable assigned in sub_template *}
- {$foo}
- ...
+{* display variable assigned in sub_template *}
+{$foo}
+```
-
+The template above includes the example `sub_template.tpl` below:
-The template above includes the example `sub_template.tpl` below
+```smarty
+{* foo will be known also in the including template *}
+{assign var="foo" value="something" scope=parent}
+{$foo="something" scope=parent}
- ...
- {* foo will be known also in the including template *}
- {assign var="foo" value="something" scope=parent}
- {* bar is assigned only local in the including template *}
- {assign var="bar" value="value"}
- ...
+{* bar is assigned only local in the including template *}
+{assign var="bar" value="value"} {* or *}
+{$var="value"}
+
+```
You can assign a variable to root of the current root tree. The variable
is seen by all templates using the same root tree.
-
- {assign var=foo value="bar" scope="root"}
-
+```smarty
+{assign var=foo value="bar" scope="root"}
+```
-
A global variable is seen by all templates.
-
- {assign var=foo value="bar" scope="global"}
- {assign "foo" "bar" scope="global"} {* short-hand *}
-
-
-
+```smarty
+{assign var=foo value="bar" scope="global"} {* or *}
+{assign "foo" "bar" scope="global"} {* short-hand, or *}
+{$foo="bar" scope="global"}
+```
+
To access `{assign}` variables from a php script use
-[`getTemplateVars()`](#api.get.template.vars). Here\'s the template that
-creates the variable `$foo`.
+[`getTemplateVars()`](../../programmers/api-functions/api-get-template-vars.md).
+Here's the template that creates the variable `$foo`.
-
- {assign var="foo" value="Smarty"}
+```smarty
+{assign var="foo" value="Smarty"} {* or *}
+{$foo="Smarty"}
+```
The template variables are only available after/during template
execution as in the following script.
+```php
+getTemplateVars('foo');
- // this will output nothing as the template has not been executed
- echo $smarty->getTemplateVars('foo');
+// fetch the template to a variable
+$whole_page = $smarty->fetch('index.tpl');
- // fetch the template to a variable
- $whole_page = $smarty->fetch('index.tpl');
+// this will output 'smarty' as the template has been executed
+echo $smarty->getTemplateVars('foo');
- // this will output 'smarty' as the template has been executed
- echo $smarty->getTemplateVars('foo');
+$smarty->assign('foo','Even smarter');
- $smarty->assign('foo','Even smarter');
+// this will output 'Even smarter'
+echo $smarty->getTemplateVars('foo');
+```
- // this will output 'Even smarter'
- echo $smarty->getTemplateVars('foo');
-
- ?>
-
-The following functions can also *optionally* assign template variables.
-
-[`{capture}`](#language.function.capture),
+The following functions can also *optionally* assign template variables: [`{capture}`](#language.function.capture),
[`{include}`](#language.function.include),
-[`{include_php}`](#language.function.include.php),
[`{insert}`](#language.function.insert),
[`{counter}`](#language.function.counter),
[`{cycle}`](#language.function.cycle),
[`{eval}`](#language.function.eval),
[`{fetch}`](#language.function.fetch),
-[`{math}`](#language.function.math),
-[`{textformat}`](#language.function.textformat)
+[`{math}`](#language.function.math) and
+[`{textformat}`](#language.function.textformat).
-See also [`{$var=...}`](#language.function.shortform.assign),
+See also [`{append}`](./language-function-append.md),
[`assign()`](#api.assign) and
[`getTemplateVars()`](#api.get.template.vars).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-block.md b/include/smarty/docs/designers/language-builtin-functions/language-function-block.md
index 941997a55..c2acd1972 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-block.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-block.md
@@ -1,191 +1,201 @@
-{block} {#language.function.block}
-=======
+# {block}
`{block}` is used to define a named area of template source for template
inheritance. For details see section of [Template
-Interitance](#advanced.features.template.inheritance).
+Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md).
The `{block}` template source area of a child template will replace the
-correponding areas in the parent template(s).
+corresponding areas in the parent template(s).
Optionally `{block}` areas of child and parent templates can be merged
into each other. You can append or prepend the parent `{block}` content
-by using the `append` or `prepend` option flag with the childs `{block}`
-definition. With the {\$smarty.block.parent} the `{block}` content of
+by using the `append` or `prepend` option flag with the child's `{block}`
+definition. With `{$smarty.block.parent}` the `{block}` content of
the parent template can be inserted at any location of the child
-`{block}` content. {\$smarty.block.child} inserts the `{block}` content
+`{block}` content. `{$smarty.block.child}` inserts the `{block}` content
of the child template at any location of the parent `{block}`.
`{blocks}'s` can be nested.
-**Attributes:**
+## Attributes
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ---------------------------------------
- name string Yes *n/a* The name of the template source block
+| Attribute Name | Required | Description |
+|----------------|----------|----------------------------------------------------------------------------------------------------------------------|
+| name | yes | The name of the template source block |
+| assign | no | The name of variable to assign the output of the block to. |
-**Option Flags (in child templates only):**
+> **Note**
+>
+> The assign attribute only works on the block that actually gets executed, so you may need
+> to add it to each child block as well.
- Name Description
- --------- -------------------------------------------------------------------------------------------
- append The `{block}` content will be be appended to the content of the parent template `{block}`
- prepend The `{block}` content will be prepended to the content of the parent template `{block}`
- hide Ignore the block content if no child block of same name is existing.
- nocache Disables caching of the `{block}` content
+
+## Option Flags (in child templates only):
+
+| Name | Description |
+|---------|-----------------------------------------------------------------------------------------|
+| append | The `{block}` content will be appended to the content of the parent template `{block}` |
+| prepend | The `{block}` content will be prepended to the content of the parent template `{block}` |
+| hide | Ignore the block content if no child block of same name is existing. |
+| nocache | Disables caching of the `{block}` content |
+
+
+## Examples
parent.tpl
-
+```smarty
{block name="title"}Default Title{/block}{block "title"}Default Title{/block} {* short-hand *}
-
+```
child.tpl
-
+```smarty
{extends file="parent.tpl"}
{block name="title"}
Page Title
{/block}
-
+```
The result would look like
-
+```html
Page Title
+```
parent.tpl
-
+```smarty
{block name="title"}Title - {/block}
-
+```
child.tpl
-
+```smarty
{extends file="parent.tpl"}
- {block name="title" prepend}
- Page Title
+ {block name="title" append}
+ Page Title
{/block}
-
+```
The result would look like
-
+```html
Title - Page Title
+```
parent.tpl
-
+```smarty
{block name="title"} is my title{/block}
-
+```
-
child.tpl
-
+```smarty
{extends file="parent.tpl"}
- {block name="title" append}
+ {block name="title" prepend}
Page Title
{/block}
-
+```
The result would look like
-
+```html
Page title is my titel
+```
parent.tpl
-
+```smarty
{block name="title"}The {$smarty.block.child} was inserted here{/block}
-
+```
-
child.tpl
-
+```smarty
{extends file="parent.tpl"}
{block name="title"}
- Child Title
+ Child Title
{/block}
-
-
-
+```
+
The result would look like
-
+```html
The Child Title was inserted here
+```
parent.tpl
-
+```smarty
{block name="title"}Parent Title{/block}
-
+```
child.tpl
-
+```smarty
{extends file="parent.tpl"}
{block name="title"}
- You will see now - {$smarty.block.parent} - here
+ You will see now - {$smarty.block.parent} - here
{/block}
-
-
-
+```
+
The result would look like
-
+```html
You will see now - Parent Title - here
+```
See also [Template
-Inheritance](#advanced.features.template.inheritance),
-[`$smarty.block.parent`](#language.variables.smarty.block.parent),
-[`$smarty.block.child`](#language.variables.smarty.block.child), and
-[`{extends}`](#language.function.extends)
+Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md),
+[`$smarty.block.parent`](../language-variables/language-variables-smarty.md#smartyblockparent-languagevariablessmartyblockparent),
+[`$smarty.block.child`](../language-variables/language-variables-smarty.md#smartyblockchild-languagevariablessmartyblockchild), and
+[`{extends}`](./language-function-extends.md)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-call.md b/include/smarty/docs/designers/language-builtin-functions/language-function-call.md
index 786f0c10c..c07fb49b9 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-call.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-call.md
@@ -1,39 +1,41 @@
-{call} {#language.function.call}
-======
+# {call}
`{call}` is used to call a template function defined by the
-[`{function}`](#language.function.function) tag just like a plugin
+[`{function}`](./language-function-function.md) tag just like a plugin
function.
> **Note**
>
> Template functions are defined global. Since the Smarty compiler is a
-> single-pass compiler, The [`{call}`](#language.function.call) tag must
+> single-pass compiler, The `{call}` tag must
> be used to call a template function defined externally from the given
> template. Otherwise you can directly use the function as
> `{funcname ...}` in the template.
- The `{call}` tag must have the `name` attribute which contains the
- the name of the template function.
+ name of the template function.
- Values for variables can be passed to the template function as
- [attributes](#language.syntax.attributes).
+ [attributes](../language-basic-syntax/language-syntax-attributes.md).
-**Attributes:**
+## Attributes
- Attribute Name Type Required Default Description
- ---------------- -------------- ---------- --------- ------------------------------------------------------------------------------------------
- name string Yes *n/a* The name of the template function
- assign string No *n/a* The name of the variable that the output of called template function will be assigned to
- \[var \...\] \[var type\] No *n/a* variable to pass local to template function
+| Attribute Name | Required | Description |
+|----------------|----------|------------------------------------------------------------------------------------------|
+| name | Yes | The name of the template function |
+| assign | No | The name of the variable that the output of called template function will be assigned to |
+| [var ...] | No | variable to pass local to template function |
-**Option Flags:**
+## Option Flags
- Name Description
- --------- --------------------------------------------
- nocache Call the template function in nocache mode
+| Name | Description |
+|---------|--------------------------------------------|
+| nocache | Call the template function in nocache mode |
+## Examples
+
+```smarty
{* define the function *}
{function name=menu level=0}
@@ -55,12 +57,12 @@ function.
{* run the array through the function *}
{call name=menu data=$menu}
{call menu data=$menu} {* short-hand *}
-
-
+```
+
Will generate the following output
-
+```
* item1
* item2
* item3
@@ -70,7 +72,6 @@ Will generate the following output
+ item3-3-1
+ item3-3-2
* item4
+```
-
-
-See also [`{function}`](#language.function.function)
+See also [`{function}`](./language-function-function.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-capture.md b/include/smarty/docs/designers/language-builtin-functions/language-function-capture.md
index 9121b2874..657f077cd 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-capture.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-capture.md
@@ -1,5 +1,4 @@
-{capture} {#language.function.capture}
-=========
+# {capture}
`{capture}` is used to collect the output of the template between the
tags into a variable instead of displaying it. Any content between
@@ -7,26 +6,26 @@ tags into a variable instead of displaying it. Any content between
specified in the `name` attribute.
The captured content can be used in the template from the variable
-[`$smarty.capture.foo`](#language.variables.smarty.capture) where "foo"
+[`$smarty.capture.foo`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture) where "foo"
is the value passed in the `name` attribute. If you do not supply the
`name` attribute, then "default" will be used as the name ie
`$smarty.capture.default`.
`{capture}'s` can be nested.
-**Attributes:**
+## Attributes
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ----------------------------------------------------------------------
- name string Yes *n/a* The name of the captured block
- assign string No *n/a* The variable name where to assign the captured output to
- append string No *n/a* The name of an array variable where to append the captured output to
+| Attribute Name | Required | Description |
+|----------------|----------|----------------------------------------------------------------------|
+| name | Yes | The name of the captured block |
+| assign | No | The variable name where to assign the captured output to |
+| append | No | The name of an array variable where to append the captured output to |
-**Option Flags:**
+## Option Flags
- Name Description
- --------- -----------------------------------------
- nocache Disables caching of this captured block
+| Name | Description |
+|---------|-----------------------------------------|
+| nocache | Disables caching of this captured block |
> **Note**
>
@@ -35,48 +34,48 @@ is the value passed in the `name` attribute. If you do not supply the
> [`{insert}`](#language.function.insert) commands that you expect to
> run within cached content, do not capture this content.
+## Examples
- {* we don't want to print a div tag unless content is displayed *}
- {capture name="banner"}
- {capture "banner"} {* short-hand *}
- {include file="get_banner.tpl"}
- {/capture}
-
- {if $smarty.capture.banner ne ""}
-
{$smarty.capture.banner}
- {/if}
-
-
+```smarty
+{* we don't want to print a div tag unless content is displayed *}
+{capture name="banner"}
+{capture "banner"} {* short-hand *}
+ {include file="get_banner.tpl"}
+{/capture}
+{if $smarty.capture.banner ne ""}
+
{$smarty.capture.banner}
+{/if}
+```
+
This example demonstrates the capture function.
+```smarty
-
- {capture name=some_content assign=popText}
- {capture some_content assign=popText} {* short-hand *}
- The server is {$my_server_name|upper} at {$my_server_addr}
- Your ip is {$my_ip}.
- {/capture}
- {$popText}
-
+{capture name=some_content assign=popText}
+{capture some_content assign=popText} {* short-hand *}
+The server is {$my_server_name|upper} at {$my_server_addr}
+Your ip is {$my_ip}.
+{/capture}
+{$popText}
+```
This example also demonstrates how multiple calls of capture can be used
to create an array with captured content.
-
- {capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
- {foreach $foo as $text}{$text} {/foreach}
-
-
+```smarty
+{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
+{foreach $foo as $text}{$text} {/foreach}
+```
The above example will output:
-
- I say just hello world
-
+```
+I say just hello world
+```
-See also [`$smarty.capture`](#language.variables.smarty.capture),
-[`{eval}`](#language.function.eval),
-[`{fetch}`](#language.function.fetch), [`fetch()`](#api.fetch) and
-[`{assign}`](#language.function.assign).
+See also [`$smarty.capture`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture),
+[`{eval}`](../language-custom-functions/language-function-eval.md),
+[`{fetch}`](../language-custom-functions/language-function-fetch.md), [`fetch()`](../../programmers/api-functions/api-fetch.md) and
+[`{assign}`](./language-function-assign.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-config-load.md b/include/smarty/docs/designers/language-builtin-functions/language-function-config-load.md
index 750f337c4..e13c30836 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-config-load.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-config-load.md
@@ -1,56 +1,55 @@
-{config\_load} {#language.function.config.load}
-==============
+# {config_load}
`{config_load}` is used for loading config
-[`#variables#`](#language.config.variables) from a [configuration
-file](#config.files) into the template.
+[`#variables#`](#language.config.variables) from a [configuration file](#config.files) into the template.
-**Attributes:**
+## Attributes
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- file string Yes *n/a* The name of the config file to include
- section string No *n/a* The name of the section to load
- scope string no *local* How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates.
+| Attribute Name | Required | Description |
+|----------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| file | Yes | The name of the config file to include |
+| section | No | The name of the section to load |
+| scope | no | How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates. |
+
+
+## Examples
The `example.conf` file.
+```ini
+#this is config file comment
- #this is config file comment
-
- # global variables
- pageTitle = "Main Menu"
- bodyBgColor = #000000
- tableBgColor = #000000
- rowBgColor = #00ff00
-
- #customer variables section
- [Customer]
- pageTitle = "Customer Info"
+# global variables
+pageTitle = "Main Menu"
+bodyBgColor = #000000
+tableBgColor = #000000
+rowBgColor = #00ff00
+#customer variables section
+[Customer]
+pageTitle = "Customer Info"
+```
-
and the template
+```smarty
+{config_load file="example.conf"}
+{config_load "example.conf"} {* short-hand *}
- {config_load file="example.conf"}
- {config_load "example.conf"} {* short-hand *}
-
-
+
{#pageTitle#|default:"No title"}
-
-
-
First
-
Last
-
Address
-
-
+
+
+
First
+
Last
+
Address
+
+
-
-
+
+```
-
[Config Files](#config.files) may also contain sections. You can load
variables from within a section with the added attribute `section`. Note
that global config variables are always loaded along with section
@@ -59,33 +58,31 @@ variables, and same-named section variables overwrite the globals.
> **Note**
>
> Config file *sections* and the built-in template function called
-> [`{section}`](#language.function.section) have nothing to do with each
+> [`{section}`](../language-builtin-functions/language-function-section.md) have nothing to do with each
> other, they just happen to share a common naming convention.
+```smarty
+{config_load file='example.conf' section='Customer'}
+{config_load 'example.conf' 'Customer'} {* short-hand *}
- {config_load file='example.conf' section='Customer'}
- {config_load 'example.conf' 'Customer'} {* short-hand *}
-
-
+
{#pageTitle#}
-
-
-
First
-
Last
-
Address
-
-
+
+
+
First
+
Last
+
Address
+
+
-
+
+```
-
-
-See [`$config_overwrite`](#variable.config.overwrite) to create arrays
+See [`$config_overwrite`](../../programmers/api-variables/variable-config-overwrite.md) to create arrays
of config file variables.
-See also the [config files](#config.files) page, [config
-variables](#language.config.variables) page,
-[`$config_dir`](#variable.config.dir),
-[`getConfigVars()`](#api.get.config.vars) and
-[`configLoad()`](#api.config.load).
+See also the [config files](../config-files.md) page, [config variables](../language-variables/language-config-variables.md) page,
+[`$config_dir`](../../programmers/api-variables/variable-config-dir.md),
+[`getConfigVars()`](../../programmers/api-functions/api-get-config-vars.md) and
+[`configLoad()`](../../programmers/api-functions/api-config-load.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-debug.md b/include/smarty/docs/designers/language-builtin-functions/language-function-debug.md
index fbaae1944..29485d549 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-debug.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-debug.md
@@ -1,10 +1,9 @@
-{debug} {#language.function.debug}
-=======
+# {debug}
`{debug}` dumps the debug console to the page. This works regardless of
-the [debug](#chapter.debugging.console) settings in the php script.
+the [debug](../chapter-debugging-console.md) settings in the php script.
Since this gets executed at runtime, this is only able to show the
-[assigned](#api.assign) variables; not the templates that are in use.
+[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
However, you can see all the currently available variables within the
scope of a template.
@@ -15,4 +14,4 @@ In order to see also the variables which have been locally assigned
within the template it does make sense to place the `{debug}` tag at the
end of the template.
-See also the [debugging console page](#chapter.debugging.console).
+See also the [debugging console page](../chapter-debugging-console.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-extends.md b/include/smarty/docs/designers/language-builtin-functions/language-function-extends.md
index 9559e7c5e..eba17b9bd 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-extends.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-extends.md
@@ -1,9 +1,8 @@
-{extends} {#language.function.extends}
-=========
+# {extends}
`{extends}` tags are used in child templates in template inheritance for
extending parent templates. For details see section of [Template
-Interitance](#advanced.features.template.inheritance).
+Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md).
- The `{extends}` tag must be on the first line of the template.
@@ -11,27 +10,28 @@ Interitance](#advanced.features.template.inheritance).
tag it may contain only `{block}` tags. Any other template content
is ignored.
-- Use the syntax for [template resources](#resources) to extend files
- outside of the [`$template_dir`](#variable.template.dir) directory.
+- Use the syntax for [template resources](../../programmers/resources.md) to extend files
+ outside the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md) directory.
+
+## Attributes
+
+| Attribute | Required | Description |
+|-----------|----------|-------------------------------------------------|
+| file | Yes | The name of the template file which is extended |
> **Note**
>
> When extending a variable parent like `{extends file=$parent_file}`,
> make sure you include `$parent_file` in the
-> [`$compile_id`](#variable.compile.id). Otherwise Smarty cannot
+> [`$compile_id`](../../programmers/api-variables/variable-compile-id.md). Otherwise, Smarty cannot
> distinguish between different `$parent_file`s.
-**Attributes:**
+## Examples
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- -------------------------------------------------
- file string Yes *n/a* The name of the template file which is extended
+```smarty
+{extends file='parent.tpl'}
+{extends 'parent.tpl'} {* short-hand *}
+```
-
- {extends file='parent.tpl'}
- {extends 'parent.tpl'} {* short-hand *}
-
-
-
-See also [Template Interitance](#advanced.features.template.inheritance)
-and [`{block}`](#language.function.block).
+See also [Template Inheritance](../../programmers/advanced-features/advanced-features-template-inheritance.md)
+and [`{block}`](./language-function-block.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-for.md b/include/smarty/docs/designers/language-builtin-functions/language-function-for.md
index 0545c1729..619b61efe 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-for.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-for.md
@@ -1,8 +1,6 @@
-{for} {#language.function.for}
-=====
+# {for}
-The `{for}{forelse}` tag is used to create simple loops. The following
-different formarts are supported:
+The `{for}{forelse}` tag is used to create simple loops. The following different formats are supported:
- `{for $var=$start to $end}` simple loop with step size of 1.
@@ -11,87 +9,83 @@ different formarts are supported:
`{forelse}` is executed when the loop is not iterated.
-**Attributes:**
+## Attributes
- Attribute Name Shorthand Type Required Default Description
- ---------------- ----------- --------- ---------- --------- --------------------------------
- max n/a integer No *n/a* Limit the number of iterations
+| Attribute | Required | Description |
+|-----------|----------|--------------------------------|
+| max | No | Limit the number of iterations |
-**Option Flags:**
+## Option Flags
- Name Description
- --------- --------------------------------------
- nocache Disables caching of the `{for}` loop
+| Name | Description |
+|---------|--------------------------------------|
+| nocache | Disables caching of the `{for}` loop |
+## Examples
-
+```
The above example will output:
-
- no iteration
-
+```
+ no iteration
+```
-
-See also [`{foreach}`](#language.function.foreach),
-[`{section}`](#language.function.section) and
-[`{while}`](#language.function.while)
+See also [`{foreach}`](./language-function-foreach.md),
+[`{section}`](./language-function-section.md) and
+[`{while}`](./language-function-while.md)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-foreach.md b/include/smarty/docs/designers/language-builtin-functions/language-function-foreach.md
index fdd740148..645d6c52c 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-foreach.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-foreach.md
@@ -1,15 +1,30 @@
-{foreach},{foreachelse} {#language.function.foreach}
-=======================
+# {foreach},{foreachelse}
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
simpler and cleaner syntax than the
-[`{section}`](#language.function.section) loop, and can also loop over
+[`{section}`](./language-function-section.md) loop, and can also loop over
associative arrays.
-`{foreach $arrayvar as $itemvar}`
+## Option Flags
-`{foreach $arrayvar as $keyvar=>$itemvar}`
+| Name | Description |
+|---------|------------------------------------------|
+| nocache | Disables caching of the `{foreach}` loop |
+
+## Examples
+
+```smarty
+
+{foreach $arrayvar as $itemvar}
+ {$itemvar|escape}
+{/foreach}
+
+{foreach $arrayvar as $keyvar=>$itemvar}
+ {$keyvar}: {$itemvar|escape}
+{/foreach}
+
+```
> **Note**
>
> This foreach syntax does not accept any named attributes. This syntax
@@ -26,15 +41,15 @@ associative arrays.
- `{foreachelse}` is executed when there are no values in the `array`
variable.
-- `{foreach}` properties are [`@index`](#foreach.property.index),
- [`@iteration`](#foreach.property.iteration),
- [`@first`](#foreach.property.first),
- [`@last`](#foreach.property.last),
- [`@show`](#foreach.property.show),
- [`@total`](#foreach.property.total).
+- `{foreach}` properties are [`@index`](#index),
+ [`@iteration`](#iteration),
+ [`@first`](#first),
+ [`@last`](#last),
+ [`@show`](#show),
+ [`@total`](#total).
-- `{foreach}` constructs are [`{break}`](#foreach.construct.break),
- [`{continue}`](#foreach.construct.continue).
+- `{foreach}` constructs are [`{break}`](#break),
+ [`{continue}`](#continue).
- Instead of specifying the `key` variable you can access the current
key of the loop item by `{$item@key}` (see examples below).
@@ -51,161 +66,139 @@ associative arrays.
> `{foreach $myArray as $myKey => $myValue}`, the key is always
> available as `$myValue@key` within the foreach loop.
-**Option Flags:**
-
- Name Description
- --------- ------------------------------------------
- nocache Disables caching of the `{foreach}` loop
-
-
- assign('myColors', $arr);
- ?>
-
-
-
+```php
+assign('myColors', $arr);
+```
+
Template to output `$myColors` in an un-ordered list
-
-
+```
-
Assign an array to Smarty, the key contains the key for each looped
value.
-
- assign('contacts', array(
- array('phone' => '555-555-1234',
- 'fax' => '555-555-5678',
- 'cell' => '555-555-0357'),
- array('phone' => '800-555-4444',
- 'fax' => '800-555-3333',
- 'cell' => '800-555-2222')
- ));
- ?>
-
-
+```php
+assign(
+ 'contacts',
+ [
+ ['phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'],
+ ['phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222'],
+ ]
+ );
+```
The template to output `$contact`.
+```smarty
+{* key always available as a property *}
+{foreach $contacts as $contact}
+ {foreach $contact as $value}
+ {$value@key}: {$value}
+ {/foreach}
+{/foreach}
- {* key always available as a property *}
- {foreach $contacts as $contact}
- {foreach $contact as $value}
- {$value@key}: {$value}
- {/foreach}
- {/foreach}
-
- {* accessing key the PHP syntax alternate *}
- {foreach $contacts as $contact}
- {foreach $contact as $key => $value}
- {$key}: {$value}
- {/foreach}
- {/foreach}
-
+{* accessing key the PHP syntax alternate *}
+{foreach $contacts as $contact}
+ {foreach $contact as $key => $value}
+ {$key}: {$value}
+ {/foreach}
+{/foreach}
+```
-
Either of the above examples will output:
-
- phone: 555-555-1234
- fax: 555-555-5678
- cell: 555-555-0357
- phone: 800-555-4444
- fax: 800-555-3333
- cell: 800-555-2222
-
+```
+ phone: 555-555-1234
+ fax: 555-555-5678
+ cell: 555-555-0357
+ phone: 800-555-4444
+ fax: 800-555-3333
+ cell: 800-555-2222
+```
-
A database (PDO) example of looping over search results. This example is
looping over a PHP iterator instead of an array().
+```php
+ true));
- $db = new PDO($dsn, $login, $passwd, array(
- PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
+ $res = $db->prepare("select * from users");
+ $res->execute();
+ $res->setFetchMode(PDO::FETCH_LAZY);
- $res = $db->prepare("select * from users");
- $res->execute();
- $res->setFetchMode(PDO::FETCH_LAZY);
+ // assign to smarty
+ $smarty->assign('res',$res);
- // assign to smarty
- $smarty->assign('res',$res);
+ $smarty->display('index.tpl');?>
+```
- $smarty->display('index.tpl');?>
- ?>
-
-
-
-
- {foreach $res as $r}
- {$r.id}
- {$r.name}
- {foreachelse}
- .. no results ..
- {/foreach}
-
-
+```smarty
+{foreach $res as $r}
+ {$r.id}
+ {$r.name}
+{foreachelse}
+ .. no results ..
+{/foreach}
+```
The above is assuming the results contain the columns named `id` and
`name`.
@@ -216,14 +209,13 @@ looped. With an iterator, each result is loaded/released within the
loop. This saves processing time and memory, especially for very large
result sets.
-\@index {#foreach.property.index}
--------
+## @index
`index` contains the current array index, starting with zero.
-
- {* output empty row on the 4th iteration (when index is 3) *}
-
+```smarty
+{* output empty row on the 4th iteration (when index is 3) *}
+
{foreach $items as $i}
{if $i@index eq 3}
{* put empty table row *}
@@ -231,72 +223,69 @@ result sets.
{/if}
{$i.label}
{/foreach}
-
-
+
+```
-\@iteration {#foreach.property.iteration}
------------
+## @iteration
`iteration` contains the current loop iteration and always starts at
-one, unlike [`index`](#foreach.property.index). It is incremented by one
+one, unlike [`index`](#index). It is incremented by one
on each iteration.
-The *\"is div by\"* operator can be used to detect a specific iteration.
+The *"is div by"* operator can be used to detect a specific iteration.
Here we bold-face the name every 4th iteration.
+```smarty
+{foreach $myNames as $name}
+ {if $name@iteration is div by 4}
+ {$name}
+ {/if}
+ {$name}
+{/foreach}
+```
- {foreach $myNames as $name}
- {if $name@iteration is div by 4}
- {$name}
- {/if}
- {$name}
- {/foreach}
-
-The *\"is even by\"* and *\"is odd by\"* operators can be used to
+The *"is even by"* and *"is odd by"* operators can be used to
alternate something every so many iterations. Choosing between even or
odd rotates which one starts. Here we switch the font color every 3rd
iteration.
-
- {foreach $myNames as $name}
- {if $name@iteration is even by 3}
- {$name}
- {else}
- {$name}
- {/if}
- {/foreach}
-
-
+```smarty
+ {foreach $myNames as $name}
+ {if $name@iteration is even by 3}
+ {$name}
+ {else}
+ {$name}
+ {/if}
+ {/foreach}
+```
This will output something similar to this:
-
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
- ...
-
+```html
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+...
+```
-
-\@first {#foreach.property.first}
--------
+## @first
`first` is TRUE if the current `{foreach}` iteration is the initial one.
Here we display a table header row on the first iteration.
-
- {* show table header at first iteration *}
-
+```smarty
+{* show table header at first iteration *}
+
{foreach $items as $i}
{if $i@first}
@@ -309,99 +298,92 @@ Here we display a table header row on the first iteration.
{$i.name}
{/foreach}
-
-
+
+```
-
-\@last {#foreach.property.last}
-------
+## @last
`last` is set to TRUE if the current `{foreach}` iteration is the final
one. Here we display a horizontal rule on the last iteration.
-
- {* Add horizontal rule at end of list *}
- {foreach $items as $item}
- {$item.name}{if $item@last}{else},{/if}
- {foreachelse}
- ... no items to loop ...
- {/foreach}
-
+```smarty
+{* Add horizontal rule at end of list *}
+{foreach $items as $item}
+ {$item.name}{if $item@last}{else},{/if}
+{foreachelse}
+ ... no items to loop ...
+{/foreach}
+```
-
-\@show {#foreach.property.show}
-------
+## @show
The show `show` property can be used after the execution of a
`{foreach}` loop to detect if data has been displayed or not. `show` is
a boolean value.
-
-
+```smarty
+
{foreach $myArray as $name}
{$name}
{/foreach}
-
- {if $name@show} do something here if the array contained data {/if}
+
+{if $name@show} do something here if the array contained data {/if}
+```
-\@total {#foreach.property.total}
--------
+## @total
`total` contains the number of iterations that this `{foreach}` will
loop. This can be used inside or after the `{foreach}`.
+```smarty
+{* show number of rows at end *}
+{foreach $items as $item}
+ {$item.name}
+ {if $item@last}
+
{$item@total} items
+ {/if}
+{foreachelse}
+ ... no items to loop ...
+{/foreach}
+```
- {* show number of rows at end *}
- {foreach $items as $item}
- {$item.name}
- {if $item@last}
-
{$item@total} items
- {/if}
- {foreachelse}
- ... no items to loop ...
- {/foreach}
+See also [`{section}`](./language-function-section.md),
+[`{for}`](./language-function-for.md) and
+[`{while}`](./language-function-while.md)
-See also [`{section}`](#language.function.section),
-[`{for}`](#language.function.for) and
-[`{while}`](#language.function.while)
-
-{break} {#foreach.construct.break}
--------
+## {break}
`{break}` aborts the iteration of the array
-
- {$data = [1,2,3,4,5]}
- {foreach $data as $value}
- {if $value == 3}
- {* abort iterating the array *}
- {break}
- {/if}
- {$value}
- {/foreach}
- {*
- prints: 1 2
- *}
-
+```smarty
+ {$data = [1,2,3,4,5]}
+ {foreach $data as $value}
+ {if $value == 3}
+ {* abort iterating the array *}
+ {break}
+ {/if}
+ {$value}
+ {/foreach}
+ {*
+ prints: 1 2
+ *}
+```
-
-{continue} {#foreach.construct.continue}
-----------
+## {continue}
`{continue}` leaves the current iteration and begins with the next
iteration.
-
- {$data = [1,2,3,4,5]}
- {foreach $data as $value}
- {if $value == 3}
- {* skip this iteration *}
- {continue}
- {/if}
- {$value}
- {/foreach}
- {*
- prints: 1 2 4 5
- *}
-
-
+```smarty
+ {$data = [1,2,3,4,5]}
+ {foreach $data as $value}
+ {if $value == 3}
+ {* skip this iteration *}
+ {continue}
+ {/if}
+ {$value}
+ {/foreach}
+ {*
+ prints: 1 2 4 5
+ *}
+```
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-function.md b/include/smarty/docs/designers/language-builtin-functions/language-function-function.md
index 647e4bfc8..cee6762c8 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-function.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-function.md
@@ -1,5 +1,4 @@
-{function} {#language.function.function}
-==========
+# {function}
`{function}` is used to create functions within a template and call them
just like a plugin function. Instead of writing a plugin that generates
@@ -12,15 +11,22 @@ nested menus.
> Template functions are defined global. Since the Smarty compiler is a
> single-pass compiler, The [`{call}`](#language.function.call) tag must
> be used to call a template function defined externally from the given
-> template. Otherwise you can directly use the function as
+> template. Otherwise, you can directly use the function as
> `{funcname ...}` in the template.
+## Attributes
+
+| Attribute Name | Required | Description |
+|----------------|----------|---------------------------------------------------------------|
+| name | Yes | The name of the template function |
+| \[var \...\] | No | default variable value to pass local to the template function |
+
- The `{function}` tag must have the `name` attribute which contains
- the the name of the template function. A tag with this name can be
+ the name of the template function. A tag with this name can be
used to call the template function.
- Default values for variables can be passed to the template function
- as [attributes](#language.syntax.attributes). Like in PHP function
+ as [attributes](../language-basic-syntax/language-syntax-attributes.md). Like in PHP function
declarations you can only use scalar values as default. The default
values can be overwritten when the template function is being
called.
@@ -30,12 +36,7 @@ nested menus.
inside the template function have local scope and are not visible
inside the calling template after the template function is executed.
-**Attributes:**
- Attribute Name Type Required Default Description
- ---------------- -------------- ---------- --------- ---------------------------------------------------------------
- name string Yes *n/a* The name of the template function
- \[var \...\] \[var type\] No *n/a* default variable value to pass local to the template function
> **Note**
>
@@ -45,44 +46,44 @@ nested menus.
> values must be scalar and can not be variable. Variables must be
> passed when the template is called.
+## Examples
- {* define the function *}
- {function name=menu level=0}
- {function menu level=0} {* short-hand *}
-
- {foreach $data as $entry}
- {if is_array($entry)}
-
{$entry@key}
- {menu data=$entry level=$level+1}
- {else}
-
{$entry}
- {/if}
- {/foreach}
-
- {/function}
+```smarty
+{* define the function *}
+{function name=menu level=0}
+{function menu level=0} {* short-hand *}
+
+ {foreach $data as $entry}
+ {if is_array($entry)}
+
{$entry@key}
+ {menu data=$entry level=$level+1}
+ {else}
+
{$entry}
+ {/if}
+ {/foreach}
+
+{/function}
- {* create an array to demonstrate *}
- {$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
- ['item3-3-1','item3-3-2']],'item4']}
+{* create an array to demonstrate *}
+{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
+['item3-3-1','item3-3-2']],'item4']}
- {* run the array through the function *}
- {menu data=$menu}
-
-
+{* run the array through the function *}
+{menu data=$menu}
+```
Will generate the following output
-
- * item1
- * item2
- * item3
- o item3-1
- o item3-2
- o item3-3
- + item3-3-1
- + item3-3-2
- * item4
-
+```
+* item1
+* item2
+* item3
+ o item3-1
+ o item3-2
+ o item3-3
+ + item3-3-1
+ + item3-3-2
+* item4
+```
-
-See also [`{call}`](#language.function.call)
+See also [`{call}`](./language-function-call.md)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-if.md b/include/smarty/docs/designers/language-builtin-functions/language-function-if.md
index 2c1d68eea..c7be37a2c 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-if.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-if.md
@@ -1,121 +1,120 @@
-{if},{elseif},{else} {#language.function.if}
-====================
+# {if},{elseif},{else}
`{if}` statements in Smarty have much the same flexibility as PHP
-[if](&url.php-manual;if) statements, with a few added features for the
+[if](https://www.php.net/if) statements, with a few added features for the
template engine. Every `{if}` must be paired with a matching `{/if}`.
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
-*is\_array()*, etc.
+*is_array()*, etc.
-If securty is enabled, only PHP functions from `$php_functions` property
-of the securty policy are allowed. See the
-[Security](#advanced.features.security) section for details.
+If security is enabled, only PHP functions from `$php_functions` property
+of the security policy are allowed. See the
+[Security](../../programmers/advanced-features/advanced-features-security.md) section for details.
The following is a list of recognized qualifiers, which must be
separated from surrounding elements by spaces. Note that items listed in
\[brackets\] are optional. PHP equivalents are shown where applicable.
- Qualifier Alternates Syntax Example Meaning PHP Equivalent
- -------------------- ------------ ------------------------ -------------------------------- ----------------------
- == eq \$a eq \$b equals ==
- != ne, neq \$a neq \$b not equals !=
- \> gt \$a gt \$b greater than \>
- \< lt \$a lt \$b less than \<
- \>= gte, ge \$a ge \$b greater than or equal \>=
- \<= lte, le \$a le \$b less than or equal \<=
- === \$a === 0 check for identity ===
- ! not not \$a negation (unary) !
- \% mod \$a mod \$b modulous \%
- is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
- is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
- is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
- is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
- is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
+## Qualifiers
+
+| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
+|--------------------|------------|----------------------|--------------------------------|--------------------|
+| == | eq | $a eq $b | equals | == |
+| != | ne, neq | $a neq $b | not equals | != |
+| > | gt | $a gt $b | greater than | > |
+| < | lt | $a lt $b | less than | < |
+| >= | gte, ge | $a ge $b | greater than or equal | >= |
+| <= | lte, le | $a le $b | less than or equal | <= |
+| === | | $a === 0 | check for identity | === |
+| ! | not | not $a | negation (unary) | ! |
+| % | mod | $a mod $b | modulo | % |
+| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
+| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
+| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
+| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
+| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
+
+## Examples
+```smarty
+{if $name eq 'Fred'}
+ Welcome Sir.
+{elseif $name eq 'Wilma'}
+ Welcome Ma'am.
+{else}
+ Welcome, whatever you are.
+{/if}
+
+{* an example with "or" logic *}
+{if $name eq 'Fred' or $name eq 'Wilma'}
+ ...
+{/if}
+
+{* same as above *}
+{if $name == 'Fred' || $name == 'Wilma'}
+ ...
+{/if}
- {if $name eq 'Fred'}
- Welcome Sir.
- {elseif $name eq 'Wilma'}
- Welcome Ma'am.
- {else}
- Welcome, whatever you are.
- {/if}
-
- {* an example with "or" logic *}
- {if $name eq 'Fred' or $name eq 'Wilma'}
- ...
- {/if}
-
- {* same as above *}
- {if $name == 'Fred' || $name == 'Wilma'}
- ...
- {/if}
+{* parenthesis are allowed *}
+{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
+ ...
+{/if}
- {* parenthesis are allowed *}
- {if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
- ...
- {/if}
+{* you can also embed php function calls *}
+{if count($var) gt 0}
+ ...
+{/if}
+
+{* check for array. *}
+{if is_array($foo) }
+ .....
+{/if}
+
+{* check for not null. *}
+{if isset($foo) }
+ .....
+{/if}
- {* you can also embed php function calls *}
- {if count($var) gt 0}
- ...
- {/if}
-
- {* check for array. *}
- {if is_array($foo) }
- .....
- {/if}
-
- {* check for not null. *}
- {if isset($foo) }
- .....
- {/if}
+{* test if values are even or odd *}
+{if $var is even}
+ ...
+{/if}
+{if $var is odd}
+ ...
+{/if}
+{if $var is not odd}
+ ...
+{/if}
- {* test if values are even or odd *}
- {if $var is even}
- ...
- {/if}
- {if $var is odd}
- ...
- {/if}
- {if $var is not odd}
- ...
- {/if}
+{* test if var is divisible by 4 *}
+{if $var is div by 4}
+ ...
+{/if}
- {* test if var is divisible by 4 *}
- {if $var is div by 4}
- ...
- {/if}
+{*
+ test if var is even, grouped by two. i.e.,
+ 0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
+*}
+{if $var is even by 2}
+ ...
+{/if}
+{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
+{if $var is even by 3}
+ ...
+{/if}
+
+{if isset($name) && $name == 'Blog'}
+ {* do something *}
+{elseif $name == $foo}
+ {* do something *}
+{/if}
- {*
- test if var is even, grouped by two. i.e.,
- 0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
- *}
- {if $var is even by 2}
- ...
- {/if}
-
- {* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
- {if $var is even by 3}
- ...
- {/if}
-
-
-
-
- {if isset($name) && $name == 'Blog'}
- {* do something *}
- {elseif $name == $foo}
- {* do something *}
- {/if}
-
- {if is_array($foo) && count($foo) > 0}
- {* do a foreach loop *}
- {/if}
-
+{if is_array($foo) && count($foo) > 0}
+ {* do a foreach loop *}
+{/if}
+```
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-include-php.md b/include/smarty/docs/designers/language-builtin-functions/language-function-include-php.md
deleted file mode 100644
index 8fc074a2b..000000000
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-include-php.md
+++ /dev/null
@@ -1,74 +0,0 @@
-{include\_php} {#language.function.include.php}
-==============
-
-> **Note**
->
-> `{include_php}` is deprecated from Smarty, use registered plugins to
-> properly insulate presentation from the application code. As of Smarty
-> 3.1 the `{include_php}` tags are only available from [SmartyBC](#bc).
-
- Attribute Name Type Required Default Description
- ---------------- --------- ---------- --------- ----------------------------------------------------------------------------------
- file string Yes *n/a* The name of the php file to include as absolute path
- once boolean No *TRUE* whether or not to include the php file more than once if included multiple times
- assign string No *n/a* The name of the variable that the output of include\_php will be assigned to
-
-**Option Flags:**
-
- Name Description
- --------- ----------------------------------------
- nocache Disables caching of inluded PHP script
-
-`{include_php}` tags are used to include a php script in your template.
-The path of the attribute `file` can be either absolute, or relative to
-[`$trusted_dir`](#variable.trusted.dir). If security is enabled, then
-the script must be located in the `$trusted_dir` path of the securty
-policy. See the [Security](#advanced.features.security) section for
-details.
-
-By default, php files are only included once even if called multiple
-times in the template. You can specify that it should be included every
-time with the `once` attribute. Setting once to FALSE will include the
-php script each time it is included in the template.
-
-You can optionally pass the `assign` attribute, which will specify a
-template variable name that the output of `{include_php}` will be
-assigned to instead of displayed.
-
-The smarty object is available as `$_smarty_tpl->smarty` within the PHP
-script that you include.
-
-The `load_nav.php` file:
-
-
- query('select url, name from navigation order by name');
- $this->assign('navigation', $db->getRows());
-
- ?>
-
-
-
-where the template is:
-
-
- {* absolute path, or relative to $trusted_dir *}
- {include_php file='/path/to/load_nav.php'}
- {include_php '/path/to/load_nav.php'} {* short-hand *}
-
- {foreach item='nav' from=$navigation}
- {$nav.name}
- {/foreach}
-
-
-
-See also [`{include}`](#language.function.include),
-[`$trusted_dir`](#variable.trusted.dir),
-[`{php}`](#language.function.php),
-[`{capture}`](#language.function.capture), [template
-resources](#resources) and [componentized
-templates](#tips.componentized.templates)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-include.md b/include/smarty/docs/designers/language-builtin-functions/language-function-include.md
index 956d893e6..d12a817e0 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-include.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-include.md
@@ -1,19 +1,31 @@
-{include} {#language.function.include}
-=========
+# {include}
`{include}` tags are used for including other templates in the current
template. Any variables available in the current template are also
available within the included template.
+## Attributes
+
+| Attribute Name | Required | Description |
+|----------------|----------|--------------------------------------------------------------------------------------------|
+| file | Yes | The name of the template file to include |
+| assign | No | The name of the variable that the output of include will be assigned to |
+| cache_lifetime | No | Enable caching of this subtemplate with an individual cache lifetime |
+| compile_id | No | Compile this subtemplate with an individual compile_id |
+| cache_id | No | Enable caching of this subtemplate with an individual cache_id |
+| scope | No | Define the scope of all in the subtemplate assigned variables: 'parent','root' or 'global' |
+| \[var \...\] | No | variable to pass local to template |
+
+
- The `{include}` tag must have the `file` attribute which contains
the template resource path.
- Setting the optional `assign` attribute specifies the template
variable that the output of `{include}` is assigned to, instead of
- being displayed. Similar to [`{assign}`](#language.function.assign).
+ being displayed. Similar to [`{assign}`](./language-function-assign.md).
- Variables can be passed to included templates as
- [attributes](#language.syntax.attributes). Any variables explicitly
+ [attributes](../language-basic-syntax/language-syntax-attributes.md). Any variables explicitly
passed to an included template are only available within the scope
of the included file. Attribute variables override current template
variables, in the case when they are named the same.
@@ -25,36 +37,25 @@ available within the included template.
default behaviour can be changed for all variables assigned in the
included template by using the scope attribute at the `{include}`
statement or for individual variables by using the scope attribute
- at the [`{assign}`](#language.function.assign) statement. The later
+ at the [`{assign}`](./language-function-assign.md) statement. The later
is useful to return values from the included template to the
including template.
-- Use the syntax for [template resources](#resources) to `{include}`
- files outside of the [`$template_dir`](#variable.template.dir)
+- Use the syntax for [template resources](../../programmers/resources.md) to `{include}`
+ files outside of the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md)
directory.
-**Attributes:**
+## Option Flags
- Attribute Name Type Required Default Description
- ----------------- ---------------- ---------- --------- --------------------------------------------------------------------------------------------------
- file string Yes *n/a* The name of the template file to include
- assign string No *n/a* The name of the variable that the output of include will be assigned to
- cache\_lifetime integer No *n/a* Enable caching of this subtemplate with an individual cache lifetime
- compile\_id string/integer No *n/a* Compile this subtemplate with an individual compile\_id
- cache\_id string/integer No *n/a* Enable caching of this subtemplate with an individual cache\_id
- scope string No *n/a* Define the scope of all in the subtemplate assigned variables: \'parent\',\'root\' or \'global\'
- \[var \...\] \[var type\] No *n/a* variable to pass local to template
+| Name | Description |
+|---------|--------------------------------------------------------------------------------------|
+| nocache | Disables caching of this subtemplate |
+| caching | Enable caching of this subtemplate |
+| inline | If set, merge the compile-code of the subtemplate into the compiled calling template |
-**Option Flags:**
-
- Name Description
- --------- -------------------------------------------------------------------------------------
- nocache Disables caching of this subtemplate
- caching Enable caching of this subtemplate
- inline If set merge the compile code of the subtemplate into the compiled calling template
-
-
-
+## Examples
+```smarty
+
{$title}
@@ -69,126 +70,118 @@ available within the included template.
{* using shortform file attribute *}
{include 'page_footer.tpl'}
-
+
+```
-
+```smarty
+{include 'links.tpl' title='Newest links' links=$link_array}
+{* body of template goes here *}
+{include 'footer.tpl' foo='bar'}
- {include 'links.tpl' title='Newest links' links=$link_array}
- {* body of template goes here *}
- {include 'footer.tpl' foo='bar'}
-
-
+```
The template above includes the example `links.tpl` below
-
-
+```
Variables assigned in the included template will be seen in the
including template.
-
- {include 'sub_template.tpl' scope=parent}
- ...
- {* display variables assigned in sub_template *}
- {$foo}
- {$bar}
- ...
-
+```smarty
+{include 'sub_template.tpl' scope=parent}
+...
+{* display variables assigned in sub_template *}
+{$foo}
+{$bar}
+...
+```
-
The template above includes the example `sub_template.tpl` below
-
- ...
- {assign var=foo value='something'}
- {assign var=bar value='value'}
- ...
+```smarty
+...
+{assign var=foo value='something'}
+{assign var=bar value='value'}
+...
+```
The included template will not be cached.
-
- {include 'sub_template.tpl' nocache}
- ...
-
+```smarty
+{include 'sub_template.tpl' nocache}
+...
+```
-
In this example included template will be cached with an individual
cache lifetime of 500 seconds.
-
- {include 'sub_template.tpl' cache_lifetime=500}
- ...
-
+```smarty
+{include 'sub_template.tpl' cache_lifetime=500}
+...
+```
-
In this example included template will be cached independent of the
-global cahing setting.
-
-
- {include 'sub_template.tpl' caching}
- ...
+global caching setting.
+```smarty
+{include 'sub_template.tpl' caching}
+...
+```
-
This example assigns the contents of `nav.tpl` to the `$navbar`
variable, which is then output at both the top and bottom of the page.
-
-
- {include 'nav.tpl' assign=navbar}
- {include 'header.tpl' title='Smarty is cool'}
- {$navbar}
- {* body of template goes here *}
- {$navbar}
- {include 'footer.tpl'}
-
-
+```smarty
+
+ {include 'nav.tpl' assign=navbar}
+ {include 'header.tpl' title='Smarty is cool'}
+ {$navbar}
+ {* body of template goes here *}
+ {$navbar}
+ {include 'footer.tpl'}
+
+```
-
This example includes another template relative to the directory of the
current template.
-
- {include 'template-in-a-template_dir-directory.tpl'}
- {include './template-in-same-directory.tpl'}
- {include '../template-in-parent-directory.tpl'}
-
+```smarty
+{include 'template-in-a-template_dir-directory.tpl'}
+{include './template-in-same-directory.tpl'}
+{include '../template-in-parent-directory.tpl'}
+```
+```smarty
+{* absolute filepath *}
+{include file='/usr/local/include/templates/header.tpl'}
+{* absolute filepath (same thing) *}
+{include file='file:/usr/local/include/templates/header.tpl'}
- {* absolute filepath *}
- {include file='/usr/local/include/templates/header.tpl'}
+{* windows absolute filepath (MUST use "file:" prefix) *}
+{include file='file:C:/www/pub/templates/header.tpl'}
- {* absolute filepath (same thing) *}
- {include file='file:/usr/local/include/templates/header.tpl'}
+{* include from template resource named "db" *}
+{include file='db:header.tpl'}
- {* windows absolute filepath (MUST use "file:" prefix) *}
- {include file='file:C:/www/pub/templates/header.tpl'}
+{* include a $variable template - eg $module = 'contacts' *}
+{include file="$module.tpl"}
- {* include from template resource named "db" *}
- {include file='db:header.tpl'}
-
- {* include a $variable template - eg $module = 'contacts' *}
- {include file="$module.tpl"}
-
- {* wont work as its single quotes ie no variable substitution *}
- {include file='$module.tpl'}
-
- {* include a multi $variable template - eg amber/links.view.tpl *}
- {include file="$style_dir/$module.$view.tpl"}
+{* wont work as its single quotes ie no variable substitution *}
+{include file='$module.tpl'}
+{* include a multi $variable template - eg amber/links.view.tpl *}
+{include file="$style_dir/$module.$view.tpl"}
+```
-
-See also [`{include_php}`](#language.function.include.php),
-[`{insert}`](#language.function.insert),
-[`{php}`](#language.function.php), [template resources](#resources) and
-[componentized templates](#tips.componentized.templates).
+See also [`{insert}`](./language-function-insert.md), [template resources](../../programmers/resources.md) and
+[componentized templates](../../appendixes/tips.md#componentized-templates).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-insert.md b/include/smarty/docs/designers/language-builtin-functions/language-function-insert.md
index e37c73890..54f0729dd 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-insert.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-insert.md
@@ -1,51 +1,51 @@
-{insert} {#language.function.insert}
-========
+# {insert}
> **Note**
>
> `{insert}` tags are deprecated from Smarty, and should not be used.
> Put your PHP logic in PHP scripts or plugin functions instead.
-
-> **Note**
->
> As of Smarty 3.1 the `{insert}` tags are only available from
> [SmartyBC](#bc).
-`{insert}` tags work much like [`{include}`](#language.function.include)
+`{insert}` tags work much like [`{include}`](./language-function-include.md)
tags, except that `{insert}` tags are NOT cached when template
-[caching](#caching) is enabled. They will be executed on every
+[caching](../../programmers/caching.md) is enabled. They will be executed on every
invocation of the template.
- Attribute Name Type Required Default Description
- ---------------- -------------- ---------- --------- ----------------------------------------------------------------------------------
- name string Yes *n/a* The name of the insert function (insert\_`name`) or insert plugin
- assign string No *n/a* The name of the template variable the output will be assigned to
- script string No *n/a* The name of the php script that is included before the insert function is called
- \[var \...\] \[var type\] No *n/a* variable to pass to insert function
+| Attribute Name | Required | Description |
+|----------------|----------|----------------------------------------------------------------------------------|
+| name | Yes | The name of the insert function (insert_`name`) or insert plugin |
+| assign | No | The name of the template variable the output will be assigned to |
+| script | No | The name of the php script that is included before the insert function is called |
+| \[var \...\] | No | variable to pass to insert function |
-Let\'s say you have a template with a banner slot at the top of the
+## Examples
+
+Let's say you have a template with a banner slot at the top of the
page. The banner can contain any mixture of HTML, images, flash, etc. so
-we can\'t just use a static link here, and we don\'t want this contents
+we can't just use a static link here, and we don't want this contents
cached with the page. In comes the {insert} tag: the template knows
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
-[config file](#config.files)), and needs to call a function to get the
+[config file](../config-files.md)), and needs to call a function to get the
banner contents.
+```smarty
{* example of fetching a banner *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
+```
In this example, we are using the name "getBanner" and passing the
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
for a function named insert\_getBanner() in your PHP application,
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
first argument in an associative array. All {insert} function names in
-your application must be prepended with \"insert\_\" to remedy possible
+your application must be prepended with "insert_" to remedy possible
function name-space conflicts. Your insert\_getBanner() function should
do something with the passed values and return the results. These
results are then displayed in the template in place of the {insert} tag.
In this example, Smarty would call this function:
-insert\_getBanner(array(\"lid\" =\> \"12345\",\"sid\" =\> \"67890\"));
+insert_getBanner(array("lid" => "12345","sid" => "67890"));
and display the returned results in place of the {insert} tag.
- If you supply the `assign` attribute, the output of the `{insert}`
@@ -54,8 +54,8 @@ and display the returned results in place of the {insert} tag.
> **Note**
>
- > Assigning the output to a template variable isn\'t too useful with
- > [caching](#variable.caching) enabled.
+ > Assigning the output to a template variable isn't too useful with
+ > [caching](../../programmers/api-variables/variable-caching.md) enabled.
- If you supply the `script` attribute, this php script will be
included (only once) before the `{insert}` function is executed.
@@ -63,9 +63,9 @@ and display the returned results in place of the {insert} tag.
php script must be included first to make it work.
The path can be either absolute, or relative to
- [`$trusted_dir`](#variable.trusted.dir). If security is enabled,
+ [`$trusted_dir`](../../programmers/api-variables/variable-trusted-dir.md). If security is enabled,
then the script must be located in the `$trusted_dir` path of the
- securty policy. See the [Security](#advanced.features.security)
+ security policy. See the [Security](../../programmers/advanced-features/advanced-features-security.md)
section for details.
The Smarty object is passed as the second argument. This way you can
@@ -78,9 +78,9 @@ insert plugin.
> **Note**
>
> It is possible to have portions of the template not cached. If you
-> have [caching](#caching) turned on, `{insert}` tags will not be
+> have [caching](../../programmers/api-variables/variable-caching.md) turned on, `{insert}` tags will not be
> cached. They will run dynamically every time the page is created, even
> within cached pages. This works good for things like banners, polls,
> live weather, search results, user feedback areas, etc.
-See also [`{include}`](#language.function.include)
+See also [`{include}`](./language-function-include.md)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-ldelim.md b/include/smarty/docs/designers/language-builtin-functions/language-function-ldelim.md
index 2afda031a..c9f73c307 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-ldelim.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-ldelim.md
@@ -1,55 +1,51 @@
-{ldelim},{rdelim} {#language.function.ldelim}
-=================
+# {ldelim}, {rdelim}
-`{ldelim}` and `{rdelim}` are used for [escaping](#language.escaping)
+`{ldelim}` and `{rdelim}` are used for [escaping](../language-basic-syntax/language-escaping.md)
template delimiters, by default **{** and **}**. You can also use
-[`{literal}{/literal}`](#language.function.literal) to escape blocks of
+[`{literal}{/literal}`](./language-function-literal.md) to escape blocks of
text eg Javascript or CSS. See also the complementary
-[`{$smarty.ldelim}`](#language.variables.smarty.ldelim).
+[`{$smarty.ldelim}`](../../programmers/api-variables/variable-left-delimiter.md).
+```smarty
+{* this will print literal delimiters out of the template *}
- {* this will print literal delimiters out of the template *}
-
- {ldelim}funcname{rdelim} is how functions look in Smarty!
-
-
+{ldelim}funcname{rdelim} is how functions look in Smarty!
+```
The above example will output:
-
- {funcname} is how functions look in Smarty!
-
-
+```
+{funcname} is how functions look in Smarty!
+```
Another example with some Javascript
-
-
-
-
+```smarty
+
+```
will output
+```html
+
+```
-
+```smarty
+
+Click here for Server Info
+```
-
-
-
-
- Click here for Server Info
-
-See also [`{literal}`](#language.function.literal) and [escaping Smarty
-parsing](#language.escaping).
+See also [`{literal}`](./language-function-literal.md) and [escaping Smarty
+parsing](../language-basic-syntax/language-escaping.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-literal.md b/include/smarty/docs/designers/language-builtin-functions/language-function-literal.md
index 27ebb3ff4..4bc12f9d0 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-literal.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-literal.md
@@ -1,13 +1,12 @@
-{literal} {#language.function.literal}
-=========
+# {literal}
`{literal}` tags allow a block of data to be taken literally. This is
typically used around Javascript or stylesheet blocks where {curly
braces} would interfere with the template
-[delimiter](#variable.left.delimiter) syntax. Anything within
+[delimiter](../../programmers/api-variables/variable-left-delimiter.md) syntax. Anything within
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
you need template tags embedded in a `{literal}` block, consider using
-[`{ldelim}{rdelim}`](#language.function.ldelim) to escape the individual
+[`{ldelim}{rdelim}`](./language-function-ldelim.md) to escape the individual
delimiters instead.
> **Note**
@@ -17,20 +16,19 @@ delimiters instead.
> javascript and CSS curly braces are surrounded by whitespace. This is
> new behavior to Smarty 3.
+```smarty
+
+```
-
-
-
-
-See also [`{ldelim} {rdelim}`](#language.function.ldelim) and the
-[escaping Smarty parsing](#language.escaping) page.
+See also [`{ldelim} {rdelim}`](./language-function-ldelim.md) and the
+[escaping Smarty parsing](../language-basic-syntax/language-escaping.md) page.
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-nocache.md b/include/smarty/docs/designers/language-builtin-functions/language-function-nocache.md
index a5922f838..e6d8453fd 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-nocache.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-nocache.md
@@ -1,5 +1,4 @@
-{nocache} {#language.function.nocache}
-=========
+# {nocache}
`{nocache}` is used to disable caching of a template section. Every
`{nocache}` must be paired with a matching `{/nocache}`.
@@ -9,15 +8,13 @@
> Be sure any variables used within a non-cached section are also
> assigned from PHP when the page is loaded from the cache.
-
-
- Today's date is
- {nocache}
- {$smarty.now|date_format}
- {/nocache}
-
-
-
+```smarty
+Today's date is
+{nocache}
+{$smarty.now|date_format}
+{/nocache}
+```
+
The above code will output the current date on a cached page.
-See also the [caching section](#caching).
+See also the [caching section](../../programmers/caching.md).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-section.md b/include/smarty/docs/designers/language-builtin-functions/language-function-section.md
index 0bab5c715..ba17224c0 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-section.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-section.md
@@ -1,14 +1,13 @@
-{section},{sectionelse} {#language.function.section}
-=======================
+# {section}, {sectionelse}
A `{section}` is for looping over **sequentially indexed arrays of
-data**, unlike [`{foreach}`](#language.function.foreach) which is used
+data**, unlike [`{foreach}`](./language-function-foreach.md) which is used
to loop over a **single associative array**. Every `{section}` tag must
be paired with a closing `{/section}` tag.
> **Note**
>
-> The [`{foreach}`](#language.function.foreach) loop can do everything a
+> The [`{foreach}`](./language-function-foreach.md) loop can do everything a
> {section} loop can do, and has a simpler and easier syntax. It is
> usually preferred over the {section} loop.
@@ -16,30 +15,33 @@ be paired with a closing `{/section}` tag.
>
> {section} loops cannot loop over associative arrays, they must be
> numerically indexed, and sequential (0,1,2,\...). For associative
-> arrays, use the [`{foreach}`](#language.function.foreach) loop.
+> arrays, use the [`{foreach}`](./language-function-foreach.md) loop.
- Attribute Name Type Required Default Description
- ---------------- --------- ---------- --------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- name string Yes *n/a* The name of the section
- loop mixed Yes *n/a* Value to determine the number of loop iterations
- start integer No *0* The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value.
- step integer No *1* The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0,2,4, etc. If step is negative, it will step through the array backwards.
- max integer No *n/a* Sets the maximum number of times the section will loop.
- show boolean No *TRUE* Determines whether or not to show this section
-**Option Flags:**
+## Attributes
- Name Description
- --------- ------------------------------------------
- nocache Disables caching of the `{section}` loop
+| Attribute Name | Required | Description |
+|----------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| name | Yes | The name of the section |
+| loop | Yes | Value to determine the number of loop iterations |
+| start | No | The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value. Defaults to 0. |
+| step | No | The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0, 2, 4, etc. If step is negative, it will step through the array backwards. Defaults to 1. |
+| max | No | Sets the maximum number of times the section will loop. |
+| show | No | Determines whether to show this section (defaults to true) |
+
+## Option Flags
+
+| Name | Description |
+|---------|------------------------------------------|
+| nocache | Disables caching of the `{section}` loop |
- Required attributes are `name` and `loop`.
- The `name` of the `{section}` can be anything you like, made up of
letters, numbers and underscores, like [PHP
- variables](&url.php-manual;language.variables).
+ variables](https://www.php.net/language.variables).
-- {section}\'s can be nested, and the nested `{section}` names must be
+- {section}'s can be nested, and the nested `{section}` names must be
unique from each other.
- The `loop` attribute, usually an array of values, determines the
@@ -54,162 +56,156 @@ be paired with a closing `{/section}` tag.
- A `{section}` also has its own variables that handle `{section}`
properties. These properties are accessible as:
- [`{$smarty.section.name.property}`](#language.variables.smarty.loops)
+ [`{$smarty.section.name.property}`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops)
where "name" is the attribute `name`.
-- `{section}` properties are [`index`](#section.property.index),
- [`index_prev`](#section.property.index.prev),
- [`index_next`](#section.property.index.next),
- [`iteration`](#section.property.iteration),
- [`first`](#section.property.first),
- [`last`](#section.property.last),
- [`rownum`](#section.property.rownum),
- [`loop`](#section.property.loop), [`show`](#section.property.show),
- [`total`](#section.property.total).
+- `{section}` properties are [`index`](#index),
+ [`index_prev`](#index_prev),
+ [`index_next`](#index_next),
+ [`iteration`](#iteration),
+ [`first`](#first),
+ [`last`](#last),
+ [`rownum`](#rownum),
+ [`loop`](#loop), [`show`](#show),
+ [`total`](#total).
-[`assign()`](#api.assign) an array to Smarty
+[`assign()`](../../programmers/api-functions/api-assign.md) an array to Smarty
+## Examples
- assign('custid',$data);
- ?>
+```php
+assign('custid', $data);
+```
The template that outputs the array
-
- {* this example will print out all the values of the $custid array *}
- {section name=customer loop=$custid}
- {section customer $custid} {* short-hand *}
- id: {$custid[customer]}
- {/section}
-
- {* print out all the values of the $custid array reversed *}
- {section name=foo loop=$custid step=-1}
- {section foo $custid step=-1} {* short-hand *}
- {$custid[foo]}
- {/section}
-
+```smarty
+{* this example will print out all the values of the $custid array *}
+{section name=customer loop=$custid}
+{section customer $custid} {* short-hand *}
+ id: {$custid[customer]}
+{/section}
+
+{* print out all the values of the $custid array reversed *}
+{section name=foo loop=$custid step=-1}
+{section foo $custid step=-1} {* short-hand *}
+ {$custid[foo]}
+{/section}
+```
+The above example will output:
+
+```html
+id: 1000
+id: 1001
+id: 1002
+
+id: 1002
+id: 1001
+id: 1000
+```
+
+```smarty
+{section name=foo start=10 loop=20 step=2}
+ {$smarty.section.foo.index}
+{/section}
+
+{section name=bar loop=21 max=6 step=-2}
+ {$smarty.section.bar.index}
+{/section}
+```
The above example will output:
-
- id: 1000
- id: 1001
- id: 1002
-
- id: 1002
- id: 1001
- id: 1000
-
-
-
-
- {section name=foo start=10 loop=20 step=2}
- {$smarty.section.foo.index}
- {/section}
-
- {section name=bar loop=21 max=6 step=-2}
- {$smarty.section.bar.index}
- {/section}
-
-The above example will output:
-
-
- 10 12 14 16 18
-
- 20 18 16 14 12 10
-
-
+```html
+10 12 14 16 18
+
+20 18 16 14 12 10
+```
The `name` of the `{section}` can be anything you like, see [PHP
-variables](&url.php-manual;language.variables). It is used to reference
+variables](https://www.php.net/language.variables). It is used to reference
the data within the `{section}`.
-
- {section name=anything loop=$myArray}
- {$myArray[anything].foo}
- {$name[anything]}
- {$address[anything].bar}
- {/section}
-
-
+```smarty
+{section name=anything loop=$myArray}
+ {$myArray[anything].foo}
+ {$name[anything]}
+ {$address[anything].bar}
+{/section}
+```
This is an example of printing an associative array of data with a
`{section}`. Following is the php script to assign the `$contacts` array
to Smarty.
-
- 'John Smith', 'home' => '555-555-5555',
- 'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
- array('name' => 'Jack Jones', 'home' => '777-555-5555',
- 'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
- array('name' => 'Jane Munson', 'home' => '000-555-5555',
- 'cell' => '123456', 'email' => 'jane@myexample.com')
- );
- $smarty->assign('contacts',$data);
- ?>
-
-
-
+```php
+ 'John Smith', 'home' => '555-555-5555',
+ 'cell' => '666-555-5555', 'email' => 'john@myexample.com'],
+ ['name' => 'Jack Jones', 'home' => '777-555-5555',
+ 'cell' => '888-555-5555', 'email' => 'jack@myexample.com'],
+ ['name' => 'Jane Munson', 'home' => '000-555-5555',
+ 'cell' => '123456', 'email' => 'jane@myexample.com']
+];
+$smarty->assign('contacts',$data);
+```
+
The template to output `$contacts`
-
- {section name=customer loop=$contacts}
-
+{/section}
+```
The above example will output:
-
-
- name: John Smith
- home: 555-555-5555
- cell: 666-555-5555
- e-mail: john@myexample.com
-
-
- name: Jack Jones
- home phone: 777-555-5555
- cell phone: 888-555-5555
- e-mail: jack@myexample.com
-
-
- name: Jane Munson
- home phone: 000-555-5555
- cell phone: 123456
- e-mail: jane@myexample.com
-
-
+```html
+
+ name: John Smith
+ home: 555-555-5555
+ cell: 666-555-5555
+ e-mail: john@myexample.com
+
+
+ name: Jack Jones
+ home phone: 777-555-5555
+ cell phone: 888-555-5555
+ e-mail: jack@myexample.com
+
+
+ name: Jane Munson
+ home phone: 000-555-5555
+ cell phone: 123456
+ e-mail: jane@myexample.com
+
+```
-
This example assumes that `$custid`, `$name` and `$address` are all
arrays containing the same number of values. First the php script that
-assign\'s the arrays to Smarty.
+assign's the arrays to Smarty.
+```php
+assign('custid',$id);
- $id = array(1001,1002,1003);
- $smarty->assign('custid',$id);
+$fullnames = ['John Smith','Jack Jones','Jane Munson'];
+$smarty->assign('name',$fullnames);
- $fullnames = array('John Smith','Jack Jones','Jane Munson');
- $smarty->assign('name',$fullnames);
-
- $addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
- $smarty->assign('address',$addr);
-
- ?>
+$addr = ['253 Abbey road', '417 Mulberry ln', '5605 apple st'];
+$smarty->assign('address',$addr);
+```
The `loop` variable only determines the number of times to loop. You can
access ANY variable from the template within the `{section}`. This is
@@ -217,125 +213,119 @@ useful for looping multiple arrays. You can pass an array which will
determine the loop count by the array size, or you can pass an integer
to specify the number of loops.
-
- {section name=customer loop=$custid}
-
+{/section}
+```
-
The above example will output:
-
-
- id: 1000
- name: John Smith
- address: 253 Abbey road
-
-
- id: 1001
- name: Jack Jones
- address: 417 Mulberry ln
-
-
- id: 1002
- name: Jane Munson
- address: 5605 apple st
-
-
+```html
+
+ id: 1000
+ name: John Smith
+ address: 253 Abbey road
+
+
+ id: 1001
+ name: Jack Jones
+ address: 417 Mulberry ln
+
+
+ id: 1002
+ name: Jane Munson
+ address: 5605 apple st
+
+```
+{section}'s can be nested as deep as you like. With nested
+{section}'s, you can access complex data structures, such as
+multidimensional arrays. This is an example `.php` script that
+assigns the arrays.
-{section}\'s can be nested as deep as you like. With nested
-{section}\'s, you can access complex data structures, such as
-multi-dimensional arrays. This is an example `.php` script thats
-assign\'s the arrays.
+```php
+assign('custid',$id);
- assign('name',$fullnames);
- $id = array(1001,1002,1003);
- $smarty->assign('custid',$id);
+$addr = ['253 N 45th', '417 Mulberry ln', '5605 apple st'];
+$smarty->assign('address',$addr);
- $fullnames = array('John Smith','Jack Jones','Jane Munson');
- $smarty->assign('name',$fullnames);
+$types = [
+ [ 'home phone', 'cell phone', 'e-mail'],
+ [ 'home phone', 'web'],
+ [ 'cell phone']
+ ];
+$smarty->assign('contact_type', $types);
- $addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
- $smarty->assign('address',$addr);
-
- $types = array(
- array( 'home phone', 'cell phone', 'e-mail'),
- array( 'home phone', 'web'),
- array( 'cell phone')
- );
- $smarty->assign('contact_type', $types);
-
- $info = array(
- array('555-555-5555', '666-555-5555', 'john@myexample.com'),
- array( '123-456-4', 'www.example.com'),
- array( '0457878')
- );
- $smarty->assign('contact_info', $info);
-
- ?>
+$info = [
+ ['555-555-5555', '666-555-5555', 'john@myexample.com'],
+ [ '123-456-4', 'www.example.com'],
+ [ '0457878']
+ ];
+$smarty->assign('contact_info', $info);
+```
-
-In this template, *\$contact\_type\[customer\]* is an array of contact
+In this template, *$contact_type\[customer\]* is an array of contact
types for the current customer.
-
- {section name=customer loop=$custid}
-
- id: {$custid[customer]}
- name: {$name[customer]}
- address: {$address[customer]}
- {section name=contact loop=$contact_type[customer]}
- {$contact_type[customer][contact]}: {$contact_info[customer][contact]}
- {/section}
- {/section}
-
+```smarty
+{section name=customer loop=$custid}
+
+ id: {$custid[customer]}
+ name: {$name[customer]}
+ address: {$address[customer]}
+ {section name=contact loop=$contact_type[customer]}
+ {$contact_type[customer][contact]}: {$contact_info[customer][contact]}
+ {/section}
+{/section}
+```
-
The above example will output:
-
-
- id: 1000
- name: John Smith
- address: 253 N 45th
- home phone: 555-555-5555
- cell phone: 666-555-5555
- e-mail: john@myexample.com
-
- id: 1001
- name: Jack Jones
- address: 417 Mulberry ln
- home phone: 123-456-4
- web: www.example.com
-
- id: 1002
- name: Jane Munson
- address: 5605 apple st
- cell phone: 0457878
-
+```html
+
+ id: 1000
+ name: John Smith
+ address: 253 N 45th
+ home phone: 555-555-5555
+ cell phone: 666-555-5555
+ e-mail: john@myexample.com
+
+ id: 1001
+ name: Jack Jones
+ address: 417 Mulberry ln
+ home phone: 123-456-4
+ web: www.example.com
+
+ id: 1002
+ name: Jane Munson
+ address: 5605 apple st
+ cell phone: 0457878
+```
-
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
-
- assign('contacts', $db->getAll($sql));
- ?>
+```php
+assign('contacts', $db->getAll($sql));
+```
The template to output the database result in a HTML table
-
-
+```smarty
+
Name>
Home
Cell
Email
{section name=co loop=$contacts}
@@ -348,11 +338,10 @@ The template to output the database result in a HTML table
{sectionelse}
No items found
{/section}
-
-
-.index {#section.property.index}
-------
+
+```
+## .index
`index` contains the current array index, starting with zero or the
`start` attribute if given. It increments by one or by the `step`
attribute if given.
@@ -360,129 +349,120 @@ attribute if given.
> **Note**
>
> If the `step` and `start` properties are not modified, then this works
-> the same as the [`iteration`](#section.property.iteration) property,
+> the same as the [`iteration`](#iteration) property,
> except it starts at zero instead of one.
> **Note**
>
> `$custid[customer.index]` and `$custid[customer]` are identical.
-
- {section name=customer loop=$custid}
- {$smarty.section.customer.index} id: {$custid[customer]}
- {/section}
-
+```smarty
+{section name=customer loop=$custid}
+ {$smarty.section.customer.index} id: {$custid[customer]}
+{/section}
+```
-
The above example will output:
-
- 0 id: 1000
- 1 id: 1001
- 2 id: 1002
-
+```html
+0 id: 1000
+1 id: 1001
+2 id: 1002
+```
-.index\_prev {#section.property.index.prev}
-------------
+## .index_prev
-`index_prev` is the previous loop index. On the first loop, this is set
-to -1.
+`index_prev` is the previous loop index. On the first loop, this is set to -1.
-.index\_next {#section.property.index.next}
-------------
+## .index_next
`index_next` is the next loop index. On the last loop, this is still one
more than the current index, respecting the setting of the `step`
attribute, if given.
-
- assign('rows',$data);
- ?>
+```
Template to output the above array in a table
-
- {* $rows[row.index] and $rows[row] are identical in meaning *}
-
-
-
index
id
-
index_prev
prev_id
-
index_next
next_id
-
- {section name=row loop=$rows}
-
-
{$smarty.section.row.index}
{$rows[row]}
-
{$smarty.section.row.index_prev}
{$rows[row.index_prev]}
-
{$smarty.section.row.index_next}
{$rows[row.index_next]}
-
- {/section}
-
-
+```smarty
+{* $rows[row.index] and $rows[row] are identical in meaning *}
+
+
+
index
id
+
index_prev
prev_id
+
index_next
next_id
+
+{section name=row loop=$rows}
+
+
{$smarty.section.row.index}
{$rows[row]}
+
{$smarty.section.row.index_prev}
{$rows[row.index_prev]}
+
{$smarty.section.row.index_next}
{$rows[row.index_next]}
+
+{/section}
+
+```
-
The above example will output a table containing the following:
-
+```
index id index_prev prev_id index_next next_id
0 1001 -1 1 1002
1 1002 0 1001 2 1003
2 1003 1 1002 3 1004
3 1004 2 1003 4 1005
4 1005 3 1004 5
-
+```
-
-.iteration {#section.property.iteration}
-----------
+## .iteration
`iteration` contains the current loop iteration and starts at one.
> **Note**
>
> This is not affected by the `{section}` properties `start`, `step` and
-> `max`, unlike the [`index`](#section.property.index) property.
+> `max`, unlike the [`index`](#index) property.
> `iteration` also starts with one instead of zero unlike `index`.
-> [`rownum`](#section.property.rownum) is an alias to `iteration`, they
+> [`rownum`](#rownum) is an alias to `iteration`, they
> are identical.
-
- assign('arr',$id);
- ?>
+```php
+assign('arr', $id);
+```
Template to output every other element of the `$arr` array as `step=2`
-
- {section name=cu loop=$arr start=5 step=2}
- iteration={$smarty.section.cu.iteration}
- index={$smarty.section.cu.index}
- id={$custid[cu]}
- {/section}
-
+```smarty
+{section name=cu loop=$arr start=5 step=2}
+ iteration={$smarty.section.cu.iteration}
+ index={$smarty.section.cu.index}
+ id={$custid[cu]}
+{/section}
+```
-
The above example will output:
-
- iteration=1 index=5 id=3005
- iteration=2 index=7 id=3007
- iteration=3 index=9 id=3009
- iteration=4 index=11 id=3011
- iteration=5 index=13 id=3013
- iteration=6 index=15 id=3015
-
-
+```html
+iteration=1 index=5 id=3005
+iteration=2 index=7 id=3007
+iteration=3 index=9 id=3009
+iteration=4 index=11 id=3011
+iteration=5 index=13 id=3013
+iteration=6 index=15 id=3015
+```
Another example that uses the `iteration` property to output a table
header block every five rows.
-
-
+```smarty
+
{section name=co loop=$contacts}
{if $smarty.section.co.iteration is div by 5}
Name>
Home
Cell
Email
@@ -495,150 +475,136 @@ header block every five rows.
{$contacts[co].email}
{/section}
-
+
+```
-
-
-An that uses the `iteration` property to alternate a text color every
+An example that uses the `iteration` property to alternate a text color every
third row.
-
-
- {section name=co loop=$contacts}
- {if $smarty.section.co.iteration is even by 3}
- {$contacts[co].name}
- {else}
- {$contacts[co].name}
- {/if}
- {/section}
-
-
-
+```smarty
+
+ {section name=co loop=$contacts}
+ {if $smarty.section.co.iteration is even by 3}
+ {$contacts[co].name}
+ {else}
+ {$contacts[co].name}
+ {/if}
+ {/section}
+
+```
> **Note**
>
-> The *\"is div by\"* syntax is a simpler alternative to the PHP mod
+> The *"is div by"* syntax is a simpler alternative to the PHP mod
> operator syntax. The mod operator is allowed:
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
> **Note**
>
-> You can also use *\"is odd by\"* to reverse the alternating.
+> You can also use *"is odd by"* to reverse the alternating.
-.first {#section.property.first}
-------
+## .first
-`first` is set to TRUE if the current `{section}` iteration is the
-initial one.
+`first` is set to TRUE if the current `{section}` iteration is the initial one.
-.last {#section.property.last}
------
+## .last
`last` is set to TRUE if the current section iteration is the final one.
This example loops the `$customers` array, outputs a header block on the
first iteration and on the last outputs the footer block. Also uses the
-[`total`](#section.property.total) property.
+[`total`](#total) property.
+```smarty
+{section name=customer loop=$customers}
+ {if $smarty.section.customer.first}
+
- {/if}
- {/section}
-
-
-
-.rownum {#section.property.rownum}
--------
+## .rownum
`rownum` contains the current loop iteration, starting with one. It is
-an alias to [`iteration`](#section.property.iteration), they work
+an alias to [`iteration`](#iteration), they work
identically.
-.loop {#section.property.loop}
------
+## .loop
`loop` contains the last index number that this {section} looped. This
can be used inside or after the `{section}`.
-
- {section name=customer loop=$custid}
- {$smarty.section.customer.index} id: {$custid[customer]}
- {/section}
- There are {$smarty.section.customer.loop} customers shown above.
-
-
+```smarty
+{section name=customer loop=$custid}
+ {$smarty.section.customer.index} id: {$custid[customer]}
+{/section}
+There are {$smarty.section.customer.loop} customers shown above.
+```
The above example will output:
+```html
+0 id: 1000
+1 id: 1001
+2 id: 1002
+There are 3 customers shown above.
+```
- 0 id: 1000
- 1 id: 1001
- 2 id: 1002
- There are 3 customers shown above.
-
-
-
-.show {#section.property.show}
------
+## .show
`show` is used as a parameter to section and is a boolean value. If
FALSE, the section will not be displayed. If there is a `{sectionelse}`
present, that will be alternately displayed.
Boolean `$show_customer_info` has been passed from the PHP application,
-to regulate whether or not this section shows.
+to regulate whether this section shows.
+```smarty
+{section name=customer loop=$customers show=$show_customer_info}
+ {$smarty.section.customer.rownum} id: {$customers[customer]}
+{/section}
- {section name=customer loop=$customers show=$show_customer_info}
- {$smarty.section.customer.rownum} id: {$customers[customer]}
- {/section}
-
- {if $smarty.section.customer.show}
- the section was shown.
- {else}
- the section was not shown.
- {/if}
-
+{if $smarty.section.customer.show}
+ the section was shown.
+{else}
+ the section was not shown.
+{/if}
+```
-
The above example will output:
+```html
+1 id: 1000
+2 id: 1001
+3 id: 1002
- 1 id: 1000
- 2 id: 1001
- 3 id: 1002
-
- the section was shown.
-
+the section was shown.
+```
-.total {#section.property.total}
-------
+## .total
`total` contains the number of iterations that this `{section}` will
loop. This can be used inside or after a `{section}`.
-
- {section name=customer loop=$custid step=2}
- {$smarty.section.customer.index} id: {$custid[customer]}
- {/section}
- There are {$smarty.section.customer.total} customers shown above.
-
+```smarty
+{section name=customer loop=$custid step=2}
+ {$smarty.section.customer.index} id: {$custid[customer]}
+{/section}
+ There are {$smarty.section.customer.total} customers shown above.
+```
-
-See also [`{foreach}`](#language.function.foreach),
-[`{for}`](#language.function.for), [`{while}`](#language.function.while)
-and [`$smarty.section`](#language.variables.smarty.loops).
+See also [`{foreach}`](./language-function-foreach.md),
+[`{for}`](./language-function-for.md), [`{while}`](./language-function-while.md)
+and [`$smarty.section`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops).
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-setfilter.md b/include/smarty/docs/designers/language-builtin-functions/language-function-setfilter.md
index 381c191a2..eb11cbf1e 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-setfilter.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-setfilter.md
@@ -1,29 +1,35 @@
-{setfilter} {#language.function.setfilter}
-===========
+# {setfilter}
The `{setfilter}...{/setfilter}` block tag allows the definition of
-template instance\'s variable filters.
+template instance's variable filters.
-SYNTAX: {setfilter filter1\|filter2\|filter3\....}\...{/setfilter}
+SYNTAX: `{setfilter filter1\|filter2\|filter3\....}\...{/setfilter}`
The filter can be:
-- A variable filter plugin specified by it\'s name.
+- A variable filter plugin specified by it's name.
-- A modidier specified by it\'s name and optional additional
+- A modifier specified by it's name and optional additional
parameter.
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
of inner blocks does replace the definition of the outer block.
Template instance filters run in addition to other modifiers and
-filters. They run in the following order: modifier, default\_modifier,
-\$escape\_html, registered variable filters, autoloaded variable
-filters, template instance\'s variable filters. Everything after
-default\_modifier can be disabled with the `nofilter` flag.
+filters. They run in the following order: modifier, default_modifier,
+$escape_html, registered variable filters, autoloaded variable
+filters, template instance's variable filters. Everything after
+default_modifier can be disabled with the `nofilter` flag.
+> **Note**
+>
+> The setting of template instance filters does not affect the output of
+> included subtemplates.
-
+
+```
-
-
-> **Note**
->
-> The setting of template instance filters does not effect the output of
-> included subtemplates.
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-shortform-assign.md b/include/smarty/docs/designers/language-builtin-functions/language-function-shortform-assign.md
deleted file mode 100644
index d6a9e9798..000000000
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-shortform-assign.md
+++ /dev/null
@@ -1,84 +0,0 @@
-{\$var=\...} {#language.function.shortform.assign}
-============
-
-This is a short-hand version of the {assign} function. You can assign
-values directly to the template, or assign values to array elements too.
-
-> **Note**
->
-> Assignment of variables in-template is essentially placing application
-> logic into the presentation that may be better handled in PHP. Use at
-> your own discretion.
-
-The following attributes can be added to the tag:
-
-**Attributes:**
-
- Attribute Name Shorthand Type Required Default Description
- ---------------- ----------- -------- ---------- --------- -----------------------------------------------------------------------
- scope n/a string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
-
-**Option Flags:**
-
- Name Description
- --------- -----------------------------------------------------
- nocache Assigns the variable with the \'nocache\' attribute
-
-
- {$name='Bob'}
-
- The value of $name is {$name}.
-
-
-
-The above example will output:
-
-
- The value of $name is Bob.
-
-
-
-
- {$running_total=$running_total+$some_array[row].some_value}
-
-
-
-
- {$user.name="Bob"}
-
-
-
-
- {$user.name.first="Bob"}
-
-
-
-
- {$users[]="Bob"}
-
-
-
-Variables assigned in the included template will be seen in the
-including template.
-
-
- {include file="sub_template.tpl"}
- ...
- {* display variable assigned in sub_template *}
- {$foo}
- ...
-
-
-
-The template above includes the example `sub_template.tpl` below
-
-
- ...
- {* foo will be known also in the including template *}
- {$foo="something" scope=parent}
- {* bar is assigned only local in the including template *}
- {$bar="value"}
- ...
-
-See also [`{assign}`](#language.function.assign) and
-[`{append}`](#language.function.append)
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-strip.md b/include/smarty/docs/designers/language-builtin-functions/language-function-strip.md
index d40646e5f..800de84bf 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-strip.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-strip.md
@@ -1,9 +1,8 @@
-{strip} {#language.function.strip}
-=======
+# {strip}
Many times web designers run into the issue where white space and
carriage returns affect the output of the rendered HTML (browser
-\"features\"), so you must run all your tags together in the template to
+"features"), so you must run all your tags together in the template to
get the desired results. This usually ends up in unreadable or
unmanageable templates.
@@ -15,34 +14,32 @@ worry about extra white space causing problems.
> **Note**
>
> `{strip}{/strip}` does not affect the contents of template variables,
-> see the [strip modifier](#language.modifier.strip) instead.
+> see the [strip modifier](../language-modifiers/language-modifier-strip.md) instead.
-
- {* the following will be all run into one line upon output *}
- {strip}
-
+```smarty
+{* the following will be all run into one line upon output *}
+{strip}
+
+```
Notice that in the above example, all the lines begin and end with HTML
tags. Be aware that all the lines are run together. If you have plain
text at the beginning or end of any line, they will be run together, and
may not be desired results.
-See also the [`strip`](#language.modifier.strip) modifier.
+See also the [`strip`](../language-modifiers/language-modifier-strip.md) modifier.
diff --git a/include/smarty/docs/designers/language-builtin-functions/language-function-while.md b/include/smarty/docs/designers/language-builtin-functions/language-function-while.md
index 755c091f6..13eaef9b4 100644
--- a/include/smarty/docs/designers/language-builtin-functions/language-function-while.md
+++ b/include/smarty/docs/designers/language-builtin-functions/language-function-while.md
@@ -1,43 +1,43 @@
-{while} {#language.function.while}
-=======
+# {while}
`{while}` loops in Smarty have much the same flexibility as PHP
-[while](&url.php-manual;while) statements, with a few added features for
+[while](https://www.php.net/while) statements, with a few added features for
the template engine. Every `{while}` must be paired with a matching
`{/while}`. All PHP conditionals and functions are recognized, such as
-*\|\|*, *or*, *&&*, *and*, *is\_array()*, etc.
+*\|\|*, *or*, *&&*, *and*, *is_array()*, etc.
The following is a list of recognized qualifiers, which must be
separated from surrounding elements by spaces. Note that items listed in
\[brackets\] are optional. PHP equivalents are shown where applicable.
- Qualifier Alternates Syntax Example Meaning PHP Equivalent
- -------------------- ------------ ------------------------ -------------------------------- ----------------------
- == eq \$a eq \$b equals ==
- != ne, neq \$a neq \$b not equals !=
- \> gt \$a gt \$b greater than \>
- \< lt \$a lt \$b less than \<
- \>= gte, ge \$a ge \$b greater than or equal \>=
- \<= lte, le \$a le \$b less than or equal \<=
- === \$a === 0 check for identity ===
- ! not not \$a negation (unary) !
- \% mod \$a mod \$b modulous \%
- is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
- is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
- is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
- is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
- is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
+## Qualifiers
+| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
+|--------------------|------------|----------------------|--------------------------------|--------------------|
+| == | eq | $a eq $b | equals | == |
+| != | ne, neq | $a neq $b | not equals | != |
+| > | gt | $a gt $b | greater than | > |
+| < | lt | $a lt $b | less than | < |
+| >= | gte, ge | $a ge $b | greater than or equal | >= |
+| <= | lte, le | $a le $b | less than or equal | <= |
+| === | | $a === 0 | check for identity | === |
+| ! | not | not $a | negation (unary) | ! |
+| % | mod | $a mod $b | modulo | % |
+| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
+| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
+| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
+| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
+| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
+## Examples
+```smarty
+{while $foo > 0}
+ {$foo--}
+{/while}
+```
- {while $foo > 0}
- {$foo--}
- {/while}
+The above example will count down the value of $foo until 1 is reached.
-
-
-The above example will count down the value of \$foo until 1 is reached.
-
-See also [`{foreach}`](#language.function.foreach),
-[`{for}`](#language.function.for) and
-[`{section}`](#language.function.section).
+See also [`{foreach}`](./language-function-foreach.md),
+[`{for}`](./language-function-for.md) and
+[`{section}`](./language-function-section.md).
diff --git a/include/smarty/docs/designers/language-combining-modifiers.md b/include/smarty/docs/designers/language-combining-modifiers.md
index edf1a83ea..97903c535 100644
--- a/include/smarty/docs/designers/language-combining-modifiers.md
+++ b/include/smarty/docs/designers/language-combining-modifiers.md
@@ -1,35 +1,32 @@
-Combining Modifiers {#language.combining.modifiers}
-===================
+# Combining Modifiers
You can apply any number of modifiers to a variable. They will be
applied in the order they are combined, from left to right. They must be
separated with a `|` (pipe) character.
+```php
+assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
-
- ?>
+$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
+```
where template is:
-
- {$articleTitle}
- {$articleTitle|upper|spacify}
- {$articleTitle|lower|spacify|truncate}
- {$articleTitle|lower|truncate:30|spacify}
- {$articleTitle|lower|spacify|truncate:30:". . ."}
-
+```smarty
+{$articleTitle}
+{$articleTitle|upper|spacify}
+{$articleTitle|lower|spacify|truncate}
+{$articleTitle|lower|truncate:30|spacify}
+{$articleTitle|lower|spacify|truncate:30:". . ."}
+```
The above example will output:
-
- Smokers are Productive, but Death Cuts Efficiency.
- S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
- s m o k e r s a r ....snip.... b u t d e a t h c u t s...
- s m o k e r s a r e p r o d u c t i v e , b u t . . .
- s m o k e r s a r e p. . .
-
-
+```
+Smokers are Productive, but Death Cuts Efficiency.
+S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
+s m o k e r s a r ....snip.... b u t d e a t h c u t s...
+s m o k e r s a r e p r o d u c t i v e , b u t . . .
+s m o k e r s a r e p. . .
+```
diff --git a/include/smarty/docs/designers/language-custom-functions.md b/include/smarty/docs/designers/language-custom-functions.md
deleted file mode 100644
index 20ad54e99..000000000
--- a/include/smarty/docs/designers/language-custom-functions.md
+++ /dev/null
@@ -1,21 +0,0 @@
-Custom Functions {#language.custom.functions}
-================
-
-Smarty comes with several custom plugin functions that you can use in
-the templates.
-
-## Table of contents
-- [{counter}](./language-custom-functions/language-function-counter.md)
-- [{cycle}](./language-custom-functions/language-function-cycle.md)
-- [{eval}](./language-custom-functions/language-function-eval.md)
-- [{fetch}](./language-custom-functions/language-function-fetch.md)
-- [{html_checkboxes}](./language-custom-functions/language-function-html-checkboxes.md)
-- [{html_image}](./language-custom-functions/language-function-html-image.md)
-- [{html_options}](./language-custom-functions/language-function-html-options.md)
-- [{html_radios}](./language-custom-functions/language-function-html-radios.md)
-- [{html_select_date}](./language-custom-functions/language-function-html-select-date.md)
-- [{html_select_time}](./language-custom-functions/language-function-html-select-time.md)
-- [{html_table}](./language-custom-functions/language-function-html-table.md)
-- [{mailto}](./language-custom-functions/language-function-mailto.md)
-- [{math}](./language-custom-functions/language-function-math.md)
-- [{textformat}](./language-custom-functions/language-function-textformat.md)
diff --git a/include/smarty/docs/designers/language-custom-functions/index.md b/include/smarty/docs/designers/language-custom-functions/index.md
new file mode 100644
index 000000000..81979654c
--- /dev/null
+++ b/include/smarty/docs/designers/language-custom-functions/index.md
@@ -0,0 +1,19 @@
+# Custom Functions
+
+Smarty comes with several custom plugin functions that you can use in
+the templates.
+
+- [{counter}](language-function-counter.md)
+- [{cycle}](language-function-cycle.md)
+- [{eval}](language-function-eval.md)
+- [{fetch}](language-function-fetch.md)
+- [{html_checkboxes}](language-function-html-checkboxes.md)
+- [{html_image}](language-function-html-image.md)
+- [{html_options}](language-function-html-options.md)
+- [{html_radios}](language-function-html-radios.md)
+- [{html_select_date}](language-function-html-select-date.md)
+- [{html_select_time}](language-function-html-select-time.md)
+- [{html_table}](language-function-html-table.md)
+- [{mailto}](language-function-mailto.md)
+- [{math}](language-function-math.md)
+- [{textformat}](language-function-textformat.md)
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-counter.md b/include/smarty/docs/designers/language-custom-functions/language-function-counter.md
index cc1ac08f2..de04c2fee 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-counter.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-counter.md
@@ -1,41 +1,45 @@
-{counter} {#language.function.counter}
-=========
+# {counter}
`{counter}` is used to print out a count. `{counter}` will remember the
count on each iteration. You can adjust the number, the interval and the
-direction of the count, as well as determine whether or not to print the
+direction of the count, as well as determine whether to print the
value. You can run multiple counters concurrently by supplying a unique
name for each one. If you do not supply a name, the name "default" will
be used.
+## Attributes
+
+| Attribute Name | Required | Description |
+|----------------|----------|-----------------------------------------------------------|
+| name | No | The name of the counter |
+| start | No | The initial number to start counting from (defaults to 1) |
+| skip | No | The interval to count by (defaults to 1) |
+| direction | No | The direction to count (up/down) (defaults to 'up') |
+| print | No | Whether or not to print the value (defaults to true) |
+| assign | No | the template variable the output will be assigned to |
+
If you supply the `assign` attribute, the output of the `{counter}`
function will be assigned to this template variable instead of being
output to the template.
- Attribute Name Type Required Default Description
- ---------------- --------- ---------- ----------- ------------------------------------------------------
- name string No *default* The name of the counter
- start number No *1* The initial number to start counting from
- skip number No *1* The interval to count by
- direction string No *up* The direction to count (up/down)
- print boolean No *TRUE* Whether or not to print the value
- assign string No *n/a* the template variable the output will be assigned to
+## Examples
+```smarty
- {* initialize the count *}
- {counter start=0 skip=2}
- {counter}
- {counter}
- {counter}
+{* initialize the count *}
+{counter start=0 skip=2}
+{counter}
+{counter}
+{counter}
-
+```
this will output:
-
- 0
- 2
- 4
- 6
-
+```html
+0
+2
+4
+6
+```
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-cycle.md b/include/smarty/docs/designers/language-custom-functions/language-function-cycle.md
index 5986e6322..661e490dc 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-cycle.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-cycle.md
@@ -1,22 +1,23 @@
-{cycle} {#language.function.cycle}
-=======
+# {cycle}
`{cycle}` is used to alternate a set of values. This makes it easy to
for example, alternate between two or more colors in a table, or cycle
through an array of values.
- Attribute Name Type Required Default Description
- ---------------- --------- ---------- ----------- -------------------------------------------------------------------------------------------------------------
- name string No *default* The name of the cycle
- values mixed Yes *N/A* The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values
- print boolean No *TRUE* Whether to print the value or not
- advance boolean No *TRUE* Whether or not to advance to the next value
- delimiter string No *,* The delimiter to use in the values attribute
- assign string No *n/a* The template variable the output will be assigned to
- reset boolean No *FALSE* The cycle will be set to the first value and not advanced
+## Attributes
+
+| Attribute Name | Required | Description |
+|----------------|----------|-------------------------------------------------------------------------------------------------------------|
+| name | No | The name of the cycle |
+| values | Yes | The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values |
+| print | No | Whether to print the value or not (defaults to true) |
+| advance | No | Whether or not to advance to the next value (defaults to true) |
+| delimiter | No | The delimiter to use in the values attribute (defaults to ',') |
+| assign | No | The template variable the output will be assigned to |
+| reset | No | The cycle will be set to the first value and not advanced (defaults to false) |
- You can `{cycle}` through more than one set of values in a template
- by supplying a `name` attribute. Give each `{cycle}` an unique
+ by supplying a `name` attribute. Give each `{cycle}` a unique
`name`.
- You can force the current value not to print with the `print`
@@ -30,20 +31,18 @@ through an array of values.
function will be assigned to a template variable instead of being
output to the template.
-
-
-
- {section name=rows loop=$data}
+## Examples
+```smarty
+{section name=rows loop=$data}
{$data[rows]}
- {/section}
-
-
+{/section}
+```
The above template would output:
-
+```html
1
@@ -53,5 +52,4 @@ The above template would output:
3
-
-
+```
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-debug.md b/include/smarty/docs/designers/language-custom-functions/language-function-debug.md
index 79b3477c1..788614537 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-debug.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-debug.md
@@ -1,15 +1,14 @@
-{debug} {#language.function.debug}
-=======
+# {debug}
`{debug}` dumps the debug console to the page. This works regardless of
-the [debug](#chapter.debugging.console) settings in the php script.
+the [debug](../chapter-debugging-console.md) settings in the php script.
Since this gets executed at runtime, this is only able to show the
-[assigned](#api.assign) variables; not the templates that are in use.
+[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
However, you can see all the currently available variables within the
scope of a template.
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- -------------- ---------------------------------
- output string No *javascript* output type, html or javascript
+| Attribute Name | Required | Description |
+|----------------|----------|------------------------------------------------------------|
+| output | No | output type, html or javascript (defaults to 'javascript') |
-See also the [debugging console page](#chapter.debugging.console).
+See also the [debugging console page](../chapter-debugging-console.md).
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-eval.md b/include/smarty/docs/designers/language-custom-functions/language-function-eval.md
index e11f57e3e..70c7a3d19 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-eval.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-eval.md
@@ -1,19 +1,20 @@
-{eval} {#language.function.eval}
-======
+# {eval}
`{eval}` is used to evaluate a variable as a template. This can be used
for things like embedding template tags/variables into variables or
tags/variables into config file variables.
+## Attributes
+
+| Attribute Name | Required | Description |
+|----------------|----------|------------------------------------------------------|
+| var | Yes | Variable (or string) to evaluate |
+| assign | No | The template variable the output will be assigned to |
+
If you supply the `assign` attribute, the output of the `{eval}`
function will be assigned to this template variable instead of being
output to the template.
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ------------------------------------------------------
- var mixed Yes *n/a* Variable (or string) to evaluate
- assign string No *n/a* The template variable the output will be assigned to
-
> **Note**
>
> - Evaluated variables are treated the same as templates. They follow
@@ -21,64 +22,60 @@ output to the template.
> templates.
>
> - Evaluated variables are compiled on every invocation, the compiled
-> versions are not saved! However if you have [caching](#caching)
+> versions are not saved! However, if you have [caching](../../programmers/caching.md)
> enabled, the output will be cached with the rest of the template.
>
-> - If the content to evaluate doesn\'t change often, or is used
+> - If the content to evaluate doesn't change often, or is used
> repeatedly, consider using
> `{include file="string:{$template_code}"}` instead. This may cache
-> the compiled state and thus doesn\'t have to run the (comparably
+> the compiled state and thus doesn't have to run the (comparably
> slow) compiler on every invocation.
->
+
+## Examples
+
The contents of the config file, `setup.conf`.
-
- emphstart =
- emphend =
- title = Welcome to {$company}'s home page!
- ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
- ErrorState = You must supply a {#emphstart#}state{#emphend#}.
-
-
+```ini
+emphstart =
+emphend =
+title = Welcome to {$company}'s home page!
+ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
+ErrorState = You must supply a {#emphstart#}state{#emphend#}.
+```
Where the template is:
+```smarty
+{config_load file='setup.conf'}
- {config_load file='setup.conf'}
-
- {eval var=$foo}
- {eval var=#title#}
- {eval var=#ErrorCity#}
- {eval var=#ErrorState# assign='state_error'}
- {$state_error}
-
+{eval var=$foo}
+{eval var=#title#}
+{eval var=#ErrorCity#}
+{eval var=#ErrorState# assign='state_error'}
+{$state_error}
+```
-
The above template will output:
-
- This is the contents of foo.
- Welcome to Foobar Pub & Grill's home page!
- You must supply a city.
- You must supply a state.
-
-
+```html
+This is the contents of foo.
+Welcome to Foobar Pub & Grill's home page!
+You must supply a city.
+You must supply a state.
+```
This outputs the server name (in uppercase) and IP. The assigned
variable `$str` could be from a database query.
-
- assign('foo',$str);
- ?>
-
-
+```
Where the template is:
-
- {eval var=$foo}
-
-
+```smarty
+{eval var=$foo}
+```
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-fetch.md b/include/smarty/docs/designers/language-custom-functions/language-function-fetch.md
index 2277f5056..2ff494fdd 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-fetch.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-fetch.md
@@ -1,10 +1,15 @@
-{fetch} {#language.function.fetch}
-=======
+# {fetch}
`{fetch}` is used to retrieve files from the local file system, http, or
ftp and display the contents.
-- If the file name begins with `http://`, the web site page will be
+## Attributes
+| Attribute | Required | Description |
+|-----------|----------|------------------------------------------------------|
+| file | Yes | The file, http or ftp site to fetch |
+| assign | No | The template variable the output will be assigned to |
+
+- If the file name begins with `http://`, the website page will be
fetched and displayed.
> **Note**
@@ -20,40 +25,37 @@ ftp and display the contents.
> **Note**
>
- > If security is enabled and you are fetching a file from the local
+ > If security is enabled, and you are fetching a file from the local
> file system, `{fetch}` will only allow files from within the
- > `$secure_dir` path of the securty policy. See the
- > [Security](#advanced.features.security) section for details.
+ > `$secure_dir` path of the security policy. See the
+ > [Security](../../programmers/advanced-features/advanced-features-security.md) section for details.
- If the `assign` attribute is set, the output of the `{fetch}`
function will be assigned to this template variable instead of being
output to the template.
- Attribute Name Type Required Default Description
- ---------------- -------- ---------- --------- ------------------------------------------------------
- file string Yes *n/a* The file, http or ftp site to fetch
- assign string No *n/a* The template variable the output will be assigned to
+## Examples
+```smarty
+{* include some javascript in your template *}
+{fetch file='/export/httpd/www.example.com/docs/navbar.js'}
- {* include some javascript in your template *}
- {fetch file='/export/httpd/www.example.com/docs/navbar.js'}
+{* embed some weather text in your template from another web site *}
+{fetch file='http://www.myweather.com/68502/'}
- {* embed some weather text in your template from another web site *}
- {fetch file='http://www.myweather.com/68502/'}
-
- {* fetch a news headline file via ftp *}
- {fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
- {* as above but with variables *}
- {fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
-
- {* assign the fetched contents to a template variable *}
- {fetch file='http://www.myweather.com/68502/' assign='weather'}
- {if $weather ne ''}
-
{$weather}
- {/if}
+{* fetch a news headline file via ftp *}
+{fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
+{* as above but with variables *}
+{fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
+{* assign the fetched contents to a template variable *}
+{fetch file='http://www.myweather.com/68502/' assign='weather'}
+{if $weather ne ''}
+
{$weather}
+{/if}
+```
-See also [`{capture}`](#language.function.capture),
-[`{eval}`](#language.function.eval),
-[`{assign}`](#language.function.assign) and [`fetch()`](#api.fetch).
+See also [`{capture}`](../language-builtin-functions/language-function-capture.md),
+[`{eval}`](language-function-eval.md),
+[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`fetch()`](../../programmers/api-functions/api-fetch.md).
diff --git a/include/smarty/docs/designers/language-custom-functions/language-function-html-checkboxes.md b/include/smarty/docs/designers/language-custom-functions/language-function-html-checkboxes.md
index 23af713b7..3ab36096a 100644
--- a/include/smarty/docs/designers/language-custom-functions/language-function-html-checkboxes.md
+++ b/include/smarty/docs/designers/language-custom-functions/language-function-html-checkboxes.md
@@ -1,113 +1,102 @@
-{html\_checkboxes} {#language.function.html.checkboxes}
-==================
+# {html_checkboxes}
-`{html_checkboxes}` is a [custom function](#language.custom.functions)
+`{html_checkboxes}` is a [custom function](index.md)
that creates an html checkbox group with provided data. It takes care of
which item(s) are selected by default as well.
- Attribute Name Type Required Default Description
- ---------------- ------------------- ------------------------------------- ------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- name string No *checkbox* Name of checkbox list
- values array Yes, unless using options attribute *n/a* An array of values for checkbox buttons
- output array Yes, unless using options attribute *n/a* An array of output for checkbox buttons
- selected string/array No *empty* The selected checkbox element(s)
- options associative array Yes, unless using values and output *n/a* An associative array of values and output
- separator string No *empty* String of text to separate each checkbox item
- assign string No *empty* Assign checkbox tags to an array instead of output
- labels boolean No *TRUE* Add \