Блок задач

11. Паттерны проектирования

Темы
Сложность 5

Задача «Подсветка синтаксиса C++ в HTML»

Задание

Используя паттерн декоратор, реализовать набор классов, позволяющий разнообразным образом переводить C++ код в HTML страницы: с подсветкой ключевых слов или токенов, расстановкой номеров строк и пр.

Описание

  1. Реализовать класс, который принимает ссылку на текст в конструкторе, и имеет функцию write(ostream & out), которая записывает этот текст в выходной поток.

  2. Реализовать несколько классов-декораторов над вышеописанным классам

Пример:

<html>
<body>
<pre># include &lt;iostream&gt;
void main() {
   std::cout &lt;&lt; &quot;Hellow world!&quot;;
}
</pre>
</body>
</html>
  • LineDecorator – простое добавление номеров строк в код. При обработке текста необходимо учесть ситуации, когда строк в коде более 10, 100, 1000, и т. п.

Пример:

<html>
<body>
<pre> 1| # include &lt;iostream&gt;
 2| <font color=0000FF>void</font> main() {
 3|    std::cout &lt;&lt; &quot;Hellow world!&quot;;
 4| }
</pre>
</body>
</html>
  • СPPDecorator – примитивная подсветка ключевых слов C++. Чтобы задать цвет текста в html можно использовать тег font с атрибутом color <font color=(цвет в hex представлении)>. Цвет описывается в RGB представлении – по байту на компонент. То есть 000000 – черный, FF0000 – красный, 00FF00 – зеленый, 0000FF – синий.

Пример:

<html>
<body>
<pre># include &lt;iostream&gt;
<font color=0000FF>void</font> main() {
   std::cout &lt;&lt; &quot;Hellow world!&quot;;
}
</pre>
</body>
</html>
  • CodeReviewDecorator – подсветка всех одинаковых лексем (всех одинаковых имен, не являющихся ключевыми словами C++) одинаковым цветом. Например, если в коде встречается переменная flag, то она везде будет подсвечена одинаковым цветом. Аналогично с именами функций. Цвет для лексемы выбирается случайно, с превалированием к тёмным оттенкам (предполагается белый фон).

Пример для подражания

пример