From ef9034f4cf5de7e720680011f04c1e4dae93ffe6 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 22 Aug 2016 15:49:44 +0200 Subject: [PATCH] added controller that helps with finding unprintable characters in the guide --- build/controllers/Utf8Controller.php | 120 +++++++++++++++++++++++++ docs/guide-fr/structure-controllers.md | 2 +- 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 build/controllers/Utf8Controller.php diff --git a/build/controllers/Utf8Controller.php b/build/controllers/Utf8Controller.php new file mode 100644 index 0000000000..2a73737c02 --- /dev/null +++ b/build/controllers/Utf8Controller.php @@ -0,0 +1,120 @@ + + */ +class Utf8Controller extends Controller +{ + public $defaultAction = 'check-guide'; + + /** + * Check guide for non-printable characters that may break docs generation. + * + * @param string $directory the directory to check. If not specified, the default + * guide directory will be checked. + */ + public function actionCheckGuide($directory = null) + { + if ($directory === null) { + $directory = dirname(dirname(__DIR__)) . '/docs'; + } + $files = FileHelper::findFiles($directory, [ + 'only' => ['*.md'], + ]); + + foreach($files as $file) { + + $content = file_get_contents($file); + $chars = preg_split('//u', $content, null, PREG_SPLIT_NO_EMPTY); + + $line = 1; + $pos = 0; + foreach($chars as $c) { + + $ord = $this->unicodeOrd($c); + + $pos++; + if ($ord == 0x000A) { + $line++; + $pos = 0; + } + + if ($ord === false) { + $this->found("BROKEN UTF8", $c, $line, $pos, $file); + continue; + } + + // http://unicode-table.com/en/blocks/general-punctuation/ + if (0x2000 <= $ord && $ord <= 0x200F + || 0x2028 <= $ord && $ord <= 0x202E + || 0x205f <= $ord && $ord <= 0x206F + ) { + $this->found("UNSUPPORTED SPACE CHARACTER", $c, $line, $pos, $file); + } + if ($ord < 0x0020 && $ord != 0x000A && $ord != 0x0009 || + 0x0080 <= $ord && $ord < 0x009F) { + $this->found("CONTROL CHARARCTER", $c, $line, $pos, $file); + } + + } + } + + } + + private $_foundFiles = []; + + private function found($what, $char, $line, $pos, $file) + { + if (!isset($this->_foundFiles[$file])) { + $this->stdout("$file: \n", Console::BOLD); + $this->_foundFiles[$file] = $file; + } + + $hexcode = dechex($this->unicodeOrd($char)); + $hexcode = str_repeat('0', max(4 - strlen($hexcode), 0)) . $hexcode; + + $this->stdout(" at $line:$pos FOUND $what: 0x$hexcode '$char' http://unicode-table.com/en/$hexcode/\n"); + } + + /** + * Equvalent for ord() just for unicode + * + * http://stackoverflow.com/a/10333324/1106908 + * + * @param $c + * @return bool|int + */ + private function unicodeOrd($c) + { + $h = ord($c{0}); + if ($h <= 0x7F) { + return $h; + } else if ($h < 0xC2) { + return false; + } else if ($h <= 0xDF) { + return ($h & 0x1F) << 6 | (ord($c{1}) & 0x3F); + } else if ($h <= 0xEF) { + return ($h & 0x0F) << 12 | (ord($c{1}) & 0x3F) << 6 + | (ord($c{2}) & 0x3F); + } else if ($h <= 0xF4) { + return ($h & 0x0F) << 18 | (ord($c{1}) & 0x3F) << 12 + | (ord($c{2}) & 0x3F) << 6 + | (ord($c{3}) & 0x3F); + } else { + return false; + } + } +} diff --git a/docs/guide-fr/structure-controllers.md b/docs/guide-fr/structure-controllers.md index 9c0c7d851c..004a2280b8 100644 --- a/docs/guide-fr/structure-controllers.md +++ b/docs/guide-fr/structure-controllers.md @@ -339,7 +339,7 @@ Lors du traitement d'une requête, une [application](structure-applications.md) 1. La méthode [[yii\base\Controller::init()]] est appelée après que le contrôleur est créé et configuré. 2. Le contrôleur crée un objet *action* en se basant sur l'identifiant d'action de la requête : * Si l'identifiant de l'action n'est pas spécifié, l'[[yii\base\Controller::defaultAction|identifiant de l'action par défaut]] est utilisé. - * Si l'identifiant de l'action est trouvé dans la [yii\base\Controller::actions()|table de mise en correspondance des actions]], une action autonome est créée. + * Si l'identifiant de l'action est trouvé dans la [[yii\base\Controller::actions()|table de mise en correspondance des actions]], une action autonome est créée. * Si l'identifiant de l'action est trouvé et qu'il correspond à une méthode d'action, une action en ligne est créée. * Dans les autres cas, une exception [[yii\base\InvalidRouteException]] est levée. 3. Le contrôleur appelle consécutivement la méthode `beforeAction()` de l'application, celle du module (si module si le contrôleur appartient à un module) et celle du contrôleur.