Para converter efetivamente arquivos markdown em arquivos HTML

1

Eu tenho a seguinte estrutura de arquivos

|--folder1
|   |---1.markdown
|--folder2
|   |---2.markdown
|--folder3
|   |---3.markdown
...

Eu gostaria de converter os arquivos markdown para arquivos HTML, de forma que os arquivos HTML sejam criados para cada pasta específica. Por exemplo, 1.html deve estar em folder1 .

Eu posso converter um arquivo markdown por

markdown.py-2.6 1.markdown > 1.html

Então, devemos de alguma forma conseguir a palavra antes do sufixo antes de cada arquivo HTML.

Como você pode converter muitos arquivos de marcação para seus arquivos HTML correspondentes com eficiência?

    
por Léo Léopold Hertz 준영 24.07.2009 / 22:22

4 respostas

2

As respostas baseadas em bash existentes irão quebrar arquivos com espaços em seus nomes e chamar comandos externos desnecessários para inicializar.

Supondo que o bash 4+ esteja disponível (provavelmente é, verifique com bash --version ), você pode definir globstar para globalização recursiva:

shopt -s globstar
for f in ./**/*.markdown; do markdown.py-2.6 "$f" > "${f%.markdown}.html"; done

Isso também pode ser feito com o find; para a absoluta proteção contra balas, você deve usar um delimitador de bytes nulos:

find . -name '*.markdown' -print0 | while read -d $'
find . -name '*.markdown' -exec bash -c 'markdown.py-2.6 "$0" > "${0%.markdown}.html" '{}' \;
' f; do markdown.py-2.6 "$f" > "${f%.markdown}.html" done

Esse problema em particular também pode ser resolvido usando a opção -exec do find, assim:

shopt -s globstar
for f in ./**/*.markdown; do markdown.py-2.6 "$f" > "${f%.markdown}.html"; done

No entanto, isso não é tão fácil de estender para scripts de várias linhas.

    
por 09.06.2013 / 00:10
2

Você pode fazer isso com um pequeno script bash:

for i in 'find . -name "*.markdown"'; do 
  markdown.py-2.6 $i > 'dirname $i'/'basename -s .markdown $i'.html
done
    
por 24.07.2009 / 22:30
1

Você provavelmente achará mais fácil fazer isso no bash (como em, uma vez que você entende a sintaxe é apenas uma ou duas linhas), mas para o registro, aqui está como fazê-lo em Python. Você deseja usar duas funções os.walk e fnmatch.fnmatch para corresponder aos arquivos que você deseja em cada diretório. Parece assim:

#!/usr/bin/env python

import os, sys
from fnmatch import fnmatch

if len(sys.argv) != 2:
    print "Usage:", sys.argv[0], "<directory>"
    sys.exit()

markdown = # <path to markdown.py>
directory = sys.argv[1]

for path, directory, files in os.walk(directory):
    for file in files:
        if fnmatch(file, "*.html"):
            html_file = "%s/%s" % (path, file)
            markdown_file = html_file.replace(".html", ".markdown")
            os.system("python %s %s > %s" % (markdown, markdown_file, html_file))

As principais coisas a levar:

  • A função os.walk atravessa uma estrutura de diretórios (usando um gerador). Retorna três variáveis:
    • O diretório atual ( path )
    • A lista de diretórios encontrados no diretório atual ( directories ). Você não precisa disso neste caso.
    • A lista de arquivos encontrados no diretório atual ( files ). Você faz precisa disso.
  • A função fnmatch.fnmatch obtém uma lista de arquivos e informa se ela corresponde a um padrão. Este é um padrão "glob" de shell e não uma expressão regular. Você pode usar expressões regulares aqui, mas fnmatch é apenas mais fácil para um caso simples como este.

Observe que você precisa especificar o caminho para o script de remarcação. Melhor ainda seria não usar os.system , mas importar o markdown do módulo e chamar sua função principal, mas isso é generalizado para programas não-Python. (Além disso, eu não sei exatamente qual seria essa função:).

    
por 25.07.2009 / 03:15
1

Uma modificação da resposta do jamuraa:

for i in 'find . -name "*.markdown"'; do
  pushd 'dirname $i'
  markdown.py-2.6 $i > 'basename -s .markdown $i'.html
  popd
done
    
por 25.07.2009 / 03:46

Tags