--- /dev/null
+#
+# This is a stub class for more complex JS*ArrayParser objects.
+# It's new() method usually does _not_ return an object of
+# type videosite::JSArrayParser, but rather a child object of itself
+# which is able to do some actual work. The only time new() retuns
+# an videosite::JSArrayParser onject is when no child objects are
+# available.
+#
+
+package videosite::JSArrayParser;
+
+use strict;
+
+sub new {
+ my $class = shift;
+ my $self = {};
+
+ if ($class ne __PACKAGE__) {
+ # We were called from a child object. Return ourselves.
+ return bless($self, $class);
+ }
+
+ # Try to find a child object which is available and return that.
+ #
+ # See if videosite::JSLexArrayParser is available
+ eval {
+ require videosite::JSLexArrayParser;
+ };
+
+ unless($@) {
+ # Available. Return a JSLexArrayParser object
+ return videosite::JSLexArrayParser->new();
+ }
+
+ # See if JSSimleArrayParser is available
+ eval {
+ require videosite::JSSimpleArrayParser;
+ };
+
+ unless ($@) {
+ # Available. Return a JSSimpleArrayParser object
+ return videosite::JSSimpleArrayParser->new();
+ }
+
+ # Nothing available. Return ourselves.
+ return bless($self, $class);
+}
+
+sub parse {
+ my $self = shift;
+
+ # No functionality here
+ return undef;
+}
+
+1;
# package. Use 'yapp -m videosite::jsarray -s jsarray.yp' to regenerate
#
-package videosite::JSArrayParser;
+package videosite::JSLexArrayParser;
+
+use videosite::JSArrayParser;
+@ISA = qw(videosite::JSArrayParser);
use Parse::Lex;
use videosite::jsarray;
sub new {
my $class = shift;
- my $self = {
- '_PARSER' => videosite::jsarray->new(),
- '_LEXER' => Parse::Lex->new(@tokens),
- };
+ my $self = $class->SUPER::new();
+
+ $self->{'_PARSER'} = videosite::jsarray->new();
+ $self->{'_LEXER'} = Parse::Lex->new(@tokens);
return bless($self, $class);
}
--- /dev/null
+#
+# A helper class for parsing textual JS hashes into perl
+# hashes
+#
+# This parser is based on simple regexps.
+#
+
+package videosite::JSSimpleArrayParser;
+
+use videosite::JSArrayParser;
+@ISA = qw(videosite::JSArrayParser);
+
+use strict;
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new();
+
+ return bless($self, $class);
+}
+
+sub parse {
+ my $self = shift;
+ my $s = shift;
+ my $ret;
+
+ if ($s =~ /{(.*)}/) {
+ my $str = $1;
+ while ($str =~ /"(\S+)":\s+"([^"]*)"(,\s*)?/g) {
+ $ret->{$1} = $2;
+ }
+ } else {
+ return undef;
+ }
+ return $ret;
+}
+
+1;