Mercurial > hg > dbtune-rdf-services
diff jamendo/sparql-archived/SeRQL/lib/semweb/rdf_portray.pl @ 0:df9685986338
Import scripts for Jamendo and Magnatune, with new static-rdf-server.pl working towards serving the static dumps
author | Chris Cannam |
---|---|
date | Thu, 19 Oct 2017 15:27:05 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jamendo/sparql-archived/SeRQL/lib/semweb/rdf_portray.pl Thu Oct 19 15:27:05 2017 +0100 @@ -0,0 +1,172 @@ +/* $Id$ + + Part of SWI-Prolog + + Author: Jan Wielemaker + E-mail: jan@swi.psy.uva.nl + WWW: http://www.swi-prolog.org + Copyright (C): 1985-2002, University of Amsterdam + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + As a special exception, if you link this library with other files, + compiled with a Free Software compiler, to produce an executable, this + library does not by itself cause the resulting executable to be covered + by the GNU General Public License. This exception does not however + invalidate any other reasons why the executable file might be covered by + the GNU General Public License. +*/ + + +:- module(rdf_portray, + [ rdf_portray_as/1, % +Style + rdf_portray_lang/1 % +Lang + ]). +:- use_module(library(semweb/rdf_db)). +:- use_module(library(semweb/rdfs)). +:- use_module(library(error)). + +/** <module> Portray RDF resources + +This module defines rules for user:portray/1 to help tracing and +debugging RDF resources by printing them in a more concise +representation and optionally adding comment from the label field to het +the user interpreting the URL. The main predicates are: + + * rdf_portray_as/1 defines the overall style + * rdf_portray_lang/1 selects languages for extracting label comments + +@tbd Define alternate predicate to use for providing a comment +@tbd Use type if there is no meaningful label? +@tbd Smarter guess whether or not the local identifier might be + meaningful to the user without a comment. I.e. does it look + `word-like'? +*/ + +:- dynamic + style/1, + lang/1. + +%% rdf_portray_as(+Style) is det. +% +% Set the style used to portray resources. Style is one of: +% +% * ns:id +% Write as NS:ID, compatible with what can be handed to +% the rdf predicates. This is the default. +% +% * writeq +% Use quoted write of the full resource. +% +% * ns:label +% Write namespace followed by the label. This format +% cannot be handed to rdf/3 and friends, but can be +% useful if resource-names are meaningless identifiers. +% +% * ns:id=label +% This combines ns:id with ns:label, providing both human +% readable output and output that can be pasted into the +% commandline. + +rdf_portray_as(Style) :- + must_be(oneof([writeq, ns:id, ns:label, ns:id=label]), Style), + retractall(style(_)), + assert(style(Style)). + +%% rdf_portray_lang(+Lang) is det. +% +% If Lang is a list, set the list or preferred languages. If it is +% a single atom, push this language as the most preferred +% language. + +rdf_portray_lang(Lang) :- + ( is_list(Lang) + -> must_be(list(atom), Lang), + retractall(lang(_)), + forall(member(L,Lang), assert(lang(L))) + ; must_be(atom, Lang), + asserta(lang(Lang)) + ). + +try_lang(L) :- lang(L). +try_lang(_). + + +:- multifile + user:portray/1. + +user:portray(URL) :- + atom(URL), + sub_atom(URL, 0, _, _, 'http://'), !, + ( style(Style) + -> true + ; Style = ns:id + ), + portray_url(Style, URL). +user:portray(URL) :- + atom(URL), + atom_concat('__file://', URL2, URL), + sub_atom(URL2, S, _, A, #), + sub_atom(URL2, _, A, 0, Local), + sub_atom(URL2, 0, S, _, Path), + file_base_name(Path, Base), + format('__~w#~w', [Base, Local]). + +portray_url(writeq, URL) :- + writeq(URL). +portray_url(ns:id, URL) :- + ( rdf_global_id(NS:Id, URL) + -> writeq(NS:Id) + ; writeq(URL) + ). +portray_url(ns:id=label, URL) :- + ( rdf_global_id(NS:Id, URL) + -> Value = NS:Id + ; Value = URL + ), + ( Id \== '', + ( ( try_lang(Lang), + rdf_has(URL, rdfs:label, literal(lang(Lang, Label))) + -> nonvar(Lang), + \+ label_is_id(Label, Id) + ) + -> format('~q/*"~w"@~w*/', [Value, Label, Lang]) + ; rdf_has(URL, rdfs:label, literal(type(Type, Label))), + nonvar(Type), + \+ label_is_id(Label, Id) + -> ( rdf_global_id(TNS:TId, Type) + -> TVal = TNS:TId + ; TVal = Type + ), + format('~q/*"~w"^^~w*/', [Value, Label, TVal]) + ; rdf_has(URL, rdfs:label, literal(Label)), + atom(Label), + Label \== Id + -> format('~q/*"~w"*/', [Value, Label]) + ) + -> true + ; writeq(Value) + ). +portray_url(ns:label, URL) :- + rdfs_ns_label(URL, Label), + write(Label). + +label_is_id(_, Var) :- + var(Var), !, fail. +label_is_id(Label, Label) :- !. +label_is_id(L0, L1) :- + downcase_atom(L0, Lwr), + downcase_atom(L1, Lwr). +