Skip to content

Corrige o fluxo Carregar DOCX → get_labels → XML SPS marcado#110

Merged
gitnnolabs merged 8 commits into
mainfrom
markup-get-labels-docx-xml-pipeline
Jun 1, 2026
Merged

Corrige o fluxo Carregar DOCX → get_labels → XML SPS marcado#110
gitnnolabs merged 8 commits into
mainfrom
markup-get-labels-docx-xml-pipeline

Conversation

@gitnnolabs

Copy link
Copy Markdown
Contributor

O que esse PR faz?

Corrige o fluxo Marcação editorial → Carregar DOCX → get_labels → XML SPS marcado, que quebrava ou concluía sem artefactos utilizáveis.

Extração DOCX (markuplib/function_docx.py)

  • Restaura o bloco if not obj_image: perdido num merge (is_numPr, paragraph, listas).
  • Escapa & e < no texto das células de tabela (html.escape); renomeia variável local htmltable_html para não sombrear o módulo html.

Marcação e XML (markup_doc/labeling_utils.py, xml.py)

  • escape_angle_brackets_outside_tags — parágrafos com p < 0.05 deixam de quebrar append_fragment.
  • sanitize_table_html_fragment / parse_xml_fragment — tabelas com & ou < nas células.
  • sanitize_inline_xml_fragment — listas com caracteres especiais.
  • normalize_aff_idsaffid vindo do Gemini como lista gera vários <xref ref-type="aff">.
  • iter_front_blocksget_xml usa o front recém-gerado (stream_data), não só o StreamField já persistido.
  • Fallback de article-meta quando não há bloco translate-front; proteção em keywords (vals2).

Task Celery (markup_doc/tasks.py, wagtail_hooks.py)

  • get_labels(article_id, user_id) — localiza o registo por pk (evita falha com título em branco ou duplicado).
  • persist_article_xml — grava text_xml, file_xml e estado Processed.
  • apply_document_title_from_article_title — preenche Document Title a partir do bloco <article-title> quando o upload vem sem título.
  • Logs INFO: início da task, LLM ativo, first_block/referências Gemini, bytes de XML gravados.

LLM (model_ai/llama.py)

  • Logs ao chamar Gemini

Testes (markup_doc/tests.py)

  • 27 testes: escape XML, tabelas, listas, affid, título, iter_front_blocks, get_xml, persist_article_xml.

Onde a revisão poderia começar?

  1. markup_doc/tasks.pyget_labels, persist_article_xml, final do pipeline.
  2. markuplib/function_docx.pyextractContent / extrae_Tabla (~linhas 220–330 e bloco if not obj_image).
  3. markup_doc/labeling_utils.pyappend_fragment, sanitize_*, apply_document_title_from_article_title.
  4. markup_doc/xml.pyiter_front_blocks, bloco contrib/aff, parse de tabelas.

Como este poderia ser testado manualmente?

  1. docker compose -f local.yml up -d django celeryworker
  2. Wagtail → Model AI → preencher API KEY Gemini (fluxo local recomendado).
  3. Marcação editorial → Carregar DOCX — enviar um .docx de teste sem preencher Document Title (ex.: fixtures/review-article/fixture_review_article_en.docx).
  4. Aguardar estado Processed na lista de uploads.
  5. Marcação editorial → XML SPS marcado — abrir o mesmo registo:
    • Aba XML: text_xml preenchido; link Download XML.
    • Aba Front: bloco <article-title> presente.
    • Document Title na lista deve refletir o título do artigo (não “blank”).
  6. Botões na edição do XML marcado: Preview HTML, Pretty XML, Download ZIP.
  7. Logs: docker logs markapi_local_celeryworker --tail 80 — procurar get_labels iniciado, LLM: GEMINI, Chamando Gemini, XML gravado.
  8. Testes automáticos: docker compose -f local.yml run --rm django pytest markup_doc/tests.py -v (27 testes)

Algum cenário de contexto que queira dar?

  • O upload em Carregar DOCX só mostra título/ficheiro/estado; o XML e a marcação editável ficam em XML SPS marcado (mesmo registo na base, proxies diferentes).
  • PDF não é gerado automaticamente por get_labels neste PR; o ZIP inclui PDF apenas se existirem renditions configuradas noutro fluxo (generate_zip com renditions=[] por defeito).
  • Registos antigos com título “(blank)” e sem XML precisam de reprocessar (novo upload ou guardar em XML SPS marcado para disparar update_xml).
  • Desenvolvimento local usa Dockerfile sem llama-cpp-python; Gemini é o backend LLM esperado.

Screenshots

N/A

Quais são tickets relevantes?

N/A

@gitnnolabs
gitnnolabs merged commit 4ac3213 into main Jun 1, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant