Migrate callout code
authorMatthias Schmidt <gravatronics@live.com>
Sun, 27 Dec 2020 15:57:14 +0000 (16:57 +0100)
committerMatthias Schmidt <gravatronics@live.com>
Sun, 27 Dec 2020 15:57:14 +0000 (16:57 +0100)
51 files changed:
docs/getting-started_quick-start.md
docs/javascript_general-usage.md
docs/javascript_helper-functions.md
docs/javascript_new-api_ajax.md
docs/javascript_new-api_browser.md
docs/javascript_new-api_data-structures.md
docs/javascript_new-api_dialogs.md
docs/javascript_new-api_ui.md
docs/migration_wcf-21_package.md
docs/migration_wcf-21_php.md
docs/migration_wsc-30_css.md
docs/migration_wsc-30_php.md
docs/migration_wsc-30_templates.md
docs/migration_wsc-53_php.md
docs/migration_wsc-53_session.md
docs/package_database-php-api.md
docs/package_package-xml.md
docs/package_pip.md
docs/package_pip_acp-template.md
docs/package_pip_bbcode.md
docs/package_pip_event-listener.md
docs/package_pip_file.md
docs/package_pip_media-provider.md
docs/package_pip_option.md
docs/package_pip_page.md
docs/package_pip_pip.md
docs/package_pip_script.md
docs/package_pip_sql.md
docs/package_pip_template-listener.md
docs/package_pip_template.md
docs/package_pip_user-notification-event.md
docs/php_api_cronjobs.md
docs/php_api_form_builder-form_fields.md
docs/php_api_form_builder-structure.md
docs/php_api_form_builder-validation_data.md
docs/php_api_form_builder.md
docs/php_api_sitemaps.md
docs/php_apps.md
docs/php_code-style.md
docs/php_code-style_documentation.md
docs/php_database-access.md
docs/php_database-objects.md
docs/php_exceptions.md
docs/php_pages.md
docs/tutorial_tutorial-series_part-1-base-structure.md
docs/tutorial_tutorial-series_part-2-event-listeners-and-template-listeners.md
docs/tutorial_tutorial-series_part-3-person-page-and-comments.md
docs/view_css.md
docs/view_languages.md
docs/view_template-plugins.md
docs/view_templates.md

index 32b8e9306fb043ab49150f020119bc047e965f9a..4397854fa8a4ea79ca5f94992701f56666c06787 100644 (file)
@@ -198,7 +198,7 @@ Congratulations, you have just created your first package!
 
 ## Developer Tools
 
-{% include callout.html content="This feature is available with WoltLab Suite 3.1 or newer only." type="warning" %}
+!!! warning "This feature is available with WoltLab Suite 3.1 or newer only."
 
 The developer tools provide an interface to synchronize the data of an installed package with a bare repository on the local disk. You can re-import most PIPs at any time and have the changes applied without crafting a manual update. This process simulates a regular package update with a single PIP only, and resets the cache after the import has been completed.
 
index 0a4b84bcdcf80c6bc311812ec879e5725bfc6c34..af32eb95d6d1707a10a7499926fc190ebd7356f7 100644 (file)
@@ -83,7 +83,7 @@ the minified and optimized file to the average visitor. You should use the
 
 ### The Accelerated Guest View ("Tiny Builds")
 
-{% include callout.html content="You can learn more on the [Accelerated Guest View](migration_wsc-30_javascript.md) in the migration docs." type="info" %}
+!!! info "You can learn more on the [Accelerated Guest View](migration_wsc-30_javascript.md) in the migration docs."
 
 The "Accelerated Guest View" was introduced in WoltLab Suite 3.1 and aims to
 decrease page size and to improve responsiveness by enabling a read-only mode
index 56a56206dfb0e0a40414627b1507899c7fef09bf..c02bf99f4a4f3e70200cd60eb19754fae225f6e4 100644 (file)
@@ -124,7 +124,7 @@ if (elAttrBool(element, "data-some-attribute")) {
 
 ## Selecting Elements
 
-{% include callout.html content="Unlike libraries like jQuery, these functions will return `null` if an element is not found. You are responsible to validate if the element exist and to branch accordingly, invoking methods on the return value without checking for `null` will yield an error." type="warning" %}
+!!! warning "Unlike libraries like jQuery, these functions will return `null` if an element is not found. You are responsible to validate if the element exist and to branch accordingly, invoking methods on the return value without checking for `null` will yield an error."
 
 ### `elById(id: string): Element | null`
 
@@ -138,7 +138,7 @@ var element = document.getElementById("my-awesome-element");
 
 ### `elBySel(selector: string, context?: Element): Element | null`
 
-{% include callout.html content="The underlying `querySelector()`-method works on the entire DOM hierarchy and can yield results outside of your context element! Please read and understand the MDN article on [`Element.querySelector()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector#The_entire_hierarchy_counts) to learn more about this." type="danger" %}
+!!! danger "The underlying `querySelector()`-method works on the entire DOM hierarchy and can yield results outside of your context element! Please read and understand the MDN article on [`Element.querySelector()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector#The_entire_hierarchy_counts) to learn more about this."
 
 Select a single element based on a CSS selector, optionally limiting the results
 to be a direct or indirect children of the context element.
@@ -156,7 +156,7 @@ var element = context.querySelector(".some-element");
 
 ### `elBySelAll(selector: string, context?: Element, callback: (element: Element) => void): NodeList`
 
-{% include callout.html content="The underlying `querySelector()`-method works on the entire DOM hierarchy and can yield results outside of your context element! Please read and understand the MDN article on [`Element.querySelector()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector#The_entire_hierarchy_counts) to learn more about this." type="danger" %}
+!!! danger "The underlying `querySelector()`-method works on the entire DOM hierarchy and can yield results outside of your context element! Please read and understand the MDN article on [`Element.querySelector()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector#The_entire_hierarchy_counts) to learn more about this."
 
 Finds and returns a `NodeList` containing all elements that match the provided
 CSS selector. Although `NodeList` is an array-like structure, it is not possible
index 67800fff2ebed4a3ef680ad88909ab8723f854bb..4ea44d41eb2bd479f99f58420827c919de304ae1 100644 (file)
@@ -105,7 +105,7 @@ Core API endpoint if left empty. If the Core API endpoint is used, the options
 
 #### `withCredentials`
 
-{% include callout.html content="Enabling this parameter for any domain other than the current will trigger a CORS preflight request." type="warning" %}
+!!! warning "Enabling this parameter for any domain other than the current will trigger a CORS preflight request."
 
 _Defaults to `false`._
 
@@ -146,7 +146,7 @@ other non-"silent" requests will still trigger the loading indicator.
 
 #### `includeRequestedWith`
 
-{% include callout.html content="Enabling this parameter for any domain other than the current will trigger a CORS preflight request." type="warning" %}
+!!! warning "Enabling this parameter for any domain other than the current will trigger a CORS preflight request."
 
 _Defaults to `true`._
 
index 10aa598ad30d9dce47f7f8737e0b01d8dc9e6c1f..8785a8782acc549112e396dbd86ccf913f628704 100644 (file)
@@ -56,7 +56,7 @@ the page scrolling.
 
 ## `Environment`
 
-{% include callout.html content="The `Environment` module uses a mixture of feature detection and user agent sniffing to determine the browser and platform. In general, its results have proven to be very accurate, but it should be taken with a grain of salt regardless. Especially the browser checks are designed to be your last resort, please use feature detection instead whenever it is possible!" type="warning" %}
+!!! warning "The `Environment` module uses a mixture of feature detection and user agent sniffing to determine the browser and platform. In general, its results have proven to be very accurate, but it should be taken with a grain of salt regardless. Especially the browser checks are designed to be your last resort, please use feature detection instead whenever it is possible!"
 
 Sometimes it may be necessary to alter the behavior of your code depending on
 the browser platform (e. g. mobile devices) or based on a specific browser in
index d84ab221c87c84ceb3b3fbda7c2d946ff1716642..384cdafe8c579e16e70aea435bd46958000f855f 100644 (file)
@@ -76,7 +76,7 @@ This read-only property counts the number of items in the list.
 
 ## `ObjectMap`
 
-{% include callout.html content="This class uses a `WeakMap` internally, the keys are only weakly referenced and do not prevent garbage collection." type="info" %}
+!!! info "This class uses a `WeakMap` internally, the keys are only weakly referenced and do not prevent garbage collection."
 
 Represents a collection where any kind of objects, such as class instances or
 DOM elements, can be used as key. These keys are weakly referenced and will not
index e50e89ba0e5577ded66649d2e3c4e4ae31d9b89f..7f07457fbaabf08a9bb77ea1b58778782d494cc4 100644 (file)
@@ -162,7 +162,7 @@ will always be invoked, but it cannot abort the close operation.
 
 ## `getDialog(id: string | Object): Object`
 
-{% include callout.html content="This method returns an internal data object by reference, any modifications made do have an effect on the dialogs behavior and in particular no validation is performed on the modification. It is strongly recommended to use the `.set*()` methods only." type="warning" %}
+!!! warning "This method returns an internal data object by reference, any modifications made do have an effect on the dialogs behavior and in particular no validation is performed on the modification. It is strongly recommended to use the `.set*()` methods only."
 
 Returns the internal dialog data that is attached to a dialog. The most important
 key is `.content` which holds a reference to the dialog's inner content element.
index 9be6ef7768976b96140dbee716638cdbe92440cb..9ff2ab539c88f0dfa1358de6b2baaaf11bd83f64 100644 (file)
@@ -54,7 +54,7 @@ in a wrapper element with alternating dimensions.
 
 #### `horizontal: string`
 
-{% include callout.html content="This value is automatically flipped for RTL (right-to-left) languages, `left` is changed into `right` and vice versa." type="info" %}
+!!! info "This value is automatically flipped for RTL (right-to-left) languages, `left` is changed into `right` and vice versa."
 
 _Defaults to `"left"`._
 
@@ -79,7 +79,7 @@ in both directions, the value of `vertical` is used.
 
 #### `allowFlip: string`
 
-{% include callout.html content="The value for `horizontal` is automatically flipped for RTL (right-to-left) languages, `left` is changed into `right` and vice versa. This setting only controls the behavior when violating space constraints, therefore the aforementioned transformation is always applied." type="info" %}
+!!! info "The value for `horizontal` is automatically flipped for RTL (right-to-left) languages, `left` is changed into `right` and vice versa. This setting only controls the behavior when violating space constraints, therefore the aforementioned transformation is always applied."
 
 _Defaults to `"both"`._
 
index 73c8bd7262bd13029a78020c47af917d9d8dd0e9..4504c809195c618aaf864d5afec3c877d12ad5e7 100644 (file)
@@ -30,7 +30,7 @@ Every PIP can define a custom filename if the default value cannot be properly d
 
 ### Exceptions
 
-{% include callout.html content="These exceptions represent the built-in PIPs only, 3rd party plugins and apps may define their own exceptions." type="info" %}
+!!! info "These exceptions represent the built-in PIPs only, 3rd party plugins and apps may define their own exceptions."
 
 | PIP | Default Value |
 |-------|-------|
@@ -99,13 +99,13 @@ The [box](package_pip_box.md) PIP has been added.
 
 ## cronjob.xml
 
-{% include callout.html content="Legacy cronjobs are assigned a non-deterministic generic name, the only way to assign them a name is removing them and then adding them again." type="warning" %}
+!!! warning "Legacy cronjobs are assigned a non-deterministic generic name, the only way to assign them a name is removing them and then adding them again."
 
 Cronjobs can now be assigned a name using the name attribute as in `<cronjob name="com.woltlab.wcf.refreshPackageUpdates">`, it will be used to identify cronjobs during an update or delete.
 
 ## eventListener.xml
 
-{% include callout.html content="Legacy event listeners are assigned a non-deterministic generic name, the only way to assign them a name is removing them and then adding them again." type="warning" %}
+!!! warning "Legacy event listeners are assigned a non-deterministic generic name, the only way to assign them a name is removing them and then adding them again."
 
 Event listeners can now be assigned a name using the name attribute as in `<eventlistener name="sessionPageAccessLog">`, it will be used to identify event listeners during an update or delete.
 
index 4b4be41ad1d2d027a4555930770c5111326e1120..3e2c4dd6d26d0644b4bfdd08f3c85921f3ceb149 100644 (file)
@@ -75,7 +75,7 @@ $processor->process(…);
 
 #### Converting from BBCode
 
-{% include callout.html content="Enabling message conversion for HTML messages is undefined and yields unexpected results." type="warning" %}
+!!! warning "Enabling message conversion for HTML messages is undefined and yields unexpected results."
 
 Legacy message that still use raw bbcodes must be converted to be properly parsed by the html processors. This process is enabled by setting the fourth parameter of `process()` to `true`.
 
@@ -100,7 +100,7 @@ $processor->processEmbeddedContent($html, $messageObjectType, $messageObjectID);
 
 ## Breadcrumbs / Page Location
 
-{% include callout.html content="Breadcrumbs used to be added left to right, but parent locations are added from the bottom to the top, starting with the first ancestor and going upwards. In most cases you simply need to reverse the order." type="warning" %}
+!!! warning "Breadcrumbs used to be added left to right, but parent locations are added from the bottom to the top, starting with the first ancestor and going upwards. In most cases you simply need to reverse the order."
 
 Breadcrumbs used to be a lose collection of arbitrary links, but are now represented by actual page objects and the control has shifted over to the `PageLocationManager`.
 
index 07e5275304e99b43d574178bf701d8d400b8a08d..3b65786a655d2268d274f5a8eb4358fde5d6598c 100644 (file)
@@ -2,7 +2,7 @@
 
 ## New Style Variables
 
-{% include callout.html content="The new style variables are only applied to styles that have the compatibility set to WSC 3.1" type="info" %}
+!!! info "The new style variables are only applied to styles that have the compatibility set to WSC 3.1"
 
 ### wcfContentContainer
 
index 2f8278c1aea8b906a657c84708c4e3a63bafc946..a580809040915dd844e1d19ace5b1fbd57f78eeb 100644 (file)
@@ -93,7 +93,7 @@ class ExampleBBCodeMediaProvider implements IBBCodeMediaProvider {
 
 ## Re-Evaluate HTML Messages
 
-{% include callout.html content="You need to manually set the disallowed bbcodes in order to avoid unintentional bbcode evaluation. Please see [this commit](https://github.com/WoltLab/WCF/commit/7e058783da1378dda5393a9bb4df9cfe94e5b394) for a reference implementation inside worker processes." type="warning" %}
+!!! warning "You need to manually set the disallowed bbcodes in order to avoid unintentional bbcode evaluation. Please see [this commit](https://github.com/WoltLab/WCF/commit/7e058783da1378dda5393a9bb4df9cfe94e5b394) for a reference implementation inside worker processes."
 
 The HtmlInputProcessor only supported two ways to handle an existing HTML message:
 
index 547a4e48b6112c219776c4d0e217d1ec07ee5adf..df56e0934d3b08314f37bdb2e83d67ac68798a52 100644 (file)
@@ -2,7 +2,7 @@
 
 ## Comment-System Overhaul
 
-{% include callout.html content="Unfortunately, there has been a breaking change related to the creation of comments. You need to apply the changes below before being able to create new comments." type="danger" %}
+!!! danger "Unfortunately, there has been a breaking change related to the creation of comments. You need to apply the changes below before being able to create new comments."
 
 ### Adding Comments
 
@@ -29,7 +29,7 @@ Custom interaction buttons were previously added through the template event `row
 
 ## Sidebar Toogle-Buttons on Mobile Device
 
-{% include callout.html content="You cannot override the button label for sidebars containing navigation menus." type="info" %}
+!!! info "You cannot override the button label for sidebars containing navigation menus."
 
 The page sidebars are automatically collapsed and presented as one or, when both sidebar are present, two condensed buttons. They use generic sidebar-related labels when open or closed, with the exception of embedded menus which will change the button label to read "Show/Hide Navigation".
 
index 537dca96bfff0e5366334d724f0cd7395a2ab9cc..9626c59e24ffbdc6d7e343b40ffdf6a053c26fb4 100644 (file)
@@ -39,13 +39,13 @@ Leveraging this API is easily done.
    $earliestTime = $data['earliestTime'];
    ```
    The method also returns `earliestTime` so that you can tell the user in the error message when they are able again to create new content of the relevant type.
-   {% include callout.html content="Flood control entries are only stored for 31 days and older entries are cleaned up daily." type="info" %}
+   !!! info "Flood control entries are only stored for 31 days and older entries are cleaned up daily."
 
 The previously mentioned methods of `FloodControl` use the active user and the current timestamp as reference point.
 `FloodControl` also provides methods to register content or check flood control for other registered users or for guests via their IP address.
 For further details on these methods, please refer to the [documentation in the FloodControl class](https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/flood/FloodControl.class.php).
 
-{% include callout.html content="Do not interact directly with the flood control database table but only via the `FloodControl` class!" type="warning" %}
+!!! warning "Do not interact directly with the flood control database table but only via the `FloodControl` class!"
 
 ## PHP Database API
 
@@ -59,7 +59,7 @@ PartialDatabaseTable::create('wcf1_test')
         ]);
 ```
 
-{% include callout.html content="Like with every change to existing database tables, packages can only rename columns that they installed." type="info" %} 
+!!! info "Like with every change to existing database tables, packages can only rename columns that they installed." 
 
 ## Captcha
 
index e10621e68eba88c7dd7c53d796f1ad48f710097a..911c1d66345af6e42cfe5c7e48d075bcccdd5f66 100644 (file)
@@ -54,7 +54,7 @@ Instead, it is maintained for compatibility with existing online lists.
 The actual session storage is considered an implementation detail and you *must not* directly interact with the session tables.
 Future versions might support alternative session backends, such as Redis.
 
-{% include callout.html content="Do not interact directly with the session database tables but only via the `SessionHandler` class!" type="warning" %}
+!!! warning "Do not interact directly with the session database tables but only via the `SessionHandler` class!"
 
 ### Reauthentication
 
@@ -126,10 +126,7 @@ The given classname must implement the [`IMultifactorMethod`](https://github.com
 As a self-contained example, you can find the initial implementation of the email multi-factor method in [WoltLab/WCF#3729](https://github.com/WoltLab/WCF/pull/3729).
 Please check [the version history](https://github.com/WoltLab/WCF/commits/master/wcfsetup/install/files/lib/system/user/multifactor/EmailMultifactorMethod.class.php) of the PHP class to make sure you do not miss important changes that were added later.
 
-{% include callout.html content="Multi-factor authentication is security sensitive.
-Make sure to carefully read the remarks in IMultifactorMethod for possible issues.
-Also make sure to carefully test your implementation against all sorts of incorrect input and consider attack vectors such as race conditions.
-It is strongly recommended to generously check the current state by leveraging assertions and exceptions." type="warning" %}
+!!! warning "Multi-factor authentication is security sensitive. Make sure to carefully read the remarks in `IMultifactorMethod` for possible issues. Also make sure to carefully test your implementation against all sorts of incorrect input and consider attack vectors such as race conditions. It is strongly recommended to generously check the current state by leveraging assertions and exceptions."
 
 ## Deprecations and Removals
 
index 4c1da9f582598ae08bfa17442e8da1dc8e5466c4..dae66354bb5e95108ae45c94487a9d24dbbe9773 100644 (file)
@@ -1,6 +1,6 @@
 # Database PHP API
 
-{% include callout.html content="Available since WoltLab Suite 5.2." type="info" %}
+!!! info "Available since WoltLab Suite 5.2."
 
 While the [sql](package_pip_sql.md) package installation plugin supports adding and removing tables, columns, and indices, it is not able to handle cases where the added table, column, or index already exist.
 We have added a new PHP-based API to manipulate the database scheme which can be used in combination with the [script](package_pip_script.md) package installation plugin that skips parts that already exist:
index b94d1fec33ce5a351a3bcab11a0a31c098adfc3b..1982142008a39ae5f9e6c1ce2bb1ff85a85d3cb2 100644 (file)
@@ -154,8 +154,8 @@ Example:
 The attribute `version` must be a valid version number as described in the [\<version\>](#version) section. In the example above it will be impossible to install this package in WoltLab Suite Core 3.1.0 Alpha 1 or higher.
 
 ### `<compatibility>`
-{% include callout.html content="Available since WoltLab Suite 3.1" type="info" %}
-{% include callout.html content="With the release of WoltLab Suite 5.2 the API versions were abolished. Instead of using API versions packages should exclude version `6.0.0 Alpha 1` of `com.woltlab.wcf` going forward." type="warning" %}
+!!! info "Available since WoltLab Suite 3.1"
+!!! warning "With the release of WoltLab Suite 5.2 the API versions were abolished. Instead of using API versions packages should exclude version `6.0.0 Alpha 1` of `com.woltlab.wcf` going forward."
 
 WoltLab Suite 3.1 introduced a new versioning system that focused around the API compatibility and is intended to replace the `<excludedpackage>` instruction for the Core for most plugins.
 
@@ -187,7 +187,7 @@ List of instructions for a new installation of this package.
 
 The attribute `fromversion` must be a valid version number as described in the [\<version\>](#version) section and specifies a possible update from that very version to the package's version.
 
-{% include callout.html content="The installation process will pick exactly one update instruction, ignoring everything else. Please read the explanation below!" type="warning" %}
+!!! warning "The installation process will pick exactly one update instruction, ignoring everything else. Please read the explanation below!"
 
 Example:
 
@@ -224,7 +224,7 @@ Many PIPs provide default file names which are used if no value is given:
 
 There is a [list of all default PIPs](package_pip.md) available.
 
-{% include callout.html content="Both the `type`-attribute and the element value are case-sensitive. Windows does not care if the file is called `objecttypedefinition.xml` but was referenced as `objectTypeDefinition.xml`, but both Linux and Mac systems will be unable to find the file." type="warning" %}
+!!! warning "Both the `type`-attribute and the element value are case-sensitive. Windows does not care if the file is called `objecttypedefinition.xml` but was referenced as `objectTypeDefinition.xml`, but both Linux and Mac systems will be unable to find the file."
 
 In addition to the `type` attribute, an optional `run` attribute (with `standalone` as the only valid value) is supported which forces the installation to execute this PIP in an isolated request, allowing a single, resource-heavy PIP to execute without encountering restrictions such as PHP’s `memory_limit` or `max_execution_time`:
 
index 868db402f7a6711bc9cb29b3cddc27fc024fb2d4..d9b74af0824ec476d0c4ea0702d4877aff8900c1 100644 (file)
@@ -2,7 +2,7 @@
 
 Package Installation Plugins (PIPs) are interfaces to deploy and edit content as well as components.
 
-{% include callout.html content="For XML-based PIPs: `<![CDATA[]]>` must be used for language items and page contents. In all other cases it may only be used when necessary." type="info" %}
+!!! info "For XML-based PIPs: `<![CDATA[]]>` must be used for language items and page contents. In all other cases it may only be used when necessary."
 
 ## Built-In PIPs
 
index 7e6b23ada3e25691043b395cd8af9d834ca4ee66..f96c24b1fe289c7f56364c96e94e16d94b5f9ded 100644 (file)
@@ -8,7 +8,7 @@ parent: package_pip
 
 Add templates for acp pages and forms by providing an archive containing the template files.
 
-{% include callout.html content="You cannot overwrite acp templates provided by other packages." type="warning" %}
+!!! warning "You cannot overwrite acp templates provided by other packages."
 
 
 ## Archive
index d1ef878bbc41c9d8ea3d75e06633b3061b98d3ab..07e97e22e4c2f42a433a1390b2d330b0519e00aa 100644 (file)
@@ -15,13 +15,13 @@ The `name` attribute must contain alphanumeric characters only and is exposed to
 
 ### `<htmlopen>`
 
-{% include callout.html content="Optional: Must not be provided if the BBCode is being processed a PHP class (`<classname>`)." type="info" %}
+!!! info "Optional: Must not be provided if the BBCode is being processed a PHP class (`<classname>`)."
 
 The contents of this tag are literally copied into the opening tag of the bbcode.
 
 ### `<htmlclose>`
 
-{% include callout.html content="Optional: Must not be provided if `<htmlopen>` is not given." type="info" %}
+!!! info "Optional: Must not be provided if `<htmlopen>` is not given."
 
 Must match the `<htmlopen>` tag.
 Do not provide for self-closing tags.
@@ -43,7 +43,7 @@ Name of the Font Awesome icon class or path to a `gif`, `jpg`, `jpeg`, `png`, or
 
 ### `<buttonlabel>`
 
-{% include callout.html content="Optional: Must be provided if an icon is given." type="info" %}
+!!! info "Optional: Must be provided if an icon is given."
 
 Explanatory text to show when hovering the icon.
 
@@ -65,7 +65,7 @@ The `name` attribute is a 0-indexed integer.
 
 #### `<html>`
 
-{% include callout.html content="Optional: Must not be provided if the BBCode is being processed a PHP class (`<classname>`)." type="info" %}
+!!! info "Optional: Must not be provided if the BBCode is being processed a PHP class (`<classname>`)."
 
 The contents of this tag are copied into the opening tag of the bbcode.
 `%s` is replaced by the attribute value.
@@ -85,7 +85,7 @@ Specifies whether this attribute must be provided.
 #### `<usetext>`
 
 <span class="label label-info">Optional</span>
-{% include callout.html content="Should only be set to `1` for the attribute with name `0`." type="info" %}
+!!! info "Should only be set to `1` for the attribute with name `0`."
 
 Specifies whether the text content of the BBCode should become this attribute's value.
 
index 60dda6448eb3bcc933dd96e314ad76508b7a1355..c2e37096cf4264ac00662b063f766923a4f5be95 100644 (file)
@@ -29,7 +29,7 @@ You can either give a single event name or a comma-separated list of event names
 The listener class name is the name of the class which is triggered if the relevant event is fired.
 The PHP class has to implement the `wcf\system\event\listener\IParameterizedEventListener` interface.
 
-{% include callout.html content="Legacy event listeners are only required to implement the deprecated `wcf\system\event\IEventListener` interface. When writing new code or update existing code, you should always implement the `wcf\system\event\listener\IParameterizedEventListener` interface!" type="warning" %}
+!!! warning "Legacy event listeners are only required to implement the deprecated `wcf\system\event\IEventListener` interface. When writing new code or update existing code, you should always implement the `wcf\system\event\listener\IParameterizedEventListener` interface!"
 
 ### `<inherit>`
 
@@ -48,7 +48,7 @@ The nice value determines the execution order of event listeners.
 Event listeners with smaller nice values are executed first.
 If the nice value of two event listeners is equal, they are sorted by the listener class name.
 
-{% include callout.html content="If you pass a value out of the mentioned interval, the value will be adjusted to the closest value in the interval." type="info" %}
+!!! info "If you pass a value out of the mentioned interval, the value will be adjusted to the closest value in the interval."
 
 ### `<options>`
 
index e64d42ac97530a8ba0362eaa9c461ebe810b6ca0..e15f36095183ae0343753ac2b50fd1fe87da79fa 100644 (file)
@@ -8,7 +8,7 @@ parent: package_pip
 
 Adds any type of files with the exception of templates.
 
-{% include callout.html content="You cannot overwrite files provided by other packages." type="warning" %}
+!!! warning "You cannot overwrite files provided by other packages."
 
 The `application` attribute behaves like it does for [acp templates](package_pip_acp-template.md#application).
 
index fa30879948a47cef3452bccfebf0fc86e34a3dcd..107ffdbf2a25c09308479524631047adea8503d2 100644 (file)
@@ -6,7 +6,7 @@ folder: package/pip
 parent: package_pip
 ---
 
-{% include callout.html content="Available since WoltLab Suite 3.1" type="info" %}
+!!! info "Available since WoltLab Suite 3.1"
 
 Media providers are responsible to detect and convert links to a 3rd party service inside messages.
 
@@ -24,7 +24,7 @@ The regular expression used to identify links to this provider, it must not cont
 
 ### `<className>`
 
-{% include callout.html content="`<className>` and `<html>` are mutually exclusive." type="warning" %}
+!!! warning "`<className>` and `<html>` are mutually exclusive."
 
 PHP-Callback-Class that is invoked to process the matched link in case that additional logic must be applied that cannot be handled through a simple replacement as defined by the `<html>` element.
 
@@ -32,7 +32,7 @@ The callback-class must implement the interface `\wcf\system\bbcode\media\provid
 
 ### `<html>`
 
-{% include callout.html content="`<className>` and `<html>` are mutually exclusive." type="warning" %}
+!!! warning "`<className>` and `<html>` are mutually exclusive."
 
 Replacement HTML that gets populated using the captured matches in `<regex>`, variables are accessed as `{$VariableName}`. For example, the capture group `(?P<ID>...)` is accessed using `{$ID}`.
 
index d6346e49b77845afbebf268eb8619b36e55cf1d2..942505f7149b3fdb4e66a37fddbba14d1cda2843 100644 (file)
@@ -66,7 +66,7 @@ Specifies the order of this option within the category.
 ### `<selectoptions>`
 
 <span class="label label-info">Optional</span>
-{% include callout.html content="Defined only for `select`, `multiSelect` and `radioButton` types." type="warning" %}
+!!! warning "Defined only for `select`, `multiSelect` and `radioButton` types."
 
 Specifies a newline-separated list of selectable values.
 Each line consists of an internal handle, followed by a colon (`:`, U+003A), followed by a language item.
@@ -75,7 +75,7 @@ The language item is shown to the administrator, the internal handle is what is
 ### `<enableoptions>`
 
 <span class="label label-info">Optional</span>
-{% include callout.html content="Defined only for `boolean`, `select` and `radioButton` types." type="warning" %}
+!!! warning "Defined only for `boolean`, `select` and `radioButton` types."
 
 Specifies a comma-separated list of options which should be visually enabled when this option is enabled.
 A leading exclamation mark (`!`, U+0021) will disable the specified option when this option is enabled.
index dbb92ea20a664e4789bfa937f0727109628b2972..c2ae76e1fd67adc83c7a8a891e3ba680a645b54a 100644 (file)
@@ -46,13 +46,13 @@ Pages can be assigned any other page as parent page by default, set to `1` to ma
 
 ### `<permissions>`
 
-{% include callout.html content="The comma represents a logical `or`, the check is successful if at least one permission is set." type="warning" %}
+!!! warning "The comma represents a logical `or`, the check is successful if at least one permission is set."
 
 Comma separated list of permission names that will be checked one after another until at least one permission is set.
 
 ### `<options>`
 
-{% include callout.html content="The comma represents a logical `or`, the check is successful if at least one option is enabled." type="warning" %}
+!!! warning "The comma represents a logical `or`, the check is successful if at least one option is enabled."
 
 Comma separated list of options that will be checked one after another until at least one option is set.
 
index 10582a7e0bff640aeb75786aafd2a27ca2b8c0cc..4ec5b2408f2deed14e57119e2adda182c52bae5a 100644 (file)
@@ -12,7 +12,7 @@ Registers new package installation plugins.
 
 Each package installation plugin is described as an `<pip>` element with a `name` attribute and a PHP classname as the text content.
 
-{% include callout.html content="The package installation plugin’s class file must be installed into the `wcf` application and must not include classes outside the `\wcf\*` hierarchy to allow for proper uninstallation!" type="warning" %}
+!!! warning "The package installation plugin’s class file must be installed into the `wcf` application and must not include classes outside the `\wcf\*` hierarchy to allow for proper uninstallation!"
 
 ## Example
 
index 9e5e5fe49382004e997f7cfdeb1cae5da5aaebcc..5c1f30ef32aa2a70d993392ab3a0c0dbf2567e09 100644 (file)
@@ -8,9 +8,9 @@ parent: package_pip
 
 Execute arbitrary PHP code during installation, update and uninstallation of the package.
 
-{% include callout.html content="You must install the PHP script through the [file package installation plugin](package_pip_file.md)." type="warning" %}
+!!! warning "You must install the PHP script through the [file package installation plugin](package_pip_file.md)."
 
-{% include callout.html content="The installation will attempt to delete the script after successful execution." type="warning" %}
+!!! warning "The installation will attempt to delete the script after successful execution."
 
 ## Attributes
 
index a81c9344c0b63c813d59019cae56fea9debf9bfc..4af78ddd80bd912c0d389891c5aad5c3114c1be9 100644 (file)
@@ -8,7 +8,7 @@ parent: package_pip
 
 Execute SQL instructions using a MySQL-flavored syntax.
 
-{% include callout.html content="This file is parsed by WoltLab Suite Core to allow reverting of certain changes, but not every syntax MySQL supports is recognized by the parser. To avoid any troubles, you should always use statements relying on the SQL standard." type="warning" %}
+!!! warning "This file is parsed by WoltLab Suite Core to allow reverting of certain changes, but not every syntax MySQL supports is recognized by the parser. To avoid any troubles, you should always use statements relying on the SQL standard."
 
 
 ## Expected Value
index 3c7bc65813f454c5efed1bd31832db878fce2f07..5ad9e4954a544744e707d20e1d2aca37879cfd05 100644 (file)
@@ -30,7 +30,7 @@ The given template code is literally copied into the target template during comp
 The original template is not modified.
 If multiple template listeners listen to a single event their output is concatenated using the line feed character (`\n`, U+000A) in the order defined by the [`niceValue`](#niceValue).
 
-{% include callout.html content="It is recommend that the only code is an `{include}` of a template to enable changes by the administrator. Names of templates included by a template listener start with two underscores by convention." type="warning" %}
+!!! warning "It is recommend that the only code is an `{include}` of a template to enable changes by the administrator. Names of templates included by a template listener start with two underscores by convention."
 
 ### `<environment>`
 
@@ -46,7 +46,7 @@ The nice value determines the execution order of template listeners.
 Template listeners with smaller nice values are executed first.
 If the nice value of two template listeners is equal, the order is undefined.
 
-{% include callout.html content="If you pass a value out of the mentioned interval, the value will be adjusted to the closest value in the interval." type="info" %}
+!!! info "If you pass a value out of the mentioned interval, the value will be adjusted to the closest value in the interval."
 
 ### `<options>`
 
index 9d87f42d84ee9e106169ffac0a75a8852eb3747c..5e0469d5ebd04958efae16131286314bb468b163 100644 (file)
@@ -8,6 +8,6 @@ parent: package_pip
 
 Add templates for frontend pages and forms by providing an archive containing the template files.
 
-{% include callout.html content="You cannot overwrite templates provided by other packages." type="warning" %}
+!!! warning "You cannot overwrite templates provided by other packages."
 
 This package installation plugin behaves exactly like the [acpTemplate package installation plugin](package_pip_acp-template.md) except for installing frontend templates instead of backend/acp templates.
index 8dad5e2bae21bd529b693963d88b08a4939dd94f..4453006f789d3213477880e629e3d2ced71cad6e 100644 (file)
@@ -29,7 +29,7 @@ Defines whether this event is enabled by default.
 
 ### `<presetmailnotificationtype>`
 
-{% include callout.html content="Avoid using this option, as sending unsolicited mail can be seen as spamming." type="info" %}
+!!! info "Avoid using this option, as sending unsolicited mail can be seen as spamming."
 
 One of `instant` or `daily`.
 Defines whether this type of email notifications is enabled by default.
index b720f2d71562f2d38d6243b13e9db2b34b127dd8..9b1d147a52e284f5ab980ffd368689ac2afe4dba 100644 (file)
@@ -2,7 +2,7 @@
 
 Cronjobs offer an easy way to execute actions periodically, like cleaning up the database.
 
-{% include callout.html content="The execution of cronjobs is not guaranteed but requires someone to access the page with JavaScript enabled." type="warning" %}
+!!! warning "The execution of cronjobs is not guaranteed but requires someone to access the page with JavaScript enabled."
 
 This page focuses on the technical aspects of cronjobs, [the cronjob package installation plugin page](package_pip_cronjob.md) covers how you can actually register a cronjob.
 
index d2a26dd72f47b14f496c1e7dd18d2ef597301c67..e99d157ed6986631f97ed7216156752d531e118f 100644 (file)
@@ -149,7 +149,7 @@ The show order field provides a list of all siblings and the object will be posi
 To insert objects at the very beginning, the `options()` automatically method prepends an additional option for that case so that only the existing siblings need to be passed.
 The default id of instances of this class is `showOrder` and their default label is `wcf.form.field.showOrder`.
 
-{% include callout.html content="It is important that the relevant object property is always kept updated. Whenever a new object is added or an existing object is edited or delete, the values of the other objects have to be adjusted to ensure consecutive numbering." type="info" %}
+!!! info "It is important that the relevant object property is always kept updated. Whenever a new object is added or an existing object is edited or delete, the values of the other objects have to be adjusted to ensure consecutive numbering."
 
 
 ### `SingleSelectionFormField`
@@ -302,7 +302,7 @@ As usernames have a system-wide restriction of a minimum length of 3 and a maxim
 To integrate a wysiwyg editor into a form, you have to create a `WysiwygFormContainer` object.
 This container takes care of creating all necessary form nodes listed below for a wysiwyg editor.
 
-{% include callout.html content="When creating the container object, its id has to be the id of the form field that will manage the actual text." type="warning" %}
+!!! warning "When creating the container object, its id has to be the id of the form field that will manage the actual text."
 
 The following methods are specific to this form container class:
 
@@ -393,7 +393,7 @@ The following methods are specific to this form field class:
   `0` signals that no last edit time has been set.
 - `supportAttachments($supportAttachments)` and `supportsAttachments()` can be used to set and check if the form field supports attachments.
   
-  {% include callout.html content="It is not sufficient to simply signal attachment support via these methods for attachments to work. These methods are relevant internally to signal the Javascript code that the editor supports attachments. Actual attachment support is provided by `WysiwygAttachmentFormField`." type="warning" %}
+  !!! warning "It is not sufficient to simply signal attachment support via these methods for attachments to work. These methods are relevant internally to signal the Javascript code that the editor supports attachments. Actual attachment support is provided by `WysiwygAttachmentFormField`."
 - `supportMentions($supportMentions)` and `supportsMentions()` can be used to set and check if the form field supports mentions of other users.
 
 `WysiwygFormField` objects register a [custom form field data processor](php_api_form_builder-validation_data.md#customformfielddataprocessor) to add the relevant simple ACL data array into the `$parameters` array directly using the object property as the array key.
index 3b660549fd20d31cba374876531378fac73e5e95..859fe0f281c5ab069d20fa1f066c8fb9c6d0b33d 100644 (file)
@@ -14,7 +14,7 @@ Forms built with form builder consist of three major structural elements listed
 
 The basis for all three elements are form nodes.
 
-{% include callout.html content="The form builder API uses fluent interfaces heavily, meaning that unless a method is a getter, it generally returns the objects itself to support method chaining." type="info" %}
+!!! info "The form builder API uses fluent interfaces heavily, meaning that unless a method is a getter, it generally returns the objects itself to support method chaining."
 
 
 ## Form Nodes
@@ -119,7 +119,7 @@ The implementing class has to implement the methods `objectType($objectType)`, `
 
 `CustomFormNode` is a form node whose contents can be set directly via `content($content)`.
 
-{% include callout.html content="This class should generally not be relied on. Instead, `TemplateFormNode` should be used." type="warning" %}
+!!! warning "This class should generally not be relied on. Instead, `TemplateFormNode` should be used."
 
 
 ### `TemplateFormNode`
@@ -284,7 +284,7 @@ The implementing class has to implement the following methods:
 If multilingual input is enabled for a specific form field, classes using `TI18nFormField` register a [custom form field data processor](php_api_form_builder-validation_data.md#customformfielddataprocessor) to add the array with multilingual input into the `$parameters` array directly using `{$objectProperty}_i18n` as the array key.
 If multilingual input is enabled but only a monolingual value is entered, the custom form field data processor does nothing and the form field’s value is added by the `DefaultFormDataProcessor` into the `data` sub-array of the `$parameters` array.
 
-{% include callout.html content="`TI18nFormField` already provides a default implementation of `IFormField::validate()`." type="info" %}
+!!! info "`TI18nFormField` already provides a default implementation of `IFormField::validate()`."
 
 
 #### `IImmutableFormField` / `TImmutableFormField`
@@ -301,7 +301,7 @@ The implementing class has to implement the methods `maximum($maximum = null)` a
 A maximum of `null` signals that no maximum value has been set.
 `TMaximumFormField` provides a default implementation of these two methods.
 
-{% include callout.html content="The implementing class has to validate the entered value against the maximum value manually." type="warning" %}
+!!! warning "The implementing class has to validate the entered value against the maximum value manually."
 
 
 #### `IMaximumLengthFormField` / `TMaximumLengthFormField`
@@ -311,7 +311,7 @@ The implementing class has to implement the methods `maximumLength($maximumLengt
 A maximum length of `null` signals that no maximum length has been set.
 `TMaximumLengthFormField` provides a default implementation of these two methods.
 
-{% include callout.html content="The implementing class has to validate the entered value against the maximum value manually by calling `validateMaximumLength()`." type="warning" %}
+!!! warning "The implementing class has to validate the entered value against the maximum value manually by calling `validateMaximumLength()`."
 
 
 #### `IMinimumFormField` / `TMinimumFormField`
@@ -321,7 +321,7 @@ The implementing class has to implement the methods `minimum($minimum = null)` a
 A minimum of `null` signals that no minimum value has been set.
 `TMinimumFormField` provides a default implementation of these three methods.
 
-{% include callout.html content="The implementing class has to validate the entered value against the minimum value manually." type="warning" %}
+!!! warning "The implementing class has to validate the entered value against the minimum value manually."
 
 
 #### `IMinimumLengthFormField` / `TMinimumLengthFormField`
@@ -331,7 +331,7 @@ The implementing class has to implement the methods `minimumLength($minimumLengt
 A minimum length of `null` signals that no minimum length has been set.
 `TMinimumLengthFormField` provides a default implementation of these three methods.
 
-{% include callout.html content="The implementing class has to validate the entered value against the minimum value manually by calling `validateMinimumLength()`." type="warning" %}
+!!! warning "The implementing class has to validate the entered value against the minimum value manually by calling `validateMinimumLength()`."
 
 
 #### `IMultipleFormField` / `TMultipleFormField`
@@ -349,7 +349,7 @@ The implementing class has to implement the following methods:
 
 `TMultipleFormField` provides a default implementation of these six methods and classes using `TMultipleFormField` register a [custom form field data processor](php_api_form_builder-validation_data.md#customformfielddataprocessor) to add the `HtmlInputProcessor` object with the text into the `$parameters` array directly using `{$objectProperty}_htmlInputProcessor` as the array key.
 
-{% include callout.html content="The implementing class has to validate the values against the minimum and maximum number of values manually." type="warning" %}
+!!! warning "The implementing class has to validate the values against the minimum and maximum number of values manually."
 
 
 #### `INullableFormField` / `TNullableFormField`
index b3157f41cf1cc5cea8a4283bd3c4773769827258..987a265bd99ce8a028a6d96cd41e258f4d7588ad 100644 (file)
@@ -74,9 +74,9 @@ Form data handlers themselves, however, are only iterating through all `IFormDat
 When `FormDocument` creates its `FormDataHandler` instance, it automatically registers an `DefaultFormDataProcessor` object as the first data processor.
 `DefaultFormDataProcessor` puts the save value of all form fields that are available and have a save value into `$parameters['data']` using the form field’s object property as the array key.
 
-{% include callout.html content="`IFormDataProcessor` should not be implemented directly. Instead, `AbstractFormDataProcessor` should be extended." type="warning" %}
+!!! warning "`IFormDataProcessor` should not be implemented directly. Instead, `AbstractFormDataProcessor` should be extended."
 
-{% include callout.html content="All form data is put into the `data` sub-array so that the whole `$parameters` array can be passed to a database object action object that requires the actual database object data to be in the `data` sub-array." type="info" %}
+!!! info "All form data is put into the `data` sub-array so that the whole `$parameters` array can be passed to a database object action object that requires the actual database object data to be in the `data` sub-array."
  
 
 
index a051b47dd0c904dd0a005f2de27bcf27b7ec7beb..e44379b9b10e5af406db14ae7fba58572350e899 100644 (file)
@@ -1,8 +1,8 @@
 # Form Builder
 
-{% include callout.html content="Form builder is only available since WoltLab Suite Core 5.2." type="info" %}
+!!! info "Form builder is only available since WoltLab Suite Core 5.2."
 
-{% include callout.html content="The [migration guide for WoltLab Suite Core 5.2](migration_wsc-31_form-builder.md) provides some examples of how to migrate existing forms to form builder that can also help in understanding form builder if the old way of creating forms is familiar." type="info" %}
+!!! info "The [migration guide for WoltLab Suite Core 5.2](migration_wsc-31_form-builder.md) provides some examples of how to migrate existing forms to form builder that can also help in understanding form builder if the old way of creating forms is familiar."
 
 
 ## Advantages of Form Builder
@@ -26,9 +26,7 @@ Form builder consists of several components that are presented on the following
 1. [Form validation and form data](php_api_form_builder-validation_data.md)
 1. [Form node dependencies](php_api_form_builder-dependencies.md)
 
-{% include callout.html content="In general, form builder provides default implementation of interfaces by providing either abstract classes or traits.
-  It is expected that the interfaces are always implemented using these abstract classes and traits!
-  This way, if new methods are added to the interfaces, default implementations can be provided by the abstract classes and traits without causing backwards compatibility problems." type="warning" %}
+!!! warning "In general, form builder provides default implementation of interfaces by providing either abstract classes or traits. It is expected that the interfaces are always implemented using these abstract classes and traits! This way, if new methods are added to the interfaces, default implementations can be provided by the abstract classes and traits without causing backwards compatibility problems."
 
 
 ## `AbstractFormBuilderForm`
index 4c561b0bd01339068d4f5abe7938e3ea5cbb41dc..50fbd71441e9a84e70903fb85c3308db512290d9 100644 (file)
@@ -1,6 +1,6 @@
 # Sitemaps
 
-{% include callout.html content="This feature is available with WoltLab Suite 3.1 or newer only." type="warning" %}
+!!! warning "This feature is available with WoltLab Suite 3.1 or newer only."
 
 Since version 3.1, WoltLab Suite Core is capable of automatically creating a sitemap.
 This sitemap contains all static pages registered via the page package installation plugin and which may be indexed by search engines (checking the `allowSpidersToIndex` parameter and page permissions) and do not expect an object ID.
index ed03a04d3d77729694cc7adfd54591dcccf0fe07..9dfd5b845894ee063b965c29c3a03f1e98ced95a 100644 (file)
@@ -64,7 +64,7 @@ a controller name that is already provided by the Core or any other app itself.
 
 ## Creating an App
 
-{% include callout.html content="This is a non-reversible operation! Once a package has been installed, its type cannot be changed without uninstalling and reinstalling the entire package, an app will always be an app and vice versa." type="danger" %}
+!!! danger "This is a non-reversible operation! Once a package has been installed, its type cannot be changed without uninstalling and reinstalling the entire package, an app will always be an app and vice versa."
 
 ### `package.xml`
 
index b877f7eabfed01692119dca7331c10545eea502f..39413a082c2373b0b6fe6a715f0bdd783c996a30 100644 (file)
@@ -1,6 +1,6 @@
 # Code Style
 
-{% include callout.html content="The following code style conventions are used by us for our own packages. While you do not have to follow every rule, you are encouraged to do so." type="info" %}
+!!! info "The following code style conventions are used by us for our own packages. While you do not have to follow every rule, you are encouraged to do so."
 
 For information about how to document your code, please refer to the [documentation page](php_code-style_documentation.md).
 
index d47ab343a980397869756d5a6aaa60ca88080293..7597b3e60e22f0ad0737cda3970eed28f5a4b36f 100644 (file)
@@ -6,7 +6,7 @@ folder: php
 parent: php_code-style
 ---
 
-{% include callout.html content="The following documentation conventions are used by us for our own packages. While you do not have to follow every rule, you are encouraged to do so." type="info" %}
+!!! info "The following documentation conventions are used by us for our own packages. While you do not have to follow every rule, you are encouraged to do so."
 
 
 ## Database Objects
index f65d9404df6ae140fee35782565fb3a5deb9c4a1..28a482d078114c14665712961a907a3fdace10a6 100644 (file)
@@ -37,7 +37,7 @@ while ($row = $statement->fetchArray()) {
 
 ### Fetching a Single Result
 
-{% include callout.html content="Do not attempt to use `fetchSingleRow()` or `fetchSingleColumn()` if the result contains more than one row." type="danger" %}
+!!! danger "Do not attempt to use `fetchSingleRow()` or `fetchSingleColumn()` if the result contains more than one row."
 
 You can opt-in to retrieve only a single row from database and make use of shortcut methods to reduce the code that you have to write.
 
@@ -58,7 +58,7 @@ There are two distinct differences when comparing with the example on query para
 
 ### Fetch by Column
 
-{% include callout.html content="There is no way to return another column from the same row if you use `fetchColumn()` to retrieve data." type="warning" %}
+!!! warning "There is no way to return another column from the same row if you use `fetchColumn()` to retrieve data."
 
 Fetching an array is only useful if there is going to be more than one column per result row, otherwise accessing the column directly is much more convenient and increases the code readability.
 
@@ -131,7 +131,7 @@ $map = $statement->fetchMap('exampleID', 'userID');
 
 `$map` is a one-dimensional array where each `exampleID` value maps to the corresponding `userID` value.
 
-{% include callout.html content="If there are multiple entries for a certain `exampleID` value with different `userID` values, the existing entry in the array will be overwritten and contain the last read value from the database table. Therefore, this method should generally only be used for unique combinations." type="warning" %}
+!!! warning "If there are multiple entries for a certain `exampleID` value with different `userID` values, the existing entry in the array will be overwritten and contain the last read value from the database table. Therefore, this method should generally only be used for unique combinations."
 
 If you do not have a combination of columns with unique pairs of values, but you want to get a list of `userID` values with the same `exampleID`, you can set the third parameter of `fetchMap()` to `false` and get a list:
 
index c4d0a29d9bd4aceabec975d6de52153502eb26a7..57377f41e98350d038a702dcdb0273c1518ef66e 100644 (file)
@@ -52,7 +52,7 @@ You can access the decorated objects directly via `DatabaseObjectDecorator::getD
 
 ## DatabaseObjectEditor
 
-{% include callout.html content="This is the low-level interface to manipulate data rows, it is recommended to use `AbstractDatabaseObjectAction`." type="info" %}
+!!! info "This is the low-level interface to manipulate data rows, it is recommended to use `AbstractDatabaseObjectAction`."
 
 Adding, editing and deleting models is done using the `DatabaseObjectEditor` class that decorates a `DatabaseObject` and uses its data to perform the actions.
 
@@ -84,7 +84,7 @@ echo $example->bar;
 
 ### Updating an existing row
 
-{% include callout.html content="The internal state of the decorated `DatabaseObject` is not altered at any point, the values will still be the same after editing or deleting the represented row. If you need an object with the latest data, you'll have to discard the current object and refetch the data from database." type="warning" %}
+!!! warning "The internal state of the decorated `DatabaseObject` is not altered at any point, the values will still be the same after editing or deleting the represented row. If you need an object with the latest data, you'll have to discard the current object and refetch the data from database."
 
 ```php
 <?php
@@ -106,7 +106,7 @@ echo $example->bar;
 
 ### Deleting a row
 
-{% include callout.html content="Similar to the update process, the decorated `DatabaseObject` is not altered and will then point to an inexistent row." type="warning" %}
+!!! warning "Similar to the update process, the decorated `DatabaseObject` is not altered and will then point to an inexistent row."
 
 ```php
 <?php
@@ -215,7 +215,7 @@ class ExampleAction extends AbstractDatabaseObjectAction {
 
 ### Executing an Action
 
-{% include callout.html content="The method `AbstractDatabaseObjectAction::validateAction()` is internally used for AJAX method invocation and must not be called programmatically." type="warning" %}
+!!! warning "The method `AbstractDatabaseObjectAction::validateAction()` is internally used for AJAX method invocation and must not be called programmatically."
 
 The next example represents the same functionality as seen for `DatabaseObjectEditor`:
 
index 5325cfef1d95de0b94bc1e25b6134605b54cec2b..6508fcf601afe982a4fb2915d5d34f825132dab3 100644 (file)
@@ -7,7 +7,7 @@ The [Standard PHP Library (SPL)](https://secure.php.net/manual/en/book.spl.php)
 
 ## Custom Exceptions
 
-{% include callout.html content="Do not use `wcf\system\exception\SystemException` anymore, use specific exception classes!" type="warning" %}
+!!! warning "Do not use `wcf\system\exception\SystemException` anymore, use specific exception classes!"
 
 The following table contains a list of custom exceptions that are commonly used.
 
index fb79f8c1e166525fce0aaad090b7b9220af4e02a..8de773b639e15c35188fdc00d3bd8ba5095c99af 100644 (file)
@@ -86,7 +86,7 @@ Extends the AbstractPage implementation with additional methods designed to hand
 
 #### submit()
 
-{% include callout.html content="The methods `submit()` up until `save()` are only invoked if either `$_POST` or `$_FILES` are not empty, otherwise they won't be invoked and the execution will continue with `readData()`." type="warning" %}
+!!! warning "The methods `submit()` up until `save()` are only invoked if either `$_POST` or `$_FILES` are not empty, otherwise they won't be invoked and the execution will continue with `readData()`."
 
 This is an internal method that is responsible of input processing and validation.
 
@@ -112,7 +112,7 @@ Saves the processed data to database or any other source of your choice. Please
 
 #### saved()
 
-{% include callout.html content="This method is not called automatically and must be invoked manually by executing `$this->saved()` inside `save()`." type="warning" %}
+!!! warning "This method is not called automatically and must be invoked manually by executing `$this->saved()` inside `save()`."
 
 The only purpose of this method is to fire the event `saved` that signals that the form data has been processed successfully and data has been saved. It is somewhat special as it is dispatched after the data has been saved, but before the data is purged during form reset. This is by default the last event that has access to the processed data.
 
index 59aa0a3e3d3e45d90a795849e2cbd1c563f884d4..7cf1a63a3c1812f813247f0595e3c58f224da9bc 100644 (file)
@@ -289,13 +289,13 @@ Now let use go through the different methods in chronological order again:
    The data properties of `PersonAddForm` are populated with the data of the edited person so that this data is shown in the form for the initial request.
 1. `save()` handles saving the changed data.
    
-   {% include callout.html content="Do not call `parent::save()` because that would cause `PersonAddForm::save()` to be executed and thus a new person would to be created! In order for the `save` event to be fired, call `AbstractForm::save()` instead!" type="warning" %}
+   !!! warning "Do not call `parent::save()` because that would cause `PersonAddForm::save()` to be executed and thus a new person would to be created! In order for the `save` event to be fired, call `AbstractForm::save()` instead!"
    
    The only differences compared to `PersonAddForm::save()` are that we pass the edited object to the `PersonAction` constructor, execute the `update` action instead of the `create` action and do not clear the input fields after saving the changes.
 1. In `assignVariables()`, we assign the edited `Person` object to the template, which is required to create the link in the form’s action property.
    Furthermore, we assign the template variable `$action` `edit` as value.
    
-   {% include callout.html content="After calling `parent::assignVariables()`, the template variable `$action` actually has the value `add` so that here, we are overwriting this already assigned value." type="info" %}
+   !!! info "After calling `parent::assignVariables()`, the template variable `$action` actually has the value `add` so that here, we are overwriting this already assigned value."
 
 
 ## Frontend
index 91865fbb6fc158c9ced31e51b4ec49b3dbf5928b..9c207a0dd69eb48772aae3e4e8f5ef730747785c 100644 (file)
@@ -148,7 +148,7 @@ The first part is a very simple class:
 {% include tutorial/tutorial-series/part-2/files/lib/system/event/listener/BirthdaySortFieldPersonListPageListener.class.php %}
 {% endhighlight %}
 
-{% include callout.html content="We use `SortablePage` as a type hint instead of `wcf\acp\page\PersonListPage` because we will be using the same event listener class in the front end to also allow sorting that list by birthday." type="info" %}
+!!! info "We use `SortablePage` as a type hint instead of `wcf\acp\page\PersonListPage` because we will be using the same event listener class in the front end to also allow sorting that list by birthday."
 
 As the relevant template codes are only one line each, we will simply put them directly in the `templateListener.xml` file that will be shown [later on](#templatelistenerxml).
 The code for the table head is similar to the other `th` elements:
@@ -175,7 +175,7 @@ In the front end, we will now use a template (`__personListBirthdaySortField.tpl
 {% include tutorial/tutorial-series/part-2/templates/__personListBirthdaySortField.tpl %}
 {% endhighlight %}
 
-{% include callout.html content="You might have noticed the two underscores at the beginning of the template file. For templates that are included via template listeners, this is the naming convention we use." type="info" %}
+!!! info "You might have noticed the two underscores at the beginning of the template file. For templates that are included via template listeners, this is the naming convention we use."
 
 Putting the template code into a file has the advantage that in the administrator is able to edit the code directly via a custom template group, even though in this case this might not be very probable.
 
index dbf321d77b6cfa8c64a6242f1bf8dc8c0407f02e..68c1f70ae14d51fdfbb324aaf863bce1a94b1b57 100644 (file)
@@ -75,7 +75,7 @@ The complete package will have the following file structure (including the files
 └── userGroupOption.xml
 ```
 
-{% include callout.html content="We will not mention every code change between the first part and this part, as we only want to focus on the important, new parts of the code. For example, there is a new `Person::getLink()` method and new language items have been added. For all changes, please refer to the [source code on GitHub](https://github.com/WoltLab/woltlab.github.io/tree/master/_includes/tutorial/tutorial-series/part-3)." type="warning" %}
+!!! warning "We will not mention every code change between the first part and this part, as we only want to focus on the important, new parts of the code. For example, there is a new `Person::getLink()` method and new language items have been added. For all changes, please refer to the [source code on GitHub](https://github.com/WoltLab/woltlab.github.io/tree/master/_includes/tutorial/tutorial-series/part-3)."
 
 
 ## Runtime Cache
@@ -115,7 +115,7 @@ The `PersonCommentManager` class extended `ICommentManager`’s default implemen
 Additionally, we have added a new `enableComments` database table column to the `wcf1_person` database table whose value can be set when creating or editing a person in the ACP.
 With this option, comments on individual people can be disabled.
 
-{% include callout.html content="Liking comments is already built-in and only requires some extra code in the `PersonPage` class for showing the likes of pre-loaded comments." type="info" %}
+!!! info "Liking comments is already built-in and only requires some extra code in the `PersonPage` class for showing the likes of pre-loaded comments."
 
 
 ## Person Page
index fffa3856223e621c71f179668b7f3d6792733436..d996d96d8a7615a4621980177fac520c5dfbe346 100644 (file)
@@ -40,7 +40,7 @@ Media breakpoints instruct the browser to apply different CSS depending on the v
 
 ### Available Breakpoints
 
-{% include callout.html content="Some very large smartphones, for example the Apple iPhone 7 Plus, do match the media query for `Tablets (portrait)` when viewed in landscape mode." type="info" %}
+!!! info "Some very large smartphones, for example the Apple iPhone 7 Plus, do match the media query for `Tablets (portrait)` when viewed in landscape mode."
 
 | Name | Devices | `@media` equivalent |
 |-------|-------|-------|
index 241034f2eae6ffa7e8ef6f8fe8971209aa68bd9f..681e213c23f1aab3cdec16e0c04b7fd228e64cfd 100644 (file)
@@ -11,7 +11,7 @@ installation plugin, please also read the [naming conventions for language items
 
 ### `wcf.date.dateFormat`
 
-{% include callout.html content="Many characters in the format have a special meaning and will be replaced with date fragments. If you want to include a literal character, you'll have to use the backslash `\` as an escape sequence to indicate that the character should be output as-is rather than being replaced. For example, `Y-m-d` will be output as `2018-03-30`, but `\Y-m-d` will result in `Y-03-30`." type="warning" %}
+!!! warning "Many characters in the format have a special meaning and will be replaced with date fragments. If you want to include a literal character, you'll have to use the backslash `\` as an escape sequence to indicate that the character should be output as-is rather than being replaced. For example, `Y-m-d` will be output as `2018-03-30`, but `\Y-m-d` will result in `Y-03-30`."
 
 _Defaults to `M jS Y`._
 
index 832637276f240d4549143f1d48552997588c1060..4a31bb22c00be8caf2fa02aea2dc57287e62bf26 100644 (file)
@@ -190,7 +190,7 @@ Please [check the implementation](https://github.com/WoltLab/WCF/blob/master/wcf
 {cycle name=fooCycle} {* prints 'bar' *}
 ```
 
-{% include callout.html content="The values attribute only has to be present for the first call. If `cycle` is used in a loop, the presence of the same values in consecutive calls has no effect. Only once the values change, the cycle is reset." type="info" %}
+!!! info "The values attribute only has to be present for the first call. If `cycle` is used in a loop, the presence of the same values in consecutive calls has no effect. Only once the values change, the cycle is reset."
 
 | Attribute | Description |
 |-----------|-------------|
index 34c9b1903ae9900887c4f31c3b1430ea5344fedf..3a5b827eab2239681f16546bc1f962fd29da6eb4 100644 (file)
@@ -25,7 +25,7 @@ For pages and forms, the name of the template matches the unqualified name of th
 
 If you follow this convention, WoltLab Suite Core will automatically determine the template name so that you do not have to explicitly set it.
 
-{% include callout.html content="For forms that handle creating and editing objects, in general, there are two form classes: `FooAddForm` and `FooEditForm`. WoltLab Suite Core, however, generally only uses one template `fooAdd.tpl` and the template variable `$action` to distinguish between creating a new object (`$action = 'add'`) and editing an existing object (`$action = 'edit'`) as the differences between templates for adding and editing an object are minimal." type="info" %}
+!!! info "For forms that handle creating and editing objects, in general, there are two form classes: `FooAddForm` and `FooEditForm`. WoltLab Suite Core, however, generally only uses one template `fooAdd.tpl` and the template variable `$action` to distinguish between creating a new object (`$action = 'add'`) and editing an existing object (`$action = 'edit'`) as the differences between templates for adding and editing an object are minimal."
 
 
 
@@ -79,7 +79,7 @@ More information about installing templates can be found on those pages.
 
 ### Forms
 
-{% include callout.html content="For new forms, use the new [form builder API](php_api_form_builder.md) introduced with WoltLab Suite 5.2." type="info" %}
+!!! info "For new forms, use the new [form builder API](php_api_form_builder.md) introduced with WoltLab Suite 5.2."
 
 ```smarty
 <form method="post" action="{link controller='FooBar'}{/link}">
@@ -225,7 +225,7 @@ Comments are wrapped in `{*` and `*}` and can span multiple lines:
    comment *}
 ```
 
-{% include callout.html content="The template compiler discards the comments, so that they not included in the compiled template." type="info" %}
+!!! info "The template compiler discards the comments, so that they not included in the compiled template."
 
 ### Conditions