libxslt-ruby 0.6.0-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ # $Id: LICENSE 33 2007-08-29 18:18:15Z transami $
2
+
3
+ Copyright (c) 2002-2006 Sean Chittenden <sean@chittenden.org> and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
+ of the Software, and to permit persons to whom the Software is furnished to do
10
+ so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README ADDED
@@ -0,0 +1,153 @@
1
+ == INSTALLATION
2
+
3
+ Installation is simple. Follow the following steps:
4
+
5
+ === Rubygems
6
+
7
+ gem install libxsl-ruby
8
+
9
+ === Tarball/zip
10
+
11
+ $ rake test
12
+ $ rake install
13
+
14
+ If extconf yacks up an error, follow the instructions it provides.
15
+ You will need to chdir to ext/xml and run 'ruby extconf.rb' to provide
16
+ options, after which you can either use Rake for everything or
17
+ do with make (make && make install).
18
+
19
+ Once installed, look at the test scripts (tests/*.rb), and run
20
+ 'rake doc' to generate API documentation.
21
+
22
+ == DOCUMENTATION
23
+
24
+ RDoc comments are included - run 'rake doc' to generate documentation.
25
+ You can find the latest documentation at:
26
+
27
+ * http://libxsl.rubyforge.org
28
+
29
+ == USAGE EXAMPLE
30
+
31
+ *Note*: To use libxsl-ruby, you have to require both 'xml/libxml' and
32
+ 'xml/libxslt'. The following example is an abridged version of that
33
+ included with the distribution, which you can run with:
34
+
35
+ $ cd tests
36
+ $ ruby fuzface.rb
37
+
38
+ Given an XML file like:
39
+
40
+ <?xml version="1.0" encoding="UTF-8"?>
41
+ <?xml-stylesheet href="fuzface.xsl" type="text/xsl"?>
42
+
43
+ <commentary>
44
+ <meta>
45
+ <author>
46
+ <first_name>Sean</first_name>
47
+ <last_name>Chittenden</last_name>
48
+ <email>sean@chittenden.org</email>
49
+ </author>
50
+ <version>$Version$</version>
51
+ <date>$Date: 2007-08-29 12:18:15 -0600 (Wed, 29 Aug 2007) $</date>
52
+ <id>$Id: README 33 2007-08-29 18:18:15Z transami $</id> <title>Fuzface...</title>
53
+ <subtitle>The Internet's a big place and here's some proof...</subtitle>
54
+ </meta>
55
+
56
+ <body>
57
+ <para>
58
+ I think it's a tragedy that I'm going to start off my new
59
+ commentary by talking about facial hair and the Internet.
60
+ Something about that just screams pathetic, but whatever: it's
61
+ humor and that's life.
62
+ </para>
63
+ </body>
64
+ </commentary>
65
+
66
+ And an XSLT like:
67
+
68
+ <?xml version="1.0" ?>
69
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
70
+ <xsl:template match="/">
71
+ <xsl:element name="html">
72
+ <xsl:element name="head">
73
+ <xsl:element name="title">Ramblings - <xsl:value-of select="commentary/meta/title" /> - <xsl:value-of select="commentary/meta/subtitle" /></xsl:element>
74
+ </xsl:element>
75
+
76
+ <xsl:element name="body">
77
+ <xsl:element name="h1"><xsl:value-of select="commentary/meta/title" /></xsl:element>
78
+ <xsl:element name="h3"><xsl:value-of select="commentary/meta/subtitle" /></xsl:element>
79
+ By: <xsl:value-of select="commentary/meta/author/first_name" /> <xsl:value-of select="commentary/meta/author/last_name" /><xsl:element name="br" />
80
+ Date: <xsl:value-of select="commentary/meta/date" /><xsl:element name="br" />
81
+
82
+ <xsl:for-each select="./commentary/body">
83
+ <xsl:apply-templates />
84
+ </xsl:for-each>
85
+
86
+ </xsl:element>
87
+ </xsl:element>
88
+ </xsl:template>
89
+
90
+ <xsl:template match="para">
91
+ <xsl:element name="p">
92
+ <xsl:value-of select="." />
93
+ </xsl:element>
94
+ </xsl:template>
95
+ </xsl:stylesheet>
96
+
97
+ We can easily transform the XML with the following ruby code:
98
+
99
+ # require 'rubygems' # if installed via gems
100
+ require 'xml/libxml'
101
+ require 'xml/libxslt'
102
+
103
+ # Create a new XSL Transform
104
+ xslt = XML::XSLT.file('fuzface.xsl')
105
+ xslt.doc = XML::Document.file('fuzface.xml')
106
+
107
+ # Parse to create a stylesheet, then apply.
108
+ s = xslt.parse
109
+ s.apply
110
+
111
+ # To save the result to a file:
112
+ File.open('fuzface.html', 'w') do |f|
113
+ s.save(f)
114
+ end
115
+
116
+ # To output the result to stdout
117
+ s.print
118
+
119
+ To give the following result:
120
+
121
+ <html>
122
+ <head>
123
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
124
+ <title>Ramblings - Fuzface... - The Internet's a big place and here's some proof...</title>
125
+ </head>
126
+ <body>
127
+ <h1>Fuzface...</h1>
128
+ <h3>The Internet's a big place and here's some proof...</h3>
129
+ By: SeanChittenden<br>
130
+ Date: $Date: 2007-08-29 12:18:15 -0600 (Wed, 29 Aug 2007) $<br>
131
+ <p>
132
+ I think it's a tragedy that I'm going to start off my new
133
+ commentary by talking about facial hair and the Internet.
134
+ Something about that just screams pathetic, but whatever: it's
135
+ humor and that's life.
136
+ </p>
137
+ </body>
138
+ </html>
139
+
140
+ == If you checked out from CVS
141
+
142
+ If you checked out the source from CVS, you must install a copy of
143
+ the current (or matching) libxml-ruby headers in:
144
+
145
+ ext/xml/libxml-ruby
146
+
147
+ prior to running the above. This can be done via rake, and will
148
+ happen automatically if ../libxml/ext/xml is found, or the
149
+ LIBXMLH=/path/to/headers commandline option is supplied.
150
+
151
+ # $Id: README 33 2007-08-29 18:18:15Z transami $
152
+
153
+ # See the LICENSE file for copyright and distribution information
@@ -0,0 +1,104 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # $Id: extconf.rb 43 2007-12-07 12:38:59Z transami $
4
+ #
5
+ # See the LICENSE file for copyright and distribution information
6
+
7
+ require 'mkmf'
8
+
9
+ $preload = nil
10
+ $LIBPATH.push(Config::CONFIG['libdir'])
11
+
12
+ def crash(str)
13
+ print(" extconf failure: %s\n", str)
14
+ exit 1
15
+ end
16
+
17
+ require 'rubygems'
18
+ gem_specs = Gem::SourceIndex.from_installed_gems.search('libxml-ruby')
19
+ if gem_specs.empty?
20
+ crash(<<EOL)
21
+ libxml-ruby bindings must be installed
22
+ EOL
23
+ end
24
+
25
+ # Sort by version, newest first
26
+ gem_specs = gem_specs.sort_by {|spec| spec.version}.reverse
27
+
28
+ libxml_ruby_path = gem_specs.first.full_gem_path
29
+
30
+ $INCFLAGS += " -I#{libxml_ruby_path}/ext"
31
+
32
+ # Directories
33
+ dir_config('xml2')
34
+ dir_config('xslt')
35
+
36
+ unless have_library('m', 'atan')
37
+ # try again for gcc 4.0
38
+ saveflags = $CFLAGS
39
+ $CFLAGS += ' -fno-builtin'
40
+ unless have_library('m', 'atan')
41
+ crash('need libm')
42
+ end
43
+ $CFLAGS = saveflags
44
+ end
45
+
46
+ unless have_library("z", "inflate")
47
+ crash("need zlib")
48
+ else
49
+ $defs.push('-DHAVE_ZLIB_H')
50
+ end
51
+
52
+ unless (have_library('xml2', 'xmlXPtrNewRange') or
53
+ find_library('xml2', 'xmlXPtrNewRange', '/opt/lib', '/usr/local/lib', '/usr/lib')) and
54
+ (have_header('libxml/xmlversion.h') or
55
+ find_header('libxml/xmlversion.h',
56
+ '/opt/include/libxml2',
57
+ '/usr/local/include/libxml2',
58
+ '/usr/include/libxml2'))
59
+ crash(<<EOL)
60
+ need libxml2.
61
+
62
+ Install the library or try one of the following options to extconf.rb:
63
+
64
+ --with-xml2-dir=/path/to/libxml2
65
+ --with-xml2-lib=/path/to/libxml2/lib
66
+ --with-xml2-include=/path/to/libxml2/include
67
+ EOL
68
+ end
69
+
70
+ unless (have_library('xslt','xsltApplyStylesheet') or
71
+ find_library('xslt', 'xsltApplyStylesheet', '/opt/lib', '/usr/local/lib', '/usr/lib')) and
72
+ (have_header('xslt.h') or
73
+ find_header('xslt.h',
74
+ '/opt/include/libxslt',
75
+ '/usr/local/include/libxslt',
76
+ '/usr/include/libxslt'))
77
+ crash(<<EOL)
78
+ need libxslt.
79
+
80
+ Install the library or try one of the following options to extconf.rb:
81
+
82
+ --with-xslt-dir=/path/to/libxslt
83
+ --with-xslt-lib=/path/to/libxslt/lib
84
+ --with-xslt-include=/path/to/libxslt/include
85
+ EOL
86
+ end
87
+
88
+ unless have_header('libxml/ruby_libxml.h') and
89
+ have_header('libxml/ruby_xml_document.h')
90
+ crash(<<EOL)
91
+ need headers for libxml-ruby.
92
+
93
+ If you downloaded a release, this is a bug - please inform
94
+ libxml-devel@rubyforge.org including the release version and
95
+ download URL you obtained it from.
96
+
97
+ If you checked libxslt-ruby out from CVS, you will need to
98
+ obtain the headers from CVS (using the same version tag if
99
+ applicable) and place them in directory 'ext/xml/libxml-ruby'.
100
+ EOL
101
+ end
102
+
103
+ create_header()
104
+ create_makefile("libxslt_ruby")
@@ -0,0 +1,251 @@
1
+ /* $Id: libxslt.c 42 2007-12-07 06:09:35Z transami $ */
2
+
3
+ /* Please see the LICENSE file for copyright and distribution information */
4
+
5
+ #include "libxslt.h"
6
+ #include "libxml/xmlversion.h"
7
+
8
+ VALUE mXML;
9
+ VALUE cXMLDocument;
10
+
11
+ VALUE cXSLT;
12
+ VALUE eXMLXSLTStylesheetRequireParsedDoc;
13
+
14
+ /* call-seq:
15
+ * xslt.doc => #&lt;XML::Document...&gt;
16
+ *
17
+ * Obtain the source XML::Document.
18
+ */
19
+ VALUE
20
+ ruby_xslt_doc_get(VALUE self) {
21
+ ruby_xslt *rxslt;
22
+ Data_Get_Struct(self, ruby_xslt, rxslt);
23
+ return(rxslt->xml_doc_obj);
24
+ }
25
+
26
+ /* call-seq:
27
+ * xslt.doc = some_xml_document
28
+ *
29
+ * Set the source XML::Document.
30
+ */
31
+ VALUE
32
+ ruby_xslt_doc_set(VALUE self, VALUE xml_doc_obj) {
33
+ ruby_xslt *rxslt;
34
+ ruby_xml_document_t *rxd;
35
+ ruby_xslt_transform_context *rxtc;
36
+
37
+ if (rb_obj_is_kind_of(xml_doc_obj, cXMLDocument) == Qfalse)
38
+ rb_raise(rb_eTypeError, "Invalid argument: must be of type XML::Document");
39
+
40
+ Data_Get_Struct(self, ruby_xslt, rxslt);
41
+ rxslt->xml_doc_obj = xml_doc_obj;
42
+
43
+ Data_Get_Struct(xml_doc_obj, ruby_xml_document_t, rxd);
44
+ if (rxd->doc == NULL)
45
+ return(Qnil);
46
+
47
+ rxslt->ctxt = ruby_xslt_transform_context_new3(self);
48
+ Data_Get_Struct(rxslt->ctxt, ruby_xslt_transform_context, rxtc);
49
+
50
+ if (rxslt->xsp == NULL || rxd->doc == NULL)
51
+ return(Qnil);
52
+
53
+ rxtc->ctxt = xsltNewTransformContext(rxslt->xsp, rxd->doc) ;
54
+
55
+ return(rxslt->xml_doc_obj);
56
+ }
57
+
58
+ /* call-seq:
59
+ * xslt.filename => "filename.xsl"
60
+ *
61
+ * Obtain the stylesheet filename.
62
+ */
63
+ VALUE
64
+ ruby_xslt_filename_get(VALUE self) {
65
+ ruby_xslt *rxslt;
66
+ Data_Get_Struct(self, ruby_xslt, rxslt);
67
+
68
+ if (rxslt->data_type != RUBY_LIBXSLT_SRC_TYPE_FILE)
69
+ return(Qnil);
70
+ else
71
+ return((VALUE)rxslt->data);
72
+ }
73
+
74
+
75
+ /* call-seq:
76
+ * xslt.filename = "filename.xsl"
77
+ *
78
+ * Set the stylesheet filename.
79
+ */
80
+ VALUE
81
+ ruby_xslt_filename_set(VALUE self, VALUE filename) {
82
+ ruby_xslt *rxslt;
83
+ Check_Type(filename, T_STRING);
84
+ Data_Get_Struct(self, ruby_xslt, rxslt);
85
+
86
+ if (rxslt->data_type != RUBY_LIBXSLT_SRC_TYPE_NULL)
87
+ return(Qnil);
88
+
89
+ rxslt->data_type = RUBY_LIBXSLT_SRC_TYPE_FILE;
90
+ rxslt->data = (void *)filename;
91
+ return(filename);
92
+ }
93
+
94
+
95
+ void
96
+ ruby_xslt_free(ruby_xslt *rxslt) {
97
+ if (rxslt != NULL)
98
+ ruby_xfree(rxslt);
99
+ }
100
+
101
+
102
+ void
103
+ ruby_xslt_mark(ruby_xslt *rxslt) {
104
+ if (rxslt == NULL) return;
105
+ if (!NIL_P(rxslt->ctxt)) rb_gc_mark(rxslt->ctxt);
106
+ if (!NIL_P(rxslt->str)) rb_gc_mark(rxslt->str);
107
+ if (!NIL_P(rxslt->xml_doc_obj)) rb_gc_mark(rxslt->xml_doc_obj);
108
+
109
+ switch(rxslt->data_type) {
110
+ case RUBY_LIBXSLT_SRC_TYPE_FILE:
111
+ if (rxslt->data != NULL)
112
+ rb_gc_mark((VALUE)rxslt->data);
113
+ break;
114
+ }
115
+ }
116
+
117
+
118
+ /* call-seq:
119
+ * XML::XSLT.new => #&lt;XML::XSLT...&gt;
120
+ *
121
+ * Create a new XSLT instance. You will need to specify
122
+ * a filename and document for the instance after it is
123
+ * created.
124
+ */
125
+ VALUE
126
+ ruby_xslt_new(VALUE class) {
127
+ ruby_xslt *rxslt = ALLOC(ruby_xslt);
128
+
129
+ if (rxslt == NULL)
130
+ rb_raise(rb_eNoMemError, "No memory left for XSLT struct");
131
+
132
+ rxslt->ctxt = Qnil;
133
+ rxslt->data = NULL;
134
+ rxslt->data_type = RUBY_LIBXSLT_SRC_TYPE_NULL;
135
+ rxslt->str = Qnil;
136
+ rxslt->xml_doc_obj = Qnil;
137
+ rxslt->xsp = NULL;
138
+
139
+ return(Data_Wrap_Struct(class, ruby_xslt_mark, ruby_xslt_free, rxslt));
140
+ }
141
+
142
+ /* call-seq:
143
+ * XML::XSLT.file("filename.xsl") => #&lt;XML::XSLT...&gt;
144
+ *
145
+ * Create a new XSLT instance with the supplied stylesheet filename.
146
+ */
147
+ VALUE
148
+ ruby_xslt_new_file(VALUE class, VALUE filename) {
149
+ VALUE xslt;
150
+
151
+ xslt = ruby_xslt_new(class);
152
+ ruby_xslt_filename_set(xslt, filename);
153
+ return(xslt);
154
+ }
155
+
156
+ /* call-seq:
157
+ * xslt.parse => #&lt;XML::XSLT::Stylesheet...&gt;
158
+ *
159
+ * Parse the xsl source (specified by +filename+) and create
160
+ * a +Stylesheet+ instance that will apply it against the
161
+ * source document. If a parsed XML::Document isn't associated
162
+ * with this +XSLT+ instance (via #doc=) then a
163
+ * Stylesheet::RequireParsedDoc exception is raised.
164
+ */
165
+ VALUE
166
+ ruby_xslt_parse(VALUE self) {
167
+ ruby_xml_document_t *rxd;
168
+ ruby_xslt *rxslt;
169
+ ruby_xslt_stylesheet *xss;
170
+ VALUE xssobj;
171
+ xsltStylesheetPtr sheet;
172
+
173
+ Data_Get_Struct(self, ruby_xslt, rxslt);
174
+
175
+ if (rxslt->data_type == RUBY_LIBXSLT_SRC_TYPE_FILE) {
176
+ /*xssobj = ruby_xslt_stylesheet_new(cXSLTStylesheet,
177
+ xsltParseStylesheetFile((const xmlChar *)
178
+ STR2CSTR(rxslt->data)));*/
179
+ sheet = xsltParseStylesheetFile((const xmlChar *) STR2CSTR(rxslt->data));
180
+
181
+ if (sheet) {
182
+ xssobj = ruby_xslt_stylesheet_new(cXSLTStylesheet, sheet);
183
+ Data_Get_Struct(xssobj, ruby_xslt_stylesheet, xss);
184
+ xss->data = (void *)rb_obj_dup((VALUE)rxslt->data);
185
+ xss->xml_doc_obj = rxslt->xml_doc_obj;
186
+ } else
187
+ xssobj = Qnil;
188
+
189
+ } else if (rxslt->xml_doc_obj != Qnil) {
190
+ Data_Get_Struct(rxslt->xml_doc_obj, ruby_xml_document_t, rxd);
191
+ /*xssobj = ruby_xslt_stylesheet_new(cXSLTStylesheet,
192
+ xsltParseStylesheetDoc(rxd->doc));*/
193
+ sheet = xsltParseStylesheetDoc(rxd->doc);
194
+ if (sheet) {
195
+ xssobj = ruby_xslt_stylesheet_new(cXSLTStylesheet,sheet);
196
+ Data_Get_Struct(xssobj, ruby_xslt_stylesheet, xss);
197
+ xss->xml_doc_obj = rxslt->xml_doc_obj;
198
+ } else
199
+ xssobj = Qnil;
200
+
201
+ } else {
202
+ xssobj = Qnil;
203
+ }
204
+
205
+ return(xssobj);
206
+ }
207
+
208
+ #if defined(_WIN32)
209
+ __declspec(dllexport)
210
+ #endif
211
+
212
+ void
213
+ Init_libxslt_ruby(void) {
214
+ LIBXML_TEST_VERSION;
215
+
216
+ // Must load libxml bindings to use xslst
217
+ mXML = rb_const_get(rb_cObject, rb_intern("XML"));
218
+ cXMLDocument = rb_const_get(mXML, rb_intern("Document"));
219
+
220
+ cXSLT = rb_define_class_under(mXML, "XSLT", rb_cObject);
221
+
222
+ rb_define_const(cXSLT, "MAX_DEPTH", INT2NUM(xsltMaxDepth));
223
+ rb_define_const(cXSLT, "MAX_SORT", INT2NUM(XSLT_MAX_SORT));
224
+ rb_define_const(cXSLT, "ENGINE_VERSION", rb_str_new2(xsltEngineVersion));
225
+ rb_define_const(cXSLT, "LIBXSLT_VERSION", INT2NUM(xsltLibxsltVersion));
226
+ rb_define_const(cXSLT, "LIBXML_VERSION", INT2NUM(xsltLibxmlVersion));
227
+ rb_define_const(cXSLT, "XSLT_NAMESPACE", rb_str_new2((const char*)XSLT_NAMESPACE));
228
+ rb_define_const(cXSLT, "DEFAULT_VENDOR", rb_str_new2(XSLT_DEFAULT_VENDOR));
229
+ rb_define_const(cXSLT, "DEFAULT_VERSION", rb_str_new2(XSLT_DEFAULT_VERSION));
230
+ rb_define_const(cXSLT, "DEFAULT_URL", rb_str_new2(XSLT_DEFAULT_URL));
231
+ rb_define_const(cXSLT, "NAMESPACE_LIBXSLT", rb_str_new2((const char*)XSLT_LIBXSLT_NAMESPACE));
232
+ rb_define_const(cXSLT, "NAMESPACE_NORM_SAXON", rb_str_new2((const char*)XSLT_NORM_SAXON_NAMESPACE));
233
+ rb_define_const(cXSLT, "NAMESPACE_SAXON", rb_str_new2((const char*)XSLT_SAXON_NAMESPACE));
234
+ rb_define_const(cXSLT, "NAMESPACE_XT", rb_str_new2((const char*)XSLT_XT_NAMESPACE));
235
+ rb_define_const(cXSLT, "NAMESPACE_XALAN", rb_str_new2((const char*)XSLT_XALAN_NAMESPACE));
236
+
237
+ ruby_init_xslt_stylesheet();
238
+ ruby_init_xslt_transform_context();
239
+
240
+
241
+ rb_define_singleton_method(cXSLT, "file", ruby_xslt_new_file, 1);
242
+ rb_define_singleton_method(cXSLT, "new", ruby_xslt_new, 0);
243
+
244
+ rb_define_method(cXSLT, "doc", ruby_xslt_doc_get, 0);
245
+ rb_define_method(cXSLT, "doc=", ruby_xslt_doc_set, 1);
246
+ rb_define_method(cXSLT, "filename", ruby_xslt_filename_get, 0);
247
+ rb_define_method(cXSLT, "filename=", ruby_xslt_filename_set, 1);
248
+ rb_define_method(cXSLT, "parse", ruby_xslt_parse, 0);
249
+
250
+ //exsltRegisterAll();
251
+ }