89 lines
2.0 KiB
C++
89 lines
2.0 KiB
C++
#include "convertlatex.h"
|
|
|
|
#include <cerrno>
|
|
#include <cstring>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
|
|
static std::string latex_escape (const std::string &s) {
|
|
std::string out;
|
|
out.reserve (s.size() + s.size() / 8);
|
|
for (unsigned char ch : s) {
|
|
switch (ch) {
|
|
case '\\':
|
|
out += "\\textbackslash{}";
|
|
break;
|
|
case '{':
|
|
out += "\\{";
|
|
break;
|
|
case '}':
|
|
out += "\\}";
|
|
break;
|
|
case '%':
|
|
out += "\\%";
|
|
break;
|
|
case '$':
|
|
out += "\\$";
|
|
break;
|
|
case '#':
|
|
out += "\\#";
|
|
break;
|
|
case '&':
|
|
out += "\\&";
|
|
break;
|
|
case '_':
|
|
out += "\\_";
|
|
break;
|
|
case '^':
|
|
out += "\\textasciicircum{}";
|
|
break;
|
|
case '~':
|
|
out += "\\textasciitilde{}";
|
|
break;
|
|
default:
|
|
out.push_back (static_cast<char> (ch));
|
|
break;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
bool ConverterLatex::save (const std::string &output_file_name) {
|
|
if (!parse())
|
|
return false;
|
|
|
|
std::ofstream output (output_file_name, std::ios::trunc);
|
|
if (!output.is_open()) {
|
|
std::cerr << "Failed to open output file: "
|
|
<< output_file_name
|
|
<< " (" << std::strerror (errno) << ")\n";
|
|
set_error_code (3);
|
|
return false;
|
|
}
|
|
|
|
const auto &book_titles = titles();
|
|
for (std::size_t i = 0; i < book_titles.size(); ++i) {
|
|
const auto &title = book_titles[i];
|
|
output << "\\section {" << latex_escape (title) << "}\n";
|
|
|
|
for (std::size_t quote_index = 0;
|
|
quote_index < quote_count (title);
|
|
++quote_index) {
|
|
output << " \\subsection {"
|
|
<< latex_escape (quote_meta (title, quote_index))
|
|
<< "}\n";
|
|
|
|
for (const auto &text_line : quote_text_lines (title, quote_index))
|
|
output << " " << latex_escape (text_line) << "\n";
|
|
|
|
output << " \\subsubsection{notes}\n\n";
|
|
}
|
|
|
|
if (i + 1 < book_titles.size())
|
|
output << "\n";
|
|
}
|
|
|
|
set_error_code (0);
|
|
return true;
|
|
}
|