[BUGFIX] Incorrect audio rendering of non-ASCII characters in word list 42/46642/2
authorStanislas Rolland <typo3@sjbr.ca>
Sat, 13 Feb 2016 15:29:51 +0000 (10:29 -0500)
committerStanislas Rolland <typo3@sjbr.ca>
Sat, 13 Feb 2016 15:31:46 +0000 (16:31 +0100)
The problem arises when the file system is utf-8.

Resolves: #73423
Change-Id: Ibd057696df39b769bd7f98fd15a6f8ebf63b7b36
Reviewed-on: https://review.typo3.org/46642
Reviewed-by: Stanislas Rolland <typo3@sjbr.ca>
Tested-by: Stanislas Rolland <typo3@sjbr.ca>
ChangeLog
Classes/View/AudioPlayer/AbstractPlayFormat.php

index 650e2d2..2df1790 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2016-02-13  Stanislas Rolland  <typo(arobas)sjbr.ca>
 
        * Resolves #73422: Cleanup in German word list
+       * Resolves #73423: Incorrect audio rendering when using word lists with non-ASCII characters    
 
 2016-02-11  Stanislas Rolland  <typo(arobas)sjbr.ca>
 
index 71f7099..2a1bbde 100644 (file)
@@ -1,37 +1,41 @@
 <?php
 namespace SJBR\SrFreecap\View\AudioPlayer;
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2013 Stanislas Rolland <typo3(arobas)sjbr.ca>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-/**
- * Abstract class for rendering an audio version of the CAPTCHA
+
+/*
+ *  Copyright notice
+ *
+ *  (c) 2013-2016 Stanislas Rolland <typo3(arobas)sjbr.ca>
+ *  All rights reserved
+ *
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  (at your option) any later version.
  *
- * @author     Stanislas Rolland       <typo3(arobas)sjbr.ca>
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
  */
-class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
 
+use SJBR\SrFreecap\Utility\AudioContentUtility;
+use SJBR\SrFreecap\Utility\EncryptionUtility;
+use SJBR\SrFreecap\Utility\LocalizationUtility;
+use TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext;
+use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
+
+/**
+ * Abstract class for rendering an audio version of the CAPTCHA
+ */
+class AbstractPlayFormat implements ViewInterface
+{
        /**
         * @var string Name of the extension this view helper belongs to
         */
@@ -50,11 +54,10 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
        /**
         * Sets the current controller context
         *
-        * @param \TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext $controllerContext
+        * @param ControllerContext $controllerContext
         * @return void
         */
-       public function setControllerContext(\TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext $controllerContext) {
-       }
+       public function setControllerContext(ControllerContext $controllerContext) {}
 
        /**
         * Add a variable to the view data collection.
@@ -62,8 +65,7 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         *
         * @param string $key Key of variable
         * @param mixed $value Value of object
-        * @return \TYPO3\CMS\Extbase\Mvc\View\ViewInterface an instance of $this, to enable chaining
-        * @api
+        * @return ViewInterface an instance of $this, to enable chaining
         */
        public function assign($key, $value) {
                switch ($key) {
@@ -78,22 +80,22 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         * Add multiple variables to the view data collection
         *
         * @param array $values array in the format array(key1 => value1, key2 => value2)
-        * @return \TYPO3\CMS\Extbase\Mvc\View\ViewInterface an instance of $this, to enable chaining
-        * @api
+        * @return ViewInterface an instance of $this, to enable chaining
         */
-       public function assignMultiple(array $values) {
+       public function assignMultiple(array $values)
+       {
                return $this;
        }
 
        /**
         * Tells if the view implementation can render the view for the given context.
         *
-        * @param \TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext $controllerContext
+        * @param ControllerContext $controllerContext
         * @return boolean TRUE if the view has something useful to display, otherwise FALSE
-        * @api
         */
-       public function canRender(\TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext $controllerContext) {
-               return TRUE;
+       public function canRender(ControllerContext $controllerContext)
+       {
+               return true;
        }
 
        /**
@@ -101,13 +103,14 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         *
         * @return string The audio output to play
         */
-        public function render () {
+        public function render()
+        {
                 // Get the catcha word
                $word = $this->getWord();
                // Get the letter rensering files
                $letterRenderingFiles = $this->getLetterRenderingFiles($word);
                // Join the files
-               $audioContent = \SJBR\SrFreecap\Utility\AudioContentUtility::joinAudioFiles($letterRenderingFiles);
+               $audioContent = AudioContentUtility::joinAudioFiles($letterRenderingFiles);
                // Output proper headers
                $this->sendHeaders($audioContent);
                // Return the audio content
@@ -118,22 +121,20 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         * Initializes this view.
         *
         * @return void
-        * @api
         */
-       public function initializeView() {
-       }
+       public function initializeView() {}
 
        /**
         * Gets the word that was stored in session data
-        *
-        * @return      string          the retrieved and decoded word
+        * @return string the retrieved and decoded word
         */
-       protected function getWord () {
+       protected function getWord()
+       {
                // Get cypher from session data
                $cypher =  $this->word->getWordCypher();
                // Decrypt the word
-               $decryptedString = \SJBR\SrFreecap\Utility\EncryptionUtility::decrypt($cypher);
-               return implode('-', str_split($decryptedString));
+               $decryptedString = EncryptionUtility::decrypt($cypher);
+               return implode('-', preg_split('//', $decryptedString, -1, PREG_SPLIT_NO_EMPTY));
        }
 
        /**
@@ -141,18 +142,19 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         *
         * @param string $word: the word to be spelled and played
         * @param string $extension: the audio file extension being used
-        *
         * @return array array of file names
         */
-       protected function getLetterRenderingFiles ($word, $extension = 'wav') {
+       protected function getLetterRenderingFiles($word, $extension = 'wav')
+       {
                $letterRenderingFiles = array();
                // Split the word
-               $letters = str_split($word);
+               $letters = preg_split('//', $word, -1, PREG_SPLIT_NO_EMPTY);
                // Get the directory containing the wav files
-               $voicesDirectory = \SJBR\SrFreecap\Utility\LocalizationUtility::getVoicesDirectory();
+               $voicesDirectory = LocalizationUtility::getVoicesDirectory();
                // Assemble the file names
                foreach ($letters as $letter){
-                       $file = $voicesDirectory . $letter . '.' . $extension;
+                       // Word lists are encoded in ISO-8859-1 (possibly in ISO-8859-2?)
+                       $file = $voicesDirectory . ($GLOBALS['TYPO3_CONF_VARS']['SYS']['UTF8filesystem'] ? utf8_encode($letter) : $letter) . '.' . $extension;
                        if (is_file($file)) {
                                $letterRenderingFiles[] = $file;
                        }
@@ -165,10 +167,10 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
         *
         * @param string $audioContent: the audio content that will be sent
         * @param string $mimeType: the audio mime type being used
-        *
         * @return      void
         */
-       protected function sendHeaders ($audioContent, $mimeType = 'x-wav') {
+       protected function sendHeaders($audioContent, $mimeType = 'x-wav')
+       {
                header('Content-Type: audio/' . $mimeType);
                header('Content-Transfer-Encoding: binary');
                header('Content-Length: ' . strlen($audioContent));
@@ -177,5 +179,4 @@ class AbstractPlayFormat implements \TYPO3\CMS\Extbase\Mvc\View\ViewInterface {
                header('Pragma: no-cache');
                header('Cache-Control: no-cache, no-store, must-revalidate');
        }
-}
-?>
\ No newline at end of file
+}
\ No newline at end of file