代码块演示:语法高亮和一键复制

论坛的代码块现在支持语法高亮和一键复制了,这个帖子用来演示效果。

怎么写:用三个反引号把代码包起来,第一行反引号后面写上语言名(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

鱼是摸不完的,我们要尊重梦想。

感谢 1 位鱼友的 1 次积极参与,1 楼已竣工!

盖否?
1 楼

备份脚本改了一版,加上传对象存储,顺便演示回复里超过 20 行的代码块(框内滚动):

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR=/var/backups/fish
DATE=$(date +%F)
BUCKET="s3://my-bucket/fish"
ENDPOINT="https://s3.example.com"

mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction --routines fish_forum | gzip > "$BACKUP_DIR/$DATE.sql.gz"

# 上传到 S3 兼容存储
aws s3 cp "$BACKUP_DIR/$DATE.sql.gz" "$BUCKET/$DATE.sql.gz" --endpoint-url "$ENDPOINT"

# 本地只留 3 天
find "$BACKUP_DIR" -name '*.sql.gz' -mtime +3 -delete

# 远端只留 30 天
cutoff=$(date -d '30 days ago' +%s)
aws s3 ls "$BUCKET/" --endpoint-url "$ENDPOINT" | while read -r line; do
  f=$(echo "$line" | awk '{print $4}')
  d=${f%%.*}
  if [[ -n "$d" && $(date -d "$d" +%s) -lt $cutoff ]]; then
    aws s3 rm "$BUCKET/$f" --endpoint-url "$ENDPOINT"
  fi
done

echo "backup ok: $DATE"

记得 chmod +x backup.sh,再加进 crontab。

SIGNATURE
顶1 踩1

鱼是摸不完的,我们要尊重梦想。

登录后回复
Esc
回车搜索 · Esc 关闭 · ⌘/Ctrl K 或 / 打开