首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将笑脸替换过滤器应用于Pandoc,但不应用于代码段

将笑脸替换过滤器应用于Pandoc,但不应用于代码段
EN

Code Review用户
提问于 2019-09-05 20:12:52
回答 1查看 52关注 0票数 2

我为熊猫编写了一个过滤器,它可以将:-)转换为,但不是内联代码或代码块。Pandoc是这样做的,因此applyExceptOnCodeBlock smileyfy函数在整个树中传输。但是,由于我使用的是Blocks和Inlines,所以我需要处理Block的每个数据构造函数,这些构造函数都是以D5为对象的。

代码语言:javascript
复制
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

因此,它看起来非常复杂。有更清楚的方法来表达这一点吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-09-06 19:40:40

有一个更短的方式来表达相同的功能,但我不确定你会立即发现它更清楚。

代码语言:javascript
复制
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构造函数添加一个案例,像CodeMath这样的构造函数包含它们自己的原始字符串,并且被安全地忽略了。Pandoc的数据类型已经被构造为将散文文本与标记分开,这样就可以通过只匹配您想要修改的内容来轻松地定义转换。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/227533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档