File: tidyobj.rb

package info (click to toggle)
libtidy-ruby 1.1.2-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 84 kB
  • ctags: 45
  • sloc: ruby: 233; makefile: 38
file content (103 lines) | stat: -rw-r--r-- 2,380 bytes parent folder | download | duplicates (3)
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