diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp | 178 |
1 files changed, 0 insertions, 178 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp deleted file mode 100644 index 59a26764a7b..00000000000 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/SVGOutput.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************************************* -** SVGOutput.cpp ** -** ** -** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** -** ** -** This program is free software; you can redistribute it and/or ** -** modify it under the terms of the GNU General Public License as ** -** published by the Free Software Foundation; either version 3 of ** -** the License, or (at your option) any later version. ** -** ** -** This program is distributed in the hope that it will be useful, but ** -** WITHOUT ANY WARRANTY; without even the implied warranty of ** -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** -** GNU General Public License for more details. ** -** ** -** You should have received a copy of the GNU General Public License ** -** along with this program; if not, see <http://www.gnu.org/licenses/>. ** -*************************************************************************/ - -#include <algorithm> -#include <cmath> -#include <fstream> -#include <iomanip> -#include <iostream> -#include <sstream> -#include "Calculator.hpp" -#include "FileSystem.hpp" -#include "Message.hpp" -#include "SVGOutput.hpp" -#include "utility.hpp" -#include "ZLibOutputStream.hpp" - -using namespace std; - - -SVGOutput::SVGOutput (const string &base, string pattern, int zipLevel) - : _path(base), _pattern(std::move(pattern)), _stdout(base.empty()), _zipLevel(zipLevel) -{ -} - - -/** Returns an output stream for the given page. - * @param[in] page number of current page - * @param[in] numPages total number of pages in the DVI file - * @param[in] hash hash value of the current page - * @return output stream for the given page */ -ostream& SVGOutput::getPageStream (int page, int numPages, const HashTriple &hashes) const { - FilePath path = filepath(page, numPages, hashes); - if (path.empty()) { - if (_zipLevel == 0) { - _osptr.reset(); - return cout; - } -#ifdef _WIN32 - if (_setmode(_fileno(stdout), _O_BINARY) == -1) - throw MessageException("can't open stdout in binary mode"); -#endif - return *(_osptr = util::make_unique<ZLibOutputStream>(cout, ZLIB_GZIP, _zipLevel)); - } - if (page == _page) - return *_osptr; - - _page = page; - if (_zipLevel > 0) - _osptr = util::make_unique<ZLibOutputFileStream>(path.absolute(), ZLIB_GZIP, _zipLevel); - else - _osptr = util::make_unique<ofstream>(path.absolute()); - if (!_osptr) - throw MessageException("can't open file "+path.shorterAbsoluteOrRelative()+" for writing"); - return *_osptr; -} - - -/** Returns the path of the SVG file containing the given page number. - * @param[in] page number of current page - * @param[in] numPages total number of pages - * @param[in] hash hash value of current page */ -FilePath SVGOutput::filepath (int page, int numPages, const HashTriple &hashes) const { - FilePath outpath; - if (!_stdout) { - string expanded_pattern = util::trim(expandFormatString(_pattern, page, numPages, hashes)); - // set and expand default pattern if necessary - if (expanded_pattern.empty()) { - string pattern = hashes.empty() ? (numPages > 1 ? "%f-%p" : "%f") : "%f-%hd"; - expanded_pattern = expandFormatString(pattern, page, numPages, hashes); - } - // append suffix if necessary - outpath.set(expanded_pattern, true); - if (outpath.suffix().empty()) - outpath.suffix(_zipLevel > 0 ? "svgz" : "svg"); - } - return outpath; -} - - -/** Replaces expressions in a given string by the corresponding values and returns the result. - * Supported constructs: - * %f: basename of the current file (filename without suffix) - * %h: hash value of current page - * %[0-9]?p: current page number - * %[0-9]?P: number of pages in DVI file - * %[0-9]?(expr): arithmetic expression - * @param[in] str string to expand - * @param[in] page number of current page - * @param[in] numPages total number of pages - * @param[in] hash hash value of current page (skipped if empty) */ -string SVGOutput::expandFormatString (string str, int page, int numPages, const HashTriple &hashes) const { - string result; - while (!str.empty()) { - size_t pos = str.find('%'); - if (pos == string::npos) { - result += str; - str.clear(); - } - else { - result += str.substr(0, pos); - str = str.substr(pos); - pos = 1; - ostringstream oss; - if (!isdigit(str[pos])) - oss << setw(util::ilog10(numPages)+1) << setfill('0'); - else { - oss << setw(str[pos]-'0') << setfill('0'); - pos++; - } - switch (str[pos]) { - case 'f': - result += _path.basename(); - break; - case 'h': { - char variant = pos+1 < str.length() ? str[++pos] : '\0'; - switch (variant) { - case 'd': result += hashes.dviHash(); break; - case 'c': result += hashes.cmbHash(); break; - case 'o': result += hashes.optHash(); break; - default: - throw MessageException("hash type 'd', 'c', or 'o' expected after '%h' in filename pattern"); - } - break; - } - case 'p': - case 'P': - oss << (str[pos] == 'p' ? page : numPages); - result += oss.str(); - break; - case '(': { - size_t endpos = str.find(')', pos); - if (endpos == string::npos) - throw MessageException("missing ')' in filename pattern"); - else if (endpos-pos-1 > 1) { - try { - Calculator calculator; - calculator.setVariable("p", page); - calculator.setVariable("P", numPages); - oss << floor(calculator.eval(str.substr(pos, endpos-pos+1))); - result += oss.str(); - } - catch (CalculatorException &e) { - throw MessageException("error in filename pattern (" + string(e.what()) + ")"); - } - pos = endpos; - } - break; - } - } - str = str.substr(pos+1); - } - } - return result; -} - - -/** Returns true if methods 'filename' and 'getPageStream' ignore the hash - * parameter because it's not requested in the filename pattern. */ -bool SVGOutput::ignoresHashes () const { - return _stdout || (!_pattern.empty() && _pattern.find("%h") == string::npos); -} |