CoolFace
Apppublic

moebiusT7/book-ocr-studio

sourceHugging Faceagpl-3.0updated 2d agoView on Hugging Face
0likes
html_export.py28 linesDownload Raw Back to root
1"""Self-contained review HTML. OCR text is escaped, never executed."""2import base64,html,json3from pathlib import Path4from display_language import english_message5 6def render(job,cfg):7    esc=lambda s:html.escape(str(s),quote=True)8    from context_export import page_context, adoption_notice9    sections=[]10    for idx in cfg['selected']:11        folder=Path(job)/f'page-{idx+1:05d}'12        if not (folder/'source.png').exists():continue13        image=base64.b64encode((folder/'source.png').read_bytes()).decode()14        error=json.loads((folder/'review-error.json').read_text()).get('error','') if (folder/'review-error.json').exists() else ''15        status='Suggestions available; approve or reject in the app' if (folder/'review.json').exists() else 'Not reviewed by Gemma'16        blocks=[]17        if (folder/'regions.json').exists():18            regions=json.loads((folder/'regions.json').read_text())['regions']19            for r in regions:20                blocks.append(f'<article><small>{esc(r["role"])} · Region {r["id"]+1} · Coordinates {esc(r["box"])}</small><pre>{esc(r["text"])}</pre></article>')21        else:22            text=(folder/'original.md').read_text() if (folder/'original.md').exists() else 'OCR incomplete'23            blocks=[f'<p>No region data; using the saved OCR reading order.</p><pre>{esc(text)}</pre>']24        context=page_context(folder)25        blocks.insert(0,'<article><h3>Text for model input</h3><p>'+esc(context['status'])+'</p><pre>'+esc(context['text'])+'</pre><h4>Applied changes</h4><pre>'+esc(json.dumps(context['edits'],ensure_ascii=False,indent=2))+'</pre><h4>Suggestions requiring review; not applied to the text</h4><pre>'+esc(json.dumps(context['pending'],ensure_ascii=False,indent=2))+'</pre><p>Unverified model notes: '+esc(' / '.join(context['notes']))+'</p></article>')26        sections.append(f'<section><h2>Page {idx+1}</h2><p>{esc(english_message(error or status))}</p><div class="pair"><img alt="Source page {idx+1}" src="data:image/png;base64,{image}"><div>{"".join(blocks)}</div></div></section>')27    return '<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>OCR review document</title><style>body{font:16px/1.7 sans-serif;margin:2rem;background:#f5f5f5;color:#222}.pair{display:grid;grid-template-columns:1fr 1fr;gap:2rem}.pair img{width:100%;position:sticky;top:1rem;align-self:start}article{background:white;padding:1rem;margin-bottom:1rem}pre{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit}small{color:#555}@media(max-width:800px){.pair{display:block}}</style><h1>Model input text, suggestions and source images</h1><p>Region order is detected automatically. Check it against the images. Original OCR is preserved. Model input text is original OCR or explicitly adopted content, including optional Quick mode candidates without manual verification. Unapproved suggestions are listed separately for review.</p><p>'+esc(adoption_notice(job,cfg))+'</p>'+''.join(sections)+'</html>'28