summaryrefslogtreecommitdiff
path: root/support/ppmcheckpdf/ppmcheckpdf.lua
diff options
context:
space:
mode:
Diffstat (limited to 'support/ppmcheckpdf/ppmcheckpdf.lua')
-rw-r--r--support/ppmcheckpdf/ppmcheckpdf.lua164
1 files changed, 164 insertions, 0 deletions
diff --git a/support/ppmcheckpdf/ppmcheckpdf.lua b/support/ppmcheckpdf/ppmcheckpdf.lua
new file mode 100644
index 0000000000..5885e5f012
--- /dev/null
+++ b/support/ppmcheckpdf/ppmcheckpdf.lua
@@ -0,0 +1,164 @@
+#!/usr/bin/env texlua
+
+-- Description: Convert PDF to PNG and compare PNG files after l3build
+-- Copyright: 2024 (c) Jianrui Lyu <tolvjr@163.com>
+-- Repository: https://github.com/lvjr/ppmcheckpdf
+-- License: The LaTeX Project Public License 1.3c
+
+ppmcheckpdf_version = "2024B"
+ppmcheckpdf_date = "2024-01-21"
+
+--------------------------------------------
+---- source code from l3build.lua
+--------------------------------------------
+
+local lfs = require("lfs")
+
+local assert = assert
+local ipairs = ipairs
+local insert = table.insert
+local lookup = kpse.lookup
+local match = string.match
+local gsub = string.gsub
+
+kpse.set_program_name("kpsewhich")
+build_kpse_path = match(lookup("l3build.lua"),"(.*[/])")
+local function build_require(s)
+ require(lookup("l3build-"..s..".lua", { path = build_kpse_path } ) )
+end
+
+-----------------------------------------
+
+build_require("file-functions")
+
+release_date = "2021-04-26" -- for old build.lua file
+dofile("build.lua")
+
+build_require("variables")
+
+imgext = imgext or ".png"
+
+local md5 = require("md5")
+
+local function md5sum(str)
+ if str then return md5.sumhexa(str) end
+end
+
+local function filesum(name)
+ local f = assert(io.open(name, "rb"))
+ local s = f:read("*all")
+ f:close()
+ return md5sum(s)
+end
+
+local function readfile(name)
+ local f = assert(io.open(name, "rb"))
+ local s = f:read("*all")
+ f:close()
+ return s
+end
+
+local function writefile(name, sum)
+ local f = assert(io.open(name, "w"))
+ f:write(sum)
+ f:close()
+end
+
+local function getfiles(path, pattern)
+ local files = { }
+ for entry in lfs.dir(path) do
+ if match(entry, pattern) then
+ insert(files, entry)
+ end
+ end
+ return files
+end
+
+local function getimgopt(imgext)
+ local imgopt = ""
+ if imgext == ".png" then
+ imgopt = " -png "
+ elseif imgext == ".ppm" then
+ imgopt = " "
+ elseif imgext == ".pgm" then
+ imgopt = " -gray "
+ elseif imgext == ".pbm" then
+ imgopt = " -mono "
+ else
+ error("unsupported image extension" .. imgext)
+ end
+ return imgopt
+end
+
+local function pdftoimg(path, pdf)
+ cmd = "pdftoppm " .. getimgopt(imgext) .. pdf .. " " .. jobname(pdf)
+ run(path, cmd)
+end
+
+local function saveimgmd5(imgname, md5file, newmd5)
+ print("save md5 and image files for " .. imgname)
+ cp(imgname, testdir, testfiledir)
+ writefile(md5file, newmd5)
+end
+
+local function ppmcheckpdf(job)
+ local errorlevel
+ local imgname = job .. imgext
+ local md5file = testfiledir .. "/" .. job .. ".md5"
+ local newmd5 = filesum(testdir .. "/" .. imgname)
+ if fileexists(md5file) then
+ local oldmd5 = readfile(md5file)
+ if newmd5 == oldmd5 then
+ errorlevel = 0
+ print("md5 check passed for " .. imgname)
+ else
+ errorlevel = 1
+ print("md5 check failed for " .. imgname)
+ local imgdiffexe = os.getenv("imgdiffexe")
+ if imgdiffexe then
+ local oldimg = abspath(testfiledir) .. "/" .. imgname
+ local newimg = abspath(testdir) .. "/" .. imgname
+ local diffname = job .. ".diff.png"
+ local cmd = imgdiffexe .. " " .. oldimg .. " " .. newimg
+ .. " -compose src " .. diffname
+ print("creating image diff file " .. diffname)
+ run(testdir, cmd)
+ elseif arg[1] == "save" then
+ saveimgmd5(imgname, md5file, newmd5)
+ end
+ end
+ else
+ errorlevel = 0
+ saveimgmd5(imgname, md5file, newmd5)
+ end
+ return errorlevel
+end
+
+local function main()
+ local errorlevel = 0
+ local pattern = "%" .. pdfext .. "$"
+ local files = getfiles(testdir, pattern)
+ for _, v in ipairs(files) do
+ pdftoimg(testdir, v)
+ pattern = "^" .. jobname(v):gsub("%-", "%%-") .. "%-%d+%" .. imgext .. "$"
+ local imgfiles = getfiles(testdir, pattern)
+ if #imgfiles == 1 then
+ local imgname = jobname(v) .. imgext
+ if fileexists(testdir .. "/" .. imgname) then
+ rm(testdir, imgname)
+ end
+ ren(testdir, imgfiles[1], imgname)
+ local e = ppmcheckpdf(jobname(v)) or 0
+ errorlevel = errorlevel + e
+ else
+ for _, i in ipairs(imgfiles) do
+ local e = ppmcheckpdf(jobname(i)) or 0
+ errorlevel = errorlevel + e
+ end
+ end
+ end
+ return errorlevel
+end
+
+local errorlevel = main()
+if os.type == "windows" then os.exit(errorlevel) end