1 ;;; biditest.el --- test bidi reordering in GNU Emacs display engine.
3 ;; Copyright (C) 2013-2014 Free Software Foundation, Inc.
5 ;; Author: Eli Zaretskii
6 ;; Maintainer: emacs-devel@gnu.org
9 ;; This program is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
14 ;; This program is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
24 ;; Produce a specially-formatted text file from BidiCharacterTest.txt
25 ;; file that is part of the Unicode Standard's UCD package. The file
26 ;; shows the expected results of reordering according to the UBA. The
27 ;; file is supposed to be visited in Emacs, and the resulting display
28 ;; compared with the expected one.
32 (defun biditest-generate-testfile (input-file output-file
)
33 "Generate a bidi test file OUTPUT-FILE from data in INPUT-FILE.
35 INPUT-FILE should be in the format of the BidiCharacterTest.txt file
36 available from the Unicode site, as part of the UCD database, see
37 http://www.unicode.org/Public/UCD/latest/ucd/BidiCharacterTest.txt.
39 The resulting file should be viewed with `inhibit-bidi-mirroring' set to t."
40 (let ((output-buf (get-buffer-create "*biditest-output*"))
44 (message "Generating output in %s ..." output-file
)
45 (setq tbuf
(current-buffer))
46 (insert-file-contents input-file
)
47 (goto-char (point-min))
49 (when (looking-at "^\\([0-9A-F ]+\\);\\([012]\\);\\([01]\\);\\([0-9 ]+\\);\\([0-9 ]+\\)$")
50 (let ((codes (match-string 1))
51 (default-paragraph (match-string 2))
52 (resolved-paragraph (match-string 3))
53 ;; FIXME: Should compare LEVELS with what the display
54 ;; engine actually produced.
55 (levels (match-string 4))
56 (indices (match-string 5)))
57 (setq codes
(split-string codes
" ")
58 indices
(split-string indices
" "))
59 (switch-to-buffer output-buf
)
60 (insert (format "Test on line %d:\n\n" lnum
))
61 ;; Force paragraph direction to what the UCD test
64 ((string= default-paragraph
"0") ;L2R
66 ((string= default-paragraph
"1") ;R2L
69 ;; Insert the characters
71 (insert (string-to-number code
16)))
74 ;; Insert the expected results
75 (insert "Expected result:\n\n")
76 ;; We want the expected results displayed exactly as
77 ;; specified in the test file, without any reordering, so
78 ;; we override the directional properties of all of the
79 ;; characters in the expected result by prepending
81 (cond ((string= resolved-paragraph
"0")
82 (insert #x200e
#x202d
))
83 ((string= resolved-paragraph
"1")
84 (insert #x200f
#x202e
)
85 ;; We need to reverse the list of indices for R2L
86 ;; paragraphs, so that their logical order on
87 ;; display matches user expectations.
88 (setq indices
(nreverse indices
))))
90 (insert (string-to-number
91 (nth (string-to-number index
10) codes
)
94 (insert #x202c
) ; end the embedding
96 (switch-to-buffer tbuf
))
98 (setq lnum
(1+ lnum
)))
99 (switch-to-buffer output-buf
)
100 (let ((coding-system-for-write 'utf-8-unix
))
101 (write-file output-file
))
102 (message "Generating output in %s ... done" output-file
))))
104 (defun biditest-create-test ()
105 "Create a test file for testing the Emacs bidirectional display.
107 The resulting file should be viewed with `inhibit-bidi-mirroring' set to t."
108 (biditest-generate-testfile (pop command-line-args-left
)
109 (or (pop command-line-args-left
)
112 ;; A handy function for displaying the resolved bidi levels.
113 (defun bidi-levels ()
114 "Display the resolved bidirectional levels of characters on current line.
116 The results can be compared with the levels stated in the
117 BidiCharacterTest.txt file."
119 (message "%s" (bidi-resolved-levels)))
121 (define-key global-map
[f8] 'bidi-levels)