43 'basic_latin' => array(
'Basic Latin',
'0020',
'007F'),
44 'latin_1_supplement' => array(
'Latin-1 Supplement',
'00A0',
'00FF'),
45 'latin_extended_a' => array(
'Latin Extended-A',
'0100',
'017F'),
46 'latin_extended_b' => array(
'Latin Extended-B',
'0180',
'024F'),
47 'ipa_extensions' => array(
'IPA Extensions',
'0250',
'02AF'),
48 'spacing_modifier_letters' => array(
'Spacing Modifier Letters',
'02B0',
'02FF'),
49 'combining_diacritical_marks' => array(
'Combining Diacritical Marks',
'0300',
'036F'),
50 'greek_and_coptic' => array(
'Greek and Coptic',
'0370',
'03FF'),
51 'cyrillic' => array(
'Cyrillic',
'0400',
'04FF'),
52 'cyrillic_supplement' => array(
'Cyrillic Supplement',
'0500',
'052F'),
53 'armenian' => array(
'Armenian',
'0530',
'058F'),
54 'hebrew' => array(
'Hebrew',
'0590',
'05FF'),
55 'arabic' => array(
'Arabic',
'0600',
'06FF'),
56 'syriac' => array(
'Syriac',
'0700',
'074F'),
57 'arabic_supplement' => array(
'Arabic Supplement',
'0750',
'077F'),
58 'thaana' => array(
'Thaana',
'0780',
'07BF'),
59 'nko' => array(
'NKo',
'07C0',
'07FF'),
60 'samaritan' => array(
'Samaritan',
'0800',
'083F'),
61 'mandaic' => array(
'Mandaic',
'0840',
'085F'),
62 'arabic_extended_a' => array(
'Arabic Extended-A',
'08A0',
'08FF'),
63 'devanagari' => array(
'Devanagari',
'0900',
'097F'),
64 'bengali' => array(
'Bengali',
'0980',
'09FF'),
65 'gurmukhi' => array(
'Gurmukhi',
'0A00',
'0A7F'),
66 'gujarati' => array(
'Gujarati',
'0A80',
'0AFF'),
67 'oriya' => array(
'Oriya',
'0B00',
'0B7F'),
68 'tamil' => array(
'Tamil',
'0B80',
'0BFF'),
69 'telugu' => array(
'Telugu',
'0C00',
'0C7F'),
70 'kannada' => array(
'Kannada',
'0C80',
'0CFF'),
71 'malayalam' => array(
'Malayalam',
'0D00',
'0D7F'),
72 'sinhala' => array(
'Sinhala',
'0D80',
'0DFF'),
73 'thai' => array(
'Thai',
'0E00',
'0E7F'),
74 'lao' => array(
'Lao',
'0E80',
'0EFF'),
75 'tibetan' => array(
'Tibetan',
'0F00',
'0FFF'),
76 'myanmar' => array(
'Myanmar',
'1000',
'109F'),
77 'georgian' => array(
'Georgian',
'10A0',
'10FF'),
78 'hangul_jamo' => array(
'Hangul Jamo',
'1100',
'11FF'),
79 'ethiopic' => array(
'Ethiopic',
'1200',
'137F'),
80 'ethiopic_supplement' => array(
'Ethiopic Supplement',
'1380',
'139F'),
81 'cherokee' => array(
'Cherokee',
'13A0',
'13FF'),
82 'unified_canadian_aboriginal_syllabics' => array(
'Unified Canadian Aboriginal Syllabics',
'1400',
'167F'),
83 'ogham' => array(
'Ogham',
'1680',
'169F'),
84 'runic' => array(
'Runic',
'16A0',
'16FF'),
85 'tagalog' => array(
'Tagalog',
'1700',
'171F'),
86 'hanunoo' => array(
'Hanunoo',
'1720',
'173F'),
87 'buhid' => array(
'Buhid',
'1740',
'175F'),
88 'tagbanwa' => array(
'Tagbanwa',
'1760',
'177F'),
89 'khmer' => array(
'Khmer',
'1780',
'17FF'),
90 'mongolian' => array(
'Mongolian',
'1800',
'18AF'),
91 'unified_canadian_aboriginal_syllabics_extended' => array(
'Unified Canadian Aboriginal Syllabics Extended',
95 'limbu' => array(
'Limbu',
'1900',
'194F'),
96 'tai_le' => array(
'Tai Le',
'1950',
'197F'),
97 'new_tai_lue' => array(
'New Tai Lue',
'1980',
'19DF'),
98 'khmer_symbols' => array(
'Khmer Symbols',
'19E0',
'19FF'),
99 'buginese' => array(
'Buginese',
'1A00',
'1A1F'),
100 'tai_tham' => array(
'Tai Tham',
'1A20',
'1AAF'),
101 'balinese' => array(
'Balinese',
'1B00',
'1B7F'),
102 'sundanese' => array(
'Sundanese',
'1B80',
'1BBF'),
103 'batak' => array(
'Batak',
'1BC0',
'1BFF'),
104 'lepcha' => array(
'Lepcha',
'1C00',
'1C4F'),
105 'ol_chiki' => array(
'Ol Chiki',
'1C50',
'1C7F'),
106 'sundanese_supplement' => array(
'Sundanese Supplement',
'1CC0',
'1CCF'),
107 'vedic_extensions' => array(
'Vedic Extensions',
'1CD0',
'1CFF'),
108 'phonetic_extensions' => array(
'Phonetic Extensions',
'1D00',
'1D7F'),
109 'phonetic_extensions_supplement' => array(
'Phonetic Extensions Supplement',
'1D80',
'1DBF'),
110 'combining_diacritical_marks_supplement' => array(
'Combining Diacritical Marks Supplement',
'1DC0',
'1DFF'),
111 'latin_extended_additional' => array(
'Latin Extended Additional',
'1E00',
'1EFF'),
112 'greek_extended' => array(
'Greek Extended',
'1F00',
'1FFF'),
113 'general_punctuation' => array(
'General Punctuation',
'2000',
'206F'),
114 'superscripts_and_subscripts' => array(
'Superscripts and Subscripts',
'2070',
'209F'),
115 'currency_symbols' => array(
'Currency Symbols',
'20A0',
'20CF'),
116 'combining_diacritical_marks_for_symbols' => array(
'Combining Diacritical Marks for Symbols',
'20D0',
'20FF'),
117 'letterlike_symbols' => array(
'Letterlike Symbols',
'2100',
'214F'),
118 'number_forms' => array(
'Number Forms',
'2150',
'218F'),
119 'arrows' => array(
'Arrows',
'2190',
'21FF'),
120 'mathematical_operators' => array(
'Mathematical Operators',
'2200',
'22FF'),
121 'miscellaneous_technical' => array(
'Miscellaneous Technical',
'2300',
'23FF'),
122 'control_pictures' => array(
'Control Pictures',
'2400',
'243F'),
123 'optical_character_recognition' => array(
'Optical Character Recognition',
'2440',
'245F'),
124 'enclosed_alphanumerics' => array(
'Enclosed Alphanumerics',
'2460',
'24FF'),
125 'box_drawing' => array(
'Box Drawing',
'2500',
'257F'),
126 'block_elements' => array(
'Block Elements',
'2580',
'259F'),
127 'geometric_shapes' => array(
'Geometric Shapes',
'25A0',
'25FF'),
128 'miscellaneous_symbols' => array(
'Miscellaneous Symbols',
'2600',
'26FF'),
129 'dingbats' => array(
'Dingbats',
'2700',
'27BF'),
130 'miscellaneous_mathematical_symbols_a' => array(
'Miscellaneous Mathematical Symbols-A',
'27C0',
'27EF'),
131 'supplemental_arrows_a' => array(
'Supplemental Arrows-A',
'27F0',
'27FF'),
132 'braille_patterns' => array(
'Braille Patterns',
'2800',
'28FF'),
133 'supplemental_arrows_b' => array(
'Supplemental Arrows-B',
'2900',
'297F'),
134 'miscellaneous_mathematical_symbols_b' => array(
'Miscellaneous Mathematical Symbols-B',
'2980',
'29FF'),
135 'supplemental_mathematical_operators' => array(
'Supplemental Mathematical Operators',
'2A00',
'2AFF'),
136 'miscellaneous_symbols_and_arrows' => array(
'Miscellaneous Symbols and Arrows',
'2B00',
'2BFF'),
137 'glagolitic' => array(
'Glagolitic',
'2C00',
'2C5F'),
138 'latin_extended_c' => array(
'Latin Extended-C',
'2C60',
'2C7F'),
139 'coptic' => array(
'Coptic',
'2C80',
'2CFF'),
140 'georgian_supplement' => array(
'Georgian Supplement',
'2D00',
'2D2F'),
141 'tifinagh' => array(
'Tifinagh',
'2D30',
'2D7F'),
142 'ethiopic_extended' => array(
'Ethiopic Extended',
'2D80',
'2DDF'),
143 'cyrillic_extended_a' => array(
'Cyrillic Extended-A',
'2DE0',
'2DFF'),
144 'supplemental_punctuation' => array(
'Supplemental Punctuation',
'2E00',
'2E7F'),
145 'cjk_radicals_supplement' => array(
'CJK Radicals Supplement',
'2E80',
'2EFF'),
146 'kangxi_radicals' => array(
'Kangxi Radicals',
'2F00',
'2FDF'),
147 'ideographic_description_characters' => array(
'Ideographic Description Characters',
'2FF0',
'2FFF'),
148 'cjk_symbols_and_punctuation' => array(
'CJK Symbols and Punctuation',
'3000',
'303F'),
149 'hiragana' => array(
'Hiragana',
'3040',
'309F'),
150 'katakana' => array(
'Katakana',
'30A0',
'30FF'),
151 'bopomofo' => array(
'Bopomofo',
'3100',
'312F'),
152 'hangul_compatibility_jamo' => array(
'Hangul Compatibility Jamo',
'3130',
'318F'),
153 'kanbun' => array(
'Kanbun',
'3190',
'319F'),
154 'bopomofo_extended' => array(
'Bopomofo Extended',
'31A0',
'31BF'),
155 'cjk_strokes' => array(
'CJK Strokes',
'31C0',
'31EF'),
156 'katakana_phonetic_extensions' => array(
'Katakana Phonetic Extensions',
'31F0',
'31FF'),
157 'enclosed_cjk_letters_and_months' => array(
'Enclosed CJK Letters and Months',
'3200',
'32FF'),
158 'cjk_compatibility' => array(
'CJK Compatibility',
'3300',
'33FF'),
159 'cjk_unified_ideographs_extension_a' => array(
'CJK Unified Ideographs Extension A',
'3400',
'4DBF'),
160 'yijing_hexagram_symbols' => array(
'Yijing Hexagram Symbols',
'4DC0',
'4DFF'),
161 'cjk_unified_ideographs' => array(
'CJK Unified Ideographs',
'4E00',
'9FFF'),
162 'yi_syllables' => array(
'Yi Syllables',
'A000',
'A48F'),
163 'yi_radicals' => array(
'Yi Radicals',
'A490',
'A4CF'),
164 'lisu' => array(
'Lisu',
'A4D0',
'A4FF'),
165 'vai' => array(
'Vai',
'A500',
'A63F'),
166 'cyrillic_extended_b' => array(
'Cyrillic Extended-B',
'A640',
'A69F'),
167 'bamum' => array(
'Bamum',
'A6A0',
'A6FF'),
168 'modifier_tone_letters' => array(
'Modifier Tone Letters',
'A700',
'A71F'),
169 'latin_extended_d' => array(
'Latin Extended-D',
'A720',
'A7FF'),
170 'syloti_nagri' => array(
'Syloti Nagri',
'A800',
'A82F'),
171 'common_indic_number_forms' => array(
'Common Indic Number Forms',
'A830',
'A83F'),
172 'phags_pa' => array(
'Phags-pa',
'A840',
'A87F'),
173 'saurashtra' => array(
'Saurashtra',
'A880',
'A8DF'),
174 'devanagari_extended' => array(
'Devanagari Extended',
'A8E0',
'A8FF'),
175 'kayah_li' => array(
'Kayah Li',
'A900',
'A92F'),
176 'rejang' => array(
'Rejang',
'A930',
'A95F'),
177 'hangul_jamo_extended_a' => array(
'Hangul Jamo Extended-A',
'A960',
'A97F'),
178 'javanese' => array(
'Javanese',
'A980',
'A9DF'),
179 'cham' => array(
'Cham',
'AA00',
'AA5F'),
180 'myanmar_extended_a' => array(
'Myanmar Extended-A',
'AA60',
'AA7F'),
181 'tai_viet' => array(
'Tai Viet',
'AA80',
'AADF'),
182 'meetei_mayek_extensions' => array(
'Meetei Mayek Extensions',
'AAE0',
'AAFF'),
183 'ethiopic_extended_a' => array(
'Ethiopic Extended-A',
'AB00',
'AB2F'),
184 'meetei_mayek' => array(
'Meetei Mayek',
'ABC0',
'ABFF'),
185 'hangul_syllables' => array(
'Hangul Syllables',
'AC00',
'D7AF'),
186 'hangul_jamo_extended_b' => array(
'Hangul Jamo Extended-B',
'D7B0',
'D7FF'),
187 'high_surrogates' => array(
'High Surrogates',
'D800',
'DB7F'),
188 'high_private_use_surrogates' => array(
'High Private Use Surrogates',
'DB80',
'DBFF'),
189 'low_surrogates' => array(
'Low Surrogates',
'DC00',
'DFFF'),
190 'private_use_area' => array(
'Private Use Area',
'E000',
'F8FF'),
191 'cjk_compatibility_ideographs' => array(
'CJK Compatibility Ideographs',
'F900',
'FAFF'),
192 'alphabetic_presentation_forms' => array(
'Alphabetic Presentation Forms',
'FB00',
'FB4F'),
193 'arabic_presentation_forms_a' => array(
'Arabic Presentation Forms-A',
'FB50',
'FDFF'),
194 'variation_selectors' => array(
'Variation Selectors',
'FE00',
'FE0F'),
195 'vertical_forms' => array(
'Vertical Forms',
'FE10',
'FE1F'),
196 'combining_half_marks' => array(
'Combining Half Marks',
'FE20',
'FE2F'),
197 'cjk_compatibility_forms' => array(
'CJK Compatibility Forms',
'FE30',
'FE4F'),
198 'small_form_variants' => array(
'Small Form Variants',
'FE50',
'FE6F'),
199 'arabic_presentation_forms_b' => array(
'Arabic Presentation Forms-B',
'FE70',
'FEFF'),
200 'halfwidth_and_fullwidth_forms' => array(
'Halfwidth and Fullwidth Forms',
'FF00',
'FFEF'),
201 'specials' => array(
'Specials',
'FFF0',
'FFFF'),
287 public function __construct(
string $a_context = self::CONTEXT_NONE)
289 switch ($a_context) {
290 case self::CONTEXT_ADMIN:
291 case self::CONTEXT_TEST:
292 case self::CONTEXT_USER:
293 $this->context = $a_context;
296 $this->context = self::CONTEXT_NONE;
308 $admin_config =
new self(self::CONTEXT_ADMIN);
309 $admin_config->setAvailability((
int) $ilSetting->get(
'char_selector_availability'));
310 $admin_config->setDefinition((
string) $ilSetting->get(
'char_selector_definition'));
311 if ($admin_config->getAvailability() === self::INACTIVE) {
313 return $admin_config;
317 if (isset($a_test_obj)) {
318 $test_config =
new self(self::CONTEXT_TEST);
319 $test_config->setAvailability((
int) $a_test_obj->getCharSelectorAvailability());
320 $test_config->setDefinition((
string) $a_test_obj->getCharSelectorDefinition());
321 if ($test_config->getAvailability() !== self::INHERIT) {
328 $user_config =
new self(self::CONTEXT_USER);
329 $user_config->setAvailability((
int) $ilUser->getPref(
'char_selector_availability'));
330 $user_config->setDefinition((
string) $ilUser->getPref(
'char_selector_definition'));
331 if ($user_config->getAvailability() !== self::INHERIT) {
336 return $admin_config;
351 switch ($a_availability) {
356 $this->availability = $a_availability;
359 $this->availability = self::INHERIT;
373 $this->added_blocks = array();
374 foreach ($a_blocks as $block_name) {
375 if ($block_name ===
"all" || array_key_exists($block_name, self::$unicode_blocks)) {
376 $this->added_blocks[] = $block_name;
392 $this->custom_items = explode(
' ', $a_items);
401 return implode(
' ', $this->custom_items);
423 $this->added_blocks = array();
424 $this->custom_items = array();
427 if (trim($a_definition) ===
'') {
428 $a_definition =
"[all]";
432 $items = explode(
' ', $a_definition);
433 foreach ($items as $item) {
435 $this->added_blocks[] = $block_name;
436 } elseif ($item !==
'') {
437 $this->custom_items[] = trim($item);
448 $definition = implode(
' ', $this->custom_items);
449 foreach ($this->added_blocks as $block_name) {
450 $definition .=
' [' . $block_name .
']';
452 return trim($definition);
463 '' => $lng->txt(
'please_select'),
464 'all' => $lng->txt(
'char_selector_unicode_all')
466 foreach (array_keys(self::$unicode_blocks) as $block_name) {
480 $langvar =
'char_selector_unicode_' . $a_block_name;
481 if ($lng->txt($langvar) !==
'-' . $langvar .
'-') {
482 return $lng->txt($langvar);
484 return self::$unicode_blocks[$a_block_name][0];
495 $a_item = trim($a_item);
497 if (preg_match(
'/^\[(.+)\]$/', $a_item, $matches)) {
498 $block_name = $matches[1];
499 if ($block_name ===
'all' || array_key_exists($block_name, self::$unicode_blocks)) {
519 $page = array($lng->txt(
'char_selector_custom_items'));
520 foreach ($this->custom_items as $item) {
521 if (strpos($item,
'-') > 0) {
523 $subitems = explode(
'-', $item);
526 $page[] = array($start, $end);
532 if (count($page) > 1) {
538 $blocks = in_array(
'all', $this->added_blocks) ?
539 array_keys(self::$unicode_blocks) :
542 foreach ($blocks as $block_name) {
543 $start = hexdec(self::$unicode_blocks[$block_name][1]);
544 $end = hexdec(self::$unicode_blocks[$block_name][2]);
545 $page = array($this->
getBlockTitle($block_name), array($start, $end));
557 if (preg_match(
'/^[uU]\+[0-9a-fA-F]+$/', $a_item)) {
558 return (
int) hexdec(substr($a_item, 2));
570 return preg_replace_callback(
571 '/[uU]\+[0-9a-fA-F]+/',
572 array($this,
'getItemParsedCallback'),
598 if ($codepoint < 0x80) {
599 return chr($codepoint);
601 if ($codepoint < 0x800) {
602 return chr($codepoint >> 6&0x3f|0xc0) .
603 chr($codepoint&0x3f|0x80);
605 if ($codepoint < 0x10000) {
606 return chr($codepoint >> 12&0x0f|0xe0) .
607 chr($codepoint >> 6&0x3f|0x80) .
608 chr($codepoint&0x3f|0x80);
610 if ($codepoint < 0x110000) {
611 return chr($codepoint >> 18&0x07|0xf0) .
612 chr($codepoint >> 12&0x3f|0x80) .
613 chr($codepoint >> 6&0x3f|0x80) .
614 chr($codepoint&0x3f|0x80);
643 if ($length != strlen($char)) {
650 # Mask off the length-determining bits and shift back to the original location 654 # Add in the free bits from subsequent bytes 655 for (
$i = 1;
$i < $length;
$i++) {
657 $z |= ord($char[
$i])&0x3f;
setCustomItems(string $a_items='')
set the custom items
getBlockOptions()
get the options for a block selection
const CONTEXT_NONE
Configuration contexts.
static _getCurrentConfig(ilObjTest $a_test_obj=null)
Get the configuration that should be used for the current selector.
setAddedBlocks(array $a_blocks=array())
__construct(string $a_context=self::CONTEXT_NONE)
static array $unicode_blocks
setDefinition(string $a_definition='')
utf8ToCodepoint(string $char)
Determine the Unicode codepoint of a single-character UTF-8 sequence.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const INACTIVE
Availabilities INACTIVE/INHERIT corresponds to an unconfigured selector (no database entries) ...
getItemParsedCallback(array $matches)
callback for replacement of unicode notations
getBlockTitle(string $a_block_name)
Get the title of a unicode block for display or selection A translation is used if it exists...
setAvailability(int $a_availability)
getDefinition()
Set the definition of the available characters.
extractUnicodeBlock(string $a_item='')
Extract the unicode block name from a definition item.
codepointToUtf8(int $codepoint)
Return the UTF-8 sequence for a given Unicode code point.
getItemCodepoint(string $a_item)
get the unicode index of an item
getItemParsed(string $a_item)
replace unicode notations with their utf8 chars in a string
getCharPages()
Get the character pages.
getCustomItems()
set the custom items
getContext()
get the context of the configuration (the context is set at initialisation and can't be changed) ...