From 4ec73ffe6b92e37a45678906b203136eefdb877e Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 13 Jul 2024 07:13:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WsNovelParser/htmlprint.cpp | 163 ++++++++++++++++++++++++++++++++++++ WsNovelParser/htmlprint.h | 2 + WsNovelParser/main.cpp | 156 +--------------------------------- 3 files changed, 166 insertions(+), 155 deletions(-) diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp index 9904a48..9fbfbd8 100644 --- a/WsNovelParser/htmlprint.cpp +++ b/WsNovelParser/htmlprint.cpp @@ -534,6 +534,169 @@ QString printer::tools_printer::volumes_paint(const QList +#include +#include +void printer::tools_printer::plain_html_output(const std::shared_ptr access_ptr, const QDir& destination_dir) const +{ + QTime time_stamp = QTime::currentTime(); + auto tool = *this; + tool.build_fragments(access_ptr); + tool.build_refers_network(access_ptr); + + tool.fragments_anchors_define(tool.fragment_defines.values(), destination_dir); + tool.storylines_anchors_define(tool.storyline_defines.values(), destination_dir); + tool.volumes_anchors_define(tool.volume_defines.values(), destination_dir); + + std::function)> html_output = + [](std::shared_ptr inst) { + auto target_path = inst->pageRefers(); + QFile tfile(target_path); + if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) { + QDomDocument doc_inst(QDomImplementation().createDocumentType(u8"html", QString(), QString())); + auto html = doc_inst.createElement(u8"html"); + doc_inst.appendChild(html); + + auto body = doc_inst.createElement(u8"body"); + html.appendChild(body); + + inst->buildPageHTML(body); + + QTextStream tout(&tfile); + doc_inst.save(tout, 2); + tout.flush(); + } + }; + + for (auto& node : tool.fragment_defines) + html_output(node); + for (auto& node : tool.storyline_defines) + html_output(node); + for (auto& node : tool.volume_defines) + html_output(node); + + QDir::setCurrent(destination_dir.canonicalPath()); + auto dot_src = tool.storylines_paint(tool.storyline_defines.values()); + QFile dot_file(QDir::current().filePath(u8"relates.dot")); + if (dot_file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream txt(&dot_file); + txt.setCodec(u8"UTF-8"); + txt << dot_src; + txt.flush(); + } + system("dot -Tsvg relates.dot -o relates.svg"); + + auto vols_src = tool.volumes_paint(tool.volume_defines.values(), tool.storyline_defines.values()); + QFile vols_file(QDir::current().filePath(u8"volumes_group.dot")); + if (vols_file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream txt(&vols_file); + txt.setCodec(u8"UTF-8"); + txt << vols_src; + txt.flush(); + } + system("fdp -Tsvg volumes_group.dot -o volumes_group.svg"); + + + { + QFile tfile("./index.html"); + if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) { + QDomDocument doc_inst(QDomImplementation().createDocumentType(u8"html", QString(), QString())); + auto html = doc_inst.createElement(u8"html"); + doc_inst.appendChild(html); + + auto body = doc_inst.createElement(u8"body"); + html.appendChild(body); + + auto dom_storyline = doc_inst.createElement("div"); + auto dom_storyline_title = doc_inst.createElement("h2"); + dom_storyline_title.appendChild(doc_inst.createTextNode(u8"故事脉络")); + dom_storyline.appendChild(dom_storyline_title); + body.appendChild(dom_storyline); + + auto lines = tool.storyline_defines.values(); + std::sort(lines.begin(), lines.end(), [](std::shared_ptr a, std::shared_ptr b)->bool { + auto a_elm = std::dynamic_pointer_cast(a->accessPeers()->element()); + auto b_elm = std::dynamic_pointer_cast(b->accessPeers()->element()); + return a_elm->sort() < b_elm->sort(); + }); + for (auto& inst_line : lines) { + auto dom_line = doc_inst.createElement("p"); + dom_storyline.appendChild(dom_line); + + auto line_href = doc_inst.createElement("a"); + line_href.setAttribute(u8"href", u8"file:///" + inst_line->pageRefers()); + auto a_elm = std::dynamic_pointer_cast(inst_line->accessPeers()->element()); + line_href.appendChild(doc_inst.createTextNode(QString(u8"%1.%2").arg(a_elm->sort()).arg(a_elm->signature()))); + dom_line.appendChild(line_href); + } + + auto dom_volume = doc_inst.createElement("div"); + auto dom_volume_title = doc_inst.createElement("h2"); + dom_volume_title.appendChild(doc_inst.createTextNode(u8"分卷内容")); + dom_volume.appendChild(dom_volume_title); + body.appendChild(dom_volume); + + for (auto& inst_volume : tool.volume_defines) { + auto dom_volume_ref = doc_inst.createElement("p"); + dom_volume.appendChild(dom_volume_ref); + + auto volume_href = doc_inst.createElement("a"); + volume_href.setAttribute(u8"href", u8"file:///" + inst_volume->pageRefers()); + volume_href.appendChild(doc_inst.createTextNode(inst_volume->accessPeers()->element()->signature())); + dom_volume_ref.appendChild(volume_href); + } + + auto dom_fragment = doc_inst.createElement("div"); + auto dom_fragment_title = doc_inst.createElement("h2"); + dom_fragment_title.appendChild(doc_inst.createTextNode(u8"情节集合")); + dom_fragment.appendChild(dom_fragment_title); + body.appendChild(dom_fragment); + + auto table_cube = doc_inst.createElement(u8"table"); + dom_fragment.appendChild(table_cube); + + int row_ctrl = 0; + QDomElement elm_row; + for (auto& inst_frag : tool.fragment_defines) { + if (row_ctrl++ % 4 == 0) { + elm_row = doc_inst.createElement(u8"tr"); + table_cube.appendChild(elm_row); + } + + auto dom_fragment_ref = doc_inst.createElement("td"); + elm_row.appendChild(dom_fragment_ref); + + auto frag_href = doc_inst.createElement("a"); + frag_href.setAttribute(u8"href", u8"file:///" + inst_frag->pageRefers()); + frag_href.appendChild(doc_inst.createTextNode(inst_frag->accessPeers()->element()->signature())); + dom_fragment_ref.appendChild(frag_href); + } + + auto dom_relate = doc_inst.createElement(u8"div"); + auto dom_relate_title = doc_inst.createElement(u8"h2"); + dom_relate_title.appendChild(doc_inst.createTextNode(u8"联系图")); + dom_relate.appendChild(dom_relate_title); + body.appendChild(dom_relate); + + auto img = doc_inst.createElement(u8"img"); + img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"relates.svg")); + dom_relate.appendChild(img); + dom_relate.appendChild(doc_inst.createElement("br")); + img = doc_inst.createElement(u8"img"); + img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"volumes_group.svg")); + dom_relate.appendChild(img); + + QTextStream tout(&tfile); + doc_inst.save(tout, 2); + tout.flush(); + } + } + + auto current_stamp = QTime::currentTime(); + qDebug().noquote() << QString(u8"%html构建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); + qDebug().noquote() << u8"%编译成功:" << destination_dir.absoluteFilePath(u8"index.html"); +} + void printer::AstGenerate::append_tokens(QDomElement _elm, std::shared_ptr inst) { auto dom_tokens = doc.createElement(u8"tokens"); _elm.appendChild(dom_tokens); diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index 9a00c9d..ef369fa 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -156,6 +156,8 @@ namespace printer { QString storylines_paint(const QList> &lines); QString volumes_paint(const QList> &vols, const QList> &lines); + + void plain_html_output(const std::shared_ptr root, const QDir &destinationdir) const; }; class AstGenerate : public lib_parse::TreeVisitor { diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp index 13e7335..81e5929 100644 --- a/WsNovelParser/main.cpp +++ b/WsNovelParser/main.cpp @@ -93,162 +93,8 @@ int main(int argc, char* argv[]) { } if (html_opt->value().toInt() == 1 && access_ptr) { - QTime time_stamp = QTime::currentTime(); printer::tools_printer tool; - tool.build_fragments(access_ptr); - tool.build_refers_network(access_ptr); - - tool.fragments_anchors_define(tool.fragment_defines.values(), destination_dir); - tool.storylines_anchors_define(tool.storyline_defines.values(), destination_dir); - tool.volumes_anchors_define(tool.volume_defines.values(), destination_dir); - - std::function)> html_output = - [](std::shared_ptr inst) { - auto target_path = inst->pageRefers(); - QFile tfile(target_path); - if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) { - QDomDocument doc_inst(QDomImplementation().createDocumentType(u8"html", QString(), QString())); - auto html = doc_inst.createElement(u8"html"); - doc_inst.appendChild(html); - - auto body = doc_inst.createElement(u8"body"); - html.appendChild(body); - - inst->buildPageHTML(body); - - QTextStream tout(&tfile); - doc_inst.save(tout, 2); - tout.flush(); - } - }; - - for (auto& node : tool.fragment_defines) - html_output(node); - for (auto& node : tool.storyline_defines) - html_output(node); - for (auto& node : tool.volume_defines) - html_output(node); - - QDir::setCurrent(destination_dir.canonicalPath()); - auto dot_src = tool.storylines_paint(tool.storyline_defines.values()); - QFile dot_file(QDir::current().filePath(u8"relates.dot")); - if (dot_file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QTextStream txt(&dot_file); - txt.setCodec(u8"UTF-8"); - txt << dot_src; - txt.flush(); - } - system("dot -Tsvg relates.dot -o relates.svg"); - - auto vols_src = tool.volumes_paint(tool.volume_defines.values(), tool.storyline_defines.values()); - QFile vols_file(QDir::current().filePath(u8"volumes_group.dot")); - if (vols_file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QTextStream txt(&vols_file); - txt.setCodec(u8"UTF-8"); - txt << vols_src; - txt.flush(); - } - system("fdp -Tsvg volumes_group.dot -o volumes_group.svg"); - - - { - QFile tfile("./index.html"); - if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) { - QDomDocument doc_inst(QDomImplementation().createDocumentType(u8"html", QString(), QString())); - auto html = doc_inst.createElement(u8"html"); - doc_inst.appendChild(html); - - auto body = doc_inst.createElement(u8"body"); - html.appendChild(body); - - auto dom_storyline = doc_inst.createElement("div"); - auto dom_storyline_title = doc_inst.createElement("h2"); - dom_storyline_title.appendChild(doc_inst.createTextNode(u8"故事脉络")); - dom_storyline.appendChild(dom_storyline_title); - body.appendChild(dom_storyline); - - auto lines = tool.storyline_defines.values(); - std::sort(lines.begin(), lines.end(), [](std::shared_ptr a, std::shared_ptr b)->bool { - auto a_elm = std::dynamic_pointer_cast(a->accessPeers()->element()); - auto b_elm = std::dynamic_pointer_cast(b->accessPeers()->element()); - return a_elm->sort() < b_elm->sort(); - }); - for (auto& inst_line : lines) { - auto dom_line = doc_inst.createElement("p"); - dom_storyline.appendChild(dom_line); - - auto line_href = doc_inst.createElement("a"); - line_href.setAttribute(u8"href", u8"file:///" + inst_line->pageRefers()); - auto a_elm = std::dynamic_pointer_cast(inst_line->accessPeers()->element()); - line_href.appendChild(doc_inst.createTextNode(QString(u8"%1.%2").arg(a_elm->sort()).arg(a_elm->signature()))); - dom_line.appendChild(line_href); - } - - auto dom_volume = doc_inst.createElement("div"); - auto dom_volume_title = doc_inst.createElement("h2"); - dom_volume_title.appendChild(doc_inst.createTextNode(u8"分卷内容")); - dom_volume.appendChild(dom_volume_title); - body.appendChild(dom_volume); - - for (auto& inst_volume : tool.volume_defines) { - auto dom_volume_ref = doc_inst.createElement("p"); - dom_volume.appendChild(dom_volume_ref); - - auto volume_href = doc_inst.createElement("a"); - volume_href.setAttribute(u8"href", u8"file:///" + inst_volume->pageRefers()); - volume_href.appendChild(doc_inst.createTextNode(inst_volume->accessPeers()->element()->signature())); - dom_volume_ref.appendChild(volume_href); - } - - auto dom_fragment = doc_inst.createElement("div"); - auto dom_fragment_title = doc_inst.createElement("h2"); - dom_fragment_title.appendChild(doc_inst.createTextNode(u8"情节集合")); - dom_fragment.appendChild(dom_fragment_title); - body.appendChild(dom_fragment); - - auto table_cube = doc_inst.createElement(u8"table"); - dom_fragment.appendChild(table_cube); - - int row_ctrl = 0; - QDomElement elm_row; - for (auto& inst_frag : tool.fragment_defines) { - if (row_ctrl++ % 4 == 0) { - elm_row = doc_inst.createElement(u8"tr"); - table_cube.appendChild(elm_row); - } - - auto dom_fragment_ref = doc_inst.createElement("td"); - elm_row.appendChild(dom_fragment_ref); - - auto frag_href = doc_inst.createElement("a"); - frag_href.setAttribute(u8"href", u8"file:///" + inst_frag->pageRefers()); - frag_href.appendChild(doc_inst.createTextNode(inst_frag->accessPeers()->element()->signature())); - dom_fragment_ref.appendChild(frag_href); - } - - auto dom_relate = doc_inst.createElement(u8"div"); - auto dom_relate_title = doc_inst.createElement(u8"h2"); - dom_relate_title.appendChild(doc_inst.createTextNode(u8"联系图")); - dom_relate.appendChild(dom_relate_title); - body.appendChild(dom_relate); - - auto img = doc_inst.createElement(u8"img"); - img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"relates.svg")); - dom_relate.appendChild(img); - dom_relate.appendChild(doc_inst.createElement("br")); - img = doc_inst.createElement(u8"img"); - img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"volumes_group.svg")); - dom_relate.appendChild(img); - - QTextStream tout(&tfile); - doc_inst.save(tout, 2); - tout.flush(); - } - } - - auto current_stamp = QTime::currentTime(); - qDebug().noquote() << QString(u8"%html构建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); - qDebug().noquote() << u8"%编译成功:" << destination_dir.absoluteFilePath(u8"index.html"); + tool.plain_html_output(access_ptr, destination_dir); } else if (access_ptr) { QTime time_stamp = QTime::currentTime();