Biblio::Thesaurus::ModRewrite::Embed - a module to embed OML programs


Biblio-Thesaurus-ModRewrite documentation Contained in the Biblio-Thesaurus-ModRewrite distribution.

Index


Code Index:

NAME

Top

Biblio::Thesaurus::ModRewrite::Embed - a module to embed OML programs in Perl code.

SYNOPSIS

Top

  use Biblio::Thesaurus::ModRewrite::Embed;

  OML proc
  $city 'city-of' $country => sub { print "$city is in $country\n"; }.
  ENDOML

  proc('ontology.iso');

DESCRIPTION

Top

This module can be used to embed OML programs in Perl source code. This module works as a filter for the source code, so you should only need to load it.

FUNCTIONS

Top

buildOML

This function is used to create a new funcion to execute the OML code found.

FILTER

This filters your Perl source code.

EXAMPLES

Top

Look in the examples and bin directory for sample programs.

AUTHOR

Top

Nuno Carvalho, <smash@cpan.org>

J.Joao Almeida, <jj@di.uminho.pt>

Alberto Simoes, <albie@alfarrabio.di.uminho.pt>

COPYRIGHT & LICENSE

Top


Biblio-Thesaurus-ModRewrite documentation Contained in the Biblio-Thesaurus-ModRewrite distribution.
package Biblio::Thesaurus::ModRewrite::Embed;

use Filter::Simple;
use Data::Dumper;
     
use warnings;
use strict;

our $VERSION = '0.02';

sub buildOML {
	(my $name, my $list, my $code) = @_;

print Dumper $name;
print Dumper $list;
print Dumper $code;
	# begin
	my $c = "sub $name {\n";
	
	# handle ontology
	$c .= "\tmy \$ont = shift;\n";
	$c .= "\tuse Biblio::Thesaurus;\n";
	$c .= "\tuse Biblio::Thesaurus::ModRewrite;\n";
	$c .= "\tmy \$obj = thesaurusLoad(\$ont);\n\n";

	# handle OML code
	$c .= "my \$code=<<'EOF';\n";
	$c .= "$code";
	$c .= "EOF\n\n";

	# black magic
	$c .= "\tif(\"$list\" eq '') {\n";
	$c .= "\t\tmy \@ARGV = \@_;\n\n";
	$c .= "\t\t\$code =~ s/\\\$ARGV\\[(\\d+)\\]/\$ARGV[\$1]/ge;\n\n";
	$c .= "\t} else {\n";
	$c .= "\t\t\@tmp = split /,/, \"$list\";\n";
	$c .= "\t\tforeach (\@_) { my \$i = shift \@tmp;\n";
	$c .= "\t\t\t\$code =~ s/\\b\$i\\b/\$_/g;\n";
	$c .= "\t\t}\n";
	$c .= "\t}\n";

	# main
	$c .= "\$t = Biblio::Thesaurus::ModRewrite->new(\$obj);\n";
	$c .= "\$t->process(\$code);\n";

	# finish
	$c .="}\n";

	$c;
}

FILTER { 
	return if m/^(\s|\n)*$/;

	#print "BEFORE $_\n";
	s/^OML\s+(\w+)(\(([\w,]+)\))?\s*\n((?:.|\n)*?)^ENDOML/buildOML($1,$3,$4)/gem;
	#print "AFTER $_\n";

	$_;
};

1;