1 ;;;; encoding.scm -- font encoding
3 ;;;; source file of the GNU LilyPond music typesetter
5 ;;;; (c) 2004 Jan Nieuwenhuizen <janneke@gnu.org>
8 ;; cp /usr/share/texmf/dvips/base/*.enc mf/out
9 ;; cp /usr/share/texmf/dvips/tetex/*.enc mf/out
11 ;; #(display (reencode-string "adobe" "latin1" "hellö fóebär"))
15 (define (read-encoding-file filename)
16 "Read .enc file, returning a vector of symbols."
17 (let* ((raw (ly:gulp-file filename))
18 (string (regexp-substitute/global #f "%[^\n]*" raw 'pre "" 'post))
19 (start (string-index string #\[))
20 (end (string-index string #\]))
21 (ps-lst (string-tokenize (substring string (+ start 1) end)))
22 (lst (map (lambda (x) (substring x 1)) ps-lst))
23 (vector (list->vector lst)))
27 (define (make-encoding-table encoding-vector)
28 "Return a hash table mapping names to chars. ENCODING-VECTOR is a
31 (let* ((h (make-hash-table 256)))
35 (hash-set! h (vector-ref encoding-vector i)
41 (define-public (reencode-string permutation str)
42 "Apply PERMUTATION, a vector of [0..256) -> char, to STR"
43 (string-map (lambda (chr)
44 (vector-ref permutation (char->integer chr)))
47 (define-public (encoding-permutation input-encoding
50 "Contruct a permutation by applying output-encoding after input-encoding "
55 ((new-char (hash-ref output-encoding
56 (vector-ref input-encoding (char->integer chr)) #f)))
58 ;; substitute space for unknown characters.
65 (define (get-coding-from-file filename)
66 "Read FILENAME, return a list containing encoding vector and table"
69 ((vec (read-encoding-file filename))
70 (tab (make-encoding-table vec)))
75 ;; coding-alist maps NAME -> (list VECTOR TAB)
80 (delay (get-coding-from-file (cdr x)))))
84 ("TeX typewriter text" . "09fbbfac.enc") ;; cmtt10
85 ("TeX math symbols" . "10037936.enc") ;; cmbsy
86 ("ASCII caps and digits" . "1b6d048e") ;; cminch
87 ("TeX math italic" . "aae443f0.enc") ;; cmmi10
88 ("TeX extended ASCII" . "d9b29452.enc")
89 ("TeX text" . "f7b6d320.enc")
90 ("TeX text without f-ligatures" . "0ef0afca.enc")
91 ("Extended TeX Font Encoding - Latin" . "tex256.enc")
95 ;; for testing -- almost adome
97 ("latin1" . "cork.enc")
100 ("feta braces" . "feta-braces0.enc")
101 ("feta number" . "feta-nummer10.enc")
102 ("feta music" . "feta20.enc")
103 ("parmesan music" . "parmesan20.enc"))
106 (define (get-coding coding-name)
107 (force (assoc-get coding-name coding-alist )))
109 (define (get-coding-vector coding-name)
110 (car (get-coding coding-name)))
112 (define (get-coding-table coding-name)
113 (cadr (get-coding coding-name)))
116 ;;; what's this for? --hwn
117 (define-public (encoded-index font-coding input-coding code)
118 (format (current-error-port) "CODE: ~S\n" code)
119 (let* ((font (get-coding-table font-coding))
120 (in (get-coding-vector input-coding))
121 (char (vector-ref in code)))
122 (format (current-error-port) "CHAR: ~S\n" char)
123 (hash-ref font char)))