2016-07-18 16:39:37 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class HTML {
|
|
|
|
public static function escape($str) {
|
|
|
|
return htmlspecialchars($str);
|
|
|
|
}
|
|
|
|
public static function stripTags($str) {
|
|
|
|
return strip_tags($str);
|
|
|
|
}
|
|
|
|
public static function avatar_addr($user, $size) {
|
2022-10-20 02:02:53 +00:00
|
|
|
if ($user['avatar_source'] == 'qq' && $user['qq']) {
|
|
|
|
$s = '5';
|
|
|
|
|
|
|
|
if ($size <= 40) {
|
|
|
|
$s = '2';
|
|
|
|
} elseif ($size <= 100) {
|
|
|
|
$s = '3';
|
|
|
|
} elseif ($size <= 140) {
|
|
|
|
$s = '4';
|
|
|
|
}
|
|
|
|
|
|
|
|
return "https://q1.qlogo.cn/g?b=qq&nk={$user['qq']}&s=$s";
|
|
|
|
}
|
|
|
|
|
2022-03-20 00:15:03 +00:00
|
|
|
return '//gravatar.loli.net/avatar/' . md5(strtolower(trim($user['email']))) . "?d=mm&s=$size";
|
2016-07-18 16:39:37 +00:00
|
|
|
}
|
2022-09-20 08:50:29 +00:00
|
|
|
|
2016-07-18 16:39:37 +00:00
|
|
|
public static function tablist($tabs_info, $cur, $type = 'nav-tabs') {
|
|
|
|
$html = '<ul class="nav '.$type.'" role="tablist">';
|
|
|
|
foreach ($tabs_info as $id => $tab) {
|
2019-09-10 02:15:20 +00:00
|
|
|
$html .= '<li class="nav-item"><a class="nav-link'.($cur == $id ? ' active' : '').'" href="'.$tab['url'].'" role="tab">'.$tab['name'].'</a></li>';
|
2016-07-18 16:39:37 +00:00
|
|
|
}
|
|
|
|
$html .= '</ul>';
|
|
|
|
return $html;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function hiddenToken() {
|
|
|
|
return '<input type="hidden" name="_token" value="'.crsf_token().'" />';
|
|
|
|
}
|
|
|
|
public static function div_vinput($name, $type, $label_text, $default_value) {
|
2022-10-19 13:59:16 +00:00
|
|
|
return '<div id="'."div-$name".'" class="mb-3">'
|
|
|
|
. '<label for="'."input-$name".'" class="control-label form-label">'.$label_text.'</label>'
|
2016-07-18 16:39:37 +00:00
|
|
|
. '<input type="'.$type.'" class="form-control" name="'.$name.'" id="'."input-$name".'" value="'.HTML::escape($default_value).'" />'
|
2022-10-19 13:59:16 +00:00
|
|
|
. '<span class="help-block invalid-feedback" id="'."help-$name".'"></span>'
|
2016-07-18 16:39:37 +00:00
|
|
|
. '</div>';
|
|
|
|
}
|
|
|
|
public static function div_vtextarea($name, $label_text, $default_value) {
|
2022-10-19 13:59:16 +00:00
|
|
|
return '<div id="'."div-$name".'" class="mb-3">'
|
2016-07-18 16:39:37 +00:00
|
|
|
. '<label for="'."input-$name".'" class="control-label">'.$label_text.'</label>'
|
|
|
|
. '<textarea class="form-control" name="'.$name.'" id="'."input-$name".'">'.HTML::escape($default_value).'</textarea>'
|
|
|
|
. '<span class="help-block" id="'."help-$name".'"></span>'
|
|
|
|
. '</div>';
|
|
|
|
}
|
|
|
|
public static function checkbox($name, $default_value) {
|
|
|
|
$status = $default_value ? 'checked="checked" ' : '';
|
|
|
|
return '<input type="checkbox" id="'."input-$name".'" name="'.$name.'" '.$status.'/>';
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function blog_url($username, $uri) {
|
2019-07-12 06:30:00 +00:00
|
|
|
switch (UOJConfig::$data['switch']['blog-domain-mode']) {
|
|
|
|
case 1:
|
|
|
|
$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
|
|
|
|
$url = UOJConfig::$data['web']['blog']['protocol'].'://'.blog_name_encode($username).'.'.UOJConfig::$data['web']['blog']['host'].$port;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
|
|
|
|
$url = UOJConfig::$data['web']['blog']['protocol'].'://'.UOJConfig::$data['web']['blog']['host'].$port.'/'.blog_name_encode($username);
|
|
|
|
break;
|
|
|
|
case 3:
|
2022-09-20 08:50:29 +00:00
|
|
|
$url = HTML::url('/blog/'.blog_name_encode($username));
|
2019-07-12 06:30:00 +00:00
|
|
|
break;
|
|
|
|
}
|
2016-07-18 16:39:37 +00:00
|
|
|
$url .= $uri;
|
|
|
|
$url = rtrim($url, '/');
|
|
|
|
return HTML::escape($url);
|
|
|
|
}
|
2019-07-12 06:30:00 +00:00
|
|
|
public static function blog_list_url() {
|
|
|
|
switch (UOJConfig::$data['switch']['blog-domain-mode']) {
|
|
|
|
case 1:
|
|
|
|
case 2:
|
|
|
|
$port = ((UOJConfig::$data['web']['blog']['protocol'] === "http" && UOJConfig::$data['web']['blog']['port'] == 80) || (UOJConfig::$data['web']['blog']['protocol'] === "https" && UOJConfig::$data['web']['blog']['port'] == 443)) ? '' : (':'.UOJConfig::$data['web']['blog']['port']);
|
|
|
|
$url = UOJConfig::$data['web']['blog']['protocol'].'://'.UOJConfig::$data['web']['blog']['host'].$port;
|
|
|
|
break;
|
|
|
|
case 3:
|
2022-09-20 08:50:29 +00:00
|
|
|
$url = HTML::url('/blogs');
|
2019-07-12 06:30:00 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return HTML::escape(rtrim($url, '/'));
|
|
|
|
}
|
2022-09-20 08:50:29 +00:00
|
|
|
|
2016-07-18 16:39:37 +00:00
|
|
|
public static function url($uri, $config = array()) {
|
|
|
|
$config = array_merge(array(
|
|
|
|
'location' => 'main',
|
|
|
|
'params' => null
|
|
|
|
), $config);
|
2022-09-20 08:50:29 +00:00
|
|
|
|
2016-07-18 16:39:37 +00:00
|
|
|
$path = strtok($uri, '?');
|
|
|
|
$qs = strtok('?');
|
|
|
|
parse_str($qs, $param);
|
|
|
|
|
|
|
|
if ($config['params'] != null) {
|
|
|
|
$param = array_merge($param, $config['params']);
|
|
|
|
}
|
2022-09-20 08:50:29 +00:00
|
|
|
|
2022-09-20 10:11:10 +00:00
|
|
|
$url = ''; // '//'.UOJConfig::$data['web'][$config['location']]['host'];
|
2016-07-18 16:39:37 +00:00
|
|
|
if ($param) {
|
|
|
|
$url .= $path.'?'.HTML::query_string_encode($param);
|
2022-09-20 10:11:10 +00:00
|
|
|
} elseif ($path != '/') {
|
2022-09-20 08:50:29 +00:00
|
|
|
$url .= rtrim($path, '/');
|
2022-09-20 10:11:10 +00:00
|
|
|
} else {
|
|
|
|
$url .= $path;
|
2016-07-18 16:39:37 +00:00
|
|
|
}
|
|
|
|
return HTML::escape($url);
|
|
|
|
}
|
|
|
|
public static function timeanddate_url($time, $config = array()) {
|
|
|
|
$url = UOJConfig::$data['web']['blog']['protocol'].'://';
|
|
|
|
$url .= 'www.timeanddate.com/worldclock/fixedtime.html';
|
|
|
|
$url .= '?'.'iso='.$time->format('Ymd\THi');
|
|
|
|
$url .= '&'.'p1=33';
|
|
|
|
if (isset($config['duration']) && $config['duration'] < 3600) {
|
|
|
|
$url .= '&'.'ah='.floor($config['duration'] / 60);
|
|
|
|
if ($config['duration'] % 60 != 0) {
|
|
|
|
$url .= '&'.'am='.($config['duration'] % 60);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$url = HTML::escape($url);
|
|
|
|
return $url;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function js_src($uri, $config = array('location' => 'main')) {
|
|
|
|
return '<script src="'.HTML::url($uri, $config).'"></script>';
|
|
|
|
}
|
|
|
|
public static function css_link($uri, $config = array('location' => 'main')) {
|
|
|
|
return '<link type="text/css" rel="stylesheet" href="'.HTML::url($uri, $config).'" />';
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function query_string_encode($q, $array_name = null) {
|
|
|
|
if (!is_array($q)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
$r = array();
|
|
|
|
foreach ((array)$q as $k => $v) {
|
|
|
|
if ($array_name !== null) {
|
2020-06-25 12:41:16 +00:00
|
|
|
if (is_numeric($k)) {
|
2016-07-18 16:39:37 +00:00
|
|
|
$k = $array_name."[]";
|
|
|
|
} else {
|
|
|
|
$k = $array_name."[$k]";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (is_array($v) || is_object($v)) {
|
|
|
|
$r[] = self::query_string_encode($v, $k);
|
|
|
|
} else {
|
|
|
|
$r[] = urlencode($k)."=".urlencode($v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return implode("&", $r);
|
|
|
|
}
|
|
|
|
|
2022-10-09 13:33:13 +00:00
|
|
|
public static function purifier() {
|
2016-07-18 16:39:37 +00:00
|
|
|
$config = HTMLPurifier_Config::createDefault();
|
2022-10-19 03:23:22 +00:00
|
|
|
// $config->set('Cache.DefinitionImpl', null);
|
|
|
|
$config->set('HTML.DefinitionID', 'UOJ__HTML::purifier()');
|
|
|
|
$config->set('HTML.DefinitionRev', 1);
|
|
|
|
$config->set('Output.Newline', true);
|
2016-07-18 16:39:37 +00:00
|
|
|
$def = $config->getHTMLDefinition(true);
|
|
|
|
|
|
|
|
$def->addElement('section', 'Block', 'Flow', 'Common');
|
|
|
|
$def->addElement('nav', 'Block', 'Flow', 'Common');
|
|
|
|
$def->addElement('article', 'Block', 'Flow', 'Common');
|
|
|
|
$def->addElement('aside', 'Block', 'Flow', 'Common');
|
|
|
|
$def->addElement('header', 'Block', 'Flow', 'Common');
|
|
|
|
$def->addElement('footer', 'Block', 'Flow', 'Common');
|
|
|
|
|
2022-10-19 03:23:22 +00:00
|
|
|
$extra_allowed_html = [
|
|
|
|
'span' => ['data-realname' => 'Text', 'data-uoj-username' => 'Number'],
|
|
|
|
];
|
|
|
|
|
|
|
|
foreach ($extra_allowed_html as $element => $attributes) {
|
|
|
|
foreach ($attributes as $attribute => $type) {
|
|
|
|
$def->addAttribute($element, $attribute, $type);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-18 16:39:37 +00:00
|
|
|
return new HTMLPurifier($config);
|
|
|
|
}
|
2022-10-09 13:33:13 +00:00
|
|
|
|
|
|
|
public static function purifier_inline() {
|
|
|
|
$allowed_html = [
|
|
|
|
'a' => ['href' => 'URI'],
|
|
|
|
'b' => [],
|
|
|
|
'i' => [],
|
|
|
|
'u' => [],
|
|
|
|
's' => [],
|
|
|
|
'em' => [],
|
|
|
|
'strong' => [],
|
|
|
|
'sub' => [],
|
|
|
|
'sup' => [],
|
|
|
|
'small' => [],
|
|
|
|
'del' => [],
|
|
|
|
'br' => [],
|
2022-10-19 03:23:22 +00:00
|
|
|
'span' => ['data-realname' => 'Text', 'data-uoj-username' => 'Number'],
|
2022-10-09 13:33:13 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
$config = HTMLPurifier_Config::createDefault();
|
|
|
|
|
|
|
|
$allowed_elements = [];
|
|
|
|
$allowed_attributes = [];
|
|
|
|
|
|
|
|
foreach ($allowed_html as $element => $attributes) {
|
|
|
|
$allowed_elements[$element] = true;
|
2022-10-19 03:23:22 +00:00
|
|
|
foreach ($attributes as $attribute => $type) {
|
2022-10-09 13:33:13 +00:00
|
|
|
$allowed_attributes["$element.$attribute"] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$config->set('HTML.AllowedElements', $allowed_elements);
|
|
|
|
$config->set('HTML.AllowedAttributes', $allowed_attributes);
|
|
|
|
|
2022-10-19 03:23:22 +00:00
|
|
|
// $config->set('Cache.DefinitionImpl', null);
|
|
|
|
$config->set('HTML.DefinitionID', 'UOJ__HTML::purifier_inline()');
|
|
|
|
$config->set('HTML.DefinitionRev', 1);
|
|
|
|
$def = $config->getHTMLDefinition(true);
|
|
|
|
|
|
|
|
foreach ($allowed_html as $element => $attributes) {
|
|
|
|
foreach ($attributes as $attribute => $type) {
|
|
|
|
$def->addAttribute($element, $attribute, $type);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-09 13:33:13 +00:00
|
|
|
return new HTMLPurifier($config);
|
|
|
|
}
|
2022-10-12 11:13:33 +00:00
|
|
|
|
|
|
|
public static function parsedown() {
|
2022-10-18 00:53:57 +00:00
|
|
|
return new UOJMarkdown([
|
2022-10-12 11:13:33 +00:00
|
|
|
'math' => [
|
|
|
|
'enabled' => true,
|
|
|
|
'matchSingleDollar' => true
|
|
|
|
]
|
|
|
|
]);
|
|
|
|
}
|
2016-07-18 16:39:37 +00:00
|
|
|
}
|