#include "htmlprint.h"
#include
using namespace example_novel;
using namespace printer;
Access::Access(std::shared_ptr handle) :access_handle(handle) {}
std::shared_ptr Access::accessPeers() const { return access_handle; }
void Access::setHtmlRefer(const QString& href) { this->refers_store = href; }
QString Access::htmlRefer() const { return this->refers_store; }
Element::Element(std::shared_ptr handle) :Access(handle) {}
Group::Group(std::shared_ptr handle) : Access(handle) {}
void Group::append(std::shared_ptr elm)
{
element_store.append(elm);
}
QList> Group::elements() const
{
return this->element_store;
}
StoryLine::StoryLine(std::shared_ptr handle) :Group(handle) {}
QString StoryLine::toHTML() const
{
return QString();
}
StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) {}
QString StoryVolume::toHTML() const
{
return QString();
}
FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) {}
QString FragmentRef::toOutsideHTML() const
{
return QString();
}
QString FragmentRef::toDefinitionHTML() const
{
return QString();
}
Fragment::Fragment(std::shared_ptr handle) : Element(handle) {}
void Fragment::appendRefers(std::shared_ptr inst) {
this->additionals_store.append(inst);
}
QList> Fragment::additionals() const {
return this->additionals_store;
}
QString Fragment::toOutsideHTML() const
{
return QString();
}
QString Fragment::toDefinitionHTML() const
{
return QString();
}
#include
void tools_printer::build_fragments(std::shared_ptr novel_root)
{
if (novel_root->element()->typeMark() == (int)example_novel::NovelNode::FragmentDefine) {
auto inst = std::make_shared(novel_root);
this->fragment_defines[novel_root->element()->signature()] = inst;
}
for (auto& inst_c : novel_root->children()) {
build_fragments(inst_c);
}
}
void tools_printer::build_refers_network(std::shared_ptr novel_node)
{
switch ((example_novel::NovelNode)novel_node->element()->typeMark()) {
case example_novel::NovelNode::StoryDefine: {
auto storyinst = std::make_shared(novel_node);
this->storyline_defines[novel_node->element()->signature()] = storyinst;
build_storyline(storyinst);
}return;
case example_novel::NovelNode::VolumeDefine: {
auto volumeinst = std::make_shared(novel_node);
this->volume_defines[novel_node->element()->signature()] = volumeinst;
build_volumeline(volumeinst);
}return;
}
for (auto& inst_c : novel_node->children())
build_refers_network(inst_c);
}
void tools_printer::build_storyline(std::shared_ptr line, std::shared_ptr novel_node)
{
if (!novel_node) {
for (auto& inst_c : line->accessPeers()->children()) {
build_storyline(line, inst_c);
}
}
else {
switch ((example_novel::NovelNode)novel_node->element()->typeMark())
{
case example_novel::NovelNode::FragmentDefine: {
auto inst = this->fragment_defines[novel_node->element()->signature()];
line->append(inst);
}return;
case example_novel::NovelNode::FragmentRefer: {
auto refer_node = std::dynamic_pointer_cast(novel_node->element());
auto refer_fragment = this->fragment_defines[refer_node->referSignature()];
auto inst = std::make_shared(novel_node);
refer_fragment->appendRefers(inst);
line->append(inst);
}return;
}
for (auto& inst_c : novel_node->children())
build_storyline(line, inst_c);
}
}
void tools_printer::build_volumeline(std::shared_ptr volume, std::shared_ptr novel_node)
{
if (!novel_node) {
for (auto& inst_c : volume->accessPeers()->children())
build_volumeline(volume, inst_c);
}
else {
if (example_novel::NovelNode::FragmentRefer == (example_novel::NovelNode)novel_node->element()->typeMark()) {
auto refer_node = std::dynamic_pointer_cast(novel_node->element());
auto refer_fragment = this->fragment_defines[refer_node->referSignature()];
auto inst = std::make_shared(novel_node);
refer_fragment->appendRefers(inst);
volume->append(inst);
return;
}
for (auto& inst_c : novel_node->children())
build_volumeline(volume, inst_c);
}
}
void printer::tools_printer::fragments_anchors_define(const QList>& list, const QDir & destdir) {
for (auto &it : list) {
auto address_x = QString::number((qulonglong)it->accessPeers()->element().get());
it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x)));
}
}
std::function>&, const QDir &)> refers_refresh =
[&](const QList> &items, const QDir &destdir){
for (auto &item : items) {
auto refer = std::dynamic_pointer_cast(item);
if (refer) {
auto address_x = QString::number((qulonglong)refer->accessPeers()->element().get());
refer->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x)));
}
}
};
void printer::tools_printer::storylines_anchors_define(const QList>& list, const QDir & destdir) {
for (auto &it : list) {
auto address_x = QString::number((qulonglong)it->accessPeers()->element().get());
it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x)));
refers_refresh(it->elements(), destdir);
}
}
void printer::tools_printer::volumes_anchors_define(const QList>& list, const QDir & destdir) {
for (auto &it : list) {
auto address_x = QString::number((qulonglong)it->accessPeers()->element().get());
it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x)));
refers_refresh(it->elements(), destdir);
}
}