Projeto analise-artigo: análise ABNT de artigos LaTeX
- texparse.py: extração de estrutura abntex2 (título, autores, resumo, palavras-chave, seções, citações, figuras), sem dependências externas - bib.py: parser .bib (BibTeX) com normalização de autores e diacríticos - analyze.py: checklist NBR 10520/6022/14724, métricas textuais, Flesch adaptado pt-BR e heurísticas de prosa - report.py: relatório Markdown + JSON - artigos/rumo-a-eficiencia: artigo analisado (main.tex + referencias.bib)
This commit is contained in:
85
analise_artigo/__main__.py
Normal file
85
analise_artigo/__main__.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""Linha de comando.
|
||||
|
||||
Exemplos:
|
||||
python -m analise_artigo artigos/rumo-a-eficiencia --out relatorios
|
||||
python -m analise_artigo caminho/para/main.tex
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from .bib import parse_bib
|
||||
from .report import write_reports
|
||||
from .texparse import parse_article
|
||||
from .analyze import analyze
|
||||
|
||||
|
||||
def find_tex(target: Path) -> Path | None:
|
||||
if target.is_file() and target.suffix == ".tex":
|
||||
return target
|
||||
if target.is_dir():
|
||||
candidates = sorted(target.glob("*.tex"))
|
||||
return candidates[0] if candidates else None
|
||||
return None
|
||||
|
||||
|
||||
def find_bib(tex: Path) -> Path | None:
|
||||
bib = tex.with_name(tex.stem + ".bib")
|
||||
if bib.exists():
|
||||
return bib
|
||||
for candidate in sorted(tex.parent.glob("*.bib")):
|
||||
return candidate
|
||||
return None
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
p = argparse.ArgumentParser(
|
||||
prog="analise-artigo",
|
||||
description="Analisa um artigo LaTeX (ABNT) e gera relatório de "
|
||||
"estrutura, métricas e citações.",
|
||||
)
|
||||
p.add_argument(
|
||||
"artigo",
|
||||
help="arquivo .tex ou diretório que contém o .tex",
|
||||
)
|
||||
p.add_argument(
|
||||
"--out", "-o",
|
||||
default="relatorios",
|
||||
help="diretório de saída do relatório (padrão: relatorios/)",
|
||||
)
|
||||
args = p.parse_args(argv)
|
||||
|
||||
target = Path(args.artigo)
|
||||
tex = find_tex(target)
|
||||
if tex is None:
|
||||
print(f"erro: nenhum .tex encontrado em {target}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
bib = find_bib(tex)
|
||||
|
||||
print(f"→ artigo: {tex}")
|
||||
print(f"→ referências: {bib or 'nenhum .bib encontrado'}")
|
||||
|
||||
article = parse_article(tex)
|
||||
refs = parse_bib(bib) if bib else {}
|
||||
|
||||
analysis = analyze(article, refs)
|
||||
|
||||
outdir = Path(args.out)
|
||||
md, js = write_reports(analysis, outdir)
|
||||
|
||||
resumo = analysis.metrics["resumo_checks"]
|
||||
print(f"\nResumo: {resumo['ok']} ok, "
|
||||
f"{resumo['warn']} aviso(s), "
|
||||
f"{resumo['fail']} falha(s), "
|
||||
f"{len(analysis.issues)} questão(ões) de prosa")
|
||||
print(f"\n→ relatório: {md}")
|
||||
print(f"→ dados: {js}")
|
||||
return 0 if resumo["fail"] == 0 else 2
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user