ev/xml.rb in rwdtinker-1.67 vs ev/xml.rb in rwdtinker-1.68
- old
+ new
@@ -1,4 +1,101 @@
require "ev/sgml"
+class SGMLObject
+ def to_x(closetags=true)
+ res = ""
+
+ parsetree("prechildren_to_x", "postchildren_to_x", res, closetags)
+
+ res
+ end
+end
+
+class Text < SGMLObject
+ def prechildren_to_x(res, closetags)
+ res << @text.strip unless @text.strip.empty?
+ end
+end
+
+class Comment < SGMLObject
+ def prechildren_to_x(res, closetags)
+ res << "\n" if not previous([], [Text]).kind_of?(Comment)
+ lines = @text.gsub(/(<!--|-->)/, "").lf.split(/\n/)
+ if lines.length == 1
+ res << " "*(@level-1) + "<!-- " + lines[0].strip + " -->" + "\n"
+ else
+ res << " "*(@level-1) + "<!--" + "\n"
+ res << lines.collect{|s| " "*(@level-1) + s.strip}.delete_if{|s| s.compress.empty?}.join("\n")
+ res << "\n"
+ res << " "*(@level-1) + "-->" + "\n"
+ res << "\n"
+ end
+ end
+end
+
+class Special < SGMLObject
+ def prechildren_to_x(res, closetags)
+ res << " "*(@level-1) + @text.compress + "\n"
+ end
+end
+
+class Instruction < SGMLObject
+ def prechildren_to_x(res, closetags)
+ res << " "*(@level-1) + @text.compress + "\n"
+ end
+end
+
+class OpenTag < Tag
+ def prechildren_to_x(res, closetags)
+ a = [@subtype]
+
+ args = @args.dup
+ args.delete("id")
+ args.delete("name")
+ args = args.sort
+ args.unshift(["id", @args["id"]]) if @args.include?("id")
+ args.unshift(["name", @args["name"]]) if @args.include?("name")
+
+ args.each do |k, v|
+ if not v.include?("'")
+ a << "#{k}='#{v}'"
+ else
+ if not v.include?('"')
+ a << "#{k}=\"#{v}\""
+ else
+ a << "#{k}='#{v.gsub(/\'/, '"')}'"
+ end
+ end
+ end
+
+ if @children.length == 0 or (@children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.compress.empty?)
+ res << " "*(@level-1) + "<#{a.join(" ")}/>" + "\n"
+ else
+ if @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length == 1
+ res << " "*(@level-1) + "<#{a.join(" ")}>"
+ else
+ res << " "*(@level-1) + "<#{a.join(" ")}>" + "\n"
+ end
+ end
+ end
+
+ def postchildren_to_x(res, closetags)
+ if closetags
+ unless @children.length == 0 or (@children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.compress.empty?)
+ res << "\n" if @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length > 1
+ res << " "*(@level-1) unless @children.length == 1 and @children[0].kind_of?(Text) and @children[0].text.lf.split(/\n/).length == 1
+ res << "</#{@subtype}>"
+ res << "\n"
+ end
+ end
+ end
+end
+
class XML < SGML
+ def to_x(closetags=true)
+ res = ""
+
+ parsetree("prechildren_to_x", "postchildren_to_x", res, closetags)
+
+ res
+ end
end