ktutil.inc
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· INC 代码 · 共 1,334 行 · 第 1/3 页
INC
1,334 行
<?php
/**
* $Id: ktutil.inc 9521 2008-10-09 09:09:28Z kevin_fourie $
*
* Small non-domain-specific utility functions
*
* KnowledgeTree Community Edition
* Document Management Made Simple
* Copyright (C) 2008 KnowledgeTree Inc.
* Portions copyright The Jam Warehouse Software (Pty) Limited
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
* California 94120-7775, or email info@knowledgetree.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by KnowledgeTree" and retain the original
* copyright notice.
* Contributor( s): ______________________________________
*/
require_once(KT_LIB_DIR . '/util/KTStopwords.php');
class KTUtil {
const MIN_IN_SECS = 60;
const HOUR_IN_SECS = 3600;
const DAY_IN_SECS = 86400;
const KB = 1024;
const MB = 1048576;
const GB = 1000000000;
const TB = 1099511627776;
const PB = 1125899906842624;
/**
* Used to resolve the server name
*
*/
static function save_base_kt_url()
{
global $default;
$serverName = KTUtil::getSystemSetting('server_name', false);
if($serverName !== false && !empty($serverName)){
return $serverName;
}
$rootUrl = $default->rootUrl;
$protocol = $default->sslEnabled ? 'https' : 'http';
$port = $_SERVER['SERVER_PORT']+0;
$serverName = $_SERVER['SERVER_NAME'];
// We don't want to set the servername to localhost, it should be set to the url that will be used normally
if($serverName == 'localhost' || $serverName == '127.0.0.1')
{
return false;
}
$base_url = $protocol . '://' . $serverName;
if (($protocol == 'http' && $port == 80) || ($protocol == 'https' && $port == 443))
{
// don't need to do anything
}
else
{
$base_url .= ':' . $port;
}
// Add the root url
$base_url .= $rootUrl;
// Save as system setting
KTUtil::setSystemSetting('server_name', $base_url);
}
static function kt_url()
{
global $default;
static $base_url = null;
if (!is_null($base_url))
{
return $base_url;
}
$config = KTConfig::getSingleton();
$serverName = $config->get('knowledgeTree/serverName', $_SERVER['HTTP_HOST']);
// $serverName gets set in dmsDefaults, if $_SERVER['HTTP_HOST'] is empty, it gets set to localhost
// we want to avoid this if possible
if(empty($serverName) || $serverName == 'localhost')
{
// The host has not been set - check if the serverName setting exists
$base_url = KTUtil::getSystemSetting('server_name', false);
if (false !== $base_url && !empty($base_url))
{
/* We are checking if the object exists because we could have an error pre or during initialization */
if(is_object($default->log))
{
$default->log->debug("kt_url: base url - $base_url");
}
$base_url = str_replace(array("\n","\r"), array('',''), $base_url);
return $base_url;
}
// TODO: Check if the $_SERVER['SERVER_NAME'] variable is set.
$serverName = 'localhost';
}
// build up the url
$base_url = ($default->sslEnabled ? 'https' : 'http') .'://'.$serverName . $default->rootUrl;
if(is_object($default->log))
{
$default->log->debug("kt_url: base url - $base_url");
}
return $base_url;
}
static function call_page($path)
{
global $default;
$base_url = KTUtil::getSystemSetting('server_name', false);
if (false === $base_url || empty($base_url))
{
$default->log->info("call_page: $path - cannot call script until user logs in from a url other than localhost or 127.0.0.1!");
return;
}
$kt_url = KTUtil::kt_url();
$full_url = $kt_url . '/' . $path;
$default->log->debug("call_page: calling $full_url");
$ch = curl_init($full_url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
}
static function computePeriod($diff, $suffix = null, $returnArray=false)
{
if (is_null($suffix))
{
$suffix = _kt('ago');
}
$days = floor($diff / KTUtil::DAY_IN_SECS);
$hours = floor(($diff - $days * KTUtil::DAY_IN_SECS) / KTUtil::HOUR_IN_SECS);
$mins = floor(($diff - $days * KTUtil::DAY_IN_SECS - $hours * KTUtil::HOUR_IN_SECS) / KTUtil::MIN_IN_SECS);
$secs = $diff % KTUtil::MIN_IN_SECS;
$str = '';
if ($days > 0) $str .= sprintf(_kt(' %d day(s)'), $days);
if ($hours > 0) $str .= sprintf(_kt(' %d hour(s)'), $hours);
if ($mins > 0) $str .= sprintf(_kt(' %d minute(s)'), $mins);
// lets loose some granularity. the string does get quite long...
if ($days == 0 && $hours == 0 && $mins == 0 && $secs > 0)
{
$str .= sprintf(_kt(' %d second(s)'), $secs);
}
if (empty($str))
{
return _kt('never');
}
$str .= " $suffix";
if ($returnArray)
{
return array(
'str'=>$str,
'days'=>$days,
'mins'=>$mins,
'secs'=>$secs
);
}
return $str;
}
static function computePeriodToDate($start, $suffix = null, $returnArray=false)
{
return KTUtil::computePeriod(time() - $start, $suffix, $returnArray);
}
static function filesizeToString($filesize)
{
$filesize = (double) $filesize;
if ($filesize >= KTUtil::PB)
{
return number_format($filesize / KTUtil::PB, 2, '.',',') . _kt('PB');
}
elseif ($filesize >= KTUtil::TB)
{
return number_format($filesize / KTUtil::TB, 2, '.',',') . _kt('TB');
}
elseif ($filesize >= KTUtil::GB)
{
return number_format($filesize / KTUtil::GB, 2, '.',',') . _kt('GB');
}
elseif ($filesize >= KTUtil::MB)
{
return number_format($filesize / KTUtil::MB, 2, '.',',') . _kt('MB');
}
elseif ($filesize >= KTUtil::KB)
{
return number_format($filesize / KTUtil::KB, 2, '.',',') . _kt('KB');
}
else
{
return $filesize . _kt('B');
}
}
static $invalidFilenameCharacters = array('\\','/',':','*','?','"','<','>','|','%','+','\'','`');
/**
* Checks if a filename is valid
*
* @param string $filename
* @return boolean
*/
static function isValidFilename($filename)
{
foreach(KTUtil::$invalidFilenameCharacters as $char)
{
if (strpos($filename, $char) !== false)
{
return false;
}
}
return true;
}
static function replaceInvalidCharacters($filename)
{
foreach(KTUtil::$invalidFilenameCharacters as $char)
{
$filename = str_replace($char, '-', $filename);
}
return $filename;
}
function extractGPC () {
foreach (func_get_args() as $var) {
if (array_key_exists($var, $_REQUEST)) {
$GLOBALS["$var"] = $_REQUEST["$var"];
}
}
}
function strToBool ($sString, $null = false, $empty = false) {
$sString = strtoupper($sString);
if (in_array($sString, array('Y','YES','ON','TRUE')))
{
return true;
}
elseif (in_array($sString, array('N', 'NO','OFF','FALSE')))
{
return false;
}
elseif ($sString == '')
{
return $empty;
}
else
{
return $null;
}
}
function intToBool ($sString) {
$iInt = (int)$sString;
return $iInt !== 0;
}
function anyToBool ($sString, $null = false) {
if (is_bool($sString)) {
return $sString;
}
if (is_numeric($sString)) {
return KTUtil::intToBool($sString);
}
if (is_string($sString)) {
if (KTUtil::strToBool($sString) === true) {
return true;
}
}
if (is_null($sString)) {
return $null;
}
return false;
}
function randomString($length=16, $sRandom="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"){
$sString = "";
$iCurLen = 0;
$iRandomLen = strlen($sRandom);
while ($length > $iCurLen) {
$sString .= substr($sRandom, mt_rand(0, $iRandomLen -1), 1);
$iCurLen++;
}
return $sString;
}
//this function fudges the strlen. It returns a ? when the character is a multi-byte character.
//str len is therefore measured correctly by counting the ?'s.
//http://www.phpwact.org/php/i18n/charsets
function utf8_strlen($string){
return strlen(utf8_decode($string));
}
static function &arrayGet($aArray, $sKey, $mDefault = null, $bDefaultIfEmpty = true) {
if (!is_array($aArray)) {
$aArray = (array) $aArray;
}
if ($aArray !== 0 && $aArray !== '0' && empty($aArray)) {
return $mDefault;
}
if (array_key_exists($sKey, $aArray)) {
$mVal =& $aArray[$sKey];
if (empty($mVal) && $bDefaultIfEmpty) {
return $mDefault;
}
return $mVal;
}
return $mDefault;
}
function requestValue($sKey, $mDefault = null) {
return KTUtil::arrayGet($_REQUEST, $sKey, $mDefault);
}
// {{{ whereToString
/**
* Convert an array of parameterised strings to a single
* parameterised string.
*
* Return null in case of an empty array.
*/
static function whereToString($aWhere) {
$aStrings = array();
$aParams = array();
foreach ($aWhere as $oSomething) {
if (is_string($oSomething)) {
$aStrings[] = $oSomething;
} else if (is_array($oSomething)) {
$aStrings[] = $oSomething[0];
$aNewParams = array();
foreach ($oSomething[1] as $oParam) {
if (is_array($oParam)) {
$aNewParams = array_merge($aNewParams, $oParam);
} else {
$aNewParams[] = $oParam;
}
}
$aParams = array_merge($aParams, $aNewParams);
} else {
return PEAR::raiseError(_kt("Weird WhereClause passed"));
}
}
if (count($aStrings) === 0) {
return null;
}
return array(join(" AND ", $aStrings), $aParams);
}
// }}}
// {{{ safeShellString
function safeShellString () {
$aArgs = func_get_args();
$aSafeArgs = array();
if (is_array($aArgs[0])) {
$aArgs = $aArgs[0];
}
$aSafeArgs[] = escapeshellarg(array_shift($aArgs));
if (is_array($aArgs[0])) {
$aArgs = $aArgs;
}
foreach ($aArgs as $sArg) {
if (empty($sArg)) {
$aSafeArgs[] = "''";
} else {
$aSafeArgs[] = escapeshellarg($sArg);
}
}
return join(" ", $aSafeArgs);
}
// }}}
// {{{ pexec
/**
* Portably execute a command on any of the supported platforms.
*/
function pexec($aCmd, $aOptions = null) {
if (is_array($aCmd)) {
$sCmd = KTUtil::safeShellString($aCmd);
} else {
$sCmd = $aCmd;
}
$sAppend = KTUtil::arrayGet($aOptions, 'append');
if ($sAppend) {
$sCmd .= " >> " . escapeshellarg($sAppend);
}
$sPopen = KTUtil::arrayGet($aOptions, 'popen');
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?