summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/make4ht/domfilters/make4ht-fixinlines.lua
blob: 02338505b78d827da421c0584ae4d2e4fb0d91d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
local inline_elements = {
  a=true,
  b=true,
  big=true,
  i=true,
  small=true,
  tt=true,
  abbr=true,
  acronym=true,
  cite=true,
  code=true,
  dfn=true,
  em=true,
  kbd=true,
  strong=true,
  samp=true,
  time=true,
  var=true,
  a=true,
  bdo=true,
  br=true,
  img=true,
  map=true,
  object=true,
  q=true,
  script=true,
  span=true,
  sub=true,
  sup=true,
  button=true,
  input=true,
  label=true,
  select=true,
  textarea=true,
  mn=true,
  mi=true
}


local function fix_inlines(obj)
  local settings = get_filter_settings "fixinlines"
  local inline_elements = settings.inline_elements or inline_elements
  local nodes = obj:get_path("html body")
  local new = nil
  obj:traverse_node_list(nodes, function(jej) 
    if jej._type == "ELEMENT" or jej._type == "TEXT" then
      local name = string.lower(jej._name or "")
      -- local parent = jej:get_parent_node()
      if inline_elements[name] or jej._type == "TEXT" then
        if not new then
          -- start new paragraph
          if jej._type == "TEXT" and jej._text:match("^%s+$") then
            -- ignore parts that contain only whitespace and are placed before 
            -- paragraph start
          else
            new = obj:create_element("p" )
            new:add_child_node(obj:copy_node(jej))
            jej:replace_node(new)
          end
        else
          -- paragraph already exists
          new:add_child_node(obj:copy_node(jej))
          jej:remove_node()
        end
      else
        -- close the current paragraph before new block element
        new = nil
      end
    else
      new = nil
    end
  end)
  return obj
end

return fix_inlines