1
// Copyright (c) 1995, 1996 James Clark
2
// See the file COPYING for copying permission.
4
// FIXME usage message for bad -m option.
7
#include "SgmlParser.h"
9
#include "OutputCharStream.h"
10
#include "ParserApp.h"
13
#include "SpamMessages.h"
14
#include "CopyEventHandler.h"
15
#include "InputSource.h"
22
using namespace SP_NAMESPACE;
25
class XCopyEventHandler : public CopyEventHandler {
27
XCopyEventHandler(OutputCharStream *os, unsigned normalizeFlags,
28
const StringC &outputEntity, Messenger *);
29
void message(MessageEvent *);
31
void reportTagInSpecialMarkedSection(const Location &);
32
Messenger *messenger_;
33
OutputCharStream *os_;
38
const ParserApp::AppChar *name;
40
} normalizeTable[] = {
41
{ SP_T("omittag"), CopyEventHandler::normalizeOmittag },
42
{ SP_T("shortref"), CopyEventHandler::normalizeShortref },
43
{ SP_T("net"), CopyEventHandler::normalizeNet },
44
{ SP_T("emptytag"), CopyEventHandler::normalizeEmptytag },
45
{ SP_T("unclosed"), CopyEventHandler::normalizeUnclosed },
46
{ SP_T("attname"), CopyEventHandler::normalizeAttname },
47
{ SP_T("attvalue"), CopyEventHandler::normalizeAttvalue },
48
{ SP_T("attspec"), CopyEventHandler::normalizeAttspec },
49
{ SP_T("current"), CopyEventHandler::normalizeCurrent },
50
{ SP_T("shorttag"), CopyEventHandler::normalizeShorttag },
51
{ SP_T("rank"), CopyEventHandler::normalizeRank },
52
{ SP_T("reserved"), CopyEventHandler::normalizeReserved },
53
{ SP_T("ms"), CopyEventHandler::normalizeMarkedSection },
56
class SpamApp : public ParserApp {
59
ErrorCountEventHandler *makeEventHandler();
60
void processOption(AppChar opt, const AppChar *arg);
62
unsigned normalizeFlags_;
63
StringC outputEntity_;
67
SP_DEFINE_APP(SpamApp)
70
: rawOutput_(0), normalizeFlags_(0)
72
options_.eventsWanted.addInstanceMarkup();
73
options_.eventsWanted.addPrologMarkup();
76
registerOption('m', SP_T("omittag|shortref|net|emptytag|unclosed|attname|attvalue|attspec|current|shorttag|rank|reserved"));
77
registerOption('o', SP_T("entity_name"));
83
void SpamApp::processOption(AppChar opt, const AppChar *arg)
87
// hoist omitted tags out of entities
88
normalizeFlags_ |= CopyEventHandler::normalizeOmittagHoist;
90
case 'l': // prefer lowercase
91
normalizeFlags_ |= CopyEventHandler::normalizeLower;
96
for (size_t i = 0; i < SIZEOF(normalizeTable); i++)
97
if (tcscmp(normalizeTable[i].name, arg) == 0) {
99
normalizeFlags_ |= normalizeTable[i].flag;
103
message(SpamMessages::invalidMarkupArgument,
104
StringMessageArg(convertInput(arg)));
110
outputEntity_ = convertInput(arg);
113
if (normalizeFlags_ & CopyEventHandler::normalizeIncludeProlog)
114
normalizeFlags_ |= CopyEventHandler::normalizeExpandProlog;
116
normalizeFlags_ |= CopyEventHandler::normalizeIncludeProlog;
122
if (normalizeFlags_ & CopyEventHandler::normalizeExpand)
123
normalizeFlags_ |= CopyEventHandler::normalizeExpandAll;
125
normalizeFlags_ |= CopyEventHandler::normalizeExpand;
128
ParserApp::processOption(opt, arg);
133
ErrorCountEventHandler *SpamApp::makeEventHandler()
135
OutputCharStream *os = makeStdOut();
137
os = new RecordOutputCharStream(os);
138
return new XCopyEventHandler(os, normalizeFlags_, outputEntity_, this);
141
XCopyEventHandler::XCopyEventHandler(OutputCharStream *os,
142
unsigned normalizeFlags,
143
const StringC &outputEntity,
144
Messenger *messenger)
145
: messenger_(messenger), os_(os),
146
CopyEventHandler(os, normalizeFlags, outputEntity)
150
void XCopyEventHandler::message(MessageEvent *event)
152
messenger_->dispatchMessage(event->message());
153
CopyEventHandler::message(event);
156
void XCopyEventHandler::reportTagInSpecialMarkedSection(const Location &loc)
158
messenger_->setNextLocation(loc);
159
messenger_->message(SpamMessages::tagInSpecialMarkedSection);