[librdf-rdfa-generator-perl] 02/64: Beginnings of work on pretty-printer.

Jonas Smedegaard dr at jones.dk
Sat Dec 23 12:22:49 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to annotated tag debian/0.106-1
in repository librdf-rdfa-generator-perl.

commit 3167cf252b67336ab14c87612ed189dd229a9ce4
Author: Toby Inkster <mail at tobyinkster.co.uk>
Date:   Thu May 6 23:09:18 2010 +0000

    Beginnings of work on pretty-printer.
    
    --HG--
    branch : RDF-RDFa-Generator
    extra : convert_revision : svn%3A3fe8e991-6959-4966-b76d-b07eca2b6e37/RDF-RDFa-Generator%40331
---
 example1-out.html                     |   3 +
 example1.css                          |  33 ++++++
 example1.pl                           |  10 +-
 lib/RDF/RDFa/Generator/HTML/Head.pm   |  58 +++++----
 lib/RDF/RDFa/Generator/HTML/Pretty.pm | 217 ++++++++++++++++++++++++++++++++++
 5 files changed, 291 insertions(+), 30 deletions(-)

diff --git a/example1-out.html b/example1-out.html
new file mode 100644
index 0000000..0b4f5fd
--- /dev/null
+++ b/example1-out.html
@@ -0,0 +1,3 @@
+<link rel="stylesheet" type="text/css" href="example1.css"/>
+
+<div xmlns="http://www.w3.org/1999/xhtml" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><div about="_:rD88B06CC596111DF9444C19270FD0CE2r0"><h3 class="blank">_:rD88B06CC596111DF9444C19270FD0CE2r0</h3><span class="rdf-type" rel="rdf:type"><img about="http://xmlns.com/foaf/0.1/Person" alt="http://xmlns.com/foaf/0.1/Person" src="data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAA [...]
diff --git a/example1.css b/example1.css
new file mode 100644
index 0000000..fe9c401
--- /dev/null
+++ b/example1.css
@@ -0,0 +1,33 @@
+/* <link rel="stylesheet" type="text/css" href="example1.css"/> */
+
+div > div
+{
+	background: #fd9;
+	border: 1px solid #db7;
+	margin: 1em;
+	padding: 0.67em;
+}
+
+div > div h3
+{
+	margin: 0;
+	padding: 0;
+}
+
+div > div span.rdf-type
+{
+	float: right;
+	text-align: right;
+	width: 40px;
+	position: relative;
+	top: -1.67em;
+}
+
+div > div dl dt
+{
+	margin: 0.5em 0 0;
+	padding: 0;
+	font-weight: bold;
+	font-style: italic;
+	font-size: smaller;
+}
diff --git a/example1.pl b/example1.pl
index d1086fa..9d6554c 100644
--- a/example1.pl
+++ b/example1.pl
@@ -1,11 +1,12 @@
 use lib "lib";
 
 use RDF::TrineShortcuts;
-use RDF::RDFa::Generator::HTML::Hidden;
+use RDF::RDFa::Generator::HTML::Pretty;
 
 my $graph = rdf_parse(<<TURTLE, type=>'turtle');
 
 \@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+\@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 
 <http://example.net/>
 
@@ -16,13 +17,14 @@ my $graph = rdf_parse(<<TURTLE, type=>'turtle');
 		a foaf:Person ;
 		foaf:name "Joe Bloggs" ;
 		foaf:plan "To conquer the world!"\@en
-	] .
+	] ;
+	foaf:segment "Hello <b xmlns='http://www.w3.org/1999/xhtml'>World</b>"^^rdf:XMLLiteral .
 
 TURTLE
 
-my $gen = RDF::RDFa::Generator::HTML::Hidden->new(base=>'http://example.net/');
+my $gen = RDF::RDFa::Generator::HTML::Pretty->new(base=>'http://example.net/');
 
 foreach my $n ($gen->nodes($graph))
 {
 	print $n->toString . "\n";
-}
\ No newline at end of file
+}
diff --git a/lib/RDF/RDFa/Generator/HTML/Head.pm b/lib/RDF/RDFa/Generator/HTML/Head.pm
index 9ac29a3..9694e4d 100644
--- a/lib/RDF/RDFa/Generator/HTML/Head.pm
+++ b/lib/RDF/RDFa/Generator/HTML/Head.pm
@@ -131,19 +131,8 @@ sub _process_predicate
 		return $self;
 	}
 	
-	my ($uri_prefix, $uri_suffix) = ($st->predicate->uri =~ m'^(.+?)([A-Za-z0-9_-]*)$');
-	if (length $uri_suffix and !length $uri_prefix)
-	{
-		($uri_prefix, $uri_suffix) = ($uri_suffix, $uri_prefix);
-	}
-	
-	unless (defined $prefixes->{$uri_prefix})
-	{
-		$prefixes->{$uri_prefix} = $self->{ns}->{$uri_prefix} || 'ns' . (1 + scalar keys %$prefixes);
-	}
-	my $curie_prefix = $prefixes->{$uri_prefix};
-	
-	$node->setAttribute($attr, sprintf('%s:%s', $curie_prefix, $uri_suffix));
+	$node->setAttribute($attr, 
+		$self->_make_curie($st->predicate->uri, $prefixes));
 	
 	return $self;
 }
@@ -182,19 +171,8 @@ sub _process_object
 	
 	if (defined $st->object->literal_datatype)
 	{
-		my ($uri_prefix, $uri_suffix) = ($st->object->literal_datatype =~ m'^(.+?)([A-Za-z0-9_-]*)$');
-		if (length $uri_suffix and !length $uri_prefix)
-		{
-			($uri_prefix, $uri_suffix) = ($uri_suffix, $uri_prefix);
-		}
-		
-		unless (defined $prefixes->{$uri_prefix})
-		{
-			$prefixes->{$uri_prefix} = $self->{ns}->{$uri_prefix} || 'ns' . (1 + scalar keys %$prefixes);
-		}
-		my $curie_prefix = $prefixes->{$uri_prefix};
-		
-		$node->setAttribute('datatype', sprintf('%s:%s', $curie_prefix, $uri_suffix));
+		$node->setAttribute('datatype', 
+			$self->_make_curie($st->object->literal_datatype, $prefixes));
 	}
 	else
 	{
@@ -204,16 +182,40 @@ sub _process_object
 	return $self;
 }
 
+sub _make_curie
+{
+	my ($self, $uri, $prefixes) = @_;
+	
+	my ($uri_prefix, $uri_suffix) = ($uri =~ m'^(.+?)([A-Za-z0-9_-]*)$');
+	if (length $uri_suffix and !length $uri_prefix)
+	{
+		($uri_prefix, $uri_suffix) = ($uri_suffix, $uri_prefix);
+	}
+	
+	unless (defined $prefixes->{$uri_prefix})
+	{
+		$prefixes->{$uri_prefix} = $self->{ns}->{$uri_prefix} || 'ns' . (1 + scalar keys %$prefixes);
+	}
+	my $curie_prefix = $prefixes->{$uri_prefix};
+	
+	return sprintf('%s:%s', $curie_prefix, $uri_suffix);
+}
+
 1;
 
 __DATA__
+bibo    http://purl.org/ontology/bibo/
 cc      http://creativecommons.org/ns#
 ctag    http://commontag.org/ns#
+dbp     http://dbpedia.org/property/
 dc      http://purl.org/dc/terms/
 doap    http://usefulinc.com/ns/doap#
+fb      http://developers.facebook.com/schema/
 foaf    http://xmlns.com/foaf/0.1/
 geo     http://www.w3.org/2003/01/geo/wgs84_pos#
 gr      http://purl.org/goodrelations/v1#
+ical    http://www.w3.org/2002/12/cal/ical#
+og      http://opengraphprotocol.org/schema/
 owl     http://www.w3.org/2002/07/owl#
 rdf     http://www.w3.org/1999/02/22-rdf-syntax-ns#
 rdfa    http://www.w3.org/ns/rdfa#
@@ -224,6 +226,10 @@ rss     http://purl.org/rss/1.0/
 sioc    http://rdfs.org/sioc/ns#
 skos    http://www.w3.org/2004/02/skos/core#
 tag     http://www.holygoat.co.uk/owl/redwood/0.1/tags/
+v       http://rdf.data-vocabulary.org/#
+vann    http://purl.org/vocab/vann/
+vcard   http://www.w3.org/2006/vcard/ns#
+void    http://rdfs.org/ns/void#
 xfn     http://vocab.sindice.com/xfn#
 xhv     http://www.w3.org/1999/xhtml/vocab#
 xsd     http://www.w3.org/2001/XMLSchema#
diff --git a/lib/RDF/RDFa/Generator/HTML/Pretty.pm b/lib/RDF/RDFa/Generator/HTML/Pretty.pm
index e69de29..37b49e9 100644
--- a/lib/RDF/RDFa/Generator/HTML/Pretty.pm
+++ b/lib/RDF/RDFa/Generator/HTML/Pretty.pm
@@ -0,0 +1,217 @@
+package RDF::RDFa::Generator::HTML::Pretty;
+
+use 5.008;
+use base qw'RDF::RDFa::Generator::HTML::Hidden';
+use common::sense;
+use constant XHTML_NS => 'http://www.w3.org/1999/xhtml';
+use XML::LibXML qw':all';
+
+sub nodes
+{
+	my ($proto, $model) = @_;
+	my $self = (ref $proto) ? $proto : $proto->new;
+	
+	my $stream = $self->_get_stream($model);
+	my @nodes;
+	
+	my $root_node = XML::LibXML::Element->new('div');
+	$root_node->setNamespace(XHTML_NS, undef, 1);
+	
+	my $prefixes = {};
+	my $subjects = {};
+	while (my $st = $stream->next)
+	{
+		my $s = $st->subject->is_resource ?
+			$st->subject->uri :
+			('_:'.$st->subject->blank_identifier);
+		push @{ $subjects->{$s} }, $st;
+	}
+	
+	foreach my $s (keys %$subjects)
+	{
+		my $subject_node = $root_node->addNewChild(XHTML_NS, 'div');
+		
+		$self->_process_subject($subjects->{$s}->[0], $subject_node, $prefixes);
+		$self->_resource_heading($subjects->{$s}->[0]->subject, $subject_node, $subjects->{$s}, $prefixes);
+		$self->_resource_classes($subjects->{$s}->[0]->subject, $subject_node, $subjects->{$s}, $prefixes);
+		$self->_resource_statements($subjects->{$s}->[0]->subject, $subject_node, $subjects->{$s}, $prefixes);
+		## TODO Query $model for statements that act as special notes for the subject (in a separate graph)
+		#$self->_resource_notes($subjects->{$s}->[0]->subject, $subject_node, $model);
+	}
+	
+	if ($self->{'version'} == 1.1
+	and $self->{'prefix_attr'})
+	{
+		my $prefix_string = '';
+		while (my ($u,$p) = each(%$prefixes))
+		{
+			$prefix_string .= sprintf("%s: %s ", $p, $u);
+		}
+		if (length $prefix_string)
+		{
+			$root_node->setAttribute('prefix', $prefix_string);
+		}
+	}
+	else
+	{
+		while (my ($u,$p) = each(%$prefixes))
+		{
+			$root_node->setNamespace($u, $p, 0);
+		}
+	}
+	
+	push @nodes, $root_node;
+	return @nodes if wantarray;
+	my $nodelist = XML::LibXML::NodeList->new;
+	$nodelist->push(@nodes);
+	return $nodelist;
+}
+
+sub _resource_heading
+{
+	my ($self, $subject, $node, $statements, $prefixes) = @_;
+	
+	my $heading = $node->addNewChild(XHTML_NS, 'h3');
+	$heading->appendTextNode( $subject->is_resource ? $subject->uri : ('_:'.$subject->blank_identifier) );
+	$heading->setAttribute('class', $subject->is_resource ? 'resource' : 'blank' );
+	
+	return $self;
+}
+
+## TODO
+## <span rel="rdf:type"><img about="[foaf:Person]" src="fsfwfwfr.png"
+##                           title="http://xmlns.com/foaf/0.1/Person" /></span>
+
+sub _resource_classes
+{
+	my ($self, $subject, $node, $statements, $prefixes) = @_;
+	
+	my @statements = sort {
+		$a->predicate->uri cmp $b->predicate->uri
+		or $a->object->uri cmp $b->object->uri
+		}
+		grep {
+			$_->predicate->uri eq 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
+			and $_->object->is_resource
+		}
+		@$statements;
+
+	return unless @statements;
+
+	my $SPAN = $node->addNewChild(XHTML_NS, 'span');
+	$SPAN->setAttribute('class', 'rdf-type');
+	$SPAN->setAttribute('rel', $self->_make_curie('http://www.w3.org/1999/02/22-rdf-syntax-ns#type', $prefixes));
+
+	foreach my $st (@statements)
+	{
+		my $IMG = $SPAN->addNewChild(XHTML_NS, 'img');
+		$IMG->setAttribute('about', $st->object->uri);
+		$IMG->setAttribute('alt',   $st->object->uri);
+		$IMG->setAttribute('src',   $self->_img($st->object->uri));
+		$IMG->setAttribute('title', $st->object->uri);
+	}
+
+	return $self;
+}
+
+
+sub _resource_statements
+{
+	my ($self, $subject, $node, $statements, $prefixes) = @_;
+	
+	my @statements = sort {
+		$a->predicate->uri cmp $b->predicate->uri
+		or $a->object->uri cmp $b->object->uri
+		}
+		grep {
+			$_->predicate->uri ne 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
+			or !$_->object->is_resource
+		}
+		@$statements;
+
+	return unless @statements;
+	
+	my $DL = $node->addNewChild(XHTML_NS, 'dl');
+	
+	my $current_property = undef;
+	foreach my $st (@statements)
+	{
+		unless ($st->predicate->uri eq $current_property)
+		{
+			my $DT = $DL->addNewChild(XHTML_NS, 'dt');
+			$DT->setAttribute('title', $st->predicate->uri);
+			$DT->appendTextNode($self->_make_curie($st->predicate->uri, $prefixes));
+		}
+		
+		my $DD = $DL->addNewChild(XHTML_NS, 'dd');
+		
+		if ($st->object->is_resource)
+		{
+			$DD->setAttribute('rel',  $self->_make_curie($st->predicate->uri, $prefixes));
+			$DD->setAttribute('class', 'resource');
+			
+			my $A = $DD->addNewChild(XHTML_NS, 'a');
+			$A->setAttribute('href', $st->object->uri);
+			$A->appendTextNode($st->object->uri);
+		}
+		elsif ($st->object->is_blank)
+		{
+			$DD->setAttribute('rel',  $self->_make_curie($st->predicate->uri, $prefixes));
+			$DD->setAttribute('class', 'blank');
+			
+			my $A = $DD->addNewChild(XHTML_NS, 'span');
+			$A->setAttribute('about', '_:'.$st->object->blank_identifier);
+			$A->appendTextNode('_:'.$st->object->blank_identifier);
+		}
+		elsif ($st->object->is_literal
+		&& !$st->object->has_datatype)
+		{
+			$DD->setAttribute('property',  $self->_make_curie($st->predicate->uri, $prefixes));
+			$DD->setAttribute('class', 'plain-literal');
+			$DD->setAttribute('xml:lang',  $st->object->literal_value_language);
+			$DD->appendTextNode($st->object->literal_value);
+		}
+		elsif ($st->object->is_literal
+		&& $st->object->has_datatype
+		&& $st->object->literal_datatype eq 'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral')
+		{
+			$DD->setAttribute('property',  $self->_make_curie($st->predicate->uri, $prefixes));
+			$DD->setAttribute('class', 'typed-literal datatype-xmlliteral');
+			$DD->setAttribute('datatype',  $self->_make_curie($st->object->literal_datatype, $prefixes));
+			$DD->appendWellBalancedChunk($st->object->literal_value);
+		}
+		elsif ($st->object->is_literal
+		&& $st->object->has_datatype)
+		{
+			$DD->setAttribute('property',  $self->_make_curie($st->predicate->uri, $prefixes));
+			$DD->setAttribute('class', 'typed-literal');
+			$DD->setAttribute('datatype',  $self->_make_curie($st->object->literal_datatype, $prefixes));
+			$DD->appendTextNode($st->object->literal_value);
+		}
+	}
+	
+	return $self;
+}
+
+sub _img
+{
+	my ($self, $type) = @_;
+	
+	my $icons = {
+		'http://xmlns.com/foaf/0.1/Document' => 'data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAz1JREFUWIXll0FPG0cUx38zuzgmllM7TQhRFFVVghGRkIBYqJz6HfoFyIEb36HXHnPiGIlP0I/QWy6oQkKqBAdXTghxD03BwnaK1zs7OeBZz65n2TVKT32StTPjnfd+83/PM2P4v5tID+zt7f3k+/4+UPU8DyklURShlIo/YRjGT7t90xjQC8Pw1f7+/q92PH+KSIg3Ozs71XGbMAzxfR+tdeI9u1+wXd3d3X0D3AyglKoBtNtthBAopahUKgRBYAARYiKc3Xb1DcjCwgJBENTS300BaK3jIMZZuu16ZgXPsymAKIoSQe1ArVYr/r5IUM/zaDQaicUVAjAqpEGWlpb+ [...]
+		'http://xmlns.com/foaf/0.1/Person'   => 'data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAakSURBVFiFrZZbbBTXGcf/58yZy+7Mrr2brC9rm0tck4CqSoVElUwAG3pRH9oktJVaqVKf+tI8RLRYlqxKqGlj5K4VUbVJFXp56UMTUERV5YFLEnDADWmJCm1MSowNwsaXxWa9u97rnEsfdme9i80S4hzp04xmdr//73zznfM/RCmFhxlDsUEHwPcM3dhDCNnJBY8yxq4LIc9z7o4AONHfN8A/bT7yMABDscG9jOl/jUZbnQ0dG/1NkWYEgw4SiSTu3Imr8Ynx [...]
+		'http://xmlns.com/foaf/0.1/Group'    => 'data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH1gsKFTktQWg0swAAB8FJREFUWIXlV1tsFNcZ/mbO3HZ2d/bitfGFi7HXDuZaSAqikDYIVUFCabi4BEopD3nrG1JKGlAqiwhh16h+qPrQVkrVh7RVUiyoooBKKJcQATFp7OILF8uG2JBiK7az6/XO5Vz6MLtjY7kEqvapR/o1u2eOzvnO93/n+88A/+9N+roBbW1tcY/n9yiKuplSWgYAiqKMUOqdU+XQHw8cODDxPwPQ0nJ0k6Krb659bq1aX7dEsawYACCbzeDOndv0ascVjzreW6+/fvj8fx3A8ePNG81I5MiObTtD4XAEsgzIsgJZlsE5B8CRzU7i [...]
+		'http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing' => 'data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH1ggCFigiAlzmVAAACOFJREFUWIXNl1mMHNUVhr97q6qre7qnZx/PGC+z2YxNMIY4xg5LBBgTFsdRgEBAWV4iImV5iBSx5MUgBZCQEFFQeIyIgiwZJTJxLLM4RpYMNvFgG8cGj2c8mz3Ts3ePp5fqqntv5aF72h6zZFGk5EhHVVLfqv+v//zn3L7wPw7xry5cum1HVURH77Rt+aCQ8hpM2KyNqbWkzCDFZGjMaaXM677lvTO2Z0f+v0agY9vzKyzk84bwm11trcGGL7VVtzYlRU0iRlUsQr7gM5ctkJq6GPacGprvH0o5ErFbY5 [...]
+		'?'                                  => 'data:image/png;charset=binary;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAg8SURBVFiFxZZpkFTVFcd/973u9153z0zP0M4is4DsOsoIErZYbiVIQFQUEZcKlAtlkiIRNfFDPlgVKxWTEsWlQpmgMZW4oIIaFQrEpeLIIoLIZHCAYVicGWbvmen1vX7v3XzoxW6GqLFSlVt16t537nL+53/POfcJKSX/z+b5PpsWPi1KDJ9W7Uq3TCpqjz5sdry6Ria+z1niuzCw7DWhmmF9gdDErcKRi0v0cl9lWY0V9FfKoViv0j14SotafX0uzmvSka+8 [...]
+	};
+	
+	my $equiv = {
+		'http://xmlns.com/foaf/0.1/PersonalProfileDocument'  => 'http://xmlns.com/foaf/0.1/Document' ,
+		'http://www.w3.org/2003/01/geo/wgs84_pos#Point'      => 'http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing' , 
+		'http://www.w3.org/2006/vcard/ns#Location'           => 'http://www.w3.org/2003/01/geo/wgs84_pos#SpatialThing' , 
+	};
+	
+	return $icons->{$type} || $icons->{ $equiv->{$type} } || $icons->{'?'};
+}
+
+1;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/librdf-rdfa-generator-perl.git



More information about the Pkg-perl-cvs-commits mailing list