Files
kindle2notes/typefactory/convertlatex.cpp
T

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 ConvertLatex::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;
}