Книга: Описание языка PascalABC.NET

Модуль PT4TaskMakerNET: форматирование текста заданий

Модуль PT4TaskMakerNET: форматирование текста заданий

Общие сведения

В конструкторе учебных заданий PT4TaskMaker предусмотрена возможность форматирования текста заданий, а также преамбул для группы и ее подгрупп. Форматирование выполняется с помощью набора управляющих последовательностей (команд), большинство из которых имеет вид символ.

Используя управляющие последовательности, можно выполнять следующие действия по форматированию текста в окне задачника:

добавлять в текст специальные символы, в том числе символы шрифта Symbol и буквы западноевропейских языков; выделять фрагмент текста полужирным шрифтом; использовать в тексте нижние и верхние индексы; добавлять в текст задания ссылки на другие задания этой же группы, не указывая при этом название группы (что позволяет корректно изменять эти ссылки при включении задания в другие группы); добавлять в текст задания элементы, зависящие от текущего языка программирования (в частности, обозначения логических констант). Все описанные выше действия обеспечивают требуемое форматирование текста задания как в окне задачника, так и в html-описании данного задания. Аналогичное форматирование (в частности, использование нижних и верхних индексов) можно применять и в текстах комментариев, которые выводятся в окне задачника в разделах исходных и результирующих данных.

Кроме того, имеются управляющие последовательности, не влияющие на текст задания в окне задачника, однако обеспечивающие дополнительное форматирование этого текста (и текста комментариев для группы и ее подгрупп) в html-описании задания или группы заданий. Данные управляющие последовательности позволяют:

выделять имена переменных курсивом; использовать более разнообразное выделение фрагментов текста (помимо полужирного начертания можно установить курсивное начертание, выделение моноширинным шрифтом и специальное выделение); разбивать текст задания и преамбулы на отдельные абзацы; устанавливать для требуемых фрагментов текста режим вывода с центрированием или с отступом; обеспечивать вывод фрагментов текста в несколько столбцов, с возможностью установки способа выравнивания для каждого столбца. Напомним, что для вывода на экран html-страницы с описанием задания или группы заданий достаточно вызвать процедуру Task, указав в конце ее параметра (имени задания или группы заданий) суффикс #. Кроме того, html-страницы с описанием групп заданий можно генерировать с помощью модуля PT4Demo, используя кнопку

в окне этого модуля.

Таблица управляющих последовательностей

Управляющие последовательности, приведенные в таблице, можно использовать в формулировках заданий (параметр S процедуры TaskText), комментариях к исходным и результирующим данным (параметр Cmt в процедурах групп Data и Result), а также в дополнительных описаниях (преамбулах) групп и подгрупп учебных заданий (параметр S в процедуре CommentText).

Управляющие последовательности, использованные в параметрах процедур групп Data и Result, влияют только на представление соответствующих комментариев в окне задачника (см. столбец Окно задачника"). Управляющие последовательности, использованные в параметре S процедуры CommentText, обеспечивают соответствующее форматирование преамбулы к группе заданий и ее подгруппам в тексте html-страницы с описанием группы заданий (см. столбец "Html-страница"). Управляющие последовательности, использованные в параметре S процедуры TaskText, влияют на вид формулировок заданий как в окне задачника, так и в html-описаниях.

Все последовательности вида символ, не указанные в приведенной ниже таблице, игнорируются как при выводе текста в окне задачника, так при его отображения в виде html-страницы.

В заголовках подгрупп, указываемых в процедуре CreateTask (параметр SubgroupName), а также в тексте краткого описания группы, указываемого в процедуре CreateGroup (параметр GroupDescription), управляющие последовательности не обрабатываются. При указании в этих строках управляющих последовательностей они дословно воспроизводятся и в окне задачника, и в html-описании. Для указания короткого (–) или длинного (—) тире в кратких описаниях и заголовках подгрупп можно использовать двойные и тройные дефисы соответственно: -- и ---. Начиная с версии задачника 4.10, двойные и тройные дефисы в заголовках подгрупп при их отображении в html-описаниях заменяются на короткие и длинные тире.

Команда

Описание

Окно задачника

Html-страница

Ссылки на другие задания данной группы

число

Имя задания из текущей группы с номером, меньшим текущего на величину указанного десятичного числа (или *********, если результирующий номер оказывается меньшим 1)

число

Имя задания из текущей группы с номером, большим текущего на величину указанного десятичного числа (или *********, если результирующий номер оказывается большим 999)

Пробелы

,

Малый неразрывный пробел

Игнорируется

&

Средний неразрывный пробел

Пробел

&

~

Обычный неразрывный пробел

Пробел

&

q

Большой пробел

Игнорируется

Пробел& Пробел&

Q

Двойной большой пробел

Игнорируется

2 копии большого пробела

Символы

Обратная косая черта ()

&

Амперсанд (&)

&

&

{

Открывающая фигурная скобка ({)

{

{

}

Закрывающая фигурная скобка (})

}

}

~

Символ волна" (~)

~

~

^

Символ шапочка" (^)

^

^

_

Символ подчеркивания (_)

_

_

.

Многоточие (…)

...

(три точки)

=

Длинное тире (—)

:

Символ диапазона, или короткое тире (–)

-

Символ минус" (?)

?

?

<

Открывающие угловые кавычки ()

«

«

>

Закрывающие угловые кавычки (")

"

»

*

Символ умножения (·)

·

·

+

Символ плюс-минус" (±)

±

±

o

Символ градуса (°)

°

°

x

Символ косой крест" (?)

?

?

a

Греческая буква альфа" (?)

?

?

Греческая буква пи" (?)

?

?

e

Греческая буква эпсилон" (?)

?

?

l

Символ меньше или равно" (?)

?

?

g

Символ больше или равно" (?)

?

?

Символ не равно" (?)

?

?

X

Символ bullet" (•)

hXX, где XX -- двузначное 16-ричное число

Символ с кодом XX из второй половины кодовой таблицы для западноевропейских языков ANSI Latin-1 (кодовая страница 1252)

Соответствующий символ

&#DDD;

(DDD -- десятичный код соответствующего символа в кодировке Unicode)

HXX, где XX -- двузначное 16-ричное число

Символ с кодом XX Windows-шрифта Symbol

Соответствующий символ

&#DDD;

(DDD -- десятичный код соответствующего символа в кодировке Unicode)

или

<font face="Symbol">&#DDD;</font>

(DDD -- десятичное число, равное 16-ричному числу XX)

Элементы текста, зависящие от текущего языка программирования

R

Метка начала квадратного корня

Sqrt(

(Pascal, PascalABC.NET, VB.NET, C#)

sqrt(

(C++, Python, Java)

Sqr(

(Visual Basic версий 5 и 6)

r

Метка конца квадратного корня

)<sup>1/2</sup>

t

Логическая константа True"

True (Pascal, PascalABC.NET, Visual Basic, VB.NET, Python)

true (C++, C#, Java)

f

Логическая константа False"

False (Pascal, PascalABC.NET, Visual Basic, VB.NET, Python)

false (C++, C#, Java)

Нулевой указатель

nil (Pascal)

NULL (C++)

O

Нулевая ссылка для объекта

null (C#, Java)

Nothing (VB.NET)

nil (PascalABC.NET)

None (Python)

d

Имя функции для освобождения ресурсов, выделенных объекту

Dispose (PascalABC.NET, C#, VB.NET)

dispose (Python, Java)

Индексы

_символ

Односимвольный нижний индекс

Cимвол выводится как нижний индекс

<sub>символ</sub>

^символ

Односимвольный верхний индекс

Cимвол выводится как верхний индекс

<sup>символ</sup>

_{

Метка начала многосимвольного нижнего индекса

Переход в режим нижнего индекса

<sub>

^{

Метка начала многосимвольного верхнего индекса

Переход в режим верхнего индекса

<sup>

}

Метка конца текущего (верхнего или нижнего) многосимвольного индекса

Выход из режима индекса

</sub>

или

</sup>

Выделение (в окне задачника любой режим выделения приводит к выделению полужирным шрифтом)

Метка начала полужирного выделения

Переход в режим выделения

<b>

Метка конца полужирного выделения

Выход из режима выделения

</b>

I

Метка начала курсивного выделения

Переход в режим выделения

<i>

i

Метка конца курсивного выделения

Выход из режима выделения

</i>

Метка начала специального выделения

Переход в режим выделения

<span>

Метка конца специального выделения

Выход из режима выделения

</span>

Дополнительное форматирование html-страниц (в окне задачника данные управляющие последовательности игнорируются)

{

Метка начала выделения переменной

<i>

}

Метка конца выделения переменной

</i>

M

Метка начала моноширинного текста

<tt>

m

Метка конца моноширинного текста

</tt>

|

Разрыв строки

<br>

Начало нового абзаца

Завершается предыдущий абзац и создается абзац стиля ptTaskContinue (при использовании в формулировке задания) или ptComment (при использовании в тексте преамбулы)

[

Метка начала абзаца с центрированием

Завершается предыдущий абзац и создается абзац стиля ptTaskCenter (при использовании в формулировке задания) или ptCommentCenter (при использовании в тексте преамбулы)

]

Метка конца абзаца с центрированием

Завершается предыдущий абзац и создается абзац стиля ptTaskContinue (при использовании в формулировке задания) или ptCommentContinue (при использовании в тексте преамбулы)

Метка начала абзаца с отступом

Завершается предыдущий абзац и создается абзац стиля ptTaskQuote (при использовании в формулировке задания) или ptCommentQuote (при использовании в тексте преамбулы)

Метка конца абзаца с отступом

Завершается предыдущий абзац и создается абзац стиля ptTaskContinue (при использовании в формулировке задания) или ptCommentContinue (при использовании в тексте преамбулы)

J

Метка начала режима выравнивания по столбцам (после нее указывается последовательность символов r, l, c, которая должна оканчиваться символом &)

<table>

j

Метка конца режима выравнивания по столбцам

</table>

&

Переход к новому столбцу в режиме выравнивания по столбцам

Добавляется тег <td> с соответствующим выравниванием; для первого столбца предварительно указывается тег <tr>

Дополнительные сведения об использовании управляющих последовательностей

Необходимость в специальных командах для генерации ссылок на другие задания группы объясняется тем, что любое имеющееся задание может быть импортировано в группу с другим именем (с помощью процедуры UseTask), и поэтому все ссылки на другие задания этой группы также потребуется откорректировать, указав в них новое имя группы. Разумеется, в подобной ситуации необходимо переносить в новую группу все задания, содержащие ссылки друг на друга. Следует заметить, что разность между номерами ссылающихся друг на друга заданий не обязана быть такой же, как в исходной группе заданий. Если в новой группе задания находятся на другом расстоянии" друг от друга, то для указания правильной ссылки достаточно внести соответствующую поправку в параметр процедуры UseTask.

Наличие нескольких видов неразрывных пробелов, не различающихся в тексте заданий и html-страниц, связано с планируемой в дальнейшем возможностью генерации текста заданий в других форматах (в частности, в формате системы TeX, в котором данные виды пробелов различаются). Приведем рекомендации по использованию неразрывных пробелов:

вокруг символов =, <, > указывается обычный неразрывный пробел ~; исключением являются фрагменты текста в скобках вида ( 0), в которых рекомендуется использовать малый пробел: (,0); неразрывный пробел ~ указывается также между текстом и переменной: стороны~{a} и~{b}; вокруг символов + и - ставится средний пробел ;; символы умножения * и деления / пробелами не обрамляются; исключением служит ситуация, когда слева и справа от символа деления указываются прописные буквы; в этом случае желательно использовать обрамление малыми пробелами. Приведем пример оформления формул (данный пример взят из задания Begin39; обратите внимание на выделение переменных с помощью фигурных скобок, а также на команды, обеспечивающие вывод индексов, выделение квадратного корня и центрирование формулы):

TaskText('Найти корни Iквадратного уравненияi ' +
'{A}*{x}^2;+;{B}*{x};+;{C}~=~0, заданного', 0, 1);
TaskText('своими коэффициентами~{A}, {B}, {C} ' +
'(коэффициент~{A} не равен~0), если известно,', 0, 2);
TaskText('что дискриминант уравнения положителен. ' +
'Вывести вначале меньший, а затем',0,3);
TaskText('больший из найденных корней. Корни квадратного ' +
'уравнения находятся по формуле', 0, 4);
TaskText('[{x}_{1,,2}~=~(-{B};+;R{D}r)/(2*{A}),] ' +
'где {D}~= Iдискриминантi, ' +
'равный {B}^2;-;4*{A}*{C}.', 0, 5);

В результате обработки данной формулировки задания в окне задачника будет выведен текст:


В html-описании этот же текст будет отформатирован следующим образом:


Для указания кавычек в тексте задания следует использовать управляющие последовательности < и >.

Управляющие последовательности t, f, N, O для логических констант, нулевых указателей и объектов генерируют текст, зависящий от выбранного в данный момент языка программирования.

Обычные пробелы, указанные после управляющих последовательностей q, Q, P, [, (, ], ), | и &, учитываются только в тексте задачника (и пропускаются в тексте html-страниц).

Режим специального выделения, устанавливаемый парными командами S и s, в окне задачника приводит к выделению полужирным шрифтом, а в html-описании обеспечивает выделение фрагмента текста, аналогичное выделению, используемому для имени задания в начале его формулировки (в приведенном выше фрагменте html-описания так выделено имя задания Begin39"). Данный режим рекомендуется использовать для выделения заголовков, размещаемых в начале абзаца (например, если формулировка задания завершается абзацем, содержащим указание, то с помощью специального выделения целесообразно выделить текст "Указание" в начале этого абзаца).

Команды выделения переменной { и } не влияют на ее вид в окне задачника, но обеспечивают ее выделение курсивом в тексте html-страницы. В индексах команды выделения переменной не учитываются, а любые латинские буквы в них автоматически выделяются курсивом.

В односимвольных индексах нельзя указывать управляющие последовательности для вывода специальных символов, поэтому при необходимости применения в индексах специальных символов следует использовать режим многосимвольных индексов. Метки индексов не могут быть вложенными. В индексах не допускается использование меток выделения I, B, S и наоборот, внутри выделенного текста не допускается указывать индексы.

Выделенные фрагменты не могут содержать меток выделения другого вида. Режим индексов и выделения, заданный в одной процедуре TaskText или CommentText, не переносится на текст, определяемый при последующих вызовах этих процедур. Если в тексте отсутствуют команды завершения текущего режима (индексов или выделения), то режим автоматически завершается при достижении конца текста, определяемого в текущей процедуре TaskText или CommentText.

В команде начала режима выравнивания по столбцам символы r, l, c определяют способ выравнивания в каждом столбце текста (r -- выравнивание по правому краю, l -- выравнивание по левому краю, c -- выравнивание по центру). Их количество должно быть равно числу столбцов. В каждом столбце должен быть хотя бы один непробельный символ (для пустого столбца достаточно указать малый неразрывный пробел ,).

Ввиду сложности управляющих последовательностей, связанных с выравниванием по столбцам, приведем пример их использования (пример взят из задания If26):

TaskText('Для данного вещественного~{x} найти значение ' +
'следующей функции~{f},', 0, 1);
TaskText('принимающей вещественные значения:', 0, 2);
TaskText('[Jrcrl&,&,& -{x},& если {x}~l~0,',
26, 3);
TaskText('&{f}({x})&~=~&{x}^2,& если 0~<~{x}~<~2,', 26, 4);
TaskText('&,&,& 4,& если {x}~g~2.j]', 26, 5);

В результате обработки данной формулировки задания в окне задачника будет выведен текст:


В html-описании этот же текст будет отформатирован следующим образом:


Команду разрыва строки | можно использовать как в обычном тексте, так и в режиме выделения с отступом или центрированием (в режиме выравнивания по столбцам переход на новую строку выполняется автоматически). Для более наглядного отображения в html-документе текста, выровненного по столбцам, данный текст рекомендуется дополнительно центрировать (как в приведенном выше примере) или использовать для него режим выравнивания с отступом.

Следует обратить внимание еще на одну особенность формулировок, содержащих выравнивание по столбцам: строки с подобным выравниванием, как правило, не нужно центрировать в окне задачника. В приведенном примере в трех последних вызовах процедуры TaskText в качестве параметра X указывается не нулевое значение (означающее центрирование по горизонтали), а число 26 -- значение позиции по горизонтали, начиная с которой требуется вывести указанную строку.

Указанное обстоятельство может затруднить использование для подобных формулировок нового варианта процедуры TaskText, появившегося в конструкторе версии 4.11. В этом варианте указывается единственный строковый параметр, содержащий все строки формулировки, разделенные символами разрыва строки (#13 или #10). При разборе этого параметра из каждой строки формулировки удаляются начальные и конечные пробелы, причем строки формулировки, оказавшиеся в результате пустыми, игнорируются, а все непустые строки выводятся в окне задачника в режиме центрирования. Тем не менее, и этот вариант процедуры TaskText позволяет обеспечить особое выравнивание требуемых строк в окне задачника. Для этого надо добавить некоторое количество вспомогательных начальных или конечных пробелов к строке, требующей специального выравнивания, причем первый начальный или последний конечный пробел надо экранировать символом , чтобы не допустить его автоматического удаления. Прочие пробелы (следующие за начальным пробелом или предшествующие конечному пробелу) экранировать необязательно. Приведем пример определения формулировки, в котором используется новый вариант процедуры TaskText (следует обратить внимание на конечные пробелы, указанные в последних трех строках; в остальном текст формулировки не отличается от приведенного выше):

TaskText('Для данного вещественного~{x} найти значение следующей функции~{f},'#13 +
'принимающей вещественные значения:'#13 +
'[Jrcrl&,&,& -{x},& если {x}~l~0, '#13 +
'&{f}({x})&~=~&{x}^2,& если 0~<~{x}~<~2, '#13 +
'&,&,& 4,& если {x}~g~2.j] ');

Управляющая последовательность P предназначена для разделения абзацев. В тексте, отображаемом в окне задачника, данная команда игнорируется (подобно прочим командам, связанным с разделением на абзацы). Для нее не предусмотрено парной завершающей команды, поскольку необходимые теги при переходе к новому абзацу добавляются в текст html-страницы автоматически. Пробелы после команды P при генерации html-страницы игнорируются, однако они учитываются при отображении текста в окне задачника.

Генерация специальных символов

Используя две универсальные" управляющие последовательности h и H, можно включать в текст задания или преамбулы специальные символы, входящие во вторую половину кодовой таблицы для западноевропейских языков ANSI Latin-1 (команда h) или содержащиеся в Windows-шрифте Symbol (команда H). После имени каждой из этих команд следует указать двузначное шестнадцатеричное число, определяющее код требуемого символа; при этом шестнадцатеричные цифры A, B, C, D, E, F можно указывать в любом регистре. Если двухсимвольный текст после команд нельзя преобразовать в шестнадцатеричное число или число не является допустимым, то команды возвращают символ "?" (знак вопроса).

В случае команды h (символы таблицы Latin-1) допустимыми считаются числа из диапазона 128-255, за исключением кодов неотображаемых символов, например, кода неразрывного пробела 160 (A0) или мягкого" переноса 173 (AD). Символы таблицы Ansi Latin-1 с кодами 128-159 имеют в кодировке Unicode другие значения кодов; при генерации html-описаний для этих символов используются их коды в таблице Unicode.

С помощью команды H можно получить только часть символов, определенных в Windows-шрифте Symbol. Исключены символы, уже присутствующие в таблицах ASCII и ANSI Latin-1 (например, цифры и знаки препинания) или имеющие идентичное начертание с символами из этих таблиц (например, заглавные греческие буквы, совпадающие по начертанию с латинскими: A, B, E, H, X и т. д.). Кроме того, исключены символы с кодами 230-239 и 243-254, представляющие собой фрагменты больших скобок.

Следует заметить, что для части математических символов нельзя обеспечить их правильное отображение в каждом из трех наиболее популярных веб-браузеров (Microsoft Internet Explorer, Mozilla Firefox и Opera) без использования средств веб-программирования. В браузерах Internet Explorer и Firefox можно подключать шрифты Windows, в том числе шрифт Symbol, однако в Opera это сделать нельзя. С другой стороны, в Opera и Firefox для отображения всех стандартных математических символов достаточно указать их код в Unicode-кодировке, однако в стандартных Windows-шрифтах, используемых браузером Internet Explorer, часть символов с требуемыми кодами отсутствует. При реализации команды H для вывода подобных символов в html-документе был выбран вариант, обеспечивающий их правильное отображение в браузере Internet Explorer (и Mozilla Firefox): для этого используется Windows-шрифт Symbol. Однако в браузере Opera (и других браузерах, не поддерживающих шрифты Windows) данные символы будут отображаться неправильно.

Примечание. Для возможности использования Windows-шрифтов в браузере Mozilla Firefox следует установить режим Разрешить веб-сайтам использовать свои шрифты вместо установленных". Соответствующий флажок находится в окне "Шрифты", которое можно отобразить с помощью следующей последовательности действий: выполнить команду меню "Инструменты | Настройки...", в появившемся окне "Настройки" перейти на вкладку "Содержимое" и в разделе "Шрифты и цвета" нажать кнопку "Дополнительно...".

С некоторыми часто используемыми специальными символами связаны особые управляющие последовательности (см. таблицу управляющих последовательностей, раздел Символы"). Все подобные символы правильно отображаются во всех перечисленных выше браузерах.

Хотя символ пересечения (?, код 8745) имеется в стандартных Windows-шрифтах, прочие символы, связанные с множествами (объединение, вложение, принадлежность и т. д.), в этих шрифтах отсутствуют. Для того чтобы все обозначения, связанные с множествами, выглядели в html-документе единообразно, для отображения символа пересечения (команда Hc7) используется соответствующий символ из шрифта Symbol.

Ниже приводятся таблицы всех символов, которые можно получить с помощью универсальных команд h и H. Первая таблица содержит символы, генерируемые командой h, а вторая -- символы, генерируемые командой H. Команды из второй таблицы, связанные с теми символами, которые будут неверно отображаться в браузере Opera, выделены полужирным шрифтом.

Таблица 1. Символы, генерируемые командой h

h80

h82

h83

?

h84

h85

h86

h87

h88

?

h89

h8a

?

h8b

h8c

?

h8e

?

h91

h92

h93

h94

h95

h96

h97

h98

?

h99

h9a

?

h9b

h9c

?

h9e

?

h9f

?

ha1

?

ha2

?

ha3

?

ha4

¤

ha5

?

ha6

¦

ha7

§

ha8

?

ha9

©

haa

?

hab

«

hac

¬

hae

®

haf

?

hb0

°

hb1

±

hb2

?

hb3

?

hb4

?

hb5

µ

hb6

hb7

·

hb8

?

hb9

?

hba

?

hbb

"

hbc

?

hbd

?

hbe

?

hbf

?

hc0

?

hc1

?

hc2

?

hc3

?

hc4

?

hc5

?

hc6

?

hc7

?

hc8

?

hc9

?

hca

?

hcb

?

hcc

?

hcd

?

hce

?

hcf

?

hd0

?

hd1

?

hd2

?

hd3

?

hd4

?

hd5

?

hd6

?

hd7

?

hd8

?

hd9

?

hda

?

hdb

?

hdc

?

hdd

?

hde

?

hdf

?

he0

?

he1

?

he2

?

he3

?

he4

?

he5

?

he6

?

he7

?

he8

?

he9

?

hea

?

heb

?

hec

?

hed

?

hee

?

hef

?

hf0

?

hf1

?

hf2

?

hf3

?

hf4

?

hf5

?

hf6

?

hf7

?

hf8

?

hf9

?

hfa

?

hfb

?

hfc

?

hfd

?

hfe

?

hff

?

Таблица 2. Символы, генерируемые командой H

H22

"

H24

$

H27

'

H2d

?

H40

@

H44

?

H46

?

H47

?

H4c

?

H50

?

H51

?

H53

?

H56

?

H57

?

H58

?

H59

?

H5c

H5e

^

H61

?

H62

?

H63

?

H64

?

H65

?

H66

f

H67

?

H68

?

H69

?

H6a

?

H6b

?

H6c

?

H6d

?

H6e

?

H70

?

H71

?

H72

?

H73

?

H74

?

H75

?

H76

v

H77

?

H78

?

H79

?

H7a

?

Ha1

?

Ha2

?

Ha3

?

Ha5

?

Ha7

?

Ha8

?

Ha9

?

Haa

?

Hab

?

Hac

?

Had

?

Hae

?

Haf

?

Hb2

?

Hb3

?

Hb5

µ

Hb6

?

Hb9

?

Hba

?

Hbb

?

Hbd

?

Hbe

?

Hbf

?

Hc0

?

Hc1

?

Hc2

?

Hc3

?

Hc4

?

Hc5

?

Hc6

?

Hc7

?

Hc8

?

Hc9

?

Hca

?

Hcb

?

Hcc

?

Hcd

?

Hce

?

Hcf

?

Hd0

?

Hd1

?

Hd5

?

Hd6

?

Hd9

?

Hda

?

Hdb

?

Hdc

?

Hdd

?

Hde

?

Hdf

?

He0

?

He1

He5

?

Hf1

Hf2

?

Оглавление книги


Генерация: 0.058. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз