diff options
Diffstat (limited to 'Master/texmf-dist/scripts/make4ht/domfilters/make4ht-tablerows.lua')
-rw-r--r-- | Master/texmf-dist/scripts/make4ht/domfilters/make4ht-tablerows.lua | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/make4ht/domfilters/make4ht-tablerows.lua b/Master/texmf-dist/scripts/make4ht/domfilters/make4ht-tablerows.lua new file mode 100644 index 00000000000..155c24529ac --- /dev/null +++ b/Master/texmf-dist/scripts/make4ht/domfilters/make4ht-tablerows.lua @@ -0,0 +1,58 @@ +local log = logging.new ("tablerows") +return function(dom) + local is_empty_row = function(row) + local not_empty = false + local element_count = 0 + -- ignore hline rows + local row_class = row:get_attribute("class") + if row_class == "hline" or row_class == "cline" then return false end + -- detect if the row contain only one empty child + for _,child in ipairs(row:get_children() or {}) do + if child:is_element() then + element_count = element_count + 1 + -- empty rows contain only one element, it is not empty otherwise + if element_count > 1 then return false end + -- detect if it contains only whitespace + not_empty = child:get_text():gsub("%s","") ~= "" or not_empty + end + end + -- print("element count", element_count, not_empty) + return element_count == 1 and not_empty == false + end + local is_not_styled = function(row, css) + -- get the id attribute and escape it, so it can be used in regexp + local id = row:get_attribute("id") + if not id then return true end -- no styling without id + local search_term = "%#" .. id:gsub("%-", "%%-") + -- if the CSS file contains the row id (<td> elements can also have id + -- that matches this pattern, so we should keep the row if we match them too) + return not css:match(search_term) + end + local load_css_files = function() + -- the empty rows can be styled using CSS, for example configuration for + -- Booktabs does that. We shouldn't remove such rows. + local cssfiles = {} + for _, link in ipairs(dom:query_selector("head link")) do + local src = link:get_attribute("href") + if src then + local f = io.open(src, "r") + if f then + local contents = f:read("*all") + f:close() + table.insert(cssfiles, contents) + end + end + end + return table.concat(cssfiles, "\n") + end + local css = load_css_files() + for _, tbl in ipairs(dom:query_selector("table")) do + -- find the empty rows + for _, row in ipairs(tbl:query_selector("tr")) do + if is_empty_row(row) and is_not_styled(row, css) then row:remove_node() end + end + + end + return dom +end + |