Mapa corrompido
Recuperar um .mm que o Freeplane recusa a abrir, do diagnóstico à reconstrução manual.
Mapa corrompido🔗
Sintoma. O Freeplane recusa abrir o arquivo, ou abre com o conteúdo truncado, ou reclama de XML inválido.
O que você vai aprender
- Encontrar uma cópia íntegra antes de tentar qualquer reparo
- Localizar o ponto exato de quebra do XML
- Recuperar o máximo de conteúdo de um
.mmque o Freeplane recusa abrir
Boa notícia: o .mm é XML de texto, e mapas corrompidos são quase sempre recuperáveis. Isso não seria verdade num formato binário.
Antes de qualquer coisa🔗
cp mapa.mm mapa.mm.original
Trabalhe sempre numa cópia. Toda tentativa de reparo pode piorar as coisas.
Passo 1 — procure uma cópia boa🔗
Antes de reparar, veja se você já não tem o arquivo íntegro em algum lugar:
| Fonte | Onde |
|---|---|
| Salvamento automático | ~/.config/freeplane/<versão>/ — arquivos *.autosave* |
| Backup do Freeplane | mapa.mm.bak, ao lado do original |
| Git | git log -- mapa.mm e git checkout <commit> -- mapa.mm |
| Backup do sistema | restic, Time Machine, snapshots do sistema de arquivos |
| Nuvem | Histórico de versões do provedor |
Se qualquer uma delas tiver uma cópia de meia hora atrás, use-a. Reparar XML à mão só compensa quando não há alternativa.
Passo 2 — diagnostique🔗
xmllint --noout mapa.mm
A saída aponta linha e coluna do problema:
mapa.mm:1247: parser error : Opening and ending tag mismatch: node line 1180 and map
Os erros mais comuns:
| Erro | Causa provável |
|---|---|
Opening and ending tag mismatch | Gravação interrompida |
Premature end of data | Arquivo truncado — falta de espaço ou queda de energia |
Invalid character | Byte inválido, quase sempre por codificação |
Extra content at the end of the document | Duas gravações concorrentes no mesmo arquivo |
xmlParseCharRef: invalid xmlChar value | Caractere de controle no texto de um nó |
Passo 3 — reparo automático🔗
O xmllint tenta consertar sozinho:
xmllint --recover mapa.mm > reparado.mm 2>/dev/null
xmllint --noout reparado.mm && echo "válido"
Funciona bem para tags mal fechadas no fim do arquivo. Você pode perder o conteúdo depois do ponto do erro — confira antes de comemorar.
Passo 4 — reparo à mão🔗
Abra num editor de texto e vá até a linha indicada.
Arquivo truncado. Se o fim está cortado, feche as tags manualmente. Conte a indentação do último <node> íntegro e feche na ordem:
</node>
</node>
</node>
</map>
Conteúdo duplicado. Se há um segundo <map> no meio do arquivo, apague do segundo <?xml ou <map em diante e feche as tags.
Caractere inválido. Localize e remova:
tr -d '\000-\010\013\014\016-\037' < mapa.mm > limpo.mm
Codificação errada. Se os acentos estão corrompidos:
iconv -f ISO-8859-1 -t UTF-8 mapa.mm > convertido.mmPasso 5 — extração de emergência🔗
Se o XML for irreparável, ao menos salve o conteúdo:
grep -o 'TEXT="[^"]*"' mapa.mm | sed 's/TEXT="//; s/"$//' > textos.txt
Você perde a hierarquia, mas recupera todo o texto — o que é infinitamente melhor que nada. A partir daí, reconstruir o mapa é trabalho, mas trabalho possível.
Para preservar a estrutura de forma tolerante a erros, um script Python com um parser mais permissivo (lxml com recover=True) frequentemente lê o que o xmllint não lê:
from lxml import etree
p = etree.XMLParser(recover=True)
arv = etree.parse('mapa.mm', p)
arv.write('reparado.mm', encoding='utf-8', xml_declaration=True)Prevenção🔗
| Medida | Efeito |
|---|---|
| Git com commit frequente | Toda versão recuperável, sempre |
| Salvamento automático a 60s | Perda máxima de um minuto |
| Backup do sistema (restic, snapshots) | Rede de proteção fora do Freeplane |
Não editar o .mm com o Freeplane aberto | Evita gravações concorrentes |
| Não sincronizar em nuvem com o arquivo aberto | Mesma razão |
| Dividir mapas grandes | Perda menor por incidente |
A primeira linha resolve sozinha praticamente todos os casos desta página. Se você lê isto e não usa Git com seus mapas, esse é o item a implementar hoje.
Você aprendeu
- Trabalhe sempre numa cópia: todo reparo pode piorar o arquivo
- Procure cópia boa antes de reparar — autosave,
.bak, Git e backup do sistema - O
.mmser XML de texto é o que torna a recuperação possível - Um validador de XML aponta a linha da quebra em segundos
Perguntas para reflexão
- Por que um
.mmcorrompido é recuperável e um formato binário quase nunca é? - Quais são as quatro fontes de cópia íntegra listadas aqui?
- Qual é a primeira coisa a fazer antes de qualquer tentativa de reparo?
- Como você localizaria o ponto exato da quebra?