123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #!/bin/sh
- # -*- scheme -*-
- exec guile -e main -s "$0" "$@"
- !#
- ;; Parser to turn a set of downloaded WoT files into a standard graph format.
- (use-modules (web request)
- (web client)
- (web response)
- (web uri)
- (web http)
- (ice-9 threads)
- (ice-9 vlist)
- (ice-9 rdelim)
- (rnrs io ports)
- (ice-9 match)
- (srfi srfi-42)
- (srfi srfi-1)
- (rnrs bytevectors)
- (sxml simple)
- (sxml match)
- (ice-9 ftw))
- (define (non-breaking-sxml-reader xml-port)
- (catch #t
- (lambda () (xml->sxml xml-port))
- (lambda (key . args) (format #t "~A: ~A" key args)(newline) '())))
- (define (wot-uri-key uri)
- (let ((index (string-index uri #\/)))
- (if index
- (string-take uri index)
- uri))) ;; no / in uri, so it is already a key.
- (define (wot-file-key filename)
- (let* ((pubkey-identifier ",AQACAAE")
- (index (string-contains filename pubkey-identifier)))
- (if index
- (string-take filename (+ index (string-length pubkey-identifier)))
- filename)))
- (define (parse-trust-values filename)
- (let* ((port (open-input-file filename))
- (sxml (non-breaking-sxml-reader port))
- (closed (close-port port))
- (trust '()))
- (let extract-trust ((sxml sxml))
- (match sxml
- (('Trust ('@ ('Value value) ('Identity uri) rest ...))
- (set! trust
- (cons (cons (wot-uri-key uri)
- (string->number value))
- trust)))
- ((a b ...)
- (map extract-trust sxml))
- (else '())))
- (cons (wot-file-key filename) trust)))
- (define* (trust-lists->csv trusts #:key (target-filename #f))
- "Format the list of trust lists as csv file.
- See https://gephi.org/users/supported-graph-formats/csv-format/
- steps:
- - trusting ids: map car trusts
- - additional ids: every ID not in trusting ids.
- Source;Target;Weight
- A;B;0
- B;A;1
- "
- (let ((port (if target-filename
- (open-output-file target-filename)
- (current-output-port)))
- (ids (map car trusts)))
- (display "Source;Target;Weight" port)
- (newline port)
- (let write-edges ((trusts trusts))
- (cond ((null? trusts) #t)
- (else
- (let* ((id (car (car trusts)))
- (trusted (cdr (car trusts))))
- (let write-trust ((trusted trusted))
- (cond ((null? trusted) #t)
- (else
- (let* ((edge (car trusted))
- (trustee (car edge))
- (weight (cdr edge)))
- (when weight ; avoid stumbling over incorrectly formatted trust values
- (format port "~A;~A;~f\n" id trustee weight))
- (write-trust (cdr trusted)))))))
- (write-edges (cdr trusts)))))
- ; (write (car trusts))
- ; (newline)
- (when target-filename (close-port port))))
- (define (main args)
- (let ((dir (if (null? (cdr args))
- "."
- (car (cdr args)))))
- (let* ((select? (lambda (x) (or (equal? x ".") (string-prefix? "USK@" x))))
- (files (cdr (scandir dir select?))))
- (trust-lists->csv
- (par-map parse-trust-values files)
- #:target-filename "trust.csv"))))
|