Linha de Comando e Automação
Rodar o Freeplane sem interface: exportação em lote, scripts em pipeline e integração com Makefiles e CI.
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
- Scripting em Groovy
- Conforto com terminal
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: allEm 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; usexvfb-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🔗
- Escreva um script Groovy que exporte o mapa aberto para HTML.
- Rode-o pela linha de comando sobre um mapa.
- Monte o
Makefileacima para uma pasta com três mapas. - Escreva o conversor Python de
.mmpara Markdown e compare com a exportação nativa. - 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çãoxvfb-runresolve a ausência de display em servidores e CI- Um
Makefiledá 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
- Qual é a forma base de invocação para automação?
- O que
xvfb-runresolve, e em que ambiente? - O que um
Makefileacrescenta a essa automação? - Quando processar o XML direto é mais simples do que abrir o programa?