/** * この NodeList に実際に追加される値を返します. * * @param mixed $var * @return Component|array 追加されるノード (またはノードの配列) */ private function getAppendee($var) { if ($var instanceof None) { return null; } if ($var instanceof Node) { return $var; } if ($var instanceof Container) { return $var->getChildNodes(); } if (is_array($var)) { $result = array(); foreach ($var as $i) { $appendee = $this->getAppendee($i); if (is_array($appendee)) { $result = array_merge($result, $appendee); } else { $result[] = $appendee; } } return $result; } if (!isset($var)) { return null; } return new Text(Values::stringValue($var)); }
/** * 引数の値をノードに変換します. このメソッドは {@link HelperObject} * から参照されます. エンドユーザーが直接使う機会はありません. * 返り値は, 引数によって以下のようになります. * * - {@link Node} 型オブジェクトの場合: 引数自身 * - {@link NodeList} 型オブジェクトの場合: 引数自身 * - {@link HelperObject} 型オブジェクトの場合: 引数のオブジェクトがラップしているノード * - 文字列の場合: 引数の文字列を要素名に持つ新しい {@link Element} * - null または空文字列の場合: 空の {@link NodeList} * - 上記に当てはまらない場合: 引数の文字列表現をあらわす {@link Text} ノード * * @param mixed $var 変換対象の値 * @return Component 変換後のノード * @ignore */ public function createNode($var) { if ($var instanceof Node) { return $var; } if ($var instanceof NodeList) { return $var; } if ($var instanceof HelperObject) { return $var->getNode(); } if (is_string($var) && strlen($var)) { return $this->createElement($var); } $nodeName = Values::stringValue($var); return strlen($nodeName) ? new Text($nodeName) : new NodeList(); }
/** * 指定された引数で Renderer オブジェクトを初期化します. * * @see Renderer::setRenderer() * @param Renderer|string $var * @return Renderer * @throws \InvalidArgumentException */ private function initRenderer($var) { if ($var instanceof Renderer) { return $var; } if ($var === null) { return null; } $type = strtolower(Values::stringValue($var)); $xmlList = array("xml", "xhtml"); if (in_array($type, $xmlList)) { return XmlRenderer::getInstance(); } $sgmlList = array("sgml", "html"); if (in_array($type, $sgmlList)) { return SgmlRenderer::getInstance(); } throw new \InvalidArgumentException("Invalid type name: {$type}."); }
/** * 年・月・日・時・分・秒の各フィールドからハッシュ値を算出します. * * @param mixed $var * @return int ハッシュ値 * @throws \InvalidArgumentException 引数が Time インスタンスでなかった場合 */ public function hashCode($var) { if (!$var instanceof Time) { $type = Values::getType($var); throw new \InvalidArgumentException("The value must be Time instance.({$type})"); } return $var->get("year") + $var->get("month") * 31 + $var->get("date") * 961 + $var->get("hour") * 29791 + $var->get("minute") * 923521 + $var->get("second") * 28629151; // 31^5 }
/** * 引数の文字列から UTF-8 として不適切なシーケンスを除去します. * * @param string $var 文字列 * @return string 不正なシーケンスを除去した結果 */ private static function cleanString($var) { // @codeCoverageIgnoreStart static $utf8Codec = null; if ($utf8Codec === null) { $utf8Codec = new Utf8Codec(); } // @codeCoverageIgnoreEnd $str = Values::stringValue($var); return $utf8Codec->encode($utf8Codec->decode($str)); }
/** * 引数の文字列を整形済テキストとする Code オブジェクトを生成します. * @param string $text 整形済テキスト */ public function __construct($text) { $this->text = Values::stringValue($text); }
/** * 指定された時差 (分単位) の値が妥当かどうかを調べ, 必要に応じて値を丸めた結果を返します. * 世界で実際に使用されているタイムゾーンは UTC-12 から UTC+14 ですが, * このメソッドでは -23:45 から +23:45 を妥当なタイムゾーンとみなします. * もしも -23:45 以前の時差が指定された場合は -23:45 (1425), * +23:45 以降の時差が指定された場合は +23:45 (-1425) に丸めた結果を返します. * * もしも NULL が指定された場合は {@link Util::getTimeZoneOffset} の結果を返します. * それ以外の数値以外の値が指定された場合は, 整数にキャストした値を使用します. * * @param int $offset * @return int 引数を -1425 以上 1425 以下に丸めた値 */ public static function cleanTimeZoneOffset($offset) { return isset($offset) ? Values::intValue($offset, -1425, 1425) : Util::getTimeZoneOffset(); }
/** * 指定された prefix と suffix を持つ Comment オブジェクトを構築します. * prefix と suffix は, 主に条件付きコメントの先頭 ("[if IE 6]>" など) と * 末尾 ("<![endif]" など) に使用されます. * 引数を指定しない場合は通常のコメントノードを生成します. * * @param string $prefix コメントの冒頭 ("[if IE 6]>" など) * @param string $suffix コメントの末尾 ("<![endif]" など) */ public function __construct($prefix = "", $suffix = "") { $this->nodeList = new NodeList(null, $this); $this->prefix = Values::stringValue($prefix); $this->suffix = Values::stringValue($suffix); }
/** * この時間オブジェクトの複数のフィールドを一度に上書きします. * 引数には, * <code> * array("year" => 2010, "month" => 8, "date" => 31) * </code> * などの配列か, または同様の Map オブジェクトを指定してください. * * @param Map|array $subject フィールドと値の一覧 * @return Time 設定後の時間オブジェクト * @throws \InvalidArgumentException 引数の型が不正な場合 */ public final function setAll($subject) { if (is_array($subject)) { $subject = new ArrayMap($subject); } if (!$subject instanceof Map) { throw new \InvalidArgumentException("Argument (" . Values::getType($subject) . ") must be array or \\Peach\\Util\\Map"); } $newFields = new ArrayMap($this->fields); $entryList = $subject->entryList(); foreach ($entryList as $entry) { $index = $this->getFieldIndex($entry->getKey()); $newFields->put($index, $entry->getValue()); } return $this->newInstance($newFields); }
/** * encode() の本体の処理です. * 指定された値がスカラー型 (null, 真偽値, 数値, 文字列), 配列, オブジェクトのいずれかにも該当しない場合, * 文字列にキャストした結果をエンコードします. * * @param mixed $var 変換対象の値 * @return string JSON 文字列 * @ignore */ public function encodeValue($var) { if ($var === null) { return "null"; } if ($var === true) { return "true"; } if ($var === false) { return "false"; } if (is_float($var)) { return $this->encodeFloat($var); } if (is_integer($var)) { return strval($var); } if (is_string($var)) { return is_numeric($var) ? $this->encodeNumeric($var) : $this->encodeString($var); } if (is_array($var)) { return $this->checkKeySequence($var) ? $this->encodeArray($var) : $this->encodeObject($var); } if (is_object($var)) { $arr = (array) $var; return $this->encodeValue($arr); } return $this->encodeValue(Values::stringValue($var)); }