clucumber 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +1 -1
- data/README.md +4 -9
- data/lib/clucumber/clucumber-bootstrap.lisp +32 -0
- data/lib/clucumber/vendor/cl-interpol/alias.lisp +55 -0
- data/lib/clucumber/vendor/cl-interpol/cl-interpol.asd +56 -0
- data/lib/clucumber/vendor/cl-interpol/load.lisp +53 -0
- data/lib/clucumber/vendor/cl-interpol/packages.lisp +40 -0
- data/lib/clucumber/vendor/cl-interpol/read.lisp +716 -0
- data/lib/clucumber/vendor/cl-interpol/specials.lisp +113 -0
- data/lib/clucumber/vendor/cl-interpol/test/packages.lisp +34 -0
- data/lib/clucumber/vendor/cl-interpol/test/tests.lisp +128 -0
- data/lib/clucumber/vendor/cl-interpol/test.lisp +177 -0
- data/lib/clucumber/vendor/cl-interpol/test2.lisp +6254 -0
- data/lib/clucumber/vendor/cl-interpol/unicode.lisp +13912 -0
- data/lib/clucumber/vendor/cl-interpol/util.lisp +122 -0
- data/lib/clucumber/vendor/cl-ppcre/api.lisp +1262 -0
- data/lib/clucumber/vendor/cl-ppcre/charmap.lisp +152 -0
- data/lib/clucumber/vendor/cl-ppcre/charset.lisp +242 -0
- data/lib/clucumber/vendor/cl-ppcre/chartest.lisp +98 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-test.asd +34 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/packages.lisp +38 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode/resolver.lisp +61 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre-unicode.asd +58 -0
- data/lib/clucumber/vendor/cl-ppcre/cl-ppcre.asd +79 -0
- data/lib/clucumber/vendor/cl-ppcre/closures.lisp +471 -0
- data/lib/clucumber/vendor/cl-ppcre/convert.lisp +875 -0
- data/lib/clucumber/vendor/cl-ppcre/errors.lisp +84 -0
- data/lib/clucumber/vendor/cl-ppcre/lexer.lisp +737 -0
- data/lib/clucumber/vendor/cl-ppcre/lispworks-defsystem.lisp +57 -0
- data/lib/clucumber/vendor/cl-ppcre/load.lisp +67 -0
- data/lib/clucumber/vendor/cl-ppcre/optimize.lisp +578 -0
- data/lib/clucumber/vendor/cl-ppcre/packages.lisp +68 -0
- data/lib/clucumber/vendor/cl-ppcre/parser.lisp +319 -0
- data/lib/clucumber/vendor/cl-ppcre/ppcre-tests.lisp +269 -0
- data/lib/clucumber/vendor/cl-ppcre/regex-class-util.lisp +555 -0
- data/lib/clucumber/vendor/cl-ppcre/regex-class.lisp +259 -0
- data/lib/clucumber/vendor/cl-ppcre/repetition-closures.lisp +833 -0
- data/lib/clucumber/vendor/cl-ppcre/scanner.lisp +506 -0
- data/lib/clucumber/vendor/cl-ppcre/specials.lisp +172 -0
- data/lib/clucumber/vendor/cl-ppcre/test/packages.lisp +37 -0
- data/lib/clucumber/vendor/cl-ppcre/test/perl-tests.lisp +150 -0
- data/lib/clucumber/vendor/cl-ppcre/test/tests.lisp +159 -0
- data/lib/clucumber/vendor/cl-ppcre/test/unicode-tests.lisp +80 -0
- data/lib/clucumber/vendor/cl-ppcre/util.lisp +201 -0
- data/lib/clucumber/vendor/cl-unicode/alias.lisp +135 -0
- data/lib/clucumber/vendor/cl-unicode/api.lisp +412 -0
- data/lib/clucumber/vendor/cl-unicode/build/char-info.lisp +133 -0
- data/lib/clucumber/vendor/cl-unicode/build/dump.lisp +239 -0
- data/lib/clucumber/vendor/cl-unicode/build/read.lisp +280 -0
- data/lib/clucumber/vendor/cl-unicode/build/util.lisp +182 -0
- data/lib/clucumber/vendor/cl-unicode/cl-unicode.asd +90 -0
- data/lib/clucumber/vendor/cl-unicode/conditions.lisp +54 -0
- data/lib/clucumber/vendor/cl-unicode/derived.lisp +120 -0
- data/lib/clucumber/vendor/cl-unicode/hash-tables.lisp +20 -0
- data/lib/clucumber/vendor/cl-unicode/lists.lisp +10 -0
- data/lib/clucumber/vendor/cl-unicode/methods.lisp +15 -0
- data/lib/clucumber/vendor/cl-unicode/packages.lisp +76 -0
- data/lib/clucumber/vendor/cl-unicode/specials.lisp +135 -0
- data/lib/clucumber/vendor/cl-unicode/test/packages.lisp +34 -0
- data/lib/clucumber/vendor/cl-unicode/test/tests.lisp +150 -0
- data/lib/clucumber/vendor/cl-unicode/test-functions.lisp +94 -0
- data/lib/clucumber/vendor/cl-unicode/util.lisp +274 -0
- data/lib/clucumber/vendor/lift/compare/fiveam-tests.lisp +14 -0
- data/lib/clucumber/vendor/lift/compare/lift-tests.lisp +13 -0
- data/lib/clucumber/vendor/lift/compare/rt-tests.lisp +16 -0
- data/lib/clucumber/vendor/lift/compare/xlunit-tests.lisp +15 -0
- data/lib/clucumber/vendor/lift/dev/changes.lisp +61 -0
- data/lib/clucumber/vendor/lift/dev/config.lisp +354 -0
- data/lib/clucumber/vendor/lift/dev/copy-file.lisp +117 -0
- data/lib/clucumber/vendor/lift/dev/introspection.lisp +232 -0
- data/lib/clucumber/vendor/lift/dev/lift-interface.lisp +56 -0
- data/lib/clucumber/vendor/lift/dev/lift-notes.lisp +202 -0
- data/lib/clucumber/vendor/lift/dev/lift-randomized.lisp +45 -0
- data/lib/clucumber/vendor/lift/dev/lift.lisp +2383 -0
- data/lib/clucumber/vendor/lift/dev/macros.lisp +229 -0
- data/lib/clucumber/vendor/lift/dev/measuring.lisp +156 -0
- data/lib/clucumber/vendor/lift/dev/packages.lisp +161 -0
- data/lib/clucumber/vendor/lift/dev/port.lisp +151 -0
- data/lib/clucumber/vendor/lift/dev/prototypes.lisp +282 -0
- data/lib/clucumber/vendor/lift/dev/random-testing.lisp +124 -0
- data/lib/clucumber/vendor/lift/dev/report-locations.lisp +13 -0
- data/lib/clucumber/vendor/lift/dev/reports.lisp +916 -0
- data/lib/clucumber/vendor/lift/dev/utilities.lisp +242 -0
- data/lib/clucumber/vendor/lift/docs/package.lisp +6 -0
- data/lib/clucumber/vendor/lift/docs/setup.lisp +17 -0
- data/lib/clucumber/vendor/lift/examples/basic-examples.lisp +289 -0
- data/lib/clucumber/vendor/lift/examples/random-testing.lisp +32 -0
- data/lib/clucumber/vendor/lift/lift-documentation.asd +28 -0
- data/lib/clucumber/vendor/lift/lift-test.asd +35 -0
- data/lib/clucumber/vendor/lift/lift.asd +77 -0
- data/lib/clucumber/vendor/lift/test/equality-tests.lisp +40 -0
- data/lib/clucumber/vendor/lift/test/finding-tests.lisp +32 -0
- data/lib/clucumber/vendor/lift/test/lift-test.lisp +783 -0
- data/lib/clucumber/vendor/lift/test/order-of-operations.lisp +54 -0
- data/lib/clucumber/vendor/lift/test/packages.lisp +17 -0
- data/lib/clucumber/vendor/lift/test/test-config-files.lisp +20 -0
- data/lib/clucumber/vendor/lift/test/test-dynamic-variables.lisp +57 -0
- data/lib/clucumber/vendor/lift/test/test-maximum-problems.lisp +74 -0
- data/lib/clucumber/vendor/lift/test/test-prototypes.lisp +278 -0
- data/lib/clucumber/vendor/lift/test/test-timeout.lisp +37 -0
- data/lib/clucumber/vendor/lift/test/tests-in-progress.lisp +62 -0
- data/lib/clucumber/vendor/lift/test/testsuite-expects.lisp +60 -0
- data/lib/clucumber/vendor/lift/timeout/package.lisp +13 -0
- data/lib/clucumber/vendor/lift/timeout/with-timeout.lisp +123 -0
- data/lib/clucumber/vendor/lift/website/stuff/Temp.lisp +34 -0
- data/lib/clucumber/vendor/st-json/st-json.asd +3 -0
- data/lib/clucumber/vendor/st-json/st-json.lisp +310 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/backtrace.lisp +127 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/fallback.lisp +10 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/map-backtrace.lisp +103 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/mucking.lisp +75 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/packages.lisp +13 -0
- data/lib/clucumber/vendor/trivial-backtrace/dev/utilities.lisp +104 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/packages.lisp +5 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/test-setup.lisp +4 -0
- data/lib/clucumber/vendor/trivial-backtrace/test/tests.lisp +16 -0
- data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace-test.asd +22 -0
- data/lib/clucumber/vendor/trivial-backtrace/trivial-backtrace.asd +35 -0
- data/lib/clucumber/vendor/usocket/backend/allegro.lisp +199 -0
- data/lib/clucumber/vendor/usocket/backend/armedbear.lisp +491 -0
- data/lib/clucumber/vendor/usocket/backend/clisp.lisp +260 -0
- data/lib/clucumber/vendor/usocket/backend/cmucl.lisp +266 -0
- data/lib/clucumber/vendor/usocket/backend/lispworks.lisp +741 -0
- data/lib/clucumber/vendor/usocket/backend/mcl.lisp +369 -0
- data/lib/clucumber/vendor/usocket/backend/openmcl.lisp +206 -0
- data/lib/clucumber/vendor/usocket/backend/sbcl.lisp +424 -0
- data/lib/clucumber/vendor/usocket/backend/scl.lisp +261 -0
- data/lib/clucumber/vendor/usocket/condition.lisp +227 -0
- data/lib/clucumber/vendor/usocket/package.lisp +82 -0
- data/lib/clucumber/vendor/usocket/server.lisp +45 -0
- data/lib/clucumber/vendor/usocket/test/package.lisp +13 -0
- data/lib/clucumber/vendor/usocket/test/test-usocket.lisp +166 -0
- data/lib/clucumber/vendor/usocket/usocket-test.asd +26 -0
- data/lib/clucumber/vendor/usocket/usocket.asd +37 -0
- data/lib/clucumber/vendor/usocket/usocket.lisp +542 -0
- data/lib/clucumber/vendor/usocket/vendor/kqueue.lisp +1 -0
- data/lib/clucumber/vendor/usocket/vendor/split-sequence.lisp +245 -0
- data/lib/clucumber.rb +29 -7
- metadata +151 -5
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/alias.lisp,v 1.8 2008/07/21 20:04:13 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
|
5
|
+
|
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
|
8
|
+
;;; are met:
|
|
9
|
+
|
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
|
16
|
+
;;; provided with the distribution.
|
|
17
|
+
|
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
|
|
30
|
+
(in-package :cl-unicode)
|
|
31
|
+
|
|
32
|
+
(defvar *alias-map*
|
|
33
|
+
'(("L" . "Letter")
|
|
34
|
+
("LC" . "CasedLetter")
|
|
35
|
+
("Lu" . "UppercaseLetter")
|
|
36
|
+
("Ll" . "LowercaseLetter")
|
|
37
|
+
("Lt" . "TitlecaseLetter")
|
|
38
|
+
("Lm" . "ModifierLetter")
|
|
39
|
+
("Lo" . "OtherLetter")
|
|
40
|
+
("M" . "Mark")
|
|
41
|
+
("Mn" . "NonspacingMark")
|
|
42
|
+
("Mc" . "SpacingMark")
|
|
43
|
+
("Me" . "EnclosingMark")
|
|
44
|
+
("N" . "Number")
|
|
45
|
+
("Nd" . "DecimalNumber")
|
|
46
|
+
("Nl" . "LetterNumber")
|
|
47
|
+
("No" . "OtherNumber")
|
|
48
|
+
("P" . "Punctuation")
|
|
49
|
+
("Pc" . "ConnectorPunctuation")
|
|
50
|
+
("Pd" . "DashPunctuation")
|
|
51
|
+
("Ps" . "OpenPunctuation")
|
|
52
|
+
("Pe" . "ClosePunctuation")
|
|
53
|
+
("Pi" . "InitialPunctuation")
|
|
54
|
+
("Pf" . "FinalPunctuation")
|
|
55
|
+
("Po" . "OtherPunctuation")
|
|
56
|
+
("S" . "Symbol")
|
|
57
|
+
("Sm" . "MathSymbol")
|
|
58
|
+
("Sc" . "CurrencySymbol")
|
|
59
|
+
("Sk" . "ModifierSymbol")
|
|
60
|
+
("So" . "OtherSymbol")
|
|
61
|
+
("Z" . "Separator")
|
|
62
|
+
("Zs" . "SpaceSeparator")
|
|
63
|
+
("Zl" . "LineSeparator")
|
|
64
|
+
("Zp" . "ParagraphSeparator")
|
|
65
|
+
("C" . "Other")
|
|
66
|
+
("Cc" . "Control")
|
|
67
|
+
("Cf" . "Format")
|
|
68
|
+
("Cs" . "Surrogate")
|
|
69
|
+
("Co" . "PrivateUse")
|
|
70
|
+
("Cn" . "Unassigned")
|
|
71
|
+
("Cn" . "NoncharacterCodePoint")))
|
|
72
|
+
|
|
73
|
+
(defvar *bidi-alias-map*
|
|
74
|
+
'(("L" . "LeftToRight")
|
|
75
|
+
("LRE" . "LeftToRightEmbedding")
|
|
76
|
+
("LRO" . "LeftToRightOverride")
|
|
77
|
+
("R" . "RightToLeft")
|
|
78
|
+
("AL" . "RightToLeftArabic")
|
|
79
|
+
("RLE" . "RightToLeftEmbedding")
|
|
80
|
+
("RLO" . "RightToLeftOverride")
|
|
81
|
+
("PDF" . "PopDirectionalFormat")
|
|
82
|
+
("EN" . "EuropeanNumber")
|
|
83
|
+
("ES" . "EuropeanNumberSeparator")
|
|
84
|
+
("ET" . "EuropeanNumberTerminator")
|
|
85
|
+
("AN" . "ArabicNumber")
|
|
86
|
+
("CS" . "CommonNumberSeparator")
|
|
87
|
+
("NSM" . "NonSpacingMark")
|
|
88
|
+
("BN" . "BoundaryNeutral")
|
|
89
|
+
("B" . "ParagraphSeparator")
|
|
90
|
+
("S" . "SegmentSeparator")
|
|
91
|
+
("WS" . "Whitespace")
|
|
92
|
+
("ON" . "OtherNeutral")))
|
|
93
|
+
|
|
94
|
+
(defun create-alias (new-name old-name &optional only-if-unambiguous)
|
|
95
|
+
(setq new-name (canonicalize-name new-name)
|
|
96
|
+
old-name (canonicalize-name old-name))
|
|
97
|
+
(unless only-if-unambiguous
|
|
98
|
+
(assert (null (gethash new-name *property-map*)) (new-name)
|
|
99
|
+
"There is already a property named ~S." new-name))
|
|
100
|
+
(when (gethash new-name *property-map*)
|
|
101
|
+
(return-from create-alias))
|
|
102
|
+
(assert (gethash old-name *property-map*) (old-name)
|
|
103
|
+
"There is no property named ~S." old-name)
|
|
104
|
+
(setf (gethash new-name *property-map*)
|
|
105
|
+
(gethash old-name *property-map*)))
|
|
106
|
+
|
|
107
|
+
(defun create-aliases ()
|
|
108
|
+
(loop for (old-name . new-name) in *alias-map*
|
|
109
|
+
do (create-alias new-name old-name))
|
|
110
|
+
(loop for (old-name . new-name) in *bidi-alias-map*
|
|
111
|
+
do (create-alias (format nil "BidiClass:~A" new-name)
|
|
112
|
+
(format nil "BidiClass:~A" old-name)))
|
|
113
|
+
(loop for name in (scripts)
|
|
114
|
+
do (create-alias (format nil "Script:~A" name) name))
|
|
115
|
+
(loop for name in (loop for name being the hash-keys of *property-map*
|
|
116
|
+
collect name)
|
|
117
|
+
unless (ppcre:scan ":" name)
|
|
118
|
+
do (create-alias (format nil "Is~A" name) name))
|
|
119
|
+
(loop for name in (code-blocks)
|
|
120
|
+
do (create-alias (format nil "In~A" name) (format nil "Block:~A" name)))
|
|
121
|
+
(loop for name in (code-blocks)
|
|
122
|
+
do (create-alias name (format nil "Block:~A" name) t))
|
|
123
|
+
(loop for name in (bidi-classes)
|
|
124
|
+
do (create-alias name (format nil "BidiClass:~A" name) t))
|
|
125
|
+
(loop for (old-name . new-name) in *bidi-alias-map*
|
|
126
|
+
do (create-alias new-name (format nil "BidiClass:~A" old-name) t)))
|
|
127
|
+
|
|
128
|
+
(defun build-all-property-tests ()
|
|
129
|
+
(clrhash *property-map*)
|
|
130
|
+
(clrhash *property-tests*)
|
|
131
|
+
(install-tests)
|
|
132
|
+
(build-derived-test-functions)
|
|
133
|
+
(create-aliases))
|
|
134
|
+
|
|
135
|
+
(build-all-property-tests)
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/api.lisp,v 1.31 2008/07/24 14:46:20 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
|
5
|
+
|
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
|
8
|
+
;;; are met:
|
|
9
|
+
|
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
|
16
|
+
;;; provided with the distribution.
|
|
17
|
+
|
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
|
|
30
|
+
(in-package :cl-unicode)
|
|
31
|
+
|
|
32
|
+
(defgeneric unicode-name (c)
|
|
33
|
+
(:documentation "Returns the Unicode name of a character as a string
|
|
34
|
+
or NIL if there is no name for that particular character. C can be
|
|
35
|
+
the character's code point \(a positive integer) or a \(Lisp)
|
|
36
|
+
character assuming its character code is also its Unicode code
|
|
37
|
+
point.")
|
|
38
|
+
(:method ((char character))
|
|
39
|
+
(unicode-name (char-code char)))
|
|
40
|
+
(:method ((code-point integer))
|
|
41
|
+
(or (gethash code-point *code-points-to-names*)
|
|
42
|
+
(maybe-compute-hangul-syllable-name code-point)
|
|
43
|
+
(maybe-compute-cjk-name code-point))))
|
|
44
|
+
|
|
45
|
+
(defgeneric unicode1-name (c)
|
|
46
|
+
(:documentation "Returns the Unicode 1.0 name of a character as a
|
|
47
|
+
string or NIL if there is no name for that particular character. This
|
|
48
|
+
name is only non-NIL if it is significantly different from the Unicode
|
|
49
|
+
name (see UNICODE-NAME). For control characters, sometimes the ISO
|
|
50
|
+
6429 name is returned instead.
|
|
51
|
+
|
|
52
|
+
C can be the character's code point \(a positive integer) or a \(Lisp)
|
|
53
|
+
character assuming its character code is also its Unicode code
|
|
54
|
+
point.")
|
|
55
|
+
(:method ((char character))
|
|
56
|
+
(unicode1-name (char-code char)))
|
|
57
|
+
(:method ((code-point integer))
|
|
58
|
+
(values (gethash code-point *code-points-to-unicode1-names*))))
|
|
59
|
+
|
|
60
|
+
(defun character-named (name &key
|
|
61
|
+
want-code-point-p
|
|
62
|
+
(try-unicode1-names-p *try-unicode1-names-p*)
|
|
63
|
+
(try-abbreviations-p *try-abbreviations-p*)
|
|
64
|
+
(scripts-to-try *scripts-to-try*)
|
|
65
|
+
(try-hex-notation-p *try-hex-notation-p*)
|
|
66
|
+
(try-lisp-names-p *try-lisp-names-p*))
|
|
67
|
+
"Returns the character which has the name NAME \(a string) by
|
|
68
|
+
looking up the Unicode name \(see UNICODE-NAME).
|
|
69
|
+
|
|
70
|
+
If TRY-UNICODE1-NAMES is true, the Unicode 1.0 name \(see
|
|
71
|
+
UNICODE1-NAME) will be used as a fallback.
|
|
72
|
+
|
|
73
|
+
If TRY-ABBREVIATIONS-P is true, NAME is treated as an abbreviation as
|
|
74
|
+
follows: If NAME contains a colon, it is interpreted as
|
|
75
|
+
\"<script>:<short-name>\" and the function tries to look up, in turn,
|
|
76
|
+
the characters named \"<script> <size> LETTER <short-name>\",
|
|
77
|
+
\"<script> LETTER <short-name>\", and \"<script> <short-name>\" where
|
|
78
|
+
<size> is \"SMALL\" if none of the characters in <short-name> is
|
|
79
|
+
uppercase, \"CAPITAL\" otherwise. If NAME does not contain a colon,
|
|
80
|
+
the same algorithm as above is tried with NAME instead of <short-name>
|
|
81
|
+
and each element of the list of strings SCRIPTS-TO-TRY as <string>.
|
|
82
|
+
\(SCRIPTS-TO-TRY can also be a single string which is interpreted as a
|
|
83
|
+
one-element list.)
|
|
84
|
+
|
|
85
|
+
If TRY-HEX-NOTATION-P is true, NAME can be of the form \"U+<x>\" where
|
|
86
|
+
<x> is a hexadecimal number with four to six digits with the obvious
|
|
87
|
+
meaning.
|
|
88
|
+
|
|
89
|
+
If TRY-LISP-NAMES-P is true, the function returns the character with
|
|
90
|
+
the character name NAME \(if there is one) or, if NAME is exactly one
|
|
91
|
+
character, it returns this character.
|
|
92
|
+
|
|
93
|
+
All the keyword-governed alternatives are tried in the order they're
|
|
94
|
+
described here.
|
|
95
|
+
|
|
96
|
+
See also *TRY-UNICODE1-NAMES-P*, *TRY-ABBREVIATIONS-P*,
|
|
97
|
+
*SCRIPTS-TO-TRY*, *TRY-HEX-NOTATION-P*, and *TRY-LISP-NAMES-P*.
|
|
98
|
+
|
|
99
|
+
Returns the code point instead of the character if WANT-CODE-POINT-P
|
|
100
|
+
is true. This can be especially useful for Lisp implementations where
|
|
101
|
+
CHAR-CODE-LIMIT is smaller than +CODE-POINT-LIMIT+."
|
|
102
|
+
(when (stringp scripts-to-try)
|
|
103
|
+
(setq scripts-to-try (list scripts-to-try)))
|
|
104
|
+
(let* ((canonicalized-name (canonicalize-name name))
|
|
105
|
+
(code-point (or (gethash canonicalized-name *names-to-code-points*)
|
|
106
|
+
(maybe-find-hangul-syllable-code-point canonicalized-name)
|
|
107
|
+
(maybe-find-cjk-code-point canonicalized-name)
|
|
108
|
+
(and try-unicode1-names-p
|
|
109
|
+
(gethash canonicalized-name *unicode1-names-to-code-points*))
|
|
110
|
+
(and try-abbreviations-p
|
|
111
|
+
(let ((*try-unicode1-names-p* try-unicode1-names-p)
|
|
112
|
+
(*try-abbreviations-p* nil))
|
|
113
|
+
(try-abbreviations name scripts-to-try)))
|
|
114
|
+
(and try-hex-notation-p
|
|
115
|
+
(ppcre:register-groups-bind ((#'parse-hex code-point))
|
|
116
|
+
("^U\\+([a-zA-Z0-9]{4,6})$" name)
|
|
117
|
+
(and (< code-point +code-point-limit+)
|
|
118
|
+
code-point)))
|
|
119
|
+
(and try-lisp-names-p
|
|
120
|
+
(case (length name)
|
|
121
|
+
(1 (char-code (char name 0)))
|
|
122
|
+
(otherwise (let ((char (name-char name)))
|
|
123
|
+
(and char (char-code char)))))))))
|
|
124
|
+
(if want-code-point-p
|
|
125
|
+
code-point
|
|
126
|
+
(and code-point (code-char code-point)))))
|
|
127
|
+
|
|
128
|
+
(defgeneric script (c)
|
|
129
|
+
(:documentation "Returns the script of a character as a string or
|
|
130
|
+
NIL if there is no script for that particular character. C can be the
|
|
131
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
132
|
+
assuming its character code is also its Unicode code point. The
|
|
133
|
+
second return value \(if there is one) is the property symbol of the
|
|
134
|
+
script.
|
|
135
|
+
|
|
136
|
+
See also SCRIPTS.")
|
|
137
|
+
(:method ((char character))
|
|
138
|
+
(script (char-code char))))
|
|
139
|
+
|
|
140
|
+
(defgeneric code-block (c)
|
|
141
|
+
(:documentation "Returns the block of a character as a string or NIL
|
|
142
|
+
if there is no block for that particular character. C can be the
|
|
143
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
144
|
+
assuming its character code is also its Unicode code point. The
|
|
145
|
+
second return value \(if there is one) is the property symbol of the
|
|
146
|
+
block.
|
|
147
|
+
|
|
148
|
+
See also CODE-BLOCKS.")
|
|
149
|
+
(:method ((char character))
|
|
150
|
+
(code-block (char-code char))))
|
|
151
|
+
|
|
152
|
+
(defgeneric age (c)
|
|
153
|
+
(:documentation "Returns the \"age\" of a character or NIL if there
|
|
154
|
+
is no age entry for that particular character. The age of a character
|
|
155
|
+
is a list of two integers denoting the major and minor number of the
|
|
156
|
+
Unicode version where the character first appeared. C can be the
|
|
157
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
158
|
+
assuming its character code is also its Unicode code point.")
|
|
159
|
+
(:method ((char character))
|
|
160
|
+
(age (char-code char))))
|
|
161
|
+
|
|
162
|
+
(defgeneric general-category (c)
|
|
163
|
+
(:documentation "Returns the general category of a character as a
|
|
164
|
+
string. C can be the character's code point \(a positive integer) or
|
|
165
|
+
a \(Lisp) character assuming its character code is also its Unicode
|
|
166
|
+
code point. The second return value is the property symbol of the
|
|
167
|
+
category.
|
|
168
|
+
|
|
169
|
+
See also GENERAL-CATEGORIES.")
|
|
170
|
+
(:method :around (c)
|
|
171
|
+
(multiple-value-bind (name symbol)
|
|
172
|
+
(call-next-method)
|
|
173
|
+
(cond (name (values name symbol))
|
|
174
|
+
(t (values "Cn" '#.(property-symbol "Cn"))))))
|
|
175
|
+
(:method ((char character))
|
|
176
|
+
(general-category (char-code char))))
|
|
177
|
+
|
|
178
|
+
(defgeneric bidi-class (c)
|
|
179
|
+
(:documentation "Returns the bidirectional \(\"Bidi\") class of a
|
|
180
|
+
character as a string or NIL if there is no bidirectional class for
|
|
181
|
+
that particular character. C can be the character's code point \(a
|
|
182
|
+
positive integer) or a \(Lisp) character assuming its character code
|
|
183
|
+
is also its Unicode code point. The second return value \(if there is
|
|
184
|
+
one) is the property symbol of the class.
|
|
185
|
+
|
|
186
|
+
See also BIDI-CLASSES")
|
|
187
|
+
(:method ((char character))
|
|
188
|
+
(bidi-class (char-code char))))
|
|
189
|
+
|
|
190
|
+
(defun bidi-mirroring-glyph (c &key want-code-point-p)
|
|
191
|
+
"Returns the Bidi mirroring glyph for a character if the character
|
|
192
|
+
has the \"BidiMirrored\" property and an appropriate mirroring glyph
|
|
193
|
+
is defined. C can be the character's code point \(a positive integer)
|
|
194
|
+
or a \(Lisp) character assuming its character code is also its Unicode
|
|
195
|
+
code point.
|
|
196
|
+
|
|
197
|
+
Returns the code point instead of the character if WANT-CODE-POINT-P
|
|
198
|
+
is true. This can be especially useful for Lisp implementations where
|
|
199
|
+
CHAR-CODE-LIMIT is smaller than +CODE-POINT-LIMIT+."
|
|
200
|
+
(let ((code-point (bidi-mirroring-glyph% (ensure-code-point c))))
|
|
201
|
+
(cond ((and code-point (not want-code-point-p))
|
|
202
|
+
(code-char code-point))
|
|
203
|
+
(t code-point))))
|
|
204
|
+
|
|
205
|
+
(defgeneric numeric-type (c)
|
|
206
|
+
(:documentation "Returns the numeric type of a character as a string
|
|
207
|
+
or NIL if that particular character has no numeric type. C can be the
|
|
208
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
209
|
+
assuming its character code is also its Unicode code point. The
|
|
210
|
+
second return value \(if there is one) is the property symbol of the
|
|
211
|
+
numeric type.")
|
|
212
|
+
(:method ((char character))
|
|
213
|
+
(numeric-type (char-code char))))
|
|
214
|
+
|
|
215
|
+
(defgeneric numeric-value (c)
|
|
216
|
+
(:documentation "Returns the numeric value of a character as a Lisp
|
|
217
|
+
rational or NIL \(for NaN). C can be the character's code point \(a
|
|
218
|
+
positive integer) or a \(Lisp) character assuming its character code
|
|
219
|
+
is also its Unicode code point.")
|
|
220
|
+
(:method ((char character))
|
|
221
|
+
(numeric-value (char-code char))))
|
|
222
|
+
|
|
223
|
+
(defgeneric combining-class (c)
|
|
224
|
+
(:documentation "Returns the combining class of a character as a
|
|
225
|
+
non-negative integer. C can be the character's code point \(a
|
|
226
|
+
positive integer) or a \(Lisp) character assuming its character code
|
|
227
|
+
is also its Unicode code point.")
|
|
228
|
+
(:method :around (c)
|
|
229
|
+
(or (call-next-method) 0))
|
|
230
|
+
(:method ((char character))
|
|
231
|
+
(combining-class (char-code char))))
|
|
232
|
+
|
|
233
|
+
(defgeneric has-binary-property (c property)
|
|
234
|
+
(:documentation "Checks whether a character has the binary property
|
|
235
|
+
PROPERTY. C can be the character's code point \(a positive integer)
|
|
236
|
+
or a \(Lisp) character assuming its character code is also its Unicode
|
|
237
|
+
code point. PROPERTY can be a string naming the property or the
|
|
238
|
+
corresponding property symbol. If a true value is returned, it is the
|
|
239
|
+
property symbol.
|
|
240
|
+
|
|
241
|
+
See also BINARY-PROPERTIES.")
|
|
242
|
+
(:method ((char character) property)
|
|
243
|
+
(has-binary-property (char-code char) property))
|
|
244
|
+
(:method (char (property-name string))
|
|
245
|
+
(has-binary-property char (property-symbol property-name)))
|
|
246
|
+
(:method ((code-point integer) (property-symbol symbol))
|
|
247
|
+
(find property-symbol (binary-props code-point) :test #'eq)))
|
|
248
|
+
|
|
249
|
+
(defun uppercase-mapping (c &key want-code-point-p)
|
|
250
|
+
"Returns the simple uppercase mapping of a character. C can be the
|
|
251
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
252
|
+
assuming its character code is also its Unicode code point. Returns
|
|
253
|
+
the character itself if no such mapping is explicitly defined. Note
|
|
254
|
+
that case mapping only makes sense for characters with the \"LC\"
|
|
255
|
+
property.
|
|
256
|
+
|
|
257
|
+
Returns the code point instead of the character if WANT-CODE-POINT-P
|
|
258
|
+
is true. This can be especially useful for Lisp implementations where
|
|
259
|
+
CHAR-CODE-LIMIT is smaller than +CODE-POINT-LIMIT+."
|
|
260
|
+
(mapping c 0 want-code-point-p))
|
|
261
|
+
|
|
262
|
+
(defun lowercase-mapping (c &key want-code-point-p)
|
|
263
|
+
"Returns the simple lowercase mapping of a character. C can be the
|
|
264
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
265
|
+
assuming its character code is also its Unicode code point. Returns
|
|
266
|
+
the character itself if no such mapping is explicitly defined. Note
|
|
267
|
+
that case mapping only makes sense for characters with the \"LC\"
|
|
268
|
+
property.
|
|
269
|
+
|
|
270
|
+
Returns the code point instead of the character if WANT-CODE-POINT-P
|
|
271
|
+
is true. This can be especially useful for Lisp implementations where
|
|
272
|
+
CHAR-CODE-LIMIT is smaller than +CODE-POINT-LIMIT+."
|
|
273
|
+
(mapping c 1 want-code-point-p))
|
|
274
|
+
|
|
275
|
+
(defun titlecase-mapping (c &key want-code-point-p)
|
|
276
|
+
"Returns the simple titlecase mapping of a character. C can be the
|
|
277
|
+
character's code point \(a positive integer) or a \(Lisp) character
|
|
278
|
+
assuming its character code is also its Unicode code point. Returns
|
|
279
|
+
the character itself if no such mapping is explicitly defined. Note
|
|
280
|
+
that case mapping only makes sense for characters with the \"LC\"
|
|
281
|
+
property.
|
|
282
|
+
|
|
283
|
+
Returns the code point instead of the character if WANT-CODE-POINT-P
|
|
284
|
+
is true. This can be especially useful for Lisp implementations where
|
|
285
|
+
CHAR-CODE-LIMIT is smaller than +CODE-POINT-LIMIT+."
|
|
286
|
+
(mapping c 2 want-code-point-p))
|
|
287
|
+
|
|
288
|
+
(defun general-categories ()
|
|
289
|
+
"Returns a sorted list of all general categories known to
|
|
290
|
+
CL-UNICODE. These are the possible return values of
|
|
291
|
+
GENERAL-CATEGORY."
|
|
292
|
+
(sort (mapcar 'property-name *general-categories*) 'string-lessp))
|
|
293
|
+
|
|
294
|
+
(defun scripts ()
|
|
295
|
+
"Returns a sorted list of all scripts known to CL-UNICODE. These
|
|
296
|
+
are the possible return values of SCRIPT."
|
|
297
|
+
(sort (mapcar 'property-name *scripts*) 'string-lessp))
|
|
298
|
+
|
|
299
|
+
(defun code-blocks ()
|
|
300
|
+
"Returns a sorted list of all blocks known to CL-UNICODE. These are
|
|
301
|
+
the possible return values of CODE-BLOCK."
|
|
302
|
+
(sort (mapcar 'property-name *code-blocks*) 'string-lessp))
|
|
303
|
+
|
|
304
|
+
(defun binary-properties ()
|
|
305
|
+
"Returns a sorted list of all binary properties known to CL-UNICODE.
|
|
306
|
+
These are the allowed second arguments \(modulo canonicalization) to
|
|
307
|
+
HAS-BINARY-PROPERTY."
|
|
308
|
+
(sort (mapcar 'property-name *binary-properties*) 'string-lessp))
|
|
309
|
+
|
|
310
|
+
(defun bidi-classes ()
|
|
311
|
+
"Returns a sorted list of all Bidi classes known to CL-UNICODE.
|
|
312
|
+
These are the possible return values of BIDI-CLASS."
|
|
313
|
+
(sort (mapcar 'property-name *bidi-classes*) 'string-lessp))
|
|
314
|
+
|
|
315
|
+
(defun recognized-properties (&optional all)
|
|
316
|
+
"Returns a list of all property names known to CL-UNICODE. These
|
|
317
|
+
are the allowed second arguments \(modulo canonicalization) to
|
|
318
|
+
HAS-PROPERTY. If ALL is true, known aliases \(like \"Letter\" for
|
|
319
|
+
\"L\") are also included."
|
|
320
|
+
(sort (cond (all (loop for key being the hash-keys of *property-map*
|
|
321
|
+
collect key))
|
|
322
|
+
(t (mapcar 'property-name
|
|
323
|
+
(loop for key being the hash-keys of *property-tests*
|
|
324
|
+
collect key))))
|
|
325
|
+
'string-lessp))
|
|
326
|
+
|
|
327
|
+
(defgeneric property-test (property &key errorp)
|
|
328
|
+
(:documentation "Returns a unary function which can test code points
|
|
329
|
+
or Lisp characters for the property PROPERTY. PROPERTY is interpreted
|
|
330
|
+
as in HAS-PROPERTY and PROPERTY-TEST is actually used internally by
|
|
331
|
+
HAS-PROPERTY but might come in handy if you need a faster way to test
|
|
332
|
+
for PROPERTY \(as you're saving the time to look up the property).
|
|
333
|
+
|
|
334
|
+
Returns NIL if no property named PROPERTY was found or signals an
|
|
335
|
+
error if ERRORP is true.")
|
|
336
|
+
(:method ((property-name string) &key errorp)
|
|
337
|
+
(property-test (or (gethash (canonicalize-name property-name) *property-map*)
|
|
338
|
+
(and errorp (signal-unicode-error "There is no property called ~S."
|
|
339
|
+
property-name)))))
|
|
340
|
+
(:method ((property-symbol symbol) &key errorp)
|
|
341
|
+
(or (gethash property-symbol *property-tests*)
|
|
342
|
+
(and errorp (signal-unicode-error "There is no property called ~S." property-symbol)))))
|
|
343
|
+
|
|
344
|
+
(defun has-property (c property)
|
|
345
|
+
"Checks whether a character has the named property PROPERTY.
|
|
346
|
+
PROPERTY can be a string naming a property \(which will be used for
|
|
347
|
+
look-up after canonicalization) or it can be a property symbol \(see
|
|
348
|
+
PROPERTY-SYMBOL). C can be the character's code point \(a positive
|
|
349
|
+
integer) or a \(Lisp) character assuming its character code is also
|
|
350
|
+
its Unicode code point.
|
|
351
|
+
|
|
352
|
+
\"Properties\" in the sense of CL-UNICODE can be names of general
|
|
353
|
+
categories, scripts, blocks, binary properties, or Bidi classes,
|
|
354
|
+
amongst other things. If there are a block and a script with the same
|
|
355
|
+
name \(like, say, \"Cyrillic\"), the bare name denotes the script.
|
|
356
|
+
Prepend \"Block:\" to the name to refer to the block. \(You can also
|
|
357
|
+
prepend \"Script:\" to refer to the script unambiguously.) Names of
|
|
358
|
+
Bidi classes must be prepended with \"BidiClass:\" if there's a
|
|
359
|
+
potential for ambiguity.
|
|
360
|
+
|
|
361
|
+
This function also recognizes several aliases for properties \(like
|
|
362
|
+
\"Symbol\" for \"S\") and you can, as in Perl, prepend block names
|
|
363
|
+
with \"In\" instead of \"Block:\" and most other properties with
|
|
364
|
+
\"Is\". See RECOGNIZED-PROPERTIES.
|
|
365
|
+
|
|
366
|
+
See also PROPERTY-TEST."
|
|
367
|
+
(funcall (property-test property :errorp t) c))
|
|
368
|
+
|
|
369
|
+
(defun list-all-characters (property &key want-code-point-p)
|
|
370
|
+
"Lists all character \(ordered by code point) which have the
|
|
371
|
+
property PROPERTY where PROPERTY is interpreted as in HAS-PROPERTY.
|
|
372
|
+
If WANT-CODE-POINT-P is true, a list of code points instead of a list
|
|
373
|
+
of characters is returned. \(If CHAR-CODE-LIMIT is smaller than
|
|
374
|
+
+CODE-POINT-LIMIT+ in your Lisp implementation, the list of code
|
|
375
|
+
points can actually be longer than the list of characters.)."
|
|
376
|
+
(loop with test-function = (property-test property :errorp t)
|
|
377
|
+
for code-point below (if want-code-point-p +code-point-limit+ char-code-limit)
|
|
378
|
+
for thing = (if want-code-point-p code-point (code-char code-point))
|
|
379
|
+
when (and thing (funcall (the function test-function) code-point))
|
|
380
|
+
collect thing))
|
|
381
|
+
|
|
382
|
+
(defmacro enable-alternative-character-syntax ()
|
|
383
|
+
"Enables an alternative Lisp character syntax which /replaces/ the
|
|
384
|
+
usual syntax: After a sharpsign and a backslash have been read, at
|
|
385
|
+
least one more character is read. Reading then continues as long as
|
|
386
|
+
ASCII letters, digits, underlines, hyphens, colons, or plus signs are
|
|
387
|
+
read. The resulting string is then used as input to CHARACTER-NAMED
|
|
388
|
+
to produce a character.
|
|
389
|
+
|
|
390
|
+
This macro expands into an EVAL-WHEN so that if you use it as a
|
|
391
|
+
top-level form in a file to be loaded and/or compiled it'll do what
|
|
392
|
+
you expect. Technically, this'll push the current readtable on a
|
|
393
|
+
stack so that matching calls of this macro and
|
|
394
|
+
DISABLE-ALTERNATIVE-CHARACTER-SYNTAX can be nested.
|
|
395
|
+
|
|
396
|
+
Note that by default the alternative character syntax is not enabled
|
|
397
|
+
after loading CL-UNICODE."
|
|
398
|
+
`(eval-when (:compile-toplevel :load-toplevel :execute)
|
|
399
|
+
(%enable-alternative-character-syntax)))
|
|
400
|
+
|
|
401
|
+
(defmacro disable-alternative-character-syntax ()
|
|
402
|
+
"Restores the readtable which was active before the last call to
|
|
403
|
+
ENABLE-ALTERNATIVE-CHARACTER-SYNTAX. If there was no such call, the
|
|
404
|
+
standard readtable is used.
|
|
405
|
+
|
|
406
|
+
This macro expands into an EVAL-WHEN so that if you use it as a
|
|
407
|
+
top-level form in a file to be loaded and/or compiled it'll do what
|
|
408
|
+
you expect. Technically, this'll pop a readtable from the stack
|
|
409
|
+
described in ENABLE-ALTERNATIVE-CHARACTER-SYNTAX so that matching
|
|
410
|
+
calls of these macros can be nested."
|
|
411
|
+
`(eval-when (:compile-toplevel :load-toplevel :execute)
|
|
412
|
+
(%disable-alternative-character-syntax)))
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-UNICODE; Base: 10 -*-
|
|
2
|
+
;;; $Header: /usr/local/cvsrep/cl-unicode/build/char-info.lisp,v 1.5 2008/07/21 14:23:09 edi Exp $
|
|
3
|
+
|
|
4
|
+
;;; Copyright (c) 2008, Dr. Edmund Weitz. All rights reserved.
|
|
5
|
+
|
|
6
|
+
;;; Redistribution and use in source and binary forms, with or without
|
|
7
|
+
;;; modification, are permitted provided that the following conditions
|
|
8
|
+
;;; are met:
|
|
9
|
+
|
|
10
|
+
;;; * Redistributions of source code must retain the above copyright
|
|
11
|
+
;;; notice, this list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
;;; * Redistributions in binary form must reproduce the above
|
|
14
|
+
;;; copyright notice, this list of conditions and the following
|
|
15
|
+
;;; disclaimer in the documentation and/or other materials
|
|
16
|
+
;;; provided with the distribution.
|
|
17
|
+
|
|
18
|
+
;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
|
|
19
|
+
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
21
|
+
;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
22
|
+
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
23
|
+
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
24
|
+
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
25
|
+
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
26
|
+
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
27
|
+
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
28
|
+
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
|
|
30
|
+
(in-package :cl-unicode)
|
|
31
|
+
|
|
32
|
+
(defclass char-info ()
|
|
33
|
+
((code-point :initarg :code-point
|
|
34
|
+
:reader code-point
|
|
35
|
+
:type fixnum
|
|
36
|
+
:documentation "The code point of the character. This
|
|
37
|
+
is redundant information, but convenient.")
|
|
38
|
+
(name :initarg :name
|
|
39
|
+
:initform nil
|
|
40
|
+
:reader name
|
|
41
|
+
:type (or string null)
|
|
42
|
+
:documentation "The name of the character - a string.")
|
|
43
|
+
(script :initform nil
|
|
44
|
+
:accessor script*
|
|
45
|
+
:type (or symbol null)
|
|
46
|
+
:documentation "The script the character belongs to - a
|
|
47
|
+
property symbol.")
|
|
48
|
+
(code-block :initform nil
|
|
49
|
+
:accessor code-block*
|
|
50
|
+
:type (or symbol null)
|
|
51
|
+
:documentation "The block the character belongs to - a
|
|
52
|
+
property symbol.")
|
|
53
|
+
(unicode1-name :initarg :unicode1-name
|
|
54
|
+
:initform nil
|
|
55
|
+
:reader unicode1-name
|
|
56
|
+
:type (or string null)
|
|
57
|
+
:documentation "The Unicode 1.0 name of the
|
|
58
|
+
character - a string.")
|
|
59
|
+
(age :initform nil
|
|
60
|
+
:accessor age*
|
|
61
|
+
:type list
|
|
62
|
+
:documentation "The Unicode version this character first
|
|
63
|
+
appeared in, a cons of two integers which denote the major and minor
|
|
64
|
+
version.")
|
|
65
|
+
(general-category :initarg :general-category
|
|
66
|
+
;; this is the default for unassigned characters
|
|
67
|
+
;; - see READ-BINARY-PROPERTIES
|
|
68
|
+
:initform (property-symbol "Cn")
|
|
69
|
+
:reader general-category*
|
|
70
|
+
:type symbol
|
|
71
|
+
:documentation "The general category of this
|
|
72
|
+
character - a property symbol.")
|
|
73
|
+
(bidi-class :initarg :bidi-class
|
|
74
|
+
;; will be defaulted later, see
|
|
75
|
+
;; SET-DEFAULT-BIDI-CLASSES
|
|
76
|
+
:initform nil
|
|
77
|
+
:accessor bidi-class*
|
|
78
|
+
:type symbol
|
|
79
|
+
:documentation "The Bidi class of the character - a
|
|
80
|
+
property symbol.")
|
|
81
|
+
(bidi-mirroring-glyph :initform nil
|
|
82
|
+
:accessor bidi-mirroring-glyph*
|
|
83
|
+
:type (or fixnum null)
|
|
84
|
+
:documentation "The code point of the mirror
|
|
85
|
+
image of the character, if there is one.")
|
|
86
|
+
(binary-props :initarg :binary-props
|
|
87
|
+
:initform nil
|
|
88
|
+
:accessor binary-props*
|
|
89
|
+
:type list
|
|
90
|
+
:documentation "A list of property symbols denoting
|
|
91
|
+
the binary properties of the character.")
|
|
92
|
+
(combining-class :initarg :combining-class
|
|
93
|
+
;; the default combining class
|
|
94
|
+
:initform 0
|
|
95
|
+
:reader combining-class*
|
|
96
|
+
:type fixnum
|
|
97
|
+
:documentation "The combining class of the
|
|
98
|
+
character - an integer.")
|
|
99
|
+
(numeric-type :initarg :numeric-type
|
|
100
|
+
:initform nil
|
|
101
|
+
:reader numeric-type*
|
|
102
|
+
:type symbol
|
|
103
|
+
:documentation "The numeric type \(one of
|
|
104
|
+
\"Decimal\", \"Digit\", or \"Numeric\") of the character if it has one
|
|
105
|
+
- a property symbol.")
|
|
106
|
+
(numeric-value :initarg :numeric-value
|
|
107
|
+
:initform nil
|
|
108
|
+
:reader numeric-value*
|
|
109
|
+
:type (or rational null)
|
|
110
|
+
:documentation "The numeric value of the character
|
|
111
|
+
if it has one - a Lisp rational.")
|
|
112
|
+
(uppercase-mapping :initarg :uppercase-mapping
|
|
113
|
+
:initform nil
|
|
114
|
+
:reader uppercase-mapping*
|
|
115
|
+
:type (or fixnum null)
|
|
116
|
+
:documentation "The simple uppercase mapping of
|
|
117
|
+
the character \(as a code point) if explicitly specified.")
|
|
118
|
+
(lowercase-mapping :initarg :lowercase-mapping
|
|
119
|
+
:initform nil
|
|
120
|
+
:reader lowercase-mapping*
|
|
121
|
+
:type (or fixnum null)
|
|
122
|
+
:documentation "The simple lowercase mapping of
|
|
123
|
+
the character \(as a code point) if explicitly specified.")
|
|
124
|
+
(titlecase-mapping :initarg :titlecase-mapping
|
|
125
|
+
:initform nil
|
|
126
|
+
:reader titlecase-mapping*
|
|
127
|
+
:type (or fixnum null)
|
|
128
|
+
:documentation "The simple titlecase mapping of
|
|
129
|
+
the character \(as a code point) if explicitly specified."))
|
|
130
|
+
(:documentation "A CHAR-INFO object is a datastructure which is used
|
|
131
|
+
to \(temporarily) hold the information about one character as gathered
|
|
132
|
+
from parsing the Unicode data files - see the code in read.lisp."))
|
|
133
|
+
|