.. You may want to use the usual include line. Uncomment and adjust the path. .. include:: ../Includes.txt ======== Comments ======== :Author: Dmitry Dulepov :Created: 2002-11-01T00:32:00 :Changed: 2013-07-12T12:40:59 :Email: dmitry@typo3.org :Info 1: Dmitry Dulepov :Info 2: :Info 3: :Info 4: .. _Comments: Comments ======== Extension Key: **comments** Copyright 2007-2008, Dmitry Dulepov Copyright 2008-2013, Ingo Renner This document is published under the Open Content License available from http://www.opencontent.org/opl.shtml The content of this document is related to TYPO3 \- a GNU/GPL CMS/Framework available from typo3.org .. _Table-of-Contents: Table of Contents ----------------- **Commenting system 1** **Introduction 1** What does it do? 1 Features 1 Screenshots 2 Acknowledgments 3 Having questions? 3 **Users manual 3** Inserting comments to page 3 Customizing comments 4 Approving comments 5 FAQ 5 **Administration 6** Adding TypoScript template 6 **Configuration 6** Main configuration 6 Advanced options (->ADVANCED) 7 Spam protection (->SPAMPROTECT) 7 Prefix-to-table map (->PREFIXMAP) 8 showUid map (->SHOWUIDMAP) 8 **Using comments in other extensions 8** tt\_news 8 **Hooks 9** Using hooks 9 Common hook parameters 9 List of hooks 9 **Translating the extension 10** **To-Do list 10** .. _Introduction: Introduction ------------ .. _What-does-it-do: What does it do? ^^^^^^^^^^^^^^^^ This extension provides commenting capabilities to TYPO3 pages or to virtually any TYPO3 record available in frontend in a single view (like single news item, single album image, etc). .. _Features: Features ^^^^^^^^ - Comment pages - Comment records - Comments are displayed in pages - Highly customizable template, for example: - Number of messages per page - Show/hide fields to comments - Available fields (labels can be customized): - First name - Last name - E-mail - Home page - Location (city, for example) - Comment - Set fields as required or optional - E-mail address syntax validation - Fully localizable (including date format through PHP strtoftime() function) - Automatically clear cache for any page(s) when comment is added - Close comments after predefined period - Close comments for individual records immediately or after period (through supplemental *comments\_ic* extension) - Prevent duplicate comments (for example, several subsequent POST requests) - See IP address of the commenter in BE - Spam control - Filter out typical guestbook spam - Force all messages to pass approval - Automatically decide if message should be approved before it can appear on the web page - Send e-mail to designated e-mail address about suspicious messages - Hook to connect external spam checkers - Full TYPO3 caching supported (USER object!), which highly improves web site performance - Automatic cleanup: removes comments if "parent" record is removed - External CSS stylesheet can be included through the template (no need to modify web site TS setup for this!) - Automatically use FE user data to fill comment form - Extends tt\_news to show number of comments in LIST, SEARCH and LATEST views - Integrates ratings from “ratings” extension - Automatically find links in comment text and convert them to clickable links (can be turned on and off) - Lots of hooks to customize comments .. _Screenshots: Screenshots ^^^^^^^^^^^ There are screenshots also in other sections of this manual. This screenshot shows the default template with default styles with ratings enabled. |img-1| .. _Users-manual: Users manual ------------ .. _Inserting-comments-on-a-page: Inserting comments on a page ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When inserting a new content element, scroll down to the end of the "New content element" wizard and select "Comments": |img-2| This will insert a plugin for commentis as a new content element. This operation has to be done twice: once for comment list, another for the comment form. See next section for details on configuring the plugin. .. _Customizing-comments: Customizing comments ^^^^^^^^^^^^^^^^^^^^ All comments options can be configured either through TypoScript or through the plugin's configuration when it is inserted as a content element. TypoScript configuration should be used when the plugin is inserted through TypoScript. For information on TypoScript configuration options see "Configuration" section later in this manual. **Warning!** Flexform configuration will always override the TypoScript configuration when corresponding field is set! Plugin configuration consists of several tabs. .. _General-tab: General tab """"""""""" |img-3| **Mode** defines what the plugin displays: comment listing and/or form to add comments. **Triggering prefix** defines what parameter in the URL triggers rendering of comments. The value depends on another plugin and its URL GET parameters. Typically this parameter is something like *tx\_extkey\_pi1* but other plugins may have different values (for example, *tx\_ttnews* for the *tt\_news* plugin). The special value *pages* allows to comment on pages instead of records. **Note for plugin authors:** Please read the **Configuration** section for information about enabling comments for your extension. **Storage page** specifies where records should be stored. If empty, current the page is used. You probably want to set this using TypoScript. **Template file** defines the template file to be used. It can either be a path relative to the web site root (like *fileadmin/templates/comments.tmpl* ) or an extension path (for example, *EXT:comments/res/pi1\_template* ). .. _Advanced-tab: Advanced tab """""""""""" |img-4| **Comments per page** specifies how many comments to show per page. **Close commenting after** allows to automatically disable commenting if a record is older than the specified time. The time is a number followed by suffix. The suffix can be *h* (hour), *m* (month), *y* (year) or *d* (day). The comments extension takes care to change the page caching time so that the page cache expires when comments should be closed. **Enable ratings** enables ratings for comment items. This option is only available if EXT:ratings is installed. Note that users may rate comments only if comments are not closed for the item. If comments are closed, users will see the ratings but will not be able to rate comments further. The option to close comments must be set not only on form but also on the comments list plugin instance. **Show newer comments first** reverses the sorting order for the comment listing. Normally comments are display from oldest to newest. Checking this option reverses the order and newer comments are show first. .. _Anti-spam-tab: Anti-spam tab """"""""""""" |img-5| **Require approval of each comment** puts comments on hold and sends an e-mail to the e-mail address provided in **Send notification to this e-mail** with comment information (submitted form fields) and links to approve, delete or kill (i.e. completely remove from database). Approving comment also clears cache for the page and approved comment appears on the page. **Check referrer** makes the extension check that a request comes from the current web site. This option may have undesired results because many firewalls block referrer information and some browsers do not send this information reliably. It is not recommended to use this option unless you are really paranoid. **Use captcha** allows to select one of two captcha extensions ( *captcha* or *sr\_freecap* ) to use while submitting comments. The corresponding extension must be installed. The comments extension already has good spam catching capabilities, so you may want to try without any captcha first (captchas usually annoy users very much). **Send notification to this e-mail** specifies the e-mail address where to send messages with links to approve or delete comments. **Send e-mail from this address** specifies th "From" e-mail address for notifications about new comments. **Template file for e-mails** sets the template file for e-mails. .. _Approving-comments: Approving comments ^^^^^^^^^^^^^^^^^^ If a comment is set to “disapproved” because it may be spam or the **Require approval of each comment** option is set, comments will not be visible on the page instantly. An administrator will receive a notification e-mail with links to approve or reject comments. Alternatively it can be done through Web>List module. Disapproved comments have different icon in the List module: |img-6| The first comment record in the screenshot above is a disapproved comment. When opened for editing, this flag will set whether a comment is approved or not: |img-7| If the checkbox is set, the comment is approved. .. _Administration: Administration -------------- .. _Adding-TypoScript-template: Adding TypoScript template ^^^^^^^^^^^^^^^^^^^^^^^^^^ The extension's TypoScript template must be added to site's TypoScript template for the plugins to work. To add a template, go to the **Template** submodule in the **Web** module, click **Info/Modify** and then **Click here to edit whole template record** . In the go to **Include static (from extensions)** and select **Comments (comments)** in the right box. It should then be added in the left box. |img-8| .. _Configuration-Reference: Configuration Reference ----------------------- .. _Main-configuration: Main configuration ^^^^^^^^^^^^^^^^^^ .. ### BEGIN~OF~TABLE ### .. _code: code """" .. container:: table-row Property code Data type string Description COMMENTS or FORM. Shows a comment list or the form to submit comments. Default COMMENTS .. _storagePid: storagePid """""""""" .. container:: table-row Property storagePid Data type integer / list of integers Description The page uid where comment records will be stored. If this is empty, the current page will be used. Starting with version 1.4.0 this can be a comma-separated list of page UID values. Comments will search in all these pages but will save comments to the first page in this list. Default empty (value of {$plugin.tx\_comments\_pi1.storagePid} constant) .. _externalPrefix: externalPrefix """""""""""""" .. container:: table-row Property externalPrefix Data type string Description See **Triggering prefix** in **User guide.** Default tx\_ttnews (the value of {$plugin.tx\_comments\_pi1.externalPrefix} constant .. _templateFile: templateFile """""""""""" .. container:: table-row Property templateFile Data type string Description Template file for the plugin. Accepts either site-relative path or extension-related path (EXT: prefix) Default EXT:comments/res/pi1\_template.html (value of {$plugin.tx\_comments\_pi1.templateFile} constant) .. _additionalClearCachePages: additionalClearCachePages """"""""""""""""""""""""" .. container:: table-row Property additionalClearCachePages Data type list of integers Description Addition page uids to clear when a comment is submitted or approved. Default .. _advanced: advanced """""""" .. container:: table-row Property advanced Data type ->ADVANCED Description Default .. _preventDuplicatePosts: preventDuplicatePosts """"""""""""""""""""" .. container:: table-row Property preventDuplicatePosts Data type boolean Description If set, prevents duplicate comments on the same page Default 1 .. _requiredFields: requiredFields """""""""""""" .. container:: table-row Property requiredFields Data type list of values Description Comma-separated list of fields to be required for comments. Available values: - firstname - lastname, - email - homepage - location - content Default firstname,email,content .. _spamProtect: spamProtect """"""""""" .. container:: table-row Property spamProtect Data type ->SPAMPROTECT Description Default .. _requiredFields-errorWrap: requiredFields\_errorWrap """"""""""""""""""""""""" .. container:: table-row Property requiredFields\_errorWrap Data type stdWrap Description stdWrap for required field if field is not filled properly Default noTrimWrap = \|Error: \|\| .. _prefixToTableMap: prefixToTableMap """""""""""""""" .. container:: table-row Property prefixToTableMap Data type ->PREFIXMAP Description Default .. _showUidMap: showUidMap """""""""" .. container:: table-row Property showUidMap Data type ->SHOWUIDMAP Description Default .. _ratingsConfig: ratingsConfig """"""""""""" .. container:: table-row Property ratingsConfig Data type “ratings” plugin configuration Description Allows to specify alternative confguration for the ratings plugin. Typical usage: :: ratingsConfig < plugin.tx_ratings_pi1 ratingsConfig.additionalCSS = EXT:myext/res/ratings_css_for_comments.css Obviously userFunc is ignored. This parameter is not defined by default and completely optional. If default ratings configurations suits your needs, do not define this parameter. Default *empty* .. _firstName-stdWrap: firstName\_stdWrap """""""""""""""""" .. container:: table-row Property firstName\_stdWrap Data type string Description Wraps “First name” field Default *empty* .. _lastName-stdWrap: lastName\_stdWrap """"""""""""""""" .. container:: table-row Property lastName\_stdWrap Data type string Description Wraps “Last name” field Default *empty* .. _email-stdWrap: email\_stdWrap """""""""""""" .. container:: table-row Property email\_stdWrap Data type string Description Wraps “E-mail” field Default *empty* .. _webSite-stdWrap: webSite\_stdWrap """""""""""""""" .. container:: table-row Property webSite\_stdWrap Data type string Description Wraps “Web site” field Default *empty* .. _location-stdWrap: location\_stdWrap """"""""""""""""" .. container:: table-row Property location\_stdWrap Data type string Description Wraps “Location” field Default *empty* .. _content-stdWrap: content\_stdWrap """""""""""""""" .. container:: table-row Property content\_stdWrap Data type string Description Wraps “Content” field Default *empty* .. ###### END~OF~TABLE ###### .. _Advanced-options-ADVANCED: Advanced options (->ADVANCED) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. ### BEGIN~OF~TABLE ### .. _commentsPerPage: commentsPerPage """"""""""""""" .. container:: table-row Property commentsPerPage Data type int Description Number of comments per page Default 100 (value of {$plugin.tx\_comments\_pi1.commentsPerPage} constant) .. _closeCommentsAfter: closeCommentsAfter """""""""""""""""" .. container:: table-row Property closeCommentsAfter Data type string Description If set, automatically disables commenting for items older than this period. See **Close commenting after** in the User manual for more information. Default *empty* .. _dateFormat: dateFormat """""""""" .. container:: table-row Property dateFormat Data type string Description Defines date format to use for date/time information about posts. Format specifiers depend on dateFormatMode configuration option. See PHP function `date() `_ and `strftime() `_ for information about format specifiers. If empty, defaults to concatenation of SYS->ddmmyy and SYS->hhmm system variables (from Install tool) and dateFormatMode is foreced to “date” Default *empty* .. _dateFormatMode: dateFormatMode """""""""""""" .. container:: table-row Property dateFormatMode Data type string Description Determines what PHP function to use for date formatting. Defaults to “date”. If you want to use month or week days in national language, you have to use “strftime”. Valid values are: - date - strftime Default date .. _preFillFormFromFeUser: preFillFormFromFeUser """"""""""""""""""""" .. container:: table-row Property preFillFormFromFeUser Data type boolean Description If enabled and a FE user is logged in, fills form data with the information from the FE user record. If sr\_feuser\_register is installed, attempts to use its fields too Default 1 .. _enableRatings: enableRatings """"""""""""" .. container:: table-row Property enableRatings Data type boolean Description If EXT:ratings is installed, allows users to rate comments. Note that ratings are only available if comments are not closed for an item. When comments are closed, ratings automatically become read-only. Default 0 .. _autoConvertLinks: autoConvertLinks """""""""""""""" .. container:: table-row Property autoConvertLinks Data type boolean Description If enabled, will search for possible links in comment text and turn them into links. Specifically the following texts are taken care of: - http:// - www. Anything that starts with these strings will be converted to links. Links are always created with `rel=”nofollow” `_ and css class “tx-comments-external-autolink”. Default 1 .. _reverseSorting: reverseSorting """""""""""""" .. container:: table-row Property reverseSorting Data type boolean Description Reverses sorting order of comments in list view. Normally comments are sorted from oldest to newest. Default 0 .. ###### END~OF~TABLE ###### .. _Spam-protection-SPAMPROTECT: Spam protection (->SPAMPROTECT) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. ### BEGIN~OF~TABLE ### .. _requireApproval: requireApproval """"""""""""""" .. container:: table-row Property requireApproval Data type boolean Description If enabled, messages will be disapproved by default and a notification email will be sent to an administrator (see **notificationEmail** below). If approval is not set to required but **checkTypicalSpam** is set, messages can still be set to disapproved automatically and a notification is sent. Default 1 (value of {$plugin.tx\_comments\_pi1.requireApproval} constant) .. _useCaptcha: useCaptcha """""""""" .. container:: table-row Property useCaptcha Data type string Description Enables using captcha to post comments. Possible values are: - 0 – do not use captcha - 1 – use captcha extension - 2 – use sr\_freecap extension If value is not 0, corresponding extension must be installed to TYPO3 Default 0 (value of {$plugin.tx\_comments\_pi1.useCaptcha} constant) .. _checkTypicalSpam: checkTypicalSpam """""""""""""""" .. container:: table-row Property checkTypicalSpam Data type boolean Description If set, the extension automatically checks all comments for typical spam. If comments receive more than 1000 spam points, it is automatically set to disapproved and a notification is sent to the author. Default 1 .. _considerReferer: considerReferer """"""""""""""" .. container:: table-row Property considerReferer Data type boolean Description If set, checks that the referer of the current page is within the same/current web site. If not, a comment is set to disapproved and a notification is sent to an administrator. See **Check referer** in **User guide** for more information and possible risks associated with this option. Default 0 .. _notificationEmail: notificationEmail """"""""""""""""" .. container:: table-row Property notificationEmail Data type string Description E-mail address to send notifications to Default .. _fromEmail: fromEmail """"""""" .. container:: table-row Property fromEmail Data type string Description E-mail address to send notifications from Default .. _emailTemplate: emailTemplate """"""""""""" .. container:: table-row Property emailTemplate Data type string Description E-mail template. See **Template file for e-mails** in **User guide** for more information Default EXT:comments/res/email.txt .. _spamCutOffPoint: spamCutOffPoint """"""""""""""" .. container:: table-row Property spamCutOffPoint Data type integer Description If the number of points is greater than this value, a comment is ignored, the user receives a spam warning message and no approval e-mail is sent to an administrator. Default 1000 .. ###### END~OF~TABLE ###### .. _Prefix-to-table-map-PREFIXMAP: Prefix-to-table map (->PREFIXMAP) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The comments extension must know the table name of the commented record to perform automatic cleanup. The extension's configuration contains a map of triggering prefix names to table names. By default it looks like: :: prefixToTableMap.tx_album3x_pi1 = tx_album3x_images prefixToTableMap.tx_commerce_pi1 = tx_commerce_products prefixToTableMap.tx_irfaq_pi1 = tx_irfaq_q prefixToTableMap.tx_mininews_pi1 = tx_mininews_news prefixToTableMap.tx_ttnews = tt_news prefixToTableMap.tx_news_pi1 = tx_news_domain_model_news Extension authors who want to enable commenting for their records, may add entries to setup.txt for their own extension to extend this map. Here is an example: :: plugin.tx_comments_pi1.prefixToTableMap.tx_myext_pi1 = tx_myext_mytable So, if the URL looks like this: :: http://www.example.com/index.php?id=12345&tx_myext_pi1[showUid]=67890 than the comments extension will understand that it must refer to tx\_myext\_mytable for triggering prefix tx\_myext\_pi1. .. _showUid-map-SHOWUIDMAP: showUid map (->SHOWUIDMAP) ^^^^^^^^^^^^^^^^^^^^^^^^^^ By default EXT:comments will try to get the commented record's uid using the showUid GET parameter. The comments extension needs to know the name to find the record's uid. By default, only EXT:tt\_news and EXT:news are configured: :: showUidMap.tx_ttnews = tt_news showUidMap.tx_news_pi1 = news It is possible to use custom parameters with the comments extension, here is an example: :: plugin.tx_comments_pi1.showUidMap.tx_myext_pi1 = uid So, if the URL looks like this: :: http://www.example.com/index.php?id=12345&tx_myext_pi1[uid]=67890 than the comments extension will understand that the record's uid value is 67890. .. _Using-comments-in-other-extensions: Using comments in other extensions ---------------------------------- .. _tt-news: tt\_news ^^^^^^^^ The comments extension provides a custom marker for tt\_news to display the number of comments in List, Latest and Search views. The marker is ###TX\_COMMENTS\_COUNT###. By default it will produce the following HTML: :: 5 comments(s) This HTML can be customized by modifying the template that ships with the comments extension. See ###TTNEWS\_COMMENT\_COUNT\_SUB### subpart in the template. The tt\_news marker is typically included after the “more” link. .. _Hooks: Hooks ----- .. _Using-hooks: Using hooks ^^^^^^^^^^^ New hooks can be used from other extensions using the following code in ext\_localconf.php in the other extension: :: $TYPO3_CONF_VARS['EXTCONF']['comments'][hookName][yourextkey] = 'EXT:yourextkey/class.tx_yourextkey_hooks.php:&tx_yourextkey_hooks->methodName'; .. _Common-hook-parameters: Common hook parameters ^^^^^^^^^^^^^^^^^^^^^^ Each hook uses two arguments: .. ### BEGIN~OF~TABLE ### .. _params: $params """"""" .. container:: table-row Argument $params Type array Description Contains hook parameters (specific for each hook, see hooks list below) and 'pObj', which is identical to $pObj hook parameter. .. _pObj: $pObj """"" .. container:: table-row Argument $pObj Type tx\_comments\_pi1 Description Reference to calling class. .. ###### END~OF~TABLE ###### .. _Available-hooks: Available hooks ^^^^^^^^^^^^^^^ .. _closeCommentsAfter: closeCommentsAfter """""""""""""""""" This hook is called when deciding whether commenting is closed for an item. .. ### BEGIN~OF~TABLE ### .. _table: table ~~~~~ .. container:: table-row Argument table Type string Description Table name .. _uid: uid ~~~ .. container:: table-row Argument uid Type int Description uid of the record .. ###### END~OF~TABLE ###### The hook should return an integer Unix time value to indicate if commenting for the item is closed. Returning “false” means “do not know”. The first integer value stops processing of other hooks. .. _comments: comments """""""" This hook is called when the marker array is prepared for rendering the comments list as whole. .. ### BEGIN~OF~TABLE ### .. _template: template ~~~~~~~~ .. container:: table-row Argument template Type string Description Template subsection to be used .. _markers: markers ~~~~~~~ .. container:: table-row Argument markers Type array Description Existing markers .. ###### END~OF~TABLE ###### The hook should return a modified array with markers. .. _comments-getComments: comments\_getComments """"""""""""""""""""" This hook is called when the marker array is prepared for rendering a single comment in a list. .. ### BEGIN~OF~TABLE ### .. _template: template ~~~~~~~~ .. container:: table-row Argument template Type string Description Template subsection to be used .. _markers: markers ~~~~~~~ .. container:: table-row Argument markers Type array Description Existing markers .. _row: row ~~~ .. container:: table-row Argument row Type array Description Current comment record .. ###### END~OF~TABLE ###### The hook should return a modified array with markers. .. _externalSpamCheck: externalSpamCheck """"""""""""""""" This hook is called when checking messages for spam. Hook can add or remove spam points based on its own logic. .. ### BEGIN~OF~TABLE ### .. _formdata: formdata ~~~~~~~~ .. container:: table-row Argument formdata Type array Description A shortcut $pObj->piVars .. _points: points ~~~~~~ .. container:: table-row Argument points Type int Description Currently earned points .. ###### END~OF~TABLE ###### The hook should return integer value, which will be added to the current number of spam points. To block a message completely the accumulated points value must be greater than “spamProtect.spamCutOffPoint”. .. _eID-postProc: eID\_postProc """"""""""""" This hook is called by the eID script when approving or deleting comments using the link in the notificatiion e-mail. It allows to post-process e-mail commands. The hook does not receive any custom parameters. .. _form: form """" This hook is called when the marker array is prepared for rendering the form. .. ### BEGIN~OF~TABLE ### .. _template: template ~~~~~~~~ .. container:: table-row Argument template Type string Description Template subsection to be used .. _markers: markers ~~~~~~~ .. container:: table-row Argument markers Type array Description Existing markers .. ###### END~OF~TABLE ###### The hook should return a modified array with markers. .. _mergeConfiguration: mergeConfiguration """""""""""""""""" This hook allows to alter/add configuration values for tx\_comments\_pi1. There are no additional parameters to the hook. The hook should modify the configuration in the following way: $pObj->conf['section.']['param']='value'; .. _processSubmission: processSubmission """"""""""""""""" This hook is executed before a comment record is inserted into the database. .. ### BEGIN~OF~TABLE ### .. _record: record ~~~~~~ .. container:: table-row Argument record Type array Description Record array .. ###### END~OF~TABLE ###### The hook should return a modified record array. .. _sendNotificationMail: sendNotificationMail """""""""""""""""""" This hook is called when the marker array is prepared for sending the notification email to an administrator. .. ### BEGIN~OF~TABLE ### .. _template: template ~~~~~~~~ .. container:: table-row Argument template Type string Description Template subsection to be used .. _check: check ~~~~~ .. container:: table-row Argument check Type string Description Hashed check value for eID call .. _markers: markers ~~~~~~~ .. container:: table-row Argument markers Type array Description Existing markers .. ###### END~OF~TABLE ###### The hook should return a modified array with markers. .. _processValidComment: processValidComment """"""""""""""""""" This hook is called when a comment is posted and visible on the web site. It is not called when comment is approved by the administrator manually! .. ### BEGIN~OF~TABLE ### .. _uid: uid ~~~ .. container:: table-row Argument uid Type integer Description uid of the new comment record .. ###### END~OF~TABLE ###### Return value is ignored. Comments - 10 .. ######CUTTER_MARK_IMAGES###### .. |img-1| image:: img-1.png .. :align: left .. :border: 1 .. :height: 656 .. :id: graphics7 .. :name: graphics7 .. :width: 661 .. |img-2| image:: img-2.png .. :align: left .. :border: 1 .. :height: 28 .. :id: graphics4 .. :name: graphics4 .. :width: 419 .. |img-3| image:: img-3.png .. :align: left .. :border: 1 .. :height: 242 .. :id: graphics1 .. :name: graphics1 .. :width: 433 .. |img-4| image:: img-4.png .. :align: left .. :border: 1 .. :height: 204 .. :id: graphics2 .. :name: graphics2 .. :width: 330 .. |img-5| image:: img-5.png .. :align: left .. :border: 1 .. :height: 231 .. :id: graphics3 .. :name: graphics3 .. :width: 341 .. |img-6| image:: img-6.png .. :align: left .. :border: 1 .. :height: 77 .. :id: graphics5 .. :name: graphics5 .. :width: 383 .. |img-7| image:: img-7.png .. :align: left .. :border: 1 .. :height: 189 .. :id: graphics6 .. :name: graphics6 .. :width: 400 .. |img-8| image:: img-8.png .. :align: left .. :border: 0 .. :height: 182 .. :id: graphics8 .. :name: graphics8 .. :width: 573