如何在 Pandoc lua 过滤器中重构重复代码
2022-2-14 16:2:38
收藏:0
 阅读:847
 评论:1
我正在为 Pandoc 编写一个 Lua 过滤器,专门针对 Pandoc 生成的 LaTeX 文档。
下面是来自我的过滤器的一个小代码片段:
LATEX_CODES_FOR_TAGS = {
  Span = {
    sans = '\\sffamily ',
    serif = '\\rmfamily ',
  },
  Div = {
    -- 字体样式
    sans = '\\begin{sffamily}',
    serif = '\\begin{rmfamily}',
  }
}
function Span(span)
  for tag, code_for_class in pairs(LATEX_CODES_FOR_TAGS) do
    for class, code in pairs(code_for_class) do
      if tag == "Span" then
        if span.classes:includes(class) then
          table.insert(span.content, 1, pandoc.RawInline('latex', code))
        end
      end
    end
  end
  return span
end
function Div(div)
  for tag, code_for_class in pairs(LATEX_CODES_FOR_TAGS) do
    for class, code in pairs(code_for_class) do
      if tag == "Div" then
        if div.classes:includes(class) then
          local code_end = code:gsub('begin', 'end')
          table.insert(div.content, 1, pandoc.RawBlock('latex', code))
          table.insert(div.content, pandoc.RawBlock('latex', code_end))
        end
      end
    end
  end
  return div
end
正如你所看到的,Div() 和 Span() 函数的代码几乎完全相同,因此我想重构代码。
但我迄今为止无法找到一种解决方案,使得过滤器不带有重复的代码。
我还是 Lua 的新手,正在理解这些概念,谢谢。
点赞
 
                评论区的留言会收到邮件通知哦~
            
  
                推荐文章
            
 - 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
 - 如何在roblox studio中1:1导入真实世界的地形?
 - 求解,lua_resume的第二次调用继续执行协程问题。
 - 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
 - SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
 - Lua实现网站后台开发
 - LUA错误显式返回,社区常见的规约是怎么样的
 - lua5.3下载库失败
 - 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
 - lua lanes多线程使用
 - 一个kv数据库
 - openresty 有没有比较轻量的 docker 镜像
 - 想问一下,有大佬用过luacurl吗
 - 在Lua执行过程中使用Load函数出现问题
 - 为什么 neovim 里没有显示一些特殊字符?
 - Lua比较两个表的值(不考虑键的顺序)
 - 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
 - 如何在 Visual Studio 2022 中运行 Lua 代码?
 - addEventListener 返回 nil Lua
 - Lua中获取用户配置主目录的跨平台方法
 
将循环体定义为一个单独的函数:
local function create_handler(tag_str, handler_func) return function (obj) for tag, code_for_class in pairs(LATEX_CODES_FOR_TAGS) do for class, code in pairs(code_for_class) do if tag == tag_str then if obj.classes:includes(class) then handler_func(obj, code) end end end end return obj end end Span = create_handler("Span", function(span, code) table.insert(span.content, 1, pandoc.RawInline('latex', code)) end) Div = create_handler("Div", function(div, code) local code_end = code:gsub('begin', 'end') table.insert(div.content, 1, pandoc.RawBlock('latex', code)) table.insert(div.content, pandoc.RawBlock('latex', code_end)) end)