From 879ce3df39577d6fe9b43fd02ca101476d8b4235 Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 09:08:49 +0800 Subject: [PATCH 1/6] feat: add bundle size comparison workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加自动体积对比脚本 (benchmark/size-compare.js) - 支持本地和 CI 环境的智能输出 - 创建独立的 GitHub Actions 工作流 - PR 中自动发布/更新体积对比评论 - 添加详细文档和快速参考指南 Features: - 🔄 自动对比本地打包文件与 CDN 文件体积 - 📊 智能检测 CI 环境并调整输出格式 - 💬 PR 评论自动发布和更新 - ⚠️ 体积变化超过 5% 时显示警告 - 📈 GitHub Actions 注释集成 Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/ci.yaml | 3 + .github/workflows/size-compare.yaml | 92 +++++++++++++++ benchmark/QUICKREF.md | 62 ++++++++++ benchmark/README.md | 145 +++++++++++++++++++++++ benchmark/size-compare.js | 175 ++++++++++++++++++++++++++++ package.json | 2 + 6 files changed, 479 insertions(+) create mode 100644 .github/workflows/size-compare.yaml create mode 100644 benchmark/QUICKREF.md create mode 100644 benchmark/README.md create mode 100644 benchmark/size-compare.js diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fe20404..0f54f6d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,6 +22,9 @@ jobs: - name: Build run: npm run build + - name: Compare bundle size with CDN + run: npm run size:compare + - name: Run tests with coverage run: npm run test diff --git a/.github/workflows/size-compare.yaml b/.github/workflows/size-compare.yaml new file mode 100644 index 0000000..8d01676 --- /dev/null +++ b/.github/workflows/size-compare.yaml @@ -0,0 +1,92 @@ +name: Bundle Size Comparison + +on: + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + push: + branches: [main] + +jobs: + compare-size: + runs-on: ubuntu-latest + permissions: + pull-requests: write + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node 18 + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install dependencies + run: npm install + + - name: Build + run: npm run build + + - name: Run size comparison + id: size-compare + run: | + echo "SIZE_OUTPUT<> $GITHUB_OUTPUT + npm run size:compare 2>&1 | tee -a $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + continue-on-error: false + + - name: Comment PR with size comparison + if: github.event_name == 'pull_request' + uses: actions/github-script@v7 + with: + script: | + const output = `${{ steps.size-compare.outputs.SIZE_OUTPUT }}`; + + // 查找是否已有体积对比评论 + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + + const botComment = comments.find(comment => + comment.user.type === 'Bot' && + comment.body.includes('📦 Bundle Size Comparison') + ); + + const body = `## 📦 Bundle Size Comparison + +\`\`\` +${output} +\`\`\` + +_Updated at ${new Date().toUTCString()}_ + +--- +💡 **提示**: 此评论会在每次推送新提交时自动更新`; + + if (botComment) { + // 更新现有评论 + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: body + }); + console.log('✅ 已更新体积对比评论'); + } else { + // 创建新评论 + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: body + }); + console.log('✅ 已创建体积对比评论'); + } + + - name: Display size comparison in logs + if: github.event_name == 'push' + run: npm run size:compare diff --git a/benchmark/QUICKREF.md b/benchmark/QUICKREF.md new file mode 100644 index 0000000..7608094 --- /dev/null +++ b/benchmark/QUICKREF.md @@ -0,0 +1,62 @@ +# 快速参考 + +## 触发条件 + +### ✅ 会触发体积对比的操作 + +1. **创建 PR** 到 main 分支 + ```bash + git checkout -b feature/my-feature + # 进行修改... + git push origin feature/my-feature + # 然后在 GitHub 上创建 PR + ``` + +2. **更新已有 PR** (推送新提交) + ```bash + git commit -m "更新功能" + git push origin feature/my-feature + ``` + +3. **重新打开已关闭的 PR** + +4. **直接推送到 main 分支** + ```bash + git push origin main + ``` + +### 🔍 查看结果 + +- **Pull Request**: 在 PR 的评论区查看自动发布的体积对比评论 +- **Push to main**: 在 Actions 标签页 → "Bundle Size Comparison" 工作流日志中查看 + +## 本地测试 + +在提交 PR 前,可以本地运行体积对比: + +```bash +# 完整流程:打包 + 对比 +npm run build:compare + +# 仅对比(需要先打包) +npm run size:compare +``` + +## 工作流文件 + +- `.github/workflows/size-compare.yaml` - 独立的体积对比工作流 +- `.github/workflows/ci.yaml` - 主 CI 工作流(包含体积对比步骤) + +## 常见问题 + +**Q: 为什么我的 PR 没有看到体积对比评论?** +A: 检查 GitHub Actions 是否成功运行,确保仓库有 `pull-requests: write` 权限。 + +**Q: 如何修改体积变化警告阈值?** +A: 编辑 `benchmark/size-compare.js` 中的第 127 和 133 行,将 `5` 改为你想要的百分比。 + +**Q: 评论会重复创建吗?** +A: 不会,工作流会智能检测已有评论并更新,而不是创建新评论。 + +**Q: 可以对比其他文件吗?** +A: 可以,修改 `benchmark/size-compare.js` 中的 `localFilePath` 和 `cdnUrl` 变量。 diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..4fa3c96 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,145 @@ +# Bundle Size Comparison + +这个目录包含用于对比打包文件体积的工具。 + +## 📦 功能说明 + +`size-compare.js` 脚本可以自动对比本地打包后的 `dist/index.js` 文件与 CDN 上已发布版本的体积差异。 + +## 🚀 使用方法 + +### 本地运行 + +```bash +# 仅运行体积对比(需要先手动打包) +npm run size:compare + +# 打包后自动进行体积对比 +npm run build:compare +``` + +### 自动化运行 + +GitHub Actions 会在以下情况自动运行体积对比: + +#### Pull Request 触发 +当向 `main` 分支创建或更新 PR 时,会自动触发体积对比: +- **PR 创建时** (`opened`) +- **PR 更新时** (`synchronize`) - 推送新提交 +- **PR 重新打开时** (`reopened`) + +对比结果会自动作为评论发布到 PR 中,并在每次推送新提交时自动更新该评论。 + +#### Push 触发 +当代码直接推送到 `main` 分支时,体积对比结果会显示在 GitHub Actions 的运行日志中。 + +#### 工作流程 + +``` +创建/更新 PR to main + ↓ +触发 GitHub Actions + ↓ +安装依赖 (npm install) + ↓ +构建项目 (npm run build) + ↓ +运行体积对比 (npm run size:compare) + ↓ + ┌────────────────────┐ + │ 对比本地 dist/ │ + │ vs CDN 文件 │ + └────────────────────┘ + ↓ + ┌────────────────────┐ + │ 计算体积差异 │ + │ 和百分比变化 │ + └────────────────────┘ + ↓ + ┌─────────────────┐ + │ PR 中自动发布/ │ + │ 更新评论 │ + └─────────────────┘ +``` + +## 📊 输出示例 + +### 本地运行输出 + +``` +======================================== + 文件体积对比工具 +======================================== + +本地文件: /path/to/dist/index.js +CDN 地址: https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js + +正在读取本地文件... +本地文件大小: 315.20 KB + +正在获取 CDN 文件信息... +CDN 文件大小: 315.30 KB + +---------------------------------------- +对比结果: + +本地文件比 CDN 文件小 104 B (-0.03%) +======================================== +``` + +### GitHub Actions 输出 + +在 CI 环境中,脚本会自动使用纯文本格式输出,并包含 emoji 标识: + +- ⬆️ 文件体积增加 +- ⬇️ 文件体积减少 +- ✅ 文件体积相同 + +如果体积变化超过 5%,会显示警告或祝贺信息。 + +### PR 评论示例 + +当在 PR 中触发时,会自动创建如下评论: + +``` +## 📦 Bundle Size Comparison + +======================================== + 文件体积对比工具 +======================================== + +本地文件: /home/runner/work/pinyin-pro/pinyin-pro/dist/index.js +CDN 地址: https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js + +正在读取本地文件... +本地文件大小: 315.15 KB + +正在获取 CDN 文件信息... +CDN 文件大小: 315.30 KB + +---------------------------------------- +对比结果: + +⬇️ 本地文件比 CDN 文件小 150 B (-0.05%) + +======================================== + +Updated at Fri, 17 Jan 2026 00:55:23 GMT + +--- +💡 提示: 此评论会在每次推送新提交时自动更新 +``` + +## 🔧 技术细节 + +- 自动检测 CI 环境,调整输出格式 +- 支持 HTTPS 重定向处理 +- 彩色终端输出(仅本地环境) +- GitHub Actions 注释集成 +- 自动更新 PR 评论(避免重复评论) + +## 📝 相关文件 + +- `size-compare.js` - 体积对比脚本 +- `../.github/workflows/ci.yaml` - 主 CI 工作流 +- `../.github/workflows/size-compare.yaml` - 独立的体积对比工作流 diff --git a/benchmark/size-compare.js b/benchmark/size-compare.js new file mode 100644 index 0000000..895b3bf --- /dev/null +++ b/benchmark/size-compare.js @@ -0,0 +1,175 @@ +const fs = require('fs'); +const https = require('https'); +const path = require('path'); + +// 检测是否在 CI 环境中 +const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true'; + +// ANSI 颜色代码(仅在非 CI 环境中使用) +const colors = isCI ? { + reset: '', + bright: '', + green: '', + red: '', + yellow: '', + cyan: '', +} : { + reset: '\x1b[0m', + bright: '\x1b[1m', + green: '\x1b[32m', + red: '\x1b[31m', + yellow: '\x1b[33m', + cyan: '\x1b[36m', +}; + +/** + * 格式化文件大小 + * @param {number} bytes - 字节数 + * @returns {string} 格式化后的文件大小 + */ +function formatSize(bytes) { + if (bytes < 1024) { + return bytes + ' B'; + } else if (bytes < 1024 * 1024) { + return (bytes / 1024).toFixed(2) + ' KB'; + } else { + return (bytes / (1024 * 1024)).toFixed(2) + ' MB'; + } +} + +/** + * 获取本地文件大小 + * @param {string} filePath - 文件路径 + * @returns {number} 文件大小(字节) + */ +function getLocalFileSize(filePath) { + try { + const stats = fs.statSync(filePath); + return stats.size; + } catch (error) { + console.error(`${colors.red}读取本地文件失败: ${error.message}${colors.reset}`); + return null; + } +} + +/** + * 获取 CDN 文件大小 + * @param {string} url - CDN URL + * @returns {Promise} 文件大小(字节) + */ +function getCDNFileSize(url) { + return new Promise((resolve, reject) => { + https.get(url, (response) => { + if (response.statusCode === 200) { + const contentLength = response.headers['content-length']; + if (contentLength) { + resolve(parseInt(contentLength, 10)); + } else { + // 如果没有 content-length,需要下载整个文件来计算大小 + let data = ''; + response.on('data', (chunk) => { + data += chunk; + }); + response.on('end', () => { + resolve(Buffer.byteLength(data)); + }); + } + } else if (response.statusCode === 301 || response.statusCode === 302) { + // 处理重定向 + const redirectUrl = response.headers.location; + console.log(`${colors.yellow}重定向到: ${redirectUrl}${colors.reset}`); + getCDNFileSize(redirectUrl).then(resolve).catch(reject); + } else { + reject(new Error(`HTTP 状态码: ${response.statusCode}`)); + } + }).on('error', (error) => { + reject(error); + }); + }); +} + +/** + * 比较文件大小 + */ +async function compareSizes() { + const separator = isCI ? '========================================' : `${colors.bright}${colors.cyan}========================================${colors.reset}`; + const title = isCI ? ' 文件体积对比工具' : `${colors.bright}${colors.cyan} 文件体积对比工具${colors.reset}`; + + console.log(`\n${separator}`); + console.log(title); + console.log(`${separator}\n`); + + // 本地文件路径 + const localFilePath = path.resolve(__dirname, '../dist/index.js'); + + // CDN URL + const cdnUrl = 'https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js'; + + const fileLabel = isCI ? '本地文件:' : `${colors.bright}本地文件:${colors.reset}`; + const cdnLabel = isCI ? 'CDN 地址:' : `${colors.bright}CDN 地址:${colors.reset}`; + + console.log(`${fileLabel} ${localFilePath}`); + console.log(`${cdnLabel} ${cdnUrl}\n`); + + // 获取本地文件大小 + console.log(`${colors.yellow}正在读取本地文件...${colors.reset}`); + const localSize = getLocalFileSize(localFilePath); + + if (localSize === null) { + return; + } + + console.log(`${colors.green}本地文件大小: ${formatSize(localSize)}${colors.reset}\n`); + + // 获取 CDN 文件大小 + console.log(`${colors.yellow}正在获取 CDN 文件信息...${colors.reset}`); + try { + const cdnSize = await getCDNFileSize(cdnUrl); + console.log(`${colors.green}CDN 文件大小: ${formatSize(cdnSize)}${colors.reset}\n`); + + // 计算差异 + const diff = localSize - cdnSize; + const diffPercent = ((diff / cdnSize) * 100).toFixed(2); + + const resultSeparator = isCI ? '----------------------------------------' : `${colors.bright}${colors.cyan}----------------------------------------${colors.reset}`; + const resultTitle = isCI ? '对比结果:' : `${colors.bright}对比结果:${colors.reset}`; + + console.log(resultSeparator); + console.log(`${resultTitle}\n`); + + if (diff > 0) { + const message = `本地文件比 CDN 文件大 ${formatSize(diff)} (${diffPercent > 0 ? '+' : ''}${diffPercent}%)`; + console.log(isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`); + if (isCI && Math.abs(parseFloat(diffPercent)) > 5) { + console.log(`\n⚠️ 警告: 文件体积增长超过 5%`); + } + } else if (diff < 0) { + const message = `本地文件比 CDN 文件小 ${formatSize(Math.abs(diff))} (${diffPercent}%)`; + console.log(isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`); + if (isCI && Math.abs(parseFloat(diffPercent)) > 5) { + console.log(`\n✅ 太棒了! 文件体积减少了 ${Math.abs(parseFloat(diffPercent))}%`); + } + } else { + const message = '本地文件与 CDN 文件大小相同'; + console.log(isCI ? `✅ ${message}` : `${colors.green}${message}${colors.reset}`); + } + + console.log(`\n${separator}\n`); + + // 在 CI 环境中输出 GitHub Actions 的注释 + if (isCI && process.env.GITHUB_ACTIONS === 'true') { + const emoji = diff > 0 ? '📈' : diff < 0 ? '📉' : '✅'; + const changeText = diff === 0 ? '无变化' : + diff > 0 ? `增加 ${formatSize(diff)} (+${diffPercent}%)` : + `减少 ${formatSize(Math.abs(diff))} (${diffPercent}%)`; + + console.log(`::notice title=Bundle Size ${emoji}::${changeText} - Local: ${formatSize(localSize)}, CDN: ${formatSize(cdnSize)}`); + } + } catch (error) { + console.error(`${colors.red}获取 CDN 文件失败: ${error.message}${colors.reset}`); + process.exit(1); + } +} + +// 执行比较 +compareSizes(); diff --git a/package.json b/package.json index eab4826..06e901b 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "scripts": { "test": "vitest run --coverage", "build": "rollup -c && rollup -c rollup.esm.config.js", + "build:compare": "npm run build && node benchmark/size-compare.js", + "size:compare": "node benchmark/size-compare.js", "commit": "git-cz", "lint": "eslint ." }, From 2af5573bcac59a2a36fcb0d49966d5427678e664 Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 10:30:08 +0800 Subject: [PATCH 2/6] feat: add comprehensive CDN vs Local comparison workflow - Add unified comparison script combining size, accuracy, and speed tests - Integrate automated GitHub Actions workflow for PR comparisons - Auto-update PR comments with complete comparison results - Simplify npm scripts to single 'compare' command Co-Authored-By: Claude Sonnet 4.5 --- .github/PULL_REQUEST_TEMPLATE.md | 11 - .github/workflows/ci.yaml | 3 - .../{size-compare.yaml => compare.yaml} | 40 +- benchmark/QUICKREF.md | 62 - benchmark/README.md | 145 --- benchmark/compare.js | 1054 +++++++++++++++++ benchmark/size-compare.js | 175 --- package.json | 4 +- 8 files changed, 1074 insertions(+), 420 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md rename .github/workflows/{size-compare.yaml => compare.yaml} (64%) delete mode 100644 benchmark/QUICKREF.md delete mode 100644 benchmark/README.md create mode 100644 benchmark/compare.js delete mode 100644 benchmark/size-compare.js diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 6cab9ed..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -## PR 的功能 - -_请详细描述问题,或者贴一个 issue 链接_ - -## 你的预期是什么 - -_请详细描述,你修改代码之后的样子_ - -## 是否进行了详细的自测? - -_是/否_ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0f54f6d..fe20404 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,9 +22,6 @@ jobs: - name: Build run: npm run build - - name: Compare bundle size with CDN - run: npm run size:compare - - name: Run tests with coverage run: npm run test diff --git a/.github/workflows/size-compare.yaml b/.github/workflows/compare.yaml similarity index 64% rename from .github/workflows/size-compare.yaml rename to .github/workflows/compare.yaml index 8d01676..e049afc 100644 --- a/.github/workflows/size-compare.yaml +++ b/.github/workflows/compare.yaml @@ -29,22 +29,24 @@ jobs: - name: Build run: npm run build - - name: Run size comparison - id: size-compare + - name: Run comparison (size, accuracy & speed) + id: compare run: | - echo "SIZE_OUTPUT<> $GITHUB_OUTPUT - npm run size:compare 2>&1 | tee -a $GITHUB_OUTPUT + echo "COMPARE_OUTPUT<> $GITHUB_OUTPUT + npm run compare 2>&1 | tee -a $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT continue-on-error: false - - name: Comment PR with size comparison + - name: Comment PR with comparison results if: github.event_name == 'pull_request' + env: + COMPARE_OUTPUT: ${{ steps.compare.outputs.COMPARE_OUTPUT }} uses: actions/github-script@v7 with: script: | - const output = `${{ steps.size-compare.outputs.SIZE_OUTPUT }}`; + const compareOutput = process.env.COMPARE_OUTPUT; - // 查找是否已有体积对比评论 + // 查找是否已有对比评论 const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, @@ -53,19 +55,13 @@ jobs: const botComment = comments.find(comment => comment.user.type === 'Bot' && - comment.body.includes('📦 Bundle Size Comparison') + comment.body.includes('📦 CDN vs Local 完整对比') ); - const body = `## 📦 Bundle Size Comparison - -\`\`\` -${output} -\`\`\` - -_Updated at ${new Date().toUTCString()}_ - ---- -💡 **提示**: 此评论会在每次推送新提交时自动更新`; + const timestamp = new Date().toUTCString(); + const body = '## 📦 CDN vs Local 完整对比\n\n```\n' + + compareOutput + + '\n```\n\n_Updated at ' + timestamp + '_\n\n---\n💡 **提示**: 此评论会在每次推送新提交时自动更新'; if (botComment) { // 更新现有评论 @@ -75,7 +71,7 @@ _Updated at ${new Date().toUTCString()}_ comment_id: botComment.id, body: body }); - console.log('✅ 已更新体积对比评论'); + console.log('✅ 已更新对比评论'); } else { // 创建新评论 await github.rest.issues.createComment({ @@ -84,9 +80,9 @@ _Updated at ${new Date().toUTCString()}_ issue_number: context.issue.number, body: body }); - console.log('✅ 已创建体积对比评论'); + console.log('✅ 已创建对比评论'); } - - name: Display size comparison in logs + - name: Display comparison in logs if: github.event_name == 'push' - run: npm run size:compare + run: npm run compare diff --git a/benchmark/QUICKREF.md b/benchmark/QUICKREF.md deleted file mode 100644 index 7608094..0000000 --- a/benchmark/QUICKREF.md +++ /dev/null @@ -1,62 +0,0 @@ -# 快速参考 - -## 触发条件 - -### ✅ 会触发体积对比的操作 - -1. **创建 PR** 到 main 分支 - ```bash - git checkout -b feature/my-feature - # 进行修改... - git push origin feature/my-feature - # 然后在 GitHub 上创建 PR - ``` - -2. **更新已有 PR** (推送新提交) - ```bash - git commit -m "更新功能" - git push origin feature/my-feature - ``` - -3. **重新打开已关闭的 PR** - -4. **直接推送到 main 分支** - ```bash - git push origin main - ``` - -### 🔍 查看结果 - -- **Pull Request**: 在 PR 的评论区查看自动发布的体积对比评论 -- **Push to main**: 在 Actions 标签页 → "Bundle Size Comparison" 工作流日志中查看 - -## 本地测试 - -在提交 PR 前,可以本地运行体积对比: - -```bash -# 完整流程:打包 + 对比 -npm run build:compare - -# 仅对比(需要先打包) -npm run size:compare -``` - -## 工作流文件 - -- `.github/workflows/size-compare.yaml` - 独立的体积对比工作流 -- `.github/workflows/ci.yaml` - 主 CI 工作流(包含体积对比步骤) - -## 常见问题 - -**Q: 为什么我的 PR 没有看到体积对比评论?** -A: 检查 GitHub Actions 是否成功运行,确保仓库有 `pull-requests: write` 权限。 - -**Q: 如何修改体积变化警告阈值?** -A: 编辑 `benchmark/size-compare.js` 中的第 127 和 133 行,将 `5` 改为你想要的百分比。 - -**Q: 评论会重复创建吗?** -A: 不会,工作流会智能检测已有评论并更新,而不是创建新评论。 - -**Q: 可以对比其他文件吗?** -A: 可以,修改 `benchmark/size-compare.js` 中的 `localFilePath` 和 `cdnUrl` 变量。 diff --git a/benchmark/README.md b/benchmark/README.md deleted file mode 100644 index 4fa3c96..0000000 --- a/benchmark/README.md +++ /dev/null @@ -1,145 +0,0 @@ -# Bundle Size Comparison - -这个目录包含用于对比打包文件体积的工具。 - -## 📦 功能说明 - -`size-compare.js` 脚本可以自动对比本地打包后的 `dist/index.js` 文件与 CDN 上已发布版本的体积差异。 - -## 🚀 使用方法 - -### 本地运行 - -```bash -# 仅运行体积对比(需要先手动打包) -npm run size:compare - -# 打包后自动进行体积对比 -npm run build:compare -``` - -### 自动化运行 - -GitHub Actions 会在以下情况自动运行体积对比: - -#### Pull Request 触发 -当向 `main` 分支创建或更新 PR 时,会自动触发体积对比: -- **PR 创建时** (`opened`) -- **PR 更新时** (`synchronize`) - 推送新提交 -- **PR 重新打开时** (`reopened`) - -对比结果会自动作为评论发布到 PR 中,并在每次推送新提交时自动更新该评论。 - -#### Push 触发 -当代码直接推送到 `main` 分支时,体积对比结果会显示在 GitHub Actions 的运行日志中。 - -#### 工作流程 - -``` -创建/更新 PR to main - ↓ -触发 GitHub Actions - ↓ -安装依赖 (npm install) - ↓ -构建项目 (npm run build) - ↓ -运行体积对比 (npm run size:compare) - ↓ - ┌────────────────────┐ - │ 对比本地 dist/ │ - │ vs CDN 文件 │ - └────────────────────┘ - ↓ - ┌────────────────────┐ - │ 计算体积差异 │ - │ 和百分比变化 │ - └────────────────────┘ - ↓ - ┌─────────────────┐ - │ PR 中自动发布/ │ - │ 更新评论 │ - └─────────────────┘ -``` - -## 📊 输出示例 - -### 本地运行输出 - -``` -======================================== - 文件体积对比工具 -======================================== - -本地文件: /path/to/dist/index.js -CDN 地址: https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js - -正在读取本地文件... -本地文件大小: 315.20 KB - -正在获取 CDN 文件信息... -CDN 文件大小: 315.30 KB - ----------------------------------------- -对比结果: - -本地文件比 CDN 文件小 104 B (-0.03%) -======================================== -``` - -### GitHub Actions 输出 - -在 CI 环境中,脚本会自动使用纯文本格式输出,并包含 emoji 标识: - -- ⬆️ 文件体积增加 -- ⬇️ 文件体积减少 -- ✅ 文件体积相同 - -如果体积变化超过 5%,会显示警告或祝贺信息。 - -### PR 评论示例 - -当在 PR 中触发时,会自动创建如下评论: - -``` -## 📦 Bundle Size Comparison - -======================================== - 文件体积对比工具 -======================================== - -本地文件: /home/runner/work/pinyin-pro/pinyin-pro/dist/index.js -CDN 地址: https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js - -正在读取本地文件... -本地文件大小: 315.15 KB - -正在获取 CDN 文件信息... -CDN 文件大小: 315.30 KB - ----------------------------------------- -对比结果: - -⬇️ 本地文件比 CDN 文件小 150 B (-0.05%) - -======================================== - -Updated at Fri, 17 Jan 2026 00:55:23 GMT - ---- -💡 提示: 此评论会在每次推送新提交时自动更新 -``` - -## 🔧 技术细节 - -- 自动检测 CI 环境,调整输出格式 -- 支持 HTTPS 重定向处理 -- 彩色终端输出(仅本地环境) -- GitHub Actions 注释集成 -- 自动更新 PR 评论(避免重复评论) - -## 📝 相关文件 - -- `size-compare.js` - 体积对比脚本 -- `../.github/workflows/ci.yaml` - 主 CI 工作流 -- `../.github/workflows/size-compare.yaml` - 独立的体积对比工作流 diff --git a/benchmark/compare.js b/benchmark/compare.js new file mode 100644 index 0000000..75b22a3 --- /dev/null +++ b/benchmark/compare.js @@ -0,0 +1,1054 @@ +const fs = require("fs"); +const https = require("https"); +const path = require("path"); + +// 检测是否在 CI 环境中 +const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true"; + +// ANSI 颜色代码(仅在非 CI 环境中使用) +const colors = isCI + ? { + reset: "", + bright: "", + green: "", + red: "", + yellow: "", + cyan: "", + blue: "", + } + : { + reset: "\x1b[0m", + bright: "\x1b[1m", + green: "\x1b[32m", + red: "\x1b[31m", + yellow: "\x1b[33m", + cyan: "\x1b[36m", + blue: "\x1b[34m", + }; + +// 测试文本(使用 accuracy.js 中的部分文本) +const testText = ` +序 +  流亡在大西洋上的盖纳西岛,一八六一年六月三十日上午八时半,维克多·雨果,法兰西一代文豪,完成了他的长篇小说《悲惨世界》。 +  这是一轴辉煌的画卷。画幅的卷首可上溯到卞福汝主教经历的一七九三年大革命高潮的年代,卷末直延伸到马吕斯所参加的一八三二年巴黎人民起义。在这里,整整将近半个世纪历史过程中广阔的社会生活画面,都一一展现了出来:外省偏僻的小城,滨海的新兴工业城镇,可怕的法庭,黑暗的监狱,巴黎悲惨的贫民窟,阴暗的修道院,恐怖的坟场,郊区寒怆的客店,保王派的沙龙,资产阶级的家庭,大学生聚集的拉丁区,惨厉绝伦的滑铁卢战场,战火纷飞的街垒,藏污纳垢的下水道……这一漫长浩大的画轴中每一个场景,无不栩栩如生,其细部也真切入微,而画幅的形象又是那么鲜明突出,色彩是那么浓重瑰丽,气势是那么磅礴浩大,堪称文学史上现实主义与浪漫主义结合的典范。 +  小说中的画面描绘,远远超出了表现历史背景与叙述人物故事经历的需要,雨果有意识要为后世留下史笔,他所描绘的这个世纪两大历史事件滑铁卢战役与一八三二年巴黎起义,就是极为辉煌的两例。更主要的是,他要在小说里写出“本世纪”的历史之流迂回曲折、起伏跌宕的巨变,并且在全部历史景象与过程的中心,安置一个触目惊心的社会现实,即下层人民悲惨的命运。在他看来,大革命后的半个世纪的不同阶段,下层人民的处境同样都悲惨艰难,并无变化,他以冉阿让、芳汀与珂赛特的故事说明了这一点。他在小说的序里就指出了“本世纪”的三个问题:“贫穷使男子潦倒,饥饿使妇女堕落,黑暗使儿童羸弱”。因此,可以说,作者要绘制的就是那个时代中穷人悲惨生活的画卷。 +  这是一部雄浑的史诗,是一个人的史诗,但又不限于个人的意义。主人公冉阿让的经历具有明显的奥德修斯式的传奇性,他一生的道路是那么坎坷,他所遇到的厄运与磨难是那么严峻良知良能孟子用语。良知,先天具有的道德善性和认识,他的生活中充满了那么多惊险,所有这一切都不下于古代史诗《奥德修记》中主人公的历险。与奥德修斯的史诗不同的是,冉阿让的史诗主要是以他向资产阶级社会强加在他头上的迫害、向不断威胁他的资产阶级法律作斗争为内容的。正因为冉阿让要对付的是庞大的压在头上的社会机器与编织得非常严密的法律之网,雨果要使这个人物的斗争史诗能够进行下去,就必须赋予他以惊人的刚毅、非凡的体力、罕见的勇敢机智。冉阿让得到了所有这一切,他近乎神奇的本领使他一次又一次战胜了对他的迫害。不仅如此,他还被作者赋予现代文明社会的活动能力,他从事工业,有所发明创造,一度成为了一个治理有方、改变了一个小城整个面貌的行政长官。雨果笔下的这个人物几乎具有了各种非凡的活力,他是一个浪漫主义色彩浓厚的传奇性的主人公。 +  这个人物的浪漫主义色彩,更重要是表现在他的道德精神方面,他的精神历程也象史诗一样可歌可泣。他本是一个本性善良的劳动者,社会的残害、法律的惩罚、现实的冷酷使他“逐渐成了猛兽”,盲目向社会进行报复,以致犯下了真正使他终身悔恨的错事,而这种悔恨却又导致一种更深刻的觉悟,成为他精神发展的起点,促使他的精神人格上升到了崇高的境界。正象他在传奇般的经历中要克服现实生活中的种种险阻一样,他在精神历程中也要绕过、战胜种种为我的利己主义的暗礁,才能达到他那种不平凡的精神高度,才能有他那种种舍己为人、自我牺牲的义举,而且,这种暗礁往往比现实生活中的险阻更难于超越,需要有更大的勇气与坚毅。 +  冉阿让并不是一个抽象的人。从出身、经历、品德、习性各方面来说,他都是一个劳动者。他体现了劳动人民各种优秀的品质,他是被压迫、被损害、被侮辱的劳苦人民的代表。他的全部经历与命运,都具有一种崇高的悲怆性,这种有社会代表意义的悲怆性,使得《悲惨世界》成为劳苦大众在黑暗社会里挣扎与奋斗的悲怆的史诗。 +  这是一种浩博精神的结晶,人道主义精神的结晶。 +  雨果不是出身于劳动人民,是什么思想促使他去写这样一部讲述下层人民苦难的巨著、用小说全部的形象力量来提出劳苦人民的悲怆命运问题?这就是人道主义的思想。 +  一八○一年,一个名叫彼埃尔·莫的贫苦农民,因为偷了一块面包就被判处了五年劳役,出狱后又在就业中屡遭拒绝。这件事引起了雨果的同情,使他产生了写《悲惨世界》的意图。他把这个事件作为小说主人公冉阿让的故事蓝本,并让冉阿让终生遭到法律的迫害,以此构成小说的主要线索与内容,此外,他又以芳汀、珂赛特、商马第等其他社会下层人物的不幸与苦难作为补充,在小说里倾注了他真诚的人道主义同情。他这种同情无处不在,无处不有,它是那么渗透弥漫在整个悲惨世界里,似乎包容了一切,不能不使人有一种浩博之感。 +  这种人道主义同情还推动雨果进行尖锐的社会批判。他把下层人民的苦难,明确归之于“法律和习俗所造成的社会压迫”,他整部小说的目的,就在于揭露这种压迫如何“人为地把人间变成地狱,并且使人类与生俱来的幸运遭受不可避免的灾祸”。在《悲惨世界》里,与对劳动人民深切的同情同时并存、水乳交融的是,作者对黑暗的社会现实的强烈抗议。在这里,雨果的人道主义思想,不仅是他同情劳动人民的出发点,也是他进行社会批判的一种尺度。 +  不仅如此,雨果还把人道主义的感化力量视为改造人性与社会的手段,小说中的卞福汝主教与后来的冉阿让就体现了他的这一思想。卞福汝是小说中一个理想的人道主义的形象,冉阿让后来也是大慈大悲的化身,他们身上不仅有无穷无尽的人道主义爱心,而且他们这种爱,还能感化凶残的匪帮,甚至统治阶级的鹰犬,并在悲惨世界里创建了滨海蒙特勒伊这样一块穷人的福地,真正的“世外桃源”。于是,人道主义的仁爱在小说里就成为了一种千灵万验、无坚不摧的神奇力量,这种近乎童话的描写,倒正是雨果天真幻想的流露,是他的一种局限。 +  这是高昂的民主主义激情的体现。谁都会注意到小说中对一八三二年人民革命运动与起义斗争的出色描写与热情歌颂。在整个西方文学中,我们还没有见过有什么作品象《悲惨世界》这样,对一次革命起义作过如此正面的、完整的,如此规模宏大,如此热情奔放的描述,其画面都是以壮丽的色彩、细致的笔法绘制出来的,具有德拉克洛瓦的《自由女神引导着人民》那种辉煌的风格。作品的这一举足轻重的部分,无疑给《悲惨世界》定下了革命民主主义的基调,其中的民主主义革命思想观点,事实上也突破了人道主义的框架,弥补了作品的天真幻想的一面。 +  雨果的革命民主主义激情,还鲜明地表现为对起义民众、革命人民的热情礼赞。在他的笔下,疲惫不堪、衣衫褴褛、遍体创伤、为正义事业而斗争的人们,是一个伟大的整体与象征:人民的象征。正是这一个伟大的群体,创造了一个又一个历史奇迹,推动着法国社会向前发展。雨果特别在这一伟大的整体中,突出了安灼拉、马白夫与伽弗洛什这三个英雄人物。安灼拉是坚强的共和主义者,街垒起义的组织者领导人,雨果以雅各宾专政时期的革命家圣鞠斯特为蓝本塑造了这个人物,用饱满的笔墨使他成为了十九世纪文学中一个难得的革命领袖的正面形象。马白夫老爹是巴黎普通人民,起义的基本群众,他最后用自己的生命保卫了革命红旗这一悲壮的场面,雨果是以庄严的颂歌的笔调写出来的,并对此发出了热情的礼赞。伽弗洛什,这个巴黎流浪儿童的典型,是法国文学中最生动、最有魅力的艺术形象之一,他身上凝聚着法国人民那种开朗乐天、轻松幽默的性格,还保持了儿童的天真与纯洁,他善良、慷慨,酷爱自由,在起义斗争中勇敢机智,直到最后壮烈牺牲,仍唱着幽默顽皮的歌曲。这三个人物是雨果心目中革命人民的象征,他塑造出他们的高大身躯,正是出于歌颂人民这一伟大群体的热情。 +  这就是《悲惨世界》的四种素质、四个方面。就《悲惨世界》在内容上的丰富、深广与复杂而言,它无疑在雨果数量众多的文学作品中居于首位,即使是在十九世纪文学中,也只有巴尔扎克的巨著《人间喜剧》的整体可与之比美。对于它厚实的艺术容积,也许只有借助巨大的森林、辽阔的海洋这一类比喻,才能提供一个总体的概念。 +  《悲惨世界》问世以来,已有一个多世纪,它在时间之流的大海上傲然挺立,它是不同时代、不同国度的千千万万人民,不断造访的一块艺术胜地,而且将永远是人类文学中一块不朽的胜地。 +                             柳 鸣 九 + + + 作者序 + + 如果由法律、习俗构成的社会迫害依然存在,在文明高峰期里,人为地变人间为地狱,并让人类天赋幸福蒙受无妄之灾;如果本世纪的三大难题——使男人昏庸的贫穷,使妇女堕落的饥饿,使儿童孱弱的黑暗——尚未解决;如果社会毒害在一些地方仍会发生,换言之,同时也是就更广泛的意义而言,如果仍有蒙昧、贫苦存在于这个世界,则与本书性质相同的著述,都不会是没有益处的。 + 一八六二年一月一日于奥特维尔别居 + + 悲惨世界 + 第一部芳汀第一卷一个正直者 + 一 米里哀先生 + 一八一五年,迪涅①的主教是查理·佛朗沙·卞福汝·米里哀先生。他是个七十五岁左右的老人;从一八○六年起,开始担任迪涅区主教之职。 + 虽然这些小事同我们将要叙述的故事的主题无关,但为了全面精确起见,在此提一提在他就任之初,人们所传播的有关他的一些风言风语也并非多余。大众关于某些人的传说,无论是真是假,在他们的生活中,尤其是在他们的命运中所占的地位,往往和他们自己所作的事是同等重要的。米里哀先生是艾克斯法院一个参议的儿子,就是所谓司法界的贵族。据说他的父亲因为要他继承②此职,很早就按照司法界贵族家庭间相当普遍的习惯,在他十八岁或二十岁,为他完了婚。米里哀先生虽已结婚,据说仍常常惹起别人的议论。他品貌不俗,虽然身材颇小,但是生得俊秀,风度翩翩,谈吐隽逸;他一生的最初阶段完全消磨在交际场所和与妇女们的厮混中。革命③爆发了,事变交替,司法界贵族家庭因受到摧毁、驱逐、迫捕而东奔西散了。当革命刚开始时,米里哀先生便逃亡到意大利。他的妻子因害肺病,早已死了。他们一个孩子也没有。此后,他的一生有些什么遭遇呢?法国旧社会的崩溃,他自己家庭的败落,对于一般流亡者可能因远道传闻和恐怖的夸大而显得更加可怕的一七九三 年①的种种悲剧,是否使他在思想上产生过消沉和孤独的感受呢?一个人在生活中或财产上蒙受劫难还可能不为所动,但有时一种神秘可怕的打击,打在人的心上,却能使人一蹶不振;一向在欢乐和温情中度日的他,是否受过那种突如其来的打击呢?没有谁说过,我们所知道的只是:他从意大利回来,已经成了教士。 + 一八○四年,米里哀先生是白里尼奥的本堂神甫。这时他已经老了,过着足不出户的生活。临近加冕②时,他为了本区的一件不太清楚的小事,到巴黎去过一趟。他代表他教区的信众们向上面作了陈述、请求,曾夹在一群显贵中去见过红衣主教费什。一天,皇帝来看他的舅父③,这位尊贵的本堂神甫正在前厅候见,皇上也恰巧走过。拿破仑看见这位老人用一双好奇的眼睛瞧着他,便转过身来,突然问道:“瞧着我的那人是谁?” + “陛下,”米里哀先生说,“您看着一个汉子,我看着一个天子。彼此都不亏欠。” + 皇帝在当天晚上向红衣主教问明了这位本堂神甫的姓名。不久以①迪涅(Digne)在法国南部,为下阿尔卑斯省的省会名称。 + ②那时法院的官职是可以买的,并可传给子孙后代。 + ③指一七八九年法国资产阶级革命。 + ①一七九三年是革命达到高潮的那年。 + ②拿破仑于一八○四年三月十八日称帝,十二月二日加冕。 + ③指费什。 + 后,米里哀先生非常荣幸地得到被任为迪涅主教的消息。此外,人们对米里哀先生初期生活所传说的轶事,哪些是真实的?谁也不知道。很少人知道米里哀这家人在革命以前的情况。任何人初到一个嘴杂、欠缺头脑的小城里总有够他受的,米里哀先生也不例外。即便他是主教,也正因为他是主教,他就得受。总之,与他有关的议论,也许只是一些闲谈而已,内容不外是些传闻,有时甚至连捕风捉影也说不上,照南方人那种强烈的话来说,只是“胡扯”而已。 + 不管怎样,他在迪涅担任教职九年以后,当初成为那些小地方人谈话题材的闲话,都完全被丢在脑后了。没有谁再敢提到,甚至没有谁再敢想起那些闲话了。 + 米里哀先生到迪涅时有个老姑娘伴着他,这老姑娘便是比他小十岁的妹妹巴狄斯丁姑娘。 + 他们的佣人只是一个和巴狄斯丁姑娘同年的女仆,名叫马格洛大娘,现在,她在做了“司锋先生的女仆”后,取得了这样一个双重头衔:姑娘的女仆和主教的管家。 + 巴狄斯丁姑娘是个身材瘦长、面貌清癯、性情温厚的人儿,她体现了“可敬”两个字所表达的理想,因为一个妇人如果要达到“可敬”的地步,似乎总得先做母亲。她从不曾有过美丽的时期,她的一生只是一 连串圣洁的工作,这就使她的身体呈现白色和光彩;将近老年时,她具有我们所谓的那种“慈祥之美”。她青年时期的消瘦到她半老时,转成了一种清虚疏朗的神韵,令人想象她是一个天使。她简直是个神人,处女当之也有所逊色。她的身躯,好象是阴影做成的,几乎没有足以显示性别的实体,只是些许透着微光的物质,秀长的眼睛老低垂着,我们可以说她是寄存在人间的天女。 + 马格洛大娘是个矮老、白胖、臃肿、忙碌不定、终日气喘吁吁的妇人,一是因为她做事勤劳,二是因为她有气喘玻米里哀先生到任以后,人们依照将主教列在仅次于元帅地位的律令所规定的仪节,把他安顿在主教院里。市长和议长向他作了初访,而他,也向将军和省长作了初访。安排完毕,全城静候主教执行使命。 + 二 改称卞福汝主教的米里哀先生 + 迪涅的主教院紧挨着医院。主教院是座广阔壮丽、石料建成的大厦,是巴黎大学神学博士、西摩尔修院院长,一七一二年的迪涅主教亨利·彼惹在前世纪初兴建的。那确是一座华贵的宅院。其中一切都豪华气派,主教的私宅,大小客厅,各种房间,相当宽敞的院子,具有佛罗伦萨古代风格的穹窿的回廓,树木苍翠的园子。楼下朝花园的一面,有间富丽堂皇的游廊式的长厅,一 七一四年七月二十九日,主教亨利·彼惹曾在那餐厅里公宴过这些要人:昂布伦亲王——大主教查理·勃吕拉·德·让利斯;嘉布遣会修士——格拉斯主教安东尼·德·梅吉尼;法兰西祈祷大师——雷兰群岛圣奥诺雷修院院长菲力浦·德·旺多姆;梵斯男爵——主教佛朗沙·德·白东·德·格利翁;格朗代夫贵人——主教凯撒·德·沙白朗·德·福高尔吉尔;经堂神甫——御前普通宣道士——塞内士贵人——主教让·沙阿兰。 + 这七个德高望重的人物画像一直装点着那间长厅,“一七一四年七 月二十九日”这个值得纪念的日子,也用金字刻在厅里的一张白大理石碑上。 + 而医院却是一所狭窄低陋的房子,只有一层楼,带个小小花园。 + 到任三天以后,主教参观了医院。参观完毕,他恭请那位院长到他家里去。 + “院长先生,”他说,“您现在有多少病人?” + “二十六个,我的主教。”“正和我数过的一样。”主教说。 + “那些病床,”院长又说,“彼此靠得太近了,一张挤着一张的。” + “我已经注意到了。” + “那些病房太小了,里面的空气很难流通。” + “那正是我感觉到的。” + “并且,即使是在有一线阳光的时候,那园子对刚刚起床的病人们也太小了。” + “我已经看到了。” + “传染病方面,今年我们有过伤寒,两年前,有过疹子,有时多到百来个病人,我们真不知道怎么办。” + “那正是我所想到的。” + “有什么办法呢,我的主教?”院长说,“我们总得将就些。”那次谈话正是在楼下那间游廊式的餐厅里进行的。 + 主教沉默了一会突然转向院长。 + “先生,”他说,“您认为,就拿这个厅来说,可以容纳多少床位?” + “主教的餐厅!”惊惶失措的院长喊了起来。主教向厅四周望了望,象是在用眼睛测算。 + “此地足够容纳二十张病床!”他自言自语地说,随着又提高嗓子,“瞧,院长先生,我告诉您,这里显然有了错误。你们二十六个人住在五六间小屋子里,而我们这儿三个人,却有六十个人的地方。这是不对的,我告诉您。您来住我的房子,我去住您的。您把我的房子还我。这儿是您的家。” + 第二天,那二十六个穷人便安居在主教的府上,主教却住在医院里。米里哀先生绝没有财产,因为他的家已在革命时期破落了。他的妹妹每年领着五百法郎的养老金,刚够她个人住在神甫家里的费用。米里哀先生以主教身份从政府领得一万五千法郎的薪俸。在他搬到医院的房子里去住的那天,米里哀先生就一次作出决定,把那笔款分作以下各项用途。我们把他亲手写的一张单子抄在下面。 + 我的家用分配 + 单教士培养所津贴一千五百利弗传教会津贴一百利弗孟迪第圣拉撒会修士们津贴一百利弗巴黎外方传教会津贴二百利弗圣灵会津贴一百五十利弗圣地宗教团体津贴一百利弗各慈幼会津贴三百利弗阿尔勒慈幼会补助费五十利弗改善监狱用费四百利弗囚犯抚慰及救济事业费五百利弗赎免因债入狱的家长费一千利弗补助本教区学校贫寒教师津贴二千利弗捐助上阿尔卑斯省义仓一百利弗迪涅,玛诺斯克,锡斯特龙等地妇女联合会,贫寒女孩的义务教育费一千五百利弗穷人救济费六千利弗本人用费一千利弗共计一万五千利弗米里哀先生在他当迪涅主教期间,几乎没有改变过这种分配方式。我们知道,他把这称作“分配了他的家用”。这种分配是被巴狄斯丁姑娘以绝对服从的态度所接受。对那位圣女来说,米里哀先生是她的哥哥,同时也是她的主教,是人世间的朋友和宗教中的上司。她爱他,并且极其单纯地敬服他。当他说话时,她俯首恭听;当他行动时,她追随伺候。只有那位女仆马格洛大娘,稍微有些啰嗦。我们已经知道,主教只为自己留下一千利弗,和巴狄斯丁姑娘的养老金合并起来,每年才一千五百法郎。两个老妇人和老头儿都靠那一千五百法郎过活。 + 当镇上有教士来到迪涅时,主教先生还有办法招待他们。那是由于马格洛大娘的极其节俭和巴狄斯丁姑娘的精打细算。 + 到迪涅约三个月的一天,主教说: + “这样下去,我真有些维持不了!” + “当然罗!”马格洛大娘说。“主教大人连省里应给的那笔城区车马费和教区巡视费都没有要来。对从前的那几位主教,原是照例有的。” + “对!”主教说。“您说得对,马格洛大娘。” + ①利弗(livre),当时的一种币制,相当于一法郎。 + 他提出了申请。过了些时候,省务委员会审查了那申请,决定每年给他一笔三千法郎的款子,名义是“主教先生的轿车、邮车和教务巡视津贴。”这件事使当地的士绅们喧哗起来。为这件事,一个帝国元老院①的元老,从前当过五百人院②的元老,曾经赞助雾月十八日政变③,住在迪涅城附近一座富丽堂皇的元老宅邸里,写了一封怨气冲天的密函给宗教大臣皮戈·德·普雷阿麦内先生。我们现在把它的原文节录下来:“轿车津贴?在一个人口不到四千的城里,有什么用处?邮车和巡视津贴?首先要问这种巡视有什么好处,其次,在这样的山区,怎样走邮车?路都没有。只能骑着马走。从迪朗斯到阿尔努堡的那座桥也只能够走小牛车。所有的神甫全一样,又贪又吝。这一个在到任之初,还象个善良的宗教徒,现在却和其他人一样了,他非坐轿车和邮车不行了,他非享受从前那些主教所享受的奢侈品不可了。咳!这些臭神甫!伯爵先生,如果皇上不替我们肃清这些吃教的坏蛋,一切事都好不了。打倒教皇!(当时正和罗马①发生磨擦。)至于我,我只拥护恺撒!”另一边,这件事却使马格洛大娘非常欣慰。 + “好极了!”她对巴狄斯丁姑娘说。“主教开始只顾别人,现在也非顾自己不可了。他已把他的慈善捐分配停当,这三千法郎总算是我们的了。” + 当天晚上,主教写了这样一张单子交给他的妹妹。 + 车马费及巡视津贴供给住院病人肉汤的津贴一千五百利弗艾克斯慈幼会的津贴二百五十利弗德拉吉尼昂慈幼会的津贴二百五十利弗救济被遗弃的孩子五百利弗救济孤儿五百利弗共计三千利弗以上就是米里哀先生的预算表。至于主教的额外开支,以及请求提早婚礼费、特许开斋费、婴孩死前洗礼费、宣教费、为教堂或私立小堂祝圣费、行结婚典礼费等等,这位主教都到有钱人身上去取来给穷人;取得快也给得快。过了不久,各方捐赠的钱财源源而来。富人和穷人都来敲米里哀先生的门,后者来请求前者所留下的捐赠。不到一年功夫,主教便成了一 切慈善捐的保管人和苦难的援助者。大笔大笔的款项都经过他的手,但没有任何东西能稍许改变他的生活方式,或使他在他所必需的用品以外①指拿破仑帝国的元老院,由二十四人组成,为终身任期制。 + ②一七九五年十月,新兴资产阶级的热月党,根据自己制定的新宪法,由资产者投票选举,成立了元老院(上院)和五百人院(下院)。 + ③法兰西共和国八年雾月十八日(一七九九年十一月九日),拿破仑发动政变,开始了独裁统治。 + ①教皇庇护七世于一八○四年到巴黎给拿破仑加冕,后被拘禁在法国。 + 增添一点多余的东西。不但如此,由于社会上层的博爱总敌不过下层的穷苦,我们可以说,所有的钱都早已在收入以前付出了,正象旱地上的水;他白白地收进一 些钱,却永远没有余款;于是他从自己身上搜刮起来。 + 主教们习惯把自己的教名全部写在他们的布告和公函头上。当地的穷人,由于一种本能的爱戴,在这位主教的几个名字中,挑选了对他们最有意义的一个,称他为卞福汝①主教。我们也将随时照样用那名字称呼他。他对这个称呼很满意。 + “我喜欢这名称,”他说,“卞福汝胜过主教大人。”我们并不认为在此地所刻画的形象是逼真的,我们只说它近似而已。 + ①卞福汝(Bienvenu)是“欢迎”的意思。 + 三 好主教遇到个穷教区 + 主教先生并不因为他的马车变成了救济款而减少他的巡视。迪涅教区是个苦地方。平原少,山地多,我们刚才已经提到。三十二个司铎区,四十一个监教区,二百八十五个分区。巡视它们很难,这位主教先生却能完成任务。如果近,他就步行;在平原,坐小马车;在山里,就乘骡兜。那两个上了年纪的妇人还陪着他。如果路程对她们太辛苦,他便一 个人去。 + 一天,他骑着一头毛驴,走到塞内士,那是座古老的主教城。当时他囊空如洗,不可能有别的坐骑。地方长官来到主教公馆门口迎接他,瞧见他从驴背上下来,觉得有失体统。另外几个士绅也围着他笑。 + “长官先生和各位先生,”主教说,“我知道什么事使你们感到丢人,你们一定认为一个贫苦的牧师跨着耶稣基督的坐骑未免妄自尊大。老实说,我这样做是不得已,并非出自虚荣。” + 他是谦虚和蔼的,在巡视工作中,闲谈居多,说教很少。他从不把品德问题提到高不可攀的地步,也从不向远处去找他的论据和范例。对某一乡的居民,他常叙说邻乡的榜样。在那些对待穷人刻薄的镇上,他说:“你们瞧瞧布里昂松地方的人吧。他们给了穷人,寡妇和孤儿一种特权,使他们可以比旁人早三天割他们草场上的草料。如果他们的房屋要坍了,就会有人替他们重盖,不要工资。这也可算得上是上帝庇佑的地方了。在整整一百年中,从没一个人犯过凶杀案。” + 在那些斤斤计较利润和收获物的村子里,他说:“你们瞧瞧昂布伦地方的人吧。万一有个家长在收割时,因儿子都在服兵役,女孩也在城里工作,而自己又生病不能劳动,本堂神甫就把他的困难在宣道时提出来,等到礼拜日,公祷完毕,村里所有的人,男女老幼都到那感到困难的人的田里,去替他收割,并且替他把麦秸和麦粒搬进仓。”对那些因银钱和遗产问题而分裂的家庭,他说:“你们瞧瞧德福宜山区的人吧。那是一片非常荒凉的地方,五十年也听不到一次黄莺的歌声。可是,当有一家的父亲死了,他的儿子便各自出外谋生,把家产留给姑娘们,好让她们找得到丈夫。”在那些争讼成风,农民每因告状而倾家荡产的镇上,他说:“你们看看格拉谷的那些善良的老乡吧。那里有三千人口。我的上帝!那真象一个小小的共和国。他们既不知道有审判官,也不知道有执法官。乡长处理一切。他分配捐税,凭良心向各人抽捐,义务地排解纠纷,替人分配遗产,不取酬金,判处案情,不收讼费;大家也都服他,因为他是那些简朴的人中一个正直的人。”在那些没有老师的村子,他又谈到格拉谷的居民了:“你们知道他们怎么做的?”他说,“一 个只有十家到十五家人口的小地方,自然不能经常供养一个乡村教师,于是他们全谷公聘几个教师,在各村巡回教学,在这村停留八天,那村停留十天。那些教师常到市集上去,我常在那些地方遇见他们。我们只须看插在帽带上的鹅毛笔,就可以认出他们来。那些只教人读书的带一 管笔,他们都是很有学问的人。做一个无知无识的人多么可羞!你们向格拉谷的居民学习吧。” + 他象父兄那样谈着;缺少例证时,他就想一些言浅意深的话,用简明的语句和丰富的想象,表达他的意思;那正是耶稣基督的辩才,自信而使人信服。 + 四 言行一致 + 他谈话随和,令人愉快。他总要求自己适合那两个伴他过活的老妇人的知识水平。当他笑起来,就象小学生。 + 马格洛大娘诚心诚意地称他做“大人”。一天,他从他的围椅里站起来走向书橱,要去取一本书。那本书正在顶上的那一格。主教的身材矮小,够不到。 + “马格洛大娘,”他说,“请您搬张椅子给我。本大人还‘大’不到那块木板呢。” + 他有一个远亲,德?洛伯爵夫人,一有机会,总爱在他跟前数说她三个儿子的所谓“希望”。她有几个年纪很老行将就木的长辈,她那几个孩子自然是他们的继承人了。幼子将从一个姑祖母那里获得一笔整整十万利弗的年金,第二个承继他叔父的公爵头衔,长子承袭他祖先的世卿爵位。主教平日常听这位做母亲的那些天真可恕的夸耀,从不搭话。但有一次,当德?洛夫人又唠唠叨叨提到那些承继和“希望”时,他仿佛显得比平日更入神一些。她不耐烦地换了话题说:“我的上帝,我的表哥!您到底在想什么?”“我在想,”主教说,“一句怪话,大概出自圣奥古斯丁:‘把你们的希望寄托在那个无可承继者的身上吧。’”另一次,他接到本乡一个贵人的讣告,一大张纸上所铺排的,除了亡人的各种荣衔以外,还把他所有一切亲属的各种封建的和贵族的尊称全列了上去。他叫着说:“死人的脊骨多么结实!别人把一副多么显赫的头衔担子叫他轻轻地背着!这些人也够聪明了,坟墓也被虚荣心所利用!” + 一有机会,他总爱说一些温和的讥讽之词,但几乎都包含着严正的意义。一次,在封斋节,有个年轻的助理主教来到迪涅,在天主堂里讲道。他颇有口才,讲题是“慈善”。他要求富人拯救穷人,以免堕入他尽力形容的那种阴森可怕的地狱,而进入据他所说的非常美妙动人的天堂。在当时的听众中,有个叫惹波兰先生的歇了业的商人,这人平时爱放高利贷,在制造大布、哔叽、毛布和高呢帽时赚了五十万。惹波兰先生一生从没有救助过任何穷人。自那次讲道以后,大家都看见他每逢星期日总拿一个苏①给天主堂大门口的那几个乞讨的老婆婆。她们六个人得去分那个苏。一天,主教看见他又在做那件善事,笑嘻嘻向他的妹妹说:“惹波兰先生又在那儿买他那一个苏的天堂了。” + 谈到慈善事业,即使碰壁他也不退缩,并还会想出一些令人回味的话。一次,他在城里某家客厅里为穷人募捐。在座的有一个商特西侯爵,年老,有钱,吝啬,他有方法同时做极端保皇党和极端伏尔泰②派。那样的怪事是存在的。主教走到他跟前,碰碰他的手臂说:“侯爵先生,您得替我捐几文。”侯爵转过脸去,干脆地回答说:“我的主教,我有我自己的穷人呢。”“把他们交给我就是了。”主教说。 + 一天,在天主堂里,他这样布道: + “我极敬爱的兄弟们,我的好朋友们,在法国的农村中,有一百三①苏(Sou),法国辅币名,等于二十分之一法郎,合五生叮②伏尔泰(Voltaire,1694—1778),一生强烈反对封建制度和贵族僧侣的统治权。 + 十二万所房子都只有三个洞口;一百八十一万七千所有两个洞口,就是门和窗;还有三十四万六千个棚子都只有一个洞口,那就是门。这是因为那种所谓门窗税才弄成这样。请你们替我把一些穷人家、老太婆、小孩子塞在那些房子里吧,瞧热症和疾病有多少!咳!上帝把空气给人,法律却拿空气做买卖。我并不诋毁法律,但我颂扬上帝。在伊泽尔省,瓦尔省,两个阿尔卑斯省,就是上下阿尔卑斯省,那些农民连小车都没有,他们用自己的背去背肥料;他们没有蜡烛,点的是松枝和蘸着松脂的小段绳子。在多菲内省,整个山区也都是那样的。他们做一回面包要吃六个月,并且是用干牛粪烘出来的。到了冬天,他们用斧子把那种面包砍开,放在水里浸上二十四个钟头才能吃。我的弟兄们,发发善心吧!看看你们四周的人何等受罪!” + 他出生在南部,所以很容易掌握南方的各种方言。他学下朗格多克省的方言:“Ehbe!moussn,sessage?”学下阿尔卑斯省的方言:“Onte anaraspassa?”学上多菲内省的方言:“ Puertennbouen moutouembeunbouen froumagegrase。”这样就博得了群众的欢心,大大有助于他去接近各种各样的人。他在茅屋里或山中,好象在自己的家里,他知道用最俚俗的方言去解释最伟大的事物。他能说各种语言,也就能和一切心灵打成一片。 + 并且他对上层和大众,一视同仁。 + 在没有充分了解周围环境时,他从不草率地判断一件事。他常说:“让我们先看看发生这错误的经过吧。”他本是个回头的浪子,他也常笑着这样说自己。他丝毫不唱严格主义的高调;他大力宣传一种教义,但绝不象那些粗暴的卫道者那样横眉怒目,他那教义大致可以这样概括:“人有肉体,这肉体同时就是人的负担和诱惑。人拖着它并受它的支配。” + “人应当监视它,管束它,抑制它,只有到最后才服从它。在那种服从里,也还是可以有过失的;但那样犯下的过失是可以得到宽赦的。那是一种堕落,但只落在膝头上,在祈祷中还可以自赎。” + “做一个圣人,那是特殊情况;做一个正直的人,那却是为人的正道。你们尽管在歧路徘徊,失足,犯错误,但总应当做个正直的人。” + “尽量少犯错,这是人的准则;不犯错误,那是天使的梦想。尘世的一切都没法无错。错误好比一种地心引力。” + 看见大家吵闹并且轻易动怒时,他常笑嘻嘻地说:“看来这就是我们大家都在犯的严重罪行吧。现在只因为假面具被揭穿急于申辩和掩饰罢了。” + 他对于人类社会受压的妇女和穷人总是宽厚的。他说:“凡是妇女、孩子、仆役、没有力量的、贫困的和没有知识的人的过失,都是丈夫、父亲、主人、豪强者、有钱的和有学问的人的过失。” + 他又说:“对无知识的人,你们应当尽你们的所能多多地教给他们;社会的罪恶在于不搞义务教育;它负有制造黑暗的责任。当一个人的心中充满黑暗,罪恶便在那里滋长起来。有罪的并不是犯罪的人,而是那制造黑暗的人。” + 我们看得出,他有一种独特的判断事物的态度。我怀疑他是从《福音书》中得到这些的。一天,在一个客厅里,他听到大家谈一桩正在研究调查、不久就要交付审判的案子。有个穷苦无知的人,为了他对一个女子和所生孩子的爱,在生路断绝时造了假币。造假币在那个时代是要受极刑的。那女子拿着他所造的第一个假币去用就被捕了。他们把她抓了起来,但是只有她本人犯罪的证据。只有她自己能告发她的情人,送他的命。她不愿招供。他们再三拷问。她仍坚决不说。于是,检察长心生一计。他编造说她的情人变了心,极巧妙地伪造许多信札的断片,来说服那个苦恼的女人,使她相信她有一个情敌,那男子有负心之举。在妒恨悲愤之中,她终于揭发她的情人,一切都吐了,一切都证实了。那男子是无法挽救了。不久他就得在艾克斯和他的同谋女犯一同受审。大家谈着那件事,每个人都称赞那官员的才干,说他能利用妒嫉之心,从而使真相大白,法律的力量也因这种报复的心理而得以发挥。主教静静地听着这一切,等大家说完了,他问道:“那一对男女将在哪里受审?” + “在地方厅。”他又问:“那么,那位检察长将在什么地方受审呢?”迪涅发生过一件惨事。有个人因谋害人命而被判处死刑。那个不幸的人并非什么读书人,但也不是完全无知之人,他曾在市集上卖技,也摆过书信摊。城里的人对该案非常关注。行刑的前一天,驻狱神甫忽然害了玻必须有个神甫在那受刑的人临终时帮助他。有人去找本堂神甫。他好象有意拒绝,他说:“这不关我事。这种苦差事和那耍把戏的人和我都不相干,我也正害着病,况且那地方不属我的范围。”这答复传到主教那儿,主教说:“本堂神甫说得对。那不属于他的范围,而是属于我的。” + 他立刻跑到监狱去,去到那“耍把戏的人”的牢房里,他叫他的名字,搀着他的手,和他谈话。他在他的身旁整整呆了一天一夜,饮食睡眠全忘了,他为那囚犯的灵魂向上帝祈祷,也祈求那囚犯拯救他自己的灵魂。他和他谈着最善的、亦即最简单的真理。他简直象他的父亲、兄长、朋友;如果不是在祝福祈祷,他完全也不象个主教。他在稳定与安慰他的同时,把一切都教给他了。那个人原是悲痛绝望而死的。此前,死对他好象是个万丈深渊,他就站在那阴惨的边缘上,一面颤栗,一面又魂飞魄散地朝后退。他并未冥顽到对死活也漠不关心的程度。他受到的判决是一种剧烈的震撼,仿佛在他四周的某处,把隔在万物的神秘,与我们所谓生命中间的那堵墙震塌了。从那无法补救的缺口,他不停地望着这世界的外面,而所见的只是一片黑暗。主教却让他见到了一线光明。 + 第二天,他们来提这不幸的人,主教仍守在他身边。他跟着他走。他披上紫披肩,颈上挂着主教的十字架,和那被缚在绳索中的监刑者并肩站在大众的面前。 + 他同他一道上囚车,一道上断头台。那个受刑者,昨天是那样哀愁,那样垂头丧气,现在却开朗兴奋起来了。他感到他的灵魂得了救,他期待着上帝。主教拥抱了他,当刀将落下时,他说:“人所杀的人,上帝使他复活;弟兄们所驱逐的人会重见天父;祈祷,信仰,到生命里去。 + 天父就在前面。”他从断头台上下来时,他的目光里有种东西令众人肃然退立。我们不知道究竟哪一样最使人肃然起敬,是他面色的惨白呢,还是他神圣的宁静。在回到他一惯戏称为“他的宫殿”的那所破屋时,他对他的妹妹说:“我刚举行了一场隆重的大典。” + 最卓越的东西往往也是最难被人了解的东西,因此,城里有许多人都在议论主教那一举动,说他那是娇揉造作。不过那只是上层阶级客厅里的一种说法。对圣事活动没有恶意的民众却感到了,并且十分钦佩主教。 + 至于主教,对他而言,看了断头台行刑确实是一种震动;过了许久,他才镇定下来。 + 的确,断头台,当它被架起来耸立在那儿时,具有一种使人眩惑的力量;在我们不曾亲眼目睹断头台前,我们对死刑多少还能漠然视之,不表示自己的意见,不置可否;但如果我们见到了一座,那种惊骇实在强烈,我们不得不作出决定,不得不表示赞同或反对。有些人赞叹它,如德?梅斯特尔①。有些人痛恨它,如贝卡里亚②。断头台是法律的体现,它的别名是“镇压”,它不是中立的,也不让人中立。看见它的人都会产生最神秘的颤栗。所有的社会问题都在那把板斧的四周打起了它们的问号。断头台是想象。断头台不是一个架子。断头台不是一种机器。断头台并非由木条、铁器和绳索所构成的无生气的机械。它好象是种生物,具有一种说不出的阴森森的能动性。我们可以说那架子能看见,那座机器能听见,那种机械能了解,那些木条铁件和绳索都具有意识。当它的出现把我们的心灵抛入凶险的梦想时,断头台就显得很可怕,并和它所做的一切都结合在一起了。断头台是刽子手的同伙,它在吞噬东西,在吃肉,在饮血。断头台是法官和木工合造的怪物,是一种鬼怪,它以自己所制造的死亡为生命而工作。 + 行刑的第二天和许多天以后,主教还表现出惶惶不可终日的样子,那次的印象的确是可怕和深刻的。送死时那种强作的镇静已经消逝了,社会权威下的鬼魂和他纠缠不清,他平常工作回来,一贯心安理得,神采奕奕,这会儿他却老象在责备自己。有时,他自言自语,吞吞吐吐,低声说着一些凄惨的话。下面是一天晚上他妹妹听了后记下来的一段:“我从前还不知道是那么可怕。只专心注意上帝的法则而不关心人的法律,那是错误的。死只属于上帝,人有什么权力过问那件未被认识的事呢?” + 那些印象随着时间渐渐减褪或许竟然消失了,但是人们察觉得到,从此以后,主教总避免经过那刑常人们能在任何时候把主教叫到病人和临死的人的床边。他深知他最大的责任在那儿。不用请,寡妇和孤女的家,他自己就会去。他知道在失去爱妻的男子和失去孩子的母亲身旁静静坐上几个钟头。他既懂得沉默的时刻,也懂得开口的时刻。呵!可敬可佩的安慰人的人!他不用忘却来消除苦痛,却试图去让苦痛显得伟大和光荣。他说:“要注意您对死者的想法。不要在那溃烂的东西上去想。定神去看,您就会在苍穹的①德?梅斯特尔(deMaistre,1753—1821),法国神学家。 + ②贝卡里亚(Beccaria,1738—1794),意大利启蒙运动的著名代表人物,法学家。 + 尽头看到您亲爱的死者的生命之光。”他知道信仰能护人心身。他总想方设法去宽慰失望者,使他们能作退一步之想,使面对墓穴的悲痛转为仰望星光的悲痛。 + 五 卞福汝主教的道袍穿得太久 + 正如他的社会生活那样,米里哀先生的家庭生活,是受同样的思想支配的。对那些有机会就近观察的人,迪涅主教所过的那种自甘淡泊的生活,的确严肃而动人。 + 他睡得少,和所有老年人及大部分思想家一样,但他的短暂的睡眠却很安稳。早晨,他静修一个钟头,再念他的弥撒经,有时在天主堂里,有时在自己的经堂里。弥撒经念完了,作为早餐,他吃一块黑麦面包,蘸着自家牛的乳汁。然后,他开始工作。 + 主教总是非常忙,他得每天接见主教区的秘书——通常是一个司祭神甫,并且几乎每天都要接见他的那些助理主教。他有许多会议要主持,整个宗教图书室要检查,还要诵弥撒经、教理问答、日课经等等;还有许多训示要写,许多讲稿要批示,还要和解教士与地方官之间的争执,还要处理教务方面的信件、行政方面的信件,一方是政府,一方是宗教,事情总做不完。 + 无穷的事务和他的日课以及祈祷余下的时间,他首先用于贫病和痛苦的人身上;在痛苦和贫病的人之后留下的时间,他用在劳动上。他有时在园里铲土,有时阅读和写作。他对那两种工作只有一种叫法,他管这叫“种地”,他说:“精神是一种园地。” + 日影正了,他便用午餐。午餐正和他的早餐一样。 + 如果天气好,要到两点时,他就去乡间或城里散步,时常走进那些破烂的人家。人们看见他独自走着,低垂着眼睛,扶着一根长拐杖,穿着他那件相当温暖的紫棉袍,脚上穿着紫袜和粗笨的鞋子,头上戴了他的平顶帽,三束金流苏从帽顶的三只角里坠下来。 + 他经过的地方就象过节似的。我们可以说他一路走过,就一路在散布温暖和光明,孩子和老人都因为主教而来到大门口,有如迎接阳光。他祝福大家,大家也为他祝福。人们总把他的住所指给任何有所需求的人们看。 + 他随处停顿,和小男孩小女孩说话,也向着母亲们微笑。只要有钱,他总去找穷人;钱完了,便去找有钱人。由于他的道袍穿得太久,却又不愿被别人察觉,因此他进城就不得不套上那件紫棉袍。在夏季,这会使他感到难受。晚上八点半,他和他的妹妹用晚餐,马格洛大娘立在他们的后面照应。再没有比那种晚餐更简单的了。但是如果主教留他的一位神甫共进晚餐,马格洛大娘就会借此机会为主教做些鲜美的湖鱼或名贵的野味。所有的神甫都成了预备盛餐的籍口,主教也听人摆布。此外,他日常的伙食总不外是水煮蔬菜和素油汤。城里的人都说:“主教不吃神甫菜的时候,就吃苦修会的修士菜。”晚餐之后,他同巴狄斯丁姑娘、马格洛大娘闲谈半小时,再回自己的房间从事写作,有时写在单张纸上,有时写在对开本书的空白边上。他是个文人,知识渊博,留下了五种或六种相当奇特的手稿,其中一种是关于《创世记》中“上帝的灵运行在水面上”①那一节的研究。他拿三 种经文来作比较:阿拉伯译文作“上帝的风吹着”;弗拉菲于斯?约瑟①这一句话原文见《创世记》第一章第二节。 + 夫②作“上界的风骤临下土”;最后翁格洛斯的迦勒底③文的注释性翻译则作“来自上帝的一阵风吹在水面上”。在另外一篇论文里,他研究了雨果关于神学的著作——雨果是普托利迈伊斯的主教,本书作者的叔曾祖;他还考证,在前世纪以笔名巴勒古尔发表的各种小册子都是那位主教所作。有时,他阅读,而不问在他手里拿的是什么书,他会忽然堕入深远的思考,想完以后,立即在原书中写上几行。那些字时常和他手中的书毫无关系。目下我们有他在一部四开本书的边上所写的注,书名是“贵人日耳曼和克林东、柯恩华立斯两将军以及美洲海域海军上将们的往来信札》,凡尔赛盘索书店及巴黎奥古斯丁河沿毕索书店印行。 + 其注如下: + “呵!存在着的你! + 《传道书》称你为全能,马加比人称你为创造主,《以弗所书》称你为自由,巴录称你为广大,《诗篇》称你为智慧与真理,约翰称你为光明,《列王纪》称你为天主,《出埃及记》称你为主宰,《利未记》称你为神圣,以斯拉呼称你公正,《创世记》称你为上帝,人们称你为天父,但是所罗门称你为慈悲,这才是你名称中最美的一个。” + 近九点钟时,两位妇女退到楼上自己的房间去,让他独自呆在楼下,直到天明。 + ②弗拉菲于斯?约瑟夫(FlaviusJosephe),一世纪末的犹太历史家。 + ③迦勒底(Chaldee),巴比伦一带地方的旧称。 + 六 他把房子交给谁看护 + 我们已经说过,他住的房子是一所只一层楼的楼房,楼下三间,楼上三间,顶上一间气楼,后面有一个四分之一亩大的园子。两位妇女住在楼上,主教住在楼下。临街的第一间是他的餐室,第二间是卧室,第三间是经堂。从经堂出来,得经过卧室;从卧室出来,又得穿过餐室。经堂底边,有半间小暖房,仅容一张留备客人寄宿睡的床。主教常把那床让给那些因管辖区的事务或因其它需要来到迪涅的乡村神甫们住宿。以前医院的药房是间小房子,和正屋相通,建在园子里,现在已改为厨房和贮藏食物的地方了。此外,园里还有一个牲口棚,最初是救济院的厨房,现在主教在那里养了两头母牛。无论那两头牛产多少奶,每天早晨他总要分一半给医院里的病人。“这是我付的什一税。”他说。他的房间很大,在恶劣的季节里很难保暖。由于木柴在迪涅非常贵,他便设法在牛棚里杉板壁隔出了一小间。严寒季节便成为他夜间生活的地方。他称那做“冬斋”。和在餐室里一样,冬斋里除了一张白木方桌和四张麦秸心椅子外,再也没有别的家具。餐室里却还陈设着一个涂了淡红胶的旧碗橱。主教还把一张同样的碗橱,适当地罩上白布帷和假花边,作为祭坛,点缀他的经堂。 + 迪涅的那些有钱的女忏悔者和虔诚的妇女,多次凑了些钱,要给主教的经堂造一个美观的新祭坛,每次他把钱收入,却都送给了穷人。 + “最美丽的祭坛,”他说,“是一个因得到安慰而感谢上帝的受苦人的灵魂。”在经堂,他有两张麦秸心的祈祷椅,卧室里还有一张有扶手的围椅,也是麦秸心的。万一他同时要接见七八个人,省长、将军或是驻军的参谋,或是教士培养所的几个学生,他们就得到牛棚里去找冬斋的椅子,经堂里去找祈祷椅,卧室里去找围椅。这样,他们能收集到十一张待客的坐具。每次有人来访,总得把一间屋子搬空。 + 有时来了十二个人,主教为了掩饰那种窘迫境况,如果是冬天,他便自己立在壁炉边,如果是夏天,他就提议到园里去兜圈。在那小暖房里,的确还有一张椅子,但椅上的麦秸已脱了一半,并且只有三只脚,只有靠在墙上才能用。巴狄斯丁姑娘也还有一张很大的木靠椅,从前是漆过金的,并有锦缎的椅套,但是那靠椅由于楼梯太窄,已从窗口吊上楼了,所以它不能作为可随意搬动的家具。 + 巴狄斯丁姑娘的奢望,是想买一套客厅里用的荷兰黄底团花丝绒的天鹅颈式紫檀座架的家具,再配上长沙发。但是这至少需要五百法郎。她为此省吃节用,五年当中,只省下四十二个法郎和十个苏,于是也就放弃了。而且谁又能实现自己的理想呢?要去想象一下主教的卧室,那是再简单不过的了。一扇窗门朝着园子,对面是床——一张医院用的病床,铁的,带着绿哔叽帷子。在床里面的阴暗处,帷子的后面,还摆着梳妆用具,残留着他旧时在繁华社会中做人的那些漂亮习气;两扇门,一扇靠近壁炉,与经堂相通,一扇靠近书橱,与餐室相通;那书橱是一 个大玻璃橱,装满了书;壁炉的木框,描着仿大理石的花纹,炉里一般是没有火的;壁炉里有一对铁炉篦,篦的两端装饰着两个瓶,瓶上绕着花串和槽形直条花纹,并贴过银箔,那是主教等级的一种奢侈品;上面,在平常挂镜子的地方,有一个银色已褪的铜十字架,钉在一块破旧的黑绒上面,装在一个金色暗敝的木框里。窗门旁边,有一张大桌子,摆了一个墨水瓶,桌上堆着零乱的纸张和大本的书籍。桌子前面,一张麦秸椅。床的前面,一张从经堂里搬来的祈祷椅。椭圆框里的两幅半身油画像,挂在他床两边的墙上。在画幅素净的背景上有几个小金字写在像的旁边,标明一幅是圣克鲁的主教查里奥教士的像,一幅是夏尔特尔教区西多会大田修院院长阿格德的副主教杜尔多教士的像。主教在继医院病人之后住进那间房时,就已看见有这两幅画像,也就让它挂在原处。他们是神甫,也许是施主,这就是使他尊敬他们的两个理由。他所知道关于那两个人物的,只是他们在同一天,一七八五年四月二十七日,根据王命,一个被授以教区,一个被封给采地。马格洛大娘曾把那两幅画取下来掸灰尘,主教才在大田修院院长的像的后面,看见在一张用四片胶纸粘着四角、年久发黄的小方纸上,用淡墨汁注出的这两位人物的来历。窗门上,有一条古老的粗毛呢窗帷,已经破旧不堪,为了节省新买一条的费用,马格洛大娘只得在正中大大地缝补一番,缝补的线纹恰好成了一个十字形。主教常常叫人观看。 + “这缝得多好!”他说。那房子里所有的房间,不管楼下楼上,没有一间不是用灰浆刷的,营房和医院也是如此。 + 但后来的几年里,马格洛大娘在巴狄斯丁姑娘房间的裱墙纸下面(我们在下面还会谈到),发现了一些壁画。在成为医院以前,这所房子曾是一些士绅们的聚会场所,所以会有那种装饰。每间屋子的地上都铺了红砖,每星期洗一次,床的前面都铺着麦秸席。总之,这住宅,经那两妇女的整理,从上到下,都变得极其清洁。那是主教所许可的唯一的奢华。他说:“这并不损害穷人的利益。” + 但我们得说清楚,在他从前有过的东西里,还留下六套银餐具和一 只银的大汤勺,马格洛大娘每天都高兴地望着那些银器在白粗布台毯上闪烁出灿烂夺目的光。我们既然要把迪涅的这位主教如实地写出来,就应该提到他曾几次这样说过:“叫我不用银器盛东西吃,我想是不容易做到的。” + 在那些银器之外,还有两个粗重的银烛台,是从他一个姑祖母的遗产中得来的。那对烛台上插着两支烛,经常陈设在主教的壁炉上。每逢他留客进餐,马格洛大娘总要点上那两支烛,同蜡台一起放在餐桌上。在主教的卧室里,床头边有一张壁橱,每天晚上,马格洛大娘把那六套银器和大汤勺塞在橱里。橱门上的钥匙是从来不拿走的。那个园子,在我们说过的那些相当丑陋的建筑物的映衬下,也显得有些失色。园子里有四条小道,交叉成十字形,交叉处有一个水槽;另一条小道沿着白围墙绕园一周。小道与小道之间,构成了四块方地,边沿上栽着黄杨。马格洛大娘在三块方地上种了蔬菜,在第四块上,主教种了点花卉。几株果树散布各处。 + 一次,马格洛大娘和蔼地打趣他说:“您处处都要盘算,这儿却有一块方地没有用上。种上些生菜,不比花还好吗?”“马格洛大娘,”主教回答说:“您弄错了。美和实用是一样有用的。”停了一会,他又加上一句:“也许更有用些。” + 那块方地又分作三四畦,主教在那地上所花费的劳动和他在书本里所花费的劳动是相等的。他喜欢在这里花上一两个钟头,修枝,除草,这儿那儿,在土里搠一些窟窿,搁下种子。他并不象园艺工作者那样仇视昆虫。对植物学他没有任何幻想;他不知道分科,也不懂骨肉发病说;他绝不研究在杜纳福尔①和自然操作法之间应当有何取舍,既不替胞囊反对子叶,也不替舒习尔②反对林内③。他不研究植物,但赞赏花卉。他非常敬重科学家,更敬重没有知识的人,在双方并重之下,每当夏季黄昏,他总提着一把绿漆白铁喷壶去浇他的花畦。 + 那所房子没有一扇门是能锁上的。餐室的门,我们已经说过,开出去便是天主堂前面的广场,从前装了锁和铁闩的,正象一扇牢门。主教早已叫人把那些铁件去掉了,所以那扇门无论昼夜,都只用一个活梢扣着。任何过路的人,在任何时刻都可以摇开。开始时,那两位妇女为那扇从来不关的门非常担忧,但迪涅主教对她们说:“假如你们喜欢,不妨在你们的房门上装上铁闩。”到后来,她们见他放心,也就放了心,或者说,至少她们装出了放心的样子。马格洛大娘有时仍不免提心吊胆。主教的想法,已经在他在《圣经》边上所写的这三行字里阐明了,至少是提出了:“这里只是最微小的一点区别:医生的门,永不应关,教士的门,应该常开。” + 在一本叫做《医学的哲学》的书上,他写下了这样一段话:“难道我们不是同他们一样都是医生吗?我一样有我的病人。首先我有他们称为病人的病人,其次我还有我称为不幸的人的病人。” + 在另一处,他还写道:“对向你求宿的人,不可问名问姓。不便把自己姓名告人的人,常常就是最需要找地方住的人。”有一天,忽然来了个大名鼎鼎的教士,我已经记不清是古娄布鲁教士,还是彭弼力教士,想要问主教先生(那也许是受了马格洛大娘的指使),让大门日夜敞开着,人人都能进来,主教是否能确保不至于发生某种意外,是否不怕在防范如此松懈的家里,发生什么不幸的事。主教严肃而温和地在他肩上点了一下,对他说:“除非上帝要保护这家人,否则看守也是枉然。”①接着他就谈别的事了。 + 他常爱说:“教士也有教士的勇敢,正如龙骑队长有龙骑队长的勇敢。”不过,他又加上一句:“我们的勇敢应当是宁静的。” + ①杜纳福尔(Tournefort),法国十世纪的植物学家。 + ②舒习尔(Jussieu),法国十八世纪植物学家。 + ③林内(Linne),瑞典十八世纪生物学家,是植物和动物分类学的鼻祖。 + ①这两句话原文为拉丁文,即 NisiDominuscustodiertitdomum,invanumvigilantquicus-todiunteam。 + 七 克拉华特 + 此地自然有一件我们不应当忽略的事,因为这件事足以说明迪涅的空闰主教先生是怎样一个人。 + 加斯帕尔?白匪帮曾一度在阿柳尔峡一带横行,在被击溃以后,有个叫克拉华特的匪盗却还躲在山林里。他领着他的人马,即加斯帕尔?白的残部,在尼斯伯爵领地里藏匿了一段时间,随后又转到皮埃蒙特区②,忽而又在法国境内的巴塞隆内特附近出现。最初,有人曾在若齐埃见过他,过后又在翟伊尔见过他。他躲在鹰轭山洞里,从那里出来,经过玉碑和小玉碑峡谷,走向村落和乡镇。他甚至敢于进逼昂布伦,黑夜侵入天主堂,卷走了圣衣库中的东西。他的劫掠使那一乡的人惊恐不安。警察追击也毫无用处。他屡次逃脱,有时还公然抵抗。他是个胆大的恶徒。正当人心惶惶时,主教来了。他正在那个乡巡视。乡长赶到沙斯特拉来找他,并且劝他折回去。当时克拉华特已占据那座山,直达阿什一带,甚至还更远。即使由卫队护送,也有危险。那仅仅是把三四个警察白白拿去送死而已。 + “那么,”主教说,“我打算不带卫兵去。”“您怎么能那样做,主教?”乡长说。 + “我就那样打算,我绝对拒绝卫兵,一个钟头以内我就要走。” + “走?” + “走。” + “一个人去吗?” + “一个人。” + “主教,您不能那样做。” + “在那儿,”主教又说,“有个穷苦的小村子,才这么一丁点大,我三年没有去看他们了。那儿的人都是我的好朋友。一些和蔼诚实的牧人。他们牧羊,每三十头母羊里只有一头是属于他们自己的。他们能做各种颜色的羊毛绳,非常好看。他们用六孔小笛吹出各种山歌。他们需要有人不时和他们谈谈慈悲的上帝。主教如果也害怕,他们将会说什么呢?如果我不到那里去一趟,他们将会说些什么呢?” + “可是,主教,您怎么对付那些强盗,万一您遇见了强盗!”“对呀,”主教说,“我想起来了。您说得有理。我有必要碰到他们。他们也需要有人和他们谈谈慈悲的上帝。” + “主教,那是一伙土匪呀,是一群狼呀!” + “乡长先生,也许耶稣正要我去做一群狼的牧人呢。谁知道上帝的旨意?” + “主教,他们会把您抢光的。” + “我没什么可抢的。” + “他们会杀害您的。” + “杀害一个念着消食经过路的老教士?啐!那有什么益处?”“唉!我的上帝!万一您碰见他们!” + “那我就请他们捐几文给我的穷人们!” + ②皮埃蒙特区(Piemcnt),在意大利北部。 + “主教,以上天之名,不要到那儿去吧!太冒险了。”“乡长先生,”主教说,“就只是这点小事吗?我活在世上不是为了自己的性命,而是来保护世人的心灵的。”只好让他走。他走了,只有一个自愿当向导的小孩陪着他。他那种蛮劲让那一乡的人议论纷纷,甚至个个都替他捏了一把汗。他不愿带他的妹妹,也没带马格洛大娘。他骑上骡子,穿过山路,一个人都没有碰到,平平安安就到了他的“好朋友”——牧人的家里。他在那里住了两个星期,传道,行圣礼,教育人,感化人。到快离开时,他决定用主教的仪式做一场大弥撒。他和本堂神甫商量。但是没有主教的服饰,怎么办呢?他们只能把简陋的乡间圣衣库提供给他使用,那里只有几件破旧的、装着假金线的锦缎祭服。 + “没关系!”主教说。“神甫先生,我们不妨把要做大弥撒的事在下次礼拜时,向大众宣告一下,总会有办法的。”在附近的几个天主堂里都找遍了。那些穷教堂里所有的精华,凑拢来还不够装饰一个大天主堂里的唱诗童子。 + 正在大家为难之际,有两个陌生人骑着马,带了一只大箱子,送来给主教先生,箱子放在本堂神甫家里,人立即走了。打开箱子一看,里有件金线呢披氅,一顶装有金刚钻的主教法冠,一个大主教的十字架,一条华美的法杖,一个月以前,在昂布伦圣母堂的圣衣库里被抢的法衣,全部都在。箱子里有张纸,上面写着:“克拉华特呈卞福汝主教。” + “我早说过会有办法的!”主教说,随后他含笑补充一句,“以神甫的白衣自足的人,蒙上帝赐来大主教的披氅了。”“我的主教,”神甫点头含笑低声说,“不是上帝便是魔鬼。”主教用眼睛盯住神甫,严肃地说:“是上帝!” + 回沙斯特拉时一路上都有人来看他,他被引为奇谈。他在沙斯特拉的神甫家里,又和巴狄斯丁姑娘和马格洛大娘相见了,她们也正盼望他回来。他对他的妹妹说:“怎样,我的打算没有错吧?我这穷教士,两手空空,跑到山里那些穷百姓家里去,现在又满载而归了。当初我出发时,只带着一片信仰上帝的诚心,回来时,却把一个天主堂的宝库带了回来。” + 晚上,到睡之前他还在说: + “永远别怕盗贼和杀人犯。那是身外的危险。我们应当害怕自己。偏见便是盗贼,恶习便是杀人犯。重大的危险都在我们自己的心里。危害我们脑袋和钱袋的人何足介意呢?我们只须想到危害灵魂的东西就行了。” + 他又转过去对他妹妹说: + “妹妹,教士永远不应该提防他的邻人。邻人做的事,总是上帝允许的。我们在危险临头时,只应祷告上帝。祈求他,不是为了我们自己,而是为了不要让我们的兄弟因我们而犯罪。” + 总之,他生平的特殊事情不多。我们就自己所知道的谈谈。不过在他的一生中,他总是在同样的时刻做同样的事。他一年的一月,就象他一日的一刻。 + 至于昂布伦天主堂的“财宝”的下落如何,我们对这问题,却有些难以回答。那都是些美丽的、令人爱不释手的、很值得偷去救济穷人的东西。况且那些东西已是早被人偷过了的。那种冒险行为已经完成了一半,余下的工作只须改变偷窃的目的,再向穷人那边走一小段路就可以了。关于这问题,我们什么也不肯定。不过,曾经有人在主教的纸堆里发现过一张语意不明的纸条,也许正是针对那件事而言的,上面写着:“问题在于明确这东西应当归天堂还是归医院。” + 八 醉酒后的哲学 + 我们曾提过一个元老院元老,那是个精明而又果断的人,一生行事直截了当,对于人生所会碰到的难题,如良心、信誓、公道、天职之类从不介怀;他一往直前地向着他的目标走去,在他个人发达和利益的道路上,他从不曾动摇过一次。他从前当过检察官,因事事顺利,为人也渐趋温和,他绝不是个有坏心眼的人。他在生活中审慎地抓住那些好的地方、好的机会和好的财源之后,对女儿、女婿、亲戚甚至朋友,也尽力帮些小忙。其余的事,在他看来,好象全是傻事。他善诙谐,通文墨,以伊壁鸠鲁①的信徒自居,实际上也许只不过是比戈?勒白朗②之流而已。对无垠的宇宙和永恒的事业,以及“主教老头儿的种种无稽之谈”,他常爱用解颐的妙语来加以述说。有时,他会带着和蔼的高傲样子当面嘲笑米里哀先生,米里哀先生总随便让他嘲笑。 + 不知是在举行什么半官方典礼时,那位伯爵(就是那位元老)和米里哀先生都在省长公馆里参加宴会。到了用甜品时,这位元老已经略有酒意,不过态度仍旧庄重,他大声说:“主教先生,我们来谈谈。一个元老和一个主教见了面,就难免要彼此眉来眼去,一狼一狈,心照不宣。我要和您谈句知心话。我有我自己的一套哲学。” + “您说得对,”主教回答,“人总是睡下来搞他的哲学的,何况您是睡在金屋玉堂里的,元老先生。”元老兴致勃发,接着说:“让我们做好孩子。” + “就做顽皮鬼也没有什么。”主教说。 + “我告诉您,”元老说,“阿尔让斯侯爵、皮垄霍布斯、内戎③先生这些人都不是简单的。在我的图书室里的这些哲学家的书边上,都是烫了金的。” + “就象您自己一样,元老先生。”主教抢着说。 + 元老接着说: + “我恨狄德罗,①他是个空想主义者,大言不惭,还搞革命,骨子里却信仰上帝,比伏尔泰还着迷。伏尔泰嘲笑过尼登,他不该那么做,因为尼登的鳝鱼已经证明上帝的无用了。一匙面糊加一滴酸醋,便可以代替圣灵。假设那一滴再大一点,那一匙也再大一点,就等于是这世界了。人就是鳝鱼。又何必要永生之父呢?主教先生,关于耶和华的那种假设让我头痛。它只对那些柔弱无能的人有些用处。打倒那个惹人厌烦的万物之主!虚空万岁!虚空才能叫人心安。说句知心话,并且我要说个痛快,好好向我的牧师交代一番,我告诉您,我观点明确。您那位东劝人①伊壁鸠鲁(Epicure,公元前 341—270),希腊唯物主义哲学家,主张享乐。 + ②比戈?勒白朗(PigaultLebrun),十八世纪法国言情小说家。 + ③皮隆(Pyrrhoh),四世纪希腊怀疑派哲学家。堆布斯(Hobbes,1588—1679),英国唯物主义哲学家。内戎(Naigeon,1738—1810),法国文人,唯物主义者。 + ①狄德罗(Diderot,1713—1784),杰出的法国哲学家,机械唯物主义的代表人物,无神论者,法国资产阶级革命的思想家之一,启蒙运动者,百科全书派领袖,一七四九年因自己的著作而被监禁。 + 谦让、西劝人牺牲的耶稣瞒不了我的眼睛。那种说法是吝啬鬼对穷鬼的劝告。谦让!为什么?牺牲!为什么?我从未见过一只狼为另一只狼的幸福而去牺牲它自己。我们还是游戏人间的好。人为万物之灵。我们应当有高明的哲学。假使目光如鼠,又何必生为万物之灵?让我们轻轻松松过这一世吧。人生就是一切。说人在别的地方,天上、地下,某处,有另外一个来生,我绝不信那些鬼话。哼!有人要我谦让,要我牺牲,那么,一举一动,我都得谨慎小心,我得为善恶、曲直、从违等问题来伤脑筋。为什么?据说对自己的行为我将来必须要做个交代。什么时候?死后,多么好的梦!在我死了以后,有人捉得住我那才叫妙呢。您去喊一只鬼手抓把灰给我看看。我们都是过来人,都是揭过芙蓉仙子的亵衣的人,让我们实话实说吧,这世上只有生物,既无所谓善,也无所谓恶。我们应当追求实际,一直深入下去,穷根究底,有什么大不了的!我们应当发现真理,根究到底,把真理掌握在自己的手里。那样它才会给你一种至上之乐。那样你才会充满信心,仰天朗笑。我绝不含糊,我。主教先生,永生之说只能哄哄小孩。哈!多么中听的诺言!您去信您的吧!骗鬼的空头支票。人是灵魂,人能成为天使,人能在肩胛骨上生出一对蓝翅膀。有福气的人能从这一个星球飘游到那一个星球,请您告诉我,这句话是不是德尔图良①说的。就算是吧。我们会变成星际间的蝗虫。还会看见上帝,等等,等等。什么天堂,胡说八道而已。上帝是种荒谬透顶的胡说。我当然不会在政府公报里说这种话。朋友之间,却不妨悄悄地谈谈。酒后之言嘛。为了天堂牺牲人世,等于捕雀捉影。为永生之说所愚弄!还不至于那么蠢。我是一无所有的。我就叫一无所有伯爵,元老院元老。在我生前,有我吗?否。在我死后,有我吗?否。我是什么呢?我不过是一粒和有机体组合起来的尘土。在这世界上我有什么事要做?我能选择,是受苦还是享乐。受苦,那会把我引到什么地方去呢?引到一无所有。而我得受一辈子的苦。享乐又会把我引到什么地方去呢?也是引到一无所有。而我可以享一辈子的乐。我已经选定了。不吃就得被吃。做牙齿总比做草料好些。那正是我聪明的地方。死了,听其自然,掘坟坑的人会来的,坟坑便是我们这种人的先贤祠,一切都会落入那大洞之中。完事大吉。一切皆空。全部清算完毕。那正是一切化为乌有的结局。请相信我,连死的份也都不会再有了。说什么还有一个人在等着我去谈话,我想起来就忍不住发笑。奶妈的创作。奶妈发明了妖怪来吓唬小孩,也发明了耶和华来吓唬大人。不,我们的明天不过是一片黑暗。在坟墓的后面,一无所有,这对任何人来说也都一样。即使你做过萨尔达尼拔②,即使你做过味增爵③,结果都一样归于乌有。这是真话。因此,享乐高于一切。当你还有你的时候,就应当利用这个你。老实说,我告诉您,主教先生,我有我的一套哲学,也有我的志趣相投之辈。我不让那些无稽之谈来牵着我的鼻子走。可是,对于那些下等人,那些赤脚鬼、穷光蛋、无赖汉,却应当另有一套东西。我们不妨享以种种传说、幻想、灵魂、永生、天堂、星宿。让他们大嚼特嚼,让他们拿去涂到他们的干①德尔图良(Tertullien,约 150—222),基督教反动神学家。 + ②萨尔达尼拔(Sardanapale),又译亚述巴尼拔(Assurbanipal,前 668—约前 626),亚述国王。 + ③味增爵(VincentdePaul,1581—1660),法国天主教遣使会和仁爱会的创始人。 + 面包上。两手空空的人总算也还捧着一位慈悲的上帝。那并不算过分。我也一点不反对,但为我自己,我还是要留下我的内戎先生。慈悲的上帝对平民来说,还是必要的。” + 主教鼓掌大声说: + “妙论,妙论!这个唯物主义,的确是一种妙不可言的东西,找都找不到。哈!一旦掌握了它,谁也就不上当了,谁也就不会再傻头傻脑,象卡托①那样任人放逐,象艾蒂安②那样任人用石头打死,象贞德③那样任人活活烧死了。获得了这种宝贵的唯物主义的人,也就有无事一身轻快感,并认为自己可以心安理得地霸占一切,地盘、恩俸、荣誉、正当得来或歪道得来的权力,可以为金钱违反信义,为功利背叛朋友,昧尽天良却还可以自鸣得意,等到酒肉消化完了,便往坟墓里一躺了事。那好舒服。我这些话并不是为您的,元老先生。可是我不能为您不庆贺。你们那些贵人,正如您所言,有一套自己的、为你们自己服务的哲学,一 套巧妙、高明、仅仅适用于有钱人、可以调和各种口味、增加人生乐趣、美妙无比的哲学。那种哲学是通过特殊钻探家从地下深处发掘得来的。一般平民以信仰上帝作为他们的哲学,正如穷人以栗子烧鹅肉当作蘑菇煨火鸡,而您并不认为那是件坏事,您的的确确是一位忠厚长者。” + ①卡托(Caton,前 234—149),罗马政治家和作家,贵族特权的拥护者,为监察官时非常严肃,不近人情。 + ②艾蒂安(Etienne),基督教的一个殉教徒,最后死在耶路撒冷。 + ③贞德(Jeanned'Arc),百年战争期间法国的民族女英雄,一四三一年被俘,被焚死。 + 九 妹妹口中的哥哥 + 要说明迪涅主教先生的家庭概况,要说明那两位圣女怎样用她们的行动、思想、甚至女性的那种易受惊吓的本能去屈从主教的习惯和意愿,使他连开口吩咐的烦琐也一概免了,我们最好是在这里把巴狄斯丁姑娘写给她幼年时的朋友波瓦舍佛隆子爵夫人的一封信转录下来。那封信在我们的手里:我仁慈的夫人,我们没有一天不谈到您。那虽然是我们的习惯,也还有另外一 个理由。您没有想到,马格洛大娘居然在洗刷天花板和墙壁时,发现了许多东西。现在我们这两间原来裱着旧纸、刷过灰浆的房间,和您那子爵府第相比,也不至于再有逊色。马格洛大娘撕去了全部的纸。那下面有些东西。我们用来晾衣服、没有家具的那间客厅,有十五尺高,十八尺见方,天花板和梁上都画了仿古金花,正和府上一样。从前当作医院时,它是用块布遮住了的。还有我们祖母时代的板壁。不过应当看看的是我的房间。马格洛大娘在那至少有十层的裱墙纸下发现了一些油画,虽然不好,却还过得去。画的是密涅瓦①封忒勒玛科斯②为骑士。另一幅园景里也有他。那花园的名字我一时想不起了。总之是罗马贵妇们在某一夜到过的地方。我还要说什么?那上面有罗马(这儿有个字,字迹不明)男子和妇女以及他们的全部侍从。马格洛大娘把一切都擦拭干净,今年夏天,她还要修整几道小小的破损之处,全部重行油漆,我的屋子就会变成一间名符其实的油画陈列馆了。她还在顶楼角落里找出了两只古式壁几。可是重上一次金漆就得花去两枚值六利弗的银币,这还不如留给穷人们用好些;并且式样也相当丑陋,我觉得如果能有一张紫檀木圆桌,我还更中意些。 + 我总是过得很快乐。我哥是那么仁厚,他把他所有的一切施给穷人和病人。我们手边非常拮据。到了冬天这地方就很苦。帮助穷人总是应当的。我们还算有火有灯。您瞧,这样已经很温暖了。 + 我哥有他独特的习惯。他在聊天时,老说一个主教应当这样。您想想,我们家里的大门总是不关的。任何人都可以闯进来,并且开了门就是我哥的屋子。他什么都不怕,连黑夜也不怕。照他的话说来,那是他特有的果敢。 + 他不要我替他担忧,也不要马格洛大娘替他担忧。他冒着各种危险,还不许我们露出危险的神色。我们应当知道怎样去领会他的想法。 + 他常在下雨时出门,在水里行走,在严冬旅行。他不怕黑夜,不怕陌生的道路和遭遇。 + 去年,他独自一人走到匪窟里去了。他不肯带我们去。他去了两个星期。一直到回来,他什么危险也没碰着。我们以为他死了,而他却健康得很。他还说你们看我遭抢了没有。他打开一只大箱子,里面装满了昂布伦天主堂的珍宝,是那些土匪送给他的。 + 那一次,在他回来时,我和他的几位朋友,到两里路远的地方去迎接他。我实在不得不稍微责备了他几句,可我很小心,只在车轮响动时才说话,免得旁人听见了。 + 起初,我常对自己说:“没有什么能阻拦他,他是真够叫人着急的。”到现在,①密涅瓦(Minerva),艺术和智悲之神。 + ②忒勒玛科斯(Telemaque),智勇之神。 + 我也习惯了。我常向马格洛大娘使眼色叫她不要惹他。他要冒险,让他去。我带着马格洛大娘回我的房间。我为他祷告。我睡我的觉。我安心,因为我知道,万一他遇到不幸,我也决不再活了。我要随着我的哥兼我的主教一同归天。马格洛大娘对她所谓的“他的粗心大意”却看不惯,但是到现在,习惯已成自然。我们俩一同害怕,一同祈祷,也一同睡去。魔鬼可以走进那些可以让它放肆的人家,但在我们家里,有什么可怕的呢?最强的那位时常是和我们同在一道的,魔鬼可以经过此地,但慈悲的上帝却常住在我们家。 + 这样我已经满足了。我的哥现在用不着再吩咐我什么,他不开口,我也能领会他的意思。我们把自己交给了天主。 + 这就是我们和一个胸襟开阔之人的相处之道。您问我关于傅家的历史,这事我已向我哥问明了。您知道,他知道得好清楚,记得好详细呵。因为他始终是一个非常忠实的保皇党。那的确是卡昂税区一家很老的诺曼底世家。五百年来,有一个拉乌尔?德?傅,一个让?德?傅和一个托马?德?傅,都是贵人,其中一个是罗什福尔采地的领主。最末的一个是居伊?艾蒂安?亚历山大,他当过营长,在布列塔尼的轻骑队里也相当有地位。他的女儿玛丽?路易丝嫁给了法兰西世卿,法兰西警卫军大佐和陆军中将路易?德?格勒蒙的儿子阿德利安?查理?德?格勒蒙。他们的姓,傅,有三种写法:Faux,Fauq,Faoucq。 + 仁慈的夫人,请您代求贵戚红衣主教先生为我们祷告。至于您亲爱的西尔华尼,她没有浪费她亲近您的短暂时间来和我写信,那是对的。她既然身体好,也能依照尊意工作,并且仍旧爱我,那已是我所希望的一切了。我从尊处得到她的问候,我感到幸福。我的身体并不太坏,可是一天比一天消瘦下去了。再谈,纸已写满了,我只得住笔。一切安好。 + 巴狄斯丁一八??年,十二月十六日,于迪涅。再者:令嫂仍和她令郎的家眷住在此地。 + 您的侄孙真可爱。您知道,他快五岁了!昨天他看见一匹马走过,腿上裹了护膝,他说:“它膝头上是什么?”那孩子,他是那样逗人喜欢。他的小兄弟在屋子里拖着一把破扫帚当车子,嘴里还喊着:“走!” + 从信里我们可以看出,那两位妇人知道用女性所特有的那种比男子更了解男子的天才,去曲意顺从主教的生活方式。迪涅那位主教有着那种始终不渝、温和敦厚的神情风度,有时作出一些伟大、果敢、辉煌的行动,却仿佛连他自己也不觉得。她们为那些事提心吊胆,但还是让他去做。马格洛大娘有时试着在事先劝劝,但从不在事情进行时或事后多话。事情开始了,她们就从不阻拦他,连一点神色也不表露。某些时候,她们只似懂非懂地觉得他是在尽主教之职;他自己并不说出,甚至连他自己也不一定有那种感觉,因为他的那种赤子之心是那样淳朴,因此,她们在家里不过是两个黑影。她们被动地服侍着他,如果为了服从应当退避,她们便退避。由于一种可喜的、体贴入微的本能,她们知道,某种关切反倒会使他感到为难。我不说她们能了解他的思想,但是她们了解他的性格,所以即便知道他是在危险中,也只有不闻不问。她们把他托付给了上帝。 + 而且巴狄斯丁还常说,正如我们刚才念过的,她哥的不幸也就等于她自己的末日。马格洛大娘没那样说,但她心里也有数。 + 十 主教访问隐士 + 在前面几页我们提到过一封信,在那信上所记日期过后不久的一个时期里,他又做了一件事,这件事情,在全城人的心目中,比上次他在那强人出没的山中旅行,更显得冒失。 + 在迪涅附近的一个乡村里,住着一个与世隔绝的人。那人曾经当过??让我们立即说出他那刺耳的名称:国民公会①代表。他姓 G.。 + 在迪涅那种小天地里,大家一谈到国民公会的那位 G.代表,便有谈虎色变之感。一个国民公会代表,那还了得!那种东西是大家在以“你”和“公民”相称的年代里才有的。那个人几乎就是妖魔鬼怪。他虽然没有投票判处国王死刑,但是也差得不远。那是个类似弑君的人,暴虐蛮横,令人恐骇的。正统的王爷们回国②后,怎么会没有人把他告到特别法庭里去呢?不砍他的头,也未尝不可,是的,我们应当宽大;但是给他一个终身放逐,总是应当的吧?真是怪事!诸如此类的话。并且他和那些人一样,是个无神论者——这些全是鹅群诋毁群鹰的妄谈。 + G.究竟是不是雄鹰呢?如果我们从他那孤独生活中所特有的蛮性上着眼,他的确是。由于他没有投票赞成处决国王,所以次次的放逐令上都没有他的名字,他也就还能留在法国。 + 他的住处离城有三刻钟的路程,远离一切村落,远离一切道路,不知是在哪个荒山野谷、人迹不到的角落里。据说他在那里有一块地、一 个土洞、一个窝巢。没有邻居,甚至没有过路的行人。那条通向他那里去的小路,自从他住在那山谷里以后,也就隐没在荒草中了。大家提起他那住处,如同谈到刽子手的家。 + 可是主教不能忘记,他不时朝着这位老代表的住处,有一丛树木标志着的山谷远远眺望,他还说:“那儿还有个孤独的灵魂。”内心中,他还说:“我迟早得去看他一次。”但老实说,那个念头在起初虽然显得自然,经过一番思考之后,他却又好象觉得它很奇怪,觉得这是做不到的,几乎是不能容忍的。因为实际上他也抱有一般人的观点,那位国民公会代表使他无端地产生一种近似仇恨的恶感,也就是“格格不入”这四个字最能表达的那种恶感。可是羔羊的癣疥应当使牧人却步吗?不。况且那又是怎样的一头羔羊! + 那位慈祥的主教为之犹豫不决。有时,他往那个方向走去,随即又转了回来。 + 一天,有个在那窑洞里伺侯那位 G.代表的少年牧人来到城里找医生,说那老贼已经病到垂危之际,他得了瘫痪症,过不了夜。这话在城里传开了,许多人说:“谢天谢地。”主教立即拿起他的拐杖,披上他的外衣(因为,正如我们说过的,他的道袍太旧了,也因为晚风将起),径直走了。当他走到那无人齿及的地方,太阳正往西沉,几乎碰到了地平线。他的心怦怦跳动,他知道离那兽穴已经不远。他跨过一条沟,越①由人民大会选举产生的,国民公会成立于一七九二年九月二十一日。会议宣布法兰西共和国的成立,判处国王路易十六和王后玛丽?安东尼特极刑。 + ②一八一四年,拿破仑帝国被颠覆,王室复辟,路易十八回国称王。 + 过一道篱,打开栅门,走进一个荒芜的菜圃,非常大胆地赶上几步,到了那荒地的尽头,在一大堆荆棘丛的后面,他发现了那窝巢。 + 那是一所极其低陋狭窄而又整洁的木屋,前面墙上钉着一行葡萄架。门前,一个白发老人坐在一张有小轮子的旧椅子(农民的围椅)里,正对着太阳微露笑意。 + 在那坐着的老人身旁,立着个少年,就是那牧童。他正把一罐牛奶递给那老人。 + 主教方自张望,那老人已高声说: + “谢谢,我不再需要什么了。”同时,他把笑脸从太阳转向那孩子。 + 主教往前走,那坐着的老人,听见他的脚步声转过头来,如闻空谷足音,脸上露出极端惊讶的神色。 + “自从我住到这儿以来,”他说,“这还是第一次有人上我的门。先生,您是谁?” + 主教回答: + “我叫卞福汝?米里哀。” + “卞福汝?米里哀!我听人说过这名字。难道老乡们称为卞福汝主教的就是您吗?” + “就是我。” + 那老人面露微笑,接着说: + “那么,您是我的主教了?” + “有点儿象。” + “请进,先生。”那位国民公会代表把手伸给主教,但是主教没和他握手,只说道:“我很高兴上了人家的当。看您的样子,您一点也没有玻”“先生,”那老人回答,“我会好的。”他停了一会,又说:“我过不了三个钟头,就要死了。” + 随后他又说: + “我略通医道,我知道临终的情形是怎样的。昨天我还只感到脚冷;今天,冷到膝头了;现在我觉得已冷到了腰,等到冷到心头,我就停摆了。夕阳无限好,不是吗?我叫人把我推到外面来,为的是要对这一切景物,作最后一次眺望。您可以和我谈话,我一点也不会累。您赶来看一个快死的人,这非常好。这种时刻,能有一两个人在场,确是难得。妄想人人都有,我则希望能拖到黎明。但是我知道,我只有不到三个钟头的时间了。到那时,天已经黑了。其实,有什么关系!死是一件简单的事。并不一定要在早晨。就这样吧。我将披星戴月而去。” + 老人转向那牧童说: + “你,你去睡吧。你昨晚已经守了一夜。你累了。”那孩子回到木屋里去了。 + 老人目送着他,仿佛正对自己说: + “他入睡,我长眠。同是梦中人,正好作伴。”主教象是受到感动,其实却不然。他不认为这样死去的人可以悟到上帝。让我们彻底说清楚,因为宽大胸怀中所含的细微矛盾也一样是该指出来的。平时遇到这种事,如果有人称他为“主教大人”,他认为不值一笑,可是现在没人称他为“我的主教”,却又觉得有些唐突了他,并且差点想反过来称这位老人为“公民”了。他在反感中突然涌起了一 种想对人亲切的心情,那种心情在医生和神甫中是屡见不鲜的,在他说来却是绝无仅有的。无论如何,这个人,这个国民公会代表,这位人民喉舌,总当过一时的人中怪杰,主教觉得自己的心情忽然严峻起来,这在他一生中也许还是头一回。 + 那位国民公会代表却用一种谦虚诚挚的态度觑着他,从这里我们可以看出,其中含有那种行将物化的人的卑怯神情。而主教呢,他平素虽然约束自己,不起窥测别人隐情的心思,因为在他看来,蓄意窥测旁人隐情,即同对人存心侵犯差不多,可是对这位国民公会代表,却不能不细心加以研究;这种不是由同情心出发的动机,如果去对待另一个人,他也许会受到自己良心的谴责。但是一个国民公会代表,在他的思想上多少有些法外人的意味,甚至就连慈悲的法律也是不予保护的。 + G.,这位八十岁的魁梧老叟,态度镇定,躯干几乎直挺,声音宏亮,足以使生理学家叹为观止。革命时期有过许多那样的人物,都和那时代相称。从这个老人身上,我们可以想见那种经历过千锤百炼的人。离死不远,他还康健如故。他那明炯的目光、坚定的语气、两肩强健的动作,都足以使死神望而却步。伊斯兰教中的接引天使阿慈拉伊尔①也会望而生畏,以为走错了门呢。G.的样子好象离死不远,那只是因为他自己愿意那样的缘故罢了。他在临终时却仍能自主,只是两条腿僵了,他只有那一部分被幽魂扼制住了。两只脚死了,也凉了,头脑却还活着,还保存着生命的全部活力,并且好象还处在精神焕发的时光。G.在这一严重的时刻,正和东方神话中的那个国王相似,上半部是肉身,下半部是石躯。他旁边有块石头。主教便在那上面坐下。他们突然开始了对话。 + “我祝贺您,”他用谴责的语气说,“您总算没有投票赞成判处国王死刑。”国民公会代表好象没有注意到“总算”那两个字所含的尖刻意味。 + 他开始回答,脸上的笑容全消隐了: + “别祝贺得过头了,先生。我曾投票表决过暴君的末日。”那种刚强的语调是针对着严肃的口吻而发出的。 + “您这话怎讲?” + “我的意思是说,人类有一个暴君,那就是蒙昧。我投票表决了这个暴君的末日。王权就是从那暴君处产生的,王权是一种伪造的权力,只有知识才是真正的权力。人类只应接受知识的统治。”“那么,良心呢?”主教接着说。 + “那是同一回事。良心,是存在于我们心中与生俱有的那么一点知识。” + 那种观点对卞福汝主教来说是极为新奇的,他听了不免有些诧异。国民公会代表继续说:“关于路易十六的事,我没有赞同。我不认为我有处死一个人的权利;但是我觉得我有消灭那种恶势力的义务。我表决了那暴君的末日,①阿慈拉伊尔(Azrael),伊斯兰教四大天使之一,专司死亡事宜。 + 这就是说,替妇女消除了卖身制度,替男子消除了奴役制度,替幼童消除了不幸生活。我在投票赞成共和制度时也就赞成了那一切。我赞助了博爱、协和、曙光!我出力打破了邪说和谬见。邪说和谬见的崩溃造成了光明。我们这些人推翻了旧世界,旧世界就好象一个苦难的瓶,一旦翻倒在人类的头上,就成了一把欢乐的壶。” + “光怪陆离的欢乐。”主教说。 + “您不妨说是多灾多难的欢乐,如今,自从那次倒霉的所谓一八一 四年的倒退以后,也就可称作是昙花一现的欢乐了。可惜!那次的事业是不全面的,我承认;我们在现实领域中摧毁了旧的制度,在思想领域中却没能把它彻底铲除。消灭恶习是不够的,还必须转移风气。风车已经不存在了,风却还存在。”“您做了的摧毁工作。摧毁可能是有益的。可是对夹有怒气的摧毁行为,我却不敢恭维。” + “正义是会有愤怒的,主教先生,并且正义的愤怒是一种进步的因素。没关系,无论世人怎样说,法兰西革命是从基督诞生以来人类向前走得最有力的一步。不全面,当然对,但它是多么卓绝。它揭开了社会上的一切黑幕。它涤荡了人们的积习陋气,它起了安定、镇静、开化的作用,它曾使文化的洪流漫卷世界。它是仁慈的。法兰西革命是人类至高无上的光荣。”主教不禁嗫嚅:“是吗?九三①!”国民公会代表直从他的椅子上竖立起来,容貌严峻,几乎是悲壮的,尽他临终前的全身气力,大声喊着说:“呀!对!九三!这个字我等了许久了。满天乌云密布了一千五百年。过了十五个世纪之后,乌云散了,而您却要加罪于雷霆。”那位主教,嘴里虽不一定肯承认,却感到心里有什么东西被他击中了。不过他仍然不动声色。他回答:“法官说话为法律,神甫说话为慈悲,慈悲也不过是一种比较高级的法律而已。雷霆的一击总不应弄错目标吧。”他又聚精会神觑着那位国民公会代表,加上一句:“路易十七②呢?”国民公会代表伸出手来,把住主教的胳膊:“路易十七!哈。您在替谁流泪?替那无辜的孩子吗?那么,好吧。我愿和您同声一哭。替那年幼的王子吗?我却还得要考虑考虑。在我看来,路易十五的孙子③是个无辜的孩子,他唯一的罪名是做了路易十五的孙子,以致在大庙殉难;卡图什④的兄弟同样是一个无辜的孩子,他唯一 的罪名是做了卡图什的兄弟,以致被人捆住胸脯,吊在格雷沃广场,直到气绝,难道那孩子就死得不惨?” + “先生,”主教说,“我不喜欢把这两个名字联在一起。”“卡图什吗?路易十五吗?您究竟在替这两个中的哪一个鸣冤叫屈呢?” + 一时相对无言。主教几乎后悔多此一行,但是他觉得自己隐隐地、异常地被他动摇了。 + 国民公会代表又说:“咳!主教先生,您不爱真理的辛辣味儿。而①一七九三年的简称,是革命进入高潮、处死国王路易十六的那年。 + ②路易十七是路易十六的儿子,十岁时(1795)死在狱中。 + ③指路易十七。 + ④卡图什(Cartouche,1693—1721),人民武装起义领袖,一七二一年被捕,被判处死刑。 + 从前基督却不象您这样。他拿条拐杖,清除了圣殿。他那条电光四射的鞭子简直就是真理的一个无所顾忌的发言人。当他喊道‘让小孩子到我这里来!’①时,他对于那些孩子,并没有厚此薄彼之意。他对巴拉巴②的长子和希律③的储君能同眼看待而无动于衷。先生,天真本身就是王冕。天真不必有所作为也同样是高尚的。它无论是穿着破衣烂衫或贵为公子王孙,都是同样尊贵的。” + “那倒是真话。”主教轻轻地说。 + “我要坚持下去,”国民公会代表 G.继续说,“您对我提到过路易十七。让我们在这个问题上面取得一致的看法。我们是不是为一切在上层和在下层的无辜受害者、殉难者、孩子们同声而哭呢?我会和您一道哭的。不过,我已对您说过,我们必须追溯到九三年之前。我们的眼泪应当从九三年之前流起。我一定和您同哭王室的孩子,如果您也和我同哭平民的幼童的话。” + “我为他们全体哭。”主教说。 + “同等分量吗?”G.大声说,“这天平如果倾斜,也该是偏向平民一边吧。平民受苦的年代更长久。” + 又是一阵沉寂。打破沉寂的还是那位国民公会代表。他抬起身子,倚在一只手肘上,用他的拇指和曲着的食指微捏着腮,正如我们在盘问和审讯时无意中作出的那样,他向主教提出质问,目光中蓄满了临终时的全部气力。那几乎是一场爆炸。 + “是呀,先生,平民受苦的日子够长的了。不但如此,您走来找我,问这问那,和我谈到路易十七,目的又何在?我并不认识您呀。自从我住在这儿,孤零零的我在这围墙里过活,两只脚从不出门,除了那个帮我的少年之外谁也不见面。的确,我的耳朵也偶尔听到过您的名字,我还应当说,您的名声并不太坏,但是那并不能说明什么问题,聪明人自有各种花招来欺哄一个忠厚老实的平民。说也奇怪,我刚才没有听到您车子的声音,也许您把它留在岔路口那面的树丛后了吧。我并不认识您,您听见了吧。您刚才说您是主教,但是这话一点也不能对我说明您的人格究竟如何。我只得重复我的问题。您是谁?您是一个主教,那就是说一个教门里的王爷,那些装了金,穿着铠甲,吃利息,坐享大宗教款的人中的一个——迪涅的主教,一万五千法郎的正式年俸,一万法郎的特别费,合计二万五千法郎——,有厨子,有随从,有佳肴美酒,星期五 吃火鸡,仆役侍前顾后,高视阔步,坐华贵的轿式马车,住高楼大厦,捧着跣足徒步的耶稣基督做幌子,高车驷马,招摇过市,主教便是这一 类人中的一个。您是一位高级主教,年俸、宫室、骏马、侍从、筵席、人生的享乐,应有尽有,您和那些人相同,也有这些东西,您也和他们一样,享乐受用,很好,不过事情已经很清楚了,但也可能还不够清楚;您来到这里,也许曾发了宏愿,想用圣教来劝导我,但是您并没有教我认清您自身的真正品质。我究竟是在和什么人谈话?您是谁?” + ①“让小孩子到我这里来”,这是耶稣对那些不许孩子听道的教徒说的话。原文是拉丁文 Si-niteparvulos。 + (见《圣经?马太福音》第十九章) + ②巴拉巴(Barabbas)是和耶稣同时判罪的犯人。 + ③希律(Herode),纪元前犹太国王。 + 主教低下头,回答:“我是一条蛆。”①“好一条坐轿车的蛆!”国民公会代表咬牙说道。这一下,轮到国民公会代表逞强,主教低声下气了。主教和颜悦色,接着说:“先生,就算是吧。但要请您替我解释解释:我那辆停在树丛后面不远的轿车,我的筵席和我在星期五吃的火鸡,我的二万五千法郎的年俸,我的宫室和我的侍从,那些东西究竟怎样才能证明,慈悲不是一种美德,宽厚不是一种做人应尽之道,九三年不是伤天害理的呢?” + 国民公会代表把一只手举上额头,就仿佛要拨开一层云雾。“在回 答您的话之前,”他说,“我要请您原谅。我刚才失礼了,先生。您是在我家里,您是我的客人。我应该以礼相待。您讨论到我的思想,我只应当批驳您的论点就行了。您的富贵和您的享乐,在辩论当中,我固然可以用来作为反击您的有力武器,但毕竟有伤忠厚,还不如弃之不用。我一定不再提那些事了。” + “我对您很感谢。”主教说。 G,接着说:“让我们回到您刚才向我要求解释的方面去吧。我们刚才谈到什么地方了?您刚才说的是??您说九三年伤天害理吗?” + “伤天害理,是的,”主教说,“您对马拉①朝着断头台鼓掌怎样看?” + “您对博须埃②在残害新教徒时高唱圣诗,又怎样想呢?”那回答是针锋相对的,锐如利剑。主教为之一惊,他绝想不出一句回驳的话,但是那样提到博须埃,总使他感到不大痛快。再高明的人也有他们的偶像,有时还会由于别人不尊重逻辑而隐痛在心。 + 国民公会代表开始喘气了,他本来已是气力不济,加以临终时呼吸阻塞,说话的声音便成了断断续续的了,可是他的眼睛表现出他的神志还是完全清醒的。 + 他继续说: + “我很乐意让我们再随便谈几句。那次革命,总的说来,是获得了人类的广泛赞扬的,只可惜九三年成了一种口实。您认为那是伤天害理的一年,但就整个专制政体来讲呢,先生?卡里埃③是个匪徒;但是您又怎样称呼蒙特维尔①呢?富基埃—泰维尔②是个无赖;但是您对拉莫尼翁—巴维尔③有什么看法呢?马亚尔④罪大恶极,但请问素尔—达瓦纳⑤呢,①这一句原文为拉丁文“Vermissum”。 + ①马拉(Marat,1743—1793),法国政论家,雅各宾派领袖之一,罗伯斯庇尔的忠实战友,群众称他为“人民之友”。 + ②博须埃(Bossuet,1627—1704),法国天主教的护卫者,是最有声望的主教之一。 + ③卡里埃(Carrier,1756—1794),国民公会代表,一七九四年被处死刑。 + ①蒙特维尔(Montrevel),十七世纪末法国朗格多克地区新教徒的迫害者。 + ②富基埃—泰维尔(Fouguier—Tinville),法国十八世纪末革命法庭的起诉人,恐怖时期尤为有名,后被处死。 + ③拉莫尼翁—巴维尔(Lamoignon-Baville,1648—1724),法国朗格多克地区总督,一六八五年血腥镇压新教徒。 + ④马亚尔(StanislasMaillard),以执行一七九二年九月的大屠杀而臭名昭著。 + 杜善伯伯⑥横蛮凶狠,但对勒泰利埃神甫⑦,您又怎样评价呢?茹尔丹屠夫⑧是个魔怪,但却还比不上卢夫瓦⑨侯爷。先生呀先生,我为大公主和王后玛丽?安东尼特叫屈,但是我也为那个信仰新教的穷妇人叫屈,先生,那穷妇人在一六八五年大路易当国的时候,正在给她孩子喂奶,却被人家捆在一个木桩上,上身一丝不挂,孩子被丢在一边;她乳中充满乳汁,心中充满怆痛;那孩子饥饿不堪,脸色惨白,瞧着母亲的乳,有气无力地哭个不停;刽子手却对那做母亲和乳娘的妇人说:‘改邪归正!’要她在她孩子的死亡和她信的死亡中选择一种,教一个做母亲的人受那种眼睁睁的生离死别的苦痛,您觉得还有什么可说吗?先生,请记住这一点,法国革命自有它的理论根据。它的愤怒在未来的岁月中是会被人谅解的。它的成果便是一个改变了的世界。从它的非常猛烈的鞭挞中,产生出了一种对人类的爱抚。我得少说话,我不再开口了,我的理由太充足。况且我就要咽气了。” + 随后这位国民公会代表的眼睛不再望向主教,他只用这样几句话来结束了他的思想:“是呀,进步的暴力便叫做革命。暴力过去以后,人们就认识到这一点:人类受到了斥责,然而却前进了。” + 国民公会代表未尝不知道,刚才他已把主教心中的堡垒接二连三地夺过来了,可是还留下一处,那一处是卞福汝主教防卫力量的最后源泉,卞福汝主教说了这样一句话,几乎把舌战开始时的激烈态度又全流露出来了:“进步应当信仰上帝。善不能由背弃宗教的人来体现,无神论者是人类恶劣的带路人。”那个年迈的人民代表没有回答。他颤抖了一阵,望着天,眼睛里慢慢泌出一框眼泪,眶满以后,那眼泪便顺着他青灰色的面颊淌了下来,他低微地对自己说,几乎语不成声,目光迷失在穹苍里:“呵你!呵理想的境界!唯有你是存在的!”主教受到一种难以言喻的感动。一阵沉寂之后,那老人翘起一个指头,指着天说:“无极是存在的。 + 它就在那里。如果无极之中没有我,我就是它的止境;它也就不成其为无极了;换句话说,它就是不存在的了。因此它必然有一个我。无极中的这个我,便是上帝。”那垂死的人说了最后几句话,声音清朗,还带着灵魂离开肉体时那种至乐的颤动,好象他望见了一个什么人一般。语声停了后,他的眼睛也闭上了。一时的兴奋已使他精力涸竭。剩下的几个钟头,他明显已在顷刻之间耗尽了。他刚才说的那几句话已使他接近了那位生死的主宰。最后关头到了。 + ⑤索尔—达瓦纳(Saulx-Tavannes),达瓦纳的贵族,一五七二年巴托罗缪屠杀案的主谋之一。一。 + ⑥杜善伯伯(lepereDuchene),原是笑剧中一个普通人的形象,后来成了平民的通称。 + ⑦勒泰利埃神甫(lepereLetellier,1643—1719),耶稣会教士,路易十四的忏悔神甫,曾使路易十四毁坏王家港。 + ⑧马蒂厄?儒弗(MathieuJouve,1749—1794),一七九一年法国阿维尼翁大屠杀的主犯,后获得屠夫菇尔丹的称号。 + ⑨卢夫瓦(Louvois,1641—1691),路易十四的军事大臣,曾攻占巴拉丁那(今西德法尔茨)。 + 主教懂得,时间紧迫,他原是以神甫身份来到此地的,他从极端的冷淡一步步地踏入了极端的冲动,他望着那双闭了的眼睛,他抓住那只枯皱冰冷的手,弯腰向那临终者说:“这个时刻是上帝的时刻了。如果我们只这样相聚,您不感到遗憾吗?” + 国民公会代表眼睛重睁。眉宇间呈现出一种严肃而阴郁的神情。 + “主教先生,”他说,说得极慢,那不仅是因为气力不济,多半还因为他心灵的高傲,“我在深思力学和观察之中度过了这一生。我六十 岁的时候祖国号召我去治理国家事务。我服从了。当时有许多积弊,我进行了斗争;有暴政,我消除了暴政;有人权和法则,我都公布了,也作了宣传。国土被侵犯,我保卫了国土;法兰西受到威胁,我献出我的热血。我从前并不富裕,现在也没钱。我曾是政府领导人之一,当时在国库的地窖里堆满了现金,墙头受不住金银的压力,随时都会坍塌,以致非用柱来支撑不可,我却在枯树街吃二十二个苏一顿的饭。我帮助了受压迫的人,医治了人们的痛苦。我撕毁了祭坛上的布毯,那是真的,不过是为了裹祖国的创伤。我始终维护人类走向光明的步伐,有时也反抗过那种无情的进步。有机会,我也保护过我自己的对手,就是说,你们这些人。在佛兰德的比特罕地方,正在墨洛温王朝①夏宫的旧址上,有一座乌尔班派的寺院,就是波里尔的圣克雷修道院,那就是我在一七九 三年救出来的。我尽了我力所能及的职责,我行了我所能行的善事。此后我却被人驱逐,搜捕,通缉,迫害,诬蔑,讥诮,侮辱,诅骂,剥夺了公民权。多年以来,我白发苍苍,只感到有许多人自以为有权轻视我,那些愚昧可怜的群众认为我面目可憎。我并不恨人,却乐于避开别人的恨。现在,我八十六岁了,快死了。您还来问我什么呢?” + “我来为您祝福。”主教说。 + 他跪了下来。等到主教抬起头来,那个国民公会代表已经面带庄严的神色,气绝而亡。 + 主教回到家中,深深沉浸在一种难以名状的思绪里。他整整祈祷了一夜。第二天,几个胆大好奇的人,费尽心机要引他谈论那个 G.代表,他却只指了指天。从此以后,他对小孩和有痛苦的人更加仁慈亲切。 + 任何言词,只要影射到“G.老贼”,他就一定会陷入一种异样不安的状态中。谁也不能说,那样一颗心在他自己心前的昭示,那伟大的良心在他意识上所起的反应,对他日趋完善的精神会毫无影响。 + 那次的“乡村访问”当然会给本地的那些小集团提供饶舌的机会:“那种死人的病榻前面也能成为主教涉足的地方吗?明明没有什么可以感化的指望。那些革命党人全是屡教不改,违反圣教的。那,又何必到那里去呢?那里有什么可看的呢?真是好奇,魔鬼接收灵魂,他也要去看看。” + 一天,有个阔寡妇,即那些自作聪明的冒失鬼中的一个,问了他这样一句俏皮话:“我的主教,有人要打听,大人您在什么时候能得到一①墨洛温(Merovee),法国第一个王朝,从五世纪中叶到八世纪中叶。 + 顶红帽子①。”“呵!呵!多么高贵的颜色,”主教回答,“幸亏鄙视红帽子的人也还崇拜红法冠呢。” + ①戴红帽子,为参加革命的意思。 + 十一 心里面的委屈 + 如果我们仅凭以上所述作出结论,便认为卞福汝主教是个“有哲学头脑的主教”或是个“爱国的神甫”,我们就很可能犯错误。他和国民公会 G.代表的邂逅——几乎可以说是他们的结合,只不过给他留下了一 种使他变得更加温良的惊叹的回忆。如此而已。卞福汝主教虽然是个政治中人,我们也许还该在这里很简略地谈谈他对当代的国家大事所抱的态度,假定卞福汝主教也曾想过要抱一种态度的话。 + 让我们把几年前的一些事回顾一下。米里哀先生升任主教不久,皇上便封了他为帝国的男爵,同时也封了好几个别的主教。我们知道,教皇是在一八○九年七月五日至六日的夜晚被拘禁的,因为此事,米里哀先生被拿破仑召到巴黎去参加法兰西和意大利的主教会议。一八一一年六月十五日,在红衣主教斐许主持下,召开了第一次会议。那次会议是在圣母院开的。九十五个主教参加了会议,米里哀先生是其中之一。但是他只参加过一次大会和三四次特别会议。他是一个山区的主教,平时过着僻陋贫困的生活,和自然环境接近惯了,他觉得他给那些达官贵人带来了一种改变会场气氛的见解。他匆匆忙忙地回到迪涅去了。有人问他为什么回去得那样仓促,他回答:“他们见了我不顺眼。外面的空气老跟着我跑到他们那儿去。我在他们的眼里就好象是一扇带不上的门。” + 另一次,他还说: + “有啥办法?那些先生们全是王子王孙。而我呢,只是一个干瘪瘪的乡下主教。” + 他不时作怪,确是惹人嫌,有一晚,他在一个很有地位的同行家里,说出了这些话,也许是脱口而出的:“这许多漂亮的挂钟!这许多漂亮的地毯!这许多漂亮的服装!这些东西好不麻烦!我真不愿意听这些累赘的东西时常在我的耳边喊‘许多人还在挨饿呢!许多人还在挨冻呢!穷人多着呢!穷人多着呢!’”我们顺便提提,对华贵物品的仇恨也许是不聪明的,因为这种仇恨隐藏着对艺术的敌意。不过,对教会中的人而言,除了表示身份和举行仪式之外,使用华贵物品是错误的。那些东西仿佛能揭露那种并非真心真意解囊救贫的品行。教士养尊处优,就是离经叛道。教士应该接近穷人。一个人既然日日夜夜和一切灾难、苦痛、贫困相接触,难道在他自己身上竟能够不象在劳动中沾上一些尘土那样,一点也不带那种圣洁的清寒味吗?我们能想象一个人站在烈火旁而不感到热吗?我们能想象一 个工人经常在熔炉旁工作,而能没有一根头发被烧掉,没有一个手指被熏黑,脸上没有一滴汗珠,也没有一丁点儿灰屑吗?教士,尤其是主教,他的仁慈最起码的保证,便是清苦。这一定就是迪涅主教先生的见解了。 + 我们还不应该认为他在某些棘手问题上,会愿意去迎合那种所谓的“时代的思潮”。他很少参加当时的神学争辩,对政教的纠纷问题,他也不发表意见;但是,如果有人向他紧紧追问,他就好象是偏向罗马派方面而并不属于法国派①。我们既然是在描写一个人,并且不愿有所避讳。我们就该补充说明,他对那位气势渐哀的拿破仑,可以说是冷漠的。一八一三年②以后,他曾经参与,或鼓掌赞同过各种反抗活动。拿破仑从厄尔巴岛③回来时,他拒绝到路旁去欢迎他,“在百日帝政”④期间,也不曾替皇上布置公祭。 + 除了他的妹妹巴狄斯丁姑娘以外,他还有两个亲兄弟,一个当过将军,一个当过省长。他和他们通信频繁。有个时期,他对于第一个兄弟很冷淡,因为那个兄弟原来镇守普罗旺斯⑤。戛纳登陆时那位将军统率一 千二百人去截击皇上,却又有意放他走过。另外那个兄弟,当过省长,为人忠厚自持,隐居在巴黎卡塞特街,他给这个兄弟的信就有比较多的手足之情。 + 由此可见,卞福汝主教也偶尔有过他的政见、他的苦闷、他的隐情。当年爱憎的暗影也曾穿过他那颗温和宽厚、追求永恒事物的心。当然,象他那样的人最好是不带政治见解。请不要把我们的意思歪曲了,我们所说的“政治见解”并非是指那种对进步所抱的热望,也不是指我们今天构成各方面真诚团结的内在力量的那种卓越的爱国主义、民主主义和人道主义思想,这些不能混为一谈。我们不必深究那些只间接涉及本书的内容的问题,我们只简单地说,假使卞福汝不是保王党,假使他的目光从来一刻也未离开过他那种宁静的信仰,并能超然于人世的风云变幻之外,能在信仰中看清真理、公正、慈善等三道纯洁光辉的放射,那就更加美满了。 + 尽管我们承认上帝之所以创造卞福汝主教,绝不是为了一种政治作用,也仍然能够了解和钦佩他为人权和自由所提出的抗议,即他对那位不可一世的拿破仑所抱的高傲的对立态度和公正而危险的抗拒行为。但藐视一个失势的人究竟不如藐视一个得势的人那样使人快意。我们只爱具有危险性的斗争,在任何情况下,只有最初参加斗争的战士才有最后歼灭敌人的权利。谁不曾在全盛时期作过顽强的抗议,等到垮台之时,谁就不该拥有发言权。只有控诉过胜利的人才有权裁判失败。至于我们,在上天不佑、降以大祸时,我们只能听之任之。一八一二年开始解除我们的武装。一八一三年,那个素来缄默不语的立法机构,在国难临头时居然勇气焕发,大放厥词,这样只能令人齿冷,何足鼓掌称快?一八一 四年,元帅们出卖祖国,上院从一个污池掉进另一个污池,始则尊为神人,继乃横加侮渎,从来都崇拜偶像,忽又中途变节,反唾其脸,这些事理应引起我们的反感;一八一五年,最后的灾难步步进逼了,法兰西①从一六八二年起,法国天主教以国内教士代表会议为处理宗教事务的最高权力机关,不完全接受罗马教皇的命令,为法国派(gallican),主张完全依附教皇的称罗马派(ultramontain)。直到一八七 0年,法国天主教才完全依附于罗马教皇。 + ②一八一三年,拿破仑政权已濒于崩溃,英、俄筹七国联军进逼,国内工商业发生危机,由于缺乏劳动力,增加税收,大量征兵,资产阶级开始动摇,人民纷纷逃避兵役,老贵族也乘机阴谋恢复复旧王朝。 + ③拿破仑在一八一四年四月六日被迫退位后,即被送往厄尔巴岛。王朝复辟,执行反动政策,人民普遍不满。拿破仑乘机于一八一五年三月一日在南方港口茹安(在戛纳附近)登陆,进入巴黎。 + ④拿破仑三月一日在茹安登陆,六月二十二日第二次退位,那一时期叫“百日帝政”。 + ⑤普罗旺斯(Provence),法国南部一剩因大祸临头而危险了,滑铁卢似乎也展开在拿破仑眼前隐约可辨了;那时,军士和人民对那个祚运已尽的人的壮烈欢呼绝无什么令人发叹的,并且,先不论那个专制魔王是个怎样的人,值此千钧一发之际,这伟大的民族和这伟大的人杰间的紧密团结总还是庄严动人的,象迪涅主教那样一个人的心,好象不应该熟视无睹。 + 除此而外,无论对什么事,他从来总是正直、诚实、公平、聪明、谦虚、持重的,好行善事,关心别人,这也是一种品德。他是一个神甫,一个贤达之士,也是一个伟丈夫。他的政治见解,我们刚才已经批评过了,我们也差不多还可以严厉地指责他,可是应当指出,他尽管抱有那种见解,和我们这些现在在此地谈话的人相比,也许还更加厚道,更加平易近人。市政府的那个门房,当初是皇上安派在那里的。他原是御林军里的一名下级军官,奥斯特里茨①战役勋章的获得者,一个象鹰那样精悍的拿破仑信徒。那个倒霉鬼会时常于随意中吐出一些牢骚话,那是被当时的法律视为“叛逆言论”的。自从勋章上的皇帝侧面像被取消之后,为了避免佩带他那十字勋章,他的衣着就从此不再“遵照规定”(照他的说法)。他亲自把皇上的御影从拿破仑给他的那个十字勋章上虔诚地摘下来,那样就留下了一个洞,他却绝不愿以其他的饰物来代替。他常说:“我宁死也不愿在我的胸前挂上三个癞蛤蟆!”他故意大声挖苦路易十八②。他又常说:“扎英国绑腿的烂脚鬼!快带着他的辫子到普鲁士去吧!”他以能够那样把他最恨的两个东西,即普鲁士和英格兰,连缀在一句骂人的话里而感到得意洋洋。他骂得太起劲了,以致丢了差事。他带着妻子儿女,无衣无食,流落街头。主教却把他招来,轻微责备了几句,派他去当了天主堂里的持戟士。 + 米里哀先生在他的教区里是一个名副其实的神甫,是公众的朋友。 + 由于他行为圣洁,作风和蔼,九年以来,卞福汝主教使迪涅城里充满一种柔顺的推崇。连他对拿破仑的态度也被人民接受,默默宽宥了,人民原本是一群善良柔弱的牛羊,他们崇拜他们的皇上,同时也爱戴他们的主教。 + ①奥斯特里茨(Austerlitz),在捷克境内,一八 0五年,拿破仑在此战胜奥、俄联军。 + ②路易十八是路易十六的兄弟,拿破仑失败后,他在英普联军护送下回到巴黎,恢复了波旁王室的统治。 + 十二 卞福汝主教门可罗雀 + 常有成群的青年军官在将军的周围,在主教的周围,几乎也常有成批的小教士。这种人正是可爱的圣方济各?撒肋①在某处所说的那些“白口教士”。任何事情都有追求者,追随着此中的成功者,世间不存在一 种无喽罗的势力,也不存在一种无臣仆的尊荣。指望前程远大的人,都围绕着目前的显贵奔走钻营。每个主教衙门都有它的幕僚。每个稍有势力的主教,都有他那群天使般的小修士在主教院里巡逻,照顾,守卫,以图博得主教大人的欢心。获取了主教的赏识,也就等于福星高照,有充当五品修士的希望了。求上进是人之常情,上帝的门徒是不会亏待他的下属的。 + 在别的地方有高大的帽子,在教堂里也同样有峨的法冠。这种人也就是那些主教,他们有钱有势,坐收年息,手腕灵活,受到上层社会宠信,善于求人,当然也善于使唤人,他们指使整个主教区的教民亲自登门拜谒,他们充当教会与外交界之间的桥梁,他们足够做教士而不足以当神甫,足够做教廷执事而不足以当主教。接近他们的人都皆大欢喜!那些高高在上的人,把肥的教区、在家修行人的赡养费、教区督察官职位、随军教士职位、天主堂里的差事,雨点般撒在他们周围那些殷勤献媚,博得他们欢心,长于讨好他们的青年们的头上,以待将来加上主教的尊贵。他们自己高升,同时也带着卫星前进;那是在行进中的整个太阳系。他们的光辉把追随他们的人都照得发紫。他们一人得志,众人也托福高升。老板的教区越广,宠幸的地盘也越大,并且还有罗马在。由主教而总主教而红衣主教的人可以提拔你为红衣主教的随员,你进入宗教裁判所,你会得到绣黑十字的白呢飘带,你就做起陪审官来了,再进而为内廷机要秘书,再进而为主教,并且只须再走一步就由主教升为红衣主教了,红衣主教与教皇之间也不过只有一点选举的过常凡是头戴教士小帽的人都可以梦想教皇的三重冕。神甫是今天唯一能按部就班升上王位的人,并且那是何等的王位!至高无上的王位。同时,教士培养所又是怎样一种培植野心的温床!多少腼腆的唱诗童子,多少年轻的教士都顶上了贝莱特①的奶罐!包藏野心的人自吹能虔诚奉教,自以为那是轻而易举的事,也许他确有那样一片诚心,谁知道?沉溺日久,自己也变得莫名其妙。 + 卞福汝主教没有被人列入那些高贵的主教里面,他谦卑、清寒、淡泊。那可以从在他周围完全没有青年教士这一点上看出来。我们已经知道,他在巴黎“毫无成就”。没有一个青年愿把自己的前程托付给那样一个孤独老人。没有一株有野心的嫩苗动过靠他发迹的傻念头。他的那些教士和助理主教全是一些安分守己的老头儿,和他一样的一些老百姓,和他一同呆在那个无福产生红衣主教的教区里,他们就象他们的那位主教,不同的地方只是:他们是完了事的,而他是成了事的。大家都①方济各?撒肋(FrancoisdeSales,1567—1622),日内瓦主教,他重振了天主教势力。 + ①拉封丹(LaFontaine)的寓言谈到一个送奶的姑娘,叫贝莱特,她头上顶一罐奶进城,一路梦想把奶卖了,可以买一百个鸡蛋,孵出小鸡养大,卖了买猪,猪卖了又买牛,牛又生了小牛,她看见小牛在草地上跳,乐到自己也跳起来,把奶罐掉在地上,结果是一场空欢喜。 + 觉得在卞福汝主教跟前没有发迹的可能,以致那些刚从教士培养所里出来的青年人,经他任命为神甫之后,便都转向艾克斯总主教或欧什总主教那里去活动,迫不及待避开了他。我们再说一次,因为凡人都愿意有人提拔。一个过于克己的圣人便是一个可以误事的伙伴,他可以连累你陷入一条无可救药的绝路,害你关节僵硬,行动不得,总之他会要你奉行你不愿接受的那种谦让之道。因此大家都逃避那种癞疥似的德行。这就是卞福汝主教门庭冷落的原因。我们生活在阴暗的社会里,向上爬,正是一种由上而下的慢性腐蚀教育。 + 顺便提一句,成功是件相当丑恶的事。它貌似真才实学,而实际是以假乱真。一般人常以为成功和优越性几乎是同一回事。成功是才能的假相,受它愚弄的是历史。只有尤维纳利斯①和塔西佗②在这方面表示过愤慨。在我们这时代有种差不多被人公认为哲学正宗的理论,它成了成功的仆从,它标榜成功,并不惜为成功做苦差事。你设法成功吧,这就是原理。富贵就等于才能。中得头彩,你便是一个出色的人才。谁得势,谁就受人尊崇。只要你的八字好,一切都大有可为。只要你运气好,其余的东西也就全在你的掌握中了。只要你事事如意,大家便认为你伟大。除了五六个震动整个世纪的突出事例之外,我们这时代的尊崇全是没有见地的。金漆就是真金。阿猫阿狗,全无关系,关键只在成功。就象那顾影自怜的老水仙③一样,世间俗物很能赞赏俗物。任何人在任何方面,只要达到目的,众人便齐声喝彩,誉为奇才异能,说他比得上摩西、埃斯库罗斯④、但盯米开朗琪罗或拿破仑。无论是一个书吏当了议员,一 个假高乃依⑤写了一本《第利达特》⑥,一个太监乱了宫闱,一个披着军服的纸老虎侥幸地打了一次划时代的胜仗,一个药剂师发明了纸鞋底冒充皮革,去供给桑布尔和默慈军区而获得四十万利弗的年息,一个百货贩子盘剥厚利,攒聚了七八百万不义之财,一个传道士因说话带浓重鼻音而当上了主教,一个望族的管家在告退时成了巨富,因而被提升为财政大臣,凡此种种,人们都称为天才,正如他们以穆司克东①的嘴脸为美,以克劳狄乌斯②的派头为仪表一样。穹苍中的星光和鸭掌在烂泥里踏出的迹印在他们看来并无分别。 + ①尤维纳利斯(Juvenal),一世纪罗马诗人。 + ②塔西佗(Tacite),一世纪罗马历史学家。 + ③据神话,水仙在水边望见自己的影子,情不自尽,投入水中,化为水仙花。 + ④埃斯库罗斯(Eschyle),古希腊悲剧家。 + ⑤高乃依(Corneille),法国十七世纪古典悲剧作家。 + ⑥第利达特(Tiridate),一世纪亚美尼亚国王。 + ①穆司克东(Mousqueton),大仲马小说《二十年后》中人物,好吃懒做的仆人。 + ②克劳狄乌斯(Claude),罗马政治活动家,恺撒的拥护者,前五八年为护民官。 + 十三 他所信奉的 + 谈到宗教的真谛问题,我们对迪涅的主教先生不能作任何窥测。我们只能有敬佩的心情,面对着象他那样一颗心。我们应当完全信服一个心地正直的人。并且,我们认为,在具备了某些品质的情况下,人的品德的各种美,都是可以在和我们不同的信仰中得到发展的。 + 他究竟怎样理解这样一种教义或那样一种神秘呢?那些隐在心灵深处的秘密,只有那迎接赤裸裸的灵魂的坟墓才能知道。不过有一点我们可以肯定,那就是,在解决信仰方面的难题时,他从来都不采取口是心非的虚伪态度。金刚石是决不至于腐烂的。他尽力而为,竭诚信仰。“信天父。”③他常说。此外,他还在行善中希求一定程度的、既无愧于良心也无愧于上帝的满足。 + 我们认为应当指出的是,主教在他的信心之外(不妨这样说)和这信心之上,还存在着一种过分的仁爱。正是在那上面,“由于多爱”④,他才被那些“端庄”、“严肃”和“通达”的人认为是有缺点的;“端庄”、“严肃”、“通达”这些字眼也正是我们这个悲惨世界里那些全靠贬低别人来抬高自己的人所津津乐道的。那种过分的仁爱是什么?是一种冷静的对人关怀之心,他关怀众人,正如我们指出过的已经到了无微不至的程度,有时还兼及其他的生物。他一生不曾有过奚落人之心。他对上帝的创造从不苛求。任何人,即使是最善良的人,对待动物,无意识中总还保留一种暴戾之气。许多神甫都具有这种暴戾之气,而迪涅的这位主教却一点也没有。他虽然还没有达到婆罗门教的境界,但对圣书中“谁知道动物的灵魂归宿何处?”这句话,似乎象是作过深长的思索。丑陋的外形和怪异的本性都不能惊动他,触犯他。他却反而会受到感动,几乎泛起爱怜之心。他聚精会神,仿佛要在生命的表相之外追究出其所以如此的根源、理由或苦衷。有时他好象还恳求上帝加以改造。他用语言学家考证古人遗墨的目光,平心静气地观察自然界中迄今还存在着的多种多样的混乱现象。那种遐想有时会使他说出一些怪话。一天早晨,他正在园里,他以为身边没有人,其实他的妹妹在他后面跟着走,他没有看见,忽然,他停下来,望着地上的一件东西,一只黑色、毛茸茸、怪可怕的大蜘蛛。他妹妹听见他说:“可怜虫!这不是它的过错。” + 那种出自悲天悯人之心的儿语,为何不能说呢?固然那是一种稚气,但是这种绝妙的稚气也正是阿西西的圣方济各①和马可?奥里略②有过的。一天,他为了不肯踏死一只蚂蚁,竟扭伤了筋骨。 + 这个正直的人便如此过活。有时他睡在自己的园里,那真是一种最能令人向往的事。 + 据闻,卞福汝主教从前在青年时期,甚至在壮年时期,都曾是一个③“信天父”,原文为拉丁文 CredoinPatrem。 + ④“由于多爱”,原文为拉丁文 quiamultumamavit。 + ①圣方济各(Francoisd′Assise,1181—1226),一译“法兰西斯”,方济各会创始人,生于意大利阿西西。一二○九年成立“方济各托钵修会”,修士自称“小兄弟”,又称“小兄弟会”。 + ②马可?奥里略(MarcAurele,121—180),罗马皇帝,斯多葛派哲学家。 + 热情的人,甚或还是一个粗暴的人。他后来的那种被及一切的仁慈,与其说是天赋的本性,不如说是他在生活过程中一步步逐渐达到大彻大悟的结果,因为,人心和岩石一样,也可以有被水滴穿的孔。那些空隙是不会消失的,那些成绩难以毁灭。 + 我们好象已经说过,在一八一五年,他已七十五岁,但看去好象还没过六十。他的身材矮矮胖胖,为了避免肥胖,他喜欢作长距离的步行;他腿力仍健,背稍微伛一点,这些并不重要,我们不打算在这上面作什么结论。格列高利十六①到了八十岁还是身躯挺直、笑容满面的,但他仍是一个坏主教。卞福汝主教的相貌正象是老乡们所说的那种“美男子”,但他的和蔼性格已使人忘了他面貌的美。 + 他在谈话中不时嬉笑,有些孩子气,那也是他的风采之一。这我们已经说过了,我们和他接近就会感到身心舒畅,好象他的谈笑会带来春风满座。他肤色红润,保全了一嘴洁白的牙齿,笑时露出来,给他添了一种坦率和平易近人的神气,那种神气可以让一个壮年人被人称作“好孩子”,也可以使一个老年人被人称作“好汉子”。我们记得,他当年给拿破仑的印象正是如此。乍一看来,他在初次和他见面的人心目中,确也只不过是一个好汉子。但是如果我们和他接触了几个小时,只须稍稍望见他陷入沉思,那个好汉子便慢慢变了样,会令人莫名其妙地肃然生畏;他那广而庄重、原就在白发下显得尊严的前额,也因潜心思考而倍显尊严了;威严出自慈祥,而慈祥之气仍不停散布;我们受到的感动,正如看见一个笑容可掬的天使在缓缓展开他的翅膀,一面还不停地露着笑容。一种敬意,一种无可言喻的敬意会油然而生,直达你的胸臆,于是我们觉得在我们面前的,确是一位坚定、饱经世故的仁厚长者,他的胸襟既是那样开朗,那他的思想也就必然是温柔敦厚的了。 + 如我们所知,他一生的每一天都被祈祷、上祭、布施、安慰伤心人、种一小块园地、实行仁爱、节食、招待过路客人、克己、信人、学习、劳动这类事充满。“充满”这两个字是恰当的,并且主教过的这种日子又一定洋溢着善良的思想、善良的言语和善良的行为,直趋完善之境。但到了晚上,当那两个妇女已经退去休息时,如果天冷,或是下雨,使他不能到园子里去待上一两个钟点再就寝的话,他那一天也还是过得不满足的。面对着太虚中寥廓的夜景,缪然默念,以待睡意来临,在他,这好象已是一种仪式了。有时,夜深人静之后,那两个老妇人如果还没有睡着,她们常会听见他在那几条小径上缓步徘徊。他在那里,独自一 人,虔诚,恬静,爱慕一切,拿自己心中的谧静去与太空的谧静相比拟,从黑暗中去感受星斗有形的美和上帝无形的美。那时,夜花正献出它们的香气,他也献出了他的心,他的心正象一盏明灯,在闪闪繁星之中点亮,景仰赞叹,飘游于造物无边无际的光辉里。他自己也许说不出在他心中萦绕的究竟为何物,他只感到有东西从他体中飞散出去,也有东西飘落回来。心灵的幽奥和宇宙的幽奥的神秘的交汇! + 他想到上帝的伟大,也想到上帝和他同在;想到绵绵无尽的将来是一种深不可测的神秘,无可究竟的往古更是神秘渺茫;想到宇宙在他的眼中朝着各个方面无止境地扩展延伸;他不强求了解这种无法了解的现①格列高利十六(GregoireXVI,1765—1846),一八三一年至一八四六年为罗马教皇。 + 象,但他凝神注视着一切。他不研究上帝,他只为之心旷神怡。他涉想到原子的奇妙结合能使物质具有形象,能在组合时产生力量,在整体中创造出个体,在空间创造出广度和长度,在无极中创造出无量数,并能通过光线显示美。那样的结合,生生灭灭,绵绵无尽,因而有生也有死。他坐在一条木凳上,靠着一个朽了的葡萄架,穿过那些果树的瘦弱蜷屈的暗影,仰望群星。在那四分之一亩的地方,树木稀疏,残棚破屋又那么挤,但他留恋,心里满足。这个老人一生的空闲时间既那么少,那一点空闲时间在白天又已被园艺占去,在晚上又用于沉思冥想,他还有什么希求呢?那一小块园地,上有天空,不是已经足够供他用来反复景仰上帝的最美妙、最卓绝的工作吗?的确,难道那样不已经十全十美,还有什么可奢求的呢?一院小园供他盘桓,一片浩阔的天空供他神游。脚下有东西供他培植收获,头上有东西供他思索探讨,地下花几朵,天上星万点。 + 十四 他所思虑的 + 最后几句话。这种详细的叙述,又是在我们这时代,很可能赋予迪涅的这位主教一副泛神论者(暂用一个目下正流行的名词)的面貌,加之我们这世纪中的哲学流派繁多,那些纷纭的思想有时会在生活孤寂的人的精神上发芽成长,扩大影响,直到代替宗教,我们的叙述,又会使人认为他有他一套独特的人生观,无论这对他是贬是褒,我们都应当着重指出,凡是认识卞福汝主教的人,没有一个敢有那样的想法。他之所以光明磊落,是由于他的心,他的智慧正是由那里发出的光构成的。 + 不守成规,勇于任事。探赜索隐,每每使他神志昏瞀;他是否窥探过玄学,毫无迹象可寻。使徒行事,可以大刀阔斧,主教却应该小心谨慎。他也许觉得某些问题是应当留待大智大慧的人去探讨的,自己如果推究太深,反而于心不安。玄学的门,神圣骇人,那些幽暗的洞口,一 一向人打开,但有一种声音在向你这生命中的过客说“慎勿妄进”。进去的人都将不幸!而那些天才,置身于教律之上(不妨这样说),从抽象观念和唯理学说的无尽深渊中,向上帝提出他们的意见。他们的祷告充满了大胆的争论。他们的颂赞带着疑难。这是一种想直接证悟的宗教,妄图攀援绝壁的人必将因重重烦恼而自食其果。 + 人类的遐想是漫无止境的。人常在遐想中不避艰险,分析研究并深入追求他自己所赞叹的奇境。我们差不多可以这么说,由于一种奇妙的反作用,人类的遐想可以使宇宙惊奇,围绕着我们的这个神秘世界能吐其所纳,瞻望的人们也就极有被瞻望的可能。无论怎样,这世上确有一 些人(如果他们仅仅是人),能在梦想的视野深处,清晰地望见绝对真理的高度和无极巅峰惊心触目的景象。卞福汝主教完全不是这种人,卞福汝主教不是天才。他也许害怕那种绝顶的聪明,有几个人,并且是才气磅礴的人,例如斯维登堡①和帕斯卡尔②,就是因为聪明绝顶而精神失常的。因而,那种强烈的梦想,对人的身心自有它的用处,并且通过那条艰险的道路,我们可望达到理想中的至善境界,可是他,他选择了一 条捷径——《福音书》。 + 他绝不想让他的祭服具有以利亚③的法衣的皱褶,他对这黑暗世界中人事的兴衰变迁,不怀任何希冀;他不希望能使一事一物的微光集成烈火,他毫无那些先知方士们的臭味。他那颗质朴的心只知道爱,如此而已。 + 他的祈祷中的憧憬与众不同,那很有可能,但得先有极其殷切的爱,才能作出极其殷切的析祷,如果祈祷的内容越出了经文的规范,便被认为是异端,那么,圣泰莉莎和圣热罗姆岂不成了异端了? + 他常照顾那些呻吟床榻和奄奄待毙的人。这世界在他看来好象是一 种漫无边际的病苦,他觉得寒热遍地,他四处诊察疾苦,他不想猜破谜底,只试图包扎创伤。人世的惨状使他的心悲天悯人,他一心一意想找①斯维登堡(Swedenborg,1688—1772),瑞典通灵论者。 + ②帕斯卡尔(Pascal,1623—1662),法国数学家,物理学家,哲学家。 + ③以利亚(Elie),犹太先知(《圣经?列王记》)。 + 出可以安慰人心和解除痛苦的途径,那是为他自己也是为了影响旁人。世间存在的一切事物,对这位不可多得的慈悲神甫,都是引起恻隐之心和济世宏愿的永恒动力。 + 多少人在努力发掘黄金,他却只努力发掘慈悲心肠。天下的愁苦便是他的矿。遍地的苦痛随时为他提供行善的机会。“你们应当彼此相爱”,他说如果能这样,便一切齐备了,不必再求其他,这就是他的全部教义。一天,那个自命为“哲学家”的元老院元老(我们已经提到过他的名字)对他说:“您瞧瞧这世上的情形吧,人自为战,谁胜利,谁就有理。您的‘互爱’简直是胡扯。”卞福汝主教并不和他争论,只回答:“好吧,即使是胡扯,人的心总还应当隐藏在那里,如同珍珠隐在蚌壳里一样。”他自己便隐藏在那里,生活在那里,绝对地心满意足,不理睬那些诱人而又骇人的重大问题,如抽象理论无可揣摹的远景以及形而上学的深渊,他把所有那些针对同一问题的玄妙理论都抛在一边,留给上帝的信徒和否定上帝的虚无论者去解决,这些玄论有命运、善恶、生物和生物间的斗争、动物的半睡眠半思想状态、死后的转化、坟墓中的生命总结、宿世的恩情对今生之“我”的那种不可理解的纠缠、元精、实质、色空、灵魂、本性、自由、必然,还有代表人类智慧的巨神们所探索的那些穷高极深的问题,还有卢克莱修①、魔奴②、圣保罗和但丁曾以如炬的目光,凝神仰望的那仿佛能使群星跃出的浩阔天空。 + 卞福汝主教是个普通人,他只从表面涉猎那些幽渺的问题,他不深究,也不推波助澜,以免使自己精神受到骚扰,但在他的心灵中,对于幽冥,却怀有一种深厚的敬畏之情。 + ①卢克莱修(Lucrece,前 98—55),罗马诗人,唯物主义者,无神论者。 + ②摩奴(Manou),印度神话中之人类始祖。 + 第二卷沉沦 + 一 漫步到黄昏 + 一八一五年十月初的一天,离日落约还有一个小时,一个人步行走进了小小的迪涅城。在家门口或窗前,稀稀落落的居民带着一种不安的心情瞧着这个行人。要碰见一个比他更褴褛的过路人太难了。他中等身材,体格粗壮,正当盛年,四十六或四十八岁左右。一顶皮檐便帽压齐眉心,把他那被太阳晒黑、淌着大汗的脸遮去了一些。从他那领上扣一 个小银锚的黄粗布衬衫里露出一部分毛茸茸的胸脯,他的领带扭得象根绳子,蓝棉布裤也磨损不堪,一个膝头成了白色,一个膝头有了窟窿;一件老灰布衫破旧褴褛,左右两肘上都已用麻线缝上了一块绿呢布;他背上有只布袋,装得满满的也扣得紧紧的;手里拿根多节的粗棍,一双没有穿袜子的脚踩在两只钉鞋里,光头,长须。 + 汗、热、奔走和徒步旅行使那潦倒的人有种说不出的狼狈神情。他的头发原是剃光了的,但现在又茸茸满头了,因为又开始长出了一点,还好象多时没有修剪过似的。谁也不认识他,他当然只是个过路人。他从何而来?从南方来的。 + 或是从海滨来的。因为他进迪涅城所走的路,正是七个月前拿破仑皇帝从戛纳去巴黎时所经过的路。这个人一定已走了一整天,他那神气显得异常疲乏。许多住在下城旧区里的妇人看见他在加桑第大路的树底下歇了歇,又在广场尽头的水管里喝了点水。他一定渴极了,因为追着他的那些孩子还看见他在两百步外的那个小菜场的水管下停下喝了水。 + 走到巴许维街转角处,他向左转,朝市政厅走去。他进去,一刻钟之后又走了出来。有个警察坐在门旁的石凳上,那正是三月四日德鲁埃将军站上去向着惊恐万状的迪涅民众,宣读茹安港①宣言的那条石凳。那汉子取下他的便帽,向那警察恭恭敬敬行了一个礼。 + 警察没有答礼,只仔细打量了他一阵,用眼光送了他一程,就进市政厅里去了。当时,迪涅有一家豪华漂亮的旅舍叫“柯耳巴十字架”。旅舍主人是雅甘?拉巴尔。城里的人都认为他是另外一个拉巴尔的亲族,另外那个拉巴尔在格勒诺布尔开着三太子旅舍,并且做过向导②。据当时传闻,正月间贝特朗将军曾经乔装为车夫,在那一带地方往来过多次,把许多十字勋章发给一些士兵,把大量的拿破仑③分给一些士绅。实际情况是这样的:皇帝进入格勒诺布尔城以后,不愿住在省长公署里,他谢了那位市长,他说:“我要到一个我认识的好汉家里去祝”他去的地方便是三太子旅舍。三太子旅舍的那个拉巴尔所得的荣耀,一直照射到二十五 法里以外的这个柯耳巴十字架旅舍的拉巴尔。城里的人都说他是格勒诺布尔那位的堂兄弟。 + 那人正往这旅舍走去,它是这地方最好的旅舍了。他走进了厨房,①茹安港(Juan)在戛纳附近,拿破仑在此登陆时曾在此发表宣言。 + ②替拿破仑当向导。 + ③拿破仑,金币名称,相当于二十法郎。 + 厨房的门临街,也象街道一般平。所有的灶都升了火,一炉大火在壁炉里通红地烧着。那旅舍主人,同时也是厨师,从灶心管到锅盏,正忙着照应,为许多车夫预备一顿丰盛的晚餐,他们能听见车夫们在隔壁屋里大声谈笑。凡是旅行过的人都知道再也没有什么人比那些车夫吃得更考究的了。穿在长叉上的一只肥田鼠,夹在一串白竹鸡和一串雄山雉中间,正在火前转动。炉子上还烹着两条乐愁湖的青鱼和一尾阿绿茨湖的鲈鱼。那主人听见门开了,又来了一个新客人,两只眼睛仍望着炉子,也不抬头,他说:“先生要什么?” + “吃和睡。”那人说。 + “再容易不过了,”主人回答说。此时,他转过头,目光射在旅客身上,又接着说:“??要付钱的呀。” + 那人从他布衫的袋里掏出一只大钱包,回答说:“我有钱。” + “好,我马上来伺侯您。”主人说。那人把钱包塞回衣袋,取下行囊,放在门边的地上,手里仍拿着木棍,去坐在了火旁边的一张矮凳上。迪涅处在山区,十月的夜晚是很寒冷的。 + 但旅舍主人去了又来,来了又去,总在打量这位旅客。“现在有东西吃吗?”那人问。 + “得稍微等一会儿。”旅舍主人说。这时,新来的客人正转过背去烘火,那位好象煞有介事的旅舍主人从衣袋里抽出一支铅笔,又从丢在窗台旁小桌子上的那张旧报纸上撕下一角。他在那白报纸边上写了一两行字,又把这张破纸折好,并不封,交给一个好象是他的厨役同时又是他的跑腿的小伙计。旅舍主人还在那小伙计耳边说了句话,小伙计便朝着市政厅的方向跑去了。 + 那旅客一点也没看见这些事。 + 他又问了一遍: + “马上能有东西吃吗?”“还得等一会儿。”旅舍主人说。那孩子回来了。他带回了那张纸。主人急忙把它打开,好象一个等候回音的人,他象是细心地读了一遍,随后又点头,想了想。他终于朝着那似乎心神不大安定的旅客走上一步。“先生,”他说,“我不能接待您。” + 那个人从他的坐位上半挺着身子。 + “怎么!您害怕我不付钱吗?您要不要我先会帐?我有钱呢,我告诉您。” + “不是为那个。” + “那么是为什么?” + “您有钱??” + “有。”那人说。 + “但是我,”主人说,“我没有房间。”那人和颜悦色地说:“把我安顿在马房里就行了。”“我不能。” + “为什么?” + “那些马把所有的地方都占完了。” + “那么,”那人又说,“阁楼上面的一个角落也行。一捆草就够了。我们吃了饭再看吧。” + “我不能开饭给您吃。”那个外来人对这种有分寸而又是坚硬的表示感到严重了,他站立起来。 + “哈!笑话!我快饿死了,我。太阳出来,我就走起,走了十二法里①的路程。我又不是不付钱。我要吃。”“我一点东西也没有。”旅舍主人说。 + 那汉子放声大笑,转身朝着那炉灶。 + “没有东西!那是什么?”“那些东西都是客人定了的。” + “谁定的?” + “那些车夫先生定了的。” + “他们多少人?” + “十二个人。” + “那里有够二十个人吃的东西。” + “那都是预先定好并且付了钱的。”那个人又坐下去,用同样的口吻说:“我已经到了这客栈里,我饿了,我不走。” + 那主人弯下身子,凑到他耳边,用一种使他吃惊的口吻说:“快走。”这时,那旅客弯下腰去了,用他棍子的铁梢拨着火里的红炭,他蓦地转过身来,正要开口反驳,可那旅舍主人的眼睛盯着他,象先头一样低声说:“我说,废话已经说够了。您要我说出您的姓名吗?您叫冉阿让。现在您还要我说出您是什么人吗?您进来时,我一见心里就有些疑惑,我已派人到市政厅去过了,这是那里的回信。您认识字吗?” + 他边那样说,边把那张完全打开了的、从旅舍到市政厅、又从市政厅转回旅舍的纸递给那客人看。客人在纸上瞟了一眼。旅舍主人停了一 会见他不作声,接着又说:“无论对什么人,我素来都是客客气气的,您还是走吧。”那人低下头,拾起他那只放在地上的布袋走了。他沿着那条大街走去。好象一个受了侮辱、满腔委屈的人,他紧挨着墙壁,信步前行。他的头一次也没有回转过。假使他回转头来,他就会看见那柯耳巴十字架的旅舍主人正站在他门口,旅舍里的旅客和路上的行人都围着他,正在那里指手划脚,说长论短;并且从那一堆人惊疑的目光里,他还可以猜想到他的出现不久就会搞得满城风雨。那些经过,他全没瞧见。心情沮丧的人,总是不朝后面看的。他们只感到恶运正追着他们。 + 他那样走了一些时候,不停地往前走,信步穿过了许多街道,都是他不认识的,他忘了自身的疲乏,人在颓丧时是经常有这种情况的。忽然,他感到饿得难受。天也要黑了。他向四周望去,想找到一处可以过夜的地方。 + 既然那家华丽的旅馆给了他闭门羹,他便想找一家简陋的酒店,一①一法里等于四公里。 + 所穷苦的破屋。恰好在那条街的尽头,亮起了一盏灯,在半明半暗的暮色中,显出一根松枝,悬在一块曲铁上。他向那地方走去。那确实是一家酒店。就是沙佛街上的那家酒店。 + 那行人停了一阵,从玻璃窗口观望那酒家底层厅房的内部,看见桌上的灯正点着,壁炉里的火也正燃着。几个人在里面喝酒。老板也傍着火。一只挂在吊钩上的铁锅在火焰中烧得发出声响。这家酒店,同时也是一种客栈,它有两扇门,一扇临街,另一扇通往一个粪土混积的小天井。 + 那行人不敢由临街的门进去。他先溜进天井,等了一会,才轻轻地提门闩,把门推开。 + “来的是谁?”那老板问。 + “一个想吃晚饭和过夜的人。” + “好的,这儿有饭吃,也有地方可以祝”他随后进去了。那些正在喝酒的人全都转过头来。他这一面有灯光照着,那一面有火光照着。当他解下那口袋时,大家都打量了他好一会儿。那老板向他说:“这儿有火,晚餐也正在锅里煮着。您来烤烤火吧,伙计。”他走去坐在炉边,把那两只累伤了的脚伸到火前,一阵香味从锅里冒出。他的脸仍被那顶压到眉心的便帽半遮着,当时能辨别出来的,只是一种隐隐约约的舒适神情,同时又搀杂着另外一种因长期苦痛而起的愁容。那是一副坚强有力而又忧郁的侧影。这相貌是罕见的,一眼看去象是谦卑,看到后来,却又严肃。眼睛在眉毛下炯炯发光,正如荆棘丛中的一堆火。当时,在那些围着桌子坐下的人当中有个鱼贩子。他在走进沙佛街这家酒店以前,到过拉巴尔的旅舍,把他的马寄放在马房里,当天早晨他又偶然碰见过这个面恶的外来人,在阿塞湾和??(我已忘了那地名,我想是爱斯古布龙)之间走着。那外来人在遇见他时曾请求让他坐在马臀上,他当时已显得非常困顿了,那鱼贩子却一面支吾着,一面加鞭走了。半个钟头以前,那鱼贩子也正是围着雅甘?拉巴尔那堆人中的一个,并且他亲自把当天早晨那次不愉快的遭遇,告诉了柯耳巴十字架旅舍里的那些人。这时他从他坐的地方向那酒店老板使了个眼色。于是,酒店老板走到他身边,彼此低声交谈了几句。那个赶路的客人却正在想他的心事。 + 酒店老板回到壁炉旁边,突然把手放在那人的肩上,向他说:“你得离开此地。” + 那个陌生客人转过身来,低声下气地说:“唉!您知道?” + “我知道。” + “他们把我从那个旅舍里撵了出来。” + “又要把你从这儿赶出去。” + “您要我到什么地方去呢? + “到别的地方去。”那人提起他的棍和布袋,走了。 + 他走出店门,又遇到几个孩子,扔着石子打他,那群孩子是从柯耳巴十字架跟来,专在门口待他出来的。他狼狈地转回来,扬着棍子作势要打,孩子们也就象一群小鸟似的散了。他走过监狱,监狱的大门上垂着一根拉钟的铁链。他便拉动那口钟。墙上的一个小洞开了。 + “看守先生,”他说,一面恭恭敬敬地脱下他的便帽,“您可愿意开开牢门让我住一宵?” + 有个人的声音回答说: + “监牢又不是客栈。你得先叫人逮捕你。这门才会替你打开。”那小墙洞又闭上了。 + 他走到了一条有许多花园的小街。其中的几处只用篱笆围着,那样会使街道显得更为生机蓬勃。在那些花园和篱笆之间,他看见一所小平房的窗子里有灯光。他从那玻璃窗往里看,正和他先头望那酒店一样。那是一大间用灰浆刷白了的屋子,里面有一张床,床上铺着印花棉布的床单,屋角里有只摇篮,几张木椅,墙上挂着一枝双管枪。屋子中间有桌子,桌上正摆着食物。一盏铜灯照着那块洁白宽大的台布,一把灿烂如银的盛满了酒的锡壳和一只热气腾腾的栗黄汤钵。桌子旁边坐着一个四十岁左右笑容满面的男子,他用膝头颠着一个小孩,逗他跳跃。一个年纪正轻的妇人在他旁边给另外一个婴孩喂奶。父亲笑着,孩子笑着,母亲也微微地笑着。 + 这个异乡人在那种温柔宁静的景象前出了一阵神。他心里想着什么?只有他自己才能说得出来。也许他正想着那样一个快乐的家庭应当是愿意招待客人的吧,他在眼前的那片福地上,也许能找得到一点恻隐之心吧。 + 他在玻璃窗上极轻地敲了一下。 + 没有人听见。他敲第二下。他听见那妇人说:“当家的,好象有人敲门。” + “没有。”她丈夫回答。他敲第三下。 + 那丈夫立起来,拿着灯,走去把门开了。他是一个身材高大、半农半工模样的人。身上围着一件宽大的皮围裙,一直围到他的左肩,围裙里有一个铁锤、一条红手巾、一只火药匣、各式各样的东西,都用一根腰带兜住,在他的肚子上鼓凸起来。他的头朝后仰着,一件翻领衬衫大大敞开,露出了白皙光滑的牛样的脖子。他有浓厚的眉毛,腮帮上留着一大片黑胡须,眼睛不凹,下颏突出,在那副面貌上,有一种说不出的怡然自得的神色。 + “先生,”那过路人说,“请愿谅。假使我出钱,您能给我一盆汤,让我在园里那棚子里的角上睡一宵吗?请您说,您答应吗,假使我出钱的话?” + “您是谁?”那房子的主人问。那人回答说:“我是从壁马松来的。我走了一整天,我走了十二法里。您同意吗?假使我出钱?” + “我并不拒绝留宿一个肯付钱的正派人,”那农人说,“但是您为什么不去找客栈呢?” + “客栈里没有地方了。” + “笑话!没有的事。今天又不是演杂技的日子,又不是赶集的日子。您到拉巴尔家去过没有?” + “去过了。” + “怎样呢?”那过路人感到为难,他回答说:“我不知道,他不肯接待我。” + “您到沙佛街上那叫做什么的家里去过没有?”那个外来人更感困难了,他吞吞吐吐地说:“他也不肯接待我。”那农民的脸上立刻有了戒惧的神情,他从头到脚打量那陌生人,并且忽然用一种颤栗的声音喊着说:“难道您就是那个人吗???”他又对那外来人看了一眼,向后退了三步,把灯放在桌上,从墙上取下了他的枪。 + 那妇人听见那农民说“难道您就是那个人吗???”以后,也立了起来,抱着她的两个孩子,赶紧躲在她丈夫背后,惊慌失措地瞧着那个陌生人,敞着胸口,睁大了眼睛,低声说:“佐马洛德。”①这些动作比我们想象的还要快些。屋主把那“人”当作毒蛇打量了一番之后,又回 到门前,说道:“滚!” + “求您做做好事,”那人又说,“给我一杯水吧!”“给你一枪!”农民说。 + 随后他把门使劲关上,那人还听见他推动两条大门闩的声音。过不一会儿,板窗也关上了,一阵上铁闩的声音直传到外面。天越来越黑了。阿尔卑斯山中已刮起了冷风。那个无家可归的人从苍茫的暮色中,望见街边的一个花园里有个茅棚,看上去好象是草墩搭起来的。他下定决心,越过一道木栅栏,便到了那园子里。他朝着那茅棚走去,它的门不过是一个狭而极低的洞,正象那些筑路工人替自己在道旁盖起的那种风雨棚。他当然也认为那真的是一个筑路工人歇脚的地方,现在他感到又冷又饿,实在难受。他虽然已不再希望得到食物,但至少那还是一个避寒之处。那种棚子一般在晚上是没有人住的。他全身躺下,爬了进去。里面相当温暖,地上还铺了一层麦秸。他在那上面躺了一会,他实在太疲倦了,一点也没法动。随后,因为他背上还压着一个口袋,使他很不舒服,再说,这正是一个现成的枕头,他便动手解开那捆口袋的皮带。正在这时,他猛然听见一阵粗暴的声音。他抬起眼睛。黑暗中看见在那茅棚的洞口露出一只很大的狗头。原来那是一个狗窝。 + 他自己本来是胆大力壮,威猛无比的人,他拿起他的棍子当作武器,拿着布袋当作藤牌,慢慢地从那狗窝里爬了起来,只是他那身破烂的衣服已变得越发破烂了。 + 他又走出花园,那狗逼得他朝后退出去,他不得不运用棍术教师们所谓“盖蔷薇”的那种棍法去对付那条恶狗。 + ①佐马洛德(tso—maraude),法国境内阿尔卑斯山区的方言,即野猫。——作者原注。 + 他费尽力气,越过木栅栏,回到了街心,孤零零,没有栖身之处,没有避风雨的地方,连那堆麦秸和那个低贱不堪的狗窝也不容他涉足,他就让自己落(不是坐)在一块石头上,有个过路人似乎听见他骂道:“我连狗也不如了!”不久,他又站起来,往前走。他出了城,希望能在田野中找到一棵树或是一个干草堆,能够靠一下。 + 他那样走了一段时间,老低着头。直到他觉得自己已同那些人家离得远了,他才抬起眼睛,四面张望。他已到了田野中,在他前面,有一 片矮丘,丘上覆着齐地割了的麦茬,那矮丘在收获之后就象推光了的头一样。 + 天边已全黑了,那不仅是夜间的黑暗,仿佛还有极低的云层,压在那一片矮丘上面,继而又渐渐浮起,满布天空。但是,由于月亮正待升起,穹苍中也还留着一点暮色的余辉,浮云朵朵,在天空构成了一种乳白的圆顶,一线微光从那顶上反射下来。 + 因此地面反而比天空显得更亮一些,那是一种特别阴森的景色,那片矮丘的轮廓,荒凉枯瘠,被黑暗的天边衬托得模糊难辨,色泽有如死灰。所有这一切都是丑恶、卑陋、黯淡、无意义的。在那片田野中和矮丘上,空空荡荡,只看见一棵不成形的树,在和这个流浪人相距几步远的地方,蜷曲着它的枝干,摇曳不定。 + 显然,这个人在智慧方面和精神方面都谈不上有那些细腻的习惯,因而对事物的神秘现象也就无动于衷;但是当时,在那样的天空中,那样的矮丘上,那样的原野里,那样的树梢头,却有一种惊心动魄的凄凉之意,因此他在凝神伫立一阵之后,就猛然折回头走了。有些人的本能常使他们感到自然界是含有恶意的。他顺着原路回去。迪涅的城门都已关上了。迪涅城在宗教战争①中受过围攻,直到一八一五年,它周围还有着那种加建了方形碉楼的旧城墙,日后才被拆毁。他便经过那样一个缺口回到了城里。 + 当时应该已是晚上八点钟了,因为他不认识街道,他只得信步走去。 + 他这样走到了省长公署,过后又到了教士培养所。在经过天主堂广场时,他狠狠地对着天主堂扬起了拳头。在那广场角上有个印刷局。从前拿破仑在厄尔巴岛上亲自口授,继又带回大陆的诏书及《羽林军告军人书》便是在这个印刷局里第一次排印的。 + 他已经疲惫不堪,也不再希望什么,便走到那印刷局门前的石凳上躺下来。恰巧有个老妇人从天主堂里出来,她看见这个人躺在黑暗里,便说:“您在这儿干什么,朋友?”他气冲冲地、粗暴地回答说:“您看见的,老太婆,我在睡觉。”那老太婆,确也当得起这个称呼,她是 R侯爵夫人。“睡在这石凳上吗?”她又问。 + “我已经睡了十九年的木板褥子,”那人说,“今天要来睡睡石板褥子了。” + “您当过兵吗?” + ①指十六世纪叶叶法国新旧两派宗教进行的战争。 + “是呀,老太婆。当过兵。” + “您为什么不到客栈里去?” + “因为我没有钱。” + “唉!”R夫人说,“我荷包里也只有四个铜板。”“给我就是。”那人拿了那四个苏。R夫人继续说:“这一点钱,不够您住客栈。不过您去试过没有?您总不能就这样过夜呀。您一定又饿又冷。也许会有人做好事,让您住一宵。”“所有的门我都敲过了。” + “怎样呢?” + “没有一个地方不把我撵走。” + “老太婆”推着那人的胳膊,把广场对面主教院旁边的一所矮房子指给他看。 + “所有的门,”她又说,“您都敲过了?” + “敲过了。” + “敲过那扇没有呢?” + “没有。” + “去敲那扇去。” + 二 智慧与谨慎 + 那天晚上,迪涅的主教先生从城里散步回来,便关上房门,在自己屋子里一直呆到很晚的时候。当时他正在对“义务”问题进行一项巨大的著述工作,可惜没有完成。他开始要把从前那些神甫和博士们就这一 重大问题发表过的言论细心整理出来。他的著述分为两部分;第一部分是大众的义务,第二部分是各个阶层中个人的义务。大众的义务是重要义务。共分四种。根据圣马太的指示,分别分作对天主的义务(《马太福音》第六章),对自己的义务(《马太福音》第五章第二十九、三十 节),对他人的义务(《马太福音》第七章第十二节),对众生的义务(《马太福音》第六章第二十、二十五节),关于其他各种义务,主教又在别的地方搜集了一些关于其他各种义务的指示和规定,人主和臣民的义务,在《罗马人书》里;官吏、妻子、母亲、青年男子的义务,是圣保罗明确规定了的;丈夫、父亲、孩童、仆婢的义务,在《以弗所书》里;信徒的义务,在《希伯来书》里;闺女的义务,在《哥林多书》里。他正苦心孤诣地着手把所有这些条规编成一个协调的整体,以供世人阅读。 + 八点钟他还在工作,当马格洛大娘按平时习惯到他床边壁柜里去取银器时,他正在一张小方纸上勉强写着字,因为他膝头上正摊着一本碍手碍脚的厚书。过了一阵,主教觉得餐具已经摆好,他的妹妹也许在等待,他才合上书本,起身走进餐室。 + 那餐室是一间长方形的屋子,有个壁炉,门对着街(我们已经说过),窗子对着花园。马格洛大娘刚把餐具摆好。 + 尽管她忙于工作,却仍在和巴狄斯丁姑娘聊天。 + 桌子靠近壁炉,桌上放了一盏灯。炉里正燃着很大的火。我们不难想见那两个都已年逾六十的妇人,马格洛大娘矮孝肥胖、活跃,巴狄斯丁姑娘温和、瘦削、脆弱,比她哥哥稍高一点,穿件蚤色绸袍,那是一八○六年流行的颜色,是她那年在巴黎买的,一直保存到现在。如果我们用粗俗的字眼来说(有些思想往往写上一页还说不清楚,可是单用一个俗字便可表达出来),马格洛大娘的神气象个“村婆”,巴狄斯丁姑娘却象“夫人”。马格洛大娘戴顶白楞边帽,颈上挂了个小金十字,算是这家里独一无二的首饰了。她身穿玄青粗呢袍,袖子宽而短,领口里露出一条雪白的围脖,一根绿带子拦腰束住一条红绿方块花纹的棉布围裙,外加一块同样布料的胸巾,用别针扣住上面的两只角,脚上穿双马赛妇女穿的那种大鞋和黄袜。巴狄斯丁姑娘的袍子是照一八○六年的式样裁剪的,上身短,腰围紧,双肩高耸,盘花扣绊。她用一 顶孩童式的波状假发遮着自己的斑白头发。马格洛大娘的神气是伶俐、活泼、善良的,她的两只嘴角,一高一低,上唇厚,下唇薄,使她显得怫郁和躁急。只要主教不说话,她总用一种恭敬而又不拘形迹的态度和他谈个不休;主教一开口,她又和那位姑娘一样,变得服服贴贴唯命是从了,这是大家都见过的。巴狄斯丁姑娘则连话也不说。她谨守在听命与承欢的范围以内。即使是少年时期她也并不漂亮,她的蓝眼睛鼓齐面部,鼻子长而曲;但是她的整个面庞和整个人都含有一种说不出的贤淑气度,那是我们在开始时说过的。她生性仁厚,而信仰、慈悲、愿望,这三种使心灵温暖的美德,又慢慢把那种仁厚升为圣德了。她天生就是一头驯羊,宗教却已使她成为天使。可怜的圣女!不可复得的甜美的回 忆! + 巴狄斯丁姑娘曾把当天晚上发生过在主教院里的那些事对人传述过无数次,以致几个现在还活着的人,都还记得极其详荆主教先生走进来时,马格洛大娘正在兴高采烈地说着话。她正和“姑娘”谈着一个她所熟悉而主教也听惯了的问题,那就是关于大门的门闩问题。 + 好象是马格洛大娘在买晚餐食料时,在好几处听见了许多闲语。大家说来了一个形状古怪的宵小之徒,一个形迹可疑的恶棍,他大约已经到了城里的某个地方,今晚准备深夜回家的人也许会遭殃,而且警务又搞得很差,省长和市长又互不相容,彼此都想弄出一些事来,好嫁祸于人。所以聪明人只有自己负起警察的责任,好好地保护自己,并且应当小心,把各人的房子好好地关紧,闩起,堵住,尤其要好好地把各人的房门关上。 + 马格洛大娘把最后那句话说得格外响亮些,但是主教从他那间冷冰冰的屋子里走进来,坐在壁炉面前烤着火,又想着别的事了。他没让马格洛大娘刚才说的话发生影响。她只得再说一遍,于是巴狄斯丁姑娘为了想挽救马格洛大娘的面子而又不触犯哥哥,便冒着险,轻声说道:“哥,您听见马格洛大娘说的话没有?” + “我多少听见了一点。”主教回答说。随后,他把椅子转过一半,两手放在膝上,炉火也正从下面照着他那张笑容可掬的诚恳面孔,他抬起头对着那年老的女仆说:“好端端的。 + 有什么事?有什么事?难道我们有什么大不了的危险?”于是马格洛大娘又把整个故事从头说起,无意中也不免稍稍添油加醋。据说有一个游民,一个赤脚大汉,一个恶叫化子这时已到了城里。 + 他到过雅甘?拉巴尔家里去求宿,拉巴尔不肯收留他,有人看见他沿着加桑第大路走来,在街上迷雾里游来荡去。他是一个有袋子、有绳子、面孔凶恶的人。 + “真的吗?”主教说。 + 他既然肯向她探询,马格洛大娘自然更起劲了,在她看来,这好象表明主教已有意戒备了,她洋洋得意地赶着说:“是呀,主教。真是这样的。今天晚上城里一定要出乱子。大家都这样说。加上警务又搞得那么坏(这是值得再提到的)。住在山区里,到了夜里,街上连路灯也没有!出了门就是一个黑洞。我说过,主教,那边的姑娘也这样说??”“我,”妹妹岔着说,“我没有意见。我哥做的事总是好的。”马格洛大娘仍继续说下去,好象没有人反对过她一样:“我们说这房子一 点都不安全,如果主教准许,我就去找普兰?缪斯博瓦铜匠,要他来把从前那些铁门闩重新装上去,那些东西都在,不过是一分钟的事,我还要说,主教,就是为了今天这一夜也应当有铁门闩,因为,我说,一扇只有活闩的门,不管什么人都可以从外面推开进来,再没有比这更可怕的事了,加以主教平素总是让人随意进出,况且,就是在夜半,呵,我的天主!也不用先得许可??”这时,有人在门上敲了一下,并且敲得很凶。 + “请进。”主教说。 + 三 完全服从的勇气 + 门开了。门一下子便大大地开了,好象有人使出了大劲和决心在推它似的。有个人进来了。这人我们已经认识,便是我们刚才见过,到处求宿的那个过路人。他走进来,向前跨上一步,停下,让门在他背后敞着。他的肩上有个布袋,手里有根木棍,眼睛里有种粗鲁、放肆、困惫和强悍的神情。壁炉里的火正照着他,他那样子真是凶恶可怕,简直就是恶魔的化身。马格洛大娘连叫喊的力气都没有了。她大吃一惊,变得目瞪口呆。巴狄斯丁姑娘回头瞧见那人朝门里走,吓得站不直身子,过了一会才慢慢地转过头去,对着壁炉,望着她哥,她的面色又转成深沉恬静的了。 + 主教用镇静的目光看着那个人。他正要开口问那新来的人需要什么,那人双手抓在他的棍子,来回地看着老人和两个妇人,不等主教开口,便大声说:“请听我说。我叫冉阿让。我是个苦役犯。在监牢里过了十九年。出狱四天了,现在我要去蓬塔利埃,那是我的目的地。我从土伦走来,已经走了四天了,我今天一天就走了十二法里。天黑时才到这地方,我到过一家客店,只因为我在市政厅请验了黄护照,就被人赶了出来。而那又是非请验不可的。我又走到另外一家客店。他们对我说:‘滚!’这家不要我。那家也不要我。我又到了监狱,看门的人也不肯开门。我也到过狗窝。那狗咬了我,也把我撵了出来,好象它也是人一样,好象它也知道我是谁一样。我便跑到田野里,打算露天过一宵。可是天上没有星星。我想天要下雨了,又没有好天主来阻挡下雨,我再回到城里,想找个门洞。那边,在那空地里,有一块石板,我正躺下去,一个婆婆把您这房子指给我看,对我说:‘你去敲敲那扇门。’我已经敲过了。这是什么地方?是客店吗?我有钱。我有积蓄。一百○九个法郎十五个苏,我在监牢里用十九 年的工夫作工赚来的。可以付帐。那有什么关系?我有钱。我困极了,走了十二法里,我饿得很。您肯让我歇下吗?” + “马格洛大娘,”主教说,“加一副刀叉。” + 那人走了三步,靠近台上的那盏灯。“不是,”他说,仿佛他没有听懂一般,“不是这个意思。您听见了没有?我是一个苦役犯,一个罚作苦役的罪犯。我是刚从牢里出来的。”他从衣袋里抽出一张大黄纸,展开说:“这就是我的护照。黄的,您瞧。这东西害得我处处被人撵。您要念吗?我能念,我,我在牢里念过书。那里有个学校,愿意读书的人都可以进去。您听吧,这就是写在纸上的话:‘冉阿让,苦役犯,刑满释放,原籍??’您不一定要知道我是什么地方人,‘处狱中凡十九 年。计穿墙行窃,五年。四次企图越狱,十四年。为人异常险狠。’就这样!大家都把我撵出来,您肯收留我吗?您这是客店吗?您肯给我吃,给我睡吗?您有一间马房没有?” + “马格洛大娘,”主教说,“您在壁厢里的床上铺一条白床单。”我们已解释过那两个妇人的服从性是怎样的。 + 马格洛大娘马上出去执行指令。 + 主教转过身来,朝着那人。 + “先生,请坐,烤烤火。等一会儿,我们就吃晚饭,您吃饭的时候,您的床也就会预备好的。” + 到这时,那人才完全懂了。他的那张一向阴沉严厉的面孔显出惊讶、疑惑和欢乐,变得很奇特,他好象一个疯子,低声慢气地说:“真的呀?怎么,您留我吗?您不撵我走!一个苦役犯!您叫我做‘先生’!和我说话,您不用‘你’字。‘滚!狗东西!’人家总那样叫我。我还以为您一定会撵我走呢。并且我一上来就说明我是谁。呵!那个好婆婆,她把这地方告诉了我。我有晚饭吃了!有床睡了!一张有褥子、垫单的床!和旁人一样!十九年我都没有睡在床上了,您当真不要我走!您是有天良的人!并且我有钱。我自然要付帐的。对不起,客店老板先生,您贵姓?随便您要多少,我都照付。您是个好人。您是客店老板,不是吗?” + “我是一个住在这里的神甫。”主教说。 + “一个神甫!”那人说。“呵,好一个神甫!那么您不要我的钱吗?本堂神甫,是吗?那个大教堂里的本堂神甫。对呀!真是,我多么蠢,我刚才还没有注意看您的小帽子!” + 他一面说,一面把布袋和棍子放在屋角里,随后又把护照插进衣袋,然后坐下去,巴狄斯丁姑娘和蔼地瞧着他。他继续说:“您是有人道的,本堂神甫先生。您没有瞧不起人的心。一个好神甫真是好。那么您不要我付帐吗?” + “不用付帐。”主教说,“留着您的钱吧。您有多少?您没有说过一百○九个法郎吗?” + “还得加上十五个苏。”那人说。 + “一百○九个法郎十五个苏。您花了多少时间赚来的?”“十九年。” + “十九年!”主教深深地叹了一口气。那人接着说:“我的钱,全都在。这四天里我只用了二十五个苏,那二十五个苏是我在格拉斯地方帮着卸车上的货物赚来的。您既是神甫,我就得和您说说,从前在我们牢里有个布道神甫。一天,我又看见一个主教。大家都称他做‘主教大人’。那是马赛马若尔教堂的主教。他是一些神甫头上的神甫。请您原谅,您知道,我不会说话;对我来说,实在说不好!您知道,象我们这种人!他在监狱里一个祭台上做过弥撒,头上有个尖的金玩意儿。在中午的阳光里,那玩意儿照得好亮。我们一行行排着,三面围着。在我们的前面,有许多大炮,引火绳子也点着了。我们看不大清楚。他对我们讲话,但是他站得太靠里了,我们听不见。那样的就是一个主教。”他谈着,主教走去关上那扇还敞着的门。 + 马格洛大娘又进来,拿着一套餐具,摆在桌子上。 + “马格洛大娘,”主教说,“您把这套餐具摆在靠近火的地方。”他又转过去朝着他的客人:“阿尔卑斯山里的夜风是够受的。先生,您大约很冷吧?”每次他用他那种柔和严肃、诚意待客的声音说出“先生”那两个字时,那人总是喜形于色。“先生”对于罪犯,正象一杯水对于墨杜萨①的遇难者。蒙羞的人都渴望着别人的尊重。“这盏灯,”主教说,“太不亮了。” + 马格洛大娘会意,走到主教的卧室里,从壁炉上拿了那两个银烛台,点好放在桌上。 + “神甫先生,”那人说,“您真好。您并不瞧不起我。您让我住在您的家里,您为我点起蜡烛。我并没有瞒您我是从哪里来的,也没有瞒您我是一个倒霉蛋。” + 主教坐在他身旁,轻轻按着他的手。 + “您不用向我说您是谁。这并不是我的房子,这是耶稣基督的房子。这扇门并不问走进来的人有没有名字,但是要问他是否有痛苦。您有痛苦,您又饿又渴,您安心留下吧。并且不应该谢我,不应该说我把您留在我的家里。除非是需要住处的人,谁也不是在自己家里。您是过路的人,我告诉您,与其说我是在我的家里,还不如说您是在您的家里。这儿所有的东西都是您的。我为什么要知道您的名字呢?并且在您把您的名字告诉我以前,你已经有了一个名字,是我早就知道了的。” + 那个人睁圆了眼,有些莫名其妙。 + “真的吗?您早已知道我的名字吗?” + “对,”主教回答说,“您的名字叫‘我的兄弟’。”“真怪,神甫先生,”那人叫着说,“我进来时肚子真的很饿,但是您这么好,我已经不知道饿了,我已经不饿了。”主教望着他,向他说:“您吃过很多苦吧?” + “穿红衣,脚上拖铁球,睡觉只有一块木板,受热,受冷,做苦工,编到苦囚队里,挨棍棒!不犯什么事也得拖上夹链条。说错一个字就关进黑屋子。病在床上也得拖着链子,狗,狗还快乐些呢!十九年!我已经四十六岁了。现在还得带张黄护照,就这样。” + “是呀,”主教说,“您是从苦地方出来的。您听吧。一个流着泪忏悔的罪人在天上所得的快乐,比一百个穿白衣的善人还更能获得上天的喜爱呢。您从那样一个苦地方出来,如果还有愤怒憎恨别人的心,那您真是值得可怜的;如果您怀着善心、仁爱、和平的思想,那您就比我们中的任何人都还高贵些。”马格洛大娘把晚餐开出来了。一盆用白开水、植物油、面包和盐做的汤,还有一点咸肉、一块羊肉、无花果、新鲜乳酪和一大块黑麦面包。她在主教先生的日常食物之外,主动加了一 瓶陈年母福酒。 + 主教的脸上忽然起了好客的人所特有的那种愉快神情。“请坐。”他连忙说。如同平日留客晚餐一样,他请那人坐在他的右边,巴狄斯丁姑娘,完全宁静自如,坐在他的左边。 + 主教依照他的习惯,先做祷告,再亲手分汤。那人贪婪地吃了起来。主教忽然说:“桌上好象少了一件东西。”马格洛大娘的确没有摆上那三副绝不可少的餐具。照这一家人的习惯,主教留客晚餐时,总得在台布上陈设上那六份银器,这其实是一种可有可无的摆设。那种温雅的假奢华是这一家人的一种饶有情趣的稚气,把清寒的景象提高到富丽①墨杜萨(Meduse),船名,一八一六年七月二日在距非洲西岸四十海里地方遇险。一百四十九名旅客乘木排,在海上飘了十二天,旅客多因饥渴死去。获救者十五人。 + 的气派。马格洛大娘懂了他的意思,一声不响,走了出去,不大一会,主教要的那三副食具,齐齐整整地摆到了三位进餐人的面前,在台布上面熠熠生辉。 + 四 有关蓬塔利埃乳酪厂的详情 + 现在,为了把那餐桌上发生的事概略谈谈,最好是把巴狄斯丁姑娘写给波瓦舍佛隆夫人的信中的一段抄下来,那苦役犯和主教的谈话,在信中都有坦率而细致的叙述。 + “??那人对谁也不注意。他饿鬼一样贪婪地吃着。吃完汤以后,他说:“‘慈悲上帝的神甫先生,这一切东西对我来说还真是太好了,但是我还是得说,不愿和我一道吃饭的那些车夫,比您还吃得好些呢。’“私下说一句,我觉得这种比较有点刺耳。我哥答道:“‘他们要比我疲劳些。’“‘不,’那人接着说,‘他们的钱多些。您穷。我看得出来。您也许连本堂神甫也还不是吧。您只是一个普通神甫吧?岂有此理,如果慈悲上帝是公平的话,您理该当个神甫。’“‘公平两字远远不能全部表达慈悲上帝的好处。’我哥说。“过了一会,他又说:“‘冉阿让先生,您是要到蓬塔利埃去吗?’“‘那是指定的路程。’“我想他准是那样说的。随后他接下去说:“‘明天一早我就得动身。这段路是很难走的。晚上冷,白天却很热。’“‘您去的地方倒是个好地方,’我哥说,‘我家在革命时期破了产,起初我躲在法兰什?康地,靠自己的两条胳膊作工度日。我的毅力好。在那里我找到很多工作,只要我们肯去选择的话。有造纸厂、制革厂、蒸馏厂、榨油厂、规模很大的钟表制造厂、炼钢厂、炼铜厂,铁工厂就至少有二十个,其中四个在洛慈、夏蒂荣、奥当库尔和白尔,这些厂都是很大的。’“我想我没有弄错吧,我哥说的那些名字一定就是这几个了,随后他自己又把话打断,对我说:“‘亲爱的妹妹,我们有些亲戚是住在那里的吗?”“我回答说:“‘我们从前是有过的,在那些亲戚里有德?吕司内先生,革命之前,他是蓬塔利埃的卫戌司令。’“‘对的,’我哥接着说,‘但到了九三年大家都没有亲戚了,都只是靠自己的两只手。我做过工。在蓬塔利埃,您,冉阿让先生,将要去的那地方,有一种历史悠久而极有意思的实业,这就是我的妹他们叫做果品厂的那些乳酪厂。’“于是我哥边劝那人吃,边把蓬塔利埃果品厂的情况很详细地讲给他听。厂分两种,‘大仓’是富人的,里面有四十或五十头母牛,每个夏季可以产七千到八千个酪饼;还有合作果品厂,是穷人的,半山里的乡下人把他们的牛合起来大伙公养,产品也由大伙分享。他们雇用一个制酪工人,管他叫格鲁阑;格鲁阑把各会友的牛乳收下来,每天三次,同时把数量记在双合板上。四月末,乳酪厂的工作开始;六月中,那些制酪工人就把他们的牛牵进山里去了。 + “那人一面吃,一面精神也振作起来了。我哥拿那种好的母福酒让他喝,他却不愿喝,因为他说那种酒贵。我哥带着您所了解的那种怡然自得的愉快神情,把那些琐事讲给他听,谈时还不时显露出殷勤的态度。 + 他再三重复说那些格鲁阑的情况良好,好象他既迫切希望那人能懂得那是个安身的好地方,而又感到不便直截了当开导他似的。有件事给了我强烈的印象。那人的来历我已向您说过了,可是,我的哥,在晚餐期间直到就寝之前,除了在他刚进门时说了几句关于耶稣的话以外,再也没有说过一个字,能让那人意识到自己是什么人,也没有一个字能让那人看出我的哥是什么人。在那种场合,似乎很值得告诫他几句,并且可以把主教压在罪犯的头上,暂时给他留下一个印象。如果是别人碰上了这样一个可怜人,他也许会认为,在给以物质食粮的同时,还应当给以精神食粮,不妨在谴责当中附带教训开导一番,或是说些怜惜的话勉励他以后好好做人。我哥却连他的籍贯和经历都没有问。因为在他的过去里,有他的过失,我哥仿佛要避免所有会使他忆起那些事的话。他谈到蓬塔利埃的山民,只说他们接近青天,工作舒适。他还说他们快乐,因为他们没有罪过,正说到这儿,他突然停了下来,唯恐他无心说出的那两个字含有要触犯那人的意思。我仔细琢磨以后,自信领会了我哥的心思。他心里想,那个叫作冉阿让的人,心中苦恼太多了,最好是装出完全没有事的样子,使他感到轻松自在,使他认为他是和别人一样的一个人。那样,即使只是片刻,也是好的。那岂不是对慈善的最深切的了解吗?我慈祥的夫人,他那样撇开告诫、教训、暗示,岂不正是体贴入微,确实高明无比吗?人有痛处,最好的爱护,难道不是绝不去碰它吗?我想这或者就是我哥心里的想法了。不管如何,我可以说,即使他有过那些心思,就是对我也未曾流露过,自始至终,他完全是平时那个人,那晚他和冉阿让进餐,正和他陪着瑞德翁?勒普莱服先生或是总司铎管辖区的司铎进晚餐一样。 + “晚餐快完,大家正吃着无花果时,有个人来敲门。那是瑞波妈妈,手里抱着她的小孩。我哥吻了那孩子的额头,向我借去身上的十五个苏,给了瑞波妈妈。那人到了这时候,已经不大留心,注意力也已不怎么集中了。他不再说话,显得很疲倦。可怜的老瑞波走了之后,我哥念了谢食文,随后又转过身去,向那人说:‘您可能很需要上床休息了。’马格洛大娘赶紧收拾桌子。我知道我们应当走开,让那旅客去休息,两个人便一同上了楼。过了一阵,我又叫马格洛大娘把我房里的那张黑森林麂子皮送到那人的床上。夜里冰冷,那东西可以御寒。可惜那张皮已经旧了,毛已落光。它是我哥从前住在德国多瑙河发源地附近的多德林根城时买的,我在餐桌上用的那把象牙柄的小刀,也是在那地方同时买的。 + “马格洛大娘差不多即刻就上楼来了,我们在晾洗衣服的屋子里祷告了上帝,随后,各自回到自己的房间,没有再谈什么。” + 五 超然 + 和他的妹妹道过晚安以后,卞福汝主教从桌上拿起一个银烛台,并把另外那个递给他的客人,说:“先生,我来引您到您的房间里去。”那人跟着他走。 + 我们在上面已经提到过那所房子的结构形式,到那间有壁厢的祈祷室里去,或是从里面出来,都得经过主教的卧室。他们穿过那屋子时,马格洛大娘正在把那些银杯盏塞进他床头的壁橱,那是她每晚就寝以前最后要做的一件事。 + 主教把他的客人安顿在壁厢里。那里铺放着一张洁白的床。那人把烛台放在一张小桌上。 + “好了,”主教说,“好好睡一夜吧。明天早晨,您在动身以前,再喝一杯我们家里的热牛奶。” + “谢谢教士先生。”那人说。那句极平静的话刚说出口,他忽然加上了一个奇怪的动作,如果那两个圣女看见了,她们一定会吓得发呆。直到现在,我们还难于肯定他当时是受了什么力量的驱使。是要给个警告还是想进行恐吓呢?还是他受了一种连他自己也不能了解的本能的冲动呢?他蓦地转过身来对着那老人,叉起胳膊,用一种凶横的目光望着他的房主,并且粗声地喊道:“呀哈!真的吗?您让我睡在离你这样近的地方吗?”他又接着发出一阵狰狞的笑声,说道:“您都想清楚了吗?谁向您说了我没有杀过人呢?”主教抬起头,望着天花板,回答说:“那只关上帝的事。” + 随后,他严肃地动着嘴唇,仿佛一个做祷告或自言自语的人,伸出他右手的两个指头,为那人祝福,那人并未低头,他不掉头也不朝后看,就回到自己的屋子里去了。 + 壁厢里有人住时,他总把一面大哔叽帷布拉开,挡住神座。主教走过帷布跟前,跪下去做了一回短短的祈祷。过了一阵,他到了他的园子里,散步,潜思,默想,心灵和思想全寄托在上帝在夜晚为所有尚未睡眠的人显示的伟大神秘的事物上。 + 至于那人,实在太困了,连那洁白的床单也没有享用,他用鼻孔(这是囚犯们的作法)吹熄了蜡烛,和衣倒在床上,马上就睡熟了。 + 主教从园子里回到他的住宅时,钟正敲响十二点。几分钟之后,那所小房子里的一切全都入睡了。 + 六 冉阿让 + 半夜,冉阿让醒来了。冉阿让生在布里的一个贫农家里。他幼年不识字,成人以后,在法维洛勒做修树枝的工人。他的母亲叫让?马第,他的父亲叫冉阿让,或让来,让来大致是浑名,也是“阿让来了”的简音。 + 冉阿让生来就好用心思,但并不沉郁,那是情感丰富的人的特性。但是他多少有些昏昏沉沉、松松垮垮的样子,至少表面如此。他在很小时就父母双亡。他的母亲是因为害乳炎,又诊治不当而死的。他的父亲和他一样,也是个修树枝的工人,是从树上摔下来死的。冉阿让只剩一 个姐姐,姐姐孀居,有七个子女。把冉阿让抚养成人的就是这个姐姐。丈夫在世时,她一直负担着她小弟弟的生活。丈夫死了。七个孩子中最大的一个只有八岁,最小的一岁。冉阿让刚到二十五岁,他代行父职,帮助姐姐,报答她当年的抚养之恩。那是很自然的事,正如一种天职一 样,冉阿让甚至做得有些过头。他的青年时期便是那样干报酬微薄的辛苦工作而消磨掉的。他家乡的人从未听说他有过“女朋友”。他没有时间去考虑爱情问题。 + 天黑回家,他精疲力尽,一言不发,吃他的菜汤。他吃时,他姐姐让妈妈,时常从他的汤瓢里把他食物中最好的一些东西,一块瘦肉,一 片肥肉,白菜的心,选给她的一个孩子吃。他呢,俯在桌上,头几乎浸在汤里,头发垂在瓢边,掩着他的眼睛,只管吃,仿佛全没看见,让人家眩在法维洛勒的那条小街上,阿让茅屋的斜对面,住着一个农家妇女,叫玛丽—克洛德,阿让家的孩子们,挨饿是家常便饭,他们有时假冒他们母亲的名义,到玛丽—克洛德里那里去借一勺牛奶,躲在篱笆后面或路角上喝起来,大家把那奶罐抢来夺去,使那些小女孩子紧张得泼在身上、颈子上都是奶。母亲如果知道了这种欺诈行为,总会严厉惩罚这些小骗子们的。冉阿让气冲冲的,嘴里唠叨个不停,瞒着孩子们的母亲把牛奶钱照付给玛丽—克洛德,他们才没有挨揍。 + 在修树枝的季节里,他每天可以赚十八个苏,然后他就给人家当割麦零工、小工、牧牛人、苦工。他做他能做的事。他的姐姐也作工,但是拖着七个孩子怎么办呢?那是一群苦恼的人,穷苦把他们逐渐围困起来了。有一年冬季,冉阿让找不到工作。家里没有面包。绝对没有一点面包,但却有七个孩子。 + 一个星期日的晚上,住在法维洛勒的天主堂广场上的面包店老板穆伯?易查博,正准备去睡时,忽听见有人在他铺子的那个装了铁丝网的玻璃窗上使劲打了一下。他赶来正好看见一只手,从铁丝网和玻璃上被拳头打破的一个洞里伸进来,把一块面包抓走了。易查博赶忙追出来,那小偷也拚命跑,易查博跟在他后面追,捉住了他。他丢了面包,胳膊却还流着血。那正是冉阿让。 + 那是一七九五年的事。冉阿让被指控为“黑夜破坏有人住着的房屋入内行窃”,送到当时的法院。他原有一枝枪,他的枪法比世上任何枪手都好,有时他还喜欢私自打猎,那对他是很不利的。大家对私自打猎的人早有一种合法的成见。私自打猎的人正如走私的人,都跟土匪差得不远。但是,我们附带说一句,那种人和城市中那些卑鄙无耻的杀人犯比较起来,总还是有天壤之别的。私自打猎的人住在森林里,走私的人住在山中或海上。城市会使人变得凶残,因为它使人堕落腐化。山、海和森林使人变得粗野。它们只发展这种野性,却不泯灭人性。 + 冉阿让被判罪。法律的条文是死板的。在我们的文明里,有许多令人寒心的时刻,那就是刑法令人陷入绝境的时刻。一个有思想的生物被逐出社会,遭到了无可挽救的遗弃,那是何等悲惨的日子!冉阿让被宣判服五年苦役。 + 一七九六年四月二十二日,巴黎正欢呼意大利前线①总指挥(共和四 年花月二日执政内阁致五百人院咨文中称作 Buona Parte②的那位总指挥)在芒泰诺泰③所获的胜利。这同一天,在比赛特监狱中却扣上了一长串铁链。冉阿让便是锁在那铁链上的一个。当时的一个狱卒,现在已年近九十了,还记得非常清楚,那天,那个可怜人呆在院子的北角上,被锁在第四条链子的末尾。他和其它犯人一样,坐在地上。他除了知道他所处的地位可怕以外好象还完全不明所以。或许在他那种知识全无的穷人的混沌观念中,他多少也还觉得在这件事里他有些过火的地方。当别人在他脑后用大锤钉着他枷上的大头钉时,他不由得痛哭起来。眼泪使他气塞,呜咽不能成声。他只能断断续续地说:“我是法维洛勒修树枝的工人。”过后,他边痛哭,边伸起他的右手,缓缓地按下去,这样一 共做了七次,好象他依次抚摩了七个高矮不一的头顶。我们从他这动作上可以猜测到,他所做的任何事都全是为了那七个孩子的衣食。 + 他出发到土伦去。他乘着小车,颈上悬着铁链,经过二十七天的路程到了那地方。在土伦,他穿上红色囚衣。他生命中的一切全被消灭了,连他的名字也被消灭了。他已不再是冉阿让,而是二四六○一号。姐姐怎样了呢?七个孩子怎样了呢?谁会照顾他们呢?一棵年轻的树被人齐根锯了,它的那一撮嫩叶又怎样了呢? + 那是千篇一律的经过,那些可怜的活生生的人,上帝的创造物,从此无所依靠,无人指导,无处栖身,只得随着命运东飘西荡,谁还能知道呵?或者是人各一方,渐渐陷入苦命人的那种丧身亡命的凄凉的迷雾中,一经进入人类的悲惨行列,他们便和那些不幸的囚徒一样,一个接着一个地消失了。他们背井离乡。他们乡村里的钟塔忘了他们,他们田地边的界石也忘了他们,冉阿让在监牢里住了几年之后,自己也把那些东西忘了。在他的心上,从前有过一道伤口,后来只剩下一条伤痕,如是而已。关于他姐姐的消息,他在土伦自始至终只听见人家略略提到过一次,那似乎是在他坐监的第四年末。我已经想不起他是从什么地方得到了那消息的。有个和他们相识的同乡人看见过他姐姐,说她到了巴黎。她住在常德尔街,即圣稣尔比斯教堂附近的一条穷街。她只带着一个孩子,她最小的那个男孩。其余的六个到什么地方去了呢?也许连她自己①当时欧洲联盟国的军队从意大利和莱茵河两方面进攻法国,拿破仑从意大利出击,在意大利境内击溃奥地利军队以后,直逼维也纳,用一年时间,迫使奥地利求和。 + ②拿破仑出生于科西嘉岛,该岛原属意大利,一七六八年卖与法国。他的姓,Bonaparte(波拿巴),按原来意大利文写法是 Buonaparte。此处所言咨文,是将一字写成两字,盖当时其名未显,以致发生这一错误。 + ③芒泰诺泰(Montenotte),意大利北部离法国国境不远的一个村镇。 + 也不知道。每天早晨,她到木鞋街三号,一个印刷厂里去,她在那里做装订女工。早晨六点她就得到厂,在冬季,那个时候离天亮还很早。在印刷厂里有个小学校,她每天领着那七岁的孩子到学校里去读书。只不过她六点到厂,学校要到七点才开门,那孩子只好在院子里等上一个钟头,等到学校开门。到了冬天,那一个钟头是在黑暗中的露天里等过的。他们不肯让那孩子进印刷厂的门,因为有人说他碍事。那些工人清早路过那里时,总看见那小人儿沉沉欲睡地坐在石子路上,并且常常是在一 个黑暗的角落里,他蹲在地上,伏在他的篮子上便睡着了。下雨时,那个看门的老婆子看了过意不去,便把他引到她那破屋子里去,那屋子里只有一张破床、一架纺车和两张木椅,小孩便睡在屋角里,紧紧抱着一 只猫,这样可以少挨一点冻。到七点,学校开门了,他便跑进去。以上便是冉阿让听到的话。人家那天把消息告诉了他,那只是极短暂的一刹那,好象一扇窗子忽然开了,让他看了一眼他心爱的亲人们的命运后,随即一切又都隔绝了。从此以后,他再也没有听见人家说到过他们,永远没有得到过关于他们的其他任何消息,永远没有和他们再见面,也永远没有遇见过他们,并且就是在这一段悲惨故事的后半段,我们也不会再见到他们了。 + 到了第四年末,冉阿让有了越狱的机会。他的同伴帮助他逃走,这类事是同处困境中人常会发生的。他逃走了,在田野里自由地游荡了两天,如果自由这两个字的意义是这样的一些内容:受包围,时时向后看,听见一点声音便吃惊,害怕一切,害怕冒烟的屋顶、过路的行人、狗叫、马跑、钟鸣、看得见东西的白昼、看不见东西的黑夜、大路、小路、树丛、睡眠。在第二天晚上,他又被逮住了。三十六个小时以来他没有吃也没有睡。海港法庭对他这次罪过,判决延长拘禁期三年,一共是八年。到第六年他又有了越狱的机会,他要利用那机会,但是他也没能逃脱。点名时他不在。警炮响了,到了晚上,巡夜的人在一只正在建造的船骨里找到了他,他拒捕,但还是被捕了。越狱并且拒捕,那种被特别法典预见的享受了加禁五年的处罚。五年当中,要受两年的夹链。一共是十 三年。到第十年,他又有了越狱的机会,他又要趁机试一试,还是没有成功。那次的新尝试又被判了监禁三年。一共是十六年。到末了,我想是在第十三年内,他试了最后一次,所得的结果只是在四个钟头之后又被拘捕。那四个钟头换来了三年的监禁。一共是十九年。到一八一五年的十月里,他被释放了。他是在一七九六年关进去的,为了打破一块玻璃,拿了一个面包。此地不妨说一句题外的话。本书作者在他对刑法问题和法律裁判的研究里遇见的那种为了窃取一个面包而造成终身悲剧的案情,这是第二次。克洛德?格①偷了一个面包,冉阿让也偷了一个面包。英国的一个统计家说,在伦敦五件窃案里,四件是因为饥饿直接引起的。冉阿让走进牢狱时边痛哭,边颤栗,出狱时却无动于衷了;他进去时悲痛失望,出来时老气横秋。这个人的心曾有过何等样的波动呢? + ①克洛德?格(ClaudeGueux),雨果一八三四年所作的小说《克洛德?格》的主角。 + 七 和失望相关的 + 让我们试着叙述一下。社会必须正视这些事,因为这些事是它自己制造出来的。我们已经说过,冉阿让只是个没有知识的人,虽然并不是个愚蠢的人,他心中生来就燃着性灵的光。愁苦(愁苦也有它的光)更增加了他心里的那一点微光。他终日受着棍棒、鞭笞、镣铐、禁闭、疲乏之苦,受着狱中烈日的折磨,睡在囚犯的木板床上他扪心自问,反躬自剩他自己组织法庭。他开始审问自己。 + 他承认自己不是一个无罪之人,受的惩处也并不过分。他承认自己做了一种应该受指责的鲁莽行为;假使当初他肯向人乞讨那块面包,人家也许不会不给;无论给与不给,他总应该从别人的哀怜或自己的工作中,去等待那块面包;有些人说肚子饿了还能等待么?这并不是一条无可辩驳的理由;真正饿死的事根本就很少见到;并且无论是幸或不幸,人类生来在肉体上和精神上总是能长期受苦、多方受苦而不至于送命的;所以应当忍耐;即使是为那些可怜的孩子们着想,那样做也比较好一些;象他那样一个不幸的贱人也敢挺身和整个社会搏斗,还自以为依靠偷窃,就可以解决困难,那完全是一种疯狂举动;不管怎样,如果你通过一道门能脱离穷困,但同时又落入不名誉的境地,那样的门是一扇坏门;总而言之,他错了。 + 随后他又问自己: + 在他这次走上绝路的过程中,他是不是唯一有过错的人?愿意工作,但缺少工作,愿意劳动,而又缺少面包,首先这能不能不算是件严重的事呢?后来,犯了过错,并且供认了,处罚又是否苛刻过分了呢?法律在处罚方面所犯的错误,是否比犯人在犯罪方面所犯的错误更要严重些呢?天平的两端,处罚那端的砝码是否太重了一些呢?加重处罚绝不能消除过错;加重处罚的结果并不能扭转情势,并不能以惩罚者的过错代替犯罪者的过错,也并不能让犯罪的人转为受害的人,让债务人转为债权人,让侵犯人权的人受到人权的保障,这种看法对不对呢?企图越狱一次,便加重处罚一次,这种作法的结果,是否构成强者对弱者的谋害,是否构成社会侵犯个人的罪行,并使这种罪行每天都在重犯,一 直延续到十九年之久呢? + 他再问自己:人类社会是否有权使它的成员在某种情况下接受它那种毫无道理的漠不关心的态度,而在另一种情况下又同样接受它那种无情的不放心的态度,并使一个穷苦的人永远陷入一种不是缺乏(工作的缺乏)就是过量(刑罚的过量)的苦海中呢?贫富的形成往往由于机会,在社会的成员中,分得财富最少的人也正是最需要照顾的人,而社会对他们恰恰却又苛求最甚,这样是否是合情合理的呢? + 他提出这些问题,并作出结论之后,他便开始审判社会,并且判了它的罪。 + 他凭藉心中的愤怒判了它的罪。他认为社会对他的遭遇是应该负责的,他下定决心,将来总有一天,他要和它算帐。他宣称他自己对别人造成的损失和别人对他造成的损失,两相比较,太不平均,他最后的结论是他所受的处罚,实际上并不是不公平,而是肯定不平等的。 + 盛怒可能是疯狂和妄诞的,发怒有时也会产生过错的,但是,人,如果不是在某一方面确有情由,是不会愤慨的。冉阿让觉得自己是在愤慨了。 + 再说,人类社会所加给他的只有残害。他所看到的社会,历来都是摆在它的打击对象面前自称为正义的那一副怒容。世人和他接触,无非是为了要达到迫害他的目的。他和他们接触,每次都受到打击。从他的幼年,从失去母亲、失去姐姐以来,他从来没有听到过一句友好的话,也从未见过一次和善的面目。由痛苦到痛苦,他慢慢得出了一种结论:人生即战争,并且在这场战争里,他是一个失败者。他除了仇恨以外没有其他武器。于是他下定决心,要在监牢里磨练他的这种武器,并带着它出狱。 + 有些愚昧的教士在土伦办了一所囚犯学校,把一些必要的课程教给那些不幸人中的有毅力者。他就是那些有毅力者中的一个。他四十岁进学校,学习了读,写,算。他感到提高他的知识,也就是加强他的仇恨。在某种情况下,教育和智力都是可以起助恶的作用的。 + 有件事说来很可惜,他在审判了造成他的不幸的社会以后,他接着下来又审判创造社会的上帝。他也给上帝定了罪。 + 在那十九年的苦刑和奴役中,这个人的心是一面上升了,一面也堕落了。他一面醒悟,一面糊涂。我们已经知道,冉阿让并不是一个本性恶劣的人。初进监牢时他还是个好人。他在监牢里判了社会的罪后觉得自己的心狠起来了,在判了上帝的罪后他觉得自己成了天不怕地不怕的人。我们在这里必须得仔细想想。人的性情真能那样彻彻底底完全改变吗?人由上帝创造,生而性善,能通过人力使他变得性恶吗?灵魂能不能由于恶劣命运的影响彻底转变成恶劣的呢?人心难道也能象矮屋下的背脊一样,因痛苦的压迫过甚而蜷屈萎缩变为畸形丑态,造成各种不可救药的残废吗?在每个人的心里,特别是在冉阿让的心里,难道没有一点原始的火星,一种来自上帝的禀赋,在人间不朽,在天上不灭,可以因善而发扬、鼓舞、光大、昌炽,发为奇观异彩,并且永远也不会被恶完全扑灭吗? + 这是一些严重而深奥的问题,任何一个生理学家,如果他在土伦看见过这个苦役犯叉着两条胳膊,坐在绞盘的铁杆上休息(休息也就是冉阿让思前想后的时刻),链头纳在衣袋里,以免拖曳着,神情颓丧、严肃、沉默、若有所思;如果他看见过这个被法律抛弃的贱人,经常以愤怒的目光注视着所有的人,如果他看见过这个被文明排斥了的罪犯,经常以仇恨的神色仰望天空,他也许会不假思索地对上面那些问题中最后的一个回答:“没有。” + 当然,我们也并不想隐瞒,这位作为观察者的生理学家也许会在这种场合,看出一种无可挽回的悲惨结局,他也许会替那个被法律伤害了的人叫屈喊冤,可是他却连医治的方法也没有考虑过,他也许会掉转头,不望那个人心上的伤口,他并且会象那个掉头不望地狱门的但丁,把上帝写在每个人前额上的“希望”二字,从这个人的生命中拭掉。他的思想状况,我们已试着分析过了,冉阿让本人对自己的思想状况,是否和我们替本书读者试作的分析一样明白呢?构成冉阿让精神痛苦的那一切因素,在形成以后,冉阿让是否看得清楚呢?在它们一一形成的过程中,他又是否看清楚过呢?他的思想是层层推进的,他一天胜过一天地,被困在许多愁惨的景象中颠来倒去,多年以来,他的精神,就始终被局限在那些悲惨景象的范围中,粗鲁无文的他对这种思想的发展层次是否都了解呢?他对自己思想的起伏波动是否很明确呢?那是我们不敢肯定的,也是我们不敢相信的。冉阿让太缺乏知识了,他虽然受了那么多的痛苦,但对这些事,却仍是迷迷糊糊的,有时,他甚至还不知道他所感受的究竟是什么。冉阿让落入黑暗中,他便在黑暗中吃苦,他便在黑暗中愤恨,我们可以说,他无所不恨。他经常生活在暗无天日的环境中,如同一个盲人或梦游者一样瞎摸乱撞。不过,在某些时候,他也会,由于内因或外因,忽然感到一股怒气的突袭,一阵异乎寻常的苦痛,他会感到突然出现一道惨淡的、一闪而逝的光,照彻他的整个心灵,同时也使他命运中的种种险恶的深渊和悲惨的远景,在那片凶光的照射下在他的前后左右一齐出现。 + 闪光过后依旧是黑夜沉沉,他在什么地方?他又昏头昏脑了。 + 那种刑罚的最不人道,也就是说,最足以践灭人的智慧之处,就是它特别能使人经过一种慢性的毒害后逐渐变作野兽,有时还变成猛兽。冉阿让屡次执拗不改地图谋越狱,已足够证明法律在人心上所起的那种特别作用。冉阿让的那种计划完全是无济于事的,愚蠢的,但是只要有机会,他总要试一试,而绝不考虑它的后果,也不想到既得的经验。他象一头狼,看见笼门了,总要仓惶出逃。本能向他说:“快逃!”理智却会向他说:“留下!”但是面对那样强烈的引诱,他的理智终于消失了,剩下的只是本能。在那里活动着的只是兽性。他在重新被捕以后受到了新处罚,又足以让他更加惊惶失措。 + 有一件我们不该忽略的小事,就是他体质强壮,苦役牢里的那些人都比不上他。服劳役时,扭铁索,推绞盘,冉阿让抵得上四个人。他的手举得起、背也能够扛得动很大很重的东西。有时他可以代替一个千斤顶,千斤顶在从前叫做“骄子”,我们附带说一句,巴黎菜市场附近的那条骄子山街,便是因此得名的。他的伙伴们替他起了个浑名,叫冉千斤。一次,土伦市政厅正修理阳台,阳台下面有许多彼惹雕的人形柱,美丽可爱,其中一根脱了榫,几乎倒下来。当时冉阿让正在那里,他居然用肩头撑住了那根柱子等着其它工人来修理。 + 他身体的轻捷比他的力气更可赞叹。有些囚徒整年梦想潜逃,于是他们把巧和力结合起来,形成一种真正的科学。那些无时不羡慕飞虫飞鸟的囚徒,每日都练习一种神奇的巧技。冉阿让的特长便是能直登陡壁,在不易发现的凸处找出着力之处。他在墙角里把肘弯和脚跟靠紧石块上的不平处,便能利用背部和腿弯的伸张力,妖魔似的登到四楼。有时,他还用那种方法直上监狱的房顶。 + 他很少说话。他从不笑。必须要有一种外来的刺激才能使他发出一 种象是魔鬼笑声回音的苦笑,那也是一年难得一两次的事。看他那神气,仿佛随时在留心看着一种吓人的东西。 + 他的确是副一心一意在想什么事的样子。他的禀赋既不完全,智力又受了摧残,通过他那种不健全的分辨能力,他隐约感到有一种怪物附在他身上。他在那阴暗、惨白、半明不暗的地方过着非人的生活,他每次转过头颈,想往上看时,便又恐怖又愤怒地看见在自己头上,层层叠叠地有一堆大得可怕的东西,法律、偏见、人和事,堆积如山,直到望不见的高度,崇危险峻,令人心悸,它的形状不是他所能知的,它的体积使他心胆俱裂,这并不是别的东西,只是那座不可思议的金字塔,即我们所谓的文明。这儿那儿,在那堆蠢蠢欲动、形状畸异、忽远忽近的东西上和一些高不可攀的高原上,他看见一 群群的人,被强烈的光线照得须眉毕现,这儿是携带棍棒的狱卒,手握钢刀的警察,那边是戴着高冠的大主教,最高处,一片圆光的中央,却是戴着冠冕、耀人双目的帝王。远处的那些奇观异彩,似乎不但不能惊醒他的沉梦,反而让他更加悲伤,更加惶惑。举凡法律、偏见、物体、人和事,都按上帝在文明方面所指定的神秘复杂的动态,在他的头上来来去去,用一种凶残却又平和、安详却又苛刻、难以言喻的态度在践踏他,蹂躏他。所有沉在恶运底下、陷在无人怜恤的十八层地狱里面、被法律所摈弃的人们,觉得这个社会的全部重量都压在了他们的头上,这种社会对置身它外面的人是多么可怕,对置身它下面的人又是多么可怕。 + 在这种情况下,冉阿让东想西想,但是他的思想是怎样一种性质的呢? + 假使磨盘底下的黍粒有思维能力,它所想的也许就是冉阿让所想的了。 + 结果,那鬼影幢幢的现实和充满了现实的鬼域,替他构成了一种几乎无可言喻的内心景象。有时,他正在干着牢里的工作,会忽然停下不动,默想起来。他的那种比以前更为成熟、但也更为混乱的理性起来反抗了。他觉得他所遭受的一切都是不合理的。环绕他的一切都是不近人情的人。他常对自己说这是一场梦,他望着那个站在他几步之外的狱卒,会觉得那是一个鬼,那个鬼突然给他吃了一棍。 + 对他来说,这个历历可见的自然界是似有还无的。我们几乎可以说,对冉可让,无所谓太阳,无所谓春秋佳节,无所谓晴空,无所谓四月天的清凉晓色。我不知道是怎样一种黯淡的光,在常常照着他的心。 + 最后,如果我们要把我们以上所谈的一切,择其可以概括的概括起来,指出一个明确结果的话,我们只能说,冉阿让,法维洛勒的一个安分守己的修树枝工人,土伦的一个强顽的囚犯,由于监狱潜移默化的作用,十九年来已有能力做出两种坏的行为:第一种坏行为是急切的、不加考虑的、轻躁的、完全出自本能的,是对他所受痛苦的反击;第二种坏行为是阴郁的、持重的、平心静气考虑过的、用他从痛苦中得来的那种错误观念深思熟虑过的。他的打算经常经过三个连续的层次:思考,决心,固执;只有某种特殊性格的人才会走上这条路。起因是由于长期愤慨,心灵的苦闷,由于受虐待而引起的深刻的反感、对人的反抗,包括对善良、无辜、公正的人的反抗,假如世上真有这几种人存在的话。他一切思想的出发点和目的,全是对人类法律的仇恨;那种仇恨,在它发展的过程中,如果得不到某种神智来加以制止,就会在一定的时刻变为对社会的仇恨,进而变成对人类的仇恨,再变成对造物的仇恨,最后变成一种无目标、无止境、凶狠残暴的为害欲,不问是谁,逢人便害。我们知道,那张护照称冉阿让“为人异常险狠”,并不是没有理由的。年复一年,这个人的心慢慢地、但是无可救药地越变越硬了。他的心一硬,他的眼泪也就干了。直到他出狱的那天,十九年中,他没流过一滴泪。 + 八 波涛与亡灵 + 一个人掉进海里了!有什么关系!船是不会停的。风刮着,这条阴暗的船有它非走不可的航程。它驶过去了。那个人没了顶,随后又出现,浮浮沉沉,漂在水面,他叫喊,扬手,却无人听见他的喊声。船呢,在飓风里飘荡不定,人们正忙于操作,海员和旅客,对那个落水者,甚至连望都不望一眼了,他那个可怜的头只是沧海中的一颗粟而已。 + 他在深处发出了悲惨的呼号。那条驶去的帆船简直是个鬼影!他望着它,发狂似的望着它。它越去越远,船影渐淡,船身也渐小了。刚才他还在那船上,是船上人中的一员,和其余的人一道在甲板上来来往往,有他的一份空气和阳光,还是一个活生生的人。现在,出了什么事呢?他跌了一跤,掉了下去,这样就完了。 + 他被围困在惊涛骇浪中。他的脚只能踏着虚空,只能往下沉。迎风崩裂的波涛狠狠地包围着他,波峰波谷带着他反转上下,一缕缕的白练飞击到他的头上,一阵阵的狂澜向他喷唾,巨浪的口把他吞没殆尽;他每次下沉,都隐约看见那黑暗的深渊,一些未曾见过的奇怪植物抓住他,缠着他的脚,把他扯往它们那里去;他觉得自己也成了旋涡,也成了泡沫的一部分,波涛把他来回抛掷;他喝着苦汁,无情的海水前仆后继,定要把他淹没,浩瀚的大海在拿他的垂死挣扎取乐。好象这里的水对他全怀有仇恨。 + 但是他仍旧挣扎,尽力拯救自己,他鼓起精神,奋力泅泳。他微弱的力气立刻耗尽了,却仍旧和无边无际的波涛博斗着。船到哪里去了?在前面。在水天相接、惨淡无光的远方,仿佛还隐约可辨。 + 狂风在吼,无穷的浪花在向他狂扑。他抬起眼睛,只见灰暗行云的颜色。他气息奄奄地目击大海的疯狂,而这种疯狂已把他置于绝境了。他听见一片从未听过的怪声,仿佛是从世外、从不知何处的恐怖国度中飞来。 + 在云里有许多飞鸟,如同在人生祸患的上面有许多天使。但是它们和他有什么相干呢?它们飞、鸣、翱翔;至于他,他挣扎待毙。他觉得自己同时被两种广大无边的东西所掩埋:海与天,一种是墓穴,一种是殓衣。黑夜来了,他已泅泳了好几个钟头,力气用尽了,那条船,那条载着一些人的远远的船,已经不见了。他孤零零陷在那可怕的、笼罩在暮色中的深渊里,他往下沉,他挣扎,他扭动身体。在他的身底下他感到有些目不能见的渺茫的怪物。他号呼着。人全不在了。上帝又在什么地方呢? + 他喊着,救命呀!救命呀!他不停地喊着。水边没有一点东西,天上也没有一点东西。他向空际、波涛、海藻、礁石哀求,它们都听而不闻;他向暴风央求,坚强的暴风只服从太空的号令。在他四周的是夜色、暮霭、寂寥、奔腾放逐的骚乱、不停起伏的怒涛。在他的身体中只有恐怖和疲惫。在他的脚下只有一片虚空,没有立足之处。他想到他的尸体将漂浮在那无限凄凉的幽冥里。无底的冷水使他僵直。他的手痉挛,握着的是虚空。风,云,漩流,狂飙,无用的群星!怎么办呵?那失望的人只有听从命运摆布了,穷于应付的人往往坐以待毙,他只得听其自然,任其飘荡,不再抵抗了,看啊,他从此落入灭亡的阴惨深渊中去了。呵,人类社会历史不变的行程!途中要丧失多少人和灵魂!人类社会是所有那些被法律抛弃了的人的汪洋!那里最惨的是没有援助!呵,这是精神的死亡! + 海,就是冷酷无情的法律抛掷它牺牲品的总渊薮。海,等于无边的苦难。 + 漂在那深渊里的心灵会变成尸体,将来谁又来使它复活呢? + 九 新伤 + 当冉阿让出狱时,他听见有人在他耳边说了这样一句奇特的话,“你自由了”,那一刻竟仿佛是非真实的,闻所未闻的;一道从未有过的强烈的光,一道人生的真实的光突然射进他的心里。但是这道光,一会儿就黯淡下去了。冉阿让起初想到自由,不禁欣喜若狂,他以为获得新生命了。但他很快又想到,既然拿的是一张黄护照,所谓自由也就是那么一回事。 + 而且在这件事也还有不少的苦恼。他计算过,他的储蓄,按照他在狱中度过的岁月计算,本应有一百七十一个法郎。还应当指出,十九年中,礼拜日和节日的强制休息大致要使他少嫌二十四个法郎,他还忘了把那个数目加入他的帐目。不管怎样,他的储蓄经过一贯的七折八扣以后,已减到一百○九个法郎十五个苏。那便是他在出狱时所领到的数目。他虽然不了解这其中的道理,但他还是感到他吃了亏。让我们把话说明白,他是被人偷窃了。出狱的第二天,他到了格拉斯,他在一家橙花香精提炼厂的门前,看见许多人在卸货。他请求参加工作。那时工作正忙,他们同意了。他便干了起来。他聪明、强壮、伶俐,他尽力搬运,主人似乎也满意。正在他工作时,有个警察走过,注意到他,便向他要证件。他只好把那黄护照拿出来。警察看完以后,冉阿让又去工作。他先头问过一个工人,做那种工作每天可以赚多少钱。那工人回答他说:“三十个苏。”到了晚上,他走去找那香精厂的厂主,要求把工资付给他,因为第二天一早他便得上路。厂主没说一句话,给了他二十五个苏。他提出要求。那人回答他说:“这对你已是够好的了。”他坚持要。那主人睁圆了两眼对他说:“小心黑屋子。” + 那一次,他又觉得自己被偷窃了。 + 社会、政府,在削减他的储蓄上大大地抢窃了他一次,现在是轮到那小子来抢窃他了。 + 被释放并不等于得到解放。他虽然出了牢狱,却仍背着罪名。 + 那就是他在格拉斯遇到的事,至于后来他在迪涅受到的对待,我们已经了解了。 + 十 那个人醒了 + 天主堂的钟正敲着早晨两点,冉阿让醒了。那张床太舒服,所以他醒了。他没床睡已经快十九年了,他虽然没有脱衣,但那种感受太新奇,不会不影响他的睡眠。他睡了四个多钟头,疲乏已经过去。他早已习惯了不在休息上多费时间。 + 他睁开眼睛,向他四周的黑暗望了一会儿,随后又闭上眼,想再睡一阵。 + 如果白天的感触太多,脑子里的事太复杂,我们就只能睡,而无法重新入睡,睡容易,再睡便难。这正是冉阿让的情形。他无法再睡了,他便想。 + 他正陷入这种思想紊乱的时刻,在他的脑中有一种看不见的、来来去去的东西。旧恨和新愁在他的心里翻来倒去,凌乱杂沓,漫无条理,既失去它们的形状,也无限扩大了它们的范围,随后又仿佛忽然消失在一股汹涌的浊流中。他想到许多事,但是其中有一件却反反复复出现,并且排开了其余的事。这一件,我们立即说出来,他留意到了马格洛大娘先头放在桌上的那六副银器和那只大汤勺。 + 那六副银器使他烦懑。那些东西就在那里。只有几步路。刚才他经过隔壁那间屋子走到他房里来时,老大娘正把那些东西放在床头的小壁橱里。他特别注意了那壁橱。进餐室,朝右走。那些东西多重呵!并且是古银器,连那把大勺最少也能卖二百法郎。那将是他在十九年里所赚的一倍。的确,假使“官府”没有“偷盗”他,他也许还能多赚一点。他心里反反复复,踌躇不决,斗争了整整一个钟头。三点敲过了。他重新睁开眼睛,忽然坐了起来,伸手去摸他先头丢在壁厢角里的那只布袋,随后他垂下两腿,又把脚踏在地上,几乎是不知道怎样坐在了床边的。 + 他那样坐着,发了一阵呆,房子里的人全睡着了,唯有他独自一人醒着,如果有人看见他那样呆坐在黑暗角落里,一定会大吃一惊的。他忽然弯下腰去,脱下鞋子,轻轻放在床前的席子上,又恢复他那发呆的样子,坐着不动。 + 在那种可怕的斗争中,我们刚指出的那种念头不停地在他的脑海里翻搅着,进去又出来,出来又进去,使他感到了一种压力;同时他不知道为什么,会带着梦想中那种机械的顽固性,想到他从前在监狱里认识的一个叫布莱卫的囚犯,那人的裤子只用一根棉织的背带吊祝那根背带的棋盘格花纹不停地在他脑子里显现出来。 + 他在那种情形下呆着不动,并且可能会一直呆到天明,如果那只挂钟没有敲那一下——报一刻或报半点的一下。那一下仿佛是对他说:“来吧!” + 他站起来,又迟疑了片刻,再侧耳细听,房间里一点动静也没有,于是他小步小步一直朝前,走到了隐约可辨的窗边。当时夜色并不很暗,风高月圆,白云掩映;云来月隐,云过月明,因此窗外忽明忽暗,室内也偶有微光。那种微光,足够让室内的人行走,由于行云的作用,屋内也乍明乍暗,仿佛是人在地下室里,见风窗外面不时有人来往一样,因而室内黯淡的光也忽强忽弱。冉阿让走到窗子边,把它仔细看了一遍,它没有铁闩,只有它的活梢扣着,这原是那地方的习惯。窗外便是那园子。他把窗子打开,于是一股冷气突然钻进房来,他又马上把它关上。他仔仔细细把那园子瞧了一遍,应当说,探视了一遍。园的四周绕着一 道白围墙,相当低,容易越过。在园子的尽头,围墙外面,他看见成列的树梢,彼此距离相等,说明墙外便是一条林荫道,或是一条栽有树木的小路。 + 看了那一眼之后,他做了一个表示下决心的动作,向壁厢走去,拿起他的布袋,打开,从里面搜出一件东西,放在床上,又把他的鞋子塞进袋里,扣好布袋,驮在肩上,戴上他的便帽,帽檐齐眉,又伸手去摸他的棍子,把它放在窗角上,再回到床边,坚决地拿起先头放在床上的那件东西。好象是根短铁钎,一端磨得和标枪一样尖。在黑暗里我们不易辨出那铁钎是为了作什么用才磨成那个样子的。这也许是根撬棍,也许是把铁杵。 + 如果是在白天,我们便认得出来,那只是一根矿工用的蜡烛钎。当时,常常派犯人到土伦周围的那些高丘上去采取岩石,他们便常常持有矿工的器械。矿工的蜡烛钎是用粗铁条做的,下面一端尖,为了便于插在岩石里。 + 他用右手握住那根烛钎,屏住呼吸,脚步放轻,走向隔壁那间屋子,我们知道,那是主教的卧房。走到门边,他看见门是掩着的,留了一条缝。主教并未关上它。 + 十一 他所做的 + 冉阿让侧耳细听。一点声响也没有。他推门。 + 他用指尖推着,轻轻地、缓缓地、正如一只胆怯心细、想要进门的猫。 + 门被推以后,静悄悄地移动了几乎不能察觉的那么一点点,缝也稍宽了一丝。 + 他等待了一会,再推,这次使力比较大。门悄然逐渐开大了。现在那条缝已能容他身子过去。但是门旁有张小桌子,桌子摆放的角度堵住了路,妨碍他通过那门缝。冉阿让了解那种困难。不管如何,他非得把门推得更开一些不可。 + 他打定主意,再推,比先头两次更用力一些。这一次,却有个门臼,由于润滑油干了,在黑暗里突然发出一种嘶哑延续的声响。 + 冉阿让大吃一惊。在他耳边门臼的响声就和末日审判的号角那样洪亮吓人。 + 在开始行动的那一刹那,由于幻想的扩张,他几乎认为那个门臼活起来了,并且具有一种异常的活力,就象一头狂叫的狗要向他家告警,要叫醒那些睡着的人。 + 他停下来,浑身哆嗦,不知所措,他原是踮着脚尖走路,现在连脚跟也着地了。他听见他的动脉在两边太阳穴里,象两个铁锤那样敲打着,胸中呼出的气也好象来自山洞的风声。他认为那个发怒的门臼所发出的那种震耳欲聋的声响,如果不是天崩地裂般的把全家惊醒,那是不可能的。他推的那扇门已有所警惕,并且已经叫喊;那个老人就要起来了,两个老姑娘也要大叫了,还有旁人都会前来搭救;不到一刻钟,满城都会骚乱,警察也会出动。他一下子认为自己完了。 + 他立在原处惊惶失措,好象一尊石人,一动也不敢动。 + 几分钟过去了。门大大地开着。他冒险把那房间瞧了一下。丝毫没有动静,他伸出耳朵听,整所房子里没有一点声音。那个锈门臼的响声并未惊醒任何人。 + 第一次的危险已经过去了,但是他心里仍旧惊恐难安。但是他并不后退。即使是在他以为一切没有希望时,他也没有后退。他心里只想到要干就得抓紧。他向前一步,便跨进了那房间。 + 那房间是完全寂静的。这儿那儿,他看见一些模糊紊乱的形影,如果是在白天便看得出来,那只是桌上一些零乱的纸张、展开的表册、圆凳上堆着的书本、一把堆着衣服的安乐椅、一把祈祷椅,可是在此时,这些东西却一齐变为黑黝黝的空穴和迷濛难辨的地带。冉阿让仍朝前走,谨慎小心,唯恐撞到了家具。他听到主教熟睡在那房间的尽头,发出均匀安静的呼吸。 + 忽然他停下来。他已到了床边。他自己并没有料到会那样快就到了主教的床边。 + 上天有时会在适当时刻,使万物的景象和人的行动发生巧妙的配合,从而产生出深刻的效果,仿佛有意要我们多多思考似的。大致在半个钟头以前,就已有一大片乌云遮着天空。正当冉阿让停在床前,那片乌云忽然散开了,好象是故意要那样做一样,一线月光也随即穿过长窗,正正照在主教的那张苍老的脸上。主教正安安稳稳地睡着。他几乎是和衣睡在床上的,因为下阿尔卑斯一带的夜晚很冷,一件棕色的羊毛衫盖住他的胳膊,直到腕边。他的头仰在枕头上,那正是安心休息的姿态,一只手垂在床边,指上戴着主教的指环,多少功德都是由这只手圆满了的。他的面容隐隐显出满足、乐观和安详的神情。那不仅仅是微笑,还差不多是容光的焕发。他额上反映出灵光,那是我们看不见的。心地正直的人在睡眠中也在景仰那神秘的天空。 + 来自天空的一线光彩正照射在主教的身上。同时他本身也是光明剔透的,因为那片天就在他的心里。那片天就是他的信仰。正当月光射来重叠(不妨这样说)在他的心光上之际,熟睡着的主教就象是被包围在一圈灵光里。那种光却是柔和的,涵容在一种无可言喻的半明半暗的光里。天空的那片月光,地上的这种沉寂,这个了无声息的园子,这个静谧的人家,此时此刻,万籁俱寂,这一切,都使那慈祥老人酣畅的睡眠有着一种说不出的奇妙庄严的神态,并且还以一种端详肃静的圆光环绕着那头白发和那双合着的眼睛,那种充满了希望和赤忱的容颜,老人的面目和赤子般的睡眠。 + 这个人不经意的无上尊严几乎可以和神明相媲美。 + 冉阿让,他,却待在黑影里,手中拿着他的铁烛钎,立着不动,望着这位全身焕发光亮的老人,有些胆寒。他从来没有见过这样的人。他那种待人的赤忱使他惊骇。一个心怀叵测、濒于犯罪的人在景仰一个睡乡中的至人,精神领域中没有比这更为宏伟的场面了。 + 他孤零零独自一人,却酣然睡在那样一个陌生人的旁边,他那种卓绝的心怀冉阿让多少也感觉到了,不过他不为所动。谁也说不出他的心情,连他自己也说不出。如果我们真要领会,就必须设想一种极端强暴的力和一种极端温和的力的并立。即使是从他的面色上,我们也肯定不能分辨出什么来。那只是一副凶顽而又惊骇的面孔。他望着,如此而已。但是他的心境是怎样的呢?那是无从揣测的。不过,他受到了感动,受到了困扰,那是很明显的。但是那种感动究竟属于什么性质的呢?他的眼睛没有离开老人。从他的姿势和面容上显露出来的,仅仅是一种奇特的犹豫神情。我们可以说,他正面对着两种关口而踌躇不前,一种是自绝的关口,一种是自救的关口。他仿佛已准备要击碎那头颅或去吻那只手。 + 过了一会,他缓缓地举起他的左手,直到额边,脱下他的小帽,随后他的手又同样缓缓地落下去。冉阿让重又堕入冥想中了,左手拿着小帽,右手拿着铁钎,头发乱竖在他那粗野的头上。 + 尽管他用如此可怕的目光望着主教,但主教仍安然酣睡。月光依稀照着壁炉上的那个耶稣受难像,他仿佛把两只手同时向他们两人伸出,为一个降福,为另一个赦宥。忽然,冉阿让拿起他的小帽,戴在头上,不看主教,急忙顺着床边,向他从床头能隐隐望见的那个壁橱走去,他翘起那根铁烛钎,好象要撬锁似的,但钥匙就插在那上面,他打开橱,他最先见到的东西,便是那篮银器,他提着那篮银器,大踏步穿过那间屋子,也不顾弄出声响了,走到门边,进入祈祷室,推开窗子,拿起木棍,跨过窗台,把银器放进布袋,丢下篮子,穿过园子,老虎般的跳过墙头逃走了。 + 十二 主教工作 + 第二天一早,卞福汝主教正在他的园子中散步。马格洛大娘慌慌张张地向他跑来。 + “我的主教,我的主教,”她喊着说,“大人可知道那只银器篮子在什么地方吗?” + “知道的。”主教说。 + “耶稣上帝有灵!”她说。“我刚才还说它到什么地方去了呢。”主教刚在花坛脚下捡起了那篮子,把它交给马格洛大娘。“篮子在这儿。” + “怎样?”她说。“里面一点东西也没有!那些银器呢?”“呀,”主教回答说,“您原来是问银器吗?我不知道在什么地方。” + “大哉好上帝!给人偷去了!是昨天晚上那个人偷了的!”一转眼间,马格洛大娘已经用急躁老太婆的全部敏捷劲儿跑进祈祷室,穿进壁厢,又回到了主教那儿。 + 主教正弯下腰去,悼惜一株被那篮子压折的秋海棠,那是篮子从花坛落到地下把它压折了的。主教听到马格洛大娘的叫声,又直起身来。 + “我的主教,那个人已经走了!银器也被偷去了。”她一面嚷,眼睛却盯在园子的一角上,那儿还看得出越墙的痕迹。 + 墙上的垛子也被弄掉了一个。 + “您看!他是从那儿逃走的。他跳进了车网巷!呀!可耻的东西!他偷了我们的银器!” + 主教沉默了一阵,随后他睁开那双严肃的眼睛,柔声向马格洛大娘说:“首先,那些银器难道真是我们的吗?”马格洛大娘不敢说下去了。又是一阵沉寂,随后,主教继续说:“马格洛大娘,我占用那些银器已经很久了。那是属于穷人的。那个人是什么人呢?当然是个穷人了。” + “耶稣,”马格洛大娘又说,“不是为了我,也不是为了姑娘,我们是不要紧的。但我是为了我的主教着想。我的主教现在用什么东西盛饭菜呢?”主教露出一副惊奇的神情瞧着她。 + “呀!这话怎讲!我们不是有锡器吗?” + 马格洛大娘耸了耸肩。 + “锡器有一股臭气。” + “那么,铁器也可以。”马格洛大娘做出一副怪样子:“铁器有一股怪味。” + “那么,”主教说,“用木器就是了。”过了一阵,他坐在昨晚冉阿让坐过的那张桌子边用早餐。卞福汝主教一面吃,一面高高兴兴地叫他那哑口无言的妹妹和叽哩咕噜的马格洛大娘注意,他把一块面包浸在牛奶里,连木匙和木叉也都不用。 + “真想不到!”马格洛大娘边走来走去,边自言自语,“招待这样一个人,并且让他睡在自己的旁边!幸而他只偷了一点东西!我的上帝!想想都使人寒毛直竖。” + 正在兄妹俩要离开桌子时,有人敲门。 + “请进。”主教说。门开了,一群凶巴巴的陌生人出现在门边。三个人揪着另一个人的衣领。那三个人是警察,另一个就是冉阿让。一个警察队长,看上去是率领那群人的,开始时站在门边。他进来后,行了个军礼,向主教走去。 + “我的主教??”他说。冉阿让先头好象是垂头丧气的,听了这称呼,忽然抬起头来,露出大吃一惊的神色。 + “我的主教,”他低声说,“那么,他不是本堂神甫了??”“不准开口!”一个警察说,“这是主教先生。” + 但是卞福汝主教尽他的高年所允许的速度迎上去。 + “呀!您来了!”他望着冉阿让大声说,“我真高兴看见您。怎么!那一对烛台,我也送给您了,那和其它的东西一样,都是银的,您可以变卖二百法郎。您为什么没有把那对烛台和餐具一同带去呢?” + 冉阿让睁圆了眼睛,看着那位年迈可敬的主教。他的面色,绝无一 种人类文字可以表现得出来。 + “我的主教,”警察队长说,“难道这人说的话是真的吗?我们碰到了他。他走路的样子好象是个想逃跑的人。我们就把他拦下来看看。他拿着这些银器??”“他还向你们说过,”主教笑容可掬地岔着说,“这些银器是一个神甫老头儿给他的,他还在他家里住了一夜。我知道这是怎么回事。你们又把他带回到此地。对吗?你们误会了。”“既是这样,”队长说,“我们可以把他放走吗?”“当然。”主教回答说。 + 警察放了冉阿让,他向后退了几步。 + “你们真让我走吗?”他说,仿佛是在梦中,字音也差点没吐清楚。 + “是的,我们让你走,你耳朵聋了吗?”一个警察说。“我的朋友,”主教又说,“您在走之前,不妨把您的那对烛台拿去。” + 他走到壁炉边,拿了那两个银烛台,送给冉阿让。那两个妇人没有说一个字、做一个手势或露一点神气去阻扰主教,她们看着他行动。冉阿让全身发抖。他机械地接了那两个烛台,完全不知所措。“现在,”主教说,“您可以放心走了。呀!还有一件事,我的朋友,您再来时,不必走园子里。您随时都可以从街上的那扇门进出。白天和夜里,它都只上一个活闩。” + 他转过去朝着那些警察: + “先生们,你们可以回去了。”那些警察走了。 + 这时的冉阿让就象是个要昏厥的人。主教走到他身边,低声向他说:“不要忘记,永远不要忘记您允诺过我,您用这些银子是为了成为一个诚实的人。” + 冉阿让绝对回忆不起他曾允诺过什么话,他呆着无法开口。主教说那些话是一字一字叮嘱的,他又郑重地说:“冉阿让,我的兄弟,您现在已不是恶那一方面的人了,您是在善的一面了。我赎的是您的灵魂,我把它从黑暗的思想和自暴自弃的精神里救出来,交还给上帝。” + 十三 小瑞尔威 + 冉阿让逃跑一样的出了城。他在田野中仓惶乱窜,不问大路小路,碰着就走,也不觉得他老在原处兜圈子。他那样瞎跑了一早晨,没吃东西,也不知道饿。他被一大堆新的感触抑制住了。他觉得自己怒不可遏,却又不知道怒从何来。他说不出他是受了感动还是受了侮辱。有时他觉得心头有一种奇特的柔和滋味,他却和它抗拒,拿了他过去二十年中立志顽抗到底的心情来抗拒。这种情形使他感到疲乏。过去使他受苦的那种不公平的处罚,早已使他决心为恶,现在他觉得那种决心动摇了,反而感到不安。他问自己:以后将用什么志愿来代替那种决心?有时,他的确认为如果没有这些经过的话,他仍能和警察相处狱中,他也许还高兴些,他心中也就可以少起一些波动。当时虽然已近岁暮,可是在青树篱中,三三两两,偶然也还有几朵迟开的花,他闻到花香,触起了童年的许多往事。那些往事对他几乎是不堪回首的,他已有那么多年不再去想它了。 + 因此,在那一天,有很多各种各样莫名其妙的感触一齐涌上了他的心头。 + 正当落日西沉、地面上最小的石子也拖着细长的影子之际,冉阿让坐在一片绝对荒凉的红土平原中的一丛荆棘后面。远处,只望见阿尔卑斯山。连远村的钟楼也望不见一个。冉阿让离开迪涅城大概已有三法里了。在离开荆棘几步的地方,横着一条穿过平原的小路。 + 他正在胡思乱想,当时如果有人走来,见了他那种神情,必然会感到他那身破烂衣服格外可怕。正在那时,他忽然听到一阵欢快的声音。他转过头,看见一个十岁左右的穷孩子沿着小路走来,嘴里唱着歌,腰间有一只摇琴,背上有一只田鼠笼子,这是一个那种嬉皮笑脸、四乡游荡、从裤腿窟窿里露出膝头的孩子中的一个。那孩子一面唱,一面又不时停下,拿着手中的几个钱,做“抓子儿”游戏,那几个钱,大概就是他的全部财产了。里面有一个值四十苏的钱。 + 孩子停留在那丛荆棘旁边,没有看见冉阿让,把他的一把钱都抛了起来,他相当灵巧,每次都个个接在手背上。可是这一次他那个值四十 苏的钱落了空,向那丛荆棘滚了去,滚到了冉阿让的脚边。 + 冉阿让一脚踏在上面。 + 可是那孩子的眼睛早紧跟着那个钱,他看见冉阿让用脚踏着它。他一点也不惊慌,直向那人走去。那是一处绝对没有人的地方。在视线所及的范围内,绝没有一个人在平原和小路上。他们听见一群掠空而过的飞鸟,从高空送来微弱的鸣声。那孩子背朝太阳,日光把他的头发照成缕缕金丝,用血红的光把冉阿让凶悍的脸照成了紫色。 + “先生,”那穷孩子用蒙昧和天真合成的赤子之心说,“我的钱呢?” + “你叫什么?”冉阿让说。 + “小瑞尔威,先生。”“滚!”冉阿让说。 + “先生,”那孩子又说,“请您把我的那个钱还我。”冉阿让低下头,不答话。 + 那孩子再说: + “我的钱,先生!”冉阿让的眼睛仍旧盯在地上。 + “我的钱!”那孩子喊起来,“我的白角子!我的银钱!”冉阿让好象全没听见。那孩子抓住他的布衫领,推他。同时使劲推开那只压在他的宝贝上面的铁钉鞋。 + “我要我的钱!我要我值四十个苏的钱!”孩子哭起来了。冉阿让抬起头,仍旧坐着不动。他眼睛的神色是迷糊不清的。他望着那孩子有点感到惊奇,随后,他伸手到放棍子的地方,大声喊道:“谁在那儿?” + “是我,先生,”那孩子回答,“小瑞尔威。我!我!请您把我的四十个苏还我!把您的脚拿开,先生,求求您!”他年纪虽小,却动了火,几乎有要硬干的神气:“哈!您究竟拿不拿开您的脚?快拿开您的脚!听见了没有?”“呀!又是你!”冉阿让说。 + 随后,他忽然站起来,脚仍旧踏在银币上,接着说:“你究竟走不走!” + 那孩子吓坏了,望着他,随后从头到脚哆嗦起来,发了一会呆,逃了,他拚命跑,不敢回头,也不敢叫。但他跑了一程过后,喘不过气了,只好停下来。冉阿让在混乱的心情中听到了他的哭声。 + 过一会,那孩子不见了。太阳也掉下去了。 + 黑暗慢慢笼罩了冉阿让的四周。他整天没吃东西,他也许正在发寒热。他仍旧立着,从那孩子逃走以后,他还没有改变他那姿势。他的呼吸,忽长忽促,胸膛随着起伏。他的眼睛盯在他前面一二十步的地方,仿佛在专心研究野草中的一块碎蓝瓷片的形状。忽然,他哆嗦了一下,此刻他才感到了夜寒。 + 他重新把他的鸭舌帽压紧在额头上,机械地动手去把他的布衫拉拢,扣上,走了一步,弯下腰去,从地上拾起他的棍子。这时,他忽然看见了那个值四十个苏的钱,他的脚已把它半埋在土中了,它在石子上发出闪光。 + 这一下好象是触电似的,“这是什么东西?”他咬紧牙齿说。他向后退了三步,停下来,无法把他的视线从刚才他脚踏着的那一点移开,在黑暗里闪光的那件东西,仿佛是一只望着他的大眼睛。几分钟之后,他慌忙向那银币猛扑过去,捏住它,立起身来,向平原的远方望去,把目光投向天边四处,站着发抖,就象一只受惊以后要找地方藏身的猛兽。他什么也望不见。天黑了,平原一片苍凉。紫色的浓雾正在黄昏的微光中腾起。他说了声“呀”,急忙朝那孩子逃跑的方向走去。走了百来步以后,他停下来,向前望去,但什么也看不见。于是他使浑身力气,喊道:“小瑞尔威!小瑞尔威!”他住口细听。没人回答。 + 那旷野是荒凉凄黯的。四周一望无际,全都是荒地。除了那望不穿的黑影和吼不破的寂静之外,一无所有。一阵冷峭的北风吹来,使他四周的东西都呈现出愁惨的情景。几棵矮树,摇着枯枝,带有一种匪夷所思的愤恨,仿佛要恐吓追扑什么人一 样。 + 他再往前走,随后又跑起来,跑跑停停,在那寂寥的原野上,吼出他那无比凄惨惊人的声音:“小瑞尔威!小瑞尔威!”如果那孩子听见了,也一定会害怕,更要好好地躲起来。不过那孩子毫无疑问已经走远了。他遇见一个骑马的神甫。他走到他身边,向他说:“神甫先生,您看见一个孩子走过去吗?” + “没有。”神甫说。 + “一个叫小瑞尔威的?” + “我谁也没看见。”他从他钱袋里取出两枚五法郎的钱,交给神甫。 + “神甫先生,这是给您的穷人的。神甫先生,他是一个十岁左右的孩子,他有一只四鼠笼子,我想,还有一把摇琴。他是向那个方向走去的。他是一个通烟囱的穷孩子,您知道吗?”“我确实没有看见。” + “小瑞尔威?他不是这村子里的吗?您能告诉我吗?”“如果他确是象您那么说的,我的朋友,那就是一个从别的地方来的孩子了。他们经过这里,却不会有人认得他们。”冉阿让另又拿出两个五法郎的钱交给神甫。 + “给您的穷人。”他说。 + 随后他又迷乱地说: + “教士先生,您去叫人来捉我吧。我是一个窃贼。”神甫踢动双腿,催马前进,魂飞天外似的逃了。 + 冉阿让又朝着他先头选定的方向跑去。 + 他那样走了许多路,张望,叫喊,呼号,但是再也没有碰见一个人。他在那原野里,看见有一点象是卧着或蹲着的东西,他就跑过去,如此前后有两三次,他见到的都只是一些野草,或是露在地面上的石头,最后,他走到一个三岔路口,停了下来。月亮出来了。他张望远处,作了最后一次呼唤:“小瑞尔威!小瑞尔威!小瑞尔威!”他的呼声在暮霭中消隐,连回响也没有了。他嘴里还念着:“小瑞尔威!”但是声音微弱,几乎不成字音。那是他最后的努力,他的膝弯忽然曲下,仿佛他良心上的负担已成了一种无形的压力,突然把他压倒了一样,他精疲力竭,倒在一块大石头上,两手揪着头发,脸躲在膝头中间,他喊道:“我是一个无赖!”他的心碎了,他哭了出来,那是他第一次流泪。 + 冉阿让从主教家里出来后,我们看得出来,他已完全摆脱了从前的那种思想。不过他一时还不能分辨自己的心情。他对那个老人的仁言懿行还强自抗拒。“您允诺了我做诚实人。我赎买了您的灵魂,我把它从污秽当中救出来交给慈悲的上帝。”这些话不停地回到他的脑子里。他用自己的傲气来同那种至高无上的仁德对抗,傲气真是我们心中的罪恶堡垒。他仿佛觉得,神甫的原宥是使他回心转意的一种最大的压迫和最凶猛的攻势,如果他对那次恩德还要抵抗,那他就会死硬到底,永不回 头;如果他屈服,他就应当放弃这许多年来别人种在他心上、也是他自负得意的那种仇恨。那一次是他的胜败关头,那种斗争,那种关系着全盘胜负的激烈斗争,已在他自身的凶恶和那人的慈善之间展开了。 + 他怀着一种一知半解的心情,醉汉一样地往前走着。当他那样恍惚迷离往前走时,他对这次在迪涅的意外遭遇带给他的后果是否有一种明确的认识呢?在人生的某些时刻,常有一种神秘的微音来惊觉或搅扰我们的心神,他是否也听到了这种微音呢?是否有种声音在他的耳边说,他正在经历他生命中最严重的一刻呢?他已没有折衷的余地,此后他如果不做最好的人,就会做最恶的人,现在他应当超过主教(不妨这样说),否则就会堕落得连苦役犯也不如,如果他情愿为善,就应当做天使,如果他甘心为恶,就一定做恶魔。 + 在此地,我们应当再提出我们曾在别处提出过的那些问题,这一切在他的思想上是否多少发生了一点影响呢?当然,我们曾经说过,艰苦的生活能教育人,能启发人,但是以冉阿让那种水平,他是否能分析我们在此地指出的这一切,却是一个疑问,如果他对那些思想能有所体会,那也仅仅是一知半解,他一定看不清楚,并且那些思想也只能使他堕入一种烦恼,使他感到难堪,几乎觉得痛苦。他从所谓牢狱的那种畸形而黑暗的东西中出来后,主教已伤及了他的灵魂,正如一种太强烈的光会伤及他那双刚从黑暗中出来的眼睛一样。将来的生活,摆在他眼前的那种永远纯洁、光彩、完全可能实现的生活,使他惶惑颤栗。他确实不知所措。正如一只骤见日出的枭鸟一样,这个罪犯也因见了美德而目眩,并且几近失明。 + 有一点能肯定,并且是他自己也相信的,那就是他已不再是从前那个人了,他的心完全变了,他已没有能力再去做主教不曾和他谈到也不曾触及的那些事了。 + 在这样的思想状况下,他遇到了小瑞尔威,抢了他的四十个苏。那是为什么?他一定无法说明,难道这是他从监牢里带来的那种恶念的最后影响,好比临终的一振,冲动的余力,力学里所谓“惯性”的结果吗?是的。也许还不完全是。我们简单地说说,抢东西的并不是他,并不是他这个人,而是那只兽,当时他心里有那么多初次尝到的苦惑,正当他作思想斗争时,那只兽,由于习惯和本能作用,便不自觉地把脚踏在那钱上了。等到心智清醒以后,看见了那种兽类的行为,冉阿让才感到痛心,向后退却,并且惊骇得大叫起来。 + 抢那孩子的钱,那已不是他能下得了手的事,那次的异常现象只是在他当时的思想状况下才有发生的可能。 + 无论如何,这最后一次恶劣的行为对他起了一种决定性的作用。这次的恶劣行为突然穿过他的混乱思想并得到澄清,把黑暗的障碍放在一 边,光明置放在另一边,并且按照他当时的思想水平,影响他的心灵,正如某些化学反应体对一种混浊的混合物发生作用时的情况一样,它能使一种原素沉淀,另一种澄清。 + 最初,在自我检查和思考之前,他登时心慌意乱,正象一个亡命者,狠命追赶,要找到那个孩子把钱还给他;后来等到他明白已经太迟,不可能追上时,他才大失所望,停了下来。当他喊着“我是一个无赖”时,他才看出自己究竟是怎样一个人,在那时,他已离开他自己,仿佛感到他自己只是一个鬼,并且看见那个有肉有骨、形相丑恶的苦役犯冉阿让就站在他前面,手里拿着棍,腰里转着布衫,背上的布袋里装满了偷来的东西,面目果决而忧郁,脑子里充满卑劣的诡计。 + 我们已指出过,过分的痛苦使他变成了一个富于幻想的人,那正好象是一种幻境,他确实看见了冉阿让的那副凶恶面孔出现在他前面。他几乎要问他自己那个人是谁,并且对他产生了强烈的反感。 + 人在幻想中,有时会显得沉静得可怕,继而又强烈地激动起来,惑于幻想的人,往往无视现实,冉阿让当时的情况,正是那样。他看见自己周围的东西,却仿佛看见心里的人物出现在自己的前面。 + 我们可以这样说,他正望着他自己,面面相觑,并且同时通过那种幻景,在一种神妙莫测的深远处看见一点微光,起初他还以为是什么火炬,等到他再仔细去看那一点显现在他良心上的光时,他才看出那火炬似的光具有人形,并且就是那位主教。 + 他的良心一再地研究那样站在他面前的两个人,主教和冉阿让。要驯服第二个就非得第一个不行。由于那种痴望所特具的奇异效力,他的幻想延续越久,主教的形象也越高大,越在他眼前显得光芒四射,冉阿让却越来越小,也越来越模糊。到某一时刻他已只是个影子。忽然一下,他完全消失了。只剩下了那个主教。 + 他让烂灿的光辉,充实了那个可怜人的全部心灵。 + 冉阿让哭了很久,淌着热泪,泣不成声,哭得比妇女更柔弱,比孩子更慌乱。 + 正在他哭时,光明逐渐在他脑子里出现了,一种奇特的光,一种极其可爱同时又极其可怕的光。他已往的生活,最初的过失,长期的赎罪,外貌的粗俗,内心的顽强,准备在出狱后痛痛快快报复一番的种种打算,例如在主教家里干的事,他最后干的事,抢了那孩子的四十个苏的那一 次罪行,并且这次罪行是犯在获得主教的宥免以后,那就更为无耻,更为丑恶;凡此种种都回到了他脑子里,清清楚楚地显现出来,那种光的明亮是他生平从未见过的。他回顾他的生活,丑恶已极,他的心灵,卑鄙不堪。但是在那种生活和心灵上面有一片平和的光。他好象是在天堂的光里看见了魔鬼。 + 他那样哭了多少时间呢?哭过以后,他做了些什么呢?他到什么地方去了呢?从来没有人知道。但有一件事似乎是可靠的,就是在那天晚上,有辆去格勒诺布尔的车子,在早晨三点左右到了迪涅,在经过主教院街时,车夫曾看见一个人双膝跪在卞福汝主教大门外的路旁,就象是在黑暗里祈祷。 + 第三卷一八一七年间 + 一 一八一七年 + 一八一七年路易十八用那种目空一切的君王气魄,称之为他登基第二十二年①的那一年。也是布吕吉尔?德?沙松先生扬名的那一年。所有假发店老板一心希望扑粉和御鸟再次出现,都刷上了天蓝色灰浆并画上了百合花。②这是蓝舒伯爵穿上法兰西世卿服装,佩着红绶带,挺着长鼻子,带着新闻人物所具有的那种奇特侧影的威仪,以理事员身分每个礼拜日坐在圣日耳曼?代?勃雷教堂的公凳上的升平时期。蓝舒伯爵的功绩是这样的:他在任波尔多③市长期内,一八一四年三月十二日那天,把城池献给了昂古莱姆公爵,凭这项轰轰烈烈的功勋,他就得到了世卿的禄位。在一八一七年,四岁到六岁的男孩都戴一种极大的染色羊皮帽,成为风行一时的时装,帽子两旁有耳遮,颇象爱斯基摩人的高统帽。法国军队,仿奥地利式样,穿上了白军服,联队改称为驻防部队,不用番号,而冠以行省的名称。拿破仑还在圣赫勒拿岛,由于英国人不肯供应蓝呢布,他便翻旧衣服穿。在一八一七年,佩勒格利尼正在歌唱,比戈第尼姑娘正在跳舞,博基埃正红及一时,奥德利尚未出世。沙基夫人继福利奥佐①而起。在法国还有普鲁士人②。德拉洛先生③成了著名的人物。正统江山在斩了普勒尼埃、加尔波诺和托勒龙的手、又斩了他们的头④以后地位才宣告稳固。大臣塔列朗⑤王爷和钦命财政总长路易教士,好象两个巫师一样,相视而笑。⑥,他们两个都参加过一七九○年七月十四日在马尔斯广场举行的联邦弥撒,塔列朗以主教资格主祭,路易助祭。在一 八一七年,就在那马尔斯广场旁边的小路上,发现几根蓝漆大木柱倒在雨水和乱草里腐烂了,柱上的金鹰和金蜂都褪了色,只剩下一点痕迹。 + ①法国大革命在一七九三年推翻了君主专制,国王路易十六经国民公会判处极刑,王党捧路易十七(路易十六的儿子)为国王继承人,路易十七在一七九五年死在狱中,路易十六之弟路易十八被认为继承人,他是在一八一五年拿破仑逊位才回国登王位的,但是他不承认王室的统治是中断了的,认为他的王权应从一 七九五年算起,照此推算一八一七是他的统治的第二十二年。 + ②百合花是法国波旁王朝的标志。贵族都戴假发,并以粉扑发为美。“御鸟”是一种髻的名称。 + ③波尔多(Bordeaux),为法国西南部滨大西洋的商业城市。拿破仑和英国争霸,封锁大陆,商业资产阶级深感痛苦,一八一四年三月,英国军队从西班牙侵入了法国南部时,他们把城池献给了敌人。昂古莱姆公爵是路易十八的侄儿,随着英国军队进入了波尔多。 + ①佩勒格利尼(Pellegrini),那不勒斯歌手,当时在巴黎演出。比戈第尼姑娘(Bigottini),当时的舞蹈家。博基埃(Potier),当时的喜剧演员。奥德利(Odry),喜剧演员。沙基夫人(MmeSaqui)和福利奥佐(Forioso),第一帝国时期最著名的杂技演员,表演走绳索的人。 + ②占领军在一八一八年才撤离法国。 + ③德拉洛(Delalot,1772—1842),极端保王派,《辩论日报》的编辑。 + ④普勒尼埃、加尔波诺、托勒龙,秘密会社社员,因赞成处死路易十六被处死。斩手又斩首是法国对弑王者的刑罚。 + ⑤塔列朗(Talleyrand,1754—1838),公爵,原是拿破仑的外交大臣,一八○七年免职后勾结国外势力。一八一四年三月俄普联军攻入巴黎,塔列朗组织临时内阁,迎接路易十八回国。 + ⑥巫师共同作弊,彼此心里明白,所以相视而笑。 + 那些柱子是两年前开五月会议⑦时搭建御用礼台用的。驻扎在大石头附近的奥地利军队的露营部已把它们烧得遍体焦痕了。其中的两三根已被那些露营部队劈作柴火烧掉了,并还烘过日耳曼皇军的巨掌。五月会议有这样一个特点,那就是五月会议是六月间在马尔斯广场上举行的。在一 八一七年里,有两件事是人人知道的:伏尔泰—都格事件和鼻烟壶上刻的宪章问题。巴黎最新的惊人消息是杜丹的罪案,杜丹曾把他兄弟的脑袋丢在花市水池里。海军部开始调查海船墨杜萨号事件,这使肖马勒蒙羞,热利果风光一时。塞尔夫上校赴埃及去做沙里蒙总督。竖琴街的浴宫做了一个修桶匠的店面。当时在克吕尼宅子的八角塔的平台上,还能看见一间小木板房子,那是梅西埃的天文台,就是做过路易十六的海军天文官的梅西埃。杜拉公爵夫人在她那间陈设了天蓝缎交叉式家具的客厅里,对着三四个朋友朗诵她作的那篇未经发表的《舞力卡》。卢浮宫里的“N①正被刮去。奥斯特里茨桥退位了,更名为御花园桥,那种双关的隐语把奥斯特里茨桥和植物园②都同时隐没了。路易十八拿起《贺拉斯》③,用指甲尖划着读,特别注意那些做皇帝的英雄和做王子的木鞋匠,因为他有双重顾虑:拿破仑和马蒂兰?布吕诺④。法兰西学院的征文题目是《读书乐》。伯拉先生经官府承认了他确有辩才。在他的培养下,未来的检察长德勃洛艾已崭露头角,立志学习保尔—路易?古利埃的尖刻。那年有个冒充里昂⑤的马尚吉,随后又有个冒充马尚吉的达兰谷。《克勒尔?达尔伯》和《马勒克—亚岱尔》被称为两部杰作。歌丹夫人被推为当时的第一作家。法兰西学院任人把院士拿破仑?波拿巴从它的名册上除名。国王命令在昂古莱姆⑥设立海军学校,因为昂古莱姆公爵是个伟大的海军大臣,昂古莱姆城就当然具有海港的一切优越条件,否则君主制就丧失了体统了。法兰柯尼⑦在他的布告上加上一些有关骑术的插图,吸引了街上的野孩子,内阁会议曾经热烈讨论应不应该容许他那样做。巴埃先生,《亚尼丝阿》的作者,颊上生了一颗肉痣的方脸好人,常在主教城街沙塞南侯爵夫人家里布置小型家庭音乐会。所有的年轻姑娘都唱爱德蒙?热罗作词的《圣阿卫尔的隐者》。《黄矮子报》改成了《镜报》。朗布兰咖啡馆抬出了皇帝来对抗那家拥护波旁王室的瓦洛亚咖啡馆。人家刚把西西里的一个公主嫁给那位已被卢韦尔①暗中注意的贝里公爵。斯达尔夫人②去世已一年。近卫军老向马尔斯③小姐喝倒彩。各种大报都只⑦五月会议是拿破仑于一八一五年召集的一种人民代表会议。 + ① N是拿破仑的徵志。” + ②巴黎植物园初建于十七世纪初,一七九三年起曾被扩建。 + ③《贺拉斯》(Horace),高乃依根据罗马历史故事所改编的悲剧。 + ④马蒂兰?布吕诺(MathurinBrunequ),当时名人之一,木鞋匠出身,所以路易十八对他存有戒心。 + ⑤夏多布里昂(Chatequbriand,1768—1848),法国作家,消极浪漫主义文学的创始人。 + ⑥昂古莱姆(Angouleme),城名,在内地,不在海滨。 + ⑦法兰柯尼是一个养马官。 + ①卢韦尔(Louvel)是个制造马鞍的工人,他刺杀了贝里公爵,贝里公爵是路易十八的侄儿,杀死他,是想绝王族之后。 + ②斯达尔夫人(MadamedeStacl),浪漫主义作家。 + ③马尔斯(Mars),喜剧演员。 + 有一点点大,篇幅缩小,但是自由还是大的。《立宪主义者报》是拥护宪政的。《密涅瓦报》把 Chateaubriand(夏多布里昂)写成 Chateaubriant。资产阶级借写错了的那个 t字狠狠嘲笑这位大作家。在一些被收买了的报纸里,有些妓女式的新闻记者辱骂那些在一八一五年被清洗的人们,大卫④已经没有才艺了,亚尔诺⑤已经没有文思了,卡诺⑥已经没有羞耻了,苏尔特⑦从来没有打过胜仗,拿破仑确也没有天才。大家都知道,通过邮局寄给一个被放逐的人的信件是很少寄到的,警察把截留那些信件作为他们的神圣职责。那种事由来已久,被放逐的笛卡儿⑧便诉过苦。大卫为了收不到他的信件在比利时的一家报纸上发了几句牢骚,引起了保王党报刊的兴趣,借此机会,把那位被放逐者着实讥讽了一番。说“弑君犯”或“投票人”⑨,说“敌人”或“盟友”⑩,说“拿破仑”或“布宛纳巴”(11),一字之差,可以在两人之间造成一道鸿沟。一切头脑清醒的人都认为这革命的世纪已被国王路易十八永远封闭了,他被称为“宪章的不朽的创作者”。在新桥的桥堍平地,准备建立享利四世①铜像的石座上已经刻上“更生”两字。比艾先生在戴莱丝街四 号筹备他的秘密会议,以图巩固君主制度。右派的领袖在严重关头,老是说:“我们应当写信给巴柯。”加奴埃、奥马阿呢、德?沙伯德兰诸人正策划日后所谓的“水滨阴谋”,他们多少征得了御弟②的同意。“黑别针”在另一方面也有所策动。德拉卫德里和特洛果夫正进行谈判。多少具有一些自由思想的德卡兹③先生正掌握实权。夏多布里昂每天早晨立在圣多米尼克街二十七号的窗子前面,穿着长裤和拖鞋,一条马德拉斯绸巾裹着他的灰白头发,眼睛望着一面镜子,全套牙科手术工具箱开在面前,一边修着他的好看的牙齿,一面向他的书记毕洛瑞先生口述《君主与宪章》的诠言。权威批评家称赞拉封而不称赞塔尔马④。德?菲勒茨⑤先生签名 A,霍夫曼⑥先生签 Z。查理?诺缔埃⑦正创作《泰莱斯?阿贝尔》。离婚被禁止了。中学校改称中学馆。衣领上装一朵金质百合花的中学生因罗马王⑧问题互相斗殴。宫庭侦探向夫人殿下⑨递报告,说奥尔④大卫(Devid),油画家,曾任国民公会代表,后为拿破仑所器重。 + ⑤亚尔诺(Arnault),诗人和寓言家。 + ⑥卡诺(Carnot),数学家,国民公会代表,公安委员会委员,共和国十四军的创始者,一七九四年参加热月九日反革命政变。 + ⑦苏尔特(Soult),拿破仑部下的元帅,奥斯特里茨一役立首功。 + ⑧笛卡儿(Descartcs,1569—1650),法国二元论哲学家。 + ⑨指投票赞成斩决路易十六的代表之一。 + ⑩指帮助波旁王室复辟的奥、英、俄、普等同盟国。 + ①享利四世是波旁王朝第一代国王。 + ②御弟,指路易十八之弟阿图瓦伯爵,后来继承路易十八王位的查理十世。 + ③德卡兹(Decazea),路易十八的警务大臣。当时的自由思想是维护资产阶级个人权利的学说。 + ④拉封(Lafon)和塔尔马(Talma),当时的悲剧演员,后来曾受拿破仑赞赏。 + ⑤菲勒茨(Feletz),拥护古典主义反对浪漫主义的批评家。 + ⑥霍夫曼(Hoffman),戏剧作家和批评家。 + ⑦查理?诺缔埃(CharlesNodier,1783—1844),法国作家。 + ⑧罗马王,拿破仑和玛丽亚?路易莎所生之子。就没再考虑过其他方面。 + 上面没有名字。但是多年前,有只手用铅笔在上面写了四行诗,在雨露和尘土的洗刷下已渐渐地模糊了,如今可能已经没有了:他安息了。尽管命运多舛,他仍偷生。失去了他的天使他便丧生;事情是自然而然地发生,正如夜幕降临,太阳西沉。 + `.slice(0, 10000); + +/** + * 格式化文件大小 + */ +function formatSize(bytes) { + if (bytes < 1024) { + return bytes + " B"; + } else if (bytes < 1024 * 1024) { + return (bytes / 1024).toFixed(2) + " KB"; + } else { + return (bytes / (1024 * 1024)).toFixed(2) + " MB"; + } +} + +/** + * 获取本地文件大小 + */ +function getLocalFileSize(filePath) { + try { + const stats = fs.statSync(filePath); + return stats.size; + } catch (error) { + console.error( + `${colors.red}读取本地文件失败: ${error.message}${colors.reset}`, + ); + return null; + } +} + +/** + * 获取 CDN 文件大小 + */ +function getCDNFileSize(url) { + return new Promise((resolve, reject) => { + https + .get(url, (response) => { + if (response.statusCode === 200) { + const contentLength = response.headers["content-length"]; + if (contentLength) { + resolve(parseInt(contentLength, 10)); + } else { + let data = ""; + response.on("data", (chunk) => { + data += chunk; + }); + response.on("end", () => { + resolve(Buffer.byteLength(data)); + }); + } + } else if (response.statusCode === 301 || response.statusCode === 302) { + const redirectUrl = response.headers.location; + getCDNFileSize(redirectUrl).then(resolve).catch(reject); + } else { + reject(new Error(`HTTP 状态码: ${response.statusCode}`)); + } + }) + .on("error", (error) => { + reject(error); + }); + }); +} + +/** + * 下载 CDN 文件内容 + */ +function downloadCDNFile(url) { + return new Promise((resolve, reject) => { + https + .get(url, (response) => { + if (response.statusCode === 200) { + let data = ""; + response.on("data", (chunk) => { + data += chunk; + }); + response.on("end", () => { + resolve(data); + }); + } else if (response.statusCode === 301 || response.statusCode === 302) { + const redirectUrl = response.headers.location; + downloadCDNFile(redirectUrl).then(resolve).catch(reject); + } else { + reject(new Error(`HTTP 状态码: ${response.statusCode}`)); + } + }) + .on("error", (error) => { + reject(error); + }); + }); +} + +/** + * 测试准确率 + */ +function testAccuracy(pinyinFunc) { + const corrects = correctPinyin.split(" "); + const result = pinyinFunc(testText, { nonZh: "consecutive" }); + const results = result.split(" "); + + let errors = 0; + corrects.forEach((item, i) => { + if (item !== results[i]) { + errors++; + } + }); + + const accuracy = ((1 - errors / corrects.length) * 100).toFixed(2); + return { accuracy, errors, total: corrects.length }; +} + +/** + * 测试速度(运行多次取平均值) + */ +function testSpeed(pinyinFunc, iterations = 100) { + const start = Date.now(); + for (let i = 0; i < iterations; i++) { + pinyinFunc(testText, { nonZh: "consecutive" }); + } + const end = Date.now(); + return (end - start) / iterations; +} + +/** + * 主对比函数 + */ +async function compare() { + const separator = isCI + ? "========================================" + : `${colors.bright}${colors.cyan}========================================${colors.reset}`; + const title = isCI + ? " 线上 vs 本次 完整对比" + : `${colors.bright}${colors.cyan} 线上 vs 本次 完整对比${colors.reset}`; + + console.log(`\n${separator}`); + console.log(title); + console.log(`${separator}\n`); + + const localFilePath = path.resolve(__dirname, "../dist/index.js"); + const cdnUrl = "https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js"; + + try { + // ============ 1. 体积对比 ============ + console.log(`${colors.bright}${colors.blue}📦 文件体积对比${colors.reset}`); + console.log( + `${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`, + ); + + console.log(`${colors.yellow}正在读取本地文件...${colors.reset}`); + const localSize = getLocalFileSize(localFilePath); + if (localSize === null) { + throw new Error("无法读取本地文件"); + } + console.log( + `本地文件大小: ${colors.green}${formatSize(localSize)}${colors.reset}`, + ); + + console.log(`${colors.yellow}正在获取 CDN 文件大小...${colors.reset}`); + const cdnSize = await getCDNFileSize(cdnUrl); + console.log( + `CDN 文件大小: ${colors.green}${formatSize(cdnSize)}${colors.reset}\n`, + ); + + const sizeDiff = localSize - cdnSize; + const sizeDiffPercent = ((sizeDiff / cdnSize) * 100).toFixed(2); + + if (sizeDiff > 0) { + const message = `本地文件比 CDN 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; + console.log( + isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`, + ); + if (isCI && Math.abs(parseFloat(sizeDiffPercent)) > 5) { + console.log(`⚠️ 警告: 文件体积增长超过 5%`); + } + } else if (sizeDiff < 0) { + const message = `本地文件比 CDN 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; + console.log( + isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`, + ); + if (isCI && Math.abs(parseFloat(sizeDiffPercent)) > 5) { + console.log( + `✅ 太棒了! 文件体积减少了 ${Math.abs(parseFloat(sizeDiffPercent))}%`, + ); + } + } else { + const message = "本地文件与 CDN 文件大小相同"; + console.log( + isCI ? `✅ ${message}` : `${colors.green}${message}${colors.reset}`, + ); + } + + // ============ 2. 速度对比 ============ + console.log(`\n${colors.bright}${colors.blue}✈️ 速度对比${colors.reset}`); + console.log( + `${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`, + ); + + // 加载本地版本 + console.log(`${colors.yellow}正在加载本地版本...${colors.reset}`); + delete require.cache[require.resolve(localFilePath)]; + const { pinyin: localPinyin } = require(localFilePath); + console.log(`${colors.green}✓ 本地版本加载成功${colors.reset}`); + + // 下载并加载 CDN 版本 + console.log(`${colors.yellow}正在下载 CDN 版本...${colors.reset}`); + const cdnCode = await downloadCDNFile(cdnUrl); + const tempPath = path.resolve(__dirname, "../dist/cdn-temp.js"); + fs.writeFileSync(tempPath, cdnCode); + delete require.cache[require.resolve(tempPath)]; + const { pinyin: cdnPinyin } = require(tempPath); + console.log(`${colors.green}✓ CDN 版本下载并加载成功${colors.reset}`); + + // 速度测试 + console.log(`\n100次运行平均值`); + const cdnSpeed = testSpeed(cdnPinyin); + const localSpeed = testSpeed(localPinyin); + + console.log( + `本地版本: ${colors.green}${localSpeed.toFixed(2)}ms${colors.reset} /次`, + ); + console.log( + `CDN 版本: ${colors.green}${cdnSpeed.toFixed(2)}ms${colors.reset} /次\n`, + ); + + const speedDiff = (((localSpeed - cdnSpeed) / cdnSpeed) * 100).toFixed(2); + if (Math.abs(speedDiff) < 5) { + console.log( + `${isCI ? "✅" : colors.green + "✅" + colors.reset} 速度基本相同 (差异 < 5%)`, + ); + } else if (speedDiff < 0) { + console.log( + `${isCI ? "🚀" : colors.green + "🚀" + colors.reset} 本地版本更快 ${Math.abs(speedDiff)}%`, + ); + } else { + console.log( + `${isCI ? "⚠️" : colors.yellow + "⚠️" + colors.reset} CDN 版本更快 ${speedDiff}%`, + ); + } + + // 清理临时文件 + fs.unlinkSync(tempPath); + + console.log(`\n${separator}\n`); + } catch (error) { + console.error(`${colors.red}❌ 对比失败: ${error.message}${colors.reset}`); + console.error(error.stack); + process.exit(1); + } +} + +// 执行对比 +compare(); diff --git a/benchmark/size-compare.js b/benchmark/size-compare.js deleted file mode 100644 index 895b3bf..0000000 --- a/benchmark/size-compare.js +++ /dev/null @@ -1,175 +0,0 @@ -const fs = require('fs'); -const https = require('https'); -const path = require('path'); - -// 检测是否在 CI 环境中 -const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true'; - -// ANSI 颜色代码(仅在非 CI 环境中使用) -const colors = isCI ? { - reset: '', - bright: '', - green: '', - red: '', - yellow: '', - cyan: '', -} : { - reset: '\x1b[0m', - bright: '\x1b[1m', - green: '\x1b[32m', - red: '\x1b[31m', - yellow: '\x1b[33m', - cyan: '\x1b[36m', -}; - -/** - * 格式化文件大小 - * @param {number} bytes - 字节数 - * @returns {string} 格式化后的文件大小 - */ -function formatSize(bytes) { - if (bytes < 1024) { - return bytes + ' B'; - } else if (bytes < 1024 * 1024) { - return (bytes / 1024).toFixed(2) + ' KB'; - } else { - return (bytes / (1024 * 1024)).toFixed(2) + ' MB'; - } -} - -/** - * 获取本地文件大小 - * @param {string} filePath - 文件路径 - * @returns {number} 文件大小(字节) - */ -function getLocalFileSize(filePath) { - try { - const stats = fs.statSync(filePath); - return stats.size; - } catch (error) { - console.error(`${colors.red}读取本地文件失败: ${error.message}${colors.reset}`); - return null; - } -} - -/** - * 获取 CDN 文件大小 - * @param {string} url - CDN URL - * @returns {Promise} 文件大小(字节) - */ -function getCDNFileSize(url) { - return new Promise((resolve, reject) => { - https.get(url, (response) => { - if (response.statusCode === 200) { - const contentLength = response.headers['content-length']; - if (contentLength) { - resolve(parseInt(contentLength, 10)); - } else { - // 如果没有 content-length,需要下载整个文件来计算大小 - let data = ''; - response.on('data', (chunk) => { - data += chunk; - }); - response.on('end', () => { - resolve(Buffer.byteLength(data)); - }); - } - } else if (response.statusCode === 301 || response.statusCode === 302) { - // 处理重定向 - const redirectUrl = response.headers.location; - console.log(`${colors.yellow}重定向到: ${redirectUrl}${colors.reset}`); - getCDNFileSize(redirectUrl).then(resolve).catch(reject); - } else { - reject(new Error(`HTTP 状态码: ${response.statusCode}`)); - } - }).on('error', (error) => { - reject(error); - }); - }); -} - -/** - * 比较文件大小 - */ -async function compareSizes() { - const separator = isCI ? '========================================' : `${colors.bright}${colors.cyan}========================================${colors.reset}`; - const title = isCI ? ' 文件体积对比工具' : `${colors.bright}${colors.cyan} 文件体积对比工具${colors.reset}`; - - console.log(`\n${separator}`); - console.log(title); - console.log(`${separator}\n`); - - // 本地文件路径 - const localFilePath = path.resolve(__dirname, '../dist/index.js'); - - // CDN URL - const cdnUrl = 'https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js'; - - const fileLabel = isCI ? '本地文件:' : `${colors.bright}本地文件:${colors.reset}`; - const cdnLabel = isCI ? 'CDN 地址:' : `${colors.bright}CDN 地址:${colors.reset}`; - - console.log(`${fileLabel} ${localFilePath}`); - console.log(`${cdnLabel} ${cdnUrl}\n`); - - // 获取本地文件大小 - console.log(`${colors.yellow}正在读取本地文件...${colors.reset}`); - const localSize = getLocalFileSize(localFilePath); - - if (localSize === null) { - return; - } - - console.log(`${colors.green}本地文件大小: ${formatSize(localSize)}${colors.reset}\n`); - - // 获取 CDN 文件大小 - console.log(`${colors.yellow}正在获取 CDN 文件信息...${colors.reset}`); - try { - const cdnSize = await getCDNFileSize(cdnUrl); - console.log(`${colors.green}CDN 文件大小: ${formatSize(cdnSize)}${colors.reset}\n`); - - // 计算差异 - const diff = localSize - cdnSize; - const diffPercent = ((diff / cdnSize) * 100).toFixed(2); - - const resultSeparator = isCI ? '----------------------------------------' : `${colors.bright}${colors.cyan}----------------------------------------${colors.reset}`; - const resultTitle = isCI ? '对比结果:' : `${colors.bright}对比结果:${colors.reset}`; - - console.log(resultSeparator); - console.log(`${resultTitle}\n`); - - if (diff > 0) { - const message = `本地文件比 CDN 文件大 ${formatSize(diff)} (${diffPercent > 0 ? '+' : ''}${diffPercent}%)`; - console.log(isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`); - if (isCI && Math.abs(parseFloat(diffPercent)) > 5) { - console.log(`\n⚠️ 警告: 文件体积增长超过 5%`); - } - } else if (diff < 0) { - const message = `本地文件比 CDN 文件小 ${formatSize(Math.abs(diff))} (${diffPercent}%)`; - console.log(isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`); - if (isCI && Math.abs(parseFloat(diffPercent)) > 5) { - console.log(`\n✅ 太棒了! 文件体积减少了 ${Math.abs(parseFloat(diffPercent))}%`); - } - } else { - const message = '本地文件与 CDN 文件大小相同'; - console.log(isCI ? `✅ ${message}` : `${colors.green}${message}${colors.reset}`); - } - - console.log(`\n${separator}\n`); - - // 在 CI 环境中输出 GitHub Actions 的注释 - if (isCI && process.env.GITHUB_ACTIONS === 'true') { - const emoji = diff > 0 ? '📈' : diff < 0 ? '📉' : '✅'; - const changeText = diff === 0 ? '无变化' : - diff > 0 ? `增加 ${formatSize(diff)} (+${diffPercent}%)` : - `减少 ${formatSize(Math.abs(diff))} (${diffPercent}%)`; - - console.log(`::notice title=Bundle Size ${emoji}::${changeText} - Local: ${formatSize(localSize)}, CDN: ${formatSize(cdnSize)}`); - } - } catch (error) { - console.error(`${colors.red}获取 CDN 文件失败: ${error.message}${colors.reset}`); - process.exit(1); - } -} - -// 执行比较 -compareSizes(); diff --git a/package.json b/package.json index 06e901b..0ce9051 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "scripts": { "test": "vitest run --coverage", "build": "rollup -c && rollup -c rollup.esm.config.js", - "build:compare": "npm run build && node benchmark/size-compare.js", - "size:compare": "node benchmark/size-compare.js", + "build:compare": "npm run build && node benchmark/compare.js", + "compare": "node benchmark/compare.js", "commit": "git-cz", "lint": "eslint ." }, From bcd88f2444bc96823bc11fe53b183d696ff0260f Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 10:34:02 +0800 Subject: [PATCH 3/6] feat: update content fo compare --- benchmark/compare.js | 74 ++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/benchmark/compare.js b/benchmark/compare.js index 75b22a3..3434df7 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -348,7 +348,7 @@ const testText = ` 他跪了下来。等到主教抬起头来,那个国民公会代表已经面带庄严的神色,气绝而亡。 主教回到家中,深深沉浸在一种难以名状的思绪里。他整整祈祷了一夜。第二天,几个胆大好奇的人,费尽心机要引他谈论那个 G.代表,他却只指了指天。从此以后,他对小孩和有痛苦的人更加仁慈亲切。 任何言词,只要影射到“G.老贼”,他就一定会陷入一种异样不安的状态中。谁也不能说,那样一颗心在他自己心前的昭示,那伟大的良心在他意识上所起的反应,对他日趋完善的精神会毫无影响。 - 那次的“乡村访问”当然会给本地的那些小集团提供饶舌的机会:“那种死人的病榻前面也能成为主教涉足的地方吗?明明没有什么可以感化的指望。那些革命党人全是屡教不改,违反圣教的。那,又何必到那里去呢?那里有什么可看的呢?真是好奇,魔鬼接收灵魂,他也要去看看。” + 那次的“乡村访问”当然会给当前分支的那些小集团提供饶舌的机会:“那种死人的病榻前面也能成为主教涉足的地方吗?明明没有什么可以感化的指望。那些革命党人全是屡教不改,违反圣教的。那,又何必到那里去呢?那里有什么可看的呢?真是好奇,魔鬼接收灵魂,他也要去看看。” 一天,有个阔寡妇,即那些自作聪明的冒失鬼中的一个,问了他这样一句俏皮话:“我的主教,有人要打听,大人您在什么时候能得到一①墨洛温(Merovee),法国第一个王朝,从五世纪中叶到八世纪中叶。 顶红帽子①。”“呵!呵!多么高贵的颜色,”主教回答,“幸亏鄙视红帽子的人也还崇拜红法冠呢。” ①戴红帽子,为参加革命的意思。 @@ -817,7 +817,7 @@ function formatSize(bytes) { } /** - * 获取本地文件大小 + * 获取当前分支文件大小 */ function getLocalFileSize(filePath) { try { @@ -825,16 +825,16 @@ function getLocalFileSize(filePath) { return stats.size; } catch (error) { console.error( - `${colors.red}读取本地文件失败: ${error.message}${colors.reset}`, + `${colors.red}读取当前分支文件失败: ${error.message}${colors.reset}`, ); return null; } } /** - * 获取 CDN 文件大小 + * 获取 master 文件大小 */ -function getCDNFileSize(url) { +function get masterFileSize(url) { return new Promise((resolve, reject) => { https .get(url, (response) => { @@ -853,7 +853,7 @@ function getCDNFileSize(url) { } } else if (response.statusCode === 301 || response.statusCode === 302) { const redirectUrl = response.headers.location; - getCDNFileSize(redirectUrl).then(resolve).catch(reject); + get masterFileSize(redirectUrl).then(resolve).catch(reject); } else { reject(new Error(`HTTP 状态码: ${response.statusCode}`)); } @@ -865,9 +865,9 @@ function getCDNFileSize(url) { } /** - * 下载 CDN 文件内容 + * 下载 master 文件内容 */ -function downloadCDNFile(url) { +function download masterFile(url) { return new Promise((resolve, reject) => { https .get(url, (response) => { @@ -881,7 +881,7 @@ function downloadCDNFile(url) { }); } else if (response.statusCode === 301 || response.statusCode === 302) { const redirectUrl = response.headers.location; - downloadCDNFile(redirectUrl).then(resolve).catch(reject); + download masterFile(redirectUrl).then(resolve).catch(reject); } else { reject(new Error(`HTTP 状态码: ${response.statusCode}`)); } @@ -939,7 +939,7 @@ async function compare() { console.log(`${separator}\n`); const localFilePath = path.resolve(__dirname, "../dist/index.js"); - const cdnUrl = "https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js"; + const masterUrl = "https:// master.jsdelivr.net/npm/pinyin-pro/dist/index.js"; try { // ============ 1. 体积对比 ============ @@ -948,26 +948,26 @@ async function compare() { `${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`, ); - console.log(`${colors.yellow}正在读取本地文件...${colors.reset}`); + console.log(`${colors.yellow}正在读取当前分支文件...${colors.reset}`); const localSize = getLocalFileSize(localFilePath); if (localSize === null) { - throw new Error("无法读取本地文件"); + throw new Error("无法读取当前分支文件"); } console.log( - `本地文件大小: ${colors.green}${formatSize(localSize)}${colors.reset}`, + `当前分支文件大小: ${colors.green}${formatSize(localSize)}${colors.reset}`, ); - console.log(`${colors.yellow}正在获取 CDN 文件大小...${colors.reset}`); - const cdnSize = await getCDNFileSize(cdnUrl); + console.log(`${colors.yellow}正在获取 master 文件大小...${colors.reset}`); + const masterSize = await get masterFileSize( masterUrl); console.log( - `CDN 文件大小: ${colors.green}${formatSize(cdnSize)}${colors.reset}\n`, + ` master 文件大小: ${colors.green}${formatSize( masterSize)}${colors.reset}\n`, ); - const sizeDiff = localSize - cdnSize; - const sizeDiffPercent = ((sizeDiff / cdnSize) * 100).toFixed(2); + const sizeDiff = localSize - masterSize; + const sizeDiffPercent = ((sizeDiff / masterSize) * 100).toFixed(2); if (sizeDiff > 0) { - const message = `本地文件比 CDN 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; + const message = `当前分支文件比 master 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; console.log( isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`, ); @@ -975,7 +975,7 @@ async function compare() { console.log(`⚠️ 警告: 文件体积增长超过 5%`); } } else if (sizeDiff < 0) { - const message = `本地文件比 CDN 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; + const message = `当前分支文件比 master 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; console.log( isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`, ); @@ -985,7 +985,7 @@ async function compare() { ); } } else { - const message = "本地文件与 CDN 文件大小相同"; + const message = "当前分支文件与 master 文件大小相同"; console.log( isCI ? `✅ ${message}` : `${colors.green}${message}${colors.reset}`, ); @@ -997,45 +997,45 @@ async function compare() { `${colors.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`, ); - // 加载本地版本 - console.log(`${colors.yellow}正在加载本地版本...${colors.reset}`); + // 加载当前分支版本 + console.log(`${colors.yellow}正在加载当前分支版本...${colors.reset}`); delete require.cache[require.resolve(localFilePath)]; const { pinyin: localPinyin } = require(localFilePath); - console.log(`${colors.green}✓ 本地版本加载成功${colors.reset}`); + console.log(`${colors.green}✓ 当前分支版本加载成功${colors.reset}`); - // 下载并加载 CDN 版本 - console.log(`${colors.yellow}正在下载 CDN 版本...${colors.reset}`); - const cdnCode = await downloadCDNFile(cdnUrl); - const tempPath = path.resolve(__dirname, "../dist/cdn-temp.js"); - fs.writeFileSync(tempPath, cdnCode); + // 下载并加载 master 版本 + console.log(`${colors.yellow}正在下载 master 版本...${colors.reset}`); + const masterCode = await download masterFile( masterUrl); + const tempPath = path.resolve(__dirname, "../dist/ master-temp.js"); + fs.writeFileSync(tempPath, masterCode); delete require.cache[require.resolve(tempPath)]; - const { pinyin: cdnPinyin } = require(tempPath); - console.log(`${colors.green}✓ CDN 版本下载并加载成功${colors.reset}`); + const { pinyin: masterPinyin } = require(tempPath); + console.log(`${colors.green}✓ master 版本下载并加载成功${colors.reset}`); // 速度测试 console.log(`\n100次运行平均值`); - const cdnSpeed = testSpeed(cdnPinyin); + const masterSpeed = testSpeed( masterPinyin); const localSpeed = testSpeed(localPinyin); console.log( - `本地版本: ${colors.green}${localSpeed.toFixed(2)}ms${colors.reset} /次`, + `当前分支版本: ${colors.green}${localSpeed.toFixed(2)}ms${colors.reset} /次`, ); console.log( - `CDN 版本: ${colors.green}${cdnSpeed.toFixed(2)}ms${colors.reset} /次\n`, + ` master 版本: ${colors.green}${ masterSpeed.toFixed(2)}ms${colors.reset} /次\n`, ); - const speedDiff = (((localSpeed - cdnSpeed) / cdnSpeed) * 100).toFixed(2); + const speedDiff = (((localSpeed - masterSpeed) / masterSpeed) * 100).toFixed(2); if (Math.abs(speedDiff) < 5) { console.log( `${isCI ? "✅" : colors.green + "✅" + colors.reset} 速度基本相同 (差异 < 5%)`, ); } else if (speedDiff < 0) { console.log( - `${isCI ? "🚀" : colors.green + "🚀" + colors.reset} 本地版本更快 ${Math.abs(speedDiff)}%`, + `${isCI ? "🚀" : colors.green + "🚀" + colors.reset} 当前分支版本更快 ${Math.abs(speedDiff)}%`, ); } else { console.log( - `${isCI ? "⚠️" : colors.yellow + "⚠️" + colors.reset} CDN 版本更快 ${speedDiff}%`, + `${isCI ? "⚠️" : colors.yellow + "⚠️" + colors.reset} master 版本更快 ${speedDiff}%`, ); } From e6e762b4b6f062a568e31d1faed72faa90a87dc5 Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 10:38:31 +0800 Subject: [PATCH 4/6] feat: update content fo compare --- benchmark/compare.js | 54 ++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/benchmark/compare.js b/benchmark/compare.js index 3434df7..4aeec65 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -832,9 +832,9 @@ function getLocalFileSize(filePath) { } /** - * 获取 master 文件大小 + * 获取 CDN 文件大小 */ -function get masterFileSize(url) { +function getCDNFileSize(url) { return new Promise((resolve, reject) => { https .get(url, (response) => { @@ -853,7 +853,7 @@ function get masterFileSize(url) { } } else if (response.statusCode === 301 || response.statusCode === 302) { const redirectUrl = response.headers.location; - get masterFileSize(redirectUrl).then(resolve).catch(reject); + getCDNFileSize(redirectUrl).then(resolve).catch(reject); } else { reject(new Error(`HTTP 状态码: ${response.statusCode}`)); } @@ -865,9 +865,9 @@ function get masterFileSize(url) { } /** - * 下载 master 文件内容 + * 下载 CDN 文件内容 */ -function download masterFile(url) { +function downloadCDNFile(url) { return new Promise((resolve, reject) => { https .get(url, (response) => { @@ -881,7 +881,7 @@ function download masterFile(url) { }); } else if (response.statusCode === 301 || response.statusCode === 302) { const redirectUrl = response.headers.location; - download masterFile(redirectUrl).then(resolve).catch(reject); + downloadCDNFile(redirectUrl).then(resolve).catch(reject); } else { reject(new Error(`HTTP 状态码: ${response.statusCode}`)); } @@ -939,7 +939,7 @@ async function compare() { console.log(`${separator}\n`); const localFilePath = path.resolve(__dirname, "../dist/index.js"); - const masterUrl = "https:// master.jsdelivr.net/npm/pinyin-pro/dist/index.js"; + const cdnUrl = "https://cdn.jsdelivr.net/npm/pinyin-pro/dist/index.js"; try { // ============ 1. 体积对比 ============ @@ -957,17 +957,17 @@ async function compare() { `当前分支文件大小: ${colors.green}${formatSize(localSize)}${colors.reset}`, ); - console.log(`${colors.yellow}正在获取 master 文件大小...${colors.reset}`); - const masterSize = await get masterFileSize( masterUrl); + console.log(`${colors.yellow}正在获取 master 文件大小...${colors.reset}`); + const cdnSize = await getCDNFileSize(cdnUrl); console.log( - ` master 文件大小: ${colors.green}${formatSize( masterSize)}${colors.reset}\n`, + `master 文件大小: ${colors.green}${formatSize(cdnSize)}${colors.reset}\n`, ); - const sizeDiff = localSize - masterSize; - const sizeDiffPercent = ((sizeDiff / masterSize) * 100).toFixed(2); + const sizeDiff = localSize - cdnSize; + const sizeDiffPercent = ((sizeDiff / cdnSize) * 100).toFixed(2); if (sizeDiff > 0) { - const message = `当前分支文件比 master 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; + const message = `当前分支文件比 master 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; console.log( isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`, ); @@ -975,7 +975,7 @@ async function compare() { console.log(`⚠️ 警告: 文件体积增长超过 5%`); } } else if (sizeDiff < 0) { - const message = `当前分支文件比 master 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; + const message = `当前分支文件比 master 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; console.log( isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`, ); @@ -985,9 +985,9 @@ async function compare() { ); } } else { - const message = "当前分支文件与 master 文件大小相同"; + const message = "当前分支文件与 master 文件大小相同"; console.log( - isCI ? `✅ ${message}` : `${colors.green}${message}${colors.reset}`, + isCI ? `${message}` : `${colors.green}${message}${colors.reset}`, ); } @@ -1003,28 +1003,28 @@ async function compare() { const { pinyin: localPinyin } = require(localFilePath); console.log(`${colors.green}✓ 当前分支版本加载成功${colors.reset}`); - // 下载并加载 master 版本 - console.log(`${colors.yellow}正在下载 master 版本...${colors.reset}`); - const masterCode = await download masterFile( masterUrl); - const tempPath = path.resolve(__dirname, "../dist/ master-temp.js"); - fs.writeFileSync(tempPath, masterCode); + // 下载并加载 CDN 版本 + console.log(`${colors.yellow}正在下载 master 版本...${colors.reset}`); + const cdnCode = await downloadCDNFile(cdnUrl); + const tempPath = path.resolve(__dirname, "../dist/cdn-temp.js"); + fs.writeFileSync(tempPath, cdnCode); delete require.cache[require.resolve(tempPath)]; - const { pinyin: masterPinyin } = require(tempPath); - console.log(`${colors.green}✓ master 版本下载并加载成功${colors.reset}`); + const { pinyin: cdnPinyin } = require(tempPath); + console.log(`${colors.green}✓ master 版本下载并加载成功${colors.reset}`); // 速度测试 console.log(`\n100次运行平均值`); - const masterSpeed = testSpeed( masterPinyin); + const cdnSpeed = testSpeed(cdnPinyin); const localSpeed = testSpeed(localPinyin); console.log( `当前分支版本: ${colors.green}${localSpeed.toFixed(2)}ms${colors.reset} /次`, ); console.log( - ` master 版本: ${colors.green}${ masterSpeed.toFixed(2)}ms${colors.reset} /次\n`, + `master 版本: ${colors.green}${cdnSpeed.toFixed(2)}ms${colors.reset} /次\n`, ); - const speedDiff = (((localSpeed - masterSpeed) / masterSpeed) * 100).toFixed(2); + const speedDiff = (((localSpeed - cdnSpeed) / cdnSpeed) * 100).toFixed(2); if (Math.abs(speedDiff) < 5) { console.log( `${isCI ? "✅" : colors.green + "✅" + colors.reset} 速度基本相同 (差异 < 5%)`, @@ -1035,7 +1035,7 @@ async function compare() { ); } else { console.log( - `${isCI ? "⚠️" : colors.yellow + "⚠️" + colors.reset} master 版本更快 ${speedDiff}%`, + `${isCI ? "⚠️" : colors.yellow + "⚠️" + colors.reset} master 版本更快 ${speedDiff}%`, ); } From d197ad18b27184765b81250fdab95f23a879efcb Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 10:41:50 +0800 Subject: [PATCH 5/6] feat: update content fo compare --- benchmark/compare.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/benchmark/compare.js b/benchmark/compare.js index 4aeec65..5cd3bcd 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -968,27 +968,21 @@ async function compare() { if (sizeDiff > 0) { const message = `当前分支文件比 master 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; - console.log( - isCI ? `⬆️ ${message}` : `${colors.red}${message}${colors.reset}`, - ); - if (isCI && Math.abs(parseFloat(sizeDiffPercent)) > 5) { + console.log(`⬆️ ${message}`); + if (Math.abs(parseFloat(sizeDiffPercent)) > 5) { console.log(`⚠️ 警告: 文件体积增长超过 5%`); } } else if (sizeDiff < 0) { const message = `当前分支文件比 master 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; - console.log( - isCI ? `⬇️ ${message}` : `${colors.green}${message}${colors.reset}`, - ); - if (isCI && Math.abs(parseFloat(sizeDiffPercent)) > 5) { + console.log(`⬇️ ${message}`); + if (Math.abs(parseFloat(sizeDiffPercent)) > 5) { console.log( `✅ 太棒了! 文件体积减少了 ${Math.abs(parseFloat(sizeDiffPercent))}%`, ); } } else { - const message = "当前分支文件与 master 文件大小相同"; - console.log( - isCI ? `${message}` : `${colors.green}${message}${colors.reset}`, - ); + const message = "✅ 当前分支文件与 master 文件大小相同"; + console.log(message); } // ============ 2. 速度对比 ============ From 404d1aa6d82ffd27e47e369a1077c4bdeae4366c Mon Sep 17 00:00:00 2001 From: zhoulixiang <18366276315@163.com> Date: Sat, 17 Jan 2026 10:43:13 +0800 Subject: [PATCH 6/6] feat: update content fo compare --- benchmark/compare.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmark/compare.js b/benchmark/compare.js index 5cd3bcd..b0fc55e 100644 --- a/benchmark/compare.js +++ b/benchmark/compare.js @@ -968,13 +968,13 @@ async function compare() { if (sizeDiff > 0) { const message = `当前分支文件比 master 文件大 ${formatSize(sizeDiff)} (+${sizeDiffPercent}%)`; - console.log(`⬆️ ${message}`); + console.log(`⬆️ ${message}`); if (Math.abs(parseFloat(sizeDiffPercent)) > 5) { - console.log(`⚠️ 警告: 文件体积增长超过 5%`); + console.log(`⚠️ 警告: 文件体积增长超过 5%`); } } else if (sizeDiff < 0) { const message = `当前分支文件比 master 文件小 ${formatSize(Math.abs(sizeDiff))} (${sizeDiffPercent}%)`; - console.log(`⬇️ ${message}`); + console.log(`⬇️ ${message}`); if (Math.abs(parseFloat(sizeDiffPercent)) > 5) { console.log( `✅ 太棒了! 文件体积减少了 ${Math.abs(parseFloat(sizeDiffPercent))}%`,