lib/kramdown-rfc/svg-id-cleanup.rb
require 'rexml/document' SVG_NAMESPACES = {"svg"=>"http://www.w3.org/2000/svg", "xlink"=>"http://www.w3.org/1999/xlink"} def svg_id_cleanup(d) gensym = "gensym000" REXML::XPath.each(d.root, "//svg:svg", SVG_NAMESPACES) do |x| gensym = gensym.succ # warn "*** SVG" # warn "*** SVG: #{x.to_s.size}" found_as_id = Set[] found_as_href = Set[] REXML::XPath.each(x, ".//*[@id]", SVG_NAMESPACES) do |y| # warn "*** ID: #{y}" name = y.attributes["id"] if found_as_id === name warn "*** duplicate ID #{name}" end found_as_id.add(name) y.attributes["id"] = "#{name}-#{gensym}" end REXML::XPath.each(x, ".//*[@xlink:href]", SVG_NAMESPACES) do |y| # warn "*** HREF: #{y}" name = y.attributes["href"] name1 = name[1..-1] if !found_as_id === name1 warn "*** unknown HREF #{name}" end found_as_href.add(name1) y.attributes["xlink:href"] = "#{name}-#{gensym}" end found_as_id -= found_as_href warn "*** warning: unused ID: #{found_as_id.to_a.join(", ")}" unless found_as_id.empty? end rescue => detail warn "*** Can't clean SVG: #{detail}" end