tidy_ffi 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +9 -0
- data/CHANGELOG +2 -1
- data/README.rdoc +6 -8
- data/lib/tidy_ffi/interface.rb +42 -40
- data/lib/tidy_ffi/lib_tidy.rb +8 -1
- data/lib/tidy_ffi/options_container.rb +7 -7
- data/lib/tidy_ffi/tidy_ffi_extensions.rb +2 -9
- data/lib/tidy_ffi/version.rb +1 -1
- data/spec/simple_spec.rb +7 -2
- data/tidy_ffi.gemspec +1 -1
- metadata +15 -9
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
v0.1.
|
1
|
+
v0.1.5. Fix JRuby issues.
|
2
|
+
v0.1.4. Fix the way libtidy is located on the filesystem. Works if libtidy is in /usr/lib64, instead of /usr/lib
|
2
3
|
v0.1.3. Fix recognition of date on weird environments
|
3
4
|
v0.1.2. Initialize buffer before use
|
4
5
|
v0.1.1. Fixes for new version of FFI gem
|
data/README.rdoc
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
== What is it all about?
|
4
4
|
|
5
|
-
I
|
5
|
+
I wanted to have a clean and simple tidy library. For example:
|
6
6
|
TidyFFI::Tidy.new('a string').clean
|
7
7
|
|
8
8
|
For now it can't do anything else than clean (and saves errors from it) :)
|
9
9
|
|
10
10
|
== Options
|
11
11
|
|
12
|
-
You can use different ways to
|
12
|
+
You can use different ways to specify options. These examples produce the same output:
|
13
13
|
|
14
14
|
TidyFFI::Tidy.default_options.show_body_only = true
|
15
15
|
TidyFFI::Tidy.new('test').clean
|
16
|
-
|
16
|
+
|
17
17
|
TidyFFI::Tidy.with_options(:show_body_only => true).new('test').clean
|
18
|
-
|
18
|
+
|
19
19
|
tidy = TidyFFI::Tidy.new('test')
|
20
20
|
tidy.options.show_body_only = true
|
21
21
|
tidy.clean
|
@@ -24,8 +24,6 @@ You can use different ways to set up options. These examples are produces the sa
|
|
24
24
|
|
25
25
|
TidyFFI::Tidy.clean('test', :show_body_only => 1)
|
26
26
|
|
27
|
-
==
|
27
|
+
== Other stuff
|
28
28
|
|
29
|
-
|
30
|
-
* Bug tracker: http://rubyforge.org/tracker/?atid=30230&group_id=7805&func=browse
|
31
|
-
* Rubyforge project: http://rubyforge.org/projects/tidy-ffi
|
29
|
+
And of course, it's depenedent on ffi and libtidy. So make sure they're installed before using the library!
|
data/lib/tidy_ffi/interface.rb
CHANGED
@@ -100,18 +100,19 @@ class TidyFFI::Interface
|
|
100
100
|
|
101
101
|
pick_list = []
|
102
102
|
|
103
|
-
FFI::MemoryPointer.new(:pointer, 1)
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
103
|
+
pointer = FFI::MemoryPointer.new(:pointer, 1)
|
104
|
+
pointer.put_pointer(0, iterator)
|
105
|
+
until iterator.null?
|
106
|
+
pick_list << LibTidy.tidyOptGetNextPick(opt, pointer)
|
107
|
+
iterator = pointer.get_pointer(0)
|
109
108
|
end
|
110
109
|
|
111
110
|
pick_list
|
111
|
+
ensure
|
112
|
+
pointer.free if pointer
|
112
113
|
end
|
113
114
|
private :pick_list_for
|
114
|
-
|
115
|
+
|
115
116
|
# Loads default options.
|
116
117
|
def load_default_options
|
117
118
|
return if @default_options
|
@@ -121,40 +122,40 @@ class TidyFFI::Interface
|
|
121
122
|
|
122
123
|
@default_options = {}
|
123
124
|
|
124
|
-
FFI::MemoryPointer.new(:pointer, 1)
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
end
|
146
|
-
when :boolean
|
147
|
-
LibTidy.tidyOptGetDefaultBool(opt) != 0
|
125
|
+
pointer = FFI::MemoryPointer.new(:pointer, 1)
|
126
|
+
pointer.put_pointer(0, iterator)
|
127
|
+
|
128
|
+
until iterator.null?
|
129
|
+
opt = LibTidy.tidyGetNextOption(doc, pointer)
|
130
|
+
|
131
|
+
option = {}
|
132
|
+
|
133
|
+
option[:name] = LibTidy.tidyOptGetName(opt).gsub('-', '_').intern
|
134
|
+
option[:readonly?] = LibTidy.tidyOptIsReadOnly(opt) != 0
|
135
|
+
option[:type] = LibTidy::TIDY_OPTION_TYPE[LibTidy.tidyOptGetType(opt)]
|
136
|
+
option[:default] = case option[:type]
|
137
|
+
when :string
|
138
|
+
(LibTidy.tidyOptGetDefault(opt) rescue "")
|
139
|
+
when :integer
|
140
|
+
if pick_list = pick_list_for(opt)
|
141
|
+
option[:type] = :enum
|
142
|
+
option[:values] = pick_list
|
143
|
+
pick_list[LibTidy.tidyOptGetDefaultInt(opt)]
|
144
|
+
else
|
145
|
+
LibTidy.tidyOptGetDefaultInt(opt)
|
148
146
|
end
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
iterator = pointer.get_pointer(0)
|
147
|
+
when :boolean
|
148
|
+
LibTidy.tidyOptGetDefaultBool(opt) != 0
|
153
149
|
end
|
154
150
|
|
151
|
+
@default_options[option[:name]] = option
|
152
|
+
|
153
|
+
iterator = pointer.get_pointer(0)
|
155
154
|
end
|
155
|
+
|
156
156
|
@default_options.freeze
|
157
157
|
ensure
|
158
|
+
pointer.free if pointer
|
158
159
|
LibTidy.tidyRelease(doc)
|
159
160
|
end
|
160
161
|
private :load_default_options
|
@@ -171,11 +172,12 @@ class TidyFFI::Interface
|
|
171
172
|
def self.default_options
|
172
173
|
@default_options ||= load_default_options
|
173
174
|
end
|
174
|
-
|
175
|
+
|
175
176
|
# Returns true if value is valid for +option+ and false otherwise.
|
176
177
|
def self.option_valid?(option, value)
|
177
|
-
|
178
|
-
|
178
|
+
spec = default_options[option]
|
179
|
+
return false unless spec
|
180
|
+
|
179
181
|
case spec[:type]
|
180
182
|
when :boolean
|
181
183
|
true == value || false == value || value == 0 || value == 1 || %w(on off true false 0 1 yes no).include?(value.downcase)
|
@@ -185,10 +187,10 @@ class TidyFFI::Interface
|
|
185
187
|
if Integer === value
|
186
188
|
!!spec[:values][value]
|
187
189
|
else
|
188
|
-
spec[:values].include?(value)
|
190
|
+
spec[:values].include?(value.downcase)
|
189
191
|
end
|
190
192
|
when :string
|
191
193
|
String === value || Symbol === value
|
192
194
|
end
|
193
195
|
end
|
194
|
-
end
|
196
|
+
end
|
data/lib/tidy_ffi/lib_tidy.rb
CHANGED
@@ -3,7 +3,14 @@
|
|
3
3
|
# This file must be lazy loaded!
|
4
4
|
class TidyFFI::LibTidy #:nodoc:
|
5
5
|
extend FFI::Library
|
6
|
-
|
6
|
+
|
7
|
+
paths = Array(TidyFFI.library_path || Dir['/{opt,usr}/{,local/}lib{,64}/libtidy{,-*}.{dylib,so*}'])
|
8
|
+
begin
|
9
|
+
ffi_lib(*paths)
|
10
|
+
rescue LoadError
|
11
|
+
raise TidyFFI::LibTidyNotInstalled, "didn't find tidy libs on your system. Please install tidy (http://tidy.sourceforge.net/)"
|
12
|
+
end
|
13
|
+
|
7
14
|
|
8
15
|
attach_function :tidyReleaseDate, [], :string
|
9
16
|
|
@@ -48,12 +48,12 @@ class TidyFFI::OptionsContainer #:nodoc:
|
|
48
48
|
# It's a kinda bad method: it uses TidyFFI::Interface.option_valid and TidyFFI::Tidy.validate_options?
|
49
49
|
# Also it do second lookup into default options
|
50
50
|
def validate_option(key, value)
|
51
|
-
if TidyFFI::Tidy.validate_options?
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
return if !TidyFFI::Tidy.validate_options? || TidyFFI::Interface.option_valid?(key, value)
|
52
|
+
|
53
|
+
if TidyFFI::Interface.default_options[key]
|
54
|
+
raise TidyFFI::Tidy::InvalidOptionValue, "#{value} is not a valid value for key #{key}"
|
55
|
+
else
|
56
|
+
raise TidyFFI::Tidy::InvalidOptionName, "#{key} is an invalid option name"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -87,4 +87,4 @@ class TidyFFI::OptionsContainer #:nodoc:
|
|
87
87
|
@obj.send(meth, *args)
|
88
88
|
end
|
89
89
|
end
|
90
|
-
end
|
90
|
+
end
|
@@ -1,12 +1,5 @@
|
|
1
1
|
module TidyFFI::TidyFFIExtensions #:nodoc:
|
2
|
-
# Sets path to libtidy.{dylib,so}
|
3
|
-
|
4
|
-
@libtidy_path = path
|
5
|
-
end
|
6
|
-
|
7
|
-
# Returns path to libtidy.{dylib,so}
|
8
|
-
def library_path
|
9
|
-
@libtidy_path ||= 'tidy'
|
10
|
-
end
|
2
|
+
# Sets and gets path to libtidy.{dylib,so}
|
3
|
+
attr_accessor :library_path
|
11
4
|
end
|
12
5
|
TidyFFI.extend TidyFFI::TidyFFIExtensions
|
data/lib/tidy_ffi/version.rb
CHANGED
data/spec/simple_spec.rb
CHANGED
@@ -46,8 +46,13 @@ describe TidyFFI::Tidy do
|
|
46
46
|
it "raises error on invalid option value" do
|
47
47
|
TidyFFI::Tidy.validate_options = true
|
48
48
|
lambda do
|
49
|
-
TidyFFI::Tidy.default_options = {:force_output => "utter
|
49
|
+
TidyFFI::Tidy.default_options = {:force_output => "utter garbage"}
|
50
50
|
end.should raise_error(TidyFFI::Tidy::InvalidOptionValue)
|
51
51
|
end
|
52
|
+
|
53
|
+
it 'accepts UTF-8 writter in uppercase' do
|
54
|
+
TidyFFI::Tidy.validate_options = true
|
55
|
+
expect { TidyFFI::Tidy.default_options = {:char_encoding => "UTF8"} }.not_to raise_error
|
56
|
+
end
|
52
57
|
end
|
53
|
-
end
|
58
|
+
end
|
data/tidy_ffi.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tidy_ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,19 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 1.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.2.0
|
25
30
|
description: Tidy library interface via FFI
|
26
31
|
email: libc@libc.st
|
27
32
|
executables: []
|
@@ -30,6 +35,7 @@ extra_rdoc_files: []
|
|
30
35
|
files:
|
31
36
|
- .gitignore
|
32
37
|
- .rspec
|
38
|
+
- .travis.yml
|
33
39
|
- CHANGELOG
|
34
40
|
- Gemfile
|
35
41
|
- LICENSE
|
@@ -62,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
68
|
version: '0'
|
63
69
|
segments:
|
64
70
|
- 0
|
65
|
-
hash:
|
71
|
+
hash: 3224835435869118634
|
66
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
73
|
none: false
|
68
74
|
requirements:
|
@@ -71,10 +77,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
77
|
version: '0'
|
72
78
|
segments:
|
73
79
|
- 0
|
74
|
-
hash:
|
80
|
+
hash: 3224835435869118634
|
75
81
|
requirements: []
|
76
82
|
rubyforge_project: tidy-ffi
|
77
|
-
rubygems_version: 1.8.
|
83
|
+
rubygems_version: 1.8.24
|
78
84
|
signing_key:
|
79
85
|
specification_version: 3
|
80
86
|
summary: Tidy library interface via FFI
|