Files
laoyang 4f0d19fb91 版本号 3.2.4 -> 3.2.5(修 Prism 报错,项目地址改为自建 Git)
## 修 Prism is not defined

首页控制台报 `Uncaught ReferenceError: Prism is not defined`,来源是
wp-editormd 插件(不是本主题):它在 Prism 脚本加载之前就无条件执行了
`Prism.plugins.autoloader.languages_path = "..."`。

线上页面里的真实顺序:
    第 668 行  该赋值语句
    第 695 行  prism-core.min.js
    第 696 行  prism-autoloader.min.js

在 `wp_head` 优先级 0 垫一个最小空壳 `window.Prism`(含 plugins.autoloader
这条访问链路),让那句赋值有地方可写。已核对 prism-core.min.js 源码:它开头
只读 `u.Prism.manual` 与 `u.Prism.disableWorkerMessageHandler`,结尾
`global.Prism = Prism` 整体覆盖 —— 空壳必定被真实对象替换,不承担持久职责,
只为吸收那条过早的赋值。已用 jsdom 验证:去掉空壳重现原始报错,加上后消失,
且之后 `Prism.highlightAll` 仍可正常调用。

## 项目地址统一到 code.yangyq.net

原作者署名、原主题地址、README、语言包、JS 里的控制台横幅全部换成自建仓库地址。
LICENSE 文件保持原样不动(MIT 要求保留原始版权声明)。

## CDN 分支改成拿不到就回退本地

原来的 `g_cdn` 分支指向 `cdn.jsdelivr.net/gh/vtrois/kratos`,本仓库在自建
Gitea 上,jsDelivr 只认 github/npm/wordpress,实测该地址 404。现改为仅在
`YANG_THEME_CDN_REPO` 常量存在时才走 CDN,否则一律用
`get_template_directory_uri()`。留一个 404 的地址比留空更危险:页面能开、
样式全丢,极难排查。

## 顺带

- `.gitattributes` 补 `*.mo binary`:原来是靠"含 NUL"启发式判定,不是契约
- `update.json` 的版本号跟进到 3.2.5
- `kratos.min.js` / `kratos.min.css` 用压缩器重新生成,不手工改产物
2026-10-23 12:55:41 +08:00

295 lines
10 KiB
PHP

<?php
/**
* 文章短代码
* @author Yongquan Yang <yangyq.net>
* @license MIT License
* @version 2020.06.25
*/
function h2title($atts, $content = null, $code = "")
{
$return = '<h2 class="title">';
$return .= $content;
$return .= '</h2>';
return $return;
}
add_shortcode('h2title', 'h2title');
function success($atts, $content = null, $code = "")
{
$return = '<div class="alert alert-success">';
$return .= $content;
$return .= '</div>';
return $return;
}
add_shortcode('success', 'success');
function info($atts, $content = null, $code = "")
{
$return = '<div class="alert alert-info">';
$return .= $content;
$return .= '</div>';
return $return;
}
add_shortcode('info', 'info');
function warning($atts, $content = null, $code = "")
{
$return = '<div class="alert alert-warning">';
$return .= $content;
$return .= '</div>';
return $return;
}
add_shortcode('warning', 'warning');
function danger($atts, $content = null, $code = "")
{
$return = '<div class="alert alert-danger">';
$return .= $content;
$return .= '</div>';
return $return;
}
add_shortcode('danger', 'danger');
function wymusic($atts, $content = null, $code = "")
{
$return = '<div class="mb-3"><iframe style="width:100%" frameborder="no" border="0" marginwidth="0" marginheight="0" height=86 src="//music.163.com/outchain/player?type=2&id=';
$return .= $content;
$return .= '&auto=' . kratos_option('g_163mic', false) . '&height=66"></iframe></div>';
return $return;
}
add_shortcode('music', 'wymusic');
function bdbtn($atts, $content = null, $code = "")
{
$return = '<a class="downbtn" href="';
$return .= $content;
$return .= '" target="_blank"><i class="kicon i-download mr-1"></i>立即下载</a>';
return $return;
}
add_shortcode('bdbtn', 'bdbtn');
function kbd($atts, $content = null, $code = "")
{
$return = '<kbd>';
$return .= $content;
$return .= '</kbd>';
return $return;
}
add_shortcode('kbd', 'kbd');
function nrmark($atts, $content = null, $code = "")
{
$return = '<mark>';
$return .= $content;
$return .= '</mark>';
return $return;
}
add_shortcode('mark', 'nrmark');
function striped($atts, $content = null, $code = "")
{
$return = '<div class="progress"><div class="progress-bar" role="progressbar" style="width:';
$return .= $content;
$return .= '%;" aria-valuenow="';
$return .= $content;
$return .= '" aria-valuemin="0" aria-valuemax="100">';
$return .= $content;
$return .= '%</div></div>';
return $return;
}
add_shortcode('striped', 'striped');
function successbox($atts, $content = null, $code = "")
{
extract(shortcode_atts(array("title" => __('标题内容', 'kratos')), $atts));
$return = '<div class="card border-success text-white mb-3"><div class="card-header bg-success">';
$return .= $title;
$return .= '</div><div class="card-body"><p class="card-text">';
$return .= $content;
$return .= '</p></div></div>';
return $return;
}
add_shortcode('successbox', 'successbox');
function infobox($atts, $content = null, $code = "")
{
extract(shortcode_atts(array("title" => __('标题内容', 'kratos')), $atts));
$return = '<div class="card border-info text-white mb-3"><div class="card-header bg-info">';
$return .= $title;
$return .= '</div><div class="card-body"><p class="card-text">';
$return .= $content;
$return .= '</p></div></div>';
return $return;
}
add_shortcode('infobox', 'infobox');
function warningbox($atts, $content = null, $code = "")
{
extract(shortcode_atts(array("title" => __('标题内容', 'kratos')), $atts));
$return = '<div class="card border-warning text-white mb-3"><div class="card-header bg-warning">';
$return .= $title;
$return .= '</div><div class="card-body"><p class="card-text">';
$return .= $content;
$return .= '</p></div></div>';
return $return;
}
add_shortcode('warningbox', 'warningbox');
function dangerbox($atts, $content = null, $code = "")
{
extract(shortcode_atts(array("title" => __('标题内容', 'kratos')), $atts));
$return = '<div class="card border-danger text-white mb-3"><div class="card-header bg-danger">';
$return .= $title;
$return .= '</div><div class="card-body"><p class="card-text">';
$return .= $content;
$return .= '</p></div></div>';
return $return;
}
add_shortcode('dangerbox', 'dangerbox');
function vqq($atts, $content = null, $code = "")
{
$return = '<div class="video-container"><iframe frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=';
$return .= $content;
$return .= '" allowFullScreen="true"></iframe></div>';
return $return;
}
add_shortcode('vqq', 'vqq');
function youtube($atts, $content = null, $code = "")
{
$return = '<div class="video-container"><iframe height="498" width="750" src="https://www.youtube.com/embed/';
$return .= $content;
$return .= '" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>';
return $return;
}
add_shortcode('youtube', 'youtube');
function bilibili($atts, $content = null, $code = "")
{
$return = '<div class="video-container"><iframe src="//player.bilibili.com/player.html?bvid=';
$return .= $content;
$return .= '&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe></div>';
return $return;
}
add_shortcode('bilibili', 'bilibili');
function reply($atts, $content = null)
{
extract(shortcode_atts(array("notice" => '<div class="alert alert-primary text-center" role="alert">'.__('温馨提示:此处内容已隐藏,<a href="#comments">回复</a>后刷新页面即可查看!', 'kratos').'</div>'), $atts));
$userEmail = null;
$user_ID = (int) wp_get_current_user()->ID;
if ($user_ID > 0) {
$userEmail = get_userdata($user_ID)->user_email;
$adminUsers = get_users('role=Administrator');
$adminEmails = array();
foreach ($adminUsers as $user) {
$adminEmails[] = $user->user_email;
}
$authorEmail = get_the_author_meta('user_email');
array_push($adminEmails, $authorEmail);
if (in_array($userEmail, $adminEmails)) {
return $content;
}
} else {
if (isset($_COOKIE['comment_author_email_' . COOKIEHASH])) {
$userEmail = str_replace('%40', '@', $_COOKIE['comment_author_email_' . COOKIEHASH]);
} else {
return $notice;
}
}
if (empty($userEmail)) {
return $notice;
}
global $wpdb;
$post_id = get_the_ID();
$query = "SELECT `comment_ID` FROM {$wpdb->comments} WHERE `comment_post_ID`={$post_id} and `comment_approved`='1' and `comment_author_email`='{$userEmail}' LIMIT 1";
if ($wpdb->get_results($query)) {
return do_shortcode($content);
} else {
return $notice;
}
}
add_shortcode('reply', 'reply');
function accordion($atts, $content=null, $code=""){
extract(shortcode_atts(array("title"=>__('标题内容','kratos')),$atts));
$return = '<div class="accordion"><div class="acheader"><div class="icon"><i class="kicon i-plus"></i></div><span>';
$return .= $title;
$return .= '</span></div><div class="contents"><div class="inner">';
$return .= do_shortcode($content);
$return .= '</div></div></div>';
return $return;
}
add_shortcode('accordion','accordion');
add_action('init', 'more_button');
function more_button()
{
if (!current_user_can('edit_posts') && !current_user_can('edit_pages')) {
return;
}
if (get_user_option('rich_editing') == 'true') {
add_filter('mce_external_plugins', 'add_plugin');
add_filter('mce_buttons', 'register_button');
}
}
function add_more_buttons($buttons) {
$buttons[] = 'hr';
$buttons[] = 'wp_page';
$buttons[] = 'fontsizeselect';
$buttons[] = 'styleselect';
return $buttons;
}
add_filter("mce_buttons", "add_more_buttons");
function register_button($buttons)
{
array_push($buttons, " ", "h2title");
array_push($buttons, " ", "kbd");
array_push($buttons, " ", "mark");
array_push($buttons, " ", "striped");
array_push($buttons, " ", "bdbtn");
array_push($buttons, " ", "reply");
array_push($buttons, " ", "accordion");
array_push($buttons, " ", "music");
array_push($buttons, " ", "vqq");
array_push($buttons, " ", "youtube");
array_push($buttons, " ", "bilibili");
array_push($buttons, " ", "success");
array_push($buttons, " ", "info");
array_push($buttons, " ", "warning");
array_push($buttons, " ", "danger");
array_push($buttons, " ", "successbox");
array_push($buttons, " ", "infoboxs");
array_push($buttons, " ", "warningbox");
array_push($buttons, " ", "dangerbox");
return $buttons;
}
function add_plugin($plugin_array)
{
$plugin_array['h2title'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['kbd'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['mark'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['striped'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['bdbtn'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['reply'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['accordion'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['music'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['vqq'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['youtube'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['bilibili'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['success'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['info'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['warning'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['danger'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['successbox'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['infoboxs'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['warningbox'] = ASSET_PATH . '/assets/js/buttons/more.js';
$plugin_array['dangerbox'] = ASSET_PATH . '/assets/js/buttons/more.js';
return $plugin_array;
}