factor/basis/unicode/script/script.factor

49 lines
1.2 KiB
Factor
Raw Normal View History

USING: accessors values kernel sequences assocs io.files
2008-05-05 00:33:54 -04:00
io.encodings ascii math.ranges io splitting math.parser
namespaces byte-arrays locals math sets io.encodings.ascii
words compiler.units arrays interval-maps unicode.data ;
2008-05-05 00:33:54 -04:00
IN: unicode.script
<PRIVATE
2008-05-06 00:47:22 -04:00
VALUE: script-table
SYMBOL: interned
2008-05-05 00:33:54 -04:00
: parse-script ( stream -- assoc )
! assoc is code point/range => name
2008-05-25 22:36:38 -04:00
lines filter-comments [ split-; ] map ;
2008-05-05 00:33:54 -04:00
2008-05-06 00:47:22 -04:00
: range, ( value key -- )
swap interned get
[ name>> = ] with find nip 2array , ;
2008-05-05 00:33:54 -04:00
2008-05-06 00:47:22 -04:00
: expand-ranges ( assoc -- interval-map )
[
[
CHAR: . pick member? [
swap ".." split1 [ hex> ] bi@ 2array
] [ swap hex> ] if range,
] assoc-each
] { } make <interval-map> ;
2008-05-05 00:33:54 -04:00
: >symbols ( strings -- symbols )
[
[ "unicode.script" create dup define-symbol ] map
] with-compilation-unit ;
: process-script ( ranges -- )
2008-05-06 00:47:22 -04:00
dup values prune >symbols interned [
expand-ranges \ script-table set-value
] with-variable ;
2008-05-05 00:33:54 -04:00
: load-script ( -- )
2008-07-28 23:03:13 -04:00
"resource:basis/unicode/script/Scripts.txt"
2008-05-05 00:33:54 -04:00
ascii <file-reader> parse-script process-script ;
load-script
PRIVATE>
2008-05-06 00:47:22 -04:00
SYMBOL: Unknown
2008-05-05 00:33:54 -04:00
: script-of ( char -- script )
2008-05-06 00:47:22 -04:00
script-table interval-at [ Unknown ] unless* ;