;;; fontset/fc-util.el --- functions for parsing ttf charset output from `fc-query' ;; Author: Noah Friedman ;; Created: 2019-08-06 ;; Public domain. ;; $Id: fc-util.el,v 1.1 2019/08/28 02:02:56 friedman Exp $ ;;; Commentary: ;; charset from: fc-query /usr/share/fonts/google-noto-emoji/NotoEmoji-Regular.ttf ;; ;; (let ((parsed (fc-parse-charmap " ;; 0000: 00000000 03ff0009 00000000 00000000 00000000 00004201 00000000 00000000 ;; 0020: 00000000 10000000 00000200 00000000 00000000 00000000 00000000 00000008 ;; 0021: 00000000 02000004 00000000 00000000 03f00000 00000600 00000000 00000000 ;; 0023: 0c000000 00000000 00000000 00000000 00000000 00000000 00000000 00091e00 ;; 0024: 00000000 00000000 00000000 00000000 00000000 00000000 00000004 00000000 ;; 0025: 00000000 00000000 00000000 00000000 00000000 00400c00 00000401 78000000 ;; 0026: 20324003 04000000 000fff00 88000169 00080000 60000c03 00104030 242c0400 ;; 0027: 00549f24 00180100 00b85090 00000010 00e00000 80010002 00000000 00000000 ;; 0029: 00000000 00300000 00000000 00000000 00000000 00000000 00000000 00000000 ;; 002b: 180000e0 00000000 00210000 00000000 00000000 00000000 00000000 00000000 ;; 0030: 00000000 20010000 00000000 00000000 00000000 00000000 00000000 00000000 ;; 0032: 00000000 00000000 00000000 00000000 02800000 00000000 00000000 00000000 ;; 00fe: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 80000000 ;; 01f0: 00000010 00000000 00000000 00000000 00000000 00000000 00008000 00000000 ;; 01f1: 00000000 00000000 00000000 c0030000 07fe4000 00000000 00000000 ffffffc0 ;; 01f2: 04000006 07fc8000 00030000 00000000 00000000 00000000 00000000 00000000 ;; 01f3: ffffffff ffbf0001 ffffffff 1fffffff 000fffff ffffffff 000007df 0001ffff ;; 01f4: ffffffff 7ffffbff fffffffd ffffffff ffffffff ffffffff ffffffff 1effffff ;; 01f5: ffffffff 3fffffff ffff0000 000000ff 00000000 00000000 00000000 f8000000 ;; 01f6: ffffffff ffffffff 0000ffe1 00000000 feffffff ffffffff 0000003f 00000000 ;; 0fe4: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00007fe0 ;; 0fe8: 00000000 00ffd000 00000000 00000000 00000000 00000000 00000000 00000000"))) ;; (list (fc-make-char-by-plane parsed) ;; (fc-make-printable-fontset-charmap parsed))) ;;; Code: (require 'xsd-regexp) (defun fc-parse-charmap (strblock) (mapcar (lambda (row) (let ((charset) (i 0)) (mapc (lambda (n) (let ((j 32)) (while (not (zerop j)) (unless (zerop (logand n 1)) (push i charset)) (setq i (1+ i) j (1- j) n (lsh n -1))))) (mapcar (lambda (bitmap) (string-to-number bitmap 16)) (cdr row))) (cons (car row) charset))) (mapcar (lambda (line) (let* ((s1 (split-string line ":" t "\\s-+")) (upper (string-to-number (car s1) 16)) (bitmaps (split-string (cadr s1) " " t))) (cons upper bitmaps))) (split-string strblock "\n" t "\\s-+")))) (defun fc-format-range (range) (if (consp range) (if (= (1+ (car range)) (cdr range)) (format "%02x %02x" (car range) (cdr range)) (format "%02x-%02x" (car range) (cdr range))) (format "%02x" range))) (defun fc-make-char-by-plane (parsed) (mapconcat 'identity (mapcar (lambda (row) (format "%04x: %s" (car row) (mapconcat 'fc-format-range ;; destructively modifies list, so copy (xsdre-make-range-list (copy-sequence (cdr row))) " "))) parsed) "\n")) (defun fc-make-fontset-charmap (parsed) (apply 'nconc (mapcar (lambda (elt) (xsdre-make-range-list (copy-sequence elt))) (mapcar (lambda (row) (let ((upper (lsh (car row) 8))) (mapcar (lambda (n) (logior upper n)) (cdr row)))) parsed)))) (defun fc-make-printable-fontset-charmap (parsed) (with-temp-buffer (pp (fc-make-fontset-charmap parsed) (current-buffer)) (goto-char (point-min)) (while (re-search-forward "\\([0-9]+\\)" nil t) (replace-match (format "#x%02X" (string-to-number (matching-substring 1))))) (buffer-string))) (provide 'fontset/fc-util) ;;; fc-util.el ends here.