我正在为 Lua 开发一个漂亮的打印机,我一直在处理函数语法的缩进。
我想要的是:如果函数定义足够短,所有定义都可以写在一行中,但如果不是那么短,那么所有主体都需要在新行中打印并带有缩进。之后,end
关键字应该放在一个新行中,没有缩进。
我想我并不完全理解 Leijen Pretty-printer 的工作原理,但这是我到目前为止所得到的:
import Text.PrettyPrint.Leijen
import System.IO (stdout)
sometext = text "short text" </> text "this is some long text at least long enough for my purposes"
p = parens (align (cat (punctuate (comma <> space) (map text ["first parameter", "second parameter", "third"]))))
doc3 = indent 4 (sep [text "function" </> p, indent 4 sometext, text "end"])
main :: IO ()
main = do
displayIO stdout (renderPretty 1 133 (doc3 <$> line))
displayIO stdout (renderPretty 1 134 (doc3 <$> line))
displayIO stdout (renderPretty 1 40 (doc3 <$> line))
这实际上工作得很好,除了输出的第二部分:
function (first parameter, second parameter, third)
short text this is some long text at least long enough for my purposes
end
function (first parameter, second parameter, third) short text this is some long text at least long enough for my purposes end
function (first parameter,
second parameter,
third)
short text
this is some long text at least long enough for my purposes
end
在这里,我不希望在第二个输出中出现 4 个空格缩进。但是我找不到在不破坏其他输出的情况下做到这一点的方法。
任何帮助将不胜感激。
编辑:这是另一个测试用例:
doc4 = sep [ text "if" </> text "test" </> text "then"
, indent 4 then_body
, text "elseif" </> elseif_conditions </> text "then"
, indent 4 elseif_body
, text "end"
]
我想要的是,如果输出足够短,则在同一行打印所有内容(但没有缩进空格)。它在拆分多行时效果很好,但在打印到同一行时会留下多余的空格。