summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp30
1 files changed, 26 insertions, 4 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
index 21f70c4af2a..175f3c54fb0 100644
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
+++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp
@@ -56,6 +56,13 @@ void SpecialManager::registerHandler (unique_ptr<SpecialHandler> handler) {
}
+void SpecialManager::registerHandler (unique_ptr<SpecialHandler> handler, const vector<string> &ignoredHandlerNames) {
+ const char *name = handler->name();
+ if (!name || find(ignoredHandlerNames.begin(), ignoredHandlerNames.end(), string(name)) == ignoredHandlerNames.end())
+ instance().registerHandler(std::move(handler));
+}
+
+
/** Registers several special handlers at once.
* If ignorelist == 0, all given handlers are registered. To exclude selected sets of
* specials, the corresponding names can be given separated by non alpha-numeric characters,
@@ -77,6 +84,21 @@ void SpecialManager::registerHandlers (vector<unique_ptr<SpecialHandler>> &handl
}
+/** Removes a handler and the corresponding prefixes. */
+void SpecialManager::unregisterHandler (SpecialHandler *handler) {
+ if (handler) {
+ auto it = find_if(_handlerPool.begin(), _handlerPool.end(), [=](unique_ptr<SpecialHandler> &h) {
+ return h.get() == handler;
+ });
+ if (it != _handlerPool.end()) {
+ for (const char *prefix : handler->prefixes())
+ _handlersByPrefix.erase(prefix);
+ _handlerPool.erase(it);
+ }
+ }
+}
+
+
/** Looks for a handler responsible for a given special prefix.
* @param[in] prefix the special prefix, e.g. "color" or "em"
* @return in case of success: pointer to handler, 0 otherwise */
@@ -170,10 +192,10 @@ void SpecialManager::writeHandlerInfo (ostream &os) const {
if (handler->name())
sortmap[handler->name()] = handler.get();
for (const auto &strhandlerpair : sortmap) {
- os << setw(10) << left << strhandlerpair.second->name() << ' ';
- if (strhandlerpair.second->info())
- os << strhandlerpair.second->info();
- os << endl;
+ if (const char *info = strhandlerpair.second->info()) {
+ os << setw(10) << left << strhandlerpair.second->name() << ' ';
+ os << info << '\n';
+ }
}
os.flags(osflags); // restore format flags
}