Эффективно конвертировать markdown -files в HTML-файлы

2498
Léo Léopold Hertz 준영

У меня есть следующая структура файла

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

Я хотел бы преобразовать файлы разметки в файлы HTML, чтобы файлы HTML создавались для каждой конкретной папки. Например, 1.htmlдолжно быть в folder1.

Я могу конвертировать один файл уценки

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

Таким образом, мы должны каким-то образом получить слово перед суффиксом перед каждым HTML-файлом.

Как вы можете эффективно конвертировать многие файлы уценки в соответствующие им HTML-файлы?

1
Если кто-то знает, как сделать то же самое с Python, я был бы рад видеть. ** Я не уверен, как вы можете сделать это `найти. -имя "* .markdown" `в Python. ** Léo Léopold Hertz 준영 14 лет назад 0

4 ответа на вопрос

2
jamuraa

Вы можете сделать это с помощью небольшого скрипта bash:

for i in `find . -name "*.markdown"`; do  markdown.py-2.6 $i > `dirname $i`/`basename -s .markdown $i`.html done 
Вау, я просто писал то же самое. Однако, это не заботится о размещении HTML-файлов в подкаталогах, вам нужно сначала использовать `cd` или что-то в этом роде. jtbandes 14 лет назад 0
исправил скрипт для помещения html-файлов в исходные каталоги, но я недоволен использованием dirname и basename в одной строке. jamuraa 14 лет назад 0
Это немного уродливо - вы могли бы вместо этого использовать `cd \` dirname $ i \ `; markdown.py-2.6 $ i> \ `basename -s .markdown $ i \` .html`? jtbandes 14 лет назад 1
$ i в этом скрипте включает в себя имя пути, поэтому вам придется выполнить cd `dirname $ i`; markdown.py-2.6 `basename $ i`>` basename -s .markdown $ i`.html jamuraa 14 лет назад 0
@jtbandes: Пожалуйста, внесите свое предложение в отдельный ответ. Это помогло бы мне прочитать ваш код. Léo Léopold Hertz 준영 14 лет назад 1
@jamuraa: Почему у вас есть `.markdown` в` basename -s .markdown $ i`? Léo Léopold Hertz 준영 14 лет назад 0
`-s .markdown` удаляет расширение .markdown, что делает его 1.html вместо 1.markdown.html. jamuraa 14 лет назад 0
2
evilsoup

The existing bash-based answers will break on files with spaces in their names, and call unnecessary external commands to boot.

Assuming bash 4+ is available (it probably is, check with bash --version), you can set globstar for recursive globbing:

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

This can also be done with find; for absolute bulletproof-ness, you should use a nullbyte delimiter:

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

This particular problem could also be solved using find's -exec option, like so:

find . -name '*.markdown' -exec bash -c 'markdown.py-2.6 "$0" > "$.html" '{}' \; 

However, this is not as easy to extend to multi-line scripts.

Гораздо чище, чем другие ответы! `find… -exec bash -c '…' {}` также будет работать без установки разделителей. slhck 10 лет назад 1
1
quark

Вероятно, вам будет проще сделать это в bash (например, как только вы поймете синтаксис, это всего одна или две строки), но для справки, вот как это сделать в Python. Вы хотите использовать две функции os.walk и fnmatch.fnmatch для сопоставления файлов, которые вы хотите в каждом каталоге. Это выглядит так:

#!/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)) 

Основные вещи, которые нужно забрать:

  • os.walkФункция пересекает структуру каталогов ( с использованием генератора). Возвращает три переменные:
    • Текущий каталог ( path)
    • Список каталогов, найденных в текущем каталоге ( directories). Вам не нужно это в этом случае.
    • Список файлов, найденных в текущем каталоге ( files). Вам это нужно.
  • fnmatch.fnmatchФункция принимает список файлов и говорит вам, если она соответствует шаблону. Это шаблон оболочки типа "glob", а не регулярное выражение. Вы можете использовать регулярные выражения здесь, но fnmatchэто проще для простого случая, подобного этому.

Обратите внимание, что вам нужно указать путь к скрипту уценки. Еще лучше было бы не использовать, os.systemа вместо этого импортировать разметку модуля и вызывать его основную функцию, но это обобщает программы, не относящиеся к Python. (Плюс, я не знаю точно, что это была бы за функция :).

1
jtbandes

Модификация ответа Джамураа:

for i in `find . -name "*.markdown"`; do pushd `dirname $i` markdown.py-2.6 $i > `basename -s .markdown $i`.html popd done 
Пожалуйста, не используйте `for i in $ (ls)` или подобное. См. [Почему вы не должны анализировать вывод ls (1)] (http://mywiki.wooledge.org/ParsingLs), чтобы узнать причины и [ответ evilsoup] (http://superuser.com/a/605412 / 48078) для более безопасного подхода. slhck 10 лет назад 2

Похожие вопросы