# HG changeset patch # User Sergey # Date 1252330255 -14400 # Node ID 16795016e70bf16a8cf59e04922e84ad4f2c7226 # Parent 65a7bb156fb753ddd404bc17fdffe045b8227916 Dom schema in progress diff -r 65a7bb156fb7 -r 16795016e70b Lib/IMPL/DOM/Document.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/DOM/Document.pm Mon Sep 07 17:30:55 2009 +0400 @@ -0,0 +1,29 @@ +package IMPL::DOM::Document; +use strict; +use warnings; + +use base qw(IMPL::DOM::Node); + +__PACKAGE__->PassThroughArgs; + +sub Create { + my ($this,$nodeName,$class,$refProps) = @_; + + $refProps ||= {}; + + return $class->new( + nodeName => $nodeName, + %$refProps + ); +} + +1; +__END__ + +=pod + +=head1 DESCRIPTION + + . + +=cut \ No newline at end of file diff -r 65a7bb156fb7 -r 16795016e70b Lib/IMPL/DOM/Navigator/Builder.pm --- a/Lib/IMPL/DOM/Navigator/Builder.pm Fri Sep 04 16:38:15 2009 +0400 +++ b/Lib/IMPL/DOM/Navigator/Builder.pm Mon Sep 07 17:30:55 2009 +0400 @@ -11,7 +11,9 @@ public _direct property Document => prop_get | owner_set; } -__PACKAGE__->PassThroughArgs; +our %CTOR = ( + 'IMPL::DOM::Navigator' => sub { $_[0] } # IMPL::DOM::Navigator($domDocument) +); sub CTOR { my ($this,$domDocument,$schema) = @_; @@ -24,9 +26,9 @@ my ($this,$nodeName,%props) = @_; if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) { - my $class = $nodeSchema->type; + my $class = delete $props{type} || $nodeSchema->type || $nodeName; - my $node = $this->{$Document}->Create($nodeName, $class, \%props); + my $node = $this->{$Document}->Create(delete $props{nodeName} || $nodeName, $class, \%props); $this->Current()->appendNode($node); $this->Current($node); @@ -36,4 +38,65 @@ } } +sub Back { + my ($this) = @_; + + $this->{$_navigatorSchema}->Back; + return $this->SUPER::Back(); +} + 1; + +__END__ +=pod + +=head1 SYNOPSIS + +my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema); +my $reader = new IMPL::DOM::XMLReader(Navigator => $builder); + +$reader->ParseFile("document.xml"); + +my @errors = $schema->Validate($builder->Document); + +=head1 DESCRIPTION + + DOM . + C. + +=head1 METHODS + +=over + +=item C + + , ( ) +. + +=item C<< $obj->NavigateCreate($nodeName) >> + + . + , . + + , + , + +=over + +=item C , + +=item C , , + . + +=item + +=back + + C. + +.. C<< >> + C<< Container->new(nodeName => 'Box') >>. + +=back + +=cut \ No newline at end of file diff -r 65a7bb156fb7 -r 16795016e70b Lib/IMPL/DOM/Schema.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/DOM/Schema.pm Mon Sep 07 17:30:55 2009 +0400 @@ -0,0 +1,15 @@ +package IMPL::DOM::Schema; +use strict; +use warnings; + +use base qw(IMPL::DOM::Document); +use IMPL::Class::Property; +use IMPL::Class::Property::Direct; + +__PACKAGE__->PassThroughArgs; + +BEGIN { + private _direct property _TypesMap => prop_all; +} + +1; diff -r 65a7bb156fb7 -r 16795016e70b _test/Resources/form.schema --- a/_test/Resources/form.schema Fri Sep 04 16:38:15 2009 +0400 +++ b/_test/Resources/form.schema Mon Sep 07 17:30:55 2009 +0400 @@ -2,28 +2,57 @@
- - + \w{4,10} - - + + + + + + + +
diff -r 65a7bb156fb7 -r 16795016e70b _test/Resources/test.schema --- a/_test/Resources/test.schema Fri Sep 04 16:38:15 2009 +0400 +++ b/_test/Resources/test.schema Mon Sep 07 17:30:55 2009 +0400 @@ -4,6 +4,21 @@ + + + \d{4}-\d{2}-\d{2}((T|\s)\d{2}\:\d{2}:\d{2})? + + + + + + + + + + + + @@ -23,7 +38,4 @@
- - \d{4}-\d{2}-\d{2}((T|\s)\d{2}\:\d{2}:\d{2})? - \ No newline at end of file