集成插件实现评论 UA 图标、IP 归属地显示功能
|  | @ -41,7 +41,8 @@ | ||||||
|                         <?php _e('等待审核') ?>
 |                         <?php _e('等待审核') ?>
 | ||||||
|                     </span> |                     </span> | ||||||
|                     <?php endif; ?>
 |                     <?php endif; ?>
 | ||||||
|                     <?php UserAgent_Plugin::render($comments->agent); ?>
 |                     <?php showUserAgent($comments->agent); ?>
 | ||||||
|  |                     <span class="small"><?php showLocation($comments->ip); ?></span>
 | ||||||
|                     <br> |                     <br> | ||||||
| 	                <span class="small"><?php $comments->date('F jS, Y'); ?> at <?php $comments->date('h:i a'); ?></span>
 | 	                <span class="small"><?php $comments->date('F jS, Y'); ?> at <?php $comments->date('h:i a'); ?></span>
 | ||||||
|                     <span class="small ml-1 mr-1"><?php $comments->reply('<i class="fa fa-reply"></i> Reply'); ?><span>
 |                     <span class="small ml-1 mr-1"><?php $comments->reply('<i class="fa fa-reply"></i> Reply'); ?><span>
 | ||||||
|  |  | ||||||
|  | @ -164,29 +164,63 @@ function exContent($content){ | ||||||
|     return $content; |     return $content; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // 来自插件 https://github.com/elatisy/Typecho_WordsCounter
 | // 来自插件 WordsCounter
 | ||||||
|  | // https://github.com/elatisy/Typecho_WordsCounter
 | ||||||
| function allOfCharacters() { | function allOfCharacters() { | ||||||
|     $chars = 0; |     $chars = 0; | ||||||
|     $db = Typecho_Db::get(); |     $db = Typecho_Db::get(); | ||||||
|     $select = $db ->select('text') |     $select = $db ->select('text') | ||||||
|                   ->from('table.contents') |                   ->from('table.contents') | ||||||
|                   ->where('table.contents.status = ?','publish'); |                   ->where('table.contents.status = ?','publish'); | ||||||
| 
 |  | ||||||
|     $rows = $db->fetchAll($select); |     $rows = $db->fetchAll($select); | ||||||
|     foreach ($rows as $row){ |     foreach ($rows as $row){ | ||||||
|         $chars += mb_strlen($row['text'], 'UTF-8'); |         $chars += mb_strlen($row['text'], 'UTF-8'); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     $unit = ''; |     $unit = ''; | ||||||
|     if($chars >= 10000) { |     if ($chars >= 10000) { | ||||||
|         $chars /= 10000; |         $chars /= 10000; | ||||||
|         $unit = 'W'; |         $unit = 'W'; | ||||||
|     } else if($chars >= 1000) { |     } else if($chars >= 1000) { | ||||||
|         $chars /= 1000; |         $chars /= 1000; | ||||||
|         $unit = 'K'; |         $unit = 'K'; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     $out = sprintf('%.2lf%s',$chars, $unit); |     $out = sprintf('%.2lf%s',$chars, $unit); | ||||||
| 
 |  | ||||||
|     echo $out; |     echo $out; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 来自插件 IPLocation
 | ||||||
|  | function showLocation($ip) { | ||||||
|  |     require_once 'include/IP/IP.php'; | ||||||
|  |     $addresses = IP::find($ip); | ||||||
|  |     $address = ''; | ||||||
|  |     if (!empty($addresses)) { | ||||||
|  |         $addresses = array_unique($addresses); | ||||||
|  |         $address = implode('', $addresses); | ||||||
|  |         $address = str_replace('中国', '', $address); | ||||||
|  |     } | ||||||
|  |     echo $address; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 来自插件 UserAgent
 | ||||||
|  | function getUAImg($type, $name, $title) { | ||||||
|  |     global $url_img; | ||||||
|  |     $img = "<img nogallery class='icon-ua' src='" . $url_img . $type . $name . ".svg' title='" . $title . "' alt='" . $title . "' height=16px style='vertical-align:-2px;' />"; | ||||||
|  |     return $img; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function showUserAgent($ua) { | ||||||
|  |     global $url_img; | ||||||
|  |     $url_img = Helper::options()->themeUrl . '/include/UserAgent/img/'; | ||||||
|  | 
 | ||||||
|  |     /* OS */ | ||||||
|  |     require_once 'include/UserAgent/get_os.php'; | ||||||
|  |     $Os = get_os($ua); | ||||||
|  |     $OsImg = getUAImg("os/", $Os['code'], $Os['title']); | ||||||
|  | 
 | ||||||
|  |     /* Browser */ | ||||||
|  |     require_once 'include/UserAgent/get_browser_name.php'; | ||||||
|  |     $Browser = get_browser_name($ua); | ||||||
|  |     $BrowserImg = getUAImg("browser/", $Browser['code'], $Browser['title']); | ||||||
|  | 
 | ||||||
|  |     echo "  " . $OsImg . "  " . $BrowserImg; | ||||||
| } | } | ||||||
|  | @ -0,0 +1,77 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | class IP | ||||||
|  | { | ||||||
|  |     private static $ip     = NULL; | ||||||
|  |     private static $fp     = NULL; | ||||||
|  |     private static $offset = NULL; | ||||||
|  |     private static $index  = NULL; | ||||||
|  |     private static $cached = array(); | ||||||
|  |     public static function find($ip) | ||||||
|  |     { | ||||||
|  |         if (empty($ip) === TRUE) | ||||||
|  |         { | ||||||
|  |             return 'N/A'; | ||||||
|  |         } | ||||||
|  |         $nip   = gethostbyname($ip); | ||||||
|  |         $ipdot = explode('.', $nip); | ||||||
|  |         if ($ipdot[0] < 0 || $ipdot[0] > 255 || count($ipdot) !== 4) | ||||||
|  |         { | ||||||
|  |             return 'N/A'; | ||||||
|  |         } | ||||||
|  |         if (isset(self::$cached[$nip]) === TRUE) | ||||||
|  |         { | ||||||
|  |             return self::$cached[$nip]; | ||||||
|  |         } | ||||||
|  |         if (self::$fp === NULL) | ||||||
|  |         { | ||||||
|  |             self::init(); | ||||||
|  |         } | ||||||
|  |         $nip2 = pack('N', ip2long($nip)); | ||||||
|  |         $tmp_offset = (int)$ipdot[0] * 4; | ||||||
|  |         $start      = unpack('Vlen', self::$index[$tmp_offset] . self::$index[$tmp_offset + 1] . self::$index[$tmp_offset + 2] . self::$index[$tmp_offset + 3]); | ||||||
|  |         $index_offset = $index_length = NULL; | ||||||
|  |         $max_comp_len = self::$offset['len'] - 1024 - 4; | ||||||
|  |         for ($start = $start['len'] * 8 + 1024; $start < $max_comp_len; $start += 8) | ||||||
|  |         { | ||||||
|  |             if (self::$index[$start] . self::$index[$start + 1] . self::$index[$start + 2] . self::$index[$start + 3] >= $nip2) | ||||||
|  |             { | ||||||
|  |                 $index_offset = unpack('Vlen', self::$index[$start + 4] . self::$index[$start + 5] . self::$index[$start + 6] . "\x0"); | ||||||
|  |                 $index_length = unpack('Clen', self::$index[$start + 7]); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if ($index_offset === NULL) | ||||||
|  |         { | ||||||
|  |             return 'N/A'; | ||||||
|  |         } | ||||||
|  |         fseek(self::$fp, self::$offset['len'] + $index_offset['len'] - 1024); | ||||||
|  |         self::$cached[$nip] = explode("\t", fread(self::$fp, $index_length['len'])); | ||||||
|  |         return self::$cached[$nip]; | ||||||
|  |     } | ||||||
|  |     private static function init() | ||||||
|  |     { | ||||||
|  |         if (self::$fp === NULL) | ||||||
|  |         { | ||||||
|  |             self::$ip = new self(); | ||||||
|  |             self::$fp = fopen(__DIR__ . '/17monipdb.dat', 'rb'); | ||||||
|  |             if (self::$fp === FALSE) | ||||||
|  |             { | ||||||
|  |                 throw new \Exception('Invalid 17monipdb.dat file!'); | ||||||
|  |             } | ||||||
|  |             self::$offset = unpack('Nlen', fread(self::$fp, 4)); | ||||||
|  |             if (self::$offset['len'] < 4) | ||||||
|  |             { | ||||||
|  |                 throw new \Exception('Invalid 17monipdb.dat file!'); | ||||||
|  |             } | ||||||
|  |             self::$index = fread(self::$fp, self::$offset['len'] - 4); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public function __destruct() | ||||||
|  |     { | ||||||
|  |         if (self::$fp !== NULL) | ||||||
|  |         { | ||||||
|  |             fclose(self::$fp); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,245 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com) | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation; either version 3 of the License, or | ||||||
|  |  * any later version. | ||||||
|  |  *  | ||||||
|  |  * 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, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* Partly modified by Hakula */ | ||||||
|  | 
 | ||||||
|  | /* Detect Web Browser Version */ | ||||||
|  | function get_browser_version($ua, $title) { | ||||||
|  |     // Grab the browser version if it's present
 | ||||||
|  |     preg_match('/' . $title . '[\ |\/|\:]?([.0-9a-zA-Z]+)/i', $ua, $regmatch); | ||||||
|  |     $version = (is_null($regmatch[1])) ? '' : $regmatch[1]; | ||||||
|  |     return $version; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Detect Web Browsers */ | ||||||
|  | function get_browser_name($ua) { | ||||||
|  |     $version = ''; | ||||||
|  |     $code = null; | ||||||
|  | 
 | ||||||
|  |     if (preg_match('/360se/i', $ua)) { | ||||||
|  |         $title = '360 安全浏览器'; | ||||||
|  |         $code = '360'; | ||||||
|  |     } elseif (preg_match('/baidubrowser/i', $ua) || preg_match('/\ Spark/i', $ua)) { | ||||||
|  |         $title = '百度浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'Browser'); | ||||||
|  |         $code = 'BaiduBrowser'; | ||||||
|  |     } elseif (preg_match('/SE\ /i', $ua) && preg_match('/MetaSr/i', $ua)) { | ||||||
|  |         $title = '搜狗高速浏览器'; | ||||||
|  |         $code = 'Sogou-Explorer'; | ||||||
|  |     } elseif (preg_match('/QQBrowser/i', $ua) || preg_match('/MQQBrowser/i', $ua)) { | ||||||
|  |         $title = 'QQ 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'QQBrowser'); | ||||||
|  |         $code = 'QQBrowser'; | ||||||
|  |     } elseif (preg_match('/chromeframe/i', $ua)) { | ||||||
|  |         $title = 'Google Chrome Frame'; | ||||||
|  |         $version = get_browser_version($ua, 'chromeframe'); | ||||||
|  |         $code = 'Chrome'; | ||||||
|  |     } elseif (preg_match('/Chromium/i', $ua)) { | ||||||
|  |         $title = 'Chromium'; | ||||||
|  |         $version = get_browser_version($ua, 'Chromium'); | ||||||
|  |     } elseif (preg_match('/CrMo/i', $ua)) { | ||||||
|  |         $title = 'Google Chrome Mobile'; | ||||||
|  |         $version = get_browser_version($ua, 'CrMo'); | ||||||
|  |         $code = 'Chrome'; | ||||||
|  |     } elseif (preg_match('/CriOS/i', $ua)) { | ||||||
|  |         $title = 'Google Chrome for iOS'; | ||||||
|  |         $version = get_browser_version($ua, 'CriOS'); | ||||||
|  |         $code = 'Chrome'; | ||||||
|  |     } elseif (preg_match('/Maxthon/i', $ua)) { | ||||||
|  |         $title = '傲游浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'Maxthon'); | ||||||
|  |         $code = 'Maxthon'; | ||||||
|  |     } elseif (preg_match('/MiuiBrowser/i', $ua)) { | ||||||
|  |         $title = 'MIUI Browser'; | ||||||
|  |         $version = get_browser_version($ua, 'MiuiBrowser'); | ||||||
|  |         $code = 'MIUI-Browser'; | ||||||
|  |     } elseif (preg_match('/TheWorld/i', $ua)) { | ||||||
|  |         $title = '世界之窗浏览器'; | ||||||
|  |         $code = 'TheWorld'; | ||||||
|  |     } elseif (preg_match('/UBrowser/i', $ua)) { | ||||||
|  |         $title = 'UC 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'UBrowser'); | ||||||
|  |         $code = 'UC'; | ||||||
|  |     } elseif (preg_match('/UCBrowser/i', $ua)) { | ||||||
|  |         $title = 'UC 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'UCBrowser'); | ||||||
|  |         $code = 'UC'; | ||||||
|  |     } elseif (preg_match('/UC\ Browser/i', $ua)) { | ||||||
|  |         $title = 'UC 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'UC Browser'); | ||||||
|  |         $code = 'UC'; | ||||||
|  |     } elseif (preg_match('/UCWEB/i', $ua)) { | ||||||
|  |         $title = 'UC 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'UCWEB'); | ||||||
|  |         $code = 'UC'; | ||||||
|  |     } elseif (preg_match('/BlackBerry/i', $ua)) { | ||||||
|  |         $title = 'BlackBerry'; | ||||||
|  |     } elseif (preg_match('/Coast/i', $ua)) { | ||||||
|  |         $title = 'Coast'; | ||||||
|  |         $version = get_browser_version($ua, 'Coast'); | ||||||
|  |         $code = 'Opera'; | ||||||
|  |     } elseif (preg_match('/IEMobile/i', $ua)) { | ||||||
|  |         $title = 'IE Mobile'; | ||||||
|  |         $code = 'IE'; | ||||||
|  |     } elseif (preg_match('/LG Browser/i', $ua)) { | ||||||
|  |         $title = 'LG Web Browser'; | ||||||
|  |         $version = get_browser_version($ua, 'Browser'); | ||||||
|  |         $code = 'LG'; | ||||||
|  |     } elseif (preg_match('/Navigator/i', $ua)) { | ||||||
|  |         $title = 'Netscape Navigator'; | ||||||
|  |         $code = 'Netscape'; | ||||||
|  |     } elseif (preg_match('/Netscape/i', $ua)) { | ||||||
|  |         $title = 'Netscape'; | ||||||
|  |     } elseif (preg_match('/Nintendo 3DS/i', $ua)) { | ||||||
|  |         $title = 'Nintendo 3DS'; | ||||||
|  |         $code = 'Nintendo'; | ||||||
|  |     } elseif (preg_match('/NintendoBrowser/i', $ua)) { | ||||||
|  |         $title = 'Nintendo Browser'; | ||||||
|  |         $version = get_browser_version($ua, 'Browser'); | ||||||
|  |         $code = 'Nintendo'; | ||||||
|  |     } elseif (preg_match('/NokiaBrowser/i', $ua)) { | ||||||
|  |         $title = 'Nokia Browser'; | ||||||
|  |         $version = get_browser_version($ua, 'Browser'); | ||||||
|  |         $code = 'Nokia'; | ||||||
|  |     } elseif (preg_match('/Opera Mini/i', $ua)) { | ||||||
|  |         $title = 'Opera Mini'; | ||||||
|  |         $code = 'Opera'; | ||||||
|  |     } elseif (preg_match('/Opera Mobi/i', $ua)) { | ||||||
|  |         if (preg_match('/Version/i', $ua)) { | ||||||
|  |             $version = get_browser_version($ua, 'Version'); | ||||||
|  |         } else { | ||||||
|  |             $version = get_browser_version($ua, 'Opera Mobi'); | ||||||
|  |         } | ||||||
|  |         $title = 'Opera Mobile'; | ||||||
|  |         $code = 'Opera'; | ||||||
|  |     } elseif (preg_match('/Opera/i', $ua) || preg_match('/OPR/i', $ua)) { | ||||||
|  |         $title = 'Opera'; | ||||||
|  |         $code = 'Opera'; | ||||||
|  |         // How is version stored on this Opera ua?
 | ||||||
|  |         if (preg_match('/Version/i', $ua)) { | ||||||
|  |             $version = get_browser_version($ua, 'Version'); | ||||||
|  |         } elseif (preg_match('/OPR/i', $ua)) { | ||||||
|  |             $version = get_browser_version($ua, 'OPR'); | ||||||
|  |         } else { | ||||||
|  |             // Use Opera as fallback since full title may change (Next, Developer, etc.)
 | ||||||
|  |             $version = get_browser_version($ua, 'Opera'); | ||||||
|  |         } | ||||||
|  |         // Parse full edition name, ex: Opera/9.80 (X11; Linux x86_64; U; Edition Labs Camera and Pages; Ubuntu/11.10; en) Presto/2.9.220 Version/12.00
 | ||||||
|  |         if (preg_match('/Edition ([\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $title .= ' ' . $regmatch[1]; | ||||||
|  |         } elseif (preg_match('/Opera ([\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $title .= ' ' . $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/PlayStation\ 4/i', $ua)) { | ||||||
|  |         $title = 'PS4 Web Browser'; | ||||||
|  |         $code = 'PS4'; | ||||||
|  |     } elseif (preg_match('/SEMC-Browser/i', $ua)) { | ||||||
|  |         $title = 'SEMC Browser'; | ||||||
|  |         $version = get_browser_version($ua, 'SEMC-Browser'); | ||||||
|  |         $code = 'Sony'; | ||||||
|  |     } elseif (preg_match('/SEMC-java/i', $ua)) { | ||||||
|  |         $title = 'SEMC Java'; | ||||||
|  |         $code = 'Sony'; | ||||||
|  |     } elseif (preg_match('/Series60/i', $ua) && !preg_match('/Symbian/i', $ua)) { | ||||||
|  |         $title = 'Nokia S60'; | ||||||
|  |         $version = get_browser_version($ua, 'Series60'); | ||||||
|  |         $code = 'Nokia'; | ||||||
|  |     } elseif (preg_match('/S60/i', $ua) && !preg_match('/Symbian/i', $ua)) { | ||||||
|  |         $title = 'Nokia S60'; | ||||||
|  |         $version = get_browser_version($ua, 'S60'); | ||||||
|  |         $code = 'Nokia'; | ||||||
|  |     } elseif (preg_match('/TencentTraveler/i', $ua)) { | ||||||
|  |         $title = 'TT 浏览器'; | ||||||
|  |         $version = get_browser_version($ua, 'TencentTraveler'); | ||||||
|  |         $code = 'QQBrowser'; | ||||||
|  |     } elseif ((preg_match('/Ubuntu\;\ Mobile/i', $ua) || preg_match('/Ubuntu\;\ Tablet/i', $ua) && preg_match('/WebKit/i', $ua))) { | ||||||
|  |         $title = 'Ubuntu Web Browser'; | ||||||
|  |         $code = 'Ubuntu'; | ||||||
|  |     } elseif (preg_match('/AppleWebkit/i', $ua) && preg_match('/Android/i', $ua) && !preg_match('/Chrome/i', $ua)) { | ||||||
|  |         $title = 'Android Webkit'; | ||||||
|  |         $version = get_browser_version($ua, 'Version'); | ||||||
|  |         $code = 'Android-Webkit'; | ||||||
|  |     } elseif (preg_match('/Chrome/i', $ua) && preg_match('/Mobile/i', $ua) && (preg_match('/Version/i', $ua) || preg_match('/wv/i', $ua))) { | ||||||
|  |         $title = 'WebView'; | ||||||
|  |         $version = get_browser_version($ua, 'Version'); | ||||||
|  |         $code = 'Android-Webkit'; | ||||||
|  |     } | ||||||
|  |     // Pulled out of order to help ensure better detection for above browsers
 | ||||||
|  |     elseif (preg_match('/Edge/i', $ua) && preg_match('/Chrome/i', $ua) && preg_match('/Safari/i', $ua)) { | ||||||
|  |         $title = 'Microsoft Edge'; | ||||||
|  |         $version = get_browser_version($ua, 'Edge'); | ||||||
|  |         $code = 'Edge'; | ||||||
|  |     } elseif (preg_match('/Chrome/i', $ua)) { | ||||||
|  |         $title = 'Google Chrome'; | ||||||
|  |         $version = get_browser_version($ua, 'Chrome'); | ||||||
|  |         $code = 'Chrome'; | ||||||
|  |     } elseif (preg_match('/Safari/i', $ua) && !preg_match('/Nokia/i', $ua)) { | ||||||
|  |         $title = 'Safari'; | ||||||
|  |         $code = 'Safari'; | ||||||
|  |         if (preg_match('/Version/i', $ua)) { | ||||||
|  |             $version = get_browser_version($ua, 'Version'); | ||||||
|  |         } | ||||||
|  |         if (preg_match('/Mobile Safari/i', $ua)) { | ||||||
|  |             $title = 'Mobile ' . $title; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Nokia/i', $ua)) { | ||||||
|  |         $title = 'Nokia Web Browser'; | ||||||
|  |         $code = 'Nokia'; | ||||||
|  |     } elseif (preg_match('/Firefox/i', $ua)) { | ||||||
|  |         $title = 'Firefox'; | ||||||
|  |         $version = get_browser_version($ua, 'Firefox'); | ||||||
|  |     } elseif (preg_match('/MSIE/i', $ua) || preg_match('/Trident/i', $ua)) { | ||||||
|  |         $title = 'Internet Explorer'; | ||||||
|  |         $code = 'IE'; | ||||||
|  |         if (preg_match('/\ rv:([.0-9a-zA-Z]+)/i', $ua)) { | ||||||
|  |             // IE11 or newer
 | ||||||
|  |             $version = get_browser_version($ua, ' rv'); | ||||||
|  |         } else { | ||||||
|  |             // IE10 or older, regex: '/MSIE[\ |\/]?([.0-9a-zA-Z]+)/i'
 | ||||||
|  |             $version = get_browser_version($ua, 'MSIE'); | ||||||
|  |         } | ||||||
|  |         // Detect compatibility mode for IE
 | ||||||
|  |         if ($version === '7.0' && preg_match('/Trident\/4.0/i', $ua)) { | ||||||
|  |             $version = '8.0 (Compatibility Mode)'; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Mozilla/i', $ua)) { | ||||||
|  |         $title = 'Mozilla'; | ||||||
|  |         $version = get_browser_version($ua, ' rv'); | ||||||
|  |         if (empty($version)) { | ||||||
|  |             $title .= ' Compatible'; | ||||||
|  |             $code = 'Mozilla'; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     // No Web browser match
 | ||||||
|  |     else { | ||||||
|  |         $title = 'Other Browser'; | ||||||
|  |         $code = 'Others'; | ||||||
|  |     } | ||||||
|  |     if (is_null($code)) { | ||||||
|  |         $code = $title; | ||||||
|  |     } | ||||||
|  |     if ($version != '') { | ||||||
|  |         $title .= " $version"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     $result['code'] = $code; | ||||||
|  |     $result['title'] = $title; | ||||||
|  |     return $result; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,200 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com) | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation; either version 3 of the License, or | ||||||
|  |  * any later version. | ||||||
|  |  *  | ||||||
|  |  * 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, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* Partly modified by Hakula */ | ||||||
|  | 
 | ||||||
|  | /* Detect Operating System */ | ||||||
|  | function get_os($ua) { | ||||||
|  |     $version = null; | ||||||
|  |     $code = null; | ||||||
|  | 
 | ||||||
|  |     if (preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua)) { | ||||||
|  |         $title = 'Windows'; | ||||||
|  |         if (preg_match('/Windows NT 10.0/i', $ua) || preg_match('/Windows NT 6.4/i', $ua)) { | ||||||
|  |             $version = '10'; | ||||||
|  |             $code = 'Windows-10'; | ||||||
|  |         } elseif (preg_match('/Windows NT 6.3/i', $ua)) { | ||||||
|  |             $version = '8.1'; | ||||||
|  |             $code = 'Windows-8'; | ||||||
|  |         } elseif (preg_match('/Windows NT 6.2/i', $ua)) { | ||||||
|  |             $version = '8'; | ||||||
|  |             $code = 'Windows-8'; | ||||||
|  |         } elseif (preg_match('/Windows NT 6.1/i', $ua)) { | ||||||
|  |             $version = '7'; | ||||||
|  |         } elseif (preg_match('/Windows NT 6.0/i', $ua)) { | ||||||
|  |             $version = 'Vista'; | ||||||
|  |         } elseif (preg_match('/Windows NT 5.2 x64/i', $ua)) { | ||||||
|  |             $version = 'XP'; // x64 Edition very similar to Win 2003
 | ||||||
|  |         } elseif (preg_match('/Windows NT 5.2/i', $ua)) { | ||||||
|  |             $version = 'Server 2003'; | ||||||
|  |         } elseif (preg_match('/Windows NT 5.1/i', $ua) || preg_match('/Windows XP/i', $ua)) { | ||||||
|  |             $version = 'XP'; | ||||||
|  |         } elseif (preg_match('/Windows NT 5.01/i', $ua)) { | ||||||
|  |             $version = '2000 (SP1)'; | ||||||
|  |         } elseif (preg_match('/Windows NT 5.0/i', $ua) || preg_match('/Windows NT5/i', $ua) || preg_match('/Windows 2000/i', $ua)) { | ||||||
|  |             $version = '2000'; | ||||||
|  |         } elseif (preg_match('/Windows NT 4.0/i', $ua) || preg_match('/WinNT4.0/i', $ua)) { | ||||||
|  |             $version = 'NT 4.0'; | ||||||
|  |         } elseif (preg_match('/Windows NT 3.51/i', $ua) || preg_match('/WinNT3.51/i', $ua)) { | ||||||
|  |             $version = 'NT 3.11'; | ||||||
|  |         } elseif (preg_match('/Windows NT/i', $ua) || preg_match('/WinNT/i', $ua)) { | ||||||
|  |             $version = 'NT'; | ||||||
|  |         } elseif (preg_match('/Windows 3.11/i', $ua) || preg_match('/Win3.11/i', $ua) || preg_match('/Win16/i', $ua)) { | ||||||
|  |             $version = '3.11'; | ||||||
|  |         } elseif (preg_match('/Windows 3.1/i', $ua)) { | ||||||
|  |             $version = '3.1'; | ||||||
|  |         } elseif (preg_match('/Windows 98; Win 9x 4.90/i', $ua) || preg_match('/Win 9x 4.90/i', $ua) || preg_match('/Windows ME/i', $ua)) { | ||||||
|  |             $version = 'ME'; | ||||||
|  |         } elseif (preg_match('/Win98/i', $ua)) { | ||||||
|  |             $version = '98 SE'; | ||||||
|  |         } elseif (preg_match('/Windows 98/i', $ua) || preg_match('/Windows\ 4.10/i', $ua)) { | ||||||
|  |             $version = '98'; | ||||||
|  |         } elseif (preg_match('/Windows 95/i', $ua) || preg_match('/Win95/i', $ua)) { | ||||||
|  |             $version = '95'; | ||||||
|  |         } elseif (preg_match('/Windows CE/i', $ua)) { | ||||||
|  |             $version = 'CE'; | ||||||
|  |         } elseif (preg_match('/WM5/i', $ua)) { | ||||||
|  |             $version = 'Mobile 5'; | ||||||
|  |         } elseif (preg_match('/WindowsMobile/i', $ua)) { | ||||||
|  |             $version = 'Mobile'; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Android/i', $ua)) { | ||||||
|  |         $title = 'Android'; | ||||||
|  |         if (preg_match('/Android[\ |\/]?([.0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $version = $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Mac/i', $ua) || preg_match('/Darwin/i', $ua)) { | ||||||
|  |         $title = 'Mac OS X'; | ||||||
|  |         $code = 'Apple'; | ||||||
|  |         if (preg_match('/Mac OS X/i', $ua) || preg_match('/Mac OSX/i', $ua)) { | ||||||
|  |             if (preg_match('/iPhone/i', $ua)) { | ||||||
|  |                 $title = 'iOS'; | ||||||
|  |                 $version = substr($ua, strpos(strtolower($ua), strtolower('iPhone OS')) + 10); | ||||||
|  |                 // Parse iOS version number
 | ||||||
|  |                 $version = substr($version, 0, strpos($version, 'l') - 1); | ||||||
|  |             } elseif (preg_match('/iPad/i', $ua)) { | ||||||
|  |                 $title = 'iOS'; | ||||||
|  |                 $version = substr($ua, strpos(strtolower($ua), strtolower('CPU OS')) + 7); | ||||||
|  |                 $version = substr($version, 0, strpos($version, 'l') - 1); | ||||||
|  |             } elseif (preg_match('/Mac OS X/i', $ua)) { | ||||||
|  |                 $version = substr($ua, strpos(strtolower($ua), strtolower('OS X')) + 5); | ||||||
|  |                 // Parse OS X version number
 | ||||||
|  |                 $version = substr($version, 0, strpos($version, ')')); | ||||||
|  |             } else { | ||||||
|  |                 $version = substr($ua, strpos(strtolower($ua), strtolower('OSX')) + 4); | ||||||
|  |                 $version = substr($version, 0, strpos($version, ')')); | ||||||
|  |             } | ||||||
|  |             // Parse OS X version number
 | ||||||
|  |             if (strpos($version, ';') > -1) { | ||||||
|  |                 $version = substr($version, 0, strpos($version, ';')); | ||||||
|  |             } | ||||||
|  |             // Beautify version format
 | ||||||
|  |             $version = str_replace('_', '.', $version); | ||||||
|  |         } elseif (preg_match('/Darwin/i', $ua)) { | ||||||
|  |             $title = 'Mac OS Darwin'; | ||||||
|  |         } else { | ||||||
|  |             $title = 'Macintosh'; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/[^A-Za-z]Arch/i', $ua)) { | ||||||
|  |         $title = 'Arch Linux'; | ||||||
|  |         $code = 'Arch-Linux'; | ||||||
|  |     } elseif (preg_match('/BlackBerry/i', $ua)) { | ||||||
|  |         $title = 'BlackBerryOS'; | ||||||
|  |     } elseif (preg_match('/CentOS/i', $ua)) { | ||||||
|  |         $title = 'CentOS'; | ||||||
|  |         if (preg_match('/.el([.0-9a-zA-Z]+).centos/i', $ua, $regmatch)) { | ||||||
|  |             $version = $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/CrOS/i', $ua)) { | ||||||
|  |         $title = 'Google Chrome OS'; | ||||||
|  |         $code = 'Chrome-OS'; | ||||||
|  |     } elseif (preg_match('/Debian/i', $ua)) { | ||||||
|  |         $title = 'Debian GNU/Linux'; | ||||||
|  |         $code = 'Debian'; | ||||||
|  |     } elseif (preg_match('/Fedora/i', $ua)) { | ||||||
|  |         $title = 'Fedora'; | ||||||
|  |         if (preg_match('/.fc([.0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $version = $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/FreeBSD/i', $ua)) { | ||||||
|  |         $title = 'FreeBSD'; | ||||||
|  |     } elseif (preg_match('/OpenBSD/i', $ua)) { | ||||||
|  |         $title = 'OpenBSD'; | ||||||
|  |     } elseif (preg_match('/Oracle/i', $ua)) { | ||||||
|  |         $title = 'Oracle'; | ||||||
|  |         $code = 'Oracle-Linux'; | ||||||
|  |         if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $title .= ' Enterprise Linux'; | ||||||
|  |             $version = str_replace('_', '.', $regmatch[1]); | ||||||
|  |         } else { | ||||||
|  |             $title .= ' Linux'; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Red\ Hat/i', $ua) || preg_match('/RedHat/i', $ua)) { | ||||||
|  |         $title = 'Red Hat'; | ||||||
|  |         $code = 'Red-Hat'; | ||||||
|  |         if (preg_match('/.el([._0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $title .= ' Enterprise Linux'; | ||||||
|  |             $version = str_replace('_', '.', $regmatch[1]); | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Solaris/i', $ua) || preg_match('/SunOS/i', $ua)) { | ||||||
|  |         $title = 'Solaris'; | ||||||
|  |     } elseif (preg_match('/Symb[ian]?[OS]?/i', $ua)) { | ||||||
|  |         $title = 'SymbianOS'; | ||||||
|  |         if (preg_match('/Symb[ian]?[OS]?\/([.0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $version = $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Ubuntu/i', $ua)) { | ||||||
|  |         $title = 'Ubuntu'; | ||||||
|  |         if (preg_match('/Ubuntu[\/|\ ]([.0-9]+[.0-9a-zA-Z]+)/i', $ua, $regmatch)) { | ||||||
|  |             $version = $regmatch[1]; | ||||||
|  |         } | ||||||
|  |     } elseif (preg_match('/Linux/i', $ua)) { | ||||||
|  |         $title = 'GNU/Linux'; | ||||||
|  |         $code = 'Linux'; | ||||||
|  |     } elseif (preg_match('/J2ME\/MIDP/i', $ua)) { | ||||||
|  |         $title = 'J2ME/MIDP Device'; | ||||||
|  |         $code = 'Java'; | ||||||
|  |     } | ||||||
|  |     // No OS match
 | ||||||
|  |     else { | ||||||
|  |         $title = 'Other System'; | ||||||
|  |         $code = 'Others'; | ||||||
|  |     } | ||||||
|  |     // Check x64 architecture
 | ||||||
|  |     if (preg_match('/x86_64/i', $ua)) { | ||||||
|  |         // If version isn't null append 64 bit, otherwise set it to x64
 | ||||||
|  |         $version = (is_null($version)) ? 'x64' : "$version x64"; | ||||||
|  |     } elseif ((preg_match('/Windows/i', $ua) || preg_match('/WinNT/i', $ua) || preg_match('/Win32/i', $ua)) | ||||||
|  |         && (preg_match('/Win64/i', $ua) || preg_match('/x64/i', $ua) || preg_match('/WOW64/i', $ua)) | ||||||
|  |     ) { | ||||||
|  |         $version .= ' x64 Edition'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (is_null($code)) { | ||||||
|  |         $code = $title; | ||||||
|  |     } | ||||||
|  |     // Append version to title
 | ||||||
|  |     if (isset($version)) { | ||||||
|  |         $title .= " $version"; | ||||||
|  |     } | ||||||
|  |     $result['code'] = $code; | ||||||
|  |     $result['title'] = $title; | ||||||
|  |     return $result; | ||||||
|  | } | ||||||
| After Width: | Height: | Size: 473 B | 
| After Width: | Height: | Size: 268 B | 
| After Width: | Height: | Size: 587 B | 
| After Width: | Height: | Size: 494 B | 
| After Width: | Height: | Size: 721 B | 
| After Width: | Height: | Size: 937 B | 
| After Width: | Height: | Size: 569 B | 
| After Width: | Height: | Size: 501 B | 
| After Width: | Height: | Size: 625 B | 
| After Width: | Height: | Size: 670 B | 
| After Width: | Height: | Size: 421 B | 
| After Width: | Height: | Size: 906 B | 
| After Width: | Height: | Size: 423 B | 
| After Width: | Height: | Size: 507 B | 
| After Width: | Height: | Size: 420 B | 
| After Width: | Height: | Size: 450 B | 
| After Width: | Height: | Size: 597 B | 
| After Width: | Height: | Size: 611 B | 
| After Width: | Height: | Size: 523 B | 
| After Width: | Height: | Size: 919 B | 
| After Width: | Height: | Size: 646 B | 
| After Width: | Height: | Size: 412 B | 
| After Width: | Height: | Size: 492 B | 
| After Width: | Height: | Size: 907 B | 
| After Width: | Height: | Size: 419 B | 
| After Width: | Height: | Size: 923 B | 
| After Width: | Height: | Size: 417 B | 
| After Width: | Height: | Size: 880 B | 
| After Width: | Height: | Size: 961 B | 
| After Width: | Height: | Size: 977 B | 
| After Width: | Height: | Size: 654 B | 
| After Width: | Height: | Size: 846 B | 
| After Width: | Height: | Size: 882 B | 
| After Width: | Height: | Size: 839 B | 
| After Width: | Height: | Size: 707 B | 
| After Width: | Height: | Size: 565 B | 
| After Width: | Height: | Size: 704 B | 
| After Width: | Height: | Size: 838 B | 
| After Width: | Height: | Size: 283 B | 
| After Width: | Height: | Size: 829 B | 
| After Width: | Height: | Size: 857 B | 
| After Width: | Height: | Size: 988 B | 
| After Width: | Height: | Size: 753 B | 
| After Width: | Height: | Size: 605 B | 
| After Width: | Height: | Size: 868 B | 
| After Width: | Height: | Size: 904 B | 
| After Width: | Height: | Size: 268 B | 
| After Width: | Height: | Size: 984 B | 
| After Width: | Height: | Size: 921 B | 
| After Width: | Height: | Size: 948 B | 
| After Width: | Height: | Size: 882 B | 
| After Width: | Height: | Size: 685 B | 
| After Width: | Height: | Size: 476 B | 
| After Width: | Height: | Size: 290 B | 
| After Width: | Height: | Size: 759 B | 
| After Width: | Height: | Size: 913 B | 
| After Width: | Height: | Size: 907 B | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 879 B | 
| After Width: | Height: | Size: 779 B | 
| After Width: | Height: | Size: 467 B | 
| After Width: | Height: | Size: 861 B | 
| After Width: | Height: | Size: 896 B | 
| After Width: | Height: | Size: 918 B | 
| After Width: | Height: | Size: 811 B | 
| After Width: | Height: | Size: 809 B | 
| After Width: | Height: | Size: 891 B | 
| After Width: | Height: | Size: 1018 B | 
| After Width: | Height: | Size: 806 B | 
| After Width: | Height: | Size: 956 B | 
| After Width: | Height: | Size: 845 B | 
| After Width: | Height: | Size: 697 B | 
| After Width: | Height: | Size: 804 B | 
| After Width: | Height: | Size: 825 B | 
| After Width: | Height: | Size: 872 B | 
| After Width: | Height: | Size: 613 B | 
| After Width: | Height: | Size: 962 B | 
| After Width: | Height: | Size: 340 B | 
| After Width: | Height: | Size: 803 B | 
| After Width: | Height: | Size: 162 B | 
| After Width: | Height: | Size: 846 B | 
| After Width: | Height: | Size: 401 B | 
| After Width: | Height: | Size: 943 B | 
| After Width: | Height: | Size: 884 B | 
| After Width: | Height: | Size: 778 B | 
| After Width: | Height: | Size: 548 B | 
| After Width: | Height: | Size: 789 B | 
| After Width: | Height: | Size: 828 B | 
| After Width: | Height: | Size: 895 B | 
| After Width: | Height: | Size: 907 B | 
| After Width: | Height: | Size: 946 B | 
| After Width: | Height: | Size: 912 B | 
| After Width: | Height: | Size: 967 B | 
| After Width: | Height: | Size: 110 B |