Exemplo n.º 1
0
/**
 * utf8::strtolower
 *
 * @package    Core
 * @author     Kohana Team
 * @copyright  (c) 2007-2008 Kohana Team
 * @copyright  (c) 2005 Harry Fuecks
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
 */
function _strtolower($str)
{
    if (utf8::is_ascii($str)) {
        return strtolower($str);
    }
    static $UTF8_UPPER_TO_LOWER = NULL;
    if ($UTF8_UPPER_TO_LOWER === NULL) {
        $UTF8_UPPER_TO_LOWER = array(0x41 => 0x61, 0x3a6 => 0x3c6, 0x162 => 0x163, 0xc5 => 0xe5, 0x42 => 0x62, 0x139 => 0x13a, 0xc1 => 0xe1, 0x141 => 0x142, 0x38e => 0x3cd, 0x100 => 0x101, 0x490 => 0x491, 0x394 => 0x3b4, 0x15a => 0x15b, 0x44 => 0x64, 0x393 => 0x3b3, 0xd4 => 0xf4, 0x42a => 0x44a, 0x419 => 0x439, 0x112 => 0x113, 0x41c => 0x43c, 0x15e => 0x15f, 0x143 => 0x144, 0xce => 0xee, 0x40e => 0x45e, 0x42f => 0x44f, 0x39a => 0x3ba, 0x154 => 0x155, 0x49 => 0x69, 0x53 => 0x73, 0x1e1e => 0x1e1f, 0x134 => 0x135, 0x427 => 0x447, 0x3a0 => 0x3c0, 0x418 => 0x438, 0xd3 => 0xf3, 0x420 => 0x440, 0x404 => 0x454, 0x415 => 0x435, 0x429 => 0x449, 0x14a => 0x14b, 0x411 => 0x431, 0x409 => 0x459, 0x1e02 => 0x1e03, 0xd6 => 0xf6, 0xd9 => 0xf9, 0x4e => 0x6e, 0x401 => 0x451, 0x3a4 => 0x3c4, 0x423 => 0x443, 0x15c => 0x15d, 0x403 => 0x453, 0x3a8 => 0x3c8, 0x158 => 0x159, 0x47 => 0x67, 0xc4 => 0xe4, 0x386 => 0x3ac, 0x389 => 0x3ae, 0x166 => 0x167, 0x39e => 0x3be, 0x164 => 0x165, 0x116 => 0x117, 0x108 => 0x109, 0x56 => 0x76, 0xde => 0xfe, 0x156 => 0x157, 0xda => 0xfa, 0x1e60 => 0x1e61, 0x1e82 => 0x1e83, 0xc2 => 0xe2, 0x118 => 0x119, 0x145 => 0x146, 0x50 => 0x70, 0x150 => 0x151, 0x42e => 0x44e, 0x128 => 0x129, 0x3a7 => 0x3c7, 0x13d => 0x13e, 0x422 => 0x442, 0x5a => 0x7a, 0x428 => 0x448, 0x3a1 => 0x3c1, 0x1e80 => 0x1e81, 0x16c => 0x16d, 0xd5 => 0xf5, 0x55 => 0x75, 0x176 => 0x177, 0xdc => 0xfc, 0x1e56 => 0x1e57, 0x3a3 => 0x3c3, 0x41a => 0x43a, 0x4d => 0x6d, 0x16a => 0x16b, 0x170 => 0x171, 0x424 => 0x444, 0xcc => 0xec, 0x168 => 0x169, 0x39f => 0x3bf, 0x4b => 0x6b, 0xd2 => 0xf2, 0xc0 => 0xe0, 0x414 => 0x434, 0x3a9 => 0x3c9, 0x1e6a => 0x1e6b, 0xc3 => 0xe3, 0x42d => 0x44d, 0x416 => 0x436, 0x1a0 => 0x1a1, 0x10c => 0x10d, 0x11c => 0x11d, 0xd0 => 0xf0, 0x13b => 0x13c, 0x40f => 0x45f, 0x40a => 0x45a, 0xc8 => 0xe8, 0x3a5 => 0x3c5, 0x46 => 0x66, 0xdd => 0xfd, 0x43 => 0x63, 0x21a => 0x21b, 0xca => 0xea, 0x399 => 0x3b9, 0x179 => 0x17a, 0xcf => 0xef, 0x1af => 0x1b0, 0x45 => 0x65, 0x39b => 0x3bb, 0x398 => 0x3b8, 0x39c => 0x3bc, 0x40c => 0x45c, 0x41f => 0x43f, 0x42c => 0x44c, 0xde => 0xfe, 0xd0 => 0xf0, 0x1ef2 => 0x1ef3, 0x48 => 0x68, 0xcb => 0xeb, 0x110 => 0x111, 0x413 => 0x433, 0x12e => 0x12f, 0xc6 => 0xe6, 0x58 => 0x78, 0x160 => 0x161, 0x16e => 0x16f, 0x391 => 0x3b1, 0x407 => 0x457, 0x172 => 0x173, 0x178 => 0xff, 0x4f => 0x6f, 0x41b => 0x43b, 0x395 => 0x3b5, 0x425 => 0x445, 0x120 => 0x121, 0x17d => 0x17e, 0x17b => 0x17c, 0x396 => 0x3b6, 0x392 => 0x3b2, 0x388 => 0x3ad, 0x1e84 => 0x1e85, 0x174 => 0x175, 0x51 => 0x71, 0x417 => 0x437, 0x1e0a => 0x1e0b, 0x147 => 0x148, 0x104 => 0x105, 0x408 => 0x458, 0x14c => 0x14d, 0xcd => 0xed, 0x59 => 0x79, 0x10a => 0x10b, 0x38f => 0x3ce, 0x52 => 0x72, 0x410 => 0x430, 0x405 => 0x455, 0x402 => 0x452, 0x126 => 0x127, 0x136 => 0x137, 0x12a => 0x12b, 0x38a => 0x3af, 0x42b => 0x44b, 0x4c => 0x6c, 0x397 => 0x3b7, 0x124 => 0x125, 0x218 => 0x219, 0xdb => 0xfb, 0x11e => 0x11f, 0x41e => 0x43e, 0x1e40 => 0x1e41, 0x39d => 0x3bd, 0x106 => 0x107, 0x3ab => 0x3cb, 0x426 => 0x446, 0xde => 0xfe, 0xc7 => 0xe7, 0x3aa => 0x3ca, 0x421 => 0x441, 0x412 => 0x432, 0x10e => 0x10f, 0xd8 => 0xf8, 0x57 => 0x77, 0x11a => 0x11b, 0x54 => 0x74, 0x4a => 0x6a, 0x40b => 0x45b, 0x406 => 0x456, 0x102 => 0x103, 0x39b => 0x3bb, 0xd1 => 0xf1, 0x41d => 0x43d, 0x38c => 0x3cc, 0xc9 => 0xe9, 0xd0 => 0xf0, 0x407 => 0x457, 0x122 => 0x123);
    }
    $uni = utf8::to_unicode($str);
    if ($uni === FALSE) {
        return FALSE;
    }
    for ($i = 0, $c = count($uni); $i < $c; $i++) {
        if (isset($UTF8_UPPER_TO_LOWER[$uni[$i]])) {
            $uni[$i] = $UTF8_UPPER_TO_LOWER[$uni[$i]];
        }
    }
    return utf8::from_unicode($uni);
}
Exemplo n.º 2
0
/**
 * utf8::strtoupper
 *
 * @package    Core
 * @author     Kohana Team
 * @copyright  (c) 2007-2008 Kohana Team
 * @copyright  (c) 2005 Harry Fuecks
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
 */
function _strtoupper($str)
{
    if (utf8::is_ascii($str)) {
        return strtoupper($str);
    }
    static $UTF8_LOWER_TO_UPPER = NULL;
    if ($UTF8_LOWER_TO_UPPER === NULL) {
        $UTF8_LOWER_TO_UPPER = array(0x61 => 0x41, 0x3c6 => 0x3a6, 0x163 => 0x162, 0xe5 => 0xc5, 0x62 => 0x42, 0x13a => 0x139, 0xe1 => 0xc1, 0x142 => 0x141, 0x3cd => 0x38e, 0x101 => 0x100, 0x491 => 0x490, 0x3b4 => 0x394, 0x15b => 0x15a, 0x64 => 0x44, 0x3b3 => 0x393, 0xf4 => 0xd4, 0x44a => 0x42a, 0x439 => 0x419, 0x113 => 0x112, 0x43c => 0x41c, 0x15f => 0x15e, 0x144 => 0x143, 0xee => 0xce, 0x45e => 0x40e, 0x44f => 0x42f, 0x3ba => 0x39a, 0x155 => 0x154, 0x69 => 0x49, 0x73 => 0x53, 0x1e1f => 0x1e1e, 0x135 => 0x134, 0x447 => 0x427, 0x3c0 => 0x3a0, 0x438 => 0x418, 0xf3 => 0xd3, 0x440 => 0x420, 0x454 => 0x404, 0x435 => 0x415, 0x449 => 0x429, 0x14b => 0x14a, 0x431 => 0x411, 0x459 => 0x409, 0x1e03 => 0x1e02, 0xf6 => 0xd6, 0xf9 => 0xd9, 0x6e => 0x4e, 0x451 => 0x401, 0x3c4 => 0x3a4, 0x443 => 0x423, 0x15d => 0x15c, 0x453 => 0x403, 0x3c8 => 0x3a8, 0x159 => 0x158, 0x67 => 0x47, 0xe4 => 0xc4, 0x3ac => 0x386, 0x3ae => 0x389, 0x167 => 0x166, 0x3be => 0x39e, 0x165 => 0x164, 0x117 => 0x116, 0x109 => 0x108, 0x76 => 0x56, 0xfe => 0xde, 0x157 => 0x156, 0xfa => 0xda, 0x1e61 => 0x1e60, 0x1e83 => 0x1e82, 0xe2 => 0xc2, 0x119 => 0x118, 0x146 => 0x145, 0x70 => 0x50, 0x151 => 0x150, 0x44e => 0x42e, 0x129 => 0x128, 0x3c7 => 0x3a7, 0x13e => 0x13d, 0x442 => 0x422, 0x7a => 0x5a, 0x448 => 0x428, 0x3c1 => 0x3a1, 0x1e81 => 0x1e80, 0x16d => 0x16c, 0xf5 => 0xd5, 0x75 => 0x55, 0x177 => 0x176, 0xfc => 0xdc, 0x1e57 => 0x1e56, 0x3c3 => 0x3a3, 0x43a => 0x41a, 0x6d => 0x4d, 0x16b => 0x16a, 0x171 => 0x170, 0x444 => 0x424, 0xec => 0xcc, 0x169 => 0x168, 0x3bf => 0x39f, 0x6b => 0x4b, 0xf2 => 0xd2, 0xe0 => 0xc0, 0x434 => 0x414, 0x3c9 => 0x3a9, 0x1e6b => 0x1e6a, 0xe3 => 0xc3, 0x44d => 0x42d, 0x436 => 0x416, 0x1a1 => 0x1a0, 0x10d => 0x10c, 0x11d => 0x11c, 0xf0 => 0xd0, 0x13c => 0x13b, 0x45f => 0x40f, 0x45a => 0x40a, 0xe8 => 0xc8, 0x3c5 => 0x3a5, 0x66 => 0x46, 0xfd => 0xdd, 0x63 => 0x43, 0x21b => 0x21a, 0xea => 0xca, 0x3b9 => 0x399, 0x17a => 0x179, 0xef => 0xcf, 0x1b0 => 0x1af, 0x65 => 0x45, 0x3bb => 0x39b, 0x3b8 => 0x398, 0x3bc => 0x39c, 0x45c => 0x40c, 0x43f => 0x41f, 0x44c => 0x42c, 0xfe => 0xde, 0xf0 => 0xd0, 0x1ef3 => 0x1ef2, 0x68 => 0x48, 0xeb => 0xcb, 0x111 => 0x110, 0x433 => 0x413, 0x12f => 0x12e, 0xe6 => 0xc6, 0x78 => 0x58, 0x161 => 0x160, 0x16f => 0x16e, 0x3b1 => 0x391, 0x457 => 0x407, 0x173 => 0x172, 0xff => 0x178, 0x6f => 0x4f, 0x43b => 0x41b, 0x3b5 => 0x395, 0x445 => 0x425, 0x121 => 0x120, 0x17e => 0x17d, 0x17c => 0x17b, 0x3b6 => 0x396, 0x3b2 => 0x392, 0x3ad => 0x388, 0x1e85 => 0x1e84, 0x175 => 0x174, 0x71 => 0x51, 0x437 => 0x417, 0x1e0b => 0x1e0a, 0x148 => 0x147, 0x105 => 0x104, 0x458 => 0x408, 0x14d => 0x14c, 0xed => 0xcd, 0x79 => 0x59, 0x10b => 0x10a, 0x3ce => 0x38f, 0x72 => 0x52, 0x430 => 0x410, 0x455 => 0x405, 0x452 => 0x402, 0x127 => 0x126, 0x137 => 0x136, 0x12b => 0x12a, 0x3af => 0x38a, 0x44b => 0x42b, 0x6c => 0x4c, 0x3b7 => 0x397, 0x125 => 0x124, 0x219 => 0x218, 0xfb => 0xdb, 0x11f => 0x11e, 0x43e => 0x41e, 0x1e41 => 0x1e40, 0x3bd => 0x39d, 0x107 => 0x106, 0x3cb => 0x3ab, 0x446 => 0x426, 0xfe => 0xde, 0xe7 => 0xc7, 0x3ca => 0x3aa, 0x441 => 0x421, 0x432 => 0x412, 0x10f => 0x10e, 0xf8 => 0xd8, 0x77 => 0x57, 0x11b => 0x11a, 0x74 => 0x54, 0x6a => 0x4a, 0x45b => 0x40b, 0x456 => 0x406, 0x103 => 0x102, 0x3bb => 0x39b, 0xf1 => 0xd1, 0x43d => 0x41d, 0x3cc => 0x38c, 0xe9 => 0xc9, 0xf0 => 0xd0, 0x457 => 0x407, 0x123 => 0x122);
    }
    $uni = utf8::to_unicode($str);
    if ($uni === FALSE) {
        return FALSE;
    }
    for ($i = 0, $c = count($uni); $i < $c; $i++) {
        if (isset($UTF8_LOWER_TO_UPPER[$uni[$i]])) {
            $uni[$i] = $UTF8_LOWER_TO_UPPER[$uni[$i]];
        }
    }
    return utf8::from_unicode($uni);
}
Exemplo n.º 3
0
Arquivo: search.php Projeto: rair/yacs
 * @tester Emmanuel Beucher
 * @tester Manuel Lopez Gallego
 * @reference
 * @license http://www.gnu.org/copyleft/lesser.txt GNU Lesser General Public License
 */
// common definitions and initial processing
include_once 'shared/global.php';
include_once 'services/call.php';
// list RSS resources
// prevent attacks
$search = '';
if (isset($_REQUEST['search'])) {
    $search = preg_replace('/[\'"]/', ' ', strip_tags($_REQUEST['search']));
}
// convert from unicode to utf8
$search = utf8::from_unicode($search);
// ensure we are really looking for something
if (preg_match('/^(chercher|search)/i', $search)) {
    $search = '';
}
// search is constrained to only one section
$section_id = '';
if (isset($_REQUEST['anchor']) && strpos($_REQUEST['anchor'], 'section:') === 0) {
    $section_id = str_replace('section:', '', $_REQUEST['anchor']);
}
$section_id = strip_tags($section_id);
// offset, to navigate in result set
$offset = 1.0;
if (isset($_REQUEST['offset'])) {
    $offset = (double) $_REQUEST['offset'];
}
Exemplo n.º 4
0
Arquivo: utf8.php Projeto: rair/yacs
 /**
  * transcode arrays recursively
  *
  * @param array the variable to convert
  * @return converted object (which is also the input array)
  */
 public static function from_unicode_recursively(&$input)
 {
     global $context;
     // sanity check
     if (!is_array($input)) {
         return utf8::from_unicode($input);
     }
     // process all attributes
     foreach ($input as $name => $value) {
         if (is_array($value)) {
             $input[$name] = utf8::from_unicode_recursively($value);
         } else {
             $input[$name] = utf8::from_unicode($value);
         }
     }
     return $input;
 }
Exemplo n.º 5
0
 * @author Bernard Paques
 * @reference
 * @license http://www.gnu.org/copyleft/lesser.txt GNU Lesser General Public License
 */
include_once '../shared/global.php';
// load a skin engine
load_skin('services');
// process raw content
$raw_data = file_get_contents("php://input");
// save the raw request if debug mode
if (isset($context['debug_rpc']) && $context['debug_rpc'] == 'Y') {
    Logger::remember('services/json_rpc.php: json_rpc request', rawurldecode($raw_data), 'debug');
}
// transcode to our internal charset
if ($context['charset'] == 'utf-8') {
    $raw_data = utf8::from_unicode($raw_data);
}
// decode request components -- use rawurldecode() instead urldecode(), else you will loose + signs
$parameters = Safe::json_decode(rawurldecode($raw_data));
// prepare the response
$response = array();
// replicate version, if any (JSON-RPC 1.1)
if (!empty($parameters['version'])) {
    $response['version'] = $parameters['version'];
}
// replicate keyword, if any (JSON-RPC 2.0)
if (!empty($parameters['jsonrpc'])) {
    $response['jsonrpc'] = $parameters['jsonrpc'];
}
// no result yet
$response['result'] = NULL;
Exemplo n.º 6
0
 /**
  * restore an instance
  *
  * This function unserializes piggy-back data and uses it to populate an overlay instance.
  *
  * [php]
  * // get the record from the database
  * $item = Articles::get($id);
  *
  * // extract overlay data from $item['overlay']
  * $overlay = Overlay::load($item, 'article:'.$item['id']);
  * [/php]
  *
  * @see articles/delete.php
  * @see articles/edit.php
  * @see articles/view.php
  *
  * @param array the hosting array
  * @param string reference of the containing page (e.g., 'article:123')
  * @return a restored instance, or NULL
  */
 public static final function load($host, $reference = '')
 {
     global $context;
     if (is_object($host)) {
         $data = $host->item;
     } else {
         $data = $host;
     }
     // no overlay yet
     if (!isset($data['overlay']) || !$data['overlay']) {
         return NULL;
     }
     // retrieve the content of the overlay
     if (($attributes = Safe::unserialize($data['overlay'])) === FALSE) {
         return NULL;
     }
     // restore unicode entities
     foreach ($attributes as $name => $value) {
         if (is_string($value)) {
             $attributes[$name] = utf8::from_unicode($value);
         }
     }
     // we need a type
     if (!is_array($attributes) || !isset($attributes['overlay_type'])) {
         return NULL;
     }
     // bind this to current page
     if (isset($data['id'])) {
         $attributes['id'] = $data['id'];
     }
     // use one particular overlay instance
     $overlay = Overlay::bind($attributes['overlay_type']);
     if (is_object($overlay)) {
         $overlay->attributes = $attributes;
         // expose all of the anchor interface to the contained overlay
         if (!is_object($host)) {
             $overlay->anchor = Anchors::get($reference);
         } else {
             $overlay->anchor = $host;
         }
         // ready to use!
         return $overlay;
     }
     // unknown overlay type or empty overlay
     return NULL;
 }
Exemplo n.º 7
0
Arquivo: sql.php Projeto: rair/yacs
 /**
  * process statements from a file
  *
  * Page is updated on error.
  *
  * @param string file name
  * @return integer number of processed statements, or FALSE on error
  */
 public static function process($name)
 {
     global $context;
     // uncompress while reading
     if (!($handle = gzopen($name, 'rb'))) {
         $context['text'] .= '<p>' . sprintf(i18n::s('Impossible to read %s.'), $name) . "</p>\n";
         return FALSE;
     }
     // ensure enough execution time
     Safe::set_time_limit(30);
     // process every line
     $query = '';
     $queries = 0;
     $count = 0;
     $errors = 0;
     while (!gzeof($handle)) {
         // lines can be quite big...
         $line = gzgets($handle, 262144);
         // current line, for possible error reporting
         $count++;
         if (!$query) {
             $here = $count;
         }
         // transcode unicode entities --including those with a &#
         $line =& utf8::from_unicode($line);
         // skip empty lines
         $line = trim($line, " \t\r\n\v");
         if (!$line) {
             continue;
         }
         if ($line == '--') {
             continue;
         }
         // skip line comments
         if ($line[0] == '#') {
             continue;
         }
         if (strncmp($line, '-- ', 3) == 0) {
             continue;
         }
         // look for closing ";"
         $last = strlen($line) - 1;
         if ($line[$last] == ';') {
             if ($last == 0) {
                 $line = '';
             } else {
                 $line = substr($line, 0, $last);
             }
             $execute = TRUE;
         } else {
             $execute = FALSE;
         }
         // a statement
         $query .= trim($line);
         // end of statement - process it
         if ($query && ($execute || gzeof($handle))) {
             // execute the statement
             if (!SQL::query($query, TRUE) && SQL::errno()) {
                 $errors++;
                 if ($errors < 50) {
                     // display the faulty query on first errors
                     $context['text'] .= '<p>' . $here . ': ' . $query . BR . SQL::error() . "</p>\n";
                 } else {
                     // only report line in error afterwards
                     $context['text'] .= '<p>' . $here . ': ' . SQL::error() . "</p>\n";
                 }
             }
             // next query
             $query = '';
             $queries++;
             // ensure we have enough time
             if (!($queries % 50)) {
                 Safe::set_time_limit(30);
             }
         }
     }
     // the number of processed queries
     return $queries;
 }
Exemplo n.º 8
0
Arquivo: mailer.php Projeto: rair/yacs
 /**
  * encode message subject
  *
  * This function preserves the original subject line if it only has ASCII characters.
  * Else is encodes it using UTF-8.
  *
  * @param string the original subject
  * @return string the encoded subject
  */
 public static function encode_subject($text)
 {
     // no new line nor HTML tag in title
     $text = preg_replace('/\\s+/', ' ', strip_tags($text));
     // encode if text is not pure ASCII - ' ' = 0x20 and 'z' = 0x7a
     if (preg_match('/[^ -z]/', $text)) {
         // make it utf-8
         $text = utf8::from_unicode($text);
         // encode it for the transfer --see RFC 2047
         $text = '=?utf-8?B?' . base64_encode($text) . '?=';
     }
     // done
     return $text;
 }
Exemplo n.º 9
0
Arquivo: backup.php Projeto: rair/yacs
     $context['text'] .= '<p>' . i18n::s('No statement has been uploaded.') . "</p>\n";
 } else {
     // ensure enough execution time
     Safe::set_time_limit(30);
     // process every line
     $query = '';
     $queries = 0;
     $count = 0;
     foreach ($lines as $line) {
         // current line, for possible error reporting
         $count++;
         if (!$query) {
             $here = $count;
         }
         // transcode unicode entities --including those with a &#
         $line =& utf8::from_unicode($line);
         // skip empty lines
         $line = trim($line, " \t\r\n\v");
         if (!$line) {
             continue;
         }
         if ($line == '--') {
             continue;
         }
         // skip line comments
         if ($line[0] == '#') {
             continue;
         }
         if (strncmp($line, '-- ', 3) == 0) {
             continue;
         }
Exemplo n.º 10
0
Arquivo: view.php Projeto: rair/yacs
 if (isset($item['id']) && (!isset($context['skins_general_without_feed']) || $context['skins_general_without_feed'] != 'Y')) {
     $content = Skin::build_link($context['url_to_home'] . $context['url_to_root'] . Categories::get_url($item['id'], 'feed'), i18n::s('Recent pages'), 'xml');
     // public aggregators
     // 		if(!isset($context['without_internet_visibility']) || ($context['without_internet_visibility'] != 'Y'))
     // 			$content .= BR.join(BR, Skin::build_subscribers($context['url_to_home'].$context['url_to_root'].Categories::get_url($item['id'], 'feed'), $item['title']));
     $context['components']['channels'] = Skin::build_box(i18n::s('Monitor'), $content, 'channels', 'feeds');
 }
 // search on keyword, if any
 if ($item['keywords']) {
     // internal search
     $label = sprintf(i18n::s('Maybe some new pages or additional material can be found by submitting the following keyword to our search engine. Give it a try. %s'), Codes::beautify('[search=' . $item['keywords'] . ']'));
     $context['components']['boxes'] .= Skin::build_box(i18n::s('Internal search'), $label, 'extra');
     // external search
     $content = '<p>' . sprintf(i18n::s('Search for %s at:'), $item['keywords']) . ' ';
     // encode for urls, but preserve unicode chars
     $search = urlencode(utf8::from_unicode($item['keywords']));
     // Google
     $link = 'http://www.google.com/search?q=' . $search . '&amp;ie=utf-8';
     $content .= Skin::build_link($link, i18n::s('Google'), 'external') . ', ';
     // Yahoo!
     $link = 'http://search.yahoo.com/search?p=' . $search . '&amp;ei=utf-8';
     $content .= Skin::build_link($link, i18n::s('Yahoo!'), 'external') . ', ';
     // Ask Jeeves
     $link = 'http://web.ask.com/web?q=' . $search;
     $content .= Skin::build_link($link, i18n::s('Ask Jeeves'), 'external') . ', ';
     // Technorati
     $link = 'http://www.technorati.com/cosmos/search.html?rank=&url=' . $search;
     $content .= Skin::build_link($link, i18n::s('Technorati'), 'external') . '.';
     $content .= "</p>\n";
     $context['components']['boxes'] .= Skin::build_box(i18n::s('External search'), $content, 'boxes');
 }