source: project/release/4/scbib/trunk/modules/bibtex.scm @ 15281

Last change on this file since 15281 was 15281, checked in by Ivan Raikov, 11 years ago

Initial import of scbib, a library for managing bibliographic data.

File size: 2.7 KB
Line 
1;;;
2;;; scbib - a bibliography management system
3;;;
4;;; Copyright (C) 2004 Satoru Takabayashi <satoru@namazu.org>
5;;;     All rights reserved.
6;;;     This is free software with ABSOLUTELY NO WARRANTY.
7;;;
8;;; You can redistribute it and/or modify it under the terms of
9;;; the Gauche's licence.
10;;;
11;;; Ported to Chicken Scheme and modified by Ivan Raikov.
12;;;
13
14(module scbib-bibtex
15
16  (scbib-bibtex-print-item)
17
18  (import scheme chicken regex extras srfi-1 srfi-13)
19
20  (require-extension scbib)
21
22
23(define (scbib-bibtex-print bibitem . rest)
24 (let-optionals rest ((key-style #f) (output-port #t))
25  (define (scbib-bibtex-print-sub bibitem)
26    (define (authors)
27      (let ((authors (scbib-get-authors bibitem)))
28        (cond ((eq? authors #f)
29               "")
30              ((= (length authors) 1)
31               (car authors))
32              (else
33               (string-join authors " and ")))))
34
35    (define (editors)
36      (let ((editors (scbib-values bibitem 'editor)))
37        (cond ((eq? editors #f)
38               #f)
39              ((= (length editors) 1)
40               (car editors))
41              (else
42               (string-join editors " and ")))))
43
44    (define r1 (regexp "#"))
45    (define r2 (regexp "~"))
46    (define r3 (regexp "\\/\\\\~\\{\\}"))
47    (define r4 (regexp "\\/"))
48    (define (escape string)
49      (set! string (string-substitute  r1  "\\#" string #t))
50      (set! string (string-substitute  r2  "\\~{}" string #t))
51      (set! string (string-substitute  r3  "\\slash\\~{}" string #t))
52      (set! string (string-substitute  r4  "{\\slash}" string #t))
53      string)
54
55    (define (get field)
56      (let ((item (scbib-value bibitem field)))
57        (if item
58            (escape item)
59            #f)))
60
61    (define (itemize field-name item)
62      (if item
63          (format #f "    ~a = {~a},\n" field-name item)
64          ""))
65
66    (define (note)
67      (let ((x (get 'note)))
68        (or x (if (equal? (get 'bibtype) "web")
69                  (get 'web)
70                  #f))))
71
72    (format output-port "@~a{~a,\n~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a~a}\n"
73            (let ((bibtype (get 'bibtype)))
74              (if (string=? bibtype "web")
75                  "misc"
76                  bibtype))
77            (scbib-get-abbrev bibitem key-style)
78            (itemize "author" (authors))
79            (itemize "editor" (editors))
80            (itemize "title" (get 'title))
81            (itemize "series" (get 'series))
82            (itemize "edition" (get 'edition))
83            (itemize "publisher" (get 'publisher))
84            (itemize "year" (get 'year))
85
86            (itemize "pages" (get 'pages))
87            (itemize "booktitle" (get 'booktitle))
88            (itemize "organization" (get 'organization))
89            (itemize "address" (get 'address))
90            (itemize "note" (note))
91;           (itemize "month" (get 'month))
92            (itemize "volume" (get 'volume))
93            (itemize "number" (get 'number))
94            (itemize "school" (get 'school))
95            (itemize "journal" (get 'journal)))
96    )
97
98  (scbib-bibtex-print-sub bibitem)))
99
100)
Note: See TracBrowser for help on using the repository browser.