From 6c477ac1852f9f18cf33a863f27bf97791464dfe Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 21 Jan 2024 21:18:12 +0000 Subject: ppmcheckpdf (21jan24) git-svn-id: svn://tug.org/texlive/trunk@69527 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/scripts/ppmcheckpdf/ppmcheckpdf.lua | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100755 Master/texmf-dist/scripts/ppmcheckpdf/ppmcheckpdf.lua (limited to 'Master/texmf-dist/scripts') diff --git a/Master/texmf-dist/scripts/ppmcheckpdf/ppmcheckpdf.lua b/Master/texmf-dist/scripts/ppmcheckpdf/ppmcheckpdf.lua new file mode 100755 index 00000000000..5885e5f0126 --- /dev/null +++ b/Master/texmf-dist/scripts/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 +-- 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 -- cgit v1.2.3