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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
# Ruby interface to Tidylib.
#
class Tidyobj
# Diagnostics Buffer (Array of String).
#
attr_reader(:diagnostics)
# Access the tidy instance.
#
attr_reader(:doc)
# Error Buffer (Array of Tidyerr).
#
attr_reader(:errors)
# Options interface (Tidyopt).
#
attr_reader(:options)
# Construct a new instance.
# Receives a hash of options to be set.
#
def initialize(options=nil)
@diagnostics = Array.new
@doc = Tidylib.create
@errors = Array.new
@errbuf = Tidybuf.new
@outbuf = Tidybuf.new
@options = Tidyopt.new(@doc)
rc = Tidylib.set_error_buffer(@doc, @errbuf.struct)
verify_severe(rc)
unless options.nil?
options.each { |name, value| Tidylib.opt_parse_value(@doc, name, value) }
end
end
# Clean and Repair.
#
def clean(str)
verify_doc
rc = -1
# Clean and repair the string.
#
rc = Tidylib.parse_string(@doc, str) # Parse the input
rc = Tidylib.clean_and_repair(@doc) if rc >= 0 # Tidy it up!
rc = (Tidylib.opt_parse_value(@doc, :force_output, true) == 1 ? rc : -1) if rc > 1 # If error, force output
rc = Tidylib.save_buffer(@doc, @outbuf.struct) if rc >= 0 # Pretty Print
verify_severe(rc)
# Save and clear output/errors.
#
output = @outbuf.to_s
@errors = @errbuf.to_a.collect { |e| Tidyerr.new(e) }
@outbuf.free
@errbuf.free
# Save diagnostics.
#
rc = Tidylib.run_diagnostics(@doc)
verify_severe(rc)
@diagnostics = @errbuf.to_a
@errbuf.free
output
end
# Load a tidy config file.
#
def load_config(file)
verify_doc
rc = Tidylib.load_config(@doc, file)
case rc
when -1 then raise LoadError, "#{file} does not exist"
when 1 then raise LoadError, "errors parsing #{file}"
end
rc
end
# Clear the tidy instance.
#
def release
verify_doc
Tidylib.release(@doc)
@doc = nil
end
# Raise an error if the tidy document is invalid.
#
def verify_doc
raise TypeError, 'Invalid Tidy document' unless @doc.class == DL::PtrData
end
# Raise severe error based on tidy status value.
#
def verify_severe(rc)
raise "A severe error (#{rc}) occurred.\n" if rc < 0
end
protected :verify_doc, :verify_severe
end
|