【问题标题】:Autogenerate Markdown index from a recursive folder with makdown files in python使用python中的markdown文件从递归文件夹自动生成Markdown索引
【发布时间】:2023-04-01 09:30:02
【问题描述】:

您好,我有一个包含许多带有降价 (.md) 文件的子文件夹的文件夹,我想为此生成一个索引。我试试这个

MD_FILE_LIST = (y for x in os.walk(DOC_FILES_DIR)
                for y in glob(os.path.join(x[0], '*.md')))

with open(DOC_FILES_DIR + 'index.md', 'w') as f:
    text = []
    for m_file in MD_FILE_LIST:
        text.append('%s[%s](/%s)\n' % (m_file.count(os.sep)*' ',
                                  m_file.split(os.sep)[-1].replace('.md', ''),
                                  m_file.replace(DOC_FILES_DIR, '').replace(os.sep,'/')))

    f.writelines(text)

但是生成的文件没有显示链接的 html 视图,它显示为纯文本 [name](url)。如图所示 如果可能的话,至少为 2 或 3 个第一级创建一个标题

新版本

我做了一些修复,所以现在看起来像 THIS 这是我更新的版本代码:

with open(DOC_FILES_DIR + 'README.md', 'w') as f:
    text = []
    for m_file in MD_FILE_LIST:
        levels = m_file.replace(DOC_FILES_DIR, '').count(os.sep)
        if levels < 3:
            text.append( ' * ' + '#' * levels + ' [%s](./%s)\n' % (
                                    m_file.split(os.sep)[-1].replace('.md', ''),
                                    m_file.replace(DOC_FILES_DIR, '').replace(os.sep,'/')))
        else:
            text.append('%s[%s](./%s)\n' % (m_file.count(os.sep)*' ' + '- ',
                        m_file.split(os.sep)[-1].replace('.md', ''),
                        m_file.replace(DOC_FILES_DIR, '').replace(os.sep, '/')))
    text[0] = "# Index\n"
    f.writelines(text)

但似乎我不能同时使用标题和列表

【问题讨论】:

  • index view 是什么意思?此外,您的代码确实效率低下。您应该将MD_FILE_LIST 更改为生成器,并将带有for 循环的行与带有with 语句的行交换(然后将打开模式从append 更改为write
  • @Olian04,感谢您的提示,我将很快在我的代码中修复,在这里我将进行更新
  • 你的输出看起来应该是这样,你又问了什么问题?
  • @Olian04,可能是 Typora,但图片显示了从标记生成的 html,而不是纯文本文件
  • 你知道你正在生成一个降价文件吗?不是一个html文件?这是markdown中的链接:[name](link),这是html中的链接:&lt;a href="link"&gt;name&lt;a/&gt;。如果您希望输出看起来像一个网站,那么您需要生成一个 .html 文件,而不是 .md 文件。

标签: python markdown


【解决方案1】:

每个列表项之间需要一个空行。

Markdown rules 的严格阅读表明,块级元素不能包含在列表项中,除非它是“松散”列表,也就是说,它被空行包围。例如,考虑这个简单的列表:

* Item 1
* Item 2

它被渲染为:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
</ul>

请注意,列表项的内容作为内联文本插入。没有块级构造。

但是,这个列表:

* Item 1

* Item 2

呈现为:

<ul>
    <li>
        <p>Item 1</p>
    </li>
    <li>
        <p>Item 2</p>
    </li>
</ul>

请注意,每个列表项的内容都放置在块级段落中 (&lt;p&gt;)。唯一的区别是项目之间添加了一个空行。

同样的技术可以用于其他块级结构。例如,要在 Markdown 中创建一个标题,您可以在文本前面加上多个哈希值和至少一个空格:

* # Item 1

* # Item 2

结果:

<ul>
    <li>
        <h1>Item 1</h1>
    </li>
    <li>
        <h1>Item 2</h1>
    </li>
</ul>

现在让我们试试文档的前几行:

# Index

* ## [combustionModel](./combustionModels/combustionModel/combustionModel.md)

* ## [diffusion](./combustionModels/diffusion/diffusion.md)

* ## [FSD.T](./combustionModels/FSD/FSD.T.md)

    - [consumptionSpeed](./combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.md)
    - [reactionRateFlameArea](./combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.md)
    - [relaxation](./combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.md)

* ## [infinitelyFastChemistry](./combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.md)

渲染为:

<h1>Index</h1>

<ul>
    <li>
        <h2><a href="./combustionModels/combustionModel/combustionModel.md">combustionModel</a></h2>
    </li>
    <li>
        <h2><a href="./combustionModels/diffusion/diffusion.md">diffusion</a></h2>
    </li>
    <li>
        <h2><a href="./combustionModels/FSD/FSD.T.md">FSD.T</a></h2>

        <ul>
            <li><a href="./combustionModels/FSD/reactionRateFlameAreaModels/consumptionSpeed/consumptionSpeed.md">consumptionSpeed</a>
            </li>
            <li><a href="./combustionModels/FSD/reactionRateFlameAreaModels/reactionRateFlameArea/reactionRateFlameArea.md">reactionRateFlameArea</a>
            </li>
            <li><a href="./combustionModels/FSD/reactionRateFlameAreaModels/relaxation/relaxation.md">relaxation</a>
            </li>
        </ul>
    </li>
    <li>
        <h2><a href="./combustionModels/infinitelyFastChemistry/infinitelyFastChemistry.md">infinitelyFastChemistry</a></h2>
    </li>
</ul>

请注意,我留下了没有空行的嵌套列表(没有标题),因此这些列表项不会被包裹在段落中。如果您更喜欢段落,那么也可以在其中包含空行。

对您的代码进行编辑非常简单。只需在第六行添加一个额外的\n

            text.append( ' * ' + '#' * levels + ' [%s](./%s)\n\n' % (

以及第 14 行(虽然技术上没有要求,但在 Markdown 中的标题后始终有一个空行是一种很好的形式):

    text[0] = "# Index\n\n"

如果你希望嵌套子列表是块级的,也是第 10 行:

            text.append('%s[%s](./%s)\n\n' % (m_file.count(os.sep)*' ' + '- ',

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2022-08-02
  • 2019-04-10
  • 2015-09-10
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多