File Coverage

blib/lib/Aion/Format/Html.pm
Criterion Covered Total %
statement 81 104 77.8
branch 45 90 50.0
condition 6 21 28.5
subroutine 11 14 78.5
pod 4 7 57.1
total 147 236 62.2


закрывает открытые
line stmt bran cond sub pod time code
1             package Aion::Format::Html;
2              
3 1     1   121885 use common::sense;
  1         1  
  1         6  
4              
5 1     1   68 use Exporter qw/import/;
  1         1  
  1         3756  
6             our @EXPORT = our @EXPORT_OK = grep {
7             *{$Aion::Format::Html::{$_}}{CODE} && !/^(_|(NaN|import)\z)/n
8             } keys %Aion::Format::Html::;
9              
10             # Экранирует символы html
11             my %HTML_SIM = (qw/< < > > & & \' ' " "/, "\n" => '
', "\t" => ' ');
12             sub to_html (;$) {
13 1 50   1 1 486 my ($s) = @_? @_: $_;
14 1         6 $s =~ s/[<>&\'\"]/$HTML_SIM{$&}/ge;
  2         7  
15 1         4 $s
16             }
17              
18             our %ENTITIES = (
19             #
20             # Управляющие символы C0 и основная латиница
21             # U+0000—U+007F
22             # Данный диапазон Юникода полностью соответствует стандарту ASCII за исключением соглашения о наложении литер через возврат на шаг.[3]
23             # Символ Назначение Мнемоника HTML Код
24             #
25             # U+0000—U+001F — управляющие символы C0
26             # табуляция — HT (ANSI), ГТ (ГОСТ) 5.0 U+0009
27             Tab => 9,
28             # перевод строки — LF (ANSI), ПС (ГОСТ) 5.0 U+000A
29             NewLine => 10,
30             #
31             # U+0032—U+007E — основная латиница
32             #
33             # пробел U+0020
34             # ! восклицательный знак ! 5.0 U+0021 !
35             excl => 33,
36             # " двойная кавычка[4] " 5.0 U+0022 " " 2.0
37             quot => 34,
38             QUOT => 34,
39             # # знак номера («решётка» или «диез») # 5.0 U+0023 #
40             num => 35,
41             # $ знак доллара $ 5.0 U+0024 $
42             dollar => 36,
43             # % знак процента % 5.0 U+0025 %
44             percnt => 37,
45             # & амперсанд & 5.0 U+0026 & & 1.0/2.0
46             amp => 38,
47             AMP => 38,
48             # ' одинарная кавычка (занимающий позицию апостроф)[5] ' 5.0 U+0027 '
49             apos => 39,
50             # ( левая круглая скобка ( 5.0 U+0028 (
51             lpar => 40,
52             # ) правая круглая скобка ) 5.0 U+0029 )
53             rpar => 41,
54             # * звёздочка (может быть как высоко, так и среднерасположенной)[6][7] * 5.0 U+002A * *
55             ast => 42,
56             midast => 42,
57             # + знак плюс + 5.0 U+002B +
58             plus => 43,
59             # , запятая[8] , 5.0 U+002C ,
60             comma => 44,
61             # - чёрточка-минус (не рекомендован к использованию)[9][10] U+002D -
62             # . точка[11] . 5.0 U+002E .
63             period => 46,
64             # / косая черта (солидус)[12][13] / 5.0 U+002F /
65             sol => 47,
66             #
67             #
68             # U+0030—U+0039 — цифры 0—9[14]
69             #
70             # : двоеточие : 5.0 U+003A :
71             colon => 58,
72             # ; точка с запятой ; 5.0 U+003B ;
73             semi => 59,
74             # < знак меньше < 5.0 U+003C < < 1.0/2.0
75             LT => 60,
76             lt => 60,
77             # = знак равенства = 5.0 U+003D =
78             equals => 61,
79             # > знак больше > 5.0 U+003E > > 1.0/2.0
80             GT => 62,
81             gt => 62,
82             # ? знак вопроса ? 5.0 U+003F ?
83             quest => 63,
84             # @ коммерческий «эт» @ 5.0 U+0040 @
85             commat => 64,
86             #
87             #
88             # U+0041—U+005A — заглавные латинские буквы A—Z[15]
89             #
90             # [ левая квадратная скобка [ 5.0 U+005B [ [
91             lbrack => 91,
92             lsqb => 91,
93             # \ обратная косая черта[16] \ 5.0 U+005C \
94             bsol => 92,
95             # ] правая квадратная скобка ] 5.0 U+005D ] ]
96             rsqb => 93,
97             rbrack => 93,
98             # ^ карет — (может быть как высоко, так и среднерасположенным)[17][18] ^ 5.0 U+005E ^
99             Hat => 94,
100             # _ занимающее позицию подчёркивание (должно стыковаться по горизонтали)[19] _ 5.0 U+005F _ _
101             lowbar => 95,
102             UnderBar => 95,
103             # ` занимающий позицию обратный апостроф (грейв)[20] ` 5.0 U+0060 ` `
104             grave => 96,
105             DiacriticalGrave => 96,
106             #
107             # U+0061—U+007A — строчные латинские буквы a—z[21]
108             # { левая фигурная скобка { 5.0 U+007B { {
109             lcub => 123,
110             lbrace => 123,
111             # | вертикальная черта[22] | 5.0 U+007C | | |
112             verbar => 124,
113             vert => 124,
114             VerticalLine => 124,
115             # } правая фигурная скобка } 5.0 U+007D } }
116             rcub => 125,
117             rbrace => 125,
118             # ~ занимающая позицию тильда (может быть как высоко, так и среднерасположенной, не рекомендуется к использованию)[23][24] U+007E ~
119             #
120             # U+007F — управляющие символы C0
121             # Управляющие символы C1 и дополнение из Latin-1
122             # U+0080—U+00FF
123             # Исторически в диапазон U+00A0—U+00FF («Дополнение из Latin‑1») переносились литеры из соответствующих позиций Latin‑1 (ISO 8859‑1), пока не стало объявлено, что стандарт Latin‑1 включён в Юникод полностью — как ASCII (U+0000—U+007F), так и данный диапазон (U+0080—U+00FF), за исключением соглашения о наложении литер через возврат на шаг.
124             # Символ Назначение Мнемоника HTML Код
125             # U+0080—U+009F — управляющие символы C1
126             # U+00A0—U+00FF — дополнение из Latin‑1
127             #
128             # неразрывный пробел   5.0 U+00A0     3.2
129             NonBreakingSpace => 160,
130             nbsp => 160,
131             # ¡ перевёрнутый восклицательный знак ¡ 3.2 U+00A1 ¡
132             iexcl => 161,
133             # ¢ символ цента ¢ 3.2 U+00A2 ¢
134             cent => 162,
135             # £ символ фунта £ 3.2 U+00A3 £
136             pound => 163,
137             # ¤ знак валюты ¤ 3.2 U+00A4 ¤
138             curren => 164,
139             # ¥ символ иены и юаня ¥ 3.2 U+00A5 ¥
140             yen => 165,
141             # ¦ разорванная вертикальная черта &brkbar; нестандарт U+00A6 ¦
142             brkbar => 166,
143             # ¦ 3.2
144             brvbar => 166,
145             # § знак параграфа § 3.2 U+00A7 §
146             sect => 167,
147             # ¨ диерезис, трема умлаут (все занимают позицию) ¨ 5.0 U+00A8 ¨ ¨ 5.0 ¨ 5.0 ¨ 3.2
148             die => 168,
149             Dot => 168,
150             DoubleDot => 168,
151             uml => 168,
152             # © знак охраны авторского права © 5.0 U+00A9 © © 3.2
153             COPY => 169,
154             copy => 169,
155             # ª порядковый индикатор (женский род) ª 3.2 U+00AA ª
156             ordf => 170,
157             # « направленная влево двойная угловая кавычка « 3.2 U+00AB «
158             laquo => 171,
159             # ¬ знак «отрицание» ¬ 3.2 U+00AC ¬
160             not => 172,
161             # ­ мягкий перенос (обозначает место возможного переноса: при отсутствии переноса невидим, при наличии — виден как дефис перед разрывом строки). В примере, по отсутствию переноса, невидим. ­ 3.2 U+00AD ­
162             shy => 173,
163             # ® знак правовой охраны товарного знака ® 5.0 U+00AE ® ® 5.0 ® 3.2
164             REG => 174,
165             circledR => 174,
166             reg => 174,
167             # ¯ занимающий позицию макрон &hibar; нестандарт U+00AF ¯ ¯on; нестандарт ¯ 5.0 ¯ 3.2
168             hibar => 175,
169             macron => 175,
170             strns => 175,
171             macr => 175,
172             # ° занимающий позицию знак градуса °ree; нестандарт U+00B0 ° ° 3.2
173             degree => 176,
174             deg => 176,
175             # ± плюс-минус ± 5.0 U+00B1 ± ± 5.0 ± 3.2
176             pm => 177,
177             PlusMinus => 177,
178             plusmn => 177,
179             # ² верхний индекс «2» ² 3.2 U+00B2 ²
180             sup2 => 178,
181             # ³ верхний индекс «3» ³ 3.2 U+00B3 ³
182             sup3 => 179,
183             # ´ занимающий позицию акут ´ 5.0 U+00B4 ´ ´ 3.2
184             DiacriticalAcute => 180,
185             acute => 180,
186             # µ дольный префикс микро микрон — устаревшее обозначение микрометра µ 3.2 U+00B5 µ
187             micro => 181,
188             # ¶ знак абзаца ¶ 3.2 U+00B6 ¶
189             para => 182,
190             # · интерпункт · 5.0 U+00B7 · · 5.0 · 3.2
191             middot => 183,
192             CenterDot => 183,
193             centerdot => 183,
194             # ¸ занимающая позицию седиль ¸ 5.0 U+00B8 ¸ ¸ 3.2
195             Cedilla => 184,
196             cedil => 184,
197             # ¹ верхний индекс «1» ¹ 3.2 U+00B9 ¹
198             sup1 => 185,
199             # º порядковый индикатор (мужской род) º 3.2 U+00BA º
200             ordm => 186,
201             # » направленная вправо двойная угловая кавычка » 3.2 U+00BB »
202             raquo => 187,
203             # ¼ простая дробь «одна четвёртая» ¼ 3.2 U+00BC ¼
204             frac14 => 188,
205             # ½ простая дробь «одна вторая» ½ 5.0 U+00BD ½ ½ 3.2
206             half => 189,
207             frac12 => 189,
208             # ¾ простая дробь «три четверти» ¾ 3.2 U+00BE ¾
209             frac34 => 190,
210             # ¿ перевёрнутый знак вопроса ¿ 3.2 U+00BF ¿
211             iquest => 191,
212             # À латинская заглавная A с грависом («тупым ударением») À 2.0 U+00C0 À
213             Agrave => 192,
214             # Á латинская заглавная A с акутом («острым ударением») Á 2.0 U+00C1 Á
215             Aacute => 193,
216             # Â латинская заглавная A с циркумфлексом Â 2.0 U+00C2 Â
217             Acirc => 194,
218             # Ã латинская заглавная A с тильдой Ã 2.0 U+00C3 Ã
219             Atilde => 195,
220             # Ä латинская заглавная A с тремой Ä 2.0 U+00C4 Ä
221             Auml => 196,
222             # Å латинская заглавная A с кружком сверху Å 2.0 U+00C5 Å
223             Aring => 197,
224             # Æ латинская заглавная лигатура AE Æ 2.0 U+00C6 Æ
225             AElig => 198,
226             # Ç латинская заглавная C с седилью Ç 2.0 U+00C7 Ç
227             Ccedil => 199,
228             # È латинская заглавная E с грависом È 2.0 U+00C8 È
229             Egrave => 200,
230             # É латинская заглавная E с акутом É 2.0 U+00C9 É
231             Eacute => 201,
232             # Ê латинская заглавная E с циркумфлексом Ê 2.0 U+00CA Ê
233             Ecirc => 202,
234             # Ë латинская заглавная E с тремой Ë 2.0 U+00CB Ë
235             Euml => 203,
236             # Ì латинская заглавная I с грависом Ì 2.0 U+00CC Ì
237             Igrave => 204,
238             # Í латинская заглавная I с акутом Í 2.0 U+00CD Í
239             Iacute => 205,
240             # Î латинская заглавная I с циркумфлексом Î 2.0 U+00CE Î
241             Icirc => 206,
242             # Ï латинская заглавная I с тремой Ï 2.0 U+00CF Ï
243             Iuml => 207,
244             # Ð латинская заглавная буква «eth» Ð 2.0 U+00D0 Ð
245             ETH => 208,
246             # Ñ латинская заглавная N с тильдой Ñ 2.0 U+00D1 Ñ
247             Ntilde => 209,
248             # Ò латинская заглавная O с грависом Ò 2.0 U+00D2 Ò
249             Ograve => 210,
250             # Ó латинская заглавная O с акутом Ó 2.0 U+00D3 Ó
251             Oacute => 211,
252             # Ô латинская заглавная O с циркумфлексом Ô 2.0 U+00D4 Ô
253             Ocirc => 212,
254             # Õ латинская заглавная O с тильдой Õ 2.0 U+00D5 Õ
255             Otilde => 213,
256             # Ö латинская заглавная O с тремой Ö 2.0 U+00D6 Ö
257             Ouml => 214,
258             # × знак умножения × 3.2 U+00D7 ×
259             times => 215,
260             # Ø латинская заглавная O диагонально перечёркнутая Ø 2.0 U+00D8 Ø
261             Oslash => 216,
262             # Ù латинская заглавная U с грависом Ù 2.0 U+00D9 Ù
263             Ugrave => 217,
264             # Ú латинская заглавная U с акутом Ú 2.0 U+00DA Ú
265             Uacute => 218,
266             # Û латинская заглавная U с циркумфлексом Û 2.0 U+00DB Û
267             Ucirc => 219,
268             # Ü латинская заглавная U с тремой Ü 2.0 U+00DC Ü
269             Uuml => 220,
270             # Ý латинская заглавная Y с акутом Ý 2.0 U+00DD Ý
271             Yacute => 221,
272             # Þ латинская заглавная буква Торн (THORN) Þ 2.0 U+00DE Þ
273             THORN => 222,
274             # ß латинская строчная эсцет ß 2.0 U+00DF ß
275             szlig => 223,
276             # à латинская строчная «a» с грависом à 2.0 U+00E0 à
277             agrave => 224,
278             # á латинская строчная «a» с акутом á 2.0 U+00E1 á
279             aacute => 225,
280             # â латинская строчная «a» с циркумфлексом â 2.0 U+00E2 â
281             acirc => 226,
282             # ã латинская строчная «a» с тильдой ã 2.0 U+00E3 ã
283             atilde => 227,
284             # ä латинская строчная «a» с тремой ä 2.0 U+00E4 ä
285             auml => 228,
286             # å латинская строчная «a» с кружком сверху å 2.0 U+00E5 å
287             aring => 229,
288             # æ латинская строчная лигатура «ae» æ 2.0 U+00E6 æ
289             aelig => 230,
290             # ç латинская строчная «c» с седилью ç 2.0 U+00E7 ç
291             ccedil => 231,
292             # è латинская строчная «e» с грависом è 2.0 U+00E8 è
293             egrave => 232,
294             # é латинская строчная «e» с акутом é 2.0 U+00E9 é
295             eacute => 233,
296             # ê латинская строчная «e» с циркумфлексом ê 2.0 U+00EA ê
297             ecirc => 234,
298             # ë латинская строчная «e» с тремой ë 2.0 U+00EB ë
299             euml => 235,
300             # ì латинская строчная «i» с грависом ì 2.0 U+00EC ì
301             igrave => 236,
302             # í латинская строчная «i» с акутом í 2.0 U+00ED í
303             iacute => 237,
304             # î латинская строчная «i» с циркумфлексом î 2.0 U+00EE î
305             icirc => 238,
306             # ï латинская строчная «i» с тремой ï 2.0 U+00EF ï
307             iuml => 239,
308             # ð латинская строчная «eth» ð 2.0 U+00F0 ð
309             eth => 240,
310             # ñ латинская строчная «n» с тильдой ñ 2.0 U+00F1 ñ
311             ntilde => 241,
312             # ò латинская строчная «o» с грависом ò 2.0 U+00F2 ò
313             ograve => 242,
314             # ó латинская строчная «o» с акутом ó 2.0 U+00F3 ó
315             oacute => 243,
316             # ô латинская строчная «o» с циркумфлексом ô 2.0 U+00F4 ô
317             ocirc => 244,
318             # õ латинская строчная «o» с тильдой õ 2.0 U+00F5 õ
319             otilde => 245,
320             # ö латинская строчная «o» с тремой ö 2.0 U+00F6 ö
321             ouml => 246,
322             # ÷ знак деления ÷ 5.0 (?) U+00F7 ÷ ÷ 3.2
323             div => 247,
324             divide => 247,
325             # ø латинская строчная «o» диагонально перечёркнутая ø 2.0 U+00F8 ø
326             oslash => 248,
327             # ù латинская строчная «u» с грависом ù 2.0 U+00F9 ù
328             ugrave => 249,
329             # ú латинская строчная «u» с акутом ú 2.0 U+00FA ú
330             uacute => 250,
331             # û латинская строчная «u» с циркумфлексом û 2.0 U+00FB û
332             ucirc => 251,
333             # ü латинская строчная «u» с тремой ü 2.0 U+00FC ü
334             uuml => 252,
335             # ý латинская строчная «y» с акутом ý 2.0 U+00FD ý
336             yacute => 253,
337             # þ латинская строчная «торн» (thorn) þ 2.0 U+00FE þ
338             thorn => 254,
339             # ÿ латинская строчная «y» с тремой ÿ 2.0 U+00FF ÿ
340             yuml => 255,
341             #
342             #
343             # Расширение латиницы — A
344             # U+0100—U+017F
345             # Символ Назначение Мнемоника HTML Код
346             #
347             # Ā латинская заглавная «A» с макроном Ā 5.0 U+0100 Ā
348             Amacr => 256,
349             # ā латинская строчная «a» с макроном ā 5.0 U+0101 ā
350             amacr => 257,
351             # Ă латинская заглавная «A» с бреве Ă 5.0 U+0102 Ă
352             Abreve => 258,
353             # ă латинская строчная «a» с бреве ă 5.0 U+0103 ă
354             abreve => 259,
355             # Ą латинская заглавная «A» с огонэком Ą 5.0 U+0104 Ą
356             Aogon => 260,
357             # ą латинская строчная «a» с огонэком ą 5.0 U+0105 ą
358             aogon => 261,
359             # Ć латинская заглавная «C» с акутом Ć 5.0 U+0106 Ć
360             Cacute => 262,
361             # ć латинская строчная «c» с акутом ć 5.0 U+0107 ć
362             cacute => 263,
363             # Ĉ латинская заглавная «C» с циркумфлексом Ĉ 5.0 U+0108 Ĉ
364             Ccirc => 264,
365             # ĉ латинская строчная «c» с циркумфлексом ĉ 5.0 U+0109 ĉ
366             ccirc => 265,
367             # Ċ латинская заглавная «C» с точкой сверху Ċ 5.0 U+010A Ċ
368             Cdot => 266,
369             # ċ латинская строчная «c» с точкой сверху ċ 5.0 U+010B ċ
370             cdot => 267,
371             # Č латинская заглавная «C» с птичкой Č 5.0 U+010C Č
372             Ccaron => 268,
373             # č латинская строчная «c» с птичкой č 5.0 U+010D č
374             ccaron => 269,
375             # Ď латинская заглавная «D» с птичкой Ď 5.0 U+010E Ď
376             Dcaron => 270,
377             # ď латинская строчная «d» с птичкой (в шрифтах предпочтителен вариант с апострофом) ď 5.0 U+010F ď
378             dcaron => 271,
379             # Đ латинская заглавная «D» с горизонтальным штрихом. На вид может не отличаться от Eth (Ð, U+00D0, Ð) Đ 5.0 U+0110 Đ
380             Dstrok => 272,
381             ETH => 272,
382             # đ латинская строчная «d» с горизонтальным штрихом. На вид может не отличаться от eth (ð, U+00F0, ð) đ 5.0 U+0111 đ
383             dstrok => 273,
384             eth => 273,
385             # Ē латинская заглавная «E» с макроном Ē 5.0 U+0112 Ē
386             Emacr => 274,
387             # ē латинская строчная «e» с макроном ē 5.0 U+0113 ē
388             emacr => 275,
389             # Ĕ латинская заглавная «E» с бреве U+0114 Ĕ
390             # ĕ латинская строчная «e» с бреве U+0115 ĕ
391             # Ė латинская заглавная «E» с точкой сверху Ė 5.0 U+0116 Ė
392             Edot => 278,
393             # ė латинская строчная «e» с точкой сверху ė 5.0 U+0117 ė
394             edot => 279,
395             # Ę латинская заглавная «E» с огонэком Ę 5.0 U+0118 Ę
396             Eogon => 280,
397             # ę латинская строчная «e» с огонэком ę 5.0 U+0119 ę
398             eogon => 281,
399             # Ě латинская заглавная «E» с птичкой Ě 5.0 U+011A Ě
400             Ecaron => 282,
401             # ě латинская строчная «e» с птичкой ě 5.0 U+011B ě
402             ecaron => 283,
403             # Ĝ латинская заглавная «G» с циркумфлексом Ĝ 5.0 U+011C Ĝ
404             Gcirc => 284,
405             # ĝ латинская строчная «g» с циркумфлексом ĝ 5.0 U+011D ĝ
406             gcirc => 285,
407             # Ğ латинская заглавная «G» с бреве Ğ 5.0 U+011E Ğ
408             Gbreve => 286,
409             # ğ латинская строчная «g» с бреве ğ 5.0 U+011F ğ
410             gbreve => 287,
411             # Ġ латинская заглавная «G» с точкой сверху Ġ 5.0 U+0120 Ġ
412             Gdot => 288,
413             # ġ латинская строчная «g» с точкой сверху ġ 5.0 U+0121 ġ
414             gdot => 289,
415             # Ģ латинская заглавная «G» с цедилью Ģ 5.0 U+0122 Ģ
416             Gcedil => 290,
417             # ģ латинская строчная «g» с цедилью U+0123 ģ
418             # Ĥ латинская заглавная «H» с циркумфлексом Ĥ 5.0 U+0124 Ĥ
419             Hcirc => 292,
420             # ĥ латинская строчная «h» с циркумфлексом ĥ 5.0 U+0125 ĥ
421             hcirc => 293,
422             # Ħ латинская заглавная «H» с горизонтальным штрихом Ħ 5.0 U+0126 Ħ
423             Hstrok => 294,
424             # ħ латинская строчная «h» с горизонтальным штрихом ħ 5.0 U+0127 ħ
425             hstrok => 295,
426             # Ĩ латинская заглавная «I» с тильдой Ĩ 5.0 U+0128 Ĩ
427             Itilde => 296,
428             # ĩ латинская строчная «i» с тильдой ĩ 5.0 U+0129 ĩ
429             itilde => 297,
430             # Ī латинская заглавная «I» с макроном Ī 5.0 U+012A Ī
431             Imacr => 298,
432             # ī латинская строчная «i» с макроном ī 5.0 U+012B ī
433             imacr => 299,
434             # Ĭ латинская заглавная «I» с бреве U+012C Ĭ
435             # ĭ латинская строчная «i» с бреве U+012D ĭ
436             # Į латинская заглавная «I» с огонэком Į 5.0 U+012E Į
437             Iogon => 302,
438             # į латинская строчная «i» с огонэком į 5.0 U+012F į
439             iogon => 303,
440             # İ латинская заглавная «I» с точкой сверху İ 5.0 U+0130 İ
441             Idot => 304,
442             # ı латинская строчная «i» без точки сверху ı 5.0 U+0131 ı ı
443             imath => 305,
444             inodot => 305,
445             # IJ латинская заглавная лигатура «IJ» IJ 5.0 U+0132 IJ
446             IJlig => 306,
447             # ij латинская строчная лигатура «ij» ij 5.0 U+0133 ij
448             ijlig => 307,
449             # Ĵ латинская заглавная «J» с циркумфлексом Ĵ 5.0 U+0134 Ĵ
450             Jcirc => 308,
451             # ĵ латинская строчная «j» с циркумфлексом ĵ 5.0 U+0135 ĵ
452             jcirc => 309,
453             # Ķ латинская заглавная «K» с цедилью Ķ 5.0 U+0136 Ķ
454             Kcedil => 310,
455             # ķ латинская строчная «k» с цедилью ķ 5.0 U+0137 ķ
456             kcedil => 311,
457             # ĸ латинская строчная «kra» (гренландское «к») ĸ 5.0 U+0138 ĸ
458             kgreen => 312,
459             # Ĺ латинская заглавная «L» с акутом Ĺ 5.0 U+0139 Ĺ
460             Lacute => 313,
461             # ĺ латинская строчная «l» с акутом ĺ 5.0 U+013A ĺ
462             lacute => 314,
463             # Ļ латинская заглавная «L» с цедилью Ļ 5.0 U+013B Ļ
464             Lcedil => 315,
465             # ļ латинская строчная «l» с цедилью ļ 5.0 U+013C ļ
466             lcedil => 316,
467             # Ľ латинская заглавная «L» с птичкой (в шрифтах предпочтителен вариант с апострофом) Ľ 5.0 U+013D Ľ
468             Lcaron => 317,
469             # ľ латинская строчная «l» с птичкой (в шрифтах предпочтителен вариант с апострофом) ľ 5.0 U+013E ľ
470             lcaron => 318,
471             # Ŀ латинская заглавная «L» с точкой посередине Ŀ 5.0 U+013F Ŀ
472             Lmidot => 319,
473             # ŀ латинская строчная «l» с точкой посередине ŀ 5.0 U+0140 ŀ
474             lmidot => 320,
475             # Ł латинская заглавная «L» с горизонтальным штрихом Ł 5.0 U+0141 Ł
476             Lstrok => 321,
477             # ł латинская строчная «l» с горизонтальным штрихом ł 5.0 U+0142 ł
478             lstrok => 322,
479             # Ń латинская заглавная «N» с акутом Ń 5.0 U+0143 Ń
480             Nacute => 323,
481             # ń латинская строчная «n» с акутом ń 5.0 U+0144 ń
482             nacute => 324,
483             # Ņ латинская заглавная «N» с цедилью Ņ 5.0 U+0145 Ņ
484             Ncedil => 325,
485             # ņ латинская строчная «n» с цедилью ņ 5.0 U+0146 ņ
486             ncedil => 326,
487             # Ň латинская заглавная «N» с птичкой Ň 5.0 U+0147 Ň
488             Ncaron => 327,
489             # ň латинская строчная «n» с птичкой ň 5.0 U+0148 ň
490             ncaron => 328,
491             # ʼn латинская строчная «n» предшествуемая апострофом ʼn 5.0 U+0149 ʼn
492             napos => 329,
493             # Ŋ латинская заглавная «ENG» Ŋ 5.0 U+014A Ŋ
494             ENG => 330,
495             # ŋ латинская строчная «eng» ŋ 5.0 U+014B ŋ
496             eng => 331,
497             # Ō латинская заглавная «O» с макроном Ō 5.0 U+014C Ō
498             Omacr => 332,
499             # ō латинская строчная «o» с макроном ō 5.0 U+014D ō
500             omacr => 333,
501             # Ŏ латинская заглавная «O» с бреве U+014E Ŏ
502             # ŏ латинская строчная «o» с бреве U+014F ŏ
503             # Ő латинская заглавная «O» с двойным акутом Ő 5.0 U+0150 Ő
504             Odblac => 336,
505             # ő латинская строчная «o» с двойным акутом ő 5.0 U+0151 ő
506             odblac => 337,
507             # Œ латинская заглавная лигатура «OE» Œ 4.0 U+0152 Œ
508             OElig => 338,
509             # œ латинская строчная лигатура «oe» œ 4.0 U+0153 œ
510             oelig => 339,
511             # Ŕ латинская заглавная «R» с акутом Ŕ 5.0 U+0154 Ŕ
512             Racute => 340,
513             # ŕ латинская строчная «r» с акутом ŕ 5.0 U+0155 ŕ
514             racute => 341,
515             # Ŗ латинская заглавная «R» с цедилью Ŗ 5.0 U+0156 Ŗ
516             Rcedil => 342,
517             # ŗ латинская строчная «r» с цедилью ŗ 5.0 U+0157 ŗ
518             rcedil => 343,
519             # Ř латинская заглавная «R» с птичкой Ř 5.0 U+0158 Ř
520             Rcaron => 344,
521             # ř латинская строчная «r» с птичкой ř 5.0 U+0159 ř
522             rcaron => 345,
523             # Ś латинская заглавная «S» с акутом Ś 5.0 U+015A Ś
524             Sacute => 346,
525             # ś латинская строчная «s» с акутом ś 5.0 U+015B ś
526             sacute => 347,
527             # Ŝ латинская заглавная «S» с циркумфлексом Ŝ 5.0 U+015C Ŝ
528             Scirc => 348,
529             # ŝ латинская строчная «s» с циркумфлексом ŝ 5.0 U+015D ŝ
530             scirc => 349,
531             # Ş латинская заглавная «S» с цедилью Ş 5.0 U+015E Ş
532             Scedil => 350,
533             # ş латинская строчная «s» с цедилью ş 5.0 U+015F ş
534             scedil => 351,
535             # Š латинская заглавная «S» с птичкой Š 4.0 U+0160 Š
536             Scaron => 352,
537             # š латинская строчная «s» с птичкой š 4.0 U+0161 š
538             scaron => 353,
539             # Ţ латинская заглавная «T» с цедилью Ţ 5.0 U+0162 Ţ
540             Tcedil => 354,
541             # ţ латинская строчная «t» с цедилью ţ 5.0 U+0163 ţ
542             tcedil => 355,
543             # Ť латинская заглавная «T» с птичкой Ť 5.0 U+0164 Ť
544             Tcaron => 356,
545             # ť латинская строчная «t» с птичкой (в шрифтах предпочтителен вариант с апострофом) ť 5.0 U+0165 ť
546             tcaron => 357,
547             # Ŧ латинская заглавная «T» с горизонтальным штрихом Ŧ 5.0 U+0166 Ŧ
548             Tstrok => 358,
549             # ŧ латинская строчная «t» с горизонтальным штрихом ŧ 5.0 U+0167 ŧ
550             tstrok => 359,
551             # Ũ латинская заглавная «U» с тильдой Ũ 5.0 U+0168 Ũ
552             Utilde => 360,
553             # ũ латинская строчная «u» с тильдой ũ 5.0 U+0169 ũ
554             utilde => 361,
555             # Ū латинская заглавная «U» с макроном Ū 5.0 U+016A Ū
556             Umacr => 362,
557             # ū латинская строчная «u» с макроном ū 5.0 U+016B ū
558             umacr => 363,
559             # Ŭ латинская заглавная «U» с бреве Ŭ 5.0 U+016C Ŭ
560             Ubreve => 364,
561             # ŭ латинская строчная «u» с бреве ŭ 5.0 U+016D ŭ
562             ubreve => 365,
563             # Ů латинская заглавная «U» с кольцом сверху Ů 5.0 U+016E Ů
564             Uring => 366,
565             # ů латинская строчная «u» с кольцом сверху ů 5.0 U+016F ů
566             uring => 367,
567             # Ű латинская заглавная «U» с двойным акутом Ű 5.0 U+0170 Ű
568             Udblac => 368,
569             # ű латинская строчная «u» с двойным акутом ű 5.0 U+0171 ű
570             udblac => 369,
571             # Ų латинская заглавная «U» с огонэком Ų 5.0 U+0172 Ų
572             Uogon => 370,
573             # ų латинская строчная «u» с огонэком ų 5.0 U+0173 ų
574             uogon => 371,
575             # Ŵ латинская заглавная «W» с циркумфлексом Ŵ 5.0 U+0174 Ŵ
576             Wcirc => 372,
577             # ŵ латинская строчная «w» с циркумфлексом ŵ 5.0 U+0175 ŵ
578             wcirc => 373,
579             # Ŷ латинская заглавная «Y» с циркумфлексом Ŷ 5.0 U+0176 Ŷ
580             Ycirc => 374,
581             # ŷ латинская строчная «y» с циркумфлексом ŷ 5.0 U+0177 ŷ
582             ycirc => 375,
583             # Ÿ латинская заглавная «Y» с тремой Ÿ 4.0 U+0178 Ÿ
584             Yuml => 376,
585             # Ź латинская заглавная «Z» с акутом Ź 5.0 U+0179 Ź
586             Zacute => 377,
587             # ź латинская строчная «z» с акутом ź 5.0 U+017A ź
588             zacute => 378,
589             # Ż латинская заглавная «Z» с точкой сверху Ż 5.0 U+017B Ż
590             Zdot => 379,
591             # ż латинская строчная «z» с точкой сверху ż 5.0 U+017C ż
592             zdot => 380,
593             # Ž латинская заглавная «Z» с птичкой Ž 5.0 U+017D Ž
594             Zcaron => 381,
595             # ž латинская строчная «z» с птичкой ž 5.0 U+017E ž
596             zcaron => 382,
597             # ſ латинская строчная «долгая s» U+017F ſ
598             #
599             #
600             # Расширение латиницы — B
601             # U+0180—U+024F
602             # Символ Назначение Мнемоника HTML Код
603             #
604             # ƒ • латинская строчная f с хвостиком снизу (иногда называется рукописной f, на самом деле прямая или курсив)
605             # • знак флорина
606             # • символ функции
607             # • это не регулярная курсивная латинская f (𝑓, U+1D453), хотя, в зависимости от шрифта, может выглядеть очень похоже ƒ 4.0 U+0192 ƒ
608             fnof => 402,
609             # Ƶ латинская заглавная «Z» с горизонтальным штрихом Ƶ 5.0 U+01B5 Ƶ
610             imped => 437,
611             # ǵ латинская строчная «g» с акутом ǵ 5.0 U+01F5 ǵ
612             gacute => 501,
613             # ȷ латинская строчная «j» без точки сверху ȷ 5.0 U+0237 ȷ
614             jmath => 567,
615             #
616             #
617             # Занимающие позицию модификаторы букв
618             # U+02B0—U+02FF
619             # Символ Назначение Мнемоника HTML Код
620             #
621             # ˆ занимающий позицию акцент перевёрнутая птичка/circumflex accent ˆ 4.0 U+02C6 ˆ
622             circ => 710,
623             # ˇ занимающий позицию акцент птичка (гачек) ˇ 5.0 U+02C7 ˇ ˇ
624             caron => 711,
625             Hacek => 711,
626             # ˘ занимающий позицию бреве ˘ 5.0 U+02D8 ˘ ˘
627             Breve => 728,
628             breve => 728,
629             # ˙ занимающая позицию точка сверху ˙ 5.0 U+02D9 ˙ ˙
630             dot => 729,
631             DiacriticalDot => 729,
632             # ˚ занимающий позицию кружок сверху ˚ 5.0 U+02DA ˚
633             ring => 730,
634             # ˛ занимающий позицию огонэк ˛ 5.0 U+02DB ˛
635             ogon => 731,
636             # ˜ занимающая позицию малая тильда ˜ 5.0 U+02DC ˜ ˜ 4.0
637             DiacriticalTilde => 732,
638             tilde => 732,
639             # ˝ занимающий позицию двойной акут ˝ 5.0 U+02DD ˝ ˝
640             DiacriticalDoubleAcute => 733,
641             dblac => 733,
642             #
643             #
644             # Комбинируемые диакритические знаки
645             # U+0300—U+036F
646             # Символ Назначение Мнемоника HTML Код
647             #
648             # ́ комбинируемый знак ударения (аку́т — ставится непосредственно после буквы, над которой должен изображаться) U+0301 ́
649             # ̑ комбинируемый перевёрнутый бре́вис (ставится непосредственно после буквы, над которой должен изображаться) ̑ 5.0 U+0311 ̑
650             DownBreve => 785,
651             #
652             #
653             # Греческие и коптские символы
654             # U+0370 — U+03FF
655             # Включает Греческий алфавит.
656             #
657             # Символ Назначение Мнемоника HTML Код
658             #
659             # Α греческая заглавная альфа Α 4.0 U+0391 Α
660             Alpha => 913,
661             # Β греческая заглавная бета Β 4.0 U+0392 Β
662             Beta => 914,
663             # Γ греческая заглавная гамма Γ 4.0 U+0393 Γ
664             Gamma => 915,
665             # Δ греческая заглавная дельта Δ 4.0 U+0394 Δ
666             Delta => 916,
667             # Ε греческая заглавная эпсилон Ε 4.0 U+0395 Ε
668             Epsilon => 917,
669             # Ζ греческая заглавная дзета Ζ 4.0 U+0396 Ζ
670             Zeta => 918,
671             # Η греческая заглавная эта Η 4.0 U+0397 Η
672             Eta => 919,
673             # Θ греческая заглавная тета Θ 4.0 U+0398 Θ
674             Theta => 920,
675             # Ι греческая заглавная йота Ι 4.0 U+0399 Ι
676             Iota => 921,
677             # Κ греческая заглавная каппа Κ 4.0 U+039A Κ
678             Kappa => 922,
679             # Λ греческая заглавная лямбда Λ 4.0 U+039B Λ
680             Lambda => 923,
681             # Μ греческая заглавная мю Μ 4.0 U+039C Μ
682             Mu => 924,
683             # Ν греческая заглавная ню Ν 4.0 U+039D Ν
684             Nu => 925,
685             # Ξ греческая заглавная кси Ξ 4.0 U+039E Ξ
686             Xi => 926,
687             # Ο греческая заглавная омикрон Ο 4.0 U+039F Ο
688             Omicron => 927,
689             # Π греческая заглавная пи Π 4.0 U+03A0 Π
690             Pi => 928,
691             # Ρ греческая заглавная ро Ρ 4.0 U+03A1 Ρ
692             Rho => 929,
693             # Σ греческая заглавная сигма Σ 4.0 U+03A3 Σ
694             Sigma => 931,
695             # Τ греческая заглавная тау Τ 4.0 U+03A4 Τ
696             Tau => 932,
697             # Υ греческая заглавная ипсилон Υ 4.0 U+03A5 Υ
698             Upsilon => 933,
699             # Φ греческая заглавная фи Φ 4.0 U+03A6 Φ
700             Phi => 934,
701             # Χ греческая заглавная хи Χ 4.0 U+03A7 Χ
702             Chi => 935,
703             # Ψ греческая заглавная пси Ψ 4.0 U+03A8 Ψ
704             Psi => 936,
705             # Ω • греческая заглавная омега
706             # • Ом (единица электрического сопротивления) — рекомендуется вместо ранее введённого специального символа «Ом» U+2126 (Ω, Ω) Ω 5.0 U+03A9 Ω Ω 4.0
707             ohm => 937,
708             Omega => 937,
709             # α греческая строчная альфа α 4.0 U+03B1 α
710             alpha => 945,
711             # β греческая строчная бета β 4.0 U+03B2 β
712             beta => 946,
713             # γ греческая строчная гамма γ 4.0 U+03B3 γ
714             gamma => 947,
715             # δ греческая строчная дельта δ 4.0 U+03B4 δ
716             delta => 948,
717             # ε греческая строчная эпсилон ε 5.0 U+03B5 ε ε 4.0
718             epsi => 949,
719             epsilon => 949,
720             # ζ греческая строчная дзета ζ 4.0 U+03B6 ζ
721             zeta => 950,
722             # η греческая строчная эта η 4.0 U+03B7 η
723             eta => 951,
724             # θ греческая строчная тета θ 4.0 U+03B8 θ
725             theta => 952,
726             # ι греческая строчная йота ι 4.0 U+03B9 ι
727             iota => 953,
728             # κ греческая строчная каппа κ 4.0 U+03BA κ
729             kappa => 954,
730             # λ греческая строчная лямбда λ 4.0 U+03BB λ
731             lambda => 955,
732             # μ греческая строчная мю μ 4.0 U+03BC μ
733             mu => 956,
734             # ν греческая строчная ню ν 4.0 U+03BD ν
735             nu => 957,
736             # ξ греческая строчная кси ξ 4.0 U+03BE ξ
737             xi => 958,
738             # ο греческая строчная омикрон ο 4.0 U+03BF ο
739             omicron => 959,
740             # π греческая строчная пи π 4.0 U+03C0 π
741             pi => 960,
742             # ρ греческая строчная ро ρ 4.0 U+03C1 ρ
743             rho => 961,
744             # ς греческая строчная сигма конечная ς 5.0 U+03C2 ς ς 5.0 ς 4.0
745             sigmav => 962,
746             varsigma => 962,
747             sigmaf => 962,
748             # σ греческая строчная сигма σ 4.0 U+03C3 σ
749             sigma => 963,
750             # τ греческая строчная тау τ 4.0 U+03C4 τ
751             tau => 964,
752             # υ греческая строчная ипсилон υ 5.0 U+03C5 υ υ 4.0
753             upsi => 965,
754             upsilon => 965,
755             # φ греческая строчная фи φ 4.0 U+03C6 φ
756             phi => 966,
757             # χ греческая строчная хи χ 4.0 U+03C7 χ
758             chi => 967,
759             # ψ греческая строчная пси ψ 4.0 U+03C8 ψ
760             psi => 968,
761             # ω греческая строчная омега ω 4.0 U+03C9 ω
762             omega => 969,
763             # ϑ греческая символьная тета ϑ 5.0 U+03D1 ϑ ϑ 5.0 ϑ 4.0
764             thetav => 977,
765             vartheta => 977,
766             thetasym => 977,
767             # ϒ греческий ипсилон с хвостиком ϒ 5.0 U+03D2 ϒ ϒ 4.0
768             Upsi => 978,
769             upsih => 978,
770             # ϕ греческая символьная фи ϕ 5.0 U+03D5 ϕ ϕ 5.0 ϕ 5.0
771             straightphi => 981,
772             varphi => 981,
773             phiv => 981,
774             # ϖ греческая символьная пи ϖ 5.0 U+03D6 ϖ ϖ 4.0
775             varpi => 982,
776             piv => 982,
777             # Ϝ греческая заглавная дигамма Ϝ 5.0 U+03DC Ϝ
778             Gammad => 988,
779             # ϝ греческая строчная дигамма ϝ 5.0 U+03DD ϝ ϝ 5.0
780             gammad => 989,
781             digamma => 989,
782             # ϰ греческая символьная каппа ϰ 5.0 U+03F0 ϰ ϰ 5.0
783             varkappa => 1008,
784             kappav => 1008,
785             # ϱ греческая символьная ро ϱ 5.0 U+03F1 ϱ ϱ 5.0
786             varrho => 1009,
787             rhov => 1009,
788             # ϵ греческая символьный эпсилон (прямой эпсилон, лунный эпсилон) ϵ 5.0 U+03F5 ϵ ϵ 5.0 ϵ 5.0
789             straightepsilon => 1013,
790             varepsilon => 1013,
791             epsiv => 1013,
792             # ϶ греческая обратный эпсилон (обращённый лунный эпсилон) ϶ 5.0 U+03F6 ϶ ϶ 5.0
793             backepsilon => 1014,
794             bepsi => 1014,
795             #
796             #
797             # Общая пунктуация
798             # Символ Назначение Мнемоника Код
799             #
800             #   пробел длины N (длинный пробел, примерно с короткое тире)    
801             ensp => 8194,
802             #   пробел длины M (очень длинный пробел, примерно с длинное тире)    
803             emsp => 8195,
804             #   узкий пробел    
805             thinsp => 8201,
806             # ‌‌ zero width non-joiner — запрет склейки (лигатуры) соседних символов ‌ ‌
807             zwnj => 8204,
808             # ‍‍ zero width joiner — запрос на склейку (лигатуру) соседних символов ‍ ‍
809             zwj => 8205,
810             # ‎ left-to-right mark — признак начала текста, читаемого слева­‑направо ‎ ‎
811             lrm => 8206,
812             # ‏ right-to-left mark — признак начала текста, читаемого справа­‑налево ‏ ‏
813             rlm => 8207,
814             # ‑ неразрывный (неразделяемый) дефис / non-breaking hyphen ‑
815             # – короткое тире (тире длины N) – –
816             ndash => 8211,
817             # — длинное тире (тире длины M) — —
818             mdash => 8212,
819             # ‘ одинарная кавычка типа «верхняя перевёрнутая девятка» ‘ ‘
820             lsquo => 8216,
821             # ’ одинарная кавычка типа «верхняя девятка» ’ ’
822             rsquo => 8217,
823             # ‚ одинарная кавычка типа «нижняя девятка» ‚ ‚
824             sbquo => 8218,
825             # ‛ одинарная кавычка типа «верхняя обращённая девятка» ‛
826             # “ двойная кавычка типа «верхняя перевёрнутая девятка» “ “
827             ldquo => 8220,
828             # ” двойная кавычка типа «верхняя девятка» ” ”
829             rdquo => 8221,
830             # „ двойная кавычка типа «нижняя девятка» „ „
831             bdquo => 8222,
832             # ‟ двойная кавычка типа «верхняя обращённая девятка» ‟
833             # † типографский крестик † †
834             dagger => 8224,
835             # ‡ двойной типографский крестик ‡ ‡
836             Dagger => 8225,
837             # • маркер списка (буллит) • •
838             bull => 8226,
839             # … горизонтальное многоточие … …
840             hellip => 8230,
841             # ‰ проми́лле ‰ ‰
842             permil => 8240,
843             # ′ штрих ′ ′
844             prime => 8242,
845             # ″ двойной штрих ″ ″
846             Prime => 8243,
847             # ‹ направленная влево одинарная угловая кавычка (предложена, но ещё не стандартизирована ISO, практически всюду есть) ‹ ‹
848             lsaquo => 8249,
849             # › направленная вправо одинарная угловая кавычка (предложена, но ещё не стандартизирована ISO, практически всюду есть) › ›
850             rsaquo => 8250,
851             # ‾ занимающее позицию надчёркивание ‾ ‾
852             oline => 8254,
853             # ⁄ комбинируемый символ «дробь-черта» (1⁄2 → ½, 3⁄4 → ¾, 12⁄23 → 12⁄23, при необходимости последовательность цифр ограничивается пробелом нулевой длины (​) или неразрывным пробелом нулевой длины (⁠): 12​34⁄56 → 12​34⁄56, 2⁠99⁄100 → 2⁠99⁄100) ⁄ ⁄
854             frasl => 8260,
855             #
856             #
857             # Знаки валют
858             # Символ Назначение Мнемоника Код
859             #
860             # € евро € €
861             euro => 8364,
862             # ₽ рубль ₽
863             #
864             #
865             # Буквоподобные символы
866             # Символ Назначение Мнемоника Код
867             #
868             # ℑ готическая заглавная I (регулярная латинская готическая буква) = мнимая часть ℑ ℑ
869             image => 8465,
870             # № Знак номера № (HTML 5.0) №
871             numero => 8470,
872             # ℘ эллиптическая функция Вейерштрасса или множество всех подмножеств. Отдельный символ, >не рукописная заглавная P (𝒫, 𝒫) ℘ ℘
873             weierp => 8472,
874             # ℜ готическая заглавная R (регулярная латинская готическая буква) = вещественная часть ℜ ℜ
875             real => 8476,
876             # ™ товарный знак ™ — есть не всюду ™ ™
877             TRADE => 8482,
878             trade => 8482,
879             # ℵ математическая буква Алеф = бесконечный кардинал — в отличие от еврейской буквы Алеф (‎א‎, א) читается слева направо ℵ ℵ
880             alefsym => 8501,
881             #
882             #
883             # Формы чисел
884             # Символ Назначение Мнемоника Код
885             #
886             # ⅓ простая дробь «одна треть» ⅓ (HTML 5.0) ⅓
887             frac13 => 8531,
888             #
889             #
890             # Стрелки
891             # Символ Назначение Мнемоника Код
892             #
893             # ← влево ← ←
894             larr => 8592,
895             # ↑ вверх ↑ ↑
896             uarr => 8593,
897             # → вправо → →
898             rarr => 8594,
899             # ↓ вниз ↓ ↓
900             darr => 8595,
901             # ↔ влево-вправо ↔ ↔
902             harr => 8596,
903             # ↵ вниз с углом вправо = возврат каретки ↵ ↵
904             crarr => 8629,
905             # ⇐ двойная стрелка влево ⇐ ⇐
906             lArr => 8656,
907             # ⇑ двойная вверх ⇑ ⇑
908             uArr => 8657,
909             # ⇒ двойная вправо ⇒ ⇒
910             rArr => 8658,
911             # ⇓ двойная вниз ⇓ ⇓
912             dArr => 8659,
913             # ⇔ двойная влево-вправо ⇔ ⇔
914             hArr => 8660,
915             # ◄ влево ◄
916             # ▲ вверх ▲
917             # ► вправо ►
918             # ▼ вниз ▼
919             #
920             #
921             # Математические операции
922             # Символ Назначение Мнемоника Код
923             #
924             # ∀ квантор всеобщности (для всех…) ∀ ∀
925             forall => 8704,
926             # ∂ частная производная ∂ ∂
927             part => 8706,
928             # ∃ квантор существования (существует…) ∃ ∃
929             exist => 8707,
930             # ∅ пустое множество (диаметр) ∅ ∅
931             empty => 8709,
932             # ∇ набла ∇ ∇
933             nabla => 8711,
934             # ∈ принадлежит ∈ ∈
935             isin => 8712,
936             # ∉ не принадлежит ∉ ∉
937             notin => 8713,
938             # ∋ содержит ∋ ∋
939             ni => 8715,
940             # ∏ произведение по множеству ∏ ∏
941             prod => 8719,
942             # ∑ сумма по множеству ∑ ∑
943             sum => 8721,
944             # − минус — не чёрточка-минус из ASCII, имеет те же размеры и такое же расположение горизонтального штриха, что и «+» − −
945             minus => 8722,
946             # ∕ деление (не косая черта из ASCII) ∕
947             # ∖ разность множеств (не обратная косая черта из ASCII) ∖ (HTML 5.0)
948             setmn => 34598,
949             # ∖ (HTML 5.0)
950             setminus => 34598,
951             # ∖ (HTML 5.0)
952             Backslash => 8726,
953             # ∖ (HTML 5.0)
954             ssetmn => 8726,
955             # ∖ (HTML 5.0) ∖
956             smallsetminus => 8726,
957             # ∗ звёздочка (гарантированно не приподнятая над строкой) ∗ ∗
958             lowast => 8727,
959             # √ квадратный корень = знак радикала √ √
960             radic => 8730,
961             # ∝ пропорционально к ∝ ∝
962             prop => 8733,
963             # ∞ бесконечность ∞ ∞
964             infin => 8734,
965             # ∠ угол ∠ ∠
966             ang => 8736,
967             # ∧ конъюнкция (логическое И) = wedge ∧ ∧
968             and => 8743,
969             # ∨ дизъюнкция (логическое ИЛИ) = vee ∨ ∨
970             or => 8744,
971             # ∩ пересечение = cap ∩ ∩
972             cap => 8745,
973             # ∪ объединение = cup ∪ ∪
974             cup => 8746,
975             # ∫ интеграл ∫ ∫
976             int => 8747,
977             # ∴ следовательно, тем самым = therefore ∴ ∴
978             there4 => 8756,
979             # ∼ эквивалентно (для бесконечно малых/больших) = similar to ∼ ∼
980             sim => 8764,
981             # ≅ конгруэнтно = is approximately equal (congruent) to ≅ ≅
982             cong => 8773,
983             # ≈ примерно равно = is almost equal (asymptotic) to ≈ ≈
984             asymp => 8776,
985             # ≠ не равно = is not equal to ≠ ≠
986             ne => 8800,
987             # ≡ тождественно равно, логически эквивалентно = is equivalent to ≡ ≡
988             equiv => 8801,
989             # ≤ меньше или равно = is less or equal to ≤ ≤
990             le => 8804,
991             # ≥ больше или равно = is greater or equal to ≥ ≥
992             ge => 8805,
993             # ⊂ подмножество = is subset of ⊂ ⊂
994             sub => 8834,
995             # ⊃ включает в себя = is superset of ⊃ ⊃
996             sup => 8835,
997             # ⊄ не является подмножеством = is not subset of ⊄ ⊄
998             nsub => 8836,
999             # ⊆ подмножество или эквивалентно = is subset of or equivalent to ⊆ ⊆
1000             sube => 8838,
1001             # ⊇ включает в себя или эквивалентно = is superset of or equivalent to ⊇ ⊇
1002             supe => 8839,
1003             # ⊕ плюс в круге = прямая сумма ⊕ ⊕
1004             oplus => 8853,
1005             # ⊗ умножение [косым] крестом в круге = тензорное произведение ⊗ ⊗
1006             otimes => 8855,
1007             # ⊥ up tack = ортогонально к = перпендикулярно ⊥ ⊥
1008             perp => 8869,
1009             # ⋅ умножение точкой = скалярное произведение ⋅ ⋅
1010             sdot => 8901,
1011             #
1012             #
1013             # Технические символы
1014             # Символ Назначение Мнемоника Код
1015             #
1016             # ⌈ левая скобка округления вверх = apl upstile ⌈ ⌈
1017             lceil => 8968,
1018             # ⌉ правая скобка округления вверх ⌉ ⌉
1019             rceil => 8969,
1020             # ⌊ левая скобка округления вниз = apl downstile ⌊ ⌊
1021             lfloor => 8970,
1022             # ⌋ правая скобка округления вниз ⌋ ⌋
1023             rfloor => 8971,
1024             # ⟨ угловая скобка влево = бра ⟨ 〈
1025             lang => 9001,
1026             # ⟩ угловая скобка вправо = кет ⟩ 〉
1027             rang => 9002,
1028             #
1029             #
1030             # Геометрические фигуры
1031             # Символ Назначение Мнемоника Код
1032             #
1033             # ◊ ромб ◊ ◊
1034             loz => 9674,
1035             #
1036             #
1037             # Различные символы
1038             # Символ Назначение Мнемоника Код
1039             #
1040             # ♠ «пики» (карточная масть) ♠ ♠
1041             spades => 9824,
1042             # ♣ «трефы» (карточная масть) ♣ ♣
1043             clubs => 9827,
1044             # ♥ «червы» (карточная масть) ♥ ♥
1045             hearts => 9829,
1046             # ♦ «бубны» (карточная масть) ♦ ♦
1047             diams => 9830,
1048             );
1049              
1050 32     32   32 sub _set(@) { +{ map { $_ => 1 } @_ } }
  99         177  
1051              
1052             # Теги не имеющие закрывающего тега
1053             our %SINGLE_TAG = %{ _set qw/area base br col embed hr img input link meta param source track wbr/ };
1054              
1055             #
  • закрывается, если приходит или
  • 1056             our %TOP_CLOSE_TAG = (
    1057             li => _set(qw/ol ul/),
    1058             caption => _set(qw/table/),
    1059             thead => _set(qw/table/),
    1060             tbody => _set(qw/table/),
    1061             tfoot => _set(qw/table/),
    1062             tr => _set(qw/table thead tbody tfoot caption/),
    1063             td => _set(qw/table thead tbody tfoot caption/),
    1064             th => _set(qw/table thead tbody tfoot caption/),
    1065             dt => _set(qw/dl/),
    1066             dd => _set(qw/dl/),
    1067             rt => _set(qw/ruby/),
    1068             rp => _set(qw/ruby/),
    1069             option => _set(qw/optgroup select/),
    1070             optgroup => _set(qw/select/),
    1071             );
    1072              
    1073             #
    и и
    1074             our %TOP_NEW_TAG = (
    1075             head => _set(qw/body/),
    1076             tr => _set(qw/tr thead tbody tfoot/),
    1077             td => _set(qw/tr thead tbody tfoot td th/),
    1078             th => _set(qw/tr thead tbody tfoot td th/),
    1079             col => _set(qw/tr thead tbody tfoot td th colgroup/),
    1080             colgroup => _set(qw/thead tbody tfoot caption colgroup/),
    1081             caption => _set(qw/thead tbody tfoot caption/),
    1082             thead => _set(qw/thead tbody tfoot caption/),
    1083             tbody => _set(qw/thead tbody tfoot caption/),
    1084             tfoot => _set(qw/thead tbody tfoot caption/),
    1085             li => _set(qw/li/),
    1086             dt => _set(qw/dt dd/),
    1087             dd => _set(qw/dt dd/),
    1088             rt => _set(qw/rt rp/),
    1089             rp => _set(qw/rt rp/),
    1090             option => _set(qw/option optgroup/),
    1091             optgroup => _set(qw/optgroup/),
    1092             );
    1093              
    1094             # Проверяет, что тег – одиночный
    1095             sub is_single_tag(;$) {
    1096 0   0 0 0 0 exists $SINGLE_TAG{$_[0] // $_}
    1097             }
    1098              
    1099             # Забрасывает тег в стек и возвращает закрытые
    1100             sub in_tag(\@$$) {
    1101 0     0 0 0 my ($S, $tag, $atag) = @_;
    1102              
    1103             # Выбрасываем из стека предыдущий тег
    1104 0         0 my @ret;
    1105             push @ret, pop @$S while @$S and
    1106 0   0     0 ($TOP_NEW_TAG{ $S->[$#$S][0] })->{$tag};
    1107              
    1108 0 0       0 push @$S, [$tag, $atag] unless exists $SINGLE_TAG{$tag};
    1109              
    1110             @ret
    1111 0         0 }
    1112              
    1113             # Выбрасывает тег из стека. Возвращает выдавленные им и выбрасывает исключение, если такого в стеке нет
    1114             sub out_tag(\@$) {
    1115 0     0 0 0 my ($S, $tag) = @_;
    1116              
    1117             # Это одиночный тег - он не может быть закрывающим
    1118 0 0       0 die " is a single tag - it cannot be a closing tag" if exists $SINGLE_TAG{$tag};
    1119              
    1120             # закрываем предыдущий, если нужно
    1121 0         0 my @ret;
    1122             push @ret, pop @$S while @$S and
    1123 0   0     0 ($TOP_CLOSE_TAG{$S->[$#$S][0]})->{$tag};
    1124              
    1125 0 0       0 die ", but stack is empty!" unless @$S;
    1126              
    1127             # тег равен закрывающему
    1128 0 0       0 die "<$S->[$#$S][0]> in stack ne !" if $S->[$#$S][0] ne $tag;
    1129              
    1130 0         0 push @ret, pop @$S;
    1131              
    1132             @ret
    1133 0         0 }
    1134              
    1135              
    1136             # Разбивает текст на страницы с учётом html-тегов
    1137             #
    1138             # 1. html-тег должен быть так же разнесён на страницы.
    1139             #
    1140             sub split_on_pages(@) {
    1141 1     1 1 2728 my ($html, $symbols_on_page, $by) = @_;
    1142              
    1143             # На какое расстояние страница может быть больше
    1144 1 50 33     9 $by //= $symbols_on_page / 3 < 1000 ? int($symbols_on_page / 3): 1000;
    1145 1         1 my $max = $symbols_on_page + $by;
    1146              
    1147 1         2 my @pages; # массив страниц
    1148             my @page; # массив элементов текста и тегов текущей страницы
    1149 1         1 my $c = 0; # количество символов в текущей странице
    1150 1         1 my $i_page = 0; # индекс элемента @page который привысил размер страницы
    1151 1         2 my $c_page = 0; # количество символов @page по $i_page
    1152 1         1 my $is_proposal = 0; # В конце текущей страницы обнаружен конец предложения
    1153 1         3 my $re_proposal = qr/[.?!…]/;
    1154 1         1 my @S; # массив открывающих тегов [tag, '']
    1155              
    1156             # Функция фиксирует страницу и сбрасывает счётчики
    1157             my $make_page = sub {
    1158 2     2   6 push @pages, join "", @page, map { "[0]>" } reverse @S;
      0         0  
    1159 2         4 $i_page = $c = $is_proposal = 0;
    1160 2         3 @page = map $_->[1], @S;
    1161 1         4 };
    1162            
    1163 1         148 for(grep length, split m{(
    1164             <[a-z] [^<>]* >
    1165             |
    1166             | &(?: [a-z]\w* | \# \d+ | \#x[0-9a-f]+ ) ;?
    1167             | \n # Абзац
    1168             | $re_proposal+ # Предложение
    1169             | \b # Слово
    1170             )}xiu, $html) {
    1171              
    1172 12 50       25 if(/^&/) {$c++} # html-символ
      0 50       0  
        50          
    1173             elsif(/^<\/\s*([a-z]\w*)/) { # закрывающий тег
    1174 0         0 my $tag = lc $1;
    1175 0         0 eval { out_tag @S, $tag };
      0         0  
    1176 0 0       0 next if $@;
    1177             #

    превращаем в

    1178 0 0       0 $_ = "

    " if $tag eq "p";
    1179             }
    1180 0         0 elsif(/^<([a-z]\w*)/) { in_tag @S, lc $1, $_ } # тег
    1181 12         11 else {$c += length} # текст
    1182              
    1183 12         14 push @page, $_; # накапливаем символы в массиве @page
    1184              
    1185 12 100       17 next if $c < $symbols_on_page; # страницу не набрали - тогда на next
    1186              
    1187 4 100       6 $c_page = $c, $i_page = @page if !$i_page;
    1188              
    1189             # Просматриваем вперёд пока не найдём границу или не достигнем ограничения
    1190 4 50 100     35 if(/^\n/) { $make_page->() } # Абзац
      0 100       0  
        100          
    1191 1         2 elsif(!$is_proposal && /^$re_proposal/) { $i_page = @page; $c_page = $c; $is_proposal = 1 }
      1         2  
      1         1  
    1192             elsif($c >= $max) {
    1193             # Если следующий за предложением или словом элемент - пробелы, то добавляем их к странице
    1194 1 50       5 $c_page -= length $page[$i_page++] if $page[$i_page] =~ /^\s/;
    1195 1         7 my @x = splice @page, $i_page;
    1196 1         3 $make_page->();
    1197 1         2 push @page, @x;
    1198 1         2 $c -= $c_page;
    1199             }
    1200             }
    1201              
    1202 1 50       5 $make_page->() if @page;
    1203              
    1204             # Если размер последней страницы меньше чем 2/3, то добавляем её к предпоследней
    1205 1 50 33     6 $pages[$#pages - 1] .= pop @pages if @pages > 1 and length($pages[$#pages]) < $symbols_on_page * 2 / 3;
    1206              
    1207             #my $len = 0; $len += length for @pages;
    1208             #die "Суммарный размер страниц не изменился: " . length($html) . " == $len pages=" . @pages . " ->\n\n$html" if $len == length $html;
    1209              
    1210 1         23 my ($end1) = $html =~ m!([^<>\s]{1,13})\s*(]*>\s*)*$!a;
    1211 1         8 my ($end2) = $pages[$#pages] =~ m!([^<>\s]{1,13})\s*(]*>\s*)*$!a;
    1212 1 50       2 die "Концы текста и последней страницы не сходятся! `$end1` <> `$end2`" if $end1 ne $end2;
    1213              
    1214 1         11 return @pages;
    1215             }
    1216              
    1217             our %TAG2SPACE = (
    1218             "br" => "\n",
    1219             "dd" => "\n ",
    1220             "table" => "\n",
    1221             "tr" => "\n| ",
    1222             "td" => "\t| ",
    1223             "th" => "\t| ",
    1224             "ol" => "\n",
    1225             "ul" => "\n",
    1226             "li" => "\n* ",
    1227             "img" => " ",
    1228             "p" => "\n",
    1229             "div" => "\n",
    1230             );
    1231              
    1232             our %CLOSE_TAG2SPACE = (
    1233             "div" => "\n",
    1234             "p" => "\n",
    1235             "table" => "\n",
    1236             "ol" => "\n",
    1237             "ul" => "\n",
    1238             );
    1239              
    1240             our %WITH_CLOSE_TAG2SPACE = (
    1241             "p" => "\n",
    1242             "br" => "\n",
    1243             "img" => " ",
    1244             );
    1245              
    1246              
    1247             # переводит html в text
    1248             sub from_html (;$) {
    1249 2 50   2 1 136021 local ($_) = @_? @_: $_;
    1250              
    1251             # 1. Убираем энтитиес:
    1252             my $ent = sub {
    1253             exists $+{word}? (exists $ENTITIES{$+{word}}? chr $ENTITIES{$+{word}}: $&):
    1254             exists $+{num}? chr $+{num}:
    1255 1 50   1   19 exists $+{hex}? chr hex $+{hex}: ""
        0          
        0          
        50          
    1256 2         8 };
    1257 2         10 s{&(
    1258             (?\w+)
    1259             |\#(?\d+)
    1260             |\#x(?[a-f\d]+)
    1261             );?
    1262 1         3 }{$ent->()}genix;
    1263              
    1264 2         3 my $pre;
    1265              
    1266             my $to = sub {
    1267 6 100   6   22 my $s1 = $pre? $+{s1}: ($+{s1} eq ""? "": " ");
        50          
    1268            
    1269             my $x =
    1270             exists $+{space}? ($pre? $+{space}: " "):
    1271             exists $+{nbsp}? " ":
    1272             exists $+{xhr}? $+{xhr}:
    1273             exists $+{tag}? do {
    1274 3         20 my $tag = lc $+{tag};
    1275 3 50       7 $pre = 1 if $tag eq "pre";
    1276 3 50       11 exists $+{close}? $WITH_CLOSE_TAG2SPACE{$tag}: $TAG2SPACE{$tag}
    1277             }:
    1278 6 50       43 exists $+{ctag}? do {
        50          
        100          
        50          
        50          
        100          
    1279 2         7 my $tag = lc $+{ctag};
    1280 2 50       27 $pre = 0 if $tag eq "pre";
    1281            
    1282 2         4 $CLOSE_TAG2SPACE{$tag}
    1283             }:
    1284             "";
    1285            
    1286 6 50 33     28 my $s2 = $pre? $+{s2}: ($+{s2} eq "" || $s1? "": " ");
        50          
    1287            
    1288 6 100       35 $x =~ /\n/ ? $x: join "", $s1, $x, $s2
    1289 2         7 };
    1290              
    1291 2         15 s{
    1292             (? \s*) (
    1293            
    1294             <(script|style|template)\b [^<>]*> .*?
    1295             | ]*> (? .*? )
    1296             | < (? [a-z]\w* ) [^<>]*? (? / )? \s*>
    1297             | [a-z]\w* ) \s*>
    1298             |
    1299            
    1300             ) (? \s*)
    1301             | (? [\ \t\n\r\f]+)
    1302             | (? \xa0)
    1303 6         7 }{$to->()}genisx;
    1304              
    1305 2         26 $_
    1306             }
    1307              
    1308             # Все, кроме запрещённых:
    1309             # applet, script, style, embed, object, param,
    1310             # video, audio, source, track, frame, frameset, iframe, comment
    1311             # html, head, body, title, meta, base, basefont, bgsound, link
    1312             # form, keygen, output, textarea, select, option, optgroup, legend, label, input
    1313             # plaintext, xmp
    1314             # А так же удаляет атрибуты начинающиеся на "on", name, for, formaction и др..
    1315             my %SAFE_TAG = map {$_=>1} qw/
    1316             a
    1317             abbr
    1318             acronym
    1319             address
    1320              
    1321             area
    1322             article
    1323             aside
    1324              
    1325             b
    1326             bdi
    1327             bdo
    1328              
    1329             blockquote
    1330             big
    1331              
    1332             blink
    1333             br
    1334             button
    1335              
    1336             canvas
    1337             caption
    1338             center
    1339             cite
    1340             code
    1341             col
    1342             colgroup
    1343             command
    1344              
    1345             datalist
    1346             dd
    1347             del
    1348             details
    1349             dfn
    1350             dir
    1351             div
    1352             dl
    1353             dt
    1354              
    1355             em
    1356              
    1357             figcaption
    1358             figure
    1359             font
    1360             footer
    1361              
    1362             h1
    1363             h2
    1364             h3
    1365             h4
    1366             h5
    1367             h6
    1368             header
    1369             hgroup
    1370             hr
    1371              
    1372             i
    1373             img
    1374              
    1375             ins
    1376             isindex
    1377              
    1378             kbd
    1379             keygen
    1380              
    1381             li
    1382              
    1383             main
    1384             map
    1385             marquee
    1386             mark
    1387             menu
    1388              
    1389             meter
    1390              
    1391             nav
    1392             nobr
    1393             noembed
    1394             noframes
    1395             noscript
    1396              
    1397             ol
    1398              
    1399             p
    1400             pre
    1401             progress
    1402              
    1403             q
    1404              
    1405             rp
    1406             rt
    1407             ruby
    1408              
    1409             s
    1410             samp
    1411             section
    1412             small
    1413             span
    1414             strike
    1415             strong
    1416             sub
    1417             summary
    1418             sup
    1419              
    1420             table
    1421             tbody
    1422             td
    1423             tfoot
    1424             th
    1425             thead
    1426             time
    1427              
    1428             tr
    1429             tt
    1430              
    1431             u
    1432             ul
    1433              
    1434             var
    1435              
    1436             wbr
    1437             /;
    1438              
    1439             my %SAFE_ATTR = map {$_=>1} qw/
    1440             pubdate datetime
    1441             open optimum
    1442              
    1443             dir lang language style tabindex title high low hreflang icon
    1444              
    1445             max min
    1446              
    1447             href media ping rel rev name type
    1448              
    1449             class
    1450              
    1451             src
    1452              
    1453             alt crossorigin decoding height width importance intrinsicsize loading sizes srcset
    1454              
    1455             align border hspace vspace longdesc axis char charoff summary
    1456              
    1457             colspan rowspan
    1458              
    1459             border cite bgcolor color
    1460              
    1461             coords
    1462             /;
    1463              
    1464             # срезает у html-я опасные, а так же неведомые теги
    1465             sub safe_html($;$) {
    1466 4     4 1 3759 (local $_, my $link) = @_;
    1467              
    1468             my $f = sub {
    1469 9 100   9   43 return "" if !exists $SAFE_TAG{lc $2};
    1470 6 100       17 return "" if $1 ne "";
    1471 4         6 my $tag = $2;
    1472 4         6 my $x = $3;
    1473 4         5 my @attrs;
    1474 4         14 while($x =~ /
    1475             \b (? [a-z][a-z\d]*) ( \s*=\s* ( (? ") (? [^"]*)" | (? ') (? [^']*)' | (? \S*) ) )?
    1476             /gixn) {
    1477             push @attrs, $+{val} eq ""? " $+{attr}"
    1478             : join "", " ", $+{attr}, "=", $+{quot},
    1479             lc $+{attr} ~~ [qw/src href/]
    1480             ? Aion::Format::Url::normalize_url($+{val}, $link)
    1481             : $+{val},
    1482             $+{quot}
    1483 2 0       12 if exists $SAFE_ATTR{lc $+{attr}};
        0          
        50          
    1484             }
    1485              
    1486 4 50       6 push @attrs, " target=_blank" if lc $tag eq "a";
    1487              
    1488 4         19 "<$tag@attrs>"
    1489 4         17 };
    1490              
    1491 4         32 s{<(/\s*)?([a-z][a-z\d:-]*)([^<>]*)>|}{ $f->() }igse;
      9         12  
    1492              
    1493 4         35 $_
    1494             }
    1495              
    1496             1;
    1497              
    1498             __END__