summaryrefslogtreecommitdiff
path: root/kohana/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'kohana/helpers')
-rw-r--r--kohana/helpers/arr.php291
-rw-r--r--kohana/helpers/cookie.php84
-rw-r--r--kohana/helpers/date.php399
-rw-r--r--kohana/helpers/download.php105
-rw-r--r--kohana/helpers/email.php181
-rw-r--r--kohana/helpers/expires.php110
-rw-r--r--kohana/helpers/feed.php116
-rw-r--r--kohana/helpers/file.php177
-rw-r--r--kohana/helpers/form.php526
-rw-r--r--kohana/helpers/format.php66
-rw-r--r--kohana/helpers/html.php400
-rw-r--r--kohana/helpers/inflector.php193
-rw-r--r--kohana/helpers/num.php26
-rw-r--r--kohana/helpers/remote.php66
-rw-r--r--kohana/helpers/request.php217
-rw-r--r--kohana/helpers/security.php47
-rw-r--r--kohana/helpers/text.php389
-rw-r--r--kohana/helpers/upload.php162
-rw-r--r--kohana/helpers/url.php247
-rw-r--r--kohana/helpers/valid.php313
20 files changed, 0 insertions, 4115 deletions
diff --git a/kohana/helpers/arr.php b/kohana/helpers/arr.php
deleted file mode 100644
index b0592347..00000000
--- a/kohana/helpers/arr.php
+++ /dev/null
@@ -1,291 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Array helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class arr_Core {
-
- /**
- * Return a callback array from a string, eg: limit[10,20] would become
- * array('limit', array('10', '20'))
- *
- * @param string callback string
- * @return array
- */
- public static function callback_string($str)
- {
- // command[param,param]
- if (preg_match('/([^\[]*+)\[(.+)\]/', (string) $str, $match))
- {
- // command
- $command = $match[1];
-
- // param,param
- $params = preg_split('/(?<!\\\\),/', $match[2]);
- $params = str_replace('\,', ',', $params);
- }
- else
- {
- // command
- $command = $str;
-
- // No params
- $params = NULL;
- }
-
- return array($command, $params);
- }
-
- /**
- * Rotates a 2D array clockwise.
- * Example, turns a 2x3 array into a 3x2 array.
- *
- * @param array array to rotate
- * @param boolean keep the keys in the final rotated array. the sub arrays of the source array need to have the same key values.
- * if your subkeys might not match, you need to pass FALSE here!
- * @return array
- */
- public static function rotate($source_array, $keep_keys = TRUE)
- {
- $new_array = array();
- foreach ($source_array as $key => $value)
- {
- $value = ($keep_keys === TRUE) ? $value : array_values($value);
- foreach ($value as $k => $v)
- {
- $new_array[$k][$key] = $v;
- }
- }
-
- return $new_array;
- }
-
- /**
- * Removes a key from an array and returns the value.
- *
- * @param string key to return
- * @param array array to work on
- * @return mixed value of the requested array key
- */
- public static function remove($key, & $array)
- {
- if ( ! array_key_exists($key, $array))
- return NULL;
-
- $val = $array[$key];
- unset($array[$key]);
-
- return $val;
- }
-
-
- /**
- * Extract one or more keys from an array. Each key given after the first
- * argument (the array) will be extracted. Keys that do not exist in the
- * search array will be NULL in the extracted data.
- *
- * @param array array to search
- * @param string key name
- * @return array
- */
- public static function extract(array $search, $keys)
- {
- // Get the keys, removing the $search array
- $keys = array_slice(func_get_args(), 1);
-
- $found = array();
- foreach ($keys as $key)
- {
- if (isset($search[$key]))
- {
- $found[$key] = $search[$key];
- }
- else
- {
- $found[$key] = NULL;
- }
- }
-
- return $found;
- }
-
- /**
- * Because PHP does not have this function.
- *
- * @param array array to unshift
- * @param string key to unshift
- * @param mixed value to unshift
- * @return array
- */
- public static function unshift_assoc( array & $array, $key, $val)
- {
- $array = array_reverse($array, TRUE);
- $array[$key] = $val;
- $array = array_reverse($array, TRUE);
-
- return $array;
- }
-
- /**
- * Because PHP does not have this function, and array_walk_recursive creates
- * references in arrays and is not truly recursive.
- *
- * @param mixed callback to apply to each member of the array
- * @param array array to map to
- * @return array
- */
- public static function map_recursive($callback, array $array)
- {
- foreach ($array as $key => $val)
- {
- // Map the callback to the key
- $array[$key] = is_array($val) ? arr::map_recursive($callback, $val) : call_user_func($callback, $val);
- }
-
- return $array;
- }
-
- /**
- * Binary search algorithm.
- *
- * @param mixed the value to search for
- * @param array an array of values to search in
- * @param boolean return false, or the nearest value
- * @param mixed sort the array before searching it
- * @return integer
- */
- public static function binary_search($needle, $haystack, $nearest = FALSE, $sort = FALSE)
- {
- if ($sort === TRUE)
- {
- sort($haystack);
- }
-
- $high = count($haystack);
- $low = 0;
-
- while ($high - $low > 1)
- {
- $probe = ($high + $low) / 2;
- if ($haystack[$probe] < $needle)
- {
- $low = $probe;
- }
- else
- {
- $high = $probe;
- }
- }
-
- if ($high == count($haystack) OR $haystack[$high] != $needle)
- {
- if ($nearest === FALSE)
- return FALSE;
-
- // return the nearest value
- $high_distance = $haystack[ceil($low)] - $needle;
- $low_distance = $needle - $haystack[floor($low)];
-
- return ($high_distance >= $low_distance) ? $haystack[ceil($low)] : $haystack[floor($low)];
- }
-
- return $high;
- }
-
- /**
- * Emulates array_merge_recursive, but appends numeric keys and replaces
- * associative keys, instead of appending all keys.
- *
- * @param array any number of arrays
- * @return array
- */
- public static function merge()
- {
- $total = func_num_args();
-
- $result = array();
- for ($i = 0; $i < $total; $i++)
- {
- foreach (func_get_arg($i) as $key => $val)
- {
- if (isset($result[$key]))
- {
- if (is_array($val))
- {
- // Arrays are merged recursively
- $result[$key] = arr::merge($result[$key], $val);
- }
- elseif (is_int($key))
- {
- // Indexed arrays are appended
- array_push($result, $val);
- }
- else
- {
- // Associative arrays are replaced
- $result[$key] = $val;
- }
- }
- else
- {
- // New values are added
- $result[$key] = $val;
- }
- }
- }
-
- return $result;
- }
-
- /**
- * Overwrites an array with values from input array(s).
- * Non-existing keys will not be appended!
- *
- * @param array key array
- * @param array input array(s) that will overwrite key array values
- * @return array
- */
- public static function overwrite($array1)
- {
- foreach (array_slice(func_get_args(), 1) as $array2)
- {
- foreach ($array2 as $key => $value)
- {
- if (array_key_exists($key, $array1))
- {
- $array1[$key] = $value;
- }
- }
- }
-
- return $array1;
- }
-
- /**
- * Fill an array with a range of numbers.
- *
- * @param integer stepping
- * @param integer ending number
- * @return array
- */
- public static function range($step = 10, $max = 100)
- {
- if ($step < 1)
- return array();
-
- $array = array();
- for ($i = $step; $i <= $max; $i += $step)
- {
- $array[$i] = $i;
- }
-
- return $array;
- }
-
-} // End arr \ No newline at end of file
diff --git a/kohana/helpers/cookie.php b/kohana/helpers/cookie.php
deleted file mode 100644
index d10c6966..00000000
--- a/kohana/helpers/cookie.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Cookie helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class cookie_Core {
-
- /**
- * Sets a cookie with the given parameters.
- *
- * @param string cookie name or array of config options
- * @param string cookie value
- * @param integer number of seconds before the cookie expires
- * @param string URL path to allow
- * @param string URL domain to allow
- * @param boolean HTTPS only
- * @param boolean HTTP only (requires PHP 5.2 or higher)
- * @return boolean
- */
- public static function set($name, $value = NULL, $expire = NULL, $path = NULL, $domain = NULL, $secure = NULL, $httponly = NULL)
- {
- if (headers_sent())
- return FALSE;
-
- // If the name param is an array, we import it
- is_array($name) and extract($name, EXTR_OVERWRITE);
-
- // Fetch default options
- $config = Kohana::config('cookie');
-
- foreach (array('value', 'expire', 'domain', 'path', 'secure', 'httponly') as $item)
- {
- if ($$item === NULL AND isset($config[$item]))
- {
- $$item = $config[$item];
- }
- }
-
- // Expiration timestamp
- $expire = ($expire == 0) ? 0 : time() + (int) $expire;
-
- return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
- }
-
- /**
- * Fetch a cookie value, using the Input library.
- *
- * @param string cookie name
- * @param mixed default value
- * @param boolean use XSS cleaning on the value
- * @return string
- */
- public static function get($name, $default = NULL, $xss_clean = FALSE)
- {
- return Input::instance()->cookie($name, $default, $xss_clean);
- }
-
- /**
- * Nullify and unset a cookie.
- *
- * @param string cookie name
- * @param string URL path
- * @param string URL domain
- * @return boolean
- */
- public static function delete($name, $path = NULL, $domain = NULL)
- {
- if ( ! isset($_COOKIE[$name]))
- return FALSE;
-
- // Delete the cookie from globals
- unset($_COOKIE[$name]);
-
- // Sets the cookie value to an empty string, and the expiration to 24 hours ago
- return cookie::set($name, '', -86400, $path, $domain, FALSE, FALSE);
- }
-
-} // End cookie \ No newline at end of file
diff --git a/kohana/helpers/date.php b/kohana/helpers/date.php
deleted file mode 100644
index c6607009..00000000
--- a/kohana/helpers/date.php
+++ /dev/null
@@ -1,399 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Date helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class date_Core {
-
- /**
- * Converts a UNIX timestamp to DOS format.
- *
- * @param integer UNIX timestamp
- * @return integer
- */
- public static function unix2dos($timestamp = FALSE)
- {
- $timestamp = ($timestamp === FALSE) ? getdate() : getdate($timestamp);
-
- if ($timestamp['year'] < 1980)
- {
- return (1 << 21 | 1 << 16);
- }
-
- $timestamp['year'] -= 1980;
-
- // What voodoo is this? I have no idea... Geert can explain it though,
- // and that's good enough for me.
- return ($timestamp['year'] << 25 | $timestamp['mon'] << 21 |
- $timestamp['mday'] << 16 | $timestamp['hours'] << 11 |
- $timestamp['minutes'] << 5 | $timestamp['seconds'] >> 1);
- }
-
- /**
- * Converts a DOS timestamp to UNIX format.
- *
- * @param integer DOS timestamp
- * @return integer
- */
- public static function dos2unix($timestamp = FALSE)
- {
- $sec = 2 * ($timestamp & 0x1f);
- $min = ($timestamp >> 5) & 0x3f;
- $hrs = ($timestamp >> 11) & 0x1f;
- $day = ($timestamp >> 16) & 0x1f;
- $mon = ($timestamp >> 21) & 0x0f;
- $year = ($timestamp >> 25) & 0x7f;
-
- return mktime($hrs, $min, $sec, $mon, $day, $year + 1980);
- }
-
- /**
- * Returns the offset (in seconds) between two time zones.
- * @see http://php.net/timezones
- *
- * @param string timezone that to find the offset of
- * @param string|boolean timezone used as the baseline
- * @return integer
- */
- public static function offset($remote, $local = TRUE)
- {
- static $offsets;
-
- // Default values
- $remote = (string) $remote;
- $local = ($local === TRUE) ? date_default_timezone_get() : (string) $local;
-
- // Cache key name
- $cache = $remote.$local;
-
- if (empty($offsets[$cache]))
- {
- // Create timezone objects
- $remote = new DateTimeZone($remote);
- $local = new DateTimeZone($local);
-
- // Create date objects from timezones
- $time_there = new DateTime('now', $remote);
- $time_here = new DateTime('now', $local);
-
- // Find the offset
- $offsets[$cache] = $remote->getOffset($time_there) - $local->getOffset($time_here);
- }
-
- return $offsets[$cache];
- }
-
- /**
- * Number of seconds in a minute, incrementing by a step.
- *
- * @param integer amount to increment each step by, 1 to 30
- * @param integer start value
- * @param integer end value
- * @return array A mirrored (foo => foo) array from 1-60.
- */
- public static function seconds($step = 1, $start = 0, $end = 60)
- {
- // Always integer
- $step = (int) $step;
-
- $seconds = array();
-
- for ($i = $start; $i < $end; $i += $step)
- {
- $seconds[$i] = ($i < 10) ? '0'.$i : $i;
- }
-
- return $seconds;
- }
-
- /**
- * Number of minutes in an hour, incrementing by a step.
- *
- * @param integer amount to increment each step by, 1 to 30
- * @return array A mirrored (foo => foo) array from 1-60.
- */
- public static function minutes($step = 5)
- {
- // Because there are the same number of minutes as seconds in this set,
- // we choose to re-use seconds(), rather than creating an entirely new
- // function. Shhhh, it's cheating! ;) There are several more of these
- // in the following methods.
- return date::seconds($step);
- }
-
- /**
- * Number of hours in a day.
- *
- * @param integer amount to increment each step by
- * @param boolean use 24-hour time
- * @param integer the hour to start at
- * @return array A mirrored (foo => foo) array from start-12 or start-23.
- */
- public static function hours($step = 1, $long = FALSE, $start = NULL)
- {
- // Default values
- $step = (int) $step;
- $long = (bool) $long;
- $hours = array();
-
- // Set the default start if none was specified.
- if ($start === NULL)
- {
- $start = ($long === FALSE) ? 1 : 0;
- }
-
- $hours = array();
-
- // 24-hour time has 24 hours, instead of 12
- $size = ($long === TRUE) ? 23 : 12;
-
- for ($i = $start; $i <= $size; $i += $step)
- {
- $hours[$i] = $i;
- }
-
- return $hours;
- }
-
- /**
- * Returns AM or PM, based on a given hour.
- *
- * @param integer number of the hour
- * @return string
- */
- public static function ampm($hour)
- {
- // Always integer
- $hour = (int) $hour;
-
- return ($hour > 11) ? 'PM' : 'AM';
- }
-
- /**
- * Adjusts a non-24-hour number into a 24-hour number.
- *
- * @param integer hour to adjust
- * @param string AM or PM
- * @return string
- */
- public static function adjust($hour, $ampm)
- {
- $hour = (int) $hour;
- $ampm = strtolower($ampm);
-
- switch ($ampm)
- {
- case 'am':
- if ($hour == 12)
- $hour = 0;
- break;
- case 'pm':
- if ($hour < 12)
- $hour += 12;
- break;
- }
-
- return sprintf('%02s', $hour);
- }
-
- /**
- * Number of days in month.
- *
- * @param integer number of month
- * @param integer number of year to check month, defaults to the current year
- * @return array A mirrored (foo => foo) array of the days.
- */
- public static function days($month, $year = FALSE)
- {
- static $months;
-
- // Always integers
- $month = (int) $month;
- $year = (int) $year;
-
- // Use the current year by default
- $year = ($year == FALSE) ? date('Y') : $year;
-
- // We use caching for months, because time functions are used
- if (empty($months[$year][$month]))
- {
- $months[$year][$month] = array();
-
- // Use date to find the number of days in the given month
- $total = date('t', mktime(1, 0, 0, $month, 1, $year)) + 1;
-
- for ($i = 1; $i < $total; $i++)
- {
- $months[$year][$month][$i] = $i;
- }
- }
-
- return $months[$year][$month];
- }
-
- /**
- * Number of months in a year
- *
- * @return array A mirrored (foo => foo) array from 1-12.
- */
- public static function months()
- {
- return date::hours();
- }
-
- /**
- * Returns an array of years between a starting and ending year.
- * Uses the current year +/- 5 as the max/min.
- *
- * @param integer starting year
- * @param integer ending year
- * @return array
- */
- public static function years($start = FALSE, $end = FALSE)
- {
- // Default values
- $start = ($start === FALSE) ? date('Y') - 5 : (int) $start;
- $end = ($end === FALSE) ? date('Y') + 5 : (int) $end;
-
- $years = array();
-
- // Add one, so that "less than" works
- $end += 1;
-
- for ($i = $start; $i < $end; $i++)
- {
- $years[$i] = $i;
- }
-
- return $years;
- }
-
- /**
- * Returns time difference between two timestamps, in human readable format.
- *
- * @param integer timestamp
- * @param integer timestamp, defaults to the current time
- * @param string formatting string
- * @return string|array
- */
- public static function timespan($time1, $time2 = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds')
- {
- // Array with the output formats
- $output = preg_split('/[^a-z]+/', strtolower((string) $output));
-
- // Invalid output
- if (empty($output))
- return FALSE;
-
- // Make the output values into keys
- extract(array_flip($output), EXTR_SKIP);
-
- // Default values
- $time1 = max(0, (int) $time1);
- $time2 = empty($time2) ? time() : max(0, (int) $time2);
-
- // Calculate timespan (seconds)
- $timespan = abs($time1 - $time2);
-
- // All values found using Google Calculator.
- // Years and months do not match the formula exactly, due to leap years.
-
- // Years ago, 60 * 60 * 24 * 365
- isset($years) and $timespan -= 31556926 * ($years = (int) floor($timespan / 31556926));
-
- // Months ago, 60 * 60 * 24 * 30
- isset($months) and $timespan -= 2629744 * ($months = (int) floor($timespan / 2629743.83));
-
- // Weeks ago, 60 * 60 * 24 * 7
- isset($weeks) and $timespan -= 604800 * ($weeks = (int) floor($timespan / 604800));
-
- // Days ago, 60 * 60 * 24
- isset($days) and $timespan -= 86400 * ($days = (int) floor($timespan / 86400));
-
- // Hours ago, 60 * 60
- isset($hours) and $timespan -= 3600 * ($hours = (int) floor($timespan / 3600));
-
- // Minutes ago, 60
- isset($minutes) and $timespan -= 60 * ($minutes = (int) floor($timespan / 60));
-
- // Seconds ago, 1
- isset($seconds) and $seconds = $timespan;
-
- // Remove the variables that cannot be accessed
- unset($timespan, $time1, $time2);
-
- // Deny access to these variables
- $deny = array_flip(array('deny', 'key', 'difference', 'output'));
-
- // Return the difference
- $difference = array();
- foreach ($output as $key)
- {
- if (isset($$key) AND ! isset($deny[$key]))
- {
- // Add requested key to the output
- $difference[$key] = $$key;
- }
- }
-
- // Invalid output formats string
- if (empty($difference))
- return FALSE;
-
- // If only one output format was asked, don't put it in an array
- if (count($difference) === 1)
- return current($difference);
-
- // Return array
- return $difference;
- }
-
- /**
- * Returns time difference between two timestamps, in the format:
- * N year, N months, N weeks, N days, N hours, N minutes, and N seconds ago
- *
- * @param integer timestamp
- * @param integer timestamp, defaults to the current time
- * @param string formatting string
- * @return string
- */
- public static function timespan_string($time1, $time2 = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds')
- {
- if ($difference = date::timespan($time1, $time2, $output) AND is_array($difference))
- {
- // Determine the key of the last item in the array
- $last = end($difference);
- $last = key($difference);
-
- $span = array();
- foreach ($difference as $name => $amount)
- {
- if ($name !== $last AND $amount === 0)
- {
- // Skip empty amounts
- continue;
- }
-
- // Add the amount to the span
- $span[] = ($name === $last ? ' and ' : ', ').$amount.' '.($amount === 1 ? inflector::singular($name) : $name);
- }
-
- // Replace difference by making the span into a string
- $difference = trim(implode('', $span), ',');
- }
- elseif (is_int($difference))
- {
- // Single-value return
- $difference = $difference.' '.($difference === 1 ? inflector::singular($output) : $output);
- }
-
- return $difference;
- }
-
-} // End date \ No newline at end of file
diff --git a/kohana/helpers/download.php b/kohana/helpers/download.php
deleted file mode 100644
index 9151208f..00000000
--- a/kohana/helpers/download.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Download helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class download_Core {
-
- /**
- * Force a download of a file to the user's browser. This function is
- * binary-safe and will work with any MIME type that Kohana is aware of.
- *
- * @param string a file path or file name
- * @param mixed data to be sent if the filename does not exist
- * @param string suggested filename to display in the download
- * @return void
- */
- public static function force($filename = NULL, $data = NULL, $nicename = NULL)
- {
- if (empty($filename))
- return FALSE;
-
- if (is_file($filename))
- {
- // Get the real path
- $filepath = str_replace('\\', '/', realpath($filename));
-
- // Set filesize
- $filesize = filesize($filepath);
-
- // Get filename
- $filename = substr(strrchr('/'.$filepath, '/'), 1);
-
- // Get extension
- $extension = strtolower(substr(strrchr($filepath, '.'), 1));
- }
- else
- {
- // Get filesize
- $filesize = strlen($data);
-
- // Make sure the filename does not have directory info
- $filename = substr(strrchr('/'.$filename, '/'), 1);
-
- // Get extension
- $extension = strtolower(substr(strrchr($filename, '.'), 1));
- }
-
- // Get the mime type of the file
- $mime = Kohana::config('mimes.'.$extension);
-
- if (empty($mime))
- {
- // Set a default mime if none was found
- $mime = array('application/octet-stream');
- }
-
- // Generate the server headers
- header('Content-Type: '.$mime[0]);
- header('Content-Disposition: attachment; filename="'.(empty($nicename) ? $filename : $nicename).'"');
- header('Content-Transfer-Encoding: binary');
- header('Content-Length: '.sprintf('%d', $filesize));
-
- // More caching prevention
- header('Expires: 0');
-
- if (Kohana::user_agent('browser') === 'Internet Explorer')
- {
- // Send IE headers
- header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
- header('Pragma: public');
- }
- else
- {
- // Send normal headers
- header('Pragma: no-cache');
- }
-
- // Clear the output buffer
- Kohana::close_buffers(FALSE);
-
- if (isset($filepath))
- {
- // Open the file
- $handle = fopen($filepath, 'rb');
-
- // Send the file data
- fpassthru($handle);
-
- // Close the file
- fclose($handle);
- }
- else
- {
- // Send the file data
- echo $data;
- }
- }
-
-} // End download \ No newline at end of file
diff --git a/kohana/helpers/email.php b/kohana/helpers/email.php
deleted file mode 100644
index 89f29096..00000000
--- a/kohana/helpers/email.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Email helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class email_Core {
-
- // SwiftMailer instance
- protected static $mail;
-
- /**
- * Creates a SwiftMailer instance.
- *
- * @param string DSN connection string
- * @return object Swift object
- */
- public static function connect($config = NULL)
- {
- if ( ! class_exists('Swift', FALSE))
- {
- // Load SwiftMailer
- require Kohana::find_file('vendor', 'swift/Swift');
-
- // Register the Swift ClassLoader as an autoload
- spl_autoload_register(array('Swift_ClassLoader', 'load'));
- }
-
- // Load default configuration
- ($config === NULL) and $config = Kohana::config('email');
-
- switch ($config['driver'])
- {
- case 'smtp':
- // Set port
- $port = empty($config['options']['port']) ? NULL : (int) $config['options']['port'];
-
- if (empty($config['options']['encryption']))
- {
- // No encryption
- $encryption = Swift_Connection_SMTP::ENC_OFF;
- }
- else
- {
- // Set encryption
- switch (strtolower($config['options']['encryption']))
- {
- case 'tls': $encryption = Swift_Connection_SMTP::ENC_TLS; break;
- case 'ssl': $encryption = Swift_Connection_SMTP::ENC_SSL; break;
- }
- }
-
- // Create a SMTP connection
- $connection = new Swift_Connection_SMTP($config['options']['hostname'], $port, $encryption);
-
- // Do authentication, if part of the DSN
- empty($config['options']['username']) or $connection->setUsername($config['options']['username']);
- empty($config['options']['password']) or $connection->setPassword($config['options']['password']);
-
- if ( ! empty($config['options']['auth']))
- {
- // Get the class name and params
- list ($class, $params) = arr::callback_string($config['options']['auth']);
-
- if ($class === 'PopB4Smtp')
- {
- // Load the PopB4Smtp class manually, due to its odd filename
- require Kohana::find_file('vendor', 'swift/Swift/Authenticator/$PopB4Smtp$');
- }
-
- // Prepare the class name for auto-loading
- $class = 'Swift_Authenticator_'.$class;
-
- // Attach the authenticator
- $connection->attachAuthenticator(($params === NULL) ? new $class : new $class($params[0]));
- }
-
- // Set the timeout to 5 seconds
- $connection->setTimeout(empty($config['options']['timeout']) ? 5 : (int) $config['options']['timeout']);
- break;
- case 'sendmail':
- // Create a sendmail connection
- $connection = new Swift_Connection_Sendmail
- (
- empty($config['options']) ? Swift_Connection_Sendmail::AUTO_DETECT : $config['options']
- );
-
- // Set the timeout to 5 seconds
- $connection->setTimeout(5);
- break;
- default:
- // Use the native connection
- $connection = new Swift_Connection_NativeMail;
- break;
- }
-
- // Create the SwiftMailer instance
- return email::$mail = new Swift($connection);
- }
-
- /**
- * Send an email message.
- *
- * @param string|array recipient email (and name), or an array of To, Cc, Bcc names
- * @param string|array sender email (and name)
- * @param string message subject
- * @param string message body
- * @param boolean send email as HTML
- * @return integer number of emails sent
- */
- public static function send($to, $from, $subject, $message, $html = FALSE)
- {
- // Connect to SwiftMailer
- (email::$mail === NULL) and email::connect();
-
- // Determine the message type
- $html = ($html === TRUE) ? 'text/html' : 'text/plain';
-
- // Create the message
- $message = new Swift_Message($subject, $message, $html, '8bit', 'utf-8');
-
- if (is_string($to))
- {
- // Single recipient
- $recipients = new Swift_Address($to);
- }
- elseif (is_array($to))
- {
- if (isset($to[0]) AND isset($to[1]))
- {
- // Create To: address set
- $to = array('to' => $to);
- }
-
- // Create a list of recipients
- $recipients = new Swift_RecipientList;
-
- foreach ($to as $method => $set)
- {
- if ( ! in_array($method, array('to', 'cc', 'bcc')))
- {
- // Use To: by default
- $method = 'to';
- }
-
- // Create method name
- $method = 'add'.ucfirst($method);
-
- if (is_array($set))
- {
- // Add a recipient with name
- $recipients->$method($set[0], $set[1]);
- }
- else
- {
- // Add a recipient without name
- $recipients->$method($set);
- }
- }
- }
-
- if (is_string($from))
- {
- // From without a name
- $from = new Swift_Address($from);
- }
- elseif (is_array($from))
- {
- // From with a name
- $from = new Swift_Address($from[0], $from[1]);
- }
-
- return email::$mail->send($message, $recipients, $from);
- }
-
-} // End email \ No newline at end of file
diff --git a/kohana/helpers/expires.php b/kohana/helpers/expires.php
deleted file mode 100644
index 72bfd79b..00000000
--- a/kohana/helpers/expires.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Controls headers that effect client caching of pages
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class expires_Core {
-
- /**
- * Sets the amount of time before a page expires
- *
- * @param integer Seconds before the page expires
- * @return boolean
- */
- public static function set($seconds = 60)
- {
- if (expires::check_headers())
- {
- $now = $expires = time();
-
- // Set the expiration timestamp
- $expires += $seconds;
-
- // Send headers
- header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $now));
- header('Expires: '.gmdate('D, d M Y H:i:s T', $expires));
- header('Cache-Control: max-age='.$seconds);
-
- return $expires;
- }
-
- return FALSE;
- }
-
- /**
- * Checks to see if a page should be updated or send Not Modified status
- *
- * @param integer Seconds added to the modified time received to calculate what should be sent
- * @return bool FALSE when the request needs to be updated
- */
- public static function check($seconds = 60)
- {
- if ( ! empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND expires::check_headers())
- {
- if (($strpos = strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], ';')) !== FALSE)
- {
- // IE6 and perhaps other IE versions send length too, compensate here
- $mod_time = substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, $strpos);
- }
- else
- {
- $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
- }
-
- $mod_time = strtotime($mod_time);
- $mod_time_diff = $mod_time + $seconds - time();
-
- if ($mod_time_diff > 0)
- {
- // Re-send headers
- header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $mod_time));
- header('Expires: '.gmdate('D, d M Y H:i:s T', time() + $mod_time_diff));
- header('Cache-Control: max-age='.$mod_time_diff);
- header('Status: 304 Not Modified', TRUE, 304);
-
- // Prevent any output
- Event::add('system.display', array('expires', 'prevent_output'));
-
- // Exit to prevent other output
- exit;
- }
- }
-
- return FALSE;
- }
-
- /**
- * Check headers already created to not step on download or Img_lib's feet
- *
- * @return boolean
- */
- public static function check_headers()
- {
- foreach (headers_list() as $header)
- {
- if (stripos($header, 'Last-Modified:') === 0 OR stripos($header, 'Expires:') === 0)
- {
- return FALSE;
- }
- }
-
- return TRUE;
- }
-
- /**
- * Prevent any output from being displayed. Executed during system.display.
- *
- * @return void
- */
- public static function prevent_output()
- {
- Kohana::$output = '';
- }
-
-} // End expires \ No newline at end of file
diff --git a/kohana/helpers/feed.php b/kohana/helpers/feed.php
deleted file mode 100644
index 2049c7bd..00000000
--- a/kohana/helpers/feed.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Feed helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class feed_Core {
-
- /**
- * Parses a remote feed into an array.
- *
- * @param string remote feed URL
- * @param integer item limit to fetch
- * @return array
- */
- public static function parse($feed, $limit = 0)
- {
- // Make limit an integer
- $limit = (int) $limit;
-
- // Disable error reporting while opening the feed
- $ER = error_reporting(0);
-
- // Allow loading by filename or raw XML string
- $load = (is_file($feed) OR valid::url($feed)) ? 'simplexml_load_file' : 'simplexml_load_string';
-
- // Load the feed
- $feed = $load($feed, 'SimpleXMLElement', LIBXML_NOCDATA);
-
- // Restore error reporting
- error_reporting($ER);
-
- // Feed could not be loaded
- if ($feed === FALSE)
- return array();
-
- // Detect the feed type. RSS 1.0/2.0 and Atom 1.0 are supported.
- $feed = isset($feed->channel) ? $feed->xpath('//item') : $feed->entry;
-
- $i = 0;
- $items = array();
-
- foreach ($feed as $item)
- {
- if ($limit > 0 AND $i++ === $limit)
- break;
-
- $items[] = (array) $item;
- }
-
- return $items;
- }
-
- /**
- * Creates a feed from the given parameters.
- *
- * @param array feed information
- * @param array items to add to the feed
- * @return string
- */
- public static function create($info, $items, $format = 'rss2')
- {
- $info += array('title' => 'Generated Feed', 'link' => '', 'generator' => 'KohanaPHP');
-
- $feed = '<?xml version="1.0"?><rss version="2.0"><channel></channel></rss>';
- $feed = simplexml_load_string($feed);
-
- foreach ($info as $name => $value)
- {
- if (($name === 'pubDate' OR $name === 'lastBuildDate') AND (is_int($value) OR ctype_digit($value)))
- {
- // Convert timestamps to RFC 822 formatted dates
- $value = date(DATE_RFC822, $value);
- }
- elseif (($name === 'link' OR $name === 'docs') AND strpos($value, '://') === FALSE)
- {
- // Convert URIs to URLs
- $value = url::site($value, 'http');
- }
-
- // Add the info to the channel
- $feed->channel->addChild($name, $value);
- }
-
- foreach ($items as $item)
- {
- // Add the item to the channel
- $row = $feed->channel->addChild('item');
-
- foreach ($item as $name => $value)
- {
- if ($name === 'pubDate' AND (is_int($value) OR ctype_digit($value)))
- {
- // Convert timestamps to RFC 822 formatted dates
- $value = date(DATE_RFC822, $value);
- }
- elseif (($name === 'link' OR $name === 'guid') AND strpos($value, '://') === FALSE)
- {
- // Convert URIs to URLs
- $value = url::site($value, 'http');
- }
-
- // Add the info to the row
- $row->addChild($name, $value);
- }
- }
-
- return $feed->asXML();
- }
-
-} // End feed \ No newline at end of file
diff --git a/kohana/helpers/file.php b/kohana/helpers/file.php
deleted file mode 100644
index 65268e08..00000000
--- a/kohana/helpers/file.php
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * File helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class file_Core {
-
- /**
- * Attempt to get the mime type from a file. This method is horribly
- * unreliable, due to PHP being horribly unreliable when it comes to
- * determining the mime-type of a file.
- *
- * @param string filename
- * @return string mime-type, if found
- * @return boolean FALSE, if not found
- */
- public static function mime($filename)
- {
- // Make sure the file is readable
- if ( ! (is_file($filename) AND is_readable($filename)))
- return FALSE;
-
- // Get the extension from the filename
- $extension = strtolower(substr(strrchr($filename, '.'), 1));
-
- if (preg_match('/^(?:jpe?g|png|[gt]if|bmp|swf)$/', $extension))
- {
- // Disable error reporting
- $ER = error_reporting(0);
-
- // Use getimagesize() to find the mime type on images
- $mime = getimagesize($filename);
-
- // Turn error reporting back on
- error_reporting($ER);
-
- // Return the mime type
- if (isset($mime['mime']))
- return $mime['mime'];
- }
-
- if (function_exists('finfo_open'))
- {
- // Use the fileinfo extension
- $finfo = finfo_open(FILEINFO_MIME);
- $mime = finfo_file($finfo, $filename);
- finfo_close($finfo);
-
- // Return the mime type
- return $mime;
- }
-
- if (ini_get('mime_magic.magicfile') AND function_exists('mime_content_type'))
- {
- // Return the mime type using mime_content_type
- return mime_content_type($filename);
- }
-
- if ( ! empty($extension) AND is_array($mime = Kohana::config('mimes.'.$extension)))
- {
- // Return the mime-type guess, based on the extension
- return $mime[0];
- }
-
- // Unable to find the mime-type
- return FALSE;
- }
-
- /**
- * Split a file into pieces matching a specific size.
- *
- * @param string file to be split
- * @param string directory to output to, defaults to the same directory as the file
- * @param integer size, in MB, for each chunk to be
- * @return integer The number of pieces that were created.
- */
- public static function split($filename, $output_dir = FALSE, $piece_size = 10)
- {
- // Find output dir
- $output_dir = ($output_dir == FALSE) ? pathinfo(str_replace('\\', '/', realpath($filename)), PATHINFO_DIRNAME) : str_replace('\\', '/', realpath($output_dir));
- $output_dir = rtrim($output_dir, '/').'/';
-
- // Open files for writing
- $input_file = fopen($filename, 'rb');
-
- // Change the piece size to bytes
- $piece_size = 1024 * 1024 * (int) $piece_size; // Size in bytes
-
- // Set up reading variables
- $read = 0; // Number of bytes read
- $piece = 1; // Current piece
- $chunk = 1024 * 8; // Chunk size to read
-
- // Split the file
- while ( ! feof($input_file))
- {
- // Open a new piece
- $piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT);
- $piece_open = @fopen($piece_name, 'wb+') or die('Could not write piece '.$piece_name);
-
- // Fill the current piece
- while ($read < $piece_size AND $data = fread($input_file, $chunk))
- {
- fwrite($piece_open, $data) or die('Could not write to open piece '.$piece_name);
- $read += $chunk;
- }
-
- // Close the current piece
- fclose($piece_open);
-
- // Prepare to open a new piece
- $read = 0;
- $piece++;
-
- // Make sure that piece is valid
- ($piece < 999) or die('Maximum of 999 pieces exceeded, try a larger piece size');
- }
-
- // Close input file
- fclose($input_file);
-
- // Returns the number of pieces that were created
- return ($piece - 1);
- }
-
- /**
- * Join a split file into a whole file.
- *
- * @param string split filename, without .000 extension
- * @param string output filename, if different then an the filename
- * @return integer The number of pieces that were joined.
- */
- public static function join($filename, $output = FALSE)
- {
- if ($output == FALSE)
- $output = $filename;
-
- // Set up reading variables
- $piece = 1; // Current piece
- $chunk = 1024 * 8; // Chunk size to read
-
- // Open output file
- $output_file = @fopen($output, 'wb+') or die('Could not open output file '.$output);
-
- // Read each piece
- while ($piece_open = @fopen(($piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT)), 'rb'))
- {
- // Write the piece into the output file
- while ( ! feof($piece_open))
- {
- fwrite($output_file, fread($piece_open, $chunk));
- }
-
- // Close the current piece
- fclose($piece_open);
-
- // Prepare for a new piece
- $piece++;
-
- // Make sure piece is valid
- ($piece < 999) or die('Maximum of 999 pieces exceeded');
- }
-
- // Close the output file
- fclose($output_file);
-
- // Return the number of pieces joined
- return ($piece - 1);
- }
-
-} // End file \ No newline at end of file
diff --git a/kohana/helpers/form.php b/kohana/helpers/form.php
deleted file mode 100644
index b432fc78..00000000
--- a/kohana/helpers/form.php
+++ /dev/null
@@ -1,526 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Form helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class form_Core {
-
- /**
- * Generates an opening HTML form tag.
- *
- * @param string form action attribute
- * @param array extra attributes
- * @param array hidden fields to be created immediately after the form tag
- * @return string
- */
- public static function open($action = NULL, $attr = array(), $hidden = NULL)
- {
- // Make sure that the method is always set
- empty($attr['method']) and $attr['method'] = 'post';
-
- if ($attr['method'] !== 'post' AND $attr['method'] !== 'get')
- {
- // If the method is invalid, use post
- $attr['method'] = 'post';
- }
-
- if ($action === NULL)
- {
- // Use the current URL as the default action
- $action = url::site(Router::$complete_uri);
- }
- elseif (strpos($action, '://') === FALSE)
- {
- // Make the action URI into a URL
- $action = url::site($action);
- }
-
- // Set action
- $attr['action'] = $action;
-
- // Form opening tag
- $form = '<form'.form::attributes($attr).'>'."\n";
-
- // Add hidden fields immediate after opening tag
- empty($hidden) or $form .= form::hidden($hidden);
-
- return $form;
- }
-
- /**
- * Generates an opening HTML form tag that can be used for uploading files.
- *
- * @param string form action attribute
- * @param array extra attributes
- * @param array hidden fields to be created immediately after the form tag
- * @return string
- */
- public static function open_multipart($action = NULL, $attr = array(), $hidden = array())
- {
- // Set multi-part form type
- $attr['enctype'] = 'multipart/form-data';
-
- return form::open($action, $attr, $hidden);
- }
-
- /**
- * Generates a fieldset opening tag.
- *
- * @param array html attributes
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function open_fieldset($data = NULL, $extra = '')
- {
- return '<fieldset'.html::attributes((array) $data).' '.$extra.'>'."\n";
- }
-
- /**
- * Generates a fieldset closing tag.
- *
- * @return string
- */
- public static function close_fieldset()
- {
- return '</fieldset>'."\n";
- }
-
- /**
- * Generates a legend tag for use with a fieldset.
- *
- * @param string legend text
- * @param array HTML attributes
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function legend($text = '', $data = NULL, $extra = '')
- {
- return '<legend'.form::attributes((array) $data).' '.$extra.'>'.$text.'</legend>'."\n";
- }
-
- /**
- * Generates hidden form fields.
- * You can pass a simple key/value string or an associative array with multiple values.
- *
- * @param string|array input name (string) or key/value pairs (array)
- * @param string input value, if using an input name
- * @return string
- */
- public static function hidden($data, $value = '')
- {
- if ( ! is_array($data))
- {
- $data = array
- (
- $data => $value
- );
- }
-
- $input = '';
- foreach ($data as $name => $value)
- {
- $attr = array
- (
- 'type' => 'hidden',
- 'name' => $name,
- 'value' => $value
- );
-
- $input .= form::input($attr)."\n";
- }
-
- return $input;
- }
-
- /**
- * Creates an HTML form input tag. Defaults to a text type.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function input($data, $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- // Type and value are required attributes
- $data += array
- (
- 'type' => 'text',
- 'value' => $value
- );
-
- // For safe form data
- $data['value'] = html::specialchars($data['value']);
-
- return '<input'.form::attributes($data).' '.$extra.' />';
- }
-
- /**
- * Creates a HTML form password input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function password($data, $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- $data['type'] = 'password';
-
- return form::input($data, $value, $extra);
- }
-
- /**
- * Creates an HTML form upload input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function upload($data, $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- $data['type'] = 'file';
-
- return form::input($data, $value, $extra);
- }
-
- /**
- * Creates an HTML form textarea tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function textarea($data, $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- // Use the value from $data if possible, or use $value
- $value = isset($data['value']) ? $data['value'] : $value;
-
- // Value is not part of the attributes
- unset($data['value']);
-
- return '<textarea'.form::attributes($data, 'textarea').' '.$extra.'>'.html::specialchars($value).'</textarea>';
- }
-
- /**
- * Creates an HTML form select tag, or "dropdown menu".
- *
- * @param string|array input name or an array of HTML attributes
- * @param array select options, when using a name
- * @param string option key that should be selected by default
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function dropdown($data, $options = NULL, $selected = NULL, $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
- else
- {
- if (isset($data['options']))
- {
- // Use data options
- $options = $data['options'];
- }
-
- if (isset($data['selected']))
- {
- // Use data selected
- $selected = $data['selected'];
- }
- }
-
- // Selected value should always be a string
- $selected = (string) $selected;
-
- $input = '<select'.form::attributes($data, 'select').' '.$extra.'>'."\n";
- foreach ((array) $options as $key => $val)
- {
- // Key should always be a string
- $key = (string) $key;
-
- if (is_array($val))
- {
- $input .= '<optgroup label="'.$key.'">'."\n";
- foreach ($val as $inner_key => $inner_val)
- {
- // Inner key should always be a string
- $inner_key = (string) $inner_key;
-
- $sel = ($selected === $inner_key) ? ' selected="selected"' : '';
- $input .= '<option value="'.$inner_key.'"'.$sel.'>'.$inner_val.'</option>'."\n";
- }
- $input .= '</optgroup>'."\n";
- }
- else
- {
- $sel = ($selected === $key) ? ' selected="selected"' : '';
- $input .= '<option value="'.$key.'"'.$sel.'>'.$val.'</option>'."\n";
- }
- }
- $input .= '</select>';
-
- return $input;
- }
-
- /**
- * Creates an HTML form checkbox input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param boolean make the checkbox checked by default
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function checkbox($data, $value = '', $checked = FALSE, $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- $data['type'] = 'checkbox';
-
- if ($checked == TRUE OR (isset($data['checked']) AND $data['checked'] == TRUE))
- {
- $data['checked'] = 'checked';
- }
- else
- {
- unset($data['checked']);
- }
-
- return form::input($data, $value, $extra);
- }
-
- /**
- * Creates an HTML form radio input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param boolean make the radio selected by default
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function radio($data = '', $value = '', $checked = FALSE, $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- $data['type'] = 'radio';
-
- if ($checked == TRUE OR (isset($data['checked']) AND $data['checked'] == TRUE))
- {
- $data['checked'] = 'checked';
- }
- else
- {
- unset($data['checked']);
- }
-
- return form::input($data, $value, $extra);
- }
-
- /**
- * Creates an HTML form submit input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function submit($data = '', $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- if (empty($data['name']))
- {
- // Remove the name if it is empty
- unset($data['name']);
- }
-
- $data['type'] = 'submit';
-
- return form::input($data, $value, $extra);
- }
-
- /**
- * Creates an HTML form button input tag.
- *
- * @param string|array input name or an array of HTML attributes
- * @param string input value, when using a name
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function button($data = '', $value = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- $data = array('name' => $data);
- }
-
- if (empty($data['name']))
- {
- // Remove the name if it is empty
- unset($data['name']);
- }
-
- if (isset($data['value']) AND empty($value))
- {
- $value = arr::remove('value', $data);
- }
-
- return '<button'.form::attributes($data, 'button').' '.$extra.'>'.$value.'</button>';
- }
-
- /**
- * Closes an open form tag.
- *
- * @param string string to be attached after the closing tag
- * @return string
- */
- public static function close($extra = '')
- {
- return '</form>'."\n".$extra;
- }
-
- /**
- * Creates an HTML form label tag.
- *
- * @param string|array label "for" name or an array of HTML attributes
- * @param string label text or HTML
- * @param string a string to be attached to the end of the attributes
- * @return string
- */
- public static function label($data = '', $text = '', $extra = '')
- {
- if ( ! is_array($data))
- {
- if (strpos($data, '[') !== FALSE)
- {
- $data = preg_replace('/\[.*\]/', '', $data);
- }
-
- $data = empty($data) ? array() : array('for' => $data);
- }
-
- return '<label'.form::attributes($data).' '.$extra.'>'.$text.'</label>';
- }
-
- /**
- * Sorts a key/value array of HTML attributes, putting form attributes first,
- * and returns an attribute string.
- *
- * @param array HTML attributes array
- * @return string
- */
- public static function attributes($attr, $type = NULL)
- {
- if (empty($attr))
- return '';
-
- if (isset($attr['name']) AND empty($attr['id']) AND strpos($attr['name'], '[') === FALSE)
- {
- if ($type === NULL AND ! empty($attr['type']))
- {
- // Set the type by the attributes
- $type = $attr['type'];
- }
-
- switch ($type)
- {
- case 'text':
- case 'textarea':
- case 'password':
- case 'select':
- case 'checkbox':
- case 'file':
- case 'image':
- case 'button':
- case 'submit':
- // Only specific types of inputs use name to id matching
- $attr['id'] = $attr['name'];
- break;
- }
- }
-
- $order = array
- (
- 'action',
- 'method',
- 'type',
- 'id',
- 'name',
- 'value',
- 'src',
- 'size',
- 'maxlength',
- 'rows',
- 'cols',
- 'accept',
- 'tabindex',
- 'accesskey',
- 'align',
- 'alt',
- 'title',
- 'class',
- 'style',
- 'selected',
- 'checked',
- 'readonly',
- 'disabled'
- );
-
- $sorted = array();
- foreach ($order as $key)
- {
- if (isset($attr[$key]))
- {
- // Move the attribute to the sorted array
- $sorted[$key] = $attr[$key];
-
- // Remove the attribute from unsorted array
- unset($attr[$key]);
- }
- }
-
- // Combine the sorted and unsorted attributes and create an HTML string
- return html::attributes(array_merge($sorted, $attr));
- }
-
-} // End form \ No newline at end of file
diff --git a/kohana/helpers/format.php b/kohana/helpers/format.php
deleted file mode 100644
index dd37be11..00000000
--- a/kohana/helpers/format.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Format helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class format_Core {
-
- /**
- * Formats a phone number according to the specified format.
- *
- * @param string phone number
- * @param string format string
- * @return string
- */
- public static function phone($number, $format = '3-3-4')
- {
- // Get rid of all non-digit characters in number string
- $number_clean = preg_replace('/\D+/', '', (string) $number);
-
- // Array of digits we need for a valid format
- $format_parts = preg_split('/[^1-9][^0-9]*/', $format, -1, PREG_SPLIT_NO_EMPTY);
-
- // Number must match digit count of a valid format
- if (strlen($number_clean) !== array_sum($format_parts))
- return $number;
-
- // Build regex
- $regex = '(\d{'.implode('})(\d{', $format_parts).'})';
-
- // Build replace string
- for ($i = 1, $c = count($format_parts); $i <= $c; $i++)
- {
- $format = preg_replace('/(?<!\$)[1-9][0-9]*/', '\$'.$i, $format, 1);
- }
-
- // Hocus pocus!
- return preg_replace('/^'.$regex.'$/', $format, $number_clean);
- }
-
- /**
- * Formats a URL to contain a protocol at the beginning.
- *
- * @param string possibly incomplete URL
- * @return string
- */
- public static function url($str = '')
- {
- // Clear protocol-only strings like "http://"
- if ($str === '' OR substr($str, -3) === '://')
- return '';
-
- // If no protocol given, prepend "http://" by default
- if (strpos($str, '://') === FALSE)
- return 'http://'.$str;
-
- // Return the original URL
- return $str;
- }
-
-} // End format \ No newline at end of file
diff --git a/kohana/helpers/html.php b/kohana/helpers/html.php
deleted file mode 100644
index 3cb8d5a4..00000000
--- a/kohana/helpers/html.php
+++ /dev/null
@@ -1,400 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * HTML helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class html_Core {
-
- // Enable or disable automatic setting of target="_blank"
- public static $windowed_urls = FALSE;
-
- /**
- * Convert special characters to HTML entities
- *
- * @param string string to convert
- * @param boolean encode existing entities
- * @return string
- */
- public static function specialchars($str, $double_encode = TRUE)
- {
- // Force the string to be a string
- $str = (string) $str;
-
- // Do encode existing HTML entities (default)
- if ($double_encode === TRUE)
- {
- $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
- }
- else
- {
- // Do not encode existing HTML entities
- // From PHP 5.2.3 this functionality is built-in, otherwise use a regex
- if (version_compare(PHP_VERSION, '5.2.3', '>='))
- {
- $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8', FALSE);
- }
- else
- {
- $str = preg_replace('/&(?!(?:#\d++|[a-z]++);)/ui', '&amp;', $str);
- $str = str_replace(array('<', '>', '\'', '"'), array('&lt;', '&gt;', '&#39;', '&quot;'), $str);
- }
- }
-
- return $str;
- }
-
- /**
- * Create HTML link anchors.
- *
- * @param string URL or URI string
- * @param string link text
- * @param array HTML anchor attributes
- * @param string non-default protocol, eg: https
- * @return string
- */
- public static function anchor($uri, $title = NULL, $attributes = NULL, $protocol = NULL)
- {
- if ($uri === '')
- {
- $site_url = url::base(FALSE);
- }
- elseif (strpos($uri, '://') === FALSE AND strpos($uri, '#') !== 0)
- {
- $site_url = url::site($uri, $protocol);
- }
- else
- {
- if (html::$windowed_urls === TRUE AND empty($attributes['target']))
- {
- $attributes['target'] = '_blank';
- }
-
- $site_url = $uri;
- }
-
- return
- // Parsed URL
- '<a href="'.html::specialchars($site_url, FALSE).'"'
- // Attributes empty? Use an empty string
- .(is_array($attributes) ? html::attributes($attributes) : '').'>'
- // Title empty? Use the parsed URL
- .(($title === NULL) ? $site_url : $title).'</a>';
- }
-
- /**
- * Creates an HTML anchor to a file.
- *
- * @param string name of file to link to
- * @param string link text
- * @param array HTML anchor attributes
- * @param string non-default protocol, eg: ftp
- * @return string
- */
- public static function file_anchor($file, $title = NULL, $attributes = NULL, $protocol = NULL)
- {
- return
- // Base URL + URI = full URL
- '<a href="'.html::specialchars(url::base(FALSE, $protocol).$file, FALSE).'"'
- // Attributes empty? Use an empty string
- .(is_array($attributes) ? html::attributes($attributes) : '').'>'
- // Title empty? Use the filename part of the URI
- .(($title === NULL) ? end(explode('/', $file)) : $title) .'</a>';
- }
-
- /**
- * Similar to anchor, but with the protocol parameter first.
- *
- * @param string link protocol
- * @param string URI or URL to link to
- * @param string link text
- * @param array HTML anchor attributes
- * @return string
- */
- public static function panchor($protocol, $uri, $title = FALSE, $attributes = FALSE)
- {
- return html::anchor($uri, $title, $attributes, $protocol);
- }
-
- /**
- * Create an array of anchors from an array of link/title pairs.
- *
- * @param array link/title pairs
- * @return array
- */
- public static function anchor_array(array $array)
- {
- $anchors = array();
- foreach ($array as $link => $title)
- {
- // Create list of anchors
- $anchors[] = html::anchor($link, $title);
- }
- return $anchors;
- }
-
- /**
- * Generates an obfuscated version of an email address.
- *
- * @param string email address
- * @return string
- */
- public static function email($email)
- {
- $safe = '';
- foreach (str_split($email) as $letter)
- {
- switch (($letter === '@') ? rand(1, 2) : rand(1, 3))
- {
- // HTML entity code
- case 1: $safe .= '&#'.ord($letter).';'; break;
- // Hex character code
- case 2: $safe .= '&#x'.dechex(ord($letter)).';'; break;
- // Raw (no) encoding
- case 3: $safe .= $letter;
- }
- }
-
- return $safe;
- }
-
- /**
- * Creates an email anchor.
- *
- * @param string email address to send to
- * @param string link text
- * @param array HTML anchor attributes
- * @return string
- */
- public static function mailto($email, $title = NULL, $attributes = NULL)
- {
- if (empty($email))
- return $title;
-
- // Remove the subject or other parameters that do not need to be encoded
- if (strpos($email, '?') !== FALSE)
- {
- // Extract the parameters from the email address
- list ($email, $params) = explode('?', $email, 2);
-
- // Make the params into a query string, replacing spaces
- $params = '?'.str_replace(' ', '%20', $params);
- }
- else
- {
- // No parameters
- $params = '';
- }
-
- // Obfuscate email address
- $safe = html::email($email);
-
- // Title defaults to the encoded email address
- empty($title) and $title = $safe;
-
- // Parse attributes
- empty($attributes) or $attributes = html::attributes($attributes);
-
- // Encoded start of the href="" is a static encoded version of 'mailto:'
- return '<a href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;'.$safe.$params.'"'.$attributes.'>'.$title.'</a>';
- }
-
- /**
- * Generate a "breadcrumb" list of anchors representing the URI.
- *
- * @param array segments to use as breadcrumbs, defaults to using Router::$segments
- * @return string
- */
- public static function breadcrumb($segments = NULL)
- {
- empty($segments) and $segments = Router::$segments;
-
- $array = array();
- while ($segment = array_pop($segments))
- {
- $array[] = html::anchor
- (
- // Complete URI for the URL
- implode('/', $segments).'/'.$segment,
- // Title for the current segment
- ucwords(inflector::humanize($segment))
- );
- }
-
- // Retrun the array of all the segments
- return array_reverse($array);
- }
-
- /**
- * Creates a meta tag.
- *
- * @param string|array tag name, or an array of tags
- * @param string tag "content" value
- * @return string
- */
- public static function meta($tag, $value = NULL)
- {
- if (is_array($tag))
- {
- $tags = array();
- foreach ($tag as $t => $v)
- {
- // Build each tag and add it to the array
- $tags[] = html::meta($t, $v);
- }
-
- // Return all of the tags as a string
- return implode("\n", $tags);
- }
-
- // Set the meta attribute value
- $attr = in_array(strtolower($tag), Kohana::config('http.meta_equiv')) ? 'http-equiv' : 'name';
-
- return '<meta '.$attr.'="'.$tag.'" content="'.$value.'" />';
- }
-
- /**
- * Creates a stylesheet link.
- *
- * @param string|array filename, or array of filenames to match to array of medias
- * @param string|array media type of stylesheet, or array to match filenames
- * @param boolean include the index_page in the link
- * @return string
- */
- public static function stylesheet($style, $media = FALSE, $index = FALSE)
- {
- return html::link($style, 'stylesheet', 'text/css', '.css', $media, $index);
- }
-
- /**
- * Creates a link tag.
- *
- * @param string|array filename
- * @param string|array relationship
- * @param string|array mimetype
- * @param string specifies suffix of the file
- * @param string|array specifies on what device the document will be displayed
- * @param boolean include the index_page in the link
- * @return string
- */
- public static function link($href, $rel, $type, $suffix = FALSE, $media = FALSE, $index = FALSE)
- {
- $compiled = '';
-
- if (is_array($href))
- {
- foreach ($href as $_href)
- {
- $_rel = is_array($rel) ? array_shift($rel) : $rel;
- $_type = is_array($type) ? array_shift($type) : $type;
- $_media = is_array($media) ? array_shift($media) : $media;
-
- $compiled .= html::link($_href, $_rel, $_type, $suffix, $_media, $index);
- }
- }
- else
- {
- // Add the suffix only when it's not already present
- $suffix = ( ! empty($suffix) AND strpos($href, $suffix) === FALSE) ? $suffix : '';
- $media = empty($media) ? '' : ' media="'.$media.'"';
- $compiled = '<link rel="'.$rel.'" type="'.$type.'" href="'.url::base((bool) $index).$href.$suffix.'"'.$media.' />';
- }
-
- return $compiled."\n";
- }
-
- /**
- * Creates a script link.
- *
- * @param string|array filename
- * @param boolean include the index_page in the link
- * @return string
- */
- public static function script($script, $index = FALSE)
- {
- $compiled = '';
-
- if (is_array($script))
- {
- foreach ($script as $name)
- {
- $compiled .= html::script($name, $index);
- }
- }
- else
- {
- // Do not touch full URLs
- if (strpos($script, '://') === FALSE)
- {
- // Add the suffix only when it's not already present
- $suffix = (substr($script, -3) !== '.js') ? '.js' : '';
- $script = url::base((bool) $index).$script.$suffix;
- }
-
- $compiled = '<script type="text/javascript" src="'.$script.'"></script>';
- }
-
- return $compiled."\n";
- }
-
- /**
- * Creates a image link.
- *
- * @param string image source, or an array of attributes
- * @param string|array image alt attribute, or an array of attributes
- * @param boolean include the index_page in the link
- * @return string
- */
- public static function image($src = NULL, $alt = NULL, $index = FALSE)
- {
- // Create attribute list
- $attributes = is_array($src) ? $src : array('src' => $src);
-
- if (is_array($alt))
- {
- $attributes += $alt;
- }
- elseif ( ! empty($alt))
- {
- // Add alt to attributes
- $attributes['alt'] = $alt;
- }
-
- if (strpos($attributes['src'], '://') === FALSE)
- {
- // Make the src attribute into an absolute URL
- $attributes['src'] = url::base($index).$attributes['src'];
- }
-
- return '<img'.html::attributes($attributes).' />';
- }
-
- /**
- * Compiles an array of HTML attributes into an attribute string.
- *
- * @param string|array array of attributes
- * @return string
- */
- public static function attributes($attrs)
- {
- if (empty($attrs))
- return '';
-
- if (is_string($attrs))
- return ' '.$attrs;
-
- $compiled = '';
- foreach ($attrs as $key => $val)
- {
- $compiled .= ' '.$key.'="'.$val.'"';
- }
-
- return $compiled;
- }
-
-} // End html
diff --git a/kohana/helpers/inflector.php b/kohana/helpers/inflector.php
deleted file mode 100644
index 0e980390..00000000
--- a/kohana/helpers/inflector.php
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Inflector helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class inflector_Core {
-
- // Cached inflections
- protected static $cache = array();
-
- // Uncountable and irregular words
- protected static $uncountable;
- protected static $irregular;
-
- /**
- * Checks if a word is defined as uncountable.
- *
- * @param string word to check
- * @return boolean
- */
- public static function uncountable($str)
- {
- if (self::$uncountable === NULL)
- {
- // Cache uncountables
- self::$uncountable = Kohana::config('inflector.uncountable');
-
- // Make uncountables mirroed
- self::$uncountable = array_combine(self::$uncountable, self::$uncountable);
- }
-
- return isset(self::$uncountable[strtolower($str)]);
- }
-
- /**
- * Makes a plural word singular.
- *
- * @param string word to singularize
- * @param integer number of things
- * @return string
- */
- public static function singular($str, $count = NULL)
- {
- // Remove garbage
- $str = strtolower(trim($str));
-
- if (is_string($count))
- {
- // Convert to integer when using a digit string
- $count = (int) $count;
- }
-
- // Do nothing with a single count
- if ($count === 0 OR $count > 1)
- return $str;
-
- // Cache key name
- $key = 'singular_'.$str.$count;
-
- if (isset(self::$cache[$key]))
- return self::$cache[$key];
-
- if (inflector::uncountable($str))
- return self::$cache[$key] = $str;
-
- if (empty(self::$irregular))
- {
- // Cache irregular words
- self::$irregular = Kohana::config('inflector.irregular');
- }
-
- if ($irregular = array_search($str, self::$irregular))
- {
- $str = $irregular;
- }
- elseif (preg_match('/[sxz]es$/', $str) OR preg_match('/[^aeioudgkprt]hes$/', $str))
- {
- // Remove "es"
- $str = substr($str, 0, -2);
- }
- elseif (preg_match('/[^aeiou]ies$/', $str))
- {
- $str = substr($str, 0, -3).'y';
- }
- elseif (substr($str, -1) === 's' AND substr($str, -2) !== 'ss')
- {
- $str = substr($str, 0, -1);
- }
-
- return self::$cache[$key] = $str;
- }
-
- /**
- * Makes a singular word plural.
- *
- * @param string word to pluralize
- * @return string
- */
- public static function plural($str, $count = NULL)
- {
- // Remove garbage
- $str = strtolower(trim($str));
-
- if (is_string($count))
- {
- // Convert to integer when using a digit string
- $count = (int) $count;
- }
-
- // Do nothing with singular
- if ($count === 1)
- return $str;
-
- // Cache key name
- $key = 'plural_'.$str.$count;
-
- if (isset(self::$cache[$key]))
- return self::$cache[$key];
-
- if (inflector::uncountable($str))
- return self::$cache[$key] = $str;
-
- if (empty(self::$irregular))
- {
- // Cache irregular words
- self::$irregular = Kohana::config('inflector.irregular');
- }
-
- if (isset(self::$irregular[$str]))
- {
- $str = self::$irregular[$str];
- }
- elseif (preg_match('/[sxz]$/', $str) OR preg_match('/[^aeioudgkprt]h$/', $str))
- {
- $str .= 'es';
- }
- elseif (preg_match('/[^aeiou]y$/', $str))
- {
- // Change "y" to "ies"
- $str = substr_replace($str, 'ies', -1);
- }
- else
- {
- $str .= 's';
- }
-
- // Set the cache and return
- return self::$cache[$key] = $str;
- }
-
- /**
- * Makes a phrase camel case.
- *
- * @param string phrase to camelize
- * @return string
- */
- public static function camelize($str)
- {
- $str = 'x'.strtolower(trim($str));
- $str = ucwords(preg_replace('/[\s_]+/', ' ', $str));
-
- return substr(str_replace(' ', '', $str), 1);
- }
-
- /**
- * Makes a phrase underscored instead of spaced.
- *
- * @param string phrase to underscore
- * @return string
- */
- public static function underscore($str)
- {
- return preg_replace('/\s+/', '_', trim($str));
- }
-
- /**
- * Makes an underscored or dashed phrase human-reable.
- *
- * @param string phrase to make human-reable
- * @return string
- */
- public static function humanize($str)
- {
- return preg_replace('/[_-]+/', ' ', trim($str));
- }
-
-} // End inflector \ No newline at end of file
diff --git a/kohana/helpers/num.php b/kohana/helpers/num.php
deleted file mode 100644
index 62516e81..00000000
--- a/kohana/helpers/num.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Number helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class num_Core {
-
- /**
- * Round a number to the nearest nth
- *
- * @param integer number to round
- * @param integer number to round to
- * @return integer
- */
- public static function round($number, $nearest = 5)
- {
- return round($number / $nearest) * $nearest;
- }
-
-} // End num \ No newline at end of file
diff --git a/kohana/helpers/remote.php b/kohana/helpers/remote.php
deleted file mode 100644
index f37d156e..00000000
--- a/kohana/helpers/remote.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Remote url/file helper.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class remote_Core {
-
- public static function status($url)
- {
- if ( ! valid::url($url, 'http'))
- return FALSE;
-
- // Get the hostname and path
- $url = parse_url($url);
-
- if (empty($url['path']))
- {
- // Request the root document
- $url['path'] = '/';
- }
-
- // Open a remote connection
- $remote = fsockopen($url['host'], 80, $errno, $errstr, 5);
-
- if ( ! is_resource($remote))
- return FALSE;
-
- // Set CRLF
- $CRLF = "\r\n";
-
- // Send request
- fwrite($remote, 'HEAD '.$url['path'].' HTTP/1.0'.$CRLF);
- fwrite($remote, 'Host: '.$url['host'].$CRLF);
- fwrite($remote, 'Connection: close'.$CRLF);
- fwrite($remote, 'User-Agent: Kohana Framework (+http://kohanaphp.com/)'.$CRLF);
-
- // Send one more CRLF to terminate the headers
- fwrite($remote, $CRLF);
-
- while ( ! feof($remote))
- {
- // Get the line
- $line = trim(fgets($remote, 512));
-
- if ($line !== '' AND preg_match('#^HTTP/1\.[01] (\d{3})#', $line, $matches))
- {
- // Response code found
- $response = (int) $matches[1];
-
- break;
- }
- }
-
- // Close the connection
- fclose($remote);
-
- return isset($response) ? $response : FALSE;
- }
-
-} // End remote \ No newline at end of file
diff --git a/kohana/helpers/request.php b/kohana/helpers/request.php
deleted file mode 100644
index 17408643..00000000
--- a/kohana/helpers/request.php
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Request helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class request_Core {
-
- // Possible HTTP methods
- protected static $http_methods = array('get', 'head', 'options', 'post', 'put', 'delete');
-
- // Content types from client's HTTP Accept request header (array)
- protected static $accept_types;
-
- /**
- * Returns the HTTP referrer, or the default if the referrer is not set.
- *
- * @param mixed default to return
- * @return string
- */
- public static function referrer($default = FALSE)
- {
- if ( ! empty($_SERVER['HTTP_REFERER']))
- {
- // Set referrer
- $ref = $_SERVER['HTTP_REFERER'];
-
- if (strpos($ref, url::base(FALSE)) === 0)
- {
- // Remove the base URL from the referrer
- $ref = substr($ref, strlen(url::base(TRUE)));
- }
- }
-
- return isset($ref) ? $ref : $default;
- }
-
- /**
- * Tests if the current request is an AJAX request by checking the X-Requested-With HTTP
- * request header that most popular JS frameworks now set for AJAX calls.
- *
- * @return boolean
- */
- public static function is_ajax()
- {
- return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
- }
-
- /**
- * Returns current request method.
- *
- * @throws Kohana_Exception in case of an unknown request method
- * @return string
- */
- public static function method()
- {
- $method = strtolower($_SERVER['REQUEST_METHOD']);
-
- if ( ! in_array($method, self::$http_methods))
- throw new Kohana_Exception('request.unknown_method', $method);
-
- return $method;
- }
-
- /**
- * Returns boolean of whether client accepts content type.
- *
- * @param string content type
- * @param boolean set to TRUE to disable wildcard checking
- * @return boolean
- */
- public static function accepts($type = NULL, $explicit_check = FALSE)
- {
- request::parse_accept_header();
-
- if ($type === NULL)
- return self::$accept_types;
-
- return (request::accepts_at_quality($type, $explicit_check) > 0);
- }
-
- /**
- * Compare the q values for given array of content types and return the one with the highest value.
- * If items are found to have the same q value, the first one encountered in the given array wins.
- * If all items in the given array have a q value of 0, FALSE is returned.
- *
- * @param array content types
- * @param boolean set to TRUE to disable wildcard checking
- * @return mixed string mime type with highest q value, FALSE if none of the given types are accepted
- */
- public static function preferred_accept($types, $explicit_check = FALSE)
- {
- // Initialize
- $mime_types = array();
- $max_q = 0;
- $preferred = FALSE;
-
- // Load q values for all given content types
- foreach (array_unique($types) as $type)
- {
- $mime_types[$type] = request::accepts_at_quality($type, $explicit_check);
- }
-
- // Look for the highest q value
- foreach ($mime_types as $type => $q)
- {
- if ($q > $max_q)
- {
- $max_q = $q;
- $preferred = $type;
- }
- }
-
- return $preferred;
- }
-
- /**
- * Returns quality factor at which the client accepts content type.
- *
- * @param string content type (e.g. "image/jpg", "jpg")
- * @param boolean set to TRUE to disable wildcard checking
- * @return integer|float
- */
- public static function accepts_at_quality($type = NULL, $explicit_check = FALSE)
- {
- request::parse_accept_header();
-
- // Normalize type
- $type = strtolower((string) $type);
-
- // General content type (e.g. "jpg")
- if (strpos($type, '/') === FALSE)
- {
- // Don't accept anything by default
- $q = 0;
-
- // Look up relevant mime types
- foreach ((array) Kohana::config('mimes.'.$type) as $type)
- {
- $q2 = request::accepts_at_quality($type, $explicit_check);
- $q = ($q2 > $q) ? $q2 : $q;
- }
-
- return $q;
- }
-
- // Content type with subtype given (e.g. "image/jpg")
- $type = explode('/', $type, 2);
-
- // Exact match
- if (isset(self::$accept_types[$type[0]][$type[1]]))
- return self::$accept_types[$type[0]][$type[1]];
-
- // Wildcard match (if not checking explicitly)
- if ($explicit_check === FALSE AND isset(self::$accept_types[$type[0]]['*']))
- return self::$accept_types[$type[0]]['*'];
-
- // Catch-all wildcard match (if not checking explicitly)
- if ($explicit_check === FALSE AND isset(self::$accept_types['*']['*']))
- return self::$accept_types['*']['*'];
-
- // Content type not accepted
- return 0;
- }
-
- /**
- * Parses client's HTTP Accept request header, and builds array structure representing it.
- *
- * @return void
- */
- protected static function parse_accept_header()
- {
- // Run this function just once
- if (self::$accept_types !== NULL)
- return;
-
- // Initialize accept_types array
- self::$accept_types = array();
-
- // No HTTP Accept header found
- if (empty($_SERVER['HTTP_ACCEPT']))
- {
- // Accept everything
- self::$accept_types['*']['*'] = 1;
- return;
- }
-
- // Remove linebreaks and parse the HTTP Accept header
- foreach (explode(',', str_replace(array("\r", "\n"), '', $_SERVER['HTTP_ACCEPT'])) as $accept_entry)
- {
- // Explode each entry in content type and possible quality factor
- $accept_entry = explode(';', trim($accept_entry), 2);
-
- // Explode each content type (e.g. "text/html")
- $type = explode('/', $accept_entry[0], 2);
-
- // Skip invalid content types
- if ( ! isset($type[1]))
- continue;
-
- // Assume a default quality factor of 1 if no custom q value found
- $q = (isset($accept_entry[1]) AND preg_match('~\bq\s*+=\s*+([.0-9]+)~', $accept_entry[1], $match)) ? (float) $match[1] : 1;
-
- // Populate accept_types array
- if ( ! isset(self::$accept_types[$type[0]][$type[1]]) OR $q > self::$accept_types[$type[0]][$type[1]])
- {
- self::$accept_types[$type[0]][$type[1]] = $q;
- }
- }
- }
-
-} // End request \ No newline at end of file
diff --git a/kohana/helpers/security.php b/kohana/helpers/security.php
deleted file mode 100644
index de723d76..00000000
--- a/kohana/helpers/security.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Security helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class security_Core {
-
- /**
- * Sanitize a string with the xss_clean method.
- *
- * @param string string to sanitize
- * @return string
- */
- public static function xss_clean($str)
- {
- return Input::instance()->xss_clean($str);
- }
-
- /**
- * Remove image tags from a string.
- *
- * @param string string to sanitize
- * @return string
- */
- public static function strip_image_tags($str)
- {
- return preg_replace('#<img\s.*?(?:src\s*=\s*["\']?([^"\'<>\s]*)["\']?[^>]*)?>#is', '$1', $str);
- }
-
- /**
- * Remove PHP tags from a string.
- *
- * @param string string to sanitize
- * @return string
- */
- public static function encode_php_tags($str)
- {
- return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);
- }
-
-} // End security \ No newline at end of file
diff --git a/kohana/helpers/text.php b/kohana/helpers/text.php
deleted file mode 100644
index ea648a19..00000000
--- a/kohana/helpers/text.php
+++ /dev/null
@@ -1,389 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Text helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class text_Core {
-
- /**
- * Limits a phrase to a given number of words.
- *
- * @param string phrase to limit words of
- * @param integer number of words to limit to
- * @param string end character or entity
- * @return string
- */
- public static function limit_words($str, $limit = 100, $end_char = NULL)
- {
- $limit = (int) $limit;
- $end_char = ($end_char === NULL) ? '&#8230;' : $end_char;
-
- if (trim($str) === '')
- return $str;
-
- if ($limit <= 0)
- return $end_char;
-
- preg_match('/^\s*+(?:\S++\s*+){1,'.$limit.'}/u', $str, $matches);
-
- // Only attach the end character if the matched string is shorter
- // than the starting string.
- return rtrim($matches[0]).(strlen($matches[0]) === strlen($str) ? '' : $end_char);
- }
-
- /**
- * Limits a phrase to a given number of characters.
- *
- * @param string phrase to limit characters of
- * @param integer number of characters to limit to
- * @param string end character or entity
- * @param boolean enable or disable the preservation of words while limiting
- * @return string
- */
- public static function limit_chars($str, $limit = 100, $end_char = NULL, $preserve_words = FALSE)
- {
- $end_char = ($end_char === NULL) ? '&#8230;' : $end_char;
-
- $limit = (int) $limit;
-
- if (trim($str) === '' OR utf8::strlen($str) <= $limit)
- return $str;
-
- if ($limit <= 0)
- return $end_char;
-
- if ($preserve_words == FALSE)
- {
- return rtrim(utf8::substr($str, 0, $limit)).$end_char;
- }
-
- preg_match('/^.{'.($limit - 1).'}\S*/us', $str, $matches);
-
- return rtrim($matches[0]).(strlen($matches[0]) == strlen($str) ? '' : $end_char);
- }
-
- /**
- * Alternates between two or more strings.
- *
- * @param string strings to alternate between
- * @return string
- */
- public static function alternate()
- {
- static $i;
-
- if (func_num_args() === 0)
- {
- $i = 0;
- return '';
- }
-
- $args = func_get_args();
- return $args[($i++ % count($args))];
- }
-
- /**
- * Generates a random string of a given type and length.
- *
- * @param string a type of pool, or a string of characters to use as the pool
- * @param integer length of string to return
- * @return string
- *
- * @tutorial alnum - alpha-numeric characters
- * @tutorial alpha - alphabetical characters
- * @tutorial numeric - digit characters, 0-9
- * @tutorial nozero - digit characters, 1-9
- * @tutorial distinct - clearly distinct alpha-numeric characters
- */
- public static function random($type = 'alnum', $length = 8)
- {
- $utf8 = FALSE;
-
- switch ($type)
- {
- case 'alnum':
- $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- break;
- case 'alpha':
- $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- break;
- case 'numeric':
- $pool = '0123456789';
- break;
- case 'nozero':
- $pool = '123456789';
- break;
- case 'distinct':
- $pool = '2345679ACDEFHJKLMNPRSTUVWXYZ';
- break;
- default:
- $pool = (string) $type;
- $utf8 = ! utf8::is_ascii($pool);
- break;
- }
-
- $str = '';
-
- $pool_size = ($utf8 === TRUE) ? utf8::strlen($pool) : strlen($pool);
-
- for ($i = 0; $i < $length; $i++)
- {
- $str .= ($utf8 === TRUE)
- ? utf8::substr($pool, mt_rand(0, $pool_size - 1), 1)
- : substr($pool, mt_rand(0, $pool_size - 1), 1);
- }
-
- return $str;
- }
-
- /**
- * Reduces multiple slashes in a string to single slashes.
- *
- * @param string string to reduce slashes of
- * @return string
- */
- public static function reduce_slashes($str)
- {
- return preg_replace('#(?<!:)//+#', '/', $str);
- }
-
- /**
- * Replaces the given words with a string.
- *
- * @param string phrase to replace words in
- * @param array words to replace
- * @param string replacement string
- * @param boolean replace words across word boundries (space, period, etc)
- * @return string
- */
- public static function censor($str, $badwords, $replacement = '#', $replace_partial_words = FALSE)
- {
- foreach ((array) $badwords as $key => $badword)
- {
- $badwords[$key] = str_replace('\*', '\S*?', preg_quote((string) $badword));
- }
-
- $regex = '('.implode('|', $badwords).')';
-
- if ($replace_partial_words == TRUE)
- {
- // Just using \b isn't sufficient when we need to replace a badword that already contains word boundaries itself
- $regex = '(?<=\b|\s|^)'.$regex.'(?=\b|\s|$)';
- }
-
- $regex = '!'.$regex.'!ui';
-
- if (utf8::strlen($replacement) == 1)
- {
- $regex .= 'e';
- return preg_replace($regex, 'str_repeat($replacement, utf8::strlen(\'$1\')', $str);
- }
-
- return preg_replace($regex, $replacement, $str);
- }
-
- /**
- * Finds the text that is similar between a set of words.
- *
- * @param array words to find similar text of
- * @return string
- */
- public static function similar(array $words)
- {
- // First word is the word to match against
- $word = current($words);
-
- for ($i = 0, $max = strlen($word); $i < $max; ++$i)
- {
- foreach ($words as $w)
- {
- // Once a difference is found, break out of the loops
- if ( ! isset($w[$i]) OR $w[$i] !== $word[$i])
- break 2;
- }
- }
-
- // Return the similar text
- return substr($word, 0, $i);
- }
-
- /**
- * Converts text email addresses and anchors into links.
- *
- * @param string text to auto link
- * @return string
- */
- public static function auto_link($text)
- {
- // Auto link emails first to prevent problems with "www.domain.com@example.com"
- return text::auto_link_urls(text::auto_link_emails($text));
- }
-
- /**
- * Converts text anchors into links.
- *
- * @param string text to auto link
- * @return string
- */
- public static function auto_link_urls($text)
- {
- // Finds all http/https/ftp/ftps links that are not part of an existing html anchor
- if (preg_match_all('~\b(?<!href="|">)(?:ht|f)tps?://\S+(?:/|\b)~i', $text, $matches))
- {
- foreach ($matches[0] as $match)
- {
- // Replace each link with an anchor
- $text = str_replace($match, html::anchor($match), $text);
- }
- }
-
- // Find all naked www.links.com (without http://)
- if (preg_match_all('~\b(?<!://)www(?:\.[a-z0-9][-a-z0-9]*+)+\.[a-z]{2,6}\b~i', $text, $matches))
- {
- foreach ($matches[0] as $match)
- {
- // Replace each link with an anchor
- $text = str_replace($match, html::anchor('http://'.$match, $match), $text);
- }
- }
-
- return $text;
- }
-
- /**
- * Converts text email addresses into links.
- *
- * @param string text to auto link
- * @return string
- */
- public static function auto_link_emails($text)
- {
- // Finds all email addresses that are not part of an existing html mailto anchor
- // Note: The "58;" negative lookbehind prevents matching of existing encoded html mailto anchors
- // The html entity for a colon (:) is &#58; or &#058; or &#0058; etc.
- if (preg_match_all('~\b(?<!href="mailto:|">|58;)(?!\.)[-+_a-z0-9.]++(?<!\.)@(?![-.])[-a-z0-9.]+(?<!\.)\.[a-z]{2,6}\b~i', $text, $matches))
- {
- foreach ($matches[0] as $match)
- {
- // Replace each email with an encoded mailto
- $text = str_replace($match, html::mailto($match), $text);
- }
- }
-
- return $text;
- }
-
- /**
- * Automatically applies <p> and <br /> markup to text. Basically nl2br() on steroids.
- *
- * @param string subject
- * @return string
- */
- public static function auto_p($str)
- {
- // Trim whitespace
- if (($str = trim($str)) === '')
- return '';
-
- // Standardize newlines
- $str = str_replace(array("\r\n", "\r"), "\n", $str);
-
- // Trim whitespace on each line
- $str = preg_replace('~^[ \t]+~m', '', $str);
- $str = preg_replace('~[ \t]+$~m', '', $str);
-
- // The following regexes only need to be executed if the string contains html
- if ($html_found = (strpos($str, '<') !== FALSE))
- {
- // Elements that should not be surrounded by p tags
- $no_p = '(?:p|div|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))';
-
- // Put at least two linebreaks before and after $no_p elements
- $str = preg_replace('~^<'.$no_p.'[^>]*+>~im', "\n$0", $str);
- $str = preg_replace('~</'.$no_p.'\s*+>$~im', "$0\n", $str);
- }
-
- // Do the <p> magic!
- $str = '<p>'.trim($str).'</p>';
- $str = preg_replace('~\n{2,}~', "</p>\n\n<p>", $str);
-
- // The following regexes only need to be executed if the string contains html
- if ($html_found !== FALSE)
- {
- // Remove p tags around $no_p elements
- $str = preg_replace('~<p>(?=</?'.$no_p.'[^>]*+>)~i', '', $str);
- $str = preg_replace('~(</?'.$no_p.'[^>]*+>)</p>~i', '$1', $str);
- }
-
- // Convert single linebreaks to <br />
- $str = preg_replace('~(?<!\n)\n(?!\n)~', "<br />\n", $str);
-
- return $str;
- }
-
- /**
- * Returns human readable sizes.
- * @see Based on original functions written by:
- * @see Aidan Lister: http://aidanlister.com/repos/v/function.size_readable.php
- * @see Quentin Zervaas: http://www.phpriot.com/d/code/strings/filesize-format/
- *
- * @param integer size in bytes
- * @param string a definitive unit
- * @param string the return string format
- * @param boolean whether to use SI prefixes or IEC
- * @return string
- */
- public static function bytes($bytes, $force_unit = NULL, $format = NULL, $si = TRUE)
- {
- // Format string
- $format = ($format === NULL) ? '%01.2f %s' : (string) $format;
-
- // IEC prefixes (binary)
- if ($si == FALSE OR strpos($force_unit, 'i') !== FALSE)
- {
- $units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
- $mod = 1024;
- }
- // SI prefixes (decimal)
- else
- {
- $units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB');
- $mod = 1000;
- }
-
- // Determine unit to use
- if (($power = array_search((string) $force_unit, $units)) === FALSE)
- {
- $power = ($bytes > 0) ? floor(log($bytes, $mod)) : 0;
- }
-
- return sprintf($format, $bytes / pow($mod, $power), $units[$power]);
- }
-
- /**
- * Prevents widow words by inserting a non-breaking space between the last two words.
- * @see http://www.shauninman.com/archive/2006/08/22/widont_wordpress_plugin
- *
- * @param string string to remove widows from
- * @return string
- */
- public static function widont($str)
- {
- $str = rtrim($str);
- $space = strrpos($str, ' ');
-
- if ($space !== FALSE)
- {
- $str = substr($str, 0, $space).'&nbsp;'.substr($str, $space + 1);
- }
-
- return $str;
- }
-
-} // End text \ No newline at end of file
diff --git a/kohana/helpers/upload.php b/kohana/helpers/upload.php
deleted file mode 100644
index 15839640..00000000
--- a/kohana/helpers/upload.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Upload helper class for working with the global $_FILES
- * array and Validation library.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class upload_Core {
-
- /**
- * Save an uploaded file to a new location.
- *
- * @param mixed name of $_FILE input or array of upload data
- * @param string new filename
- * @param string new directory
- * @param integer chmod mask
- * @return string full path to new file
- */
- public static function save($file, $filename = NULL, $directory = NULL, $chmod = 0644)
- {
- // Load file data from FILES if not passed as array
- $file = is_array($file) ? $file : $_FILES[$file];
-
- if ($filename === NULL)
- {
- // Use the default filename, with a timestamp pre-pended
- $filename = time().$file['name'];
- }
-
- if (Kohana::config('upload.remove_spaces') === TRUE)
- {
- // Remove spaces from the filename
- $filename = preg_replace('/\s+/', '_', $filename);
- }
-
- if ($directory === NULL)
- {
- // Use the pre-configured upload directory
- $directory = Kohana::config('upload.directory', TRUE);
- }
-
- // Make sure the directory ends with a slash
- $directory = rtrim($directory, '/').'/';
-
- if ( ! is_dir($directory) AND Kohana::config('upload.create_directories') === TRUE)
- {
- // Create the upload directory
- mkdir($directory, 0777, TRUE);
- }
-
- if ( ! is_writable($directory))
- throw new Kohana_Exception('upload.not_writable', $directory);
-
- if (is_uploaded_file($file['tmp_name']) AND move_uploaded_file($file['tmp_name'], $filename = $directory.$filename))
- {
- if ($chmod !== FALSE)
- {
- // Set permissions on filename
- chmod($filename, $chmod);
- }
-
- // Return new file path
- return $filename;
- }
-
- return FALSE;
- }
-
- /* Validation Rules */
-
- /**
- * Tests if input data is valid file type, even if no upload is present.
- *
- * @param array $_FILES item
- * @return bool
- */
- public static function valid($file)
- {
- return (is_array($file)
- AND isset($file['error'])
- AND isset($file['name'])
- AND isset($file['type'])
- AND isset($file['tmp_name'])
- AND isset($file['size']));
- }
-
- /**
- * Tests if input data has valid upload data.
- *
- * @param array $_FILES item
- * @return bool
- */
- public static function required(array $file)
- {
- return (isset($file['tmp_name'])
- AND isset($file['error'])
- AND is_uploaded_file($file['tmp_name'])
- AND (int) $file['error'] === UPLOAD_ERR_OK);
- }
-
- /**
- * Validation rule to test if an uploaded file is allowed by extension.
- *
- * @param array $_FILES item
- * @param array allowed file extensions
- * @return bool
- */
- public static function type(array $file, array $allowed_types)
- {
- if ((int) $file['error'] !== UPLOAD_ERR_OK)
- return TRUE;
-
- // Get the default extension of the file
- $extension = strtolower(substr(strrchr($file['name'], '.'), 1));
-
- // Get the mime types for the extension
- $mime_types = Kohana::config('mimes.'.$extension);
-
- // Make sure there is an extension, that the extension is allowed, and that mime types exist
- return ( ! empty($extension) AND in_array($extension, $allowed_types) AND is_array($mime_types));
- }
-
- /**
- * Validation rule to test if an uploaded file is allowed by file size.
- * File sizes are defined as: SB, where S is the size (1, 15, 300, etc) and
- * B is the byte modifier: (B)ytes, (K)ilobytes, (M)egabytes, (G)igabytes.
- * Eg: to limit the size to 1MB or less, you would use "1M".
- *
- * @param array $_FILES item
- * @param array maximum file size
- * @return bool
- */
- public static function size(array $file, array $size)
- {
- if ((int) $file['error'] !== UPLOAD_ERR_OK)
- return TRUE;
-
- // Only one size is allowed
- $size = strtoupper($size[0]);
-
- if ( ! preg_match('/[0-9]++[BKMG]/', $size))
- return FALSE;
-
- // Make the size into a power of 1024
- switch (substr($size, -1))
- {
- case 'G': $size = intval($size) * pow(1024, 3); break;
- case 'M': $size = intval($size) * pow(1024, 2); break;
- case 'K': $size = intval($size) * pow(1024, 1); break;
- default: $size = intval($size); break;
- }
-
- // Test that the file is under or equal to the max size
- return ($file['size'] <= $size);
- }
-
-} // End upload \ No newline at end of file
diff --git a/kohana/helpers/url.php b/kohana/helpers/url.php
deleted file mode 100644
index 12453936..00000000
--- a/kohana/helpers/url.php
+++ /dev/null
@@ -1,247 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * URL helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class url_Core {
-
- /**
- * Fetches the current URI.
- *
- * @param boolean include the query string
- * @return string
- */
- public static function current($qs = FALSE)
- {
- return ($qs === TRUE) ? Router::$complete_uri : Router::$current_uri;
- }
-
- /**
- * Base URL, with or without the index page.
- *
- * If protocol (and core.site_protocol) and core.site_domain are both empty,
- * then
- *
- * @param boolean include the index page
- * @param boolean non-default protocol
- * @return string
- */
- public static function base($index = FALSE, $protocol = FALSE)
- {
- if ($protocol == FALSE)
- {
- // Use the default configured protocol
- $protocol = Kohana::config('core.site_protocol');
- }
-
- // Load the site domain
- $site_domain = (string) Kohana::config('core.site_domain', TRUE);
-
- if ($protocol == FALSE)
- {
- if ($site_domain === '' OR $site_domain[0] === '/')
- {
- // Use the configured site domain
- $base_url = $site_domain;
- }
- else
- {
- // Guess the protocol to provide full http://domain/path URL
- $base_url = ((empty($_SERVER['HTTPS']) OR $_SERVER['HTTPS'] === 'off') ? 'http' : 'https').'://'.$site_domain;
- }
- }
- else
- {
- if ($site_domain === '' OR $site_domain[0] === '/')
- {
- // Guess the server name if the domain starts with slash
- $base_url = $protocol.'://'.$_SERVER['HTTP_HOST'].$site_domain;
- }
- else
- {
- // Use the configured site domain
- $base_url = $protocol.'://'.$site_domain;
- }
- }
-
- if ($index === TRUE AND $index = Kohana::config('core.index_page'))
- {
- // Append the index page
- $base_url = $base_url.$index;
- }
-
- // Force a slash on the end of the URL
- return rtrim($base_url, '/').'/';
- }
-
- /**
- * Fetches an absolute site URL based on a URI segment.
- *
- * @param string site URI to convert
- * @param string non-default protocol
- * @return string
- */
- public static function site($uri = '', $protocol = FALSE)
- {
- if ($path = trim(parse_url($uri, PHP_URL_PATH), '/'))
- {
- // Add path suffix
- $path .= Kohana::config('core.url_suffix');
- }
-
- if ($query = parse_url($uri, PHP_URL_QUERY))
- {
- // ?query=string
- $query = '?'.$query;
- }
-
- if ($fragment = parse_url($uri, PHP_URL_FRAGMENT))
- {
- // #fragment
- $fragment = '#'.$fragment;
- }
-
- // Concat the URL
- return url::base(TRUE, $protocol).$path.$query.$fragment;
- }
-
- /**
- * Return the URL to a file. Absolute filenames and relative filenames
- * are allowed.
- *
- * @param string filename
- * @param boolean include the index page
- * @return string
- */
- public static function file($file, $index = FALSE)
- {
- if (strpos($file, '://') === FALSE)
- {
- // Add the base URL to the filename
- $file = url::base($index).$file;
- }
-
- return $file;
- }
-
- /**
- * Merges an array of arguments with the current URI and query string to
- * overload, instead of replace, the current query string.
- *
- * @param array associative array of arguments
- * @return string
- */
- public static function merge(array $arguments)
- {
- if ($_GET === $arguments)
- {
- $query = Router::$query_string;
- }
- elseif ($query = http_build_query(array_merge($_GET, $arguments)))
- {
- $query = '?'.$query;
- }
-
- // Return the current URI with the arguments merged into the query string
- return Router::$current_uri.$query;
- }
-
- /**
- * Convert a phrase to a URL-safe title.
- *
- * @param string phrase to convert
- * @param string word separator (- or _)
- * @return string
- */
- public static function title($title, $separator = '-')
- {
- $separator = ($separator === '-') ? '-' : '_';
-
- // Replace accented characters by their unaccented equivalents
- $title = utf8::transliterate_to_ascii($title);
-
- // Remove all characters that are not the separator, a-z, 0-9, or whitespace
- $title = preg_replace('/[^'.$separator.'a-z0-9\s]+/', '', strtolower($title));
-
- // Replace all separator characters and whitespace by a single separator
- $title = preg_replace('/['.$separator.'\s]+/', $separator, $title);
-
- // Trim separators from the beginning and end
- return trim($title, $separator);
- }
-
- /**
- * Sends a page redirect header.
- *
- * @param mixed string site URI or URL to redirect to, or array of strings if method is 300
- * @param string HTTP method of redirect
- * @return void
- */
- public static function redirect($uri = '', $method = '302')
- {
- if (Event::has_run('system.send_headers'))
- return;
-
- $uri = (array) $uri;
-
- for ($i = 0, $count_uri = count($uri); $i < $count_uri; $i++)
- {
- if (strpos($uri[$i], '://') === FALSE)
- {
- $uri[$i] = url::site($uri[$i]);
- }
- }
-
- if ($method == '300')
- {
- if ($count_uri > 0)
- {
- header('HTTP/1.1 300 Multiple Choices');
- header('Location: '.$uri[0]);
-
- $choices = '';
- foreach ($uri as $href)
- {
- $choices .= '<li><a href="'.$href.'">'.$href.'</a></li>';
- }
-
- exit('<h1>301 - Multiple Choices:</h1><ul>'.$choices.'</ul>');
- }
- }
- else
- {
- $uri = $uri[0];
-
- if ($method == 'refresh')
- {
- header('Refresh: 0; url='.$uri);
- }
- else
- {
- $codes = array
- (
- '301' => 'Moved Permanently',
- '302' => 'Found',
- '303' => 'See Other',
- '304' => 'Not Modified',
- '305' => 'Use Proxy',
- '307' => 'Temporary Redirect'
- );
-
- $method = isset($codes[$method]) ? $method : '302';
-
- header('HTTP/1.1 '.$method.' '.$codes[$method]);
- header('Location: '.$uri);
- }
-
- exit('<h1>'.$method.' - '.$codes[$method].'</h1><p><a href="'.$uri.'">'.$uri.'</a></p>');
- }
- }
-
-} // End url \ No newline at end of file
diff --git a/kohana/helpers/valid.php b/kohana/helpers/valid.php
deleted file mode 100644
index cee303fd..00000000
--- a/kohana/helpers/valid.php
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php defined('SYSPATH') or die('No direct script access.');
-/**
- * Validation helper class.
- *
- * $Id$
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
-class valid_Core {
-
- /**
- * Validate email, commonly used characters only
- *
- * @param string email address
- * @return boolean
- */
- public static function email($email)
- {
- return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', (string) $email);
- }
-
- /**
- * Validate the domain of an email address by checking if the domain has a
- * valid MX record.
- *
- * @param string email address
- * @return boolean
- */
- public static function email_domain($email)
- {
- // If we can't prove the domain is invalid, consider it valid
- // Note: checkdnsrr() is not implemented on Windows platforms
- if ( ! function_exists('checkdnsrr'))
- return TRUE;
-
- // Check if the email domain has a valid MX record
- return (bool) checkdnsrr(preg_replace('/^[^@]+@/', '', $email), 'MX');
- }
-
- /**
- * Validate email, RFC compliant version
- * Note: This function is LESS strict than valid_email. Choose carefully.
- *
- * @see Originally by Cal Henderson, modified to fit Kohana syntax standards:
- * @see http://www.iamcal.com/publish/articles/php/parsing_email/
- * @see http://www.w3.org/Protocols/rfc822/
- *
- * @param string email address
- * @return boolean
- */
- public static function email_rfc($email)
- {
- $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
- $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
- $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
- $pair = '\\x5c[\\x00-\\x7f]';
-
- $domain_literal = "\\x5b($dtext|$pair)*\\x5d";
- $quoted_string = "\\x22($qtext|$pair)*\\x22";
- $sub_domain = "($atom|$domain_literal)";
- $word = "($atom|$quoted_string)";
- $domain = "$sub_domain(\\x2e$sub_domain)*";
- $local_part = "$word(\\x2e$word)*";
- $addr_spec = "$local_part\\x40$domain";
-
- return (bool) preg_match('/^'.$addr_spec.'$/D', (string) $email);
- }
-
- /**
- * Validate URL
- *
- * @param string URL
- * @return boolean
- */
- public static function url($url)
- {
- return (bool) filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED);
- }
-
- /**
- * Validate IP
- *
- * @param string IP address
- * @param boolean allow IPv6 addresses
- * @return boolean
- */
- public static function ip($ip, $ipv6 = FALSE)
- {
- // Do not allow private and reserved range IPs
- $flags = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
-
- if ($ipv6 === TRUE)
- return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flags);
-
- return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flags | FILTER_FLAG_IPV4);
- }
-
- /**
- * Validates a credit card number using the Luhn (mod10) formula.
- * @see http://en.wikipedia.org/wiki/Luhn_algorithm
- *
- * @param integer credit card number
- * @param string|array card type, or an array of card types
- * @return boolean
- */
- public static function credit_card($number, $type = NULL)
- {
- // Remove all non-digit characters from the number
- if (($number = preg_replace('/\D+/', '', $number)) === '')
- return FALSE;
-
- if ($type == NULL)
- {
- // Use the default type
- $type = 'default';
- }
- elseif (is_array($type))
- {
- foreach ($type as $t)
- {
- // Test each type for validity
- if (valid::credit_card($number, $t))
- return TRUE;
- }
-
- return FALSE;
- }
-
- $cards = Kohana::config('credit_cards');
-
- // Check card type
- $type = strtolower($type);
-
- if ( ! isset($cards[$type]))
- return FALSE;
-
- // Check card number length
- $length = strlen($number);
-
- // Validate the card length by the card type
- if ( ! in_array($length, preg_split('/\D+/', $cards[$type]['length'])))
- return FALSE;
-
- // Check card number prefix
- if ( ! preg_match('/^'.$cards[$type]['prefix'].'/', $number))
- return FALSE;
-
- // No Luhn check required
- if ($cards[$type]['luhn'] == FALSE)
- return TRUE;
-
- // Checksum of the card number
- $checksum = 0;
-
- for ($i = $length - 1; $i >= 0; $i -= 2)
- {
- // Add up every 2nd digit, starting from the right
- $checksum += substr($number, $i, 1);
- }
-
- for ($i = $length - 2; $i >= 0; $i -= 2)
- {
- // Add up every 2nd digit doubled, starting from the right
- $double = substr($number, $i, 1) * 2;
-
- // Subtract 9 from the double where value is greater than 10
- $checksum += ($double >= 10) ? $double - 9 : $double;
- }
-
- // If the checksum is a multiple of 10, the number is valid
- return ($checksum % 10 === 0);
- }
-
- /**
- * Checks if a phone number is valid.
- *
- * @param string phone number to check
- * @return boolean
- */
- public static function phone($number, $lengths = NULL)
- {
- if ( ! is_array($lengths))
- {
- $lengths = array(7,10,11);
- }
-
- // Remove all non-digit characters from the number
- $number = preg_replace('/\D+/', '', $number);
-
- // Check if the number is within range
- return in_array(strlen($number), $lengths);
- }
-
- /**
- * Checks whether a string consists of alphabetical characters only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^\pL++$/uD', (string) $str)
- : ctype_alpha((string) $str);
- }
-
- /**
- * Checks whether a string consists of alphabetical characters and numbers only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha_numeric($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^[\pL\pN]++$/uD', (string) $str)
- : ctype_alnum((string) $str);
- }
-
- /**
- * Checks whether a string consists of alphabetical characters, numbers, underscores and dashes only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha_dash($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^[-\pL\pN_]++$/uD', (string) $str)
- : (bool) preg_match('/^[-a-z0-9_]++$/iD', (string) $str);
- }
-
- /**
- * Checks whether a string consists of digits only (no dots or dashes).
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function digit($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^\pN++$/uD', (string) $str)
- : ctype_digit((string) $str);
- }
-
- /**
- * Checks whether a string is a valid number (negative and decimal numbers allowed).
- *
- * @param string input string
- * @return boolean
- */
- public static function numeric($str)
- {
- return (is_numeric($str) AND preg_match('/^[-0-9.]++$/D', (string) $str));
- }
-
- /**
- * Checks whether a string is a valid text. Letters, numbers, whitespace,
- * dashes, periods, and underscores are allowed.
- *
- * @param string $str
- * @return boolean
- */
- public static function standard_text($str)
- {
- return (bool) preg_match('/^[-\pL\pN\pZ_.]++$/uD', (string) $str);
- }
-
- /**
- * Checks if a string is a proper decimal format. The format array can be
- * used to specify a decimal length, or a number and decimal length, eg:
- * array(2) would force the number to have 2 decimal places, array(4,2)
- * would force the number to have 4 digits and 2 decimal places.
- *
- * @param string input string
- * @param array decimal format: y or x,y
- * @return boolean
- */
- public static function decimal($str, $format = NULL)
- {
- // Create the pattern
- $pattern = '/^[0-9]%s\.[0-9]%s$/';
-
- if ( ! empty($format))
- {
- if (count($format) > 1)
- {
- // Use the format for number and decimal length
- $pattern = sprintf($pattern, '{'.$format[0].'}', '{'.$format[1].'}');
- }
- elseif (count($format) > 0)
- {
- // Use the format as decimal length
- $pattern = sprintf($pattern, '+', '{'.$format[0].'}');
- }
- }
- else
- {
- // No format
- $pattern = sprintf($pattern, '+', '+');
- }
-
- return (bool) preg_match($pattern, (string) $str);
- }
-
-} // End valid \ No newline at end of file