четверг, 24 апреля 2014 г.

Ещё немного о "фильтрах и генераторах"

В продолжение вот этой темы - http://programmingmindstream.blogspot.ru/2014/04/sax.html

Пусть нам надо преобразовать RTF в HTML и при этом выкинуть пустые параграфы, а также выкинуть гиперссылки и выкинуть разрывы страниц.

Выглядит это так:

var
 G : Generator;
begin
 G := THTMLWriter.Create(anOutput); // - писатель HTML (anOutput - выходной поток)
 try
  TEmptyParaEliminator.SetTo(G); // - фильтр выкидывающий пустые параграфы
  THyperlinkEliminator.SetTo(G); // - фильтр выкидывающий гиперссылки
  TPageBreakEliminator.SetTo(G); // - фильтр выкидывающий разрывы страниц
  TRTFReader.Create(anInput).SetTo(G); // - читатель RTF (anInput - входной поток)
  G.Execute;
 finally
  FreeAndNil(G);
 end;//try..finally
end;

Мысль понятна?

Чем хорош SetTo?

Тем, что его легко можно добавить или закомментировать.

Если же мы хотим сделать всё то же самое, но перемыть RTF в RTF, то код меняется в одной строчке:

var
 G : Generator;
begin
 G := TRTFWriter.Create(anOutput); // - писатель RTF (anOutput - выходной поток)
 try
  TEmptyParaEliminator.SetTo(G); // - фильтр выкидывающий пустые параграфы
  THyperlinkEliminator.SetTo(G); // - фильтр выкидывающий гиперссылки
  TPageBreakEliminator.SetTo(G); // - фильтр выкидывающий разрывы страниц
  TRTFReader.Create(anInput).SetTo(G); // - читатель RTF (anInput - входной поток)
  G.Execute;
 finally
  FreeAndNil(G);
 end;//try..finally
end;

Ну и по аналогии RTF в DOC:

var
 G : Generator;
begin
 G := TDOCWriter.Create(anOutput); // - писатель DOC (anOutput - выходной поток)
 try
  TEmptyParaEliminator.SetTo(G); // - фильтр выкидывающий пустые параграфы
  THyperlinkEliminator.SetTo(G); // - фильтр выкидывающий гиперссылки
  TPageBreakEliminator.SetTo(G); // - фильтр выкидывающий разрывы страниц
  TRTFReader.Create(anInput).SetTo(G); // - читатель RTF (anInput - входной поток)
  G.Execute;
 finally
  FreeAndNil(G);
 end;//try..finally
end;

Комментариев нет:

Отправить комментарий