- 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)
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
"""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())
|