summaryrefslogtreecommitdiffstats
path: root/src/spreadsheet/factory_shared_strings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spreadsheet/factory_shared_strings.cpp')
-rw-r--r--src/spreadsheet/factory_shared_strings.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/spreadsheet/factory_shared_strings.cpp b/src/spreadsheet/factory_shared_strings.cpp
new file mode 100644
index 0000000..a8375c0
--- /dev/null
+++ b/src/spreadsheet/factory_shared_strings.cpp
@@ -0,0 +1,118 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "factory_shared_strings.hpp"
+
+#include <orcus/spreadsheet/shared_strings.hpp>
+#include <orcus/spreadsheet/styles.hpp>
+#include <orcus/string_pool.hpp>
+#include <ixion/model_context.hpp>
+
+namespace orcus { namespace spreadsheet { namespace detail {
+
+import_shared_strings::import_shared_strings(
+ string_pool& sp, ixion::model_context& cxt, styles& st, shared_strings& ss_store) :
+ m_string_pool(sp),
+ m_cxt(cxt),
+ m_styles(st),
+ m_ss_store(ss_store)
+{
+}
+
+import_shared_strings::~import_shared_strings() {}
+
+size_t import_shared_strings::append(std::string_view s)
+{
+ return m_cxt.append_string(s);
+}
+
+size_t import_shared_strings::add(std::string_view s)
+{
+ return m_cxt.add_string(s);
+}
+
+void import_shared_strings::set_segment_font(size_t font_index)
+{
+ const font_t* font_data = m_styles.get_font(font_index);
+ if (!font_data)
+ return;
+
+ m_cur_format.bold = font_data->bold ? *font_data->bold : false;
+ m_cur_format.italic = font_data->italic ? *font_data->italic : false;
+
+ if (font_data->name)
+ m_cur_format.font = *font_data->name; // font names are already interned when set.
+
+ if (font_data->size)
+ m_cur_format.font_size = *font_data->size;
+
+ if (font_data->color)
+ m_cur_format.color = *font_data->color;
+}
+
+void import_shared_strings::set_segment_bold(bool b)
+{
+ m_cur_format.bold = b;
+}
+
+void import_shared_strings::set_segment_italic(bool b)
+{
+ m_cur_format.italic = b;
+}
+
+void import_shared_strings::set_segment_font_name(std::string_view s)
+{
+ m_cur_format.font = m_string_pool.intern(s).first;
+}
+
+void import_shared_strings::set_segment_font_size(double point)
+{
+ m_cur_format.font_size = point;
+}
+
+void import_shared_strings::set_segment_font_color(
+ color_elem_t alpha, color_elem_t red, color_elem_t green, color_elem_t blue)
+{
+ m_cur_format.color = color_t(alpha, red, green, blue);
+}
+
+void import_shared_strings::append_segment(std::string_view s)
+{
+ if (s.empty())
+ return;
+
+ size_t start_pos = m_cur_segment_string.size();
+ m_cur_segment_string += s;
+
+ if (m_cur_format.formatted())
+ {
+ // This segment is formatted.
+ // Record the position and size of the format run.
+ m_cur_format.pos = start_pos;
+ m_cur_format.size = s.size();
+
+ if (!mp_cur_format_runs)
+ mp_cur_format_runs = std::make_unique<format_runs_t>();
+
+ mp_cur_format_runs->push_back(m_cur_format);
+ m_cur_format.reset();
+ }
+}
+
+size_t import_shared_strings::commit_segments()
+{
+ ixion::string_id_t sindex = m_cxt.append_string(m_cur_segment_string);
+ m_cur_segment_string.clear();
+ m_ss_store.set_format_runs(sindex, std::move(mp_cur_format_runs));
+ mp_cur_format_runs.reset();
+
+ return sindex;
+}
+
+}}} // namespace orcus::spreadsheet::detail
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */