Threading works, make-dot-id is fixed, but starts at "B"?
[kspaans/nntp-to-dot] / ref-helper.ss
1 #lang scheme
2 (provide get-refs make-dot-id)
3 ;; get-refs: string -> (listof string)
4 ;; Given an NNTP "References:" header line, will extract all Message-IDs in it
5 (define references-regexp #rx"<[^>]*>")
6 (define (get-refs refline)
7   (let [(ref-match (regexp-match references-regexp refline))]
8     (cond
9       [(boolean? ref-match) empty]
10       [else (cons (car ref-match)
11                   (get-refs (substring refline
12                                        ;; Need to only go to the last matching
13                                        ;; index so that we don't go out of range
14                                        (cdar (regexp-match-positions
15                                                references-regexp
16                                                refline)))))])))
17
18 ;; make-dot-id: void -> string
19 ;; Generates a unique dot ID every time it is called, side effect of
20 ;; incrementing an internal counter is used.
21 ;; Turns an integer (internal counter) into a string of uppercase
22 ;; letters
23 (define counter -1)
24 ;;;;
25 (define (num2list num first)
26   (cond [(and (not first) (zero? num)) '()]
27         [else (cons (+ 65 (modulo num 26))
28                     (num2list (quotient num 26) false))]))
29 (define (num2letters num first)
30   (list->string (reverse
31     (map integer->char (num2list num first)))))
32 (define make-dot-id
33   (lambda ()
34       (begin
35         (set! counter (+ 1 counter))
36         (num2letters counter true))))