#!/usr/bin/env python """ com.inamidst.node - Arcs Node Widget Author: Sean B. Palmer, inamidst.com """ import urllib, heapq import trio def parse_value(s): s = s.replace('\\"', '"') s = s.replace('\\t', '\t') s = s.replace('\\r', '\r') s = s.replace('\\n', '\n') return s.decode('unicode-escape') def parse_term(string): if string.startswith('<'): return trio.rdf.URI(parse_value(string[1:-1])) elif string.startswith('_:'): return trio.rdf.BlankNode(string[2:]) elif string.startswith('"'): return trio.rdf.PlainLiteral(parse_value(string[1:-1])) return trio.rdf.URI(parse_value(string)) def serialise_term(term): if isinstance(term, trio.rdf.URI): return '<' + escaped33(term.value.encode('utf-8')) + '>' elif isinstance(term, trio.rdf.BlankNode): return '_:' + term.label.encode('utf-8') elif isinstance(term, trio.rdf.PlainLiteral): return '"' + escaped32(term.lexical) + '"' elif isinstance(term, trio.rdf.TypedLiteral): return '"' + escaped32(term.lexical) + '"' raise ValueError('%r' % term) def racine(arcs, uri): return uri.split('#', 1)[0] def main(arcs, write, params): lib = arcs.library serialised_node = params['about'] rdf_node = parse_term(serialised_node) node = arcs.Node(rdf_node, lib) label = node.label() write(title=label + ' · Arcs → View Facts') write('') write('') write('') write('') write('') write('') write('') write('') write('') write('
') prev = ''' write("""

Browse Web · Show Graph Links

""") ''' write("""

Normal · Facts · Web

""") write('

' + label + '

') write('') pairs = {} for way, pred, sib in node.arcs(): pairs.setdefault((way, pred), set()).add(sib) facts = 0 def attr(uri): uri = urllib.unquote(uri) uri = uri.replace('&', '&') uri = uri.replace('<', '<') uri = uri.replace('>', '>') return uri.replace('"', '"') for i, ((way, pred), sibs) in enumerate(pairs.iteritems()): pred_label = lib.label(pred) if way == '<-': pred_label = '← ' + pred_label if i % 2: write('') else: write('') write('') write('') write('') write('
') write(pred_label) write('') siblings = [] length = len(sibs) for sib in sibs: if isinstance(sib, trio.rdf.PlainLiteral): if sib.language and not sib.language.startswith('en'): # @@ if length > 1: continue facts += 1 if length < 10: sib_label = lib.label(sib, extended=True) else: sib_label = lib.label(sib) chunks = [] for chunk in sib_label.split(' '): if len(chunk) > 50: while chunk: chunks.append(chunk[:50]) chunk = chunk[50:] else: chunks.append(chunk) sib_label = ' '.join(chunks) sib_uri = urllib.quote(str(sib).strip('<>'), safe='/:') siblings.append((sib_label.lower(), sib_label, sib_uri)) siblings = sorted(siblings) for j, (sib_label_lower, sib_label, sib_uri) in enumerate(siblings): write('' + sib_label + '') if j != (len(siblings) - 1): write(', ') write('
') write('
') write('

Sources

') write("""

""") sources = set() for graph_label in lib.manifest[node.node]: s_graph = lib.graphs[graph_label] s_uri = s_graph.docURI s_rdfnode = trio.rdf.URI(unicode(s_uri)) sources.add((s_rdfnode, s_uri)) equivalents = lib.equivalents(node.node) for equivalent in equivalents: s_uri = racine(arcs, str(equivalent).strip('<>')) s_rdfnode = trio.rdf.URI(unicode(s_uri)) sources.add((s_rdfnode, s_uri)) canon = lib.canonicalise(node.node) if len(sources) > 1: write('') write("

Arcs has %s facts about %s.

" % (facts, label)) write('

Key

') write('

' + ' = unknown availability
') write(' ' + ' = probably available source
') write(' ' + ' = probably unavailable source

') write('

' + ' = loaded source
') write(' ' + ' = failed source

') write('
') write('

Alternative Links

') write('

@@

') write('
') write('
') if __name__ == '__main__': print __doc__