]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/encoding.scm
* SConstruct: Further development.
[lilypond.git] / scm / encoding.scm
index 6373e116b73c8547177db1bd260f4f07a3650209..0bd6fc91466675beb6354505336ecc9626f3a265 100644 (file)
 ;;;; (c) 2004 Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;; WIP
-;; cp /usr/share/texmf/dvips/tetex/*.enc mf/out
 ;; encoding.ly:
-;;#(format (current-error-port) "a:~S\n"
-;;  (encoded-index "TeX text" "TeX text" 65))
+;; #(display (reencode-string "adobe" "latin1" "hellö fóebär"))
 ;;
-;;#(format (current-error-port) "b:~S\n"
-;;  (encoded-index "TeX text" "TeX extended ASCII" 176))
-
-(define coding-file-alist
-  ;; teTeX
-  '(("TeX typewriter text" . "09fbbfac.enc") ;; cmtt10
-    ("TeX math symbols" . "10037936.enc") ;; cmbsy
-    ("ASCII caps and digits" . "1b6d048e") ;; cminch
-    ("TeX math italic" . "aae443f0.enc")  ;; cmmi10
-    ("TeX extended ASCII" . "d9b29452.enc")
-    ("TeX text" . "f7b6d320.enc")
-    ("TeX text without f-ligatures" . "0ef0afca.enc")
-    ("Extended TeX Font Encoding - Latin" . "tex256.enc")
+
+
+(define-public (read-encoding-file filename)
+  "Read .enc file, return (COMMAND-NAME . VECTOR-OF-SYMBOLS)."
+  (let* ((raw (ly:gulp-file (ly:kpathsea-expand-path filename)))
+        (string (regexp-substitute/global #f "%[^\n]*" raw 'pre "" 'post))
+        (command (match:substring
+               (string-match "/([^ \t\n\r]*)[ \t\n\r]+[[]" string) 1))
+        (encoding (match:substring (string-match "[[](.*)[]]" string) 1))
+        (ps-lst (string-tokenize encoding))
+        (lst (map (lambda (x) (string->symbol (substring x 1))) ps-lst))
+        (vector (list->vector lst)))
+    (cons command vector)))
+
+(define (make-encoding-table encoding-vector)
+  "Return a hash table mapping names to chars. ENCODING-VECTOR is a
+vector of symbols."
+
+  (let* ((h (make-hash-table 256)))
     
-    ;; LilyPond.
-    ("feta braces" . "feta-braces0.enc")
-    ("feta number" . "feta-nummer10.enc")
-    ("feta music" . "feta20.enc")
-    ("parmesan music" . "parmesan20.enc")))
-
-(define encoding-alist '())
-
-(define (read-coding-file coding)
-  (let* ((string (ly:gulp-file (assoc-get coding coding-file-alist)))
-        ;;(string (ly:gulp-file "f7b6d320.enc"))
-        (start (string-index string #\[))
-        (end (string-index string #\]))
-        (ps-lst (string-tokenize (substring string (+ start 1) end)))
-        (lst (map (lambda (x) (substring x 1)) ps-lst))
-        (vector (list->vector lst))
-        (table (make-hash-table 256)))
-    (do ((i 0 (+ i 1)))
-       ((>= i 256))
-      (hash-create-handle! table (vector-ref vector i) i))
-    (let ((entry (cons coding (cons vector table))))
-      (set! encoding-alist (append (list entry) encoding-alist))
-      (cdr entry))))
-
-(define (get-coding-table coding)
-  (let ((entry (assoc-get coding encoding-alist #f)))
-    (if entry (cdr entry)
-       (cdr (read-coding-file coding)))))
-
-(define (get-coding-vector coding)
-  (let ((entry (assoc-get coding encoding-alist #f)))
-    (if entry (car entry)
-       (car (read-coding-file coding)))))
-
-(define-public (encoded-index font-coding input-coding code)
-  (let* ((font (get-coding-table font-coding))
-        (in (get-coding-vector input-coding))
-        (char (vector-ref in code)))
-    (hash-ref font char)))
+    (for-each
+     (lambda (i)
+       (hash-set! h (vector-ref encoding-vector i)
+                 (integer->char i)))
+     (iota 256))
+
+    h))
+
+(define-public (reencode-string mapping str)
+  "Apply MAPPING, a vector of [0..256) -> char, to STR"
+  (string-map (lambda (chr)
+               (vector-ref mapping (char->integer chr)))
+             str))
+
+(define-public (make-encoding-mapping input-encoding output-encoding)
+  "Contruct a mapping by applying output-encoding after input-encoding "
+  (list->vector
+   (map
+    (lambda (byte)
+      (let ((new-char (hash-ref
+                      output-encoding (vector-ref input-encoding byte) #f)))
+                      ;;input-encoding (vector-ref output-encoding byte) #f)))
+
+       ;; substitute space for unknown characters.
+       (if (char? new-char)
+           new-char
+           #\ )))
+    (iota 256))))
+
+
+(define (get-coding-from-file filename)
+  "Read FILENAME, return a list containing encoding vector and table"
+   (let* ((coding (read-encoding-file filename))
+         (com (car coding))
+         (vec (cdr coding))
+         (tab (make-encoding-table vec)))
+    (list com vec tab)))
+
+;; coding-alist maps NAME -> (list FILENAME COMMAND VECTOR TAB)
+(define coding-alist
+  
+  (map (lambda (x)
+        (cons (car x)
+              (cons (cdr x) (delay (get-coding-from-file (cdr x))))))
+       
+       '(
+        ;; teTeX
+        ("TeX-typewriter-text" . "09fbbfac.enc") ;; cmtt10
+        ("TeX-math-symbols" . "10037936.enc") ;; cmbsy
+        ("ASCII-caps-and-digits" . "1b6d048e.enc") ;; cminch
+        ("TeX-math-italic" . "aae443f0.enc")  ;; cmmi10
+        ("TeX-extended-ASCII" . "d9b29452.enc")
+        ("TeX-text" . "cmr.enc")
+        ("TeX-text-without-f-ligatures" . "0ef0afca.enc")
+        ("Extended-TeX-Font-Encoding---Latin" . "tex256.enc")
+        ("AdobeStandardEncoding" . "8a.enc")
+
+        ;; aliases
+        ("T1" . "tex256.enc")
+        ("adobe" . "8a.enc")
+        ("latin1" . "latin1.enc")
+        ("ec" . "EC.enc")
+        
+        ;; LilyPond.
+        ("fetaBraces" . "feta-braces-a.enc")
+        ("fetaNumber" . "feta-nummer10.enc")
+        ("fetaMusic" . "feta20.enc")
+        ("parmesanMusic" . "parmesan20.enc"))
+       ))
+
+(define (get-coding coding-name)
+  (let ((entry (assoc-get coding-name coding-alist)))
+    (if entry (cons (car entry) (force (cdr entry)))
+       (if (equal? coding-name "feta-music")
+           (begin
+             (ly:warn "installation problem: deprecated encoding requested: ~S" coding-name)
+             (exit 1))
+       (let ((fallback "latin1"))
+         (ly:warn "programming error: no such encoding: ~S" coding-name)
+         (ly:warn "programming error: cross thumbs, using: ~S:" fallback)
+         (get-coding fallback))))))
+
+(define-public (get-coding-filename coding-name)
+  (car (get-coding coding-name)))
+
+(define-public (get-coding-command coding-name)
+  (cadr (get-coding coding-name)))
+
+(define-public (get-coding-vector coding-name)
+  (caddr (get-coding coding-name)))
 
+(define-public (get-coding-table coding-name)
+  (cadddr (get-coding coding-name)))