// Iffy // // Douglas Thrift // // $Id$ #include "Cleaner.hpp" #include void Cleaner::clean() { if (segments.IsEmpty()) return; if (segments.First().type != TAG || segments.First().tag != "html") { Tag tag(OPEN, "html"); segments.InsertFirst(tag); } if (segments.Last().type == TEXT) { std::string segment(segments.Last().text); if (segment.find_first_not_of("\r\n") == std::string::npos) segments.RemoveLast(); } if (segments.Last().type != TAG || segments.Last().tag != "html") { Tag tag(CLOSE, "html"); segments.InsertLast(tag); } ext::Stack::Iterator> opens; _mforeach (ext::Vector, segment, segments) switch (segment->tag) { case OPEN: opens.Push(segment); case STANDALONE: break; case CLOSE: if (segment->tag != ext::String(opens.Top()->tag)) { // XXX: do stuff } opens.Pop(); } /* _foreach (ext::Vector, segment, segments) { switch (segment->type) { case TEXT: api::Cerr << "TEXT"; break; case TAG: api::Cerr << "TAG "; switch (segment->tag) { case OPEN: api::Cerr << "OPEN\t"; break; case CLOSE: api::Cerr << "CLOSE\t"; break; case STANDALONE: api::Cerr << "STANDALONE\t"; } api::Cerr << ext::String(segment->tag); } api::Cerr << ios::NewLine; }*/ } ios::PrintWriter& operator<<(ios::PrintWriter& pout, const Cleaner& cleaner) { _foreach (ext::Vector, segment, cleaner.segments) switch (segment->type) { case TEXT: pout << segment->text; break; case TAG: pout << segment->tag; } return pout; }