Files
2026-07-13 13:34:48 +08:00

63 lines
1.6 KiB
Bash
Executable File

#!/bin/bash
set -e
if [ -z "$1" ]; then
echo "❌ Usage: ./record-demo.sh <example_folder>"
exit 1
fi
FOLDER=$1
CAST_PATH="${FOLDER}/demo.cast"
SVG_PATH="${FOLDER}/demo.svg"
echo "🎬 Recording demo for ${FOLDER}..."
asciinema rec "$CAST_PATH" --command "pnpm start ${FOLDER}" --overwrite -f asciicast-v2
echo "🛠 Appending trailing empty frame..."
node -e "
const fs = require('fs');
const path = '$CAST_PATH';
const lines = fs.readFileSync(path, 'utf8').split('\n').filter(Boolean);
const header = JSON.parse(lines[0]);
const frames = lines.slice(1).map(JSON.parse);
const lastTime = frames.at(-1)?.[0] ?? 0;
frames.push([lastTime + 5, '']);
// Write everything back
fs.writeFileSync(path, [JSON.stringify(header), ...frames.map(f => JSON.stringify(f))].join('\n') + '\n');
"
echo "📏 Calculating max width..."
MAX_WIDTH=$(node -e "
const fs = require('fs');
const stripAnsi = s => s.replace(
/\\u001b\\[[0-9;?]*[a-zA-Z]|\\u001b\\][^\u0007]*(\u0007|$)/g, ''
);
const lines = fs.readFileSync('$CAST_PATH', 'utf8').split('\n').filter(Boolean).slice(1);
let max = 0;
for (const line of lines) {
try {
const arr = JSON.parse(line);
if (arr[1] === 'o') {
const cleaned = stripAnsi(arr[2]);
for (const l of cleaned.split('\n')) {
if (l.length > max) max = l.length;
}
}
} catch {}
}
console.log(Math.min(150, Math.max(max || 100, 80)));
")
echo "🖼 Generating SVG (width=$MAX_WIDTH)..."
echo "🖼 Generating SVG..."
svg-term --in "$CAST_PATH" --out "$SVG_PATH" --window --width "$MAX_WIDTH" --height 30 --from 500
echo "✅ Done! Saved to:"
echo " - $CAST_PATH"
echo " - $SVG_PATH"