| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | #include <sstream> |
| |
|
| |
|
| | #include "Sheet.h" |
| | #include "Utils.h" |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | std::string Spreadsheet::columnName(int col) |
| | { |
| | std::stringstream s; |
| |
|
| | if (col < 26) { |
| | s << ((char)('A' + col)); |
| | } |
| | else { |
| | s << ((char)('A' + (col - 26) / 26)) << ((char)('A' + (col - 26) % 26)); |
| | } |
| |
|
| | return s.str(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | std::string Spreadsheet::rowName(int row) |
| | { |
| | std::stringstream s; |
| |
|
| | s << (row + 1); |
| |
|
| | return s.str(); |
| | } |
| |
|
| |
|
| | void Spreadsheet::createRectangles( |
| | std::set<std::pair<int, int>>& cells, |
| | std::map<std::pair<int, int>, std::pair<int, int>>& rectangles |
| | ) |
| | { |
| | while (!cells.empty()) { |
| | int row, col; |
| | int orgRow; |
| | int rows = 1; |
| | int cols = 1; |
| |
|
| | orgRow = row = (*cells.begin()).first; |
| | col = (*cells.begin()).second; |
| |
|
| | |
| | while (cells.find(std::make_pair(row, col + cols)) != cells.end()) { |
| | ++cols; |
| | } |
| |
|
| | |
| | while (cells.find(std::make_pair(row, col + cols)) != cells.end()) { |
| | col--; |
| | ++cols; |
| | } |
| |
|
| | |
| | |
| | bool ok = true; |
| | while (ok) { |
| | for (int i = col; i < col + cols; ++i) { |
| | if (cells.find(std::make_pair(row - 1, i)) == cells.end()) { |
| | ok = false; |
| | break; |
| | } |
| | } |
| | if (ok) { |
| | |
| | row--; |
| | rows++; |
| | } |
| | else { |
| | break; |
| | } |
| | } |
| |
|
| | |
| | |
| | ok = true; |
| | while (ok) { |
| | for (int i = col; i < col + cols; ++i) { |
| | if (cells.find(std::make_pair(orgRow + 1, i)) == cells.end()) { |
| | ok = false; |
| | break; |
| | } |
| | } |
| | if (ok) { |
| | |
| | orgRow++; |
| | rows++; |
| | } |
| | else { |
| | break; |
| | } |
| | } |
| |
|
| | |
| | for (int r = row; r < row + rows; ++r) { |
| | for (int c = col; c < col + cols; ++c) { |
| | cells.erase(std::make_pair(r, c)); |
| | } |
| | } |
| |
|
| | |
| | rectangles[std::make_pair(row, col)] = std::make_pair(rows, cols); |
| | } |
| | } |
| |
|
| | std::string Spreadsheet::quote(const std::string& input) |
| | { |
| | std::stringstream output; |
| |
|
| | std::string::const_iterator cur = input.begin(); |
| | std::string::const_iterator end = input.end(); |
| |
|
| | output << "<<"; |
| | while (cur != end) { |
| | switch (*cur) { |
| | case '\t': |
| | output << "\\t"; |
| | break; |
| | case '\n': |
| | output << "\\n"; |
| | break; |
| | case '\r': |
| | output << "\\r"; |
| | break; |
| | case '\\': |
| | output << "\\\\"; |
| | break; |
| | case '\'': |
| | output << "\\'"; |
| | break; |
| | case '"': |
| | output << "\\\""; |
| | break; |
| | case '>': |
| | output << "\\>"; |
| | break; |
| | default: |
| | output << *cur; |
| | } |
| | ++cur; |
| | } |
| | output << ">>"; |
| |
|
| | return output.str(); |
| | } |
| |
|
| | std::string Spreadsheet::unquote(const std::string& input) |
| | { |
| | assert(input.size() >= 4); |
| |
|
| | std::string output; |
| | std::string::const_iterator cur = input.begin() + 2; |
| | std::string::const_iterator end = input.end() - 2; |
| |
|
| | output.reserve(input.size()); |
| |
|
| | bool escaped = false; |
| | while (cur != end) { |
| | if (escaped) { |
| | switch (*cur) { |
| | case 't': |
| | output += '\t'; |
| | break; |
| | case 'n': |
| | output += '\n'; |
| | break; |
| | case 'r': |
| | output += '\r'; |
| | break; |
| | case '\\': |
| | output += '\\'; |
| | break; |
| | case '\'': |
| | output += '\''; |
| | break; |
| | case '"': |
| | output += '"'; |
| | break; |
| | } |
| | escaped = false; |
| | } |
| | else { |
| | if (*cur == '\\') { |
| | escaped = true; |
| | } |
| | else { |
| | output += *cur; |
| | } |
| | } |
| | ++cur; |
| | } |
| |
|
| | return output; |
| | } |
| |
|