Skip to content

Commit 1dd0231

Browse files
authored
merge html frontend headers (#429)
1 parent 61d0167 commit 1dd0231

13 files changed

Lines changed: 254 additions & 300 deletions

File tree

.github/workflows/build_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ jobs:
205205
with:
206206
python-version: 3.12
207207
- name: install python dependencies
208-
run: pip install htmlcmp==1.0.11
208+
run: pip install htmlcmp==1.0.12
209209

210210
- name: download binaries
211211
uses: actions/download-artifact@v4

CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ set(ODR_SOURCE_FILES
8181
"src/odr/filesystem.cpp"
8282
"src/odr/global_params.cpp"
8383
"src/odr/html.cpp"
84-
"src/odr/html_service.cpp"
8584
"src/odr/http_server.cpp"
8685
"src/odr/odr.cpp"
8786
"src/odr/quantity.cpp"

cli/src/translate.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include <odr/exceptions.hpp>
22
#include <odr/file.hpp>
33
#include <odr/html.hpp>
4-
#include <odr/html_service.hpp>
54

65
#include <filesystem>
76
#include <iostream>

src/odr/html.cpp

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,52 @@
66
#include <odr/exceptions.hpp>
77
#include <odr/filesystem.hpp>
88
#include <odr/global_params.hpp>
9-
#include <odr/html_service.hpp>
109

10+
#include <odr/internal/abstract/html_service.hpp>
11+
#include <odr/internal/common/path.hpp>
1112
#include <odr/internal/html/document.hpp>
1213
#include <odr/internal/html/filesystem.hpp>
14+
#include <odr/internal/html/html_writer.hpp>
1315
#include <odr/internal/html/image_file.hpp>
1416
#include <odr/internal/html/pdf2htmlex_wrapper.hpp>
1517
#include <odr/internal/html/pdf_file.hpp>
1618
#include <odr/internal/html/text_file.hpp>
1719
#include <odr/internal/html/wvware_wrapper.hpp>
1820
#include <odr/internal/oldms_wvware/wvware_oldms_file.hpp>
1921
#include <odr/internal/pdf_poppler/poppler_pdf_file.hpp>
22+
#include <odr/internal/util/file_util.hpp>
2023

24+
#include <algorithm>
2125
#include <filesystem>
26+
#include <fstream>
27+
#include <iostream>
2228

2329
#include <nlohmann/json.hpp>
2430

2531
using namespace odr::internal;
2632

2733
namespace odr {
2834

35+
namespace {
36+
37+
void bring_offline(const HtmlResources &resources,
38+
const std::string &output_path) {
39+
for (const auto &[resource, location] : resources) {
40+
if (!location.has_value() || resource.is_shipped() ||
41+
resource.is_external() || !resource.is_accessible()) {
42+
continue;
43+
}
44+
auto path = odr::internal::common::Path(output_path)
45+
.join(odr::internal::common::Path(*location));
46+
47+
std::filesystem::create_directories(path.parent());
48+
std::ofstream ostream = internal::util::file::create(path.string());
49+
resource.write_resource(ostream);
50+
}
51+
}
52+
53+
} // namespace
54+
2955
HtmlConfig::HtmlConfig() { init(); }
3056

3157
HtmlConfig::HtmlConfig(std::string output_path_)
@@ -48,6 +74,144 @@ const std::vector<HtmlPage> &Html::pages() const { return m_pages; }
4874
HtmlPage::HtmlPage(std::string name, std::string path)
4975
: name{std::move(name)}, path{std::move(path)} {}
5076

77+
HtmlService::HtmlService() = default;
78+
79+
HtmlService::HtmlService(std::shared_ptr<internal::abstract::HtmlService> impl)
80+
: m_impl{std::move(impl)} {}
81+
82+
const HtmlConfig &HtmlService::config() const { return m_impl->config(); }
83+
84+
const HtmlViews &HtmlService::list_views() const {
85+
return m_impl->list_views();
86+
}
87+
88+
void HtmlService::warmup() const { m_impl->warmup(); }
89+
90+
bool HtmlService::exists(const std::string &path) const {
91+
return m_impl->exists(path);
92+
}
93+
94+
std::string HtmlService::mimetype(const std::string &path) const {
95+
return m_impl->mimetype(path);
96+
}
97+
98+
void HtmlService::write(const std::string &path, std::ostream &out) const {
99+
m_impl->write(path, out);
100+
}
101+
102+
HtmlResources HtmlService::write_html(const std::string &path,
103+
std::ostream &out) const {
104+
internal::html::HtmlWriter writer(out, config());
105+
return m_impl->write_html(path, writer);
106+
}
107+
108+
Html HtmlService::bring_offline(const std::string &output_path) const {
109+
return bring_offline(output_path, list_views());
110+
}
111+
112+
Html HtmlService::bring_offline(const std::string &output_path,
113+
const std::vector<HtmlView> &views) const {
114+
std::vector<HtmlPage> pages;
115+
116+
HtmlResources resources;
117+
118+
for (const auto &view : views) {
119+
auto path = odr::internal::common::Path(output_path)
120+
.join(odr::internal::common::Path(view.path()));
121+
122+
std::filesystem::create_directories(path.parent());
123+
std::ofstream ostream = internal::util::file::create(path.string());
124+
HtmlResources view_resources = view.write_html(ostream);
125+
126+
resources.insert(resources.end(), view_resources.begin(),
127+
view_resources.end());
128+
129+
pages.emplace_back(view.name(), path.string());
130+
}
131+
132+
{
133+
auto it = std::unique(resources.begin(), resources.end(),
134+
[](const auto &lhs, const auto &rhs) {
135+
return lhs.first.path() == rhs.first.path();
136+
});
137+
resources.erase(it, resources.end());
138+
}
139+
140+
odr::bring_offline(resources, output_path);
141+
142+
return {config(), std::move(pages)};
143+
}
144+
145+
const std::shared_ptr<internal::abstract::HtmlService> &
146+
HtmlService::impl() const {
147+
return m_impl;
148+
}
149+
150+
HtmlView::HtmlView() = default;
151+
152+
HtmlView::HtmlView(std::shared_ptr<internal::abstract::HtmlView> impl)
153+
: m_impl{std::move(impl)} {}
154+
155+
const std::string &HtmlView::name() const { return m_impl->name(); }
156+
157+
const std::string &HtmlView::path() const { return m_impl->path(); }
158+
159+
const HtmlConfig &HtmlView::config() const { return m_impl->config(); }
160+
161+
HtmlResources HtmlView::write_html(std::ostream &out) const {
162+
internal::html::HtmlWriter writer(out, config());
163+
return m_impl->write_html(writer);
164+
}
165+
166+
Html HtmlView::bring_offline(const std::string &output_path) const {
167+
HtmlResources resources;
168+
169+
auto path = odr::internal::common::Path(output_path)
170+
.join(odr::internal::common::Path(this->path()));
171+
172+
{
173+
std::filesystem::create_directories(path.parent());
174+
std::ofstream ostream = internal::util::file::create(path.string());
175+
resources = write_html(ostream);
176+
}
177+
178+
odr::bring_offline(resources, output_path);
179+
180+
return {config(), {{name(), path.string()}}};
181+
}
182+
183+
const std::shared_ptr<internal::abstract::HtmlView> &HtmlView::impl() const {
184+
return m_impl;
185+
}
186+
187+
HtmlResource::HtmlResource() = default;
188+
189+
HtmlResource::HtmlResource(
190+
std::shared_ptr<internal::abstract::HtmlResource> impl)
191+
: m_impl{std::move(impl)} {}
192+
193+
HtmlResourceType HtmlResource::type() const { return m_impl->type(); }
194+
195+
const std::string &HtmlResource::mime_type() const {
196+
return m_impl->mime_type();
197+
}
198+
199+
const std::string &HtmlResource::name() const { return m_impl->name(); }
200+
201+
const std::string &HtmlResource::path() const { return m_impl->path(); }
202+
203+
const std::optional<File> &HtmlResource::file() const { return m_impl->file(); }
204+
205+
bool HtmlResource::is_shipped() const { return m_impl->is_shipped(); }
206+
207+
bool HtmlResource::is_external() const { return m_impl->is_external(); }
208+
209+
bool HtmlResource::is_accessible() const { return m_impl->is_accessible(); }
210+
211+
void HtmlResource::write_resource(std::ostream &os) const {
212+
m_impl->write_resource(os);
213+
}
214+
51215
HtmlService html::translate(const DecodedFile &decoded_file,
52216
const std::string &output_path,
53217
const HtmlConfig &config) {

src/odr/html.hpp

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,51 @@
99
#include <string>
1010
#include <vector>
1111

12+
namespace odr::internal::abstract {
13+
class HtmlService;
14+
class HtmlView;
15+
class HtmlResource;
16+
} // namespace odr::internal::abstract
17+
1218
namespace odr {
1319
class Archive;
1420
struct HtmlPage;
1521
class HtmlService;
16-
class HtmlResource;
1722
struct HtmlConfig;
1823

24+
enum class HtmlResourceType {
25+
html_fragment,
26+
css,
27+
js,
28+
image,
29+
font,
30+
};
31+
32+
class HtmlResource final {
33+
public:
34+
HtmlResource();
35+
explicit HtmlResource(std::shared_ptr<internal::abstract::HtmlResource> impl);
36+
37+
[[nodiscard]] HtmlResourceType type() const;
38+
[[nodiscard]] const std::string &mime_type() const;
39+
[[nodiscard]] const std::string &name() const;
40+
[[nodiscard]] const std::string &path() const;
41+
[[nodiscard]] const std::optional<File> &file() const;
42+
[[nodiscard]] bool is_shipped() const;
43+
[[nodiscard]] bool is_external() const;
44+
[[nodiscard]] bool is_accessible() const;
45+
46+
void write_resource(std::ostream &os) const;
47+
48+
private:
49+
std::shared_ptr<internal::abstract::HtmlResource> m_impl;
50+
};
51+
1952
using HtmlResourceLocation = std::optional<std::string>;
2053
using HtmlResourceLocator = std::function<HtmlResourceLocation(
2154
const HtmlResource &resource, const HtmlConfig &config)>;
55+
using HtmlResources =
56+
std::vector<std::pair<HtmlResource, HtmlResourceLocation>>;
2257

2358
/// @brief HTML table gridlines.
2459
enum class HtmlTableGridlines {
@@ -96,6 +131,55 @@ struct HtmlPage final {
96131
HtmlPage(std::string name, std::string path);
97132
};
98133

134+
class HtmlView final {
135+
public:
136+
HtmlView();
137+
explicit HtmlView(std::shared_ptr<internal::abstract::HtmlView> impl);
138+
139+
[[nodiscard]] const std::string &name() const;
140+
[[nodiscard]] const std::string &path() const;
141+
[[nodiscard]] const HtmlConfig &config() const;
142+
143+
HtmlResources write_html(std::ostream &out) const;
144+
145+
[[nodiscard]] Html bring_offline(const std::string &output_path) const;
146+
147+
[[nodiscard]] const std::shared_ptr<internal::abstract::HtmlView> &
148+
impl() const;
149+
150+
private:
151+
std::shared_ptr<internal::abstract::HtmlView> m_impl;
152+
};
153+
154+
using HtmlViews = std::vector<HtmlView>;
155+
156+
class HtmlService final {
157+
public:
158+
HtmlService();
159+
explicit HtmlService(std::shared_ptr<internal::abstract::HtmlService> impl);
160+
161+
[[nodiscard]] const HtmlConfig &config() const;
162+
[[nodiscard]] const HtmlViews &list_views() const;
163+
164+
void warmup() const;
165+
166+
[[nodiscard]] bool exists(const std::string &path) const;
167+
[[nodiscard]] std::string mimetype(const std::string &path) const;
168+
169+
void write(const std::string &path, std::ostream &out) const;
170+
HtmlResources write_html(const std::string &path, std::ostream &out) const;
171+
172+
[[nodiscard]] Html bring_offline(const std::string &output_path) const;
173+
[[nodiscard]] Html bring_offline(const std::string &output_path,
174+
const std::vector<HtmlView> &views) const;
175+
176+
[[nodiscard]] const std::shared_ptr<internal::abstract::HtmlService> &
177+
impl() const;
178+
179+
private:
180+
std::shared_ptr<internal::abstract::HtmlService> m_impl;
181+
};
182+
99183
namespace html {
100184

101185
HtmlResourceLocator standard_resource_locator();

0 commit comments

Comments
 (0)