WsParser_VS/WsNovelParser/htmlprint.cpp

202 lines
8.0 KiB
C++
Raw Normal View History

2024-03-17 07:58:28 +00:00
#include "htmlprint.h"
2024-03-31 05:59:17 +00:00
#include <QDir>
2024-04-02 12:39:25 +00:00
#include <QDomElement>
2024-03-17 07:58:28 +00:00
using namespace example_novel;
2024-03-28 13:11:12 +00:00
using namespace printer;
2024-06-22 15:19:14 +00:00
using namespace lib_parse;
2024-03-17 07:58:28 +00:00
2024-07-12 23:13:56 +00:00
#include <QTextStream>
#include <QTime>
#include <QDebug>
2024-06-22 15:19:14 +00:00
void printer::AstGenerate::append_tokens(QDomElement _elm, std::shared_ptr<const ast_gen::SyntaxElement> inst) {
2025-02-15 15:47:42 +00:00
auto dom_tokens = doc.createElement("tokens");
2024-06-22 15:19:14 +00:00
_elm.appendChild(dom_tokens);
for (auto& token : inst->selfTokens()) {
2025-02-15 15:47:42 +00:00
auto dom_token = doc.createElement("token");
2024-06-22 15:19:14 +00:00
dom_tokens.appendChild(dom_token);
2025-02-15 15:47:42 +00:00
dom_token.setAttribute("text", token->token()->content());
dom_token.setAttribute("row", token->token()->row());
dom_token.setAttribute("col", token->token()->column());
2024-06-22 15:19:14 +00:00
}
}
2025-02-15 15:47:42 +00:00
printer::AstGenerate::AstGenerate(const QDir& src_rt)
: src_root(src_rt) {
2024-06-23 02:28:13 +00:00
auto procs = doc.createProcessingInstruction("xml", "version='1.0' encoding='utf-8'");
2024-06-22 15:19:14 +00:00
doc.appendChild(procs);
}
2025-02-15 15:47:42 +00:00
QString printer::AstGenerate::content() const {
2024-06-22 15:19:14 +00:00
return doc.toString(2);
}
VisitMode printer::AstGenerate::mode() const {
return VisitMode::FirstParent;
}
2024-06-23 06:30:30 +00:00
#include <QDateTime>
2024-06-22 15:19:14 +00:00
bool printer::AstGenerate::visit(std::shared_ptr<const ast_gen::ElementAccess> syntax_element) {
2025-03-01 13:15:15 +00:00
auto depth = syntax_element->element()->depth();
2025-02-15 15:47:42 +00:00
switch ((NovelNode) syntax_element->element()->typeMark()) {
case NovelNode::GlobalElement:
{
auto body = doc.createElement("ast");
doc.appendChild(body);
body.setAttribute("time", QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
body.setAttribute("dir_src", src_root.absolutePath());
2025-03-01 13:15:15 +00:00
element_stack.append(std::make_pair(depth, body));
2025-02-15 15:47:42 +00:00
}break;
case NovelNode::Document: break;
case NovelNode::StoryDefine:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep){ return ep.first < depth; });
this->element_stack = temp_stack;
2024-06-22 15:19:14 +00:00
2025-02-15 15:47:42 +00:00
auto current_ast = element_stack.last();
auto story_node = std::dynamic_pointer_cast<const example_novel::StoryDefine>(syntax_element->element());
auto dom_story = doc.createElement("story");
2025-03-01 13:15:15 +00:00
current_ast.second.appendChild(dom_story);
element_stack.append(std::make_pair(depth, dom_story));
2024-06-22 15:19:14 +00:00
2025-02-15 15:47:42 +00:00
dom_story.setAttribute("name", story_node->name());
dom_story.setAttribute("address", (qulonglong) story_node.get());
dom_story.setAttribute("file-path", src_root.relativeFilePath(story_node->filePath()));
dom_story.setAttribute("sort", story_node->sort());
2024-06-22 15:19:14 +00:00
2025-02-15 15:47:42 +00:00
append_tokens(dom_story, story_node);
}break;
case NovelNode::FragmentSlice:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2024-06-22 15:19:14 +00:00
2025-02-15 15:47:42 +00:00
auto current_story = element_stack.last();
auto slice_node = std::dynamic_pointer_cast<const example_novel::FragmentSlice>(syntax_element->element());
auto dom_slice = doc.createElement("slice");
2025-03-01 13:15:15 +00:00
current_story.second.appendChild(dom_slice);
element_stack.append(std::make_pair(depth, dom_slice));
2024-06-22 15:19:14 +00:00
2025-02-15 15:47:42 +00:00
dom_slice.setAttribute("name", slice_node->name());
dom_slice.setAttribute("address", (qulonglong) slice_node.get());
}break;
case NovelNode::PointDefines:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2025-02-15 15:47:42 +00:00
auto current_slice = element_stack.last();
auto point_node = std::dynamic_pointer_cast<const example_novel::PointDefines>(syntax_element->element());
auto dom_point = doc.createElement("point");
2025-03-01 13:15:15 +00:00
current_slice.second.appendChild(dom_point);
element_stack.append(std::make_pair(depth, dom_point));
2025-02-15 15:47:42 +00:00
dom_point.setAttribute("name", point_node->name());
dom_point.setAttribute("address", (qulonglong) point_node.get());
dom_point.setAttribute("file-path", src_root.relativeFilePath(point_node->filePath()));
append_tokens(dom_point, point_node);
}break;
case NovelNode::TextSection:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2025-02-15 15:47:42 +00:00
auto current_pnode = element_stack.last();
auto text_node = std::dynamic_pointer_cast<const example_novel::TextSection>(syntax_element->element());
auto dom_text = doc.createElement("text-section");
2025-03-01 13:15:15 +00:00
current_pnode.second.appendChild(dom_text);
2025-02-15 15:47:42 +00:00
dom_text.setAttribute("text", text_node->content());
dom_text.setAttribute("file-path", src_root.relativeFilePath(text_node->filePath()));
append_tokens(dom_text, text_node);
}break;
case NovelNode::PointRefers:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2025-02-15 15:47:42 +00:00
auto current_pnode = element_stack.last();
auto refer_node = std::dynamic_pointer_cast<const example_novel::PointRefers>(syntax_element->element());
auto dom_refer = doc.createElement("refer");
2025-03-01 13:15:15 +00:00
current_pnode.second.appendChild(dom_refer);
element_stack.append(std::make_pair(depth, dom_refer));
2025-02-15 15:47:42 +00:00
dom_refer.setAttribute("story", refer_node->storyRefer());
dom_refer.setAttribute("slice", refer_node->sliceRefer());
dom_refer.setAttribute("point", refer_node->pointRefer());
dom_refer.setAttribute("file-path", src_root.relativeFilePath(refer_node->filePath()));
append_tokens(dom_refer, refer_node);
}break;
case NovelNode::VolumeDefine:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2025-02-15 15:47:42 +00:00
auto current_ast = element_stack.last();
auto volume_node = std::dynamic_pointer_cast<const example_novel::VolumeDefine>(syntax_element->element());
auto dom_volume = doc.createElement("volume");
2025-03-01 13:15:15 +00:00
current_ast.second.appendChild(dom_volume);
element_stack.append(std::make_pair(depth, dom_volume));
2025-02-15 15:47:42 +00:00
dom_volume.setAttribute("name", volume_node->name());
dom_volume.setAttribute("address", (qulonglong) volume_node.get());
dom_volume.setAttribute("file-path", src_root.relativeFilePath(volume_node->filePath()));
append_tokens(dom_volume, volume_node);
}break;
case NovelNode::ArticleDefine:
{
2025-03-01 13:15:15 +00:00
decltype(this->element_stack) temp_stack;
std::copy_if(element_stack.begin(), element_stack.end(),
std::back_inserter(temp_stack), [=](std::pair<int, QDomElement> ep) { return ep.first < depth; });
this->element_stack = temp_stack;
2025-02-15 15:47:42 +00:00
auto current_volume = element_stack.last();
auto article_node = std::dynamic_pointer_cast<const example_novel::ArticleDefine>(syntax_element->element());
auto dom_article = doc.createElement("article");
2025-03-01 13:15:15 +00:00
current_volume.second.appendChild(dom_article);
element_stack.append(std::make_pair(depth, dom_article));
2025-02-15 15:47:42 +00:00
dom_article.setAttribute("name", article_node->name());
dom_article.setAttribute("address", (qulonglong) article_node.get());
dom_article.setAttribute("file-path", src_root.relativeFilePath(article_node->filePath()));
append_tokens(dom_article, article_node);
}break;
case NovelNode::RankDeclaration:
{
auto ast_element = element_stack.first();
auto rank_node = std::dynamic_pointer_cast<const example_novel::RankDeclare>(syntax_element->element());
auto dom_rank = doc.createElement("rank");
2025-03-01 13:15:15 +00:00
ast_element.second.appendChild(dom_rank);
2025-02-15 15:47:42 +00:00
dom_rank.setAttribute("rank", rank_node->rankNumber());
dom_rank.setAttribute("doc-path", src_root.relativeFilePath(rank_node->filePath()));
append_tokens(dom_rank, rank_node);
}break;
default:
break;
2024-06-22 15:19:14 +00:00
}
return true;
}