ruby-xslt 0.9.2 → 0.9.3

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/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