
unillett/variance-input该项目自动化并提供管理界面,用于生成传统的 Variance 发布文件。编辑可上传文本版本、生成 Medite 比对结果、管理摹本,并使用源自 _lignes 文件的分页标记组装发布资产包。具体功能包括:
_lignes 文件、摹本和比对清单项目分为以下组件:
http://localhost:8080),可通过单个端口访问 Laravel(/admin)、传统 Variance(/)和 Medite 端点详细文档:
descr/architecture.md、descr/workflow.md、descr/facsimiles.md、descr/queues_jobs.md、descr/api_endpoints.md、descr/deployment_notes.md。最近更新:
descr/updates_2026-02-04.md。
bashgit clone [***] cd variance-input docker compose up -d --build
这将启动:
laravel(管理 Web 应用,通过代理访问 http://localhost:8080/admin)medite(Flask API,运行于 http://localhost:5000)laravel-queue(用于分页和摹本任务的队列 worker)laravel/example.env 到 laravel/.env,根据需要调整数据库/队列设置/admin/health 暴露运行中的提交 SHA,在创建/重建 laravel 和 laravel-queue 容器前设置 APP_GIT_SHA=$(git rev-parse HEAD)/admin),设置 ADMIN_BASE_PATH=admin 使生成的 URL 包含前缀MEDITE_STATUS_URL 控制"Medite 任务"菜单链接,默认值 /medite/(通过 variance-proxy 代理),确保本地和 staging 主机无需硬编码 localhost 即可使用laravel-queue 服务运行 laravel/scripts/run-queue-workers.sh,为 facsimiles 和 page-markers 队列生成多个 worker(QUEUE_WORKERS,默认 5 个)bashdocker compose exec laravel php artisan migrate docker compose exec laravel php artisan db:seed # 可选:加载测试数据
storage/app/public/uploads/versions/ 下生成 TEI 容器_lignes) – 上传 _lignes 文本文件,队列将在 storage/app/private/pagination/{version}.json 生成描述所有分页标记的辅助文件storage/app/public/uploads/{author}/{work}/comparisons/{id}_lignes 标记合并到 Medite XHTML 文件中| 用途 | 命令 |
|---|---|
| 查看 Laravel 队列日志 | docker compose logs -f laravel-queue |
| 手动运行队列 worker | docker compose exec laravel php artisan queue:work --queue=page-markers --stop-when-empty |
| Artisan 交互 shell | docker compose exec laravel php artisan tinker |
| Laravel 依赖安装 | docker compose exec laravel composer install |
| NPM 构建(如需) | docker compose exec laravel npm run build |
├── docker-compose.yml ├── descr/ # 开发者文档 ├── laravel/ # 管理应用(PHP/Laravel) │ ├── app/ │ ├── routes/ │ └── ... ├── medite/ # Flask + Celery Medite 运行器 │ └── app/variance/... ├── variance/ # 传统 PHP 前端(开发环境下只读) └── variance_data/ # 运行时上传文件和生成输出
.txt 文件(≤ 8 MB,text/plain)original_encoding(UTF‑8 / Windows‑1252 / ISO‑8859‑1)VersionController::store 将原始 TXT 写入 storage/app/public/uploads/versions/{base}.txt,标准化文本(UTF‑8 LF,空白折叠),保留内嵌 <pb> 标签,插入 <lb/>,并将 TEI 保存到 storage/app/public/uploads/versions/{base}.xmlstorage/app/public/uploads/versions 读取 TEI,若不存在则回退到 public/uploads/versions 或 variance/uploads/versions(传统/导入数据)versions 记录_lignes 文件storage/app/private/lignes/{version_id}.txtApplyLignesJob 解析 _lignes 条目,与 TEI 文本匹配,并在 storage/app/private/pagination/{version_id}.json 存储分页辅助 JSON,包含 { char_index, page, image_code, phrase, context }storage/app/tmp/pager/{version_id}.json,供 UI 显示辅助文件就绪状态_lignes 上传限制为 4 MB<pb> 标签,可使用 POST /api/versions/{version}/pagination/from-pb 直接构建辅助文件img_*)并生成缩略图storage/app/public/uploads/{author}/{work}/{version}/images_{role}_{author--work--comparison}.json,并立即反映在比对表格("JSON"状态)中MediteController::runMedite 调用 Flask 服务执行 Celery 任务/app/uploads/{author}/{work}/comparisons/{comparison_id},Laravel 将其镜像到 storage/app/public/uploads/{author}/{work}/comparisons/{id}ComparisonController::applyPageMarkers 确保两个版本都有辅助文件,标记比对为排队状态,并调度 InjectComparisonPaginationJobstorage/app/private/pagination/{version}.json,在记录的偏移位置将 <span class="page-marker"> 标签注入 source.xhtml / target.xhtml,并保存更新后的文件storage/app/tmp/pager/comparisons/{comparison_id}.json;UI 轮询此端点显示每个角色(源/目标)的状态(排队→运行中→完成)POST /api/comparisons/{comparison}/pagination/from-xhtml 可从 source.xhtml / target.xhtml 中已有的 <pb> 标签重建辅助文件storage/app/public/uploads/{author}/{work}/{comparison_folder},并镜像到 variance/uploads/{author}/{work}/{comparison_folder} 供传统站点使用ApplyLignesJob、InjectComparisonPaginationJob)在 page-markers 队列运行;摹本处理使用 facsimiles 队列laravel-queue 容器运行 laravel/scripts/run-queue-workers.sh,为 facsimiles,page-markers 生成多个 queue:work 进程docker compose exec laravel php artisan queue:work --queue=page-markers --stop-when-empty可配置健康阈值:
HEALTHCHECK_DISK_WARN_GB(默认 10)HEALTHCHECK_DISK_CRIT_GB(默认 5)HEALTHCHECK_MEDITE_WARN_MS(默认 2500)HEALTHCHECK_FAILED_JOBS_WARN(默认 1)HEALTHCHECK_FAILED_JOBS_CRIT(默认 10)| 制品 | 位置 |
|---|---|
| 上传的 TXT 文件 | storage/app/public/uploads/versions/{folder}.txt |
| TEI 版本文件 | storage/app/public/uploads/versions/{folder}.xml |
_lignes 原始文件 | storage/app/private/lignes/{version_id}.txt |
| 分页辅助文件 | storage/app/private/pagination/{version_id}.json |
| 摹本清单 JSON | storage/app/public/uploads/{author}/{work}/{version}/images_{role}_{author--work--comparison}.json |
| 版本进度文件 | storage/app/tmp/pager/{version_id}.json |
| 比对进度文件 | storage/app/tmp/pager/comparisons/{comparison_id}.json |
| Medite 输出(XHTML/TEI) | storage/app/public/uploads/{author}/{work}/comparisons/{id} |
| 已发布比对(可选) | storage/app/public/uploads/{author}/{work}/{comparison_folder} + 镜像到 variance/uploads/... |
| 摹本图像(草稿) | storage/app/public/uploads/{author}/{work}/{version}/ |
| 导出的传统 zip 包 | 通过 /comparisons/{id}/export 按需下载 |
| 作品封面图像 | public/uploads_images/{hash}.{ext} + 镜像到 variance/uploads_images/ |
| 作品 PDF 文件 | public/uploads/pdf/{work_id}.pdf + 镜像到 variance/uploads/pdf/ |
深入了解可查看:
laravel/app/Services/PageMarkerService.phplaravel/app/Jobs/ApplyLignesJob.phplaravel/app/Jobs/InjectComparisonPaginationJob.phpmedite/app/flask_app.pyVariance 与 Medite 集成由SIER(教学与研究基础设施服务) 开发,隶属于洛桑大学文学院(<[***]>)。许可目前正在内部审核中;本仓库为私有,现阶段不授予任何再分发权利。
祝您比对愉快! :)





manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务