//: C03:HTMLStripper.cpp {RunByHand}
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
//{L} ReplaceAll
// Filtr k odstranění html tagů a značek.
#include <cassert>
#include <cmath>
#include <cstddef>
#include <fstream>
#include <iostream>
#include <string>
#include "ReplaceAll.h"
#include "../require.h"
using namespace std;

string& stripHTMLTags(string& s) {
  static bool vTagu = false;
  bool hotovo = false;
  while(!hotovo) {
    if(vTagu) {
    	// Předchozí řádka začala HTML tag, 
			// ale neskončila. Musíme hledat '>'.
      size_t pravaPozice = s.find('>');
      if(pravaPozice != string::npos) {
        vTagu = false;
        s.erase(0, pravaPozice + 1);
      }
      else {
        hotovo = true;
        s.erase();
      }
    }
    else {
      // Najít začátek tagu
      size_t levaPozice = s.find('<');
      if(levaPozice != string::npos) {
        // Zjistit, zda je tag na tomto řádku ukončen:
        size_t pravaPozice = s.find('>');
        if(pravaPozice == string::npos) {
          vTagu = hotovo = true;
          s.erase(levaPozice);
        }
        else
          s.erase(levaPozice, pravaPozice - levaPozice + 1);
      }
      else
        hotovo = true;
    }
  }
  // Odstranit všechny zvláštní HTML znaky
  nahraditVse(s, "&lt;", "<");
  nahraditVse(s, "&gt;", ">");
  nahraditVse(s, "&amp;", "&");
  nahraditVse(s, "&nbsp;", " ");
  // Atd...
  return s;
}

int main(int argc, char* argv[]) {
  requireArgs(argc, 1,
    "Použití: HTMLStripper VstupniSoubor");
  ifstream in(argv[1]);
  assure(in, argv[1]);
  string s;
  while(getline(in, s))
    if(!stripHTMLTags(s).empty())
      cout << s << endl;
} ///:~
