代码块演示:语法高亮和一键复制
论坛的代码块现在支持语法高亮和一键复制了,这个帖子用来演示效果。
怎么写:用三个反引号把代码包起来,第一行反引号后面写上语言名(php、bash、js、python、nginx、json、sql、yaml 等都认),就会按语言着色;不写语言名也行,能猜出来就自动着色,猜不准就按纯文本显示。行内代码用一个反引号,比如 systemctl reload frankenphp。
每个代码块右上角都有「复制」按钮,点一下整段代码就进剪贴板了,不会带上行号或语言名。回复里的代码块超过 20 行会在框内滚动,主楼不限。
PHP
<?php
// 统计每个版块今天的新帖数
function pd_today_counts(mysqli $db): array {
$rs = mysqli_query($db, "SELECT forum_id, COUNT(*) AS c FROM pd_threads WHERE created_at >= CURDATE() GROUP BY forum_id");
$out = [];
while ($row = mysqli_fetch_assoc($rs)) {
$out[(int) $row['forum_id']] = (int) $row['c'];
}
return $out; // 没有新帖的版块不在结果里
}
Bash
#!/usr/bin/env bash
set -euo pipefail
# 每天凌晨备份数据库,保留最近 7 天
BACKUP_DIR=/var/backups/fish
mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction fish_forum | gzip > "$BACKUP_DIR/$(date +%F).sql.gz"
find "$BACKUP_DIR" -name '*.sql.gz' -mtime +7 -delete
echo "done: $(ls "$BACKUP_DIR" | wc -l) files"
JavaScript
// 复制按钮:优先用 Clipboard API
async function copyText(text) {
try {
await navigator.clipboard.writeText(text);
return true;
} catch (err) {
console.warn('clipboard failed', err);
return false;
}
}
const blocks = document.querySelectorAll('pre > code');
blocks.forEach((el, i) => el.dataset.index = String(i + 1));
Python
import json
from pathlib import Path
def load_config(path: str = "config.json") -> dict:
"""读取配置,文件不存在时返回默认值"""
p = Path(path)
if not p.exists():
return {"debug": False, "workers": 4}
return json.loads(p.read_text(encoding="utf-8"))
print(load_config()["workers"]) # 4
Nginx
server {
listen 443 ssl http2;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
JSON
{
"name": "fish.sb",
"version": "1.0.0",
"private": true,
"tags": ["forum", "php"],
"limits": { "upload_mb": 5, "reply_chars": 10000 }
}
没写语言名的代码块
$ curl -I https://fish.sb
HTTP/2 200
server: cloudflare
content-type: text/html; charset=utf-8
SIGNATURE
鱼是摸不完的,我们要尊重梦想。