From: Jan T. <de...@us...> - 2002-05-09 19:12:20
|
Update of /cvsroot/net-script/netscript2/src/perl/NetScript/Libraries In directory usw-pr-cvs1:/tmp/cvs-serv26260 Added Files: DefaultLibrary.pm Library.pm Log Message: * created Library interface * added Default Library (fallback) --- NEW FILE: DefaultLibrary.pm --- #-------------------------------------------------------- # $Id: DefaultLibrary.pm,v 1.1 2002/05/09 19:12:16 derkork Exp $ # # Class DefaultLibrary # # NetScript and all related materials, such as documentation, # are protected under the terms and conditions of the Artistic License. # (C) 2000-2002 by Jan Thomä, insOMnia # mailto: ko...@in... #-------------------------------------------------------- use strict; #/** # The default library is a simple copy-tag-library. It catches # all events thrown by the <code>NetScript::Engine::DOMWalker</code> # and processes them. The Listeners are set to <code>PRIORITY_LAST</code> # so other libraries are able to process special Tags themselves. #*/ package NetScript::Libraries::DefaultLibrary; use base qw(NetScript::Libraries::Library); use vars qw($VERSION); $VERSION = '1.0'; use NetScript::Engine::EventListener; use NetScript::Engine::EventRelay; use NetScript::Interpreter; use NetScript::Engine::DOMWalker; #/** # Ctor. Creates a new DefaultLibrary Object. # @public #*/ sub new { my $proto = shift; # get Prototype my $class = ref($proto) || $proto; my $this = $class -> SUPER::new(); my @elemStack = (); $this -> { m_elemStack } = \@elemStack; $this; } sub init { my ($this, $interpreter) = @_; $this -> SUPER::init( $interpreter ); # create event listeners for all events my $eventListener1 = NetScript::Engine::EventListener -> new(); $eventListener1 -> init( NetScript::Engine::DOMWalker -> ELEMENT_START_EVENT(), "elementStarted", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventListener2 = NetScript::Engine::EventListener -> new(); $eventListener2 -> init( NetScript::Engine::DOMWalker -> PI_EVENT(), "copyNode", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventListener3 = NetScript::Engine::EventListener -> new(); $eventListener3 -> init( NetScript::Engine::DOMWalker -> TEXT_EVENT(), "copyNode", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventListener4 = NetScript::Engine::EventListener -> new(); $eventListener4 -> init( NetScript::Engine::DOMWalker -> COMMENT_EVENT(), "copyNode", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventListener5 = NetScript::Engine::EventListener -> new(); $eventListener5 -> init( NetScript::Engine::DOMWalker ->OTHER_NODE_EVENT(), "copyNode", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventListener6 = NetScript::Engine::EventListener -> new(); $eventListener6 -> init( NetScript::Engine::DOMWalker -> ELEMENT_END_EVENT(), "elementFinished", $this, NetScript::Engine::EventListener -> PRIORITY_LAST() ); my $eventRelay = $this -> interpreter() -> getEventRelay(); $eventRelay -> addEventListener( $eventListener1 ); $eventRelay -> addEventListener( $eventListener2 ); $eventRelay -> addEventListener( $eventListener3 ); $eventRelay -> addEventListener( $eventListener4 ); # Test - should double all comments... # $eventRelay -> addEventListener( $eventListener4 ); $eventRelay -> addEventListener( $eventListener5 ); $eventRelay -> addEventListener( $eventListener6 ); } #/** # Copies the current node. # @param an instance of <code>NetScript::Engine::Event</code> # @public #*/ sub copyNode { my ($this, $event) = @_; my $domWalker = $event -> eventUnknown(); my $node = $domWalker -> currentSource(); $domWalker -> insertIntoTarget( $node, 1 ); 1; # consume event } #/** # Called when an element starts. # @param an instance of <code>NetScript::Engine::Event</code> # @public #*/ sub elementStarted { my ($this, $event) = @_; my $domWalker = $event -> eventUnknown(); my $id = $domWalker -> markCurrentTarget(); push( @{$this -> { m_elemStack }}, $id ); $this -> copyNode( $event ); 1; # consume event } #/** # Called when an element ends. # @param an instance of <code>NetScript::Engine::Event</code> # @public #*/ sub elementFinished { my ($this, $event) = @_; my $domWalker = $event -> eventUnknown(); my $id = pop( @{$this -> { m_elemStack }} ); my $node = $domWalker -> markedNode( $id ); $domWalker -> currentTarget( $node ); $domWalker -> clearMark( $id ); 1; # consume event } sub shutdown { my ($this) = @_; $this -> SUPER::shutdown(); } 1; #make require happy --- NEW FILE: Library.pm --- #-------------------------------------------------------- # NetScript Library Class # $Id: Library.pm,v 1.1 2002/05/09 19:12:16 derkork Exp $ # # NetScript and all related materials, such as documentation, # are protected under the terms and conditions of the Artistic License. # (C) 2000-2002 by Jan Thomä, insOMnia # mailto: ko...@in... #-------------------------------------------------------- use strict; #/** # This is the base class of all Netscript Libraries. Libraries # should be derived from this class,to make sure, they implement # the interface. Libraries communicate via Events. The # Interpreter and other libraries send Events which can be # retrieved by the libraries. The libraries can then react # to them and also send events themselves. # @abstract #*/ package NetScript::Libraries::Library; use vars qw($VERSION); $VERSION = '1.0'; #/** # Ctor. Creates a new Library Object. # @public #*/ sub new { my $proto = shift; # get Prototype my $class = ref( $proto ) || $proto;# get the Classname # Create a Class using the Hash-As-An-Object-Idiom my $this = {}; bless( $this, $class ); # create Object $this -> { m_interpreter } = undef; # Return this. $this; } #/** # This sub is called by the interpreter to allow the library to # do any initial setup necessary. # @param an instance of NetScript::Interpreter # @public # @abstract # @note subclasses should call this sub if they override it #*/ sub init { my ($this, $interpreter) = @_; $this -> { m_interpreter } = $interpreter; } #/** # This sub is called by the interpreter to allow the library # to do shutdown procedures. # @public # @abstract # @note subclasses should call this sub, if they override it #*/ sub shutdown { } #/** # Returns an instance of <code>NetScript::Interpreter</code> # @public #*/ sub interpreter { my ( $this ) = @_; $this -> { m_interpreter }; } 1; #make require happy |