2

我正在编写一个从类似 Markdown 的标记到 HTML 的翻译器。我已经完成了脚本,除了有序/无序列表翻译。我想根据重要的空格(又名越位规则)格式化列表。示例有效输入如下所示:

:: List item 
   top level
 :: List item level 2
 :: List item level 2
    :: List item level 3
      :: List item level 4
 :: List item level 2

:: List item top level

::表示一个列表项。缩进级别可能是任意的。标签不重要。我一直在研究纸上的解决方案,但我无法找到实施的方法。我该怎么办?

PS:只要它不止一个,任何任意数量的空格都表示一个新的级别,就像在 python 中一样。

我正在使用 python 来实现这一点,但我不是在寻找代码。我想解释如何做。最好我想自己实现完整的东西,没有任何库。我将在我的 jekyll 博客中使用这个标记,但这对我来说不仅仅是一个小工具,我想从这个项目中尽可能多地学习正则表达式和解析。提前致谢。

4

2 回答 2

3

@delnan 到Python 参考的链接提供了一种很好的方法,但是(正如参考本身所暗示的)Python 允许正确的缩进,这也使阅读感到困惑,并且(如果您尝试利用它的全部自由性)可能难以调试。

对于您的应用程序,如果您需要每个唯一数量的缩进空格来指示不同的列表级别,则可能不会让用户感到困惑。对于这些语义,您可以在不超过四行 Python 3 中找到列表的级别。您不想在代码中看到解决方案(尽管如果您愿意,我很乐意发布)所以我的做法大致如下:

  1. 计算列表每行开头的空格数(不需要正则表达式)。
  2. 创建一个集合并对其进行排序以给出用于该列表的每个级别的缩进空格数的列表,从最少到最多排序。
  3. 创建一个字典,将每种情况下使用的缩进空格数与列表级别相关联。
  4. 使用列表每行开头的空格数来引用该字典,这给出了每行的列表级别。

(已编辑以包含代码并处理多行列表项)

鉴于:

:: List item
   (this is the second line of the first list item)
 :: List item level 2
 :: List item level 2
    :: List item level 3
      :: List item level 4
 :: List item level 2
:: List item top leve

...下面的函数生成列表:

:: List item (this is the second line of the first list item)
 :: List item level 2
 :: List item level 2
  :: List item level 3
   :: List item level 4
 :: List item level 2
:: List item top level

...我认为这是这个测试用例的预期结果。

这是代码,用于接受来自标准输入的列表:

import sys

def findIndent (lst):
    # given a list of text strings, returns a list containing the
    # indentation levels for each string
    spcCount = [len(s)-len(s.lstrip(' ')) for s in lst]
    indent = sorted(set(spcCount))
    levelRef = {indent[i]:i for i in range(len(indent))}
    return [levelRef[i]+1 for i in spcCount]

lst = []
for li in sys.stdin:
    if li.lstrip(' ').find('::') == 0:
        lst.append(li.rstrip())
    else:
        lst[-1] = lst[-1].rstrip() + ' ' + li.lstrip(' ').rstrip()

for i,li in zip(findIndent(lst),lst):
    print (' '*i + li.lstrip())
于 2013-03-03T04:53:42.787 回答
0

不是答案,但我需要块格式。

这应该解析到什么级别的列表?

:: List item level 
  :: List item level ?
 :: List item level ?
    :: List item level ?
 :: List item level ?
   :: List item level ?

我认为您正在尝试处理列表中没有任何意义的极端情况,而实际上您应该告诉用户编写更有效的内容。

于 2013-03-02T16:20:31.970 回答