make4ht:解析失败时允许构建过程继续

make4ht:解析失败时允许构建过程继续

我用制作4小时生成 html ;该过程的一部分是自定义构建文件,它解析HTML并执行一些检查/操作:

mwe.tex

\documentclass{article}

\begin{document}

test: $2^3$

unbalanced: ($6)$

\section{test section}
more text
\end{document}

mwe.cfg

\Preamble{xhtml,mathml,next,5,-css,NoFonts}
\begin{document}
\EndPreamble

mwe.mk4

local domfilter = require "make4ht-domfilter"
local filter = require "make4ht-filter"
local dom    = require "luaxml-domobject"

local function mwe_parsing(s)
      local obj = dom.parse(s)
      obj:traverse_elements(function(el)
      end)
      -- serialize the DOM object back to HTML
      return obj:serialize()
end

local process = filter {mwe_parsing}
Make:match("html$", process)
Make:match("html$", "tidy -m -xml -utf8 -q -i ${filename}")

致电 make4ht

呼叫make4ht

make4ht -u -c mwe.cfg mwe.tex

结果是 HTML 文件,但第一个文件 ( ) 上的解析错误已停止对其他文件的mwe.html解析和后续构建操作(在上面的 中)( )tidymwese1.html

parse_lg process file: mwe.html
...ive/2019/texmf-dist/tex/luatex/luaxml/luaxml-mod-xml.lua:174: Unbalanced Tag (/mrow) [char=848]

笔记

知道问题出在哪里mwe.tex,需要改成什么$(6)$,但我无法控制我得到的源文件,而这个过程的一部分就是找到这样的错误。这个问题是htlatex:调整 MathML 输出以适应多位数字

问题

我该如何定制mwe.mk4,以便它能解决 html 文件中的解析错误并继续构建过程?也许可以检查一下是否dom.parse(s)成功?

答案1

问题是,LuaXML当发现无效的 XML 结构时,会发出运行时错误。这在 中处理make4ht-domfilter,但由于您自己解析 XML,因此您还必须处理错误。

要捕获错误,您可以使用该pcall函数。以下构建文件需要的开发版本make4ht,因为我发现pcall默认情况下构建文件中没有。现在应该已经修复了。

local domfilter = require "make4ht-domfilter"
local filter = require "make4ht-filter"
local dom    = require "luaxml-domobject"
local log = logging.new "build file"

local function mwe_parsing(s)
      local status, obj = pcall(function()
          return dom.parse(s)
      end)
      if not status then 
        log:warning("HTML parsing failed")
        log:warning(obj)
        return s 
      end
      obj:traverse_elements(function(el)
      end)
      -- serialize the DOM object back to HTML
      return obj:serialize()
end

local process = filter {mwe_parsing}
Make:match("html$", process)
Make:match("html$", "tidy -m -xml -utf8 -q -i ${filename}")

重要的部分是这样的:

      local status, obj = pcall(function()
          return dom.parse(s)
      end)
      if not status then 
        log:warning("HTML parsing failed")
        log:warning(obj)
        return s 
      end

pcall返回false状态时,obj变量包含错误消息。我们可以对此进行测试,使用内置make4ht日志发出警告并返回原始文档。这将打印以下警告:

 [WARNING] build file: HTML parsing failed
 [WARNING] build file: /home/michal/texmf/scripts/lua/LuaXML/luaxml-mod-xml.lua:175: Unbalanced Tag (/mrow) [char=702]

相关内容