CRM_Upgrade_Form - Move number/label mapping to CRM_Utils_EnglishNumber
authorTim Otten <totten@civicrm.org>
Tue, 27 Feb 2018 22:23:34 +0000 (14:23 -0800)
committerTim Otten <totten@civicrm.org>
Tue, 27 Feb 2018 22:33:49 +0000 (14:33 -0800)
CRM/Upgrade/Form.php
CRM/Utils/EnglishNumber.php [new file with mode: 0644]

index b0b7a3d852c67e5df6d671bcbbdf17ec8439f522..8dc18bf48439beeede075e52fc0367aa3b842159 100644 (file)
@@ -68,24 +68,6 @@ class CRM_Upgrade_Form extends CRM_Core_Form {
    */
   public $locales;
 
-  /**
-   * Number to string mapper.
-   *
-   * @var array
-   */
-  static $_numberMap = array(
-    0 => 'Zero',
-    1 => 'One',
-    2 => 'Two',
-    3 => 'Three',
-    4 => 'Four',
-    5 => 'Five',
-    6 => 'Six',
-    7 => 'Seven',
-    8 => 'Eight',
-    9 => 'Nine',
-  );
-
   /**
    * Constructor for the basic form page.
    *
@@ -137,7 +119,7 @@ class CRM_Upgrade_Form extends CRM_Core_Form {
     static $incrementalPhpObject = array();
 
     $versionParts = explode('.', $version);
-    $versionName = self::$_numberMap[$versionParts[0]] . self::$_numberMap[$versionParts[1]];
+    $versionName = CRM_Utils_EnglishNumber::toCamelCase($versionParts[0]) . CRM_Utils_EnglishNumber::toCamelCase($versionParts[1]);
 
     if (!array_key_exists($versionName, $incrementalPhpObject)) {
       $className = "CRM_Upgrade_Incremental_php_{$versionName}";
diff --git a/CRM/Utils/EnglishNumber.php b/CRM/Utils/EnglishNumber.php
new file mode 100644 (file)
index 0000000..3673ece
--- /dev/null
@@ -0,0 +1,143 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.7                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2017                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM 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 Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC (c) 2004-2017
+ * $Id$
+ *
+ * Utilities for rendering numbers as English.
+ *
+ * Note: This file may be used in a standalone environment. Please ensure it
+ * remains self-sufficient (without needing any external services).
+ */
+class CRM_Utils_EnglishNumber {
+
+  protected static $lowNumbers = array(
+    'Zero',
+    'One',
+    'Two',
+    'Three',
+    'Four',
+    'Five',
+    'Six',
+    'Seven',
+    'Eight',
+    'Nine',
+    'Ten',
+    'Eleven',
+    'Twelve',
+    'Thirteen',
+    'Fourteen',
+    'Fifteen',
+    'Sixteen',
+    'Seventeen',
+    'Eighteen',
+    'Nineteen',
+  );
+
+  protected static $intervalsOfTen = array(
+    9 => 'Ninety',
+    8 => 'Eighty',
+    7 => 'Seventy',
+    6 => 'Sixty',
+    5 => 'Fifty',
+    4 => 'Forty',
+    3 => 'Thirty',
+    2 => 'Twenty',
+  );
+
+  /**
+   * @param int $num
+   *   Ex: 12 or 54.
+   * @param mixed $default
+   *   The default value to return if we cannot determine an English representation.
+   *   If omitted or NULL, throws an exception.
+   *   Tip: If you want to support high values as numerals, just pass the number again.
+   * @return string
+   *   Ex: 'Twelve' or 'FiftyFour'.
+   */
+  public static function toCamelCase($num, $default = NULL) {
+    if (isset(self::$lowNumbers[$num])) {
+      return self::$lowNumbers[$num];
+    }
+
+    $tens = (int) ($num / 10);
+    $last = $num % 10;
+    if (isset(self::$intervalsOfTen[$tens])) {
+      if ($last == 0) {
+        return self::$intervalsOfTen[$tens];
+      }
+      else {
+        return self::$intervalsOfTen[$tens] . self::$lowNumbers[$last];
+      }
+    }
+
+    if ($default === NULL) {
+      throw new \RuntimeException("Cannot convert number to English: " . (int) $num);
+    }
+    else {
+      return $default;
+    }
+  }
+
+  /**
+   * @param int $num
+   *   Ex: 12 or 54.
+   * @param mixed $default
+   *   The default value to return if we cannot determine an English representation.
+   *   If omitted or NULL, throws an exception.
+   *   Tip: If you want to support high values as numerals, just pass the number again.
+   * @return string
+   *   Ex: 'twelve' or 'fifty-four'.
+   */
+  public static function toHyphen($num, $default = NULL) {
+    if (isset(self::$lowNumbers[$num])) {
+      return strtolower(self::$lowNumbers[$num]);
+    }
+
+    $tens = (int) ($num / 10);
+    $last = $num % 10;
+    if (isset(self::$intervalsOfTen[$tens])) {
+      if ($last == 0) {
+        return strtolower(self::$intervalsOfTen[$tens]);
+      }
+      else {
+        return strtolower(self::$intervalsOfTen[$tens]) . '-' . strtolower(self::$lowNumbers[$last]);
+      }
+    }
+
+    if ($default === NULL) {
+      throw new \RuntimeException("Cannot convert number to English: " . (int) $num);
+    }
+    else {
+      return $default;
+    }
+  }
+
+}