Display an outline as a nested table: Difference between revisions
Display an outline as a nested table (view source)
Revision as of 19:47, 5 September 2021
, 2 years ago→Python: Functional
(→{{header|Python}}: Added a functionally composed variant.) |
|||
Line 2,212:
# main :: IO ()
def main():
'''A colored wikitable rendering of a given outline'''
'''Test'''▼
outline = '''Display an outline as a nested table.
Line 2,248:
)
)[0]
# indentLevelsFromLines :: [String] -> [(Int, String)]▼
def indentLevelsFromLines(xs):▼
'''Each input line stripped of leading▼
white space, and tupled with a preceding integer▼
giving its level of indentation from 0 upwards.▼
indentTextPairs = [▼
(n, s[n:]) for (n, s)▼
in (▼
(len(list(takewhile(isSpace, x))), x)▼
for x in xs▼
)▼
]▼
indentUnit = len(next(▼
x for x in indentTextPairs if x[0]▼
)) or 1▼
return [▼
(x[0] // indentUnit, x[1])▼
for x in indentTextPairs▼
]▼
# forestFromLevels :: [(Int, String)] -> [Tree a]▼
def forestFromLevels(levelValuePairs):▼
'''A list of trees derived from a list of values paired▼
with integers giving their levels of indentation.▼
'''▼
def go(xs):▼
if xs:▼
level, v = xs[0]▼
children, rest = span(▼
lambda x: level < x[0]▼
)(xs[1:])▼
return [Node(v)(go(children))] + go(rest)▼
else:▼
return []▼
return go(levelValuePairs)▼
Line 2,375 ⟶ 2,414:
)
return go
▲# forestFromLevels :: [(Int, String)] -> [Tree a]
▲def forestFromLevels(levelValuePairs):
▲ '''A list of trees derived from a list of values paired
▲ with integers giving their levels of indentation.
▲ '''
▲ def go(xs):
▲ if xs:
▲ level, v = xs[0]
▲ children, rest = span(
▲ lambda x: level < x[0]
▲ )(xs[1:])
▲ return [Node(v)(go(children))] + go(rest)
▲ else:
▲ return []
▲ return go(levelValuePairs)
▲# indentLevelsFromLines :: [String] -> [(Int, String)]
▲def indentLevelsFromLines(xs):
▲ '''Each input line stripped of leading
▲ white space, and tupled with a preceding integer
▲ giving its level of indentation from 0 upwards.
▲ indentTextPairs = [
▲ (n, s[n:]) for (n, s)
▲ in (
▲ (len(list(takewhile(isSpace, x))), x)
▲ for x in xs
▲ )
▲ ]
▲ indentUnit = len(next(
▲ x for x in indentTextPairs if x[0]
▲ )) or 1
▲ return [
▲ (x[0] // indentUnit, x[1])
▲ for x in indentTextPairs
▲ ]
|