124

我在 GitHub 上托管了一个项目。为此,我使用 Markdown 语法编写了我的 README,以便在 GitHub 上很好地格式化它。

由于我的项目是在 Python 中,我还计划将它上传到PyPi。PyPi 上用于 README 的语法是 reStructuredText。

我想避免处理两个包含大致相同内容的自述文件;所以我搜索了 RST(或其他方式)翻译器的降价,但找不到任何东西。

我看到的另一个解决方案是执行降价/HTML,然后执行 HTML/RST 翻译。我在这里这里找到了一些资源,所以我想应该是可能的。

你有什么更适合我想做的想法吗?

4

8 回答 8

92

我会推荐Pandoc,“将文件从一种标记格式转换为另一种标记格式的瑞士军刀”(查看页面底部支持的转换图表,令人印象深刻)。Pandoc 允许 markdown 直接对 reStructuredText 进行翻译。这里还有一个在线编辑器可以让您试用,因此您可以简单地使用在线编辑器来转换您的 README 文件。

于 2012-05-23T11:53:40.977 回答
47

正如@Chris 建议的那样,您可以使用 Pandoc 将 Markdown 转换为 RST。这可以使用pypandoc模块和 setup.py 中的一些魔法简单地自动化:

from setuptools import setup
try:
    from pypandoc import convert
    read_md = lambda f: convert(f, 'rst')
except ImportError:
    print("warning: pypandoc module not found, could not convert Markdown to RST")
    read_md = lambda f: open(f, 'r').read()

setup(
    # name, version, ...
    long_description=read_md('README.md'),
    install_requires=[]
)

这将自动将 README.md 转换为 RST,以便在 PyPi 上使用长描述。当pypandoc不可用时,它只会读取 README.md 而不进行转换——当他们只想构建模块而不是上传到 PyPi 时,不要强迫其他人安装 pypandoc。

所以你可以像往常一样在 Markdown 中编写,不再关心 RST 乱七八糟。;)

于 2014-04-24T10:00:08.877 回答
37

2019 更新

PyPI Warehouse现在也支持渲染 Markdown!您只需要更新您的包配置并将其添加long_description_content_type='text/markdown'到其中。例如:

setup(
    name='an_example_package',
    # other arguments omitted
    long_description=long_description,
    long_description_content_type='text/markdown'
)

因此,不再需要将 README 保留为两种格式。

您可以在文档中找到有关它的更多信息。

老答案:

GitHub 使用的标记库支持 reStructuredText。这意味着您可以编写一个 README.rst 文件。

它们甚至支持使用codeandcode-block指令的语法特定颜色突出显示(示例

于 2014-05-20T02:11:48.523 回答
7

PyPI 现在支持 Markdown 进行长描述!

setup.py中,设置long_description为 Markdown 字符串,添加long_description_content_type="text/markdown"并确保您使用的是最新工具(setuptools38.6.0+、twine1.11+)。

有关详细信息,请参阅达斯汀英格拉姆的博客文章

于 2018-05-16T20:50:33.923 回答
4

您可能还对这样一个事实感兴趣,即可以在一个公共子集中编写,以便您的文档在呈现为降价或呈现为 reStructuredText 时以相同的方式出现:https : //gist.github.com/dupuy/1855764 ☺ </p>

于 2015-02-04T17:03:51.100 回答
4

对于我的要求,我不想在我的计算机上安装 Pandoc。我用过docverter。Docverter是一个文档转换服务器,带有一个使用 Pandoc 的 HTTP 接口。

import requests
r = requests.post(url='http://c.docverter.com/convert',
                  data={'to':'rst','from':'markdown'},
                  files={'input_files[]':open('README.md','rb')})
if r.ok:
    print r.content
于 2016-05-05T12:03:45.933 回答
1

我遇到了这个问题,并使用以下两个 bash 脚本解决了这个问题。

请注意,我已将 LaTeX 捆绑到我的 Markdown 中。

#!/usr/bin/env bash

if [ $# -lt 1 ]; then
  echo "$0 file.md"
  exit;
fi

filename=$(basename "$1")
extension="${filename##*.}"
filename="${filename%.*}"

if [ "$extension" = "md" ]; then
  rst=".rst"
  pandoc $1 -o $filename$rst
fi

转换为 html 也很有用。md2html:

#!/usr/bin/env bash

if [ $# -lt 1 ]; then
  echo "$0 file.md <style.css>"
  exit;
fi

filename=$(basename "$1")
extension="${filename##*.}"
filename="${filename%.*}"

if [ "$extension" = "md" ]; then
  html=".html"
  if [ -z $2 ]; then
    # if no css
    pandoc -s -S --mathjax --highlight-style pygments $1 -o $filename$html
  else
    pandoc -s -S --mathjax --highlight-style pygments -c $2 $1 -o $filename$html
  fi
fi

我希望这会有所帮助

于 2014-11-12T02:34:58.457 回答
0

使用pandoc其他人建议的工具,我创建了一个md2rst实用程序来创建rst文件。尽管此解决方案意味着您同时拥有 anmd和 an rst,但它似乎是侵入性最小的,并且允许将来添加任何降价支持。我更喜欢它而不是改变setup.py,也许你也会:

#!/usr/bin/env python

'''
Recursively and destructively creates a .rst file for all Markdown
files in the target directory and below.

Created to deal with PyPa without changing anything in setup based on
the idea that getting proper Markdown support later is worth waiting
for rather than forcing a pandoc dependency in sample packages and such.

Vote for
(https://bitbucket.org/pypa/pypi/issue/148/support-markdown-for-readmes)

'''

import sys, os, re

markdown_sufs = ('.md','.markdown','.mkd')
markdown_regx = '\.(md|markdown|mkd)$'

target = '.'
if len(sys.argv) >= 2: target = sys.argv[1]

md_files = []
for root, dirnames, filenames in os.walk(target):
    for name in filenames:
        if name.endswith(markdown_sufs):
            md_files.append(os.path.join(root, name))

for md in md_files:
    bare = re.sub(markdown_regx,'',md)
    cmd='pandoc --from=markdown --to=rst "{}" -o "{}.rst"'
    print(cmd.format(md,bare))
    os.system(cmd.format(md,bare))
于 2014-10-10T19:30:25.757 回答