diff --git a/MANIFEST b/MANIFEST index 5b2c86a..f9a806f 100644 --- a/MANIFEST +++ b/MANIFEST @@ -5,14 +5,14 @@ README.md doc/DCO.md doc/changelog.md doc/css/common.css -ext/liboga/extconf.rb -ext/liboga/lexer.c -ext/liboga/lexer.h -ext/liboga/lexer.rl -ext/liboga/liboga.c -ext/liboga/liboga.h -ext/liboga/xml.c -ext/liboga/xml.h +ext/c/liboga/extconf.rb +ext/c/liboga/lexer.c +ext/c/liboga/lexer.h +ext/c/liboga/lexer.rl +ext/c/liboga/liboga.c +ext/c/liboga/liboga.h +ext/c/liboga/xml.c +ext/c/liboga/xml.h lib/oga.rb lib/oga/html/parser.rb lib/oga/version.rb diff --git a/Rakefile b/Rakefile index a25c691..21aeff4 100644 --- a/Rakefile +++ b/Rakefile @@ -1,11 +1,20 @@ require 'bundler/gem_tasks' require 'digest/sha2' require 'rake/clean' -require 'rake/extensiontask' require 'cliver' GEMSPEC = Gem::Specification.load('oga.gemspec') +if RUBY_PLATFORM == 'java' + require 'rake/javaextensiontask' + + Rake::JavaExtensionTask.new('liboga', GEMSPEC) +else + require 'rake/extensiontask' + + Rake::ExtensionTask.new('liboga', GEMSPEC) +end + PARSER_OUTPUT = 'lib/oga/xml/parser.rb' CLEAN.include( @@ -16,7 +25,7 @@ CLEAN.include( 'profile/samples/**/*.txt', 'lib/liboga.*', 'tmp', - 'ext/liboga/lexer.c' + 'ext/c/liboga/lexer.c' ) FILE_LIST = FileList.new( @@ -31,8 +40,6 @@ FILE_LIST = FileList.new( 'ext/**/*.*' ) -Rake::ExtensionTask.new('liboga', GEMSPEC) - Dir['./task/*.rake'].each do |task| import(task) end diff --git a/ext/liboga/LibogaService.java b/ext/liboga/LibogaService.java new file mode 100644 index 0000000..a132aaf --- /dev/null +++ b/ext/liboga/LibogaService.java @@ -0,0 +1,30 @@ +package org.liboga; + +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.RubyModule; +import org.jruby.RubyClass; +import org.jruby.runtime.load.BasicLibraryService; +import org.jruby.runtime.load.Library; + +public class LibogaService implements BasicLibraryService +{ + public boolean basicLoad(final Ruby runtime) throws IOException + { + // Calling getModule on an instance of RubyModule? Nah fuck + // that, that would be too easy. + RubyModule xml = (RubyModule) runtime.getModule("Oga") + .getConstant("XML"); + + RubyClass lexer = xml.defineClassUnder( + "Lexer", + runtime.getObject(), + runtime.getObject().getAllocator() + ); + + lexer.defineAnnotatedMethods(org.liboga.xml.Lexer.class); + + return true; + } +} diff --git a/ext/liboga/org/liboga/xml/Lexer.java b/ext/liboga/org/liboga/xml/Lexer.java new file mode 100644 index 0000000..e8b79cd --- /dev/null +++ b/ext/liboga/org/liboga/xml/Lexer.java @@ -0,0 +1,27 @@ +package org.liboga.xml; + +import java.io.IOException; + +import org.jruby.Ruby; +import org.jruby.RubyModule; +import org.jruby.RubyClass; +import org.jruby.RubyObject; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyClass(name="Oga::XML::Lexer", parent="Object") +public class Lexer extends RubyObject +{ + public Lexer(Ruby runtime, RubyClass klass) + { + super(runtime, klass); + } + + @JRubyMethod + public IRubyObject advance_native(ThreadContext context) + { + return context.getRuntime().getNil(); + } +} diff --git a/oga.gemspec b/oga.gemspec index 40407f4..9b286eb 100644 --- a/oga.gemspec +++ b/oga.gemspec @@ -12,7 +12,13 @@ Gem::Specification.new do |s| s.files = File.read(File.expand_path('../MANIFEST', __FILE__)).split("\n") - s.extensions = ['ext/liboga/extconf.rb'] + if RUBY_PLATFORM == 'java' + s.files << 'lib/liboga.jar' + + s.platform = 'java' + else + s.extensions = ['ext/c/liboga/extconf.rb'] + end s.has_rdoc = 'yard' s.required_ruby_version = '>= 1.9.3' diff --git a/task/lexer.rake b/task/lexer.rake index 8823bea..9d3fc91 100644 --- a/task/lexer.rake +++ b/task/lexer.rake @@ -25,4 +25,4 @@ rule '.c' => '.rl' do |task| end desc 'Generates the lexers' -task :lexer => ['ext/liboga/lexer.c'] +task :lexer => ['ext/c/liboga/lexer.c']