ruby-xslt 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/AUTHORS CHANGED
@@ -14,6 +14,9 @@ Brendan Taylor <whateley at gmail dot com>
14
14
  <kiyoya at gmail dot com>
15
15
  * Add definitions for some error classes and sets libxml error function
16
16
 
17
+ Pau Garcia i Quiles <pgquiles at elpauer dot org>
18
+ * gemspec
19
+
17
20
  == Thanks to :
18
21
 
19
22
  knu <knu at freebsd dot org> for FreeBSD port (see http://www.freshports.org/textproc/ruby-xslt/)
data/ChangeLog CHANGED
@@ -1,3 +1,11 @@
1
+ 0.9.3 :
2
+ * Due to recent changes in Gentoo Linux's install system, ruby-xslt no longer installs correctly. Brendan fixed this.
3
+ * Cleaned up extconf.rb
4
+ * Removed unused debugging code (memwatch)
5
+ * Moved some things out of C into Ruby
6
+ * Made error handling much more useful
7
+ * Added some unit tests
8
+
1
9
  0.9.2 :
2
10
  * Changes to the way XSLT files are loaded, so that we can keep their base URI straight - Sorry Brendan !!!
3
11
  * Major corrections
data/README CHANGED
@@ -17,9 +17,10 @@ This program is distributed without any warranty. See the file
17
17
  == DOWNLOAD
18
18
 
19
19
  === Last version
20
- * version 0.9.2[http://gregoire.lejeune.free.fr/ruby-xslt_0.9.2.tar.gz]
20
+ * version 0.9.3[http://gregoire.lejeune.free.fr/ruby-xslt_0.9.3.tar.gz]
21
21
 
22
22
  === Old versions
23
+ * version 0.9.2[http://gregoire.lejeune.free.fr/ruby-xslt_0.9.2.tar.gz]
23
24
  * version 0.9.1[http://gregoire.lejeune.free.fr/ruby-xslt_0.9.1.tar.gz]
24
25
  * version 0.8.2[http://gregoire.lejeune.free.fr/ruby-xslt_0.8.2.tar.gz]
25
26
  * version 0.8.1[http://gregoire.lejeune.free.fr/ruby-xslt_0.8.1.tar.gz]
@@ -57,14 +58,10 @@ See this page[http://rubyforge.org/scm/?group_id=423] for more informations
57
58
  --with-xslt-dir=PATH specify the directory name for the libxslt include
58
59
  files and/or library
59
60
 
60
- --enable-error-handler enables a VERY crude error handler. Error messages
61
- are appended to the class variable XML::XSLT and can
62
- be accessed with the class method XML::XSLT.errors
63
- (will change in a future version)
61
+ --disable-error-handler disables the new error handler
62
+
64
63
  --disable-exslt disables libexslt support <http://exslt.org/>
65
64
 
66
- --enable-debug compile with memwatch
67
- <http://www.linkdata.se/sourcecode.html>
68
65
 
69
66
  == EXAMPLES
70
67
 
@@ -84,8 +81,8 @@ See this page[http://rubyforge.org/scm/?group_id=423] for more informations
84
81
 
85
82
  xslt = XML::XSLT.new()
86
83
 
87
- xslt.xml = REXML::Document.new File.open( "test.xml" )
88
- xslt.xsl = REXML::Document.new File.open( "test.xsl" )
84
+ xslt.xml = REXML::Document.new File.read( "test.xml" )
85
+ xslt.xsl = REXML::Document.new File.read( "test.xsl" )
89
86
 
90
87
  out = xslt.serve()
91
88
  print out;
@@ -119,19 +116,32 @@ See this page[http://rubyforge.org/scm/?group_id=423] for more informations
119
116
  === External functions support
120
117
  require "xml/xslt"
121
118
 
122
- class XML::XSLT
123
- def round_trip( arg )
124
- arg
125
- end
126
- def type( arg )
127
- arg.class.to_s
128
- end
129
- end
130
-
131
119
  xslt = XML::XSLT.new()
132
120
  xslt.xsl = "functions.xsl"
133
121
  xslt.xml = "test.xml"
134
- XML::XSLT.extFunction("round-trip", "http://test.none", xslt)
135
- XML::XSLT.extFunction("type", "http://test.none", xslt)
122
+
123
+ XML::XSLT.registerExtFunc("http://test.none", "round-trip") do |arg|
124
+ arg
125
+ end
126
+
127
+ XML::XSLT.registerExtFunc("http://test.none", "type") do |arg|
128
+ arg.class.to_s
129
+ end
136
130
 
137
131
  print xslt.serve
132
+
133
+ === Error handling
134
+
135
+ XML::XSLT.registerErrorHandler { |string| puts string }
136
+
137
+ xslt = XML::XSLT.new
138
+ xslt.xml = "not xml"
139
+
140
+ This fragment would print:
141
+
142
+ Entity: line 1:
143
+ parser
144
+ error :
145
+ Start Tag expected, '<' not found
146
+ not xml
147
+ ^
data/examples/fuzface.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
- require '../xslt'
3
+ require 'xml/xslt'
4
4
 
5
5
  xslt = XML::XSLT.new()
6
6
  xslt.xmlfile = "fuzface.xml"
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby -w
2
2
  require 'rexml/document'
3
- require '../xslt'
3
+ require 'xml/xslt'
4
4
 
5
5
  xslt = XML::XSLT.new()
6
6
 
@@ -8,4 +8,4 @@ xslt.xml = REXML::Document.new File.open( "fuzface.xml" )
8
8
  xslt.xsl = REXML::Document.new File.open( "fuzface.xsl" )
9
9
 
10
10
  out = xslt.serve()
11
- puts out
11
+ puts out
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
3
  require 'xml/smart'
4
- require '../xslt'
4
+ require 'xml/xslt'
5
5
 
6
6
  xslt = XML::XSLT.new()
7
7
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
- require '../xslt'
3
+ require 'xml/xslt'
4
4
 
5
5
  xslt = XML::XSLT.new()
6
6
  xslt.xml = IO::readlines( "fuzface.xml" ).join
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
- require '../xslt'
3
+ require 'xml/xslt'
4
4
 
5
5
  xslt = XML::XSLT.new()
6
6
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
- require '../xslt'
3
+ require 'xml/xslt'
4
4
 
5
5
  xslt = XML::XSLT.new()
6
6
  xslt.xsl = "fuzface.xsl"
data/examples/info.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/ruby
2
- require "../xslt"
2
+ require "xml/xslt"
3
3
 
4
4
  print "MAX_DEPTH = ", XML::XSLT::MAX_DEPTH, "\n"
5
5
  print "MAX_SORT = ", XML::XSLT::MAX_SORT, "\n"
@@ -1,4 +1,4 @@
1
- require "../xslt"
1
+ require "xml/xslt"
2
2
 
3
3
  class XML::XSLT
4
4
  def round_trip( arg )
@@ -1,4 +1,4 @@
1
- require "../xslt"
1
+ require "xml/xslt"
2
2
 
3
3
  xslt = XML::XSLT.new()
4
4
  xslt.xsl = "test.xsl"
data/extconf.rb CHANGED
@@ -17,98 +17,63 @@ Configuration:
17
17
  --with-xslt-dir=PATH specify the directory name for the libxslt include
18
18
  files and/or library
19
19
 
20
- --enable-error-handler enables a VERY crude error handler. Error messages
21
- are appended to the class variable XML::XSLT and can
22
- be accessed with the class method XML::XSLT.errors
23
- (will change in a future version)
24
- --disable-exslt disables libexslt support <http://exslt.org/>
20
+ --disable-error-handler disables the new error handler
25
21
 
26
- --enable-debug compile with memwatch
27
- <http://www.linkdata.se/sourcecode.html>
28
-
22
+ --disable-exslt disables libexslt support <http://exslt.org/>
29
23
  HELP
30
24
  end
31
25
 
32
- if ARGV.include?( "--help" )
26
+ if ARGV.include?( "--help" ) or ARGV.include?( "-h" )
33
27
  help()
34
28
  exit 0
35
29
  end
36
30
 
37
- if enable_config("debug", false)
38
- File.symlink( "debug/memwatch.h", "memwatch.h" ) if( ! File.exist?("memwatch.h") )
39
- File.symlink( "debug/memwatch.c", "memwatch.c" ) if( ! File.exist?("memwatch.c") )
40
- $CFLAGS += " -DMEMWATCH -D__DEBUG__"
41
- end
42
-
43
- if enable_config("error-handler", false)
31
+ if enable_config("error-handler", true)
44
32
  $CFLAGS += " -DUSE_ERROR_HANDLER"
45
33
  end
46
34
 
47
- $LIBPATH.push(Config::CONFIG['libdir'])
35
+ #$LIBPATH.push(Config::CONFIG['libdir'])
48
36
 
49
37
  def crash(str)
50
38
  printf(" extconf failure: %s\n", str)
51
39
  exit 1
52
40
  end
53
41
 
54
- #unless have_library("z", "inflate")
55
- # crash("need zlib")
56
- #else
57
- # $defs.push('-DHAVE_ZLIB_H')
58
- #end
59
-
60
- if dir_config( "xslt" ) != [nil, nil]
61
- inc, lib = dir_config( 'xslt' )
62
- $LDFLAGS << " -L#{lib} -lxslt -lxml2 -lz -lpthread -liconv -lm"
63
- $CFLAGS << " -I#{inc}"
64
- elsif ex = find_executable( "xslt-config" )
65
- $LDFLAGS << ' ' + `#{ex} --libs`.chomp
66
- $CFLAGS << ' ' + `#{ex} --cflags`.chomp
67
- else
68
- crash(<<EOL)
69
- need libxslt.
42
+ dir_config( 'xml2' )
43
+ dir_config( 'xslt' )
70
44
 
71
- Install the library or try one of the following options to extconf.rb:
72
-
73
- --with-xslt-lib=/path/to/libxslt/lib
74
- --with-xslt-include=/path/to/libxslt/include
75
- EOL
76
- end
45
+ have_library "xml2", "xmlParseDoc" || crash("need libxml2")
46
+ have_library "xslt", "xsltParseStylesheetFile" || crash("need libxslt")
77
47
 
78
48
  if enable_config("exslt", true)
79
- $LDFLAGS << " -lexslt"
49
+ have_library "exslt", "exsltRegisterAll"
80
50
  $CFLAGS += " -DUSE_EXSLT"
81
51
  end
82
52
 
83
- $CFLAGS = '-g -Wall ' + $CFLAGS
84
-
85
- puts "compile with : "
86
- puts " CFLAGS = #{$CFLAGS}"
87
- puts " LDFLAGS = #{$LDFLAGS}"
88
- puts
53
+ $CFLAGS = '-g -Wall ' + `xml2-config --cflags`.chomp + " " + `xslt-config --cflags`.chomp + " " + $CFLAGS
89
54
 
90
55
  create_header()
91
- create_makefile("xml/xslt")
56
+ create_makefile("xml/xslt_lib")
92
57
 
93
- ###### Modify Makefile: #######
94
58
  File.rename( "Makefile", "Makefile.orig" )
95
- oldmkfl = File.open( "Makefile.orig" )
96
- newmkfl = File.open( "Makefile", "w" )
97
- oldmkfl.each_line{ |line|
98
- case(line)
99
- when /^all:/
100
- newmkfl.puts(line)
101
- newmkfl.puts("")
102
- newmkfl.puts("test: all") # insert the "test" target
103
- newmkfl.puts("\t\t@cd tests && ruby test.rb && cd ..")
104
- newmkfl.puts("doc: all") # insert the "doc" target
105
- newmkfl.puts("\t\t@rdoc -S -t \"Ruby/XSLT Documentation\" README AUTHORS ChangeLog xslt.c")
106
- when /^distclean:/
107
- newmkfl.puts(line)
108
- newmkfl.puts("\t\t@-$(RM) memwatch.h memwatch.c Makefile.orig")
109
- newmkfl.puts("\t\t@-$(RM)r doc")
110
- else
111
- newmkfl.puts(line)
112
- end
113
- }
114
- newmkfl.close
59
+ File.open( "Makefile.orig" ) do |oldmkfl|
60
+ File.open( "Makefile", "w" ) do |newmkfl|
61
+ oldmkfl.each_line do |line|
62
+ case(line)
63
+ when /^all:/
64
+ newmkfl.puts(line)
65
+ newmkfl.puts("")
66
+ newmkfl.puts("test: all") # insert the "test" target
67
+ newmkfl.puts("\t\t@cd tests && ruby test.rb && cd ..")
68
+ newmkfl.puts("doc: all") # insert the "doc" target
69
+ newmkfl.puts("\t\t@rdoc -S -t \"Ruby/XSLT Documentation\" README AUTHORS ChangeLog xslt_lib.c lib/xslt.rb")
70
+ when /^distclean:/
71
+ newmkfl.puts(line)
72
+ newmkfl.puts("\t\t@-$(RM) Makefile.orig")
73
+ newmkfl.puts("\t\t@-$(RM)r doc")
74
+ else
75
+ newmkfl.puts(line)
76
+ end
77
+ end
78
+ end
79
+ end
data/extfunc.c CHANGED
@@ -175,42 +175,34 @@ xmlXPathObjectPtr value2xpathObj (VALUE val) {
175
175
  */
176
176
  void xmlXPathFuncCallback( xmlXPathParserContextPtr ctxt, int nargs) {
177
177
  VALUE result, arguments[nargs];
178
- VALUE ns_hash, func_hash, object;
179
- const xmlChar *namespace;
180
- char *rb_func, *chr;
178
+ VALUE ns_hash, func_hash, block;
179
+ const xmlChar *namespace, *name;
181
180
  xmlXPathObjectPtr obj;
182
181
  int i;
183
182
 
184
183
  if (ctxt == NULL || ctxt->context == NULL)
185
184
  return;
186
185
 
187
- rb_func = strdup((char *)ctxt->context->function);
186
+ name = ctxt->context->function;
188
187
  namespace = ctxt->context->functionURI;
189
188
 
190
189
  ns_hash = rb_cvar_get(cXSLT, rb_intern("@@extFunctions"));
191
-
190
+
192
191
  func_hash = rb_hash_aref(ns_hash, rb_str_new2((char *)namespace));
193
192
 
194
193
  if(func_hash == Qnil) {
195
- rb_warning( "xmlXPathFuncCallback: namespace %s not found!\n", namespace );
194
+ rb_warning( "xmlXPathFuncCallback: namespace %s not registered!\n", namespace );
196
195
  }
197
196
 
198
- object = rb_hash_aref(func_hash, rb_str_new2((char *)rb_func));
197
+ block = rb_hash_aref(func_hash, rb_str_new2((char *)name));
199
198
 
200
199
  for (i = nargs - 1; i >= 0; i--) {
201
200
  obj = valuePop(ctxt);
202
201
  arguments[i] = xpathObj2value(obj, ctxt->context->doc);
203
202
  }
204
203
 
205
- /* -s are common in XSLT function names, but illegal for Ruby method names */
206
- while( (chr = strchr(rb_func, '-')) != NULL ) {
207
- chr[0] = '_'; /* so we pretend the - was a _ all along */
208
- }
209
-
210
- result = rb_funcall2( object, rb_intern(rb_func), nargs, arguments);
204
+ result = rb_funcall2( block, rb_intern("call"), nargs, arguments);
211
205
 
212
- free( rb_func );
213
-
214
206
  obj = value2xpathObj(result);
215
207
  valuePush(ctxt, obj);
216
208
  }
data/parser.c CHANGED
@@ -24,11 +24,6 @@ extern VALUE cXSLT;
24
24
  xmlDocPtr parse_xml( char* xml, int iXmlType ) {
25
25
  xmlDocPtr tXMLDocument = NULL;
26
26
 
27
- #ifdef USE_ERROR_HANDLER
28
- VALUE error_arr = rb_cvar_get(cXSLT, rb_intern("@@errors"));
29
- int iInitialNumberOfErrors = RARRAY(error_arr)->len;
30
- #endif
31
-
32
27
  /** Act: Parse XML */
33
28
  if( iXmlType == RUBY_XSLT_XMLSRC_TYPE_STR ) {
34
29
  tXMLDocument = xmlParseMemory( xml, strlen( xml ) );
@@ -41,12 +36,6 @@ xmlDocPtr parse_xml( char* xml, int iXmlType ) {
41
36
  return( NULL );
42
37
  }
43
38
 
44
- #ifdef USE_ERROR_HANDLER
45
- if(RARRAY(error_arr)->len > iInitialNumberOfErrors) {
46
- rb_raise( eXSLTTransformationError, "Stylesheet transformation error" );
47
- }
48
- #endif
49
-
50
39
  return( tXMLDocument );
51
40
  }
52
41
 
@@ -58,11 +47,6 @@ xsltStylesheetPtr parse_xsl( char* xsl, int iXslType ) {
58
47
  xmlCharEncodingHandlerPtr encoder = NULL;
59
48
  const xmlChar *encoding = NULL;
60
49
 
61
- #ifdef USE_ERROR_HANDLER
62
- VALUE error_arr = rb_cvar_get(cXSLT, rb_intern("@@errors"));
63
- int iInitialNumberOfErrors = RARRAY(error_arr)->len;
64
- #endif
65
-
66
50
  /** Act: Encoding support */
67
51
  xmlInitCharEncodingHandlers( );
68
52
 
@@ -95,12 +79,6 @@ xsltStylesheetPtr parse_xsl( char* xsl, int iXslType ) {
95
79
  }
96
80
  }
97
81
 
98
- #ifdef USE_ERROR_HANDLER
99
- if(RARRAY(error_arr)->len > iInitialNumberOfErrors) {
100
- rb_raise( eXSLTTransformationError, "Stylesheet transformation error" );
101
- }
102
- #endif
103
-
104
82
  return( tParsedXslt );
105
83
  }
106
84
 
@@ -113,11 +91,6 @@ char* parse( xsltStylesheetPtr tParsedXslt, xmlDocPtr tXMLDocument, char **pxPar
113
91
  xmlChar *tXMLDocumentResultString;
114
92
  int tXMLDocumentResultLenght;
115
93
 
116
- #ifdef USE_ERROR_HANDLER
117
- VALUE error_arr = rb_cvar_get(cXSLT, rb_intern("@@errors"));
118
- int iInitialNumberOfErrors = RARRAY(error_arr)->len;
119
- #endif
120
-
121
94
  tXMLDocumentResult = xsltApplyStylesheet( tParsedXslt, tXMLDocument, (const char**) pxParams );
122
95
  if( tXMLDocumentResult == NULL ) {
123
96
  rb_raise( eXSLTTransformationError, "Stylesheet transformation error" );
@@ -128,12 +101,6 @@ char* parse( xsltStylesheetPtr tParsedXslt, xmlDocPtr tXMLDocument, char **pxPar
128
101
 
129
102
  xmlFreeDoc(tXMLDocumentResult);
130
103
 
131
- #ifdef USE_ERROR_HANDLER
132
- if(RARRAY(error_arr)->len > iInitialNumberOfErrors) {
133
- rb_raise( eXSLTTransformationError, "Stylesheet transformation error" );
134
- }
135
- #endif
136
-
137
104
  return((char*)tXMLDocumentResultString);
138
105
  }
139
106
 
data/ruby-xslt.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{ruby-xslt}
3
- s.version = "0.9.2"
3
+ s.version = "0.9.3"
4
4
  s.date = %q{2005-11-17}
5
5
  s.summary = %q{A Ruby class for processing XSLT}
6
- s.email = %q{greg@webtime-project.net}
6
+ s.email = %q{gregoire.lejeune@free.fr}
7
7
  s.homepage = %q{http://raa.ruby-lang.org/project/ruby-xslt/}
8
8
  s.description = %q{Ruby/XSLT is a simple XSLT class based on libxml <http://xmlsoft.org/> and libxslt <http://xmlsoft.org/XSLT/>}
9
9
  s.has_rdoc = true
@@ -16,4 +16,4 @@ Gem::Specification.new do |s|
16
16
  s.rdoc_options = ["--title", "Ruby/XSLT", "--main", "README", "--line-numbers"]
17
17
  s.extra_rdoc_files = ["README", "AUTHORS", "COPYING", "ChangeLog"]
18
18
  s.extensions = ["extconf.rb"]
19
- end
19
+ end
data/tests/test.rb CHANGED
@@ -1,32 +1,57 @@
1
1
  #!ruby
2
2
 
3
3
  require "test/unit"
4
- require "../xslt"
5
4
 
6
- # Test::Unit suite for flattenx extension
7
- #
8
- # $Id: test.rb,v 1.4 2005/11/14 00:22:27 whateley Exp $
9
- # $Author: whateley $
5
+ $LOAD_PATH << '..'
6
+
7
+ # this is ugly, but it's the only way I can think of
8
+ # (lib/xslt.rb requires xml/xslt_lib.so, so we copy it and delete when done)
9
+ require "ftools"
10
+ Dir.mkdir "../xml"
11
+
12
+ begin
13
+ File.copy "../xslt_lib.so", "../xml"
14
+ rescue
15
+ begin
16
+ File.copy "../xslt_lib.bundle", "../xml"
17
+ rescue
18
+ raise
19
+ end
20
+ end
21
+
22
+ require "lib/xslt"
23
+ begin
24
+ File.delete "../xml/xslt_lib.so"
25
+ rescue
26
+ begin
27
+ File.delete "../xml/xslt_lib.bundle"
28
+ rescue
29
+ raise
30
+ end
31
+ end
32
+ Dir.rmdir "../xml"
33
+
34
+ EXT_FUNC_XSL =<<END
35
+ <xsl:stylesheet
36
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
37
+ xmlns:ext="http://necronomicorp.com/nil"
38
+ version="1.0">
39
+
40
+ <xsl:template match="/">
41
+ <xsl:value-of select="ext:foo()"/>
42
+ </xsl:template>
43
+
44
+ </xsl:stylesheet>
45
+ END
10
46
 
11
47
  class XsltTest < Test::Unit::TestCase
12
48
  def setup
13
- if @xslt.nil? == true
14
- @xslt = XML::XSLT.new( )
15
- @testOut = "<?xml version=\"1.0\"?>\nThis is a test file\n"
16
- @xml_simple = true
17
- begin
18
- require "xml/simple"
19
- rescue LoadError => e
20
- @xml_simple = false
21
- end
22
-
23
- @xml_smart = true
24
- begin
25
- require "xml/smart"
26
- rescue LoadError => e
27
- @xml_smart = false
28
- end
29
- end
49
+ @xslt = XML::XSLT.new( )
50
+
51
+ @testOut = "<?xml version=\"1.0\"?>\nThis is a test file\n"
52
+
53
+ @errors = []
54
+ XML::XSLT.registerErrorHandler { |s| @errors << s }
30
55
  end
31
56
 
32
57
  def test_instance
@@ -36,72 +61,128 @@ class XsltTest < Test::Unit::TestCase
36
61
  def test_from_file
37
62
  @xslt.xml = "t.xml"
38
63
  @xslt.xsl = "t.xsl"
64
+
39
65
  out = @xslt.serve
40
66
  assert_equal( @testOut, out )
67
+ assert_equal( [], @errors )
41
68
  end
42
69
 
43
70
  def test_from_data
44
- @xslt.xml = IO::readlines( "t.xml" ).join
45
- @xslt.xsl = IO::readlines( "t.xsl" ).join
71
+ @xslt.xml = File.read( "t.xml" )
72
+ @xslt.xsl = File.read( "t.xsl" )
73
+
46
74
  out = @xslt.serve
47
75
  assert_equal( @testOut, out )
76
+ assert_equal( [], @errors )
48
77
  end
49
78
 
50
79
  def test_from_simple
51
- if @xml_simple
52
- require 'xml/simple'
80
+ begin
81
+ require "xml/simple"
82
+
53
83
  @xslt.xml = XML::Simple.open( "t.xml" )
54
84
  @xslt.xsl = XML::Simple.open( "t.xsl" )
85
+
55
86
  out = @xslt.serve()
56
87
  assert_equal( @testOut, out )
57
- else
58
- assert( true )
88
+ assert_equal( [], @errors )
89
+ rescue LoadError => e
90
+ # just skip it
59
91
  end
60
92
  end
61
93
 
62
94
  def test_from_smart
63
- if @xml_smart
64
- require 'xml/smart'
95
+ begin
96
+ require "xml/smart"
97
+
65
98
  @xslt.xml = XML::Smart.open( "t.xml" )
66
99
  @xslt.xsl = XML::Smart.open( "t.xsl" )
100
+
67
101
  out = @xslt.serve()
68
102
  assert_equal( @testOut, out )
69
- else
70
- assert( true )
103
+ assert_equal( [], @errors )
104
+ rescue LoadError => e
105
+ # just skip it
71
106
  end
72
107
  end
73
108
 
74
109
  def test_from_rexml
75
110
  require 'rexml/document'
76
- @xslt.xml = REXML::Document.new File.open( "t.xml" )
77
- @xslt.xsl = REXML::Document.new File.open( "t.xsl" )
111
+ @xslt.xml = REXML::Document.new File.read( "t.xml" )
112
+ @xslt.xsl = REXML::Document.new File.read( "t.xsl" )
113
+
78
114
  out = @xslt.serve()
115
+ assert_equal( [], @errors )
79
116
  assert_equal( @testOut, out )
80
117
  end
81
118
 
82
119
  def test_error_1
83
- begin
120
+ assert_raises(XML::XSLT::ParsingError) do
84
121
  @xslt.xsl = "nil"
85
- rescue => e
86
- assert_instance_of( XML::XSLT::ParsingError, e )
87
122
  end
123
+
124
+ errors = ["Entity: line 1: ",
125
+ "parser ",
126
+ "error : ",
127
+ "Start tag expected, '<' not found\n",
128
+ "nil\n",
129
+ "^\n"]
130
+
131
+ assert_equal( errors, @errors )
88
132
  end
89
133
 
90
134
  def test_error_2
91
- begin
135
+ assert_raises(XML::XSLT::ParsingError) do
92
136
  @xslt.xml = "nil"
93
- rescue => e
94
- assert_instance_of( XML::XSLT::ParsingError, e )
95
137
  end
138
+
139
+ errors = ["Entity: line 1: ",
140
+ "parser ",
141
+ "error : ",
142
+ "Start tag expected, '<' not found\n",
143
+ "nil\n",
144
+ "^\n"]
145
+
146
+ assert_equal( errors, @errors )
96
147
  end
97
148
 
149
+ # this test fails (any reason that it *should* raise an error?)
150
+ =begin
98
151
  def test_error_3
99
- begin
152
+ assert_raises(XML::XSLT::ParsingError) do
100
153
  @xslt.xml = "t.xsl"
101
- rescue => e
102
- assert_instance_of( XML::XSLT::ParsingError, e )
103
154
  end
104
155
  end
156
+ =end
157
+
158
+ def test_transformation_error
159
+ @xslt.xml = "<test/>"
160
+ # substitute so that the function is guaranteed to not be registered
161
+ @xslt.xsl = EXT_FUNC_XSL.sub( /foo/, "bar")
162
+
163
+ assert_raises(XML::XSLT::TransformationError) do
164
+ @xslt.serve
165
+ end
166
+
167
+ errors = ["xmlXPathCompOpEval: function bar not found\n",
168
+ "Unregistered function\n",
169
+ "xmlXPathCompiledEval: evaluation failed\n",
170
+ "runtime error: element value-of\n",
171
+ "xsltValueOf: text copy failed\n"]
172
+ assert_equal(errors, @errors)
173
+ end
174
+
175
+ def test_external_function
176
+ @xslt.xml = "<test/>"
177
+ @xslt.xsl = EXT_FUNC_XSL
178
+
179
+ XML::XSLT.registerExtFunc("http://necronomicorp.com/nil", "foo") do
180
+ "success!"
181
+ end
182
+
183
+ assert_equal("<?xml version=\"1.0\"?>\nsuccess!\n", @xslt.serve())
184
+ assert_equal([], @errors)
185
+ end
105
186
 
106
187
  def test_base_uri_1
107
188
  @xslt.xml = "<test/>"
@@ -111,6 +192,8 @@ class XsltTest < Test::Unit::TestCase
111
192
  assert_nothing_raised( XML::XSLT::ParsingError ) do
112
193
  @xslt.xsl = xsl
113
194
  end
195
+
196
+ assert_equal( [], @errors )
114
197
  end
115
198
 
116
199
  def test_base_uri_2
@@ -121,5 +204,19 @@ class XsltTest < Test::Unit::TestCase
121
204
  assert_raises( XML::XSLT::ParsingError ) do
122
205
  @xslt.xsl = xsl
123
206
  end
207
+
208
+ errors = ["I/O ",
209
+ "warning : ",
210
+ "failed to load external entity \"result.xsl\"\n",
211
+ "compilation error: element import\n",
212
+ "xsl:import : unable to load result.xsl\n"]
213
+
214
+ assert_equal( errors, @errors )
215
+ end
216
+
217
+ def test_alias
218
+ assert_nothing_raised do
219
+ XML::XSLT.register_ext_func("http://necronomicorp.com/nil", "nil") {}
220
+ end
124
221
  end
125
222
  end
data/xslt.h CHANGED
@@ -53,8 +53,8 @@
53
53
  #include "parameters.h"
54
54
  #include "extfunc.h"
55
55
 
56
- #define RUBY_XSLT_VERSION "0.9.2"
57
- #define RUBY_XSLT_VERNUM 092
56
+ #define RUBY_XSLT_VERSION "0.9.3"
57
+ #define RUBY_XSLT_VERNUM 093
58
58
 
59
59
  #define RUBY_XSLT_XSLSRC_TYPE_NULL 0
60
60
  #define RUBY_XSLT_XSLSRC_TYPE_STR 1
@@ -358,27 +358,22 @@ VALUE ruby_xslt_save( VALUE self, VALUE xOutFilename ) {
358
358
  * Brendan Taylor
359
359
  * whateley@gmail.com
360
360
  */
361
- /**
362
- * error_ary = XML::XSLT::errors( )
363
- *
364
- * Return an Array containing all the xml errors
361
+ /*
362
+ * libxml2/libxslt error handling function
365
363
  *
366
- * This method is only available if Ruby/XSLT has been configured with --enable-error-handler option
364
+ * converts the error to a String and passes it off to a block
365
+ * registered using XML::XSLT.register_error_handler
367
366
  */
368
- VALUE rb_xslt_errors(VALUE class) {
369
- return rb_cvar_get(class, rb_intern("@@errors"));
370
- }
371
-
372
- void xsltErrorFuncHandler(void *ctx, const char *msg, ...) {
367
+ void ruby_xslt_error_handler(void *ctx, const char *msg, ...) {
373
368
  va_list ap;
374
369
  char *str;
375
370
  char *larger;
376
371
  int chars;
377
372
  int size = 150;
378
373
 
379
- VALUE error_arr = rb_cvar_get(cXSLT, rb_intern("@@errors"));
374
+ VALUE block = rb_cvar_get(cXSLT, rb_intern("@@error_handler"));
380
375
 
381
- /* this is taken verbatim from the libxslt python bindings */
376
+ /* the following was cut&pasted from the libxslt python bindings */
382
377
  str = (char *) xmlMalloc(150);
383
378
  if (str == NULL)
384
379
  return;
@@ -400,7 +395,7 @@ void xsltErrorFuncHandler(void *ctx, const char *msg, ...) {
400
395
  str = larger;
401
396
  }
402
397
 
403
- rb_ary_push(error_arr, rb_str_new2(str));
398
+ rb_funcall( block, rb_intern("call"), 1, rb_str_new2(str));
404
399
  }
405
400
  #endif
406
401
 
@@ -473,27 +468,10 @@ VALUE ruby_xslt_media_type( VALUE self ) {
473
468
  */
474
469
 
475
470
  /**
476
- * XML::XSLT::extFunction( "round-trip", "http://test.none", rbObj )
477
- * registers an extension function "round-trip" in the namespace "http://test.none"
478
- *
479
- * when XPath like ex:round-trip(arg) is encountered in the XSLT it will call the method "round_trip" on the rbObj object with the argument arg
471
+ * internal use only.
480
472
  */
481
- VALUE ruby_xslt_ext_function( VALUE class, VALUE name, VALUE ns_uri, VALUE receiver ) {
482
- VALUE ns_hash, func_hash;
483
-
484
- ns_hash = rb_cvar_get(cXSLT, rb_intern("@@extFunctions"));
485
-
486
- func_hash = rb_hash_aref(ns_hash, ns_uri);
487
-
488
- if(func_hash == Qnil) {
489
- /* we've seen no reference to this URI, so create one */
490
- func_hash = rb_hash_new();
491
- rb_hash_aset(ns_hash, ns_uri, func_hash);
492
- }
493
-
494
- rb_hash_aset(func_hash, name, receiver);
495
-
496
- xsltRegisterExtModuleFunction( BAD_CAST STR2CSTR(name), BAD_CAST STR2CSTR(ns_uri), xmlXPathFuncCallback );
473
+ VALUE ruby_xslt_reg_function( VALUE class, VALUE namespace, VALUE name ) {
474
+ xsltRegisterExtModuleFunction( BAD_CAST STR2CSTR(name), BAD_CAST STR2CSTR(namespace), xmlXPathFuncCallback );
497
475
 
498
476
  return Qnil;
499
477
  }
@@ -555,7 +533,7 @@ VALUE ruby_xslt_to_s( VALUE self ) {
555
533
  * ----------------------------------------------------------------------------
556
534
  */
557
535
 
558
- void Init_xslt( void ) {
536
+ void Init_xslt_lib( void ) {
559
537
  mXML = rb_define_module( "XML" );
560
538
  cXSLT = rb_define_class_under( mXML, "XSLT", rb_cObject );
561
539
 
@@ -581,11 +559,7 @@ void Init_xslt( void ) {
581
559
  rb_define_const( cXSLT, "RUBY_XSLT_VERSION", rb_str_new2(RUBY_XSLT_VERSION) );
582
560
 
583
561
  rb_define_singleton_method( cXSLT, "new", ruby_xslt_new, 0 );
584
- rb_define_singleton_method( cXSLT, "extFunction", ruby_xslt_ext_function, 3);
585
-
586
- /* a hash of hashes. might be more elegant if it were its own class */
587
- /* keeps track of what functions are registered in what namespaces */
588
- rb_define_class_variable( cXSLT, "@@extFunctions", rb_hash_new());
562
+ rb_define_singleton_method( cXSLT, "registerFunction", ruby_xslt_reg_function, 2);
589
563
 
590
564
  rb_define_method( cXSLT, "serve", ruby_xslt_serve, 0 );
591
565
  rb_define_method( cXSLT, "save", ruby_xslt_save, 1 );
@@ -606,11 +580,8 @@ void Init_xslt( void ) {
606
580
  rb_define_method( cXSLT, "mediaType", ruby_xslt_media_type, 0 );
607
581
 
608
582
  #ifdef USE_ERROR_HANDLER
609
- /* this is really quite inelegant */
610
- xmlSetGenericErrorFunc( NULL, xsltErrorFuncHandler );
611
- xsltSetGenericErrorFunc( NULL, xsltErrorFuncHandler );
612
- rb_define_class_variable( cXSLT, "@@errors", rb_ary_new());
613
- rb_define_singleton_method( cXSLT, "errors", rb_xslt_errors, 0 );
583
+ xmlSetGenericErrorFunc( NULL, ruby_xslt_error_handler );
584
+ xsltSetGenericErrorFunc( NULL, ruby_xslt_error_handler );
614
585
  #endif
615
586
 
616
587
  #ifdef USE_EXSLT
metadata CHANGED
@@ -3,12 +3,12 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ruby-xslt
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.2
6
+ version: 0.9.3
7
7
  date: 2005-11-17 00:00:00 +01:00
8
8
  summary: A Ruby class for processing XSLT
9
9
  require_paths:
10
10
  - lib
11
- email: greg@webtime-project.net
11
+ email: gregoire.lejeune@free.fr
12
12
  homepage: http://raa.ruby-lang.org/project/ruby-xslt/
13
13
  rubyforge_project:
14
14
  description: Ruby/XSLT is a simple XSLT class based on libxml <http://xmlsoft.org/> and libxslt <http://xmlsoft.org/XSLT/>
@@ -37,6 +37,7 @@ files:
37
37
  - ./extconf.rb
38
38
  - ./extfunc.c
39
39
  - ./extfunc.h
40
+ - ./lib
40
41
  - ./parameters.c
41
42
  - ./parameters.h
42
43
  - ./parser.c
@@ -44,10 +45,10 @@ files:
44
45
  - ./rb_utils.c
45
46
  - ./rb_utils.h
46
47
  - ./README
48
+ - ./ruby-xslt.gemspec
47
49
  - ./tests
48
- - ./xslt.c
49
50
  - ./xslt.h
50
- - ./ruby-xslt.gemspec
51
+ - ./xslt_lib.c
51
52
  - debug/memwatch.c
52
53
  - debug/memwatch.h
53
54
  - examples/commentary.dtd