teius 0.1.0-mswin32 → 0.2-mswin32
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/dll/libexslt.dll +0 -0
- data/dll/libxml2.dll +0 -0
- data/dll/libxslt.dll +0 -0
- data/ext/Makefile +2 -2
- data/ext/extconf.rb +3 -1
- data/ext/mkmf.log +26 -0
- data/ext/notes.txt +2 -0
- data/ext/teius.c +99 -6
- data/ext/teius.o +0 -0
- data/lib/teius.rb +18 -1
- data/lib/teius.so +0 -0
- data/test/input.xml +11 -0
- data/test/teius_test.rb +37 -0
- data/test/test.xsl +27 -0
- metadata +9 -3
- data/ext/teius.so +0 -0
data/dll/libexslt.dll
ADDED
Binary file
|
data/dll/libxml2.dll
CHANGED
Binary file
|
data/dll/libxslt.dll
ADDED
Binary file
|
data/ext/Makefile
CHANGED
@@ -36,7 +36,7 @@ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
|
|
36
36
|
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
|
37
37
|
|
38
38
|
CFLAGS = -g -O2
|
39
|
-
CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) -Id:/msys/local/include/libxml2
|
39
|
+
CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) -Id:/msys/local/include -Id:/msys/local/include/libxml2
|
40
40
|
CXXFLAGS = $(CFLAGS)
|
41
41
|
DLDFLAGS = -Wl,--enable-auto-import,--export-all
|
42
42
|
LDSHARED = gcc -shared -s
|
@@ -72,7 +72,7 @@ extout =
|
|
72
72
|
extout_prefix =
|
73
73
|
target_prefix =
|
74
74
|
LOCAL_LIBS =
|
75
|
-
LIBS = $(LIBRUBYARG_SHARED) -lxml2 -lwsock32
|
75
|
+
LIBS = $(LIBRUBYARG_SHARED) -lxslt -lxml2 -lwsock32
|
76
76
|
SRCS = teius.c
|
77
77
|
OBJS = teius.o
|
78
78
|
TARGET = teius
|
data/ext/extconf.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
dir_config('libxml', '/usr/include/
|
3
|
+
dir_config('libxml', '/usr/include/libxml', '/usr/lib');
|
4
|
+
dir_config('libxslt', '/usr/include', '/usr/lib');
|
4
5
|
have_library('xml2', 'xmlReadFile')
|
6
|
+
have_library('xslt', 'xsltParseStylesheetFile')
|
5
7
|
create_makefile("teius")
|
data/ext/mkmf.log
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
have_library: checking for xmlReadFile() in -lxml2... -------------------- yes
|
2
|
+
|
3
|
+
"gcc -o conftest -I. -Id:/msys/local/lib/ruby/1.8/i386-mingw32 -Id:/msys/local/include -Id:/msys/local/include/libxml2 -g -O2 conftest.c -L"d:/msys/local/lib" -L"d:/msys/local/lib" -lmsvcrt-ruby18-static -lxml2 -lwsock32 "
|
4
|
+
checked program was:
|
5
|
+
/* begin */
|
6
|
+
|
7
|
+
/*top*/
|
8
|
+
int main() { return 0; }
|
9
|
+
int t() { xmlReadFile(); return 0; }
|
10
|
+
/* end */
|
11
|
+
|
12
|
+
--------------------
|
13
|
+
|
14
|
+
have_library: checking for xsltParseStylesheetFile() in -lxslt... -------------------- yes
|
15
|
+
|
16
|
+
"gcc -o conftest -I. -Id:/msys/local/lib/ruby/1.8/i386-mingw32 -Id:/msys/local/include -Id:/msys/local/include/libxml2 -g -O2 conftest.c -L"d:/msys/local/lib" -L"d:/msys/local/lib" -lxml2 -lmsvcrt-ruby18-static -lxslt -lxml2 -lwsock32 "
|
17
|
+
checked program was:
|
18
|
+
/* begin */
|
19
|
+
|
20
|
+
/*top*/
|
21
|
+
int main() { return 0; }
|
22
|
+
int t() { xsltParseStylesheetFile(); return 0; }
|
23
|
+
/* end */
|
24
|
+
|
25
|
+
--------------------
|
26
|
+
|
data/ext/notes.txt
ADDED
data/ext/teius.c
CHANGED
@@ -1,20 +1,31 @@
|
|
1
|
+
/* NOTES: possibly call xsltCleanupGlobals() and xmlCleanupParser() at some point */
|
2
|
+
|
1
3
|
#include <stdio.h>
|
2
4
|
#include "ruby.h"
|
3
5
|
#include <libxml/parser.h>
|
4
6
|
#include <libxml/tree.h>
|
5
7
|
#include <libxml/xpath.h>
|
6
8
|
|
9
|
+
#include <libxslt/xslt.h>
|
10
|
+
#include <libxslt/xsltInternals.h>
|
11
|
+
#include <libxslt/transform.h>
|
12
|
+
#include <libxslt/xsltutils.h>
|
13
|
+
|
7
14
|
static VALUE cParseError;
|
8
15
|
static VALUE cXpathError;
|
9
16
|
static VALUE cNodeNotFound;
|
10
17
|
static VALUE cNodeNotUnique;
|
11
18
|
static VALUE cNode;
|
12
19
|
static VALUE cDocument;
|
20
|
+
static VALUE cStylesheet;
|
13
21
|
static ID sRequired;
|
14
22
|
static ID sFirst;
|
15
23
|
static ID sAll;
|
16
24
|
static ID sUnique;
|
17
25
|
|
26
|
+
/* Suppress error messages to stderr */
|
27
|
+
static void null_handler(void *ctx, const char *msg, ...) {}
|
28
|
+
|
18
29
|
static void doc_free(void *p) {
|
19
30
|
xmlFreeDoc(p);
|
20
31
|
}
|
@@ -151,7 +162,7 @@ static VALUE node_pointer(VALUE self) {
|
|
151
162
|
return INT2NUM((int)node);
|
152
163
|
}
|
153
164
|
|
154
|
-
static VALUE
|
165
|
+
static VALUE document_parse_file(VALUE self, VALUE rFilename) {
|
155
166
|
xmlDocPtr doc = xmlReadFile(StringValuePtr(rFilename), NULL, 0);
|
156
167
|
if (doc == NULL) {
|
157
168
|
xmlErrorPtr err = xmlGetLastError();
|
@@ -165,7 +176,7 @@ static VALUE parse_file(VALUE self, VALUE rFilename) {
|
|
165
176
|
return rDoc;
|
166
177
|
}
|
167
178
|
|
168
|
-
static VALUE
|
179
|
+
static VALUE document_parse_string(VALUE self, VALUE rDocString) {
|
169
180
|
xmlDocPtr doc = xmlReadDoc(StringValuePtr(rDocString), NULL, NULL, 0);
|
170
181
|
if (doc == NULL) {
|
171
182
|
xmlErrorPtr err = xmlGetLastError();
|
@@ -179,7 +190,7 @@ static VALUE parse_string(VALUE self, VALUE rDocString) {
|
|
179
190
|
}
|
180
191
|
|
181
192
|
static VALUE document_to_s(VALUE self, VALUE rDocString) {
|
182
|
-
xmlDocPtr doc
|
193
|
+
xmlDocPtr doc = NULL;
|
183
194
|
xmlChar *mem;
|
184
195
|
int size;
|
185
196
|
|
@@ -191,9 +202,84 @@ static VALUE document_to_s(VALUE self, VALUE rDocString) {
|
|
191
202
|
return rStr;
|
192
203
|
}
|
193
204
|
|
205
|
+
/* LibXslt Stuff */
|
206
|
+
static void stylesheet_free(void *p) {
|
207
|
+
xsltFreeStylesheet(p);
|
208
|
+
}
|
209
|
+
|
210
|
+
static VALUE stylesheet_parse_file(VALUE self, VALUE rFilename) {
|
211
|
+
xsltStylesheetPtr xsl = xsltParseStylesheetFile(StringValuePtr(rFilename));
|
212
|
+
if (xsl == NULL) {
|
213
|
+
xmlErrorPtr err = xmlGetLastError();
|
214
|
+
rb_raise(cParseError, "could not parse file %s: %s",
|
215
|
+
StringValuePtr(rFilename), err->message);
|
216
|
+
}
|
217
|
+
|
218
|
+
/* Load new document */
|
219
|
+
VALUE rStylesheet = Data_Wrap_Struct(cStylesheet, 0, stylesheet_free, xsl);
|
220
|
+
|
221
|
+
return rStylesheet;
|
222
|
+
}
|
223
|
+
|
224
|
+
static VALUE stylesheet_apply(VALUE self, VALUE rDocument) {
|
225
|
+
xsltStylesheetPtr stylesheet = NULL;
|
226
|
+
xmlDocPtr doc = NULL, res = NULL;
|
227
|
+
|
228
|
+
Data_Get_Struct(self, xsltStylesheet, stylesheet);
|
229
|
+
Data_Get_Struct(rDocument, xmlDoc, doc);
|
230
|
+
res = xsltApplyStylesheet(stylesheet, doc, NULL);
|
231
|
+
|
232
|
+
VALUE rDoc = Data_Wrap_Struct(cDocument, 0, doc_free, res);
|
233
|
+
|
234
|
+
return rDoc;
|
235
|
+
}
|
236
|
+
|
237
|
+
static VALUE stylesheet_save_to_file(VALUE self, VALUE rResult, VALUE rFilename) {
|
238
|
+
xsltStylesheetPtr stylesheet = NULL;
|
239
|
+
xmlDocPtr result = NULL;
|
240
|
+
int st;
|
241
|
+
|
242
|
+
Data_Get_Struct(self, xsltStylesheet, stylesheet);
|
243
|
+
Data_Get_Struct(rResult, xmlDoc, result);
|
244
|
+
|
245
|
+
st = xsltSaveResultToFilename(StringValuePtr(rFilename), result, stylesheet, 0);
|
246
|
+
if (st == -1) {
|
247
|
+
xmlErrorPtr err = xmlGetLastError();
|
248
|
+
rb_raise(rb_eIOError, "could not save stylesheet result file %s: %s",
|
249
|
+
StringValuePtr(rFilename), err->message);
|
250
|
+
}
|
251
|
+
|
252
|
+
return Qnil;
|
253
|
+
}
|
254
|
+
|
255
|
+
static VALUE stylesheet_save_to_string(VALUE self, VALUE rResult) {
|
256
|
+
xsltStylesheetPtr stylesheet = NULL;
|
257
|
+
xmlDocPtr result = NULL;
|
258
|
+
int st;
|
259
|
+
xmlChar *mem;
|
260
|
+
int size;
|
261
|
+
|
262
|
+
Data_Get_Struct(self, xsltStylesheet, stylesheet);
|
263
|
+
Data_Get_Struct(rResult, xmlDoc, result);
|
264
|
+
|
265
|
+
st = xsltSaveResultToString(&mem, &size, result, stylesheet);
|
266
|
+
if (st == -1) {
|
267
|
+
xmlErrorPtr err = xmlGetLastError();
|
268
|
+
rb_raise(rb_eStandardError, "could not save stylesheet result to string: %s",
|
269
|
+
err->message);
|
270
|
+
}
|
271
|
+
VALUE rStr = rb_str_new2(mem);
|
272
|
+
xmlFree(mem);
|
273
|
+
|
274
|
+
return rStr;
|
275
|
+
}
|
276
|
+
|
194
277
|
void Init_teius() {
|
195
278
|
/* LIBXML_TEST_VERSION */
|
196
279
|
|
280
|
+
xmlSetGenericErrorFunc(NULL, null_handler);
|
281
|
+
xsltSetGenericErrorFunc(NULL, null_handler);
|
282
|
+
|
197
283
|
/* Symbols */
|
198
284
|
sRequired = rb_intern("required");
|
199
285
|
sFirst = rb_intern("first");
|
@@ -223,7 +309,14 @@ void Init_teius() {
|
|
223
309
|
|
224
310
|
/* Document */
|
225
311
|
cDocument = rb_define_class_under(mTeius, "Document", cNode);
|
226
|
-
rb_define_singleton_method(cDocument, "parse_file",
|
227
|
-
rb_define_singleton_method(cDocument, "parse_string",
|
228
|
-
rb_define_method(
|
312
|
+
rb_define_singleton_method(cDocument, "parse_file", document_parse_file, 1);
|
313
|
+
rb_define_singleton_method(cDocument, "parse_string", document_parse_string, 1);
|
314
|
+
rb_define_method(cDocument, "to_s", document_to_s, 0);
|
315
|
+
|
316
|
+
/* XSL Stylesheet */
|
317
|
+
cStylesheet = rb_define_class_under(mTeius, "Stylesheet", cNode);
|
318
|
+
rb_define_singleton_method(cStylesheet, "parse_file", stylesheet_parse_file, 1);
|
319
|
+
rb_define_method(cStylesheet, "apply", stylesheet_apply, 1);
|
320
|
+
rb_define_method(cStylesheet, "save_to_string", stylesheet_save_to_string, 1);
|
321
|
+
rb_define_method(cStylesheet, "save_to_file", stylesheet_save_to_file, 2);
|
229
322
|
}
|
data/ext/teius.o
CHANGED
Binary file
|
data/lib/teius.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
#require File.join(File.dirname(__FILE__), '..', 'ext', 'teius.so')
|
1
2
|
require 'teius.so'
|
2
3
|
|
3
4
|
module Teius
|
4
5
|
class Node
|
5
6
|
def fetch(xpath)
|
6
|
-
node = find(:unique, xpath, :required =>
|
7
|
+
node = find(:unique, xpath, :required => false)
|
7
8
|
return node ? node.value : nil
|
8
9
|
end
|
9
10
|
|
@@ -32,4 +33,20 @@ module Teius
|
|
32
33
|
end
|
33
34
|
|
34
35
|
end
|
36
|
+
|
37
|
+
class Stylesheet
|
38
|
+
|
39
|
+
# If no filename is provided, will return the result as a String
|
40
|
+
def transform(doc, filename = nil)
|
41
|
+
result = apply doc
|
42
|
+
if filename
|
43
|
+
out = save_to_file result, filename # returns nil
|
44
|
+
else
|
45
|
+
out = save_to_string result
|
46
|
+
end
|
47
|
+
out
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
35
52
|
end
|
data/lib/teius.so
CHANGED
Binary file
|
data/test/input.xml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
4
|
+
<head>
|
5
|
+
<title>Test document</title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>Test document</h1>
|
9
|
+
<p>This paragraph indicates the rest of the document.</p>
|
10
|
+
</body>
|
11
|
+
</html>
|
data/test/teius_test.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
2
2
|
require 'test/unit'
|
3
3
|
require 'teius'
|
4
|
+
require 'tempfile'
|
4
5
|
|
5
6
|
class TeiusTest < Test::Unit::TestCase
|
6
7
|
include Teius
|
@@ -135,4 +136,40 @@ class TeiusTest < Test::Unit::TestCase
|
|
135
136
|
assert_equal 9, sibs.size
|
136
137
|
end
|
137
138
|
|
139
|
+
def test_xslt
|
140
|
+
current_dir = File.dirname(__FILE__)
|
141
|
+
test_doc_path = File.join(current_dir, 'input.xml')
|
142
|
+
xsl_path = File.join(current_dir, 'test.xsl')
|
143
|
+
doc = Document.parse_file test_doc_path
|
144
|
+
xsl = Stylesheet.parse_file xsl_path
|
145
|
+
assert_no_match %r{menu}, doc.to_s
|
146
|
+
assert_match %r{menu}, xsl.transform(doc)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_xslt_write_to_file
|
150
|
+
current_dir = File.dirname(__FILE__)
|
151
|
+
test_doc_path = File.join(current_dir, 'input.xml')
|
152
|
+
xsl_path = File.join(current_dir, 'test.xsl')
|
153
|
+
doc = Document.parse_file test_doc_path
|
154
|
+
xsl = Stylesheet.parse_file xsl_path
|
155
|
+
Tempfile.open('xslt_test_file') do |tf|
|
156
|
+
outpath = tf.path
|
157
|
+
xsl.transform doc, outpath
|
158
|
+
str = tf.read
|
159
|
+
assert_match %r{menu}, str
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_xml_bad_file
|
164
|
+
assert_raise(Teius::ParseError) {
|
165
|
+
Document.parse_file File.join(File.dirname(__FILE__), 'bogus.xsl')
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_xslt_bad_file
|
170
|
+
assert_raise(Teius::ParseError) {
|
171
|
+
Stylesheet.parse_file File.join(File.dirname(__FILE__), 'bogus.xsl')
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
138
175
|
end
|
data/test/test.xsl
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<xsl:stylesheet version="1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" exclude-result-prefixes="xhtml xsl fn xs xdt">
|
3
|
+
<xsl:output method="xml" version="1.0" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" indent="yes"/>
|
4
|
+
|
5
|
+
<!-- the identity template -->
|
6
|
+
<xsl:template match="@*|node()">
|
7
|
+
<xsl:copy>
|
8
|
+
<xsl:apply-templates select="@*|node()"/>
|
9
|
+
</xsl:copy>
|
10
|
+
</xsl:template>
|
11
|
+
|
12
|
+
<!-- template for the head section. Only needed if we want to change, delete or add nodes. In our case we need it to add a link element pointing to an external CSS stylesheet. -->
|
13
|
+
<xsl:template match="xhtml:head">
|
14
|
+
<xsl:copy>
|
15
|
+
<link rel="StyleSheet" href="xhtml_test.css" type="text/css"/>
|
16
|
+
<xsl:apply-templates select="@*|node()"/>
|
17
|
+
</xsl:copy>
|
18
|
+
</xsl:template>
|
19
|
+
|
20
|
+
<!-- template for the body section. Only needed if we want to change, delete or add nodes. In our case we need it to add a div element containing a menu of navigation. -->
|
21
|
+
<xsl:template match="xhtml:body">
|
22
|
+
<xsl:copy>
|
23
|
+
<div class="menu"><p><a href="home">Homepage</a> > <strong>Test document</strong></p></div>
|
24
|
+
<xsl:apply-templates select="@*|node()"/>
|
25
|
+
</xsl:copy>
|
26
|
+
</xsl:template>
|
27
|
+
</xsl:stylesheet>
|
metadata
CHANGED
@@ -3,10 +3,11 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: teius
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: "0.2"
|
7
|
+
date: 2006-06-01 00:00:00 +03:00
|
8
8
|
summary: Light-weight Ruby API to LibXML.
|
9
9
|
require_paths:
|
10
|
+
- lib
|
10
11
|
- dll
|
11
12
|
email: joshmh@gmail.com
|
12
13
|
homepage: http://teius.rubyforge.org
|
@@ -30,16 +31,21 @@ authors:
|
|
30
31
|
files:
|
31
32
|
- ext/extconf.rb
|
32
33
|
- ext/Makefile
|
34
|
+
- ext/mkmf.log
|
35
|
+
- ext/notes.txt
|
33
36
|
- ext/teius.c
|
34
37
|
- ext/teius.o
|
35
|
-
- ext/teius.so
|
36
38
|
- lib/teius.rb
|
37
39
|
- lib/teius.so
|
40
|
+
- test/input.xml
|
38
41
|
- test/teius_test.rb
|
42
|
+
- test/test.xsl
|
39
43
|
- xml/xt.3608774-update-mid-event.xml
|
40
44
|
- xml/xt.3608787-update-post-event.xml
|
41
45
|
- doc/LICENCE.txt
|
46
|
+
- dll/libexslt.dll
|
42
47
|
- dll/libxml2.dll
|
48
|
+
- dll/libxslt.dll
|
43
49
|
test_files:
|
44
50
|
- test/teius_test.rb
|
45
51
|
rdoc_options: []
|
data/ext/teius.so
DELETED
Binary file
|