Привет всем, я очень извиняюсь, с программированием знаком на уровне новичка, но все же. В институте задали ужас какой то. К сожалению текст на английском.
2. Task definition
The task involves writing the converter code that will take the input file and produce the output file. Both files describe the textual document that can contain various text style modifiers affecting the presentation (Bold, Italic, text color, etc…). The set of style modifiers supported by both input and output file formats is same; however, the structure is completely different.
2.1. Input file format definition
The input file is a sequential stream of text that may contain style modifiers which define the change of style for the text following the modifier.
Example:
The\B quick\I brown\B fox \COLOR=RGB(255,0,0)jumps\COLOR=RGB(0,255,0) over\COLOR the\COLOR lazy dog.
2.2. Output file format definition
The output file is an XML document. The output document must be well formed [XML].
Since there is certain freedom of valid output file variations, the following two examples illustrate what will be considered as better (more efficient) and worse (less efficient) result files.
вот такое надо получить
2.2.1. Efficient result file
<?xml version="1.0" encoding="utf-8"?>
<document>
The
<b>
<space/>quick
<i>
<space/>brown
</i>
</b>
<i>
<space/>fox<space/>
<colour rgb="255,0,0">
jumps
<colour rgb="0,255,0">
<space/>over
</colour>
<space/>the
</colour>
<space/>lazy
<space/>dog.
</i>
</document>
Здравствуйте, stace, Вы писали:
S>проблема в том что не знаю как реализовать считывания из простого файла и реализация в xml
вот неплохой класс для работы с XML
здесь
а вот ещё один — правда им не пользовался
здесь
Здравствуйте, stace, Вы писали:
S>Привет всем, я очень извиняюсь, с программированием знаком на уровне новичка, но все же. В институте задали ужас какой то. К сожалению текст на английском.
Если внимательно прочтёшь текст задания — то обнаружишь там ключ к ответу

Последовательно читая текст, ты можешь сказать: вот здесь такое форматирование, а вот здесь — этакое... И порождать соответствующий html.
Так что, есть 3 подзадачи:
— парсер (читающий входной текст, и выделяющий в нём тэги \b, \i, \color)
— интерпретатор (реагирующий на тэги и выдающий команды наружу)
— генератор (пишущий правильный html).
Спроектируем каждую из них.
Парсер
— читает файл посимвольно,
— когда встречает '\', то считает, что дальше идёт тэг (одно слово т.е. последовательность букв)
— в случае тэга \color проверяет, нет ли далее '=', и если есть — считывает "rgb(N,N,N)"
— извещает интерпретатора о встреченных тэгах.
Для простоты, предположим, что интерпретатор имеет интерфейс к парсеру
struct ParserEvents
{
virtual void on_begin() = 0;
virtual void on_text(string text) = 0;
virtual void on_bold() = 0;
virtual void on_italic() = 0;
virtual void on_color(int r, int g, int b) = 0;
virtual void on_color_off() = 0;
virtual void on_end() = 0;
};
Интерпретатор
Состояние интерпретатора — это флаги bold, italic и стек цветов (поскольку могут встретиться "\color=rgb1 \color=rgb2 \color \color").
Поскольку допускается, что области действия тэгов могут пересекаться — то можно
— или придумать навороты с отслеживанием стека html-тэгов (ввести стек тэгов, разматывать-наматывать его...)
— или жёстко постулировать, что всего есть 3 уровня форматирования: жирность, курсив, цвет. И на выходе не будет никакой вложенности сверх этого.
Как бы, у нас есть только три вида скобок (жирные, курсивные, цветные), и можно вкладывать курсив в цвет, но не цвет в курсив...
Но воспользуемся тем, что одно и то же форматирование можно записывать разными html-последовательностями.
То есть, "aaa \i bbb \color=111 ccc"
мы заменим на "aaa <i> bbb </i><font color=#111><i> ccc".
А если идут подряд "aaa \color=111 bbb \color=222 ccc \color ddd \color eee",
то напишем "aaa <font color=#111> bbb </font><font color=#222> ccc </font><font color=#111> ddd </font> eee"
(при этом обрати внимание: внутри интерпретатора мы завели стек цветов, но html получилися одноуровневым).
Ну и в начале файла нужно записать шапку "<html><body>", а по окончании файла нужно закрыть все тэги и записать концовку "</body></html>".
В общем-то, механика несложная. Попробуй смоделировать на бумажке.
Генератор
На генератора можно возложить примитивные операции, чтобы не тащить все строковые литералы и форматирование в интерпретатор:
struct Generator
{
void header();
void footer();
void text();
void bold_on();
void bold_off();
void italic_on();
void italic_off();
void color_on(int r, int g, int b);
void color_off();
};
Генератор, помимо прочего, может изящно оформить html, сделав табуляцию и т.д. А может и не брать на себя такую инициативу.