ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Iffy.cpp
Revision: 293
Committed: 2004-12-10T21:51:54-08:00 (20 years, 6 months ago) by douglas
File size: 1968 byte(s)
Log Message:
Spiffy!

File Contents

# Content
1 // Iffy
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Cleaner.hpp"
8 #include "Matcher.hpp"
9
10 #include <menes-api/exename.hpp>
11 #include <menes-api/files.hpp>
12 #include <menes-app/application.hpp>
13 #include <menes-ext/stack.hpp>
14
15 struct IffyCommand : public app::Application
16 {
17 virtual int Run(const app::ArgumentList& args)
18 {
19 Iffy::program = api::GetExecutablePath().GetName();
20
21 ext::String in("-"), out("-");
22
23 for (size_t index(0); index < args.GetSize(); ++index)
24 {
25 Matcher matcher;
26
27 if (args[index] == "-D")
28 {
29 if (!Iffy::debug) Iffy::debug = true;
30 }
31 else if (args[index] == matcher("^-in=(.+)$"))
32 {
33 in = matcher[1];
34 }
35 else if (args[index] == matcher("^-out=(.+)$"))
36 {
37 out = matcher[1];
38 }
39 else
40 {
41 api::Cout << "Usage: " << Iffy::program << " [-in=in] [-out=out] [-D]\n";
42
43 return 1;
44 }
45 }
46
47 Iffy(in, out);
48
49 return 0;
50 }
51 } iffy;
52
53 Iffy::Iffy(const ext::String& in, const ext::String& out)
54 {
55 _H<ios::Reader> rin;
56 _H<ios::Writer> rout;
57
58 if (in == "-") rin = &api::Cin; else rin = new api::FileReader(in);
59 if (out == "-") rout = &api::Cout; else rout = new api::FileWriter(out);
60
61 iffy(*rin, *rout);
62 }
63
64 ext::String Iffy::program;
65 bool Iffy::debug(false);
66
67 void Iffy::iffy(ios::Reader& in, ios::Writer& out)
68 {
69 ext::String segment;
70 bool text(false);
71 Cleaner cleaner;
72
73 while (read(in, segment, (text = !text))) if (text)
74 {
75 cleaner.insert(segment);
76 }
77 else
78 {
79 Matcher matcher;
80
81 if (segment == matcher("^!--( \\(\\d{1,2}:\\d{2}:\\d{2} [AP]M\\))--$"))
82 {
83 cleaner.insert(matcher[1]);
84
85 continue;
86 }
87
88 Tag tag(segment);
89
90 if (tag == "br") tag = STANDALONE;
91
92 cleaner.insert(tag);
93 }
94
95 cleaner.clean();
96
97 ios::FormatWriter fout(out);
98
99 fout << cleaner;
100 }
101
102 bool Iffy::read(ios::Reader& in, ext::String& segment, bool text)
103 {
104 segment.Clear();
105
106 utf8_t atom;
107
108 while (in.Get(atom))
109 {
110 if (atom == (text ? '<' : '>')) return true;
111
112 segment.InsertLast(atom);
113 }
114
115 return !segment.IsEmpty();
116 }

Properties

Name Value
svn:eol-style native
svn:keywords Id