<?php // h-source, a web software to build a community of people that want to share their hardware information. // Copyright (C) 2010 Antonio Gallo (h-source-copyright.txt) // // This file is part of h-source // // h-source 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 // (at your option) any later version. // // h-source 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 h-source. If not, see <http://www.gnu.org/licenses/>. if (!defined('EG')) die('Direct access not allowed!'); function encodeUrl($url) { $url = str_replace(' ','-',$url); $url = str_replace('.','-',$url); $url = str_replace('[','-',$url); $url = str_replace(']','-',$url); $url = str_replace('(','-',$url); $url = str_replace(')','-',$url); $url = str_replace('/','-',$url); $url = str_replace('@','-at-',$url); $url = str_replace('?','-',$url); // $temp = null; // for ($i=0;$i<strlen($url); $i++) // { // if (strcmp($url[$i],' ') === 0) // { // $temp .= '-'; // } // else // { // if (preg_match('/^[a-zA-Z0-9\-]$/',$url[$i])) $temp .= $url[$i]; // } // } // $url = urlencode($url); // $url = urlencode($url); return $url; } function titleForRedirect($title) { return html_entity_decode(encodeUrl($title),ENT_QUOTES,DEFAULT_CHARSET); } // function encodeUrl($url) // { // $url = str_replace(' ','-',$url); // $url = str_replace('[','-',$url); // $url = str_replace(']','-',$url); // $url = str_replace('(','-',$url); // $url = str_replace(')','-',$url); // $url = str_replace('/','-',$url); // $url = str_replace('@','-at-',$url); // $url = urlencode($url); // // $url = html_entity_decode($url, ENT_QUOTES); // // $url = xml_encode($url); // return $url; // } function smartDate($uglyDate = null, $lang = 'en') { switch ($lang) { case 'en': $smDate = date('H:i, d F Y',strtotime($uglyDate)); break; default: $smDate = date('H:i, d F Y',strtotime($uglyDate)); } return $smDate; } function pubDateFormat($uglyDate = null) { return date('r',strtotime($uglyDate)); } function sanitizeString($string) { $string = preg_match('/^[a-zA-Z0-9\-\_\.\+\s]+$/',$string) ? sanitizeAll($string) : 'undef'; return $string; } function sanitizeAlphanum($string) { $string = ctype_alnum($string) ? sanitizeAll($string) : 'undef'; return $string; } function sanitizePciid($string) { $string = preg_match('/^[a-zA-Z0-9]{4}(\:)[a-zA-Z0-9]{4}$/',$string) ? sanitizeAll($string) : '0'; return $string; } function getOrderByClause($string) { switch ($string) { case 'last-inserted': $orderBy = 'hardware.id_hard desc'; break; case 'alphabetically': $orderBy = 'model'; break; case 'alphabetically-desc': $orderBy = 'model desc'; break; case 'compatibility': $orderBy = 'compatibility'; break; case 'undef': $orderBy = 'hardware.id_hard desc'; break; default: $orderBy = 'hardware.id_hard desc'; } return $orderBy; } //remove empty elements function removeEmptyStrings($oArray) { $nArray = array(); foreach ($oArray as $oValue) { if (strcmp($oValue,'') !== 0) { $nArray[] = $oValue; } } return $nArray; } function diff($old, $new) { $maxlen = 0; foreach($old as $oindex => $ovalue) { $nkeys = array_keys($new, $ovalue); // echo memory_get_peak_usage(true)."<br />"; foreach($nkeys as $nindex) { $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? $matrix[$oindex - 1][$nindex - 1] + 1 : 1; if($matrix[$oindex][$nindex] > $maxlen) { $maxlen = $matrix[$oindex][$nindex]; $omax = $oindex + 1 - $maxlen; $nmax = $nindex + 1 - $maxlen; } } } if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new)); return array_merge( diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), array_slice($new, $nmax, $maxlen), diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); } function htmlDiff($old, $new) { $old = str_replace("\r\n"," \r\n ",$old); $new = str_replace("\r\n"," \r\n ",$new); // $old = str_replace("\n"," \n ",$old); // $new = str_replace("\n"," \n ",$new); $ret = null; $diff = diff(removeEmptyStrings(explode(' ', $old)),removeEmptyStrings(explode(' ', $new))); foreach($diff as $k) { if(is_array($k)) $ret .= (!empty($k['d'])?"<del>".implode(' ',$k['d'])."</del> ":''). (!empty($k['i'])?"<ins>".implode(' ',$k['i'])."</ins> ":''); else $ret .= $k . ' '; } return $ret; } function applyBreaks($values,$fields) { $fieldsArray = explode(',',$fields); foreach ($fieldsArray as $field) { if (array_key_exists($field,$values)) { $values[$field] = nl2br($values[$field]); } } return $values; } function getLinkToUser($user) { if (strstr($user,'__')) { return str_replace('__',null,$user); } else { return "<a href='http://".DOMAIN_NAME."/meet/user/".Lang::$current."/$user'>$user</a>"; } } //decode the text of the wiki function decodeWikiText($string) { $string = preg_replace('/(\[hr\])/', '<hr />',$string); $string = preg_replace_callback('/(\[\[)(.*?)\|(.*?)(\]\])/', 'linkToInternalPageWithText' ,$string); $string = preg_replace_callback('/(\[\[)(.*?)(\]\])/', 'linkToInternalPage' ,$string); $string = preg_replace_callback('/(\[a\])(.*?)(\[\/a\])/', 'linkTo',$string); $string = preg_replace_callback('/(\[a\])(.*?)\|(.*?)(\[\/a\])/', 'linkToWithText',$string); $string = preg_replace_callback('/(\[notebook\])([0-9]*?)(\[\/notebook\])/s', 'linkToNotebook',$string); $string = preg_replace_callback('/(\[wifi\])([0-9]*?)(\[\/wifi\])/s', 'linkToWifi',$string); $string = preg_replace_callback('/(\[videocard\])([0-9]*?)(\[\/videocard\])/s', 'linkToVideocard',$string); $string = preg_replace('/(\[b\])(.*?)(\[\/b\])/s', '<b>${2}</b>',$string); $string = preg_replace('/(\[u\])(.*?)(\[\/u\])/s', '<u>${2}</u>',$string); $string = preg_replace('/(\[i\])(.*?)(\[\/i\])/s', '<i>${2}</i>',$string); $string = preg_replace('/(\[del\])(.*?)(\[\/del\])/s', '<del>${2}</del>',$string); $string = preg_replace('/(\[\*\])(.*?)(\[\/\*\])/s', '<li>${2}</li>',$string); $string = preg_replace('/(\[list\])(.*?)(\[\/list\])/s', '<ul>${2}</ul>',$string); $string = preg_replace('/(\[enum\])(.*?)(\[\/enum\])/s', '<ol>${2}</ol>',$string); $string = preg_replace('/(\[code\])(.*?)(\[\/code\])/s', '<pre class="code_pre">${2}</pre>',$string); $string = preg_replace('/(\[p\])(.*?)(\[\/p\])/s', '<p>${2}</p>',$string); $string = preg_replace('/(\[h1\])(.*?)(\[\/h1\])/s', '<div class="div_h1">${2}</div>',$string); $string = preg_replace('/(\[h2\])(.*?)(\[\/h2\])/s', '<div class="div_h2">${2}</div>',$string); $string = preg_replace('/(\[h3\])(.*?)(\[\/h3\])/s', '<div class="div_h3">${2}</div>',$string); $string = preg_replace_callback('/(\[tab )(lang=)([^\s]+)(\s*\])(.*?)(\[\/tab\])/s', 'createTabs',$string); $string = preg_replace('/(\[lang\])(.*?)(\[\/lang\])/s', '<div class="div_lang">${2}</div>',$string); return Tabs::render()."\n\n".$string; } //create the list of the tabs in the description entry function createTabs($match) { $label = Lang::getLabel($match[3]); Tabs::$tabList[] = "<li class='desc_tabs ".$match[3]."'><a href='#".$match[3]."'>".$label."</a></li>\n"; Tabs::$htmlList[] = "<div class='separation_line'>$label</div>\n<div class='description_tabs_page' id='".$match[3]."'>".$match[5]."</div>\n"; return null; } //create the HTMLof the tats in the description entry class Tabs { public static $tabList = array(); public static $htmlList = array(); public static function render() { $html = null; if (count(self::$tabList) > 0) { $html .= "<div class='description_tabs'>\n"; $html .= "<noscript><div class='noscript_notice'>".gtext("you need javascript enabled in order to correctly use the language's tabs (see below)")."</div></noscript>\n"; $html .= "<ul class='desc_menu'>\n"; foreach (self::$tabList as $label) { $html .= $label; } $html .= "</ul>\n<div id='description_tabs_content'>\n"; foreach (self::$htmlList as $content) { $html .= $content; } $html .= "</div>\n</div>\n"; } self::$tabList = array(); self::$htmlList = array(); return $html; } } function checkUrl($url) { // $match = '/^http\:\/\/(www\.)?[a-zA-Z0-9\-\_]+(\.[a-zA-Z0-9\-\_]+)?\.(com|net|it|info|org|eu|uk)((\/[a-zA-Z0-9\_\-\+]+)+[\/]?)?(\?([a-zA-Z0-9\_\-\+\s]+\=[a-zA-Z0-9\_\-\s\+\&]+)+)?(#[a-zA-Z0-9\_\-\+\s]+)?([\s]*)?$/'; $match = '/^http(s)?\:\/\/(www\.)?[a-zA-Z0-9\-\_]+(\.[a-zA-Z0-9\-\_]+)?\.(com|net|it|info|org|eu|uk|ca|us|cl)((\/[a-zA-Z0-9\_\-\+]+)*(\/([a-zA-Z0-9\_\-\.\+]+\.(php|html|htm|asp|aspx|jsp|cgi))?)?)?(\?([a-zA-Z0-9\_\-\+\s]+\=[a-zA-Z0-9\_\-\s\+\&]+)+)?(#[a-zA-Z0-9\_\-\+\s]+)?([\s]*)?$/'; if (preg_match($match,$url)) { return true; } else { return false; } } function vitalizeUrl($string) { if (checkUrl($string)) { return "<a title = '".$string."' href='".$string."'>".$string."</a>"; } return $string; } function linkTo($match) { if (checkUrl($match[2])) { return "<a title = '".$match[2]."' href='".$match[2]."'>".$match[2]."</a>"; } else { return $match[0]; } } function linkToInternalPage($match) { return "<a title = '".$match[2]."' href='http://".DOMAIN_NAME."/wiki/page/".Lang::$current."/".encodeUrl($match[2])."'>".$match[2]."</a>"; } function linkToInternalPageWithText($match) { return "<a title = '".$match[2]."' href='http://".DOMAIN_NAME."/wiki/page/".Lang::$current."/".encodeUrl($match[2])."'>".$match[3]."</a>"; } function linkToWithText($match) { if (checkUrl($match[2])) { return "<a title = '".$match[2]."' href='".$match[2]."'>".$match[3]."</a>"; } else { return $match[0]; } } //create the link to the wiki page of the notebook function linkToNotebook($match) { $hardware = new HardwareModel(); $clean['id_hard'] = (int)$match[2]; $name = encodeUrl($hardware->getTheModelName($clean['id_hard'])); $href = "HTTP://".DOMAIN_NAME."/notebooks/view/".Lang::$current."/".$clean['id_hard']."/$name"; return (strcmp($name,'') !== 0) ? "<a title = 'link to notebook $name: $href' href='$href'>".$name."</a>" : $match[0]; } //create the link to the wiki page of the wifi function linkToWifi($match) { $hardware = new HardwareModel(); $clean['id_hard'] = (int)$match[2]; $name = encodeUrl($hardware->getTheModelName($clean['id_hard'])); $href = "HTTP://".DOMAIN_NAME."/wifi/view/".Lang::$current."/".$clean['id_hard']."/$name"; return (strcmp($name,'') !== 0) ? "<a title = 'link to wifi card $name: $href' href='$href'>".$name."</a>" : $match[0]; } //create the link to the wiki page of the videocard function linkToVideocard($match) { $hardware = new HardwareModel(); $clean['id_hard'] = (int)$match[2]; $name = encodeUrl($hardware->getTheModelName($clean['id_hard'])); $href = "HTTP://".DOMAIN_NAME."/videocards/view/".Lang::$current."/".$clean['id_hard']."/$name"; return (strcmp($name,'') !== 0) ? "<a title = 'link to video card $name: $href' href='$href'>".$name."</a>" : $match[0]; } function getUserName($id_user = 0) { $clean['id_user'] = (int)$id_user; $u = new UsersModel(); return $u->getUser($clean['id_user']); } function getMotivation($row,$controller) { if (strcmp($row['deletion']['object'],'duplication') === 0) { $clean['id_hard'] = (int)$row['deletion']['id_duplicate']; $hardware = new HardwareModel(); $name = encodeUrl($hardware->getTheModelName($clean['id_hard'])); return "<b>duplication</b> of the model having id <b><a href='http://".DOMAIN_NAME."/".$controller."/view/".Lang::$current."/".$clean['id_hard']."/".$name."'>".$clean['id_hard']."</a></b>"; } else { return "<b>".$row['deletion']['object']."</b>"; } } //get the text in the right language function gtext($string) { if (isset(Lang::$i18n[Lang::$current][$string])) { return Lang::$i18n[Lang::$current][$string]; } return $string; } function singular($string) { if (isset(Lang::$singular[Lang::$current][$string])) { return Lang::$singular[Lang::$current][$string]; } return $string; } function plural($string) { if (isset(Lang::$plural[Lang::$current][$string])) { return Lang::$plural[Lang::$current][$string]; } return $string; } //get the hardware info from the talk id function getHardwareInfoFromTalkId($id = 0) { $clean['id'] = (int)$id; $talk = new TalkModel(); $res = $talk->select('hardware.type,hardware.id_hard')->from('hardware inner join talk')->using('id_hard')->where(array('id_talk'=>$clean['id']))->send(); return count($res) > 0 ? $res[0]['hardware'] : null; } //get hardware info from id function getHardwareInfoFromId($id = 0) { $clean['id'] = (int)$id; $hw = new HardwareModel(); $res = $hw->select()->where(array('id_hard'=>$clean['id']))->send(); $controller = 'home/index/en'; $model = ''; if (count($res) > 0) { $controller = Hardware::getControllerFromType($res[0]['hardware']['type']); $controller = strcmp($controller,'') !== 0 ? $controller : 'home/index/en'; $model = $res[0]['hardware']['model']; } return array('controller'=>$controller,'model'=>$model); } //get the wiki page info from the talk id function getWikiPageInfoFromTalkId($id = 0) { $clean['id'] = (int)$id; $talk = new WikitalkModel(); $res = $talk->select('wiki.id_wiki')->from('wiki inner join wiki_talk')->using('id_wiki')->where(array('id_talk'=>$clean['id']))->send(); return count($res) > 0 ? $res[0]['wiki']['id_wiki'] : ''; } //get the issue info from the message id function getIssueNumberFromMessageId($id = 0) { $clean['id'] = (int)$id; $mess = new MessagesModel(); $res = $mess->select('issues.id_issue')->from('issues inner join messages')->using('id_issue')->where(array('id_mes'=>$clean['id']))->toList('issues.id_issue')->send(); return count($res) > 0 ? $res[0] : ''; } //get thw wiki name from the id function getWikiNameFromId($id = 0) { $clean['id'] = (int)$id; $wiki = new WikiModel(); $name = $wiki->getTheModelName($clean['id']); return $name; } //return the URL to the moderated object page function goToModeratedItem( $row = array() ) { $url = null; switch ($row['type']) { case 'message': $url = 'issues/view/'.Lang::$current.'/'.getIssueNumberFromMessageId($row['id']).'#message-'.$row['id']; break; case 'talk': $hardInfo = getHardwareInfoFromTalkId($row['id']); if (isset($hardInfo)) { $controller = Hardware::$typeToController[$hardInfo['type']]; $url = $controller.'/talk/'.Lang::$current.'/'.$hardInfo['id_hard'].'#talk-'.$row['id']; } else { $url = 'last/modactions/'.Lang::$current; } break; case 'user': $url = 'meet/user/'.Lang::$current.'/'.getUserName($row['id']); break; case 'issue': $url = 'issues/view/'.Lang::$current.'/'.$row['id']; break; case 'wiki_talk': $url = 'wiki/talk/'.Lang::$current.'/'.getWikiPageInfoFromTalkId($row['id']).'#wiki-talk-'.$row['id']; break; case 'page': $url = 'wiki/page/'.Lang::$current.'/'.encodeUrl(getWikiNameFromId($row['id'])); break; case 'page_del': $url = 'wiki/page/'.Lang::$current.'/'.encodeUrl(getWikiNameFromId($row['id'])); break; case 'device': $hardInfo = getHardwareInfoFromId($row['id']); $url = $hardInfo['controller'].'/view/'.Lang::$current.'/'.$row['id'].'/'.encodeUrl($hardInfo['model']); break; case 'device_app': $hardInfo = getHardwareInfoFromId($row['id']); $url = $hardInfo['controller'].'/view/'.Lang::$current.'/'.$row['id'].'/'.encodeUrl($hardInfo['model']); break; case 'device_cl': $hardInfo = getHardwareInfoFromId($row['id']); $url = $hardInfo['controller'].'/view/'.Lang::$current.'/'.$row['id'].'/'.encodeUrl($hardInfo['model']); break; } return 'http://'.DOMAIN_NAME.'/'.$url; } function getUrlsFromIdHard($id_hard) { $clean['id_hard'] = (int)$id_hard; $urlView = "http://".DOMAIN_NAME; $urlTalk = "http://".DOMAIN_NAME; $deviceName = null; $hard = new HardwareModel(); $res = $hard->select('type,model')->where(array('id_hard'=>$clean['id_hard']))->send(); if (count($res) > 0) { $urlView = "http://".DOMAIN_NAME."/".Hardware::$typeToController[$res[0]['hardware']['type']]."/view/".Lang::$current."/".$clean['id_hard']."/".encodeUrl($res[0]['hardware']['model']); $urlTalk = "http://".DOMAIN_NAME."/".Hardware::$typeToController[$res[0]['hardware']['type']]."/talk/".Lang::$current."/".$clean['id_hard']; $deviceName = $res[0]['hardware']['model']; } return array('urlView'=>$urlView,'urlTalk'=>$urlTalk,'modelName'=>$deviceName); } function getDiffArray($associativeArray, $oldArray, $newArray) { $diffArray = array(); foreach ($associativeArray as $field => $label) { if (array_key_exists($field,$oldArray) and array_key_exists($field,$newArray)) { $diffArray[$label] = htmlDiff($oldArray[$field], $newArray[$field]); } } return $diffArray; }