anchor.diff:              | true, TemplateHole.VarIntUnchecked (_, v) -> Some (Doc'.TextView (v.View.Map string))
               | true, TemplateHole.VarFloat (_, v) -> Some (Doc'.TextView (v.View.Map (fun i -> i.Input)))
               | true, TemplateHole.VarFloatUnchecked (_, v) -> Some (Doc'.TextView (v.View.Map string))
  -            | _ -> None
  +            | true, _ -> Console.Warn("Content hole filled with attribute data", name); None
  +            | false, _ -> None
   
           DomUtility.IterSelector el "[ws-hole]" <| fun p ->
               let name = p.GetAttribute("ws-hole")
  
positive.code:             while (p.HasChildNodes()) do
                  p.RemoveChild(p.LastChild) |> ignore
              match tryGetAsDoc name with
              | None -> Console.Warn("Unfilled hole", name)
              | Some doc ->
                  Docs.LinkElement p doc.DocNode
                  holes.JS.Push {
  
negative.code:             e.RemoveAttribute("ws-attr")
              match fw.TryGetValue(name) with
              | true, TemplateHole.Attribute (_, attr) -> addAttr e attr
              | true, _ -> Console.Warn("Attribute hole filled with non-attribute data", name)
              | false, _ -> ()
  
          DomUtility.IterSelector el "[ws-on]" <| fun e ->
              e.GetAttribute("ws-on").Split([|' '|], StringSplitOptions.RemoveEmptyEntries)
  