Como faço para analisar um Tiddlywiki em um monte de arquivos de texto simples?

1

Eu encontrei um plugin Tiddlywiki para exportar todos os tiddlers em um arquivo de texto simples, mas eu quero pegar meu arquivo Tiddlywiki e exportar os tiddlers individuais para arquivos de texto individuais (que depois serão migrados para notes.vim). Existe uma maneira fácil de fazer isso com bash ou vim?

O arquivo Tiddlywiki contém formatação / sintaxe como esta:

<div title="Anthony Wallace" creator="Jon" modifier="Jon" created="201104020927" changecount="1" tags="anthropologists, mythology">

e eu quero analisar o conteúdo div e cria um arquivo chamado "Anthony Wallace" com as duas primeiras linhas sendo:

Anthony Walace

@anthropologists @mythology

    
por Jon 29.05.2011 / 08:32

2 respostas

1

Este script deve fazê-lo, sob algumas suposições de qualquer maneira. Por exemplo, ele quebrará se os atributos na tag div contiverem um colchete angular de fechamento ( > ), se a ordem dos atributos title e creator for alterada ou se a tag div ocupar várias linhas .

#!/usr/bin/awk -f

# treat the opening tag line here
/<div title=".*" creator=".*"/ {
    indiv = 1                                            # inside div from here on
    name = gensub(/.* title="([^"]+)".*/, "\1", "")     # extract name
    tagsattr = gensub(/.* tags="([^"]+)".*/, "\1", "")  # extract tags string
    split(tagsattr, tags, /, /)                          # split tags into array

    print(name) > name                                   # print name into file "name"
    for(tag in tags) printf("@%s ", tags[tag]) >> name   # print tags with "@" prefix
    printf("\n\n") >> name                               # two newlines
    sub(/.*<div [^>]+>/, "")                             # remove the tag so the rest
                                                         # of the line can be printed
}

# treat closing line
indiv == 1 && /<\/div>/ {
    sub(/<\/div>.*/, "")                                 # remove tag so the rest
    print >> name                                        # can be printed
    indiv = 0                                            # outside div from here on
}

# print all other lines inside of div
indiv == 1 {
    print >> name
}

chmod +x e chama com o nome do arquivo de entrada como argumento. Assim, ele criará seu arquivo de saída no diretório atual, portanto, tenha cuidado.

Se os seus arquivos de entrada estiverem estruturados em uma árvore de diretórios, talvez seja necessário encontrar a linha de comando correta com curingas, loops ou o utilitário find .

    
por 29.05.2011 / 14:18
1

Note que o gensub é uma extensão do awk para que a primeira linha realmente seja

#!/usr/bin/gawk -f

Com algumas versões do TiddlyWiki, as linhas ficam assim (linha 4):

/<div title=".*" modifier=".*"/

Eu queria extrair todos os tiddlers em um arquivo html, então removi todos os redirecionamentos para o arquivo 'name' e adicionei esse código de topo e final:

BEGIN { print("<html>") }
END { print("</html>") }

Código realmente útil, mostra o poder do awk! Muito obrigado, Peter

    
por 22.11.2011 / 17:31