diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/SpecialManager.cpp | 30 |
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 } |