O que você vai aprender

  • Abrir mapas e executar scripts pela linha de comando
  • Exportar vários mapas em lote
  • Integrar o Freeplane a um Makefile ou pipeline de CI
  • Processar arquivos .mm sem o Freeplane, quando ele não é necessário

Antes de começar

Linha de Comando e Automação🔗

O Freeplane é uma aplicação gráfica, mas aceita ser dirigido de fora. Isso abre três coisas: exportação em lote, geração de mapas por programa, e mapas como parte de um pipeline de documentação.

Abrindo mapas🔗

freeplane mapa.mm
freeplane mapa1.mm mapa2.mm mapa3.mm

No Windows, o executável é freeplane.exe ou freeplaneConsole.exe — o segundo é o que aceita operação sem janela em muitos cenários.

Executando um script🔗

A opção -S (ou a equivalente da sua versão, conforme o --help) executa um script sobre os mapas passados:

freeplane -S ~/.config/freeplane/1.11.x/scripts/Exportar.groovy mapa.mm

O script recebe o mapa aberto e pode fazer qualquer coisa que faria pela interface.

Combinado com um script de exportação, isso resolve o lote:

// ExportarHtml.groovy
def destino = new File(node.map.file.parent, node.map.file.name.replace('.mm', '.html'))
// a API de exportação varia por versão; consulte a ajuda da API de scripting
c.export(node.map, destino, 'html')
💡

A ajuda da API (Ferramentas → Scripts → Ajuda da API de scripting) é a única referência confiável para os nomes exatos dos métodos de exportação, que mudam entre versões. Consulte-a antes de escrever o script.

Modo sem cabeça🔗

Em servidores sem interface gráfica, o Java precisa de um display. Duas saídas:

# 1. Display virtual
xvfb-run -a freeplane -S script.groovy mapa.mm

# 2. Modo headless do AWT, quando o script não desenha nada
JAVA_OPTS="-Djava.awt.headless=true" freeplane -S script.groovy mapa.mm

A primeira é a mais confiável, porque a exportação para imagem realmente desenha.

Exportação em lote🔗

Um script de shell que exporta uma pasta inteira:

#!/bin/sh
set -e
for m in mapas/*.mm; do
    echo "exportando $m"
    xvfb-run -a freeplane -S scripts/ExportarHtml.groovy "$m"
done

Ou num Makefile, com dependências corretas — o HTML só é regenerado se o .mm mudou:

MAPAS := $(wildcard mapas/*.mm)
HTMLS := $(MAPAS:mapas/%.mm=site/%.html)

site/%.html: mapas/%.mm
	@mkdir -p site
	xvfb-run -a freeplane -S scripts/ExportarHtml.groovy $<
	mv mapas/$*.html $@

all: $(HTMLS)
.PHONY: all

Em CI🔗

Numa pipeline (Forgejo Actions, GitHub Actions, GitLab CI), o padrão é:

- name: Instalar dependências
  run: |
    sudo apt-get update
    sudo apt-get install -y xvfb default-jre
    # instalar o Freeplane a partir do pacote ou do tarball oficial

- name: Exportar mapas
  run: make all

- name: Publicar
  uses: ...

Isso permite manter mapas num repositório e publicar as versões navegáveis automaticamente a cada push. O guia que você está lendo é gerado por um processo parecido.

Processando .mm sem o Freeplane🔗

Para muitas tarefas, abrir o Freeplane é exagero. O .mm é XML, e qualquer ferramenta de XML dá conta.

Contar nós:

xmllint --xpath 'count(//node)' mapa.mm

Listar os textos dos nós:

xmllint --xpath '//node/@TEXT' mapa.mm | tr ' ' '\n' | sed 's/TEXT=//'

Em Python, extrair a árvore:

import xml.etree.ElementTree as ET

def percorre(no, nivel=0):
    print('  ' * nivel + no.get('TEXT', ''))
    for filho in no.findall('node'):
        percorre(filho, nivel + 1)

raiz = ET.parse('mapa.mm').getroot().find('node')
percorre(raiz)

Converter para Markdown:

def markdown(no, nivel=1):
    linhas = []
    if nivel <= 6:
        linhas.append('#' * nivel + ' ' + no.get('TEXT', ''))
    else:
        linhas.append('  ' * (nivel - 7) + '- ' + no.get('TEXT', ''))
    for filho in no.findall('node'):
        linhas += markdown(filho, nivel + 1)
    return linhas

Trinta linhas de Python substituem o Freeplane inteiro quando o que você quer é só a estrutura. Para geração de mapas por programa — a partir de um CSV, de uma API, de um banco — escrever o XML diretamente é frequentemente mais simples que dirigir a aplicação.

Gerando um mapa em Python:

import xml.etree.ElementTree as ET

mapa = ET.Element('map', version='freeplane 1.11.1')
raiz = ET.SubElement(mapa, 'node', TEXT='Gerado por script')
for i, item in enumerate(['Alfa', 'Beta', 'Gama']):
    ET.SubElement(raiz, 'node', TEXT=item, ID=f'ID_{i}', POSITION='right')
ET.ElementTree(mapa).write('gerado.mm', encoding='utf-8', xml_declaration=True)

O Freeplane abre esse arquivo sem reclamar.

Erros comuns

  • Rodar em servidor sem display e receber HeadlessException; use xvfb-run
  • Copiar nomes de métodos de exportação de tutoriais antigos — eles mudam entre versões
  • Dirigir o Freeplane para tarefas que um script de XML de trinta linhas resolve
  • Esquecer que o Freeplane escreve arquivos de bloqueio; processos paralelos brigam pelo mesmo mapa

Na prática🔗

  1. Escreva um script Groovy que exporte o mapa aberto para HTML.
  2. Rode-o pela linha de comando sobre um mapa.
  3. Monte o Makefile acima para uma pasta com três mapas.
  4. Escreva o conversor Python de .mm para Markdown e compare com a exportação nativa.
  5. Gere um mapa a partir de um CSV usando o exemplo de ElementTree.

Você aprendeu

  • freeplane -S script.groovy mapa.mm é a base de toda automação
  • xvfb-run resolve a ausência de display em servidores e CI
  • Um Makefile dá exportação incremental de graça
  • Para ler ou gerar estrutura, processar o XML direto costuma ser mais simples que abrir o programa

Perguntas para reflexão

  1. Qual é a forma base de invocação para automação?
  2. O que xvfb-run resolve, e em que ambiente?
  3. O que um Makefile acrescenta a essa automação?
  4. Quando processar o XML direto é mais simples do que abrir o programa?

Artigos relacionados

Referências🔗

  1. Freeplane — Command-line options and configuration
  2. Freeplane — Batch jobs
  3. Freeplane — External script file execution