我为熊猫编写了一个过滤器,它可以将:-)转换为☺,但不是内联代码或代码块。Pandoc是这样做的,因此applyExceptOnCodeBlock smileyfy函数在整个树中传输。但是,由于我使用的是Blocks和Inlines,所以我需要处理Block的每个数据构造函数,这些构造函数都是以D5为对象的。
import Text.Pandoc.JSON
import Text.Pandoc.Walk
import Data.List (intercalate)
import Data.List.Split (splitOn)
main :: IO ()
main = toJSONFilter $ applyExceptOnCodeBlock smileyfy
smileyfy :: String -> String
smileyfy = intercalate "☺" . splitOn ":-)"
applyExceptOnCodeInline :: (String -> String) -> Inline -> Inline
applyExceptOnCodeInline f (Str s) = Str (f s)
applyExceptOnCodeInline f (Code attr s) = Code attr s -- for code nothing shall happen
applyExceptOnCodeInline _ x = x
applyExceptOnCodeBlock :: (String -> String) -> Block -> Block
applyExceptOnCodeBlock f (Plain is) = Plain $ applyExceptOnCodeInline f <$> is
applyExceptOnCodeBlock f (Para is) = Para $ applyExceptOnCodeInline f <$> is
applyExceptOnCodeBlock f (LineBlock iss) = LineBlock $ (fmap . fmap) (applyExceptOnCodeInline f) iss
applyExceptOnCodeBlock f (RawBlock format s) = RawBlock format $ f s
applyExceptOnCodeBlock f (DefinitionList [(is, bss)]) = DefinitionList [(applyExceptOnCodeInline f <$> is
,fmap (fmap (applyExceptOnCodeBlock f)) bss)]
applyExceptOnCodeBlock f (Header i attr is) = Header i attr $ applyExceptOnCodeInline f <$> is
applyExceptOnCodeBlock f (Table is as ds tcs tcss) = Table (applyExceptOnCodeInline f <$> is) as ds tcs tcss
applyExceptOnCodeBlock _ x = x --this covers CodeBlock as well因此,它看起来非常复杂。有更清楚的方法来表达这一点吗?
发布于 2019-09-06 19:40:40
有一个更短的方式来表达相同的功能,但我不确定你会立即发现它更清楚。
import Data.List (intercalate)
import Data.List.Split (splitOn)
import Text.Pandoc.JSON
main :: IO ()
main = toJSONFilter smile
smile :: Inline -> Inline
smile (Str s) = Str . intercalate "☺" . splitOn ":-)" $ s
smile x = x我认为您忽略的洞察力是,Block构造函数CodeBlock不包含Inlines,因此,如果您的笑脸生成代码只在Inlines上工作,您可以信任Walkable类型化机器来忽略它们。这就消除了整个applyExceptOnCodeBlock函数。
类似地,没有必要为Inline的S Code构造函数添加一个案例,像Code和Math这样的构造函数包含它们自己的原始字符串,并且被安全地忽略了。Pandoc的数据类型已经被构造为将散文文本与标记分开,这样就可以通过只匹配您想要修改的内容来轻松地定义转换。
https://codereview.stackexchange.com/questions/227533
复制相似问题