WsParser_VS/WsNovelParser/htmlprint.h

122 lines
3.0 KiB
C
Raw Normal View History

2024-03-17 07:58:28 +00:00
#pragma once
#include <QList>
#include <QFileInfo>
#include <ast_gen.h>
#include <parse_novel.h>
2024-03-28 13:11:12 +00:00
namespace printer {
/*
* @brief <EFBFBD><EFBFBD><EFBFBD>пɷ<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
*/
class Access : public std::enable_shared_from_this<Access> {
public:
2024-03-28 16:16:24 +00:00
Access(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
virtual ~Access() = default;
2024-03-17 07:58:28 +00:00
2024-03-28 16:16:24 +00:00
std::shared_ptr<const ast_gen::ElementAccess> accessPeers() const;
2024-03-28 13:11:12 +00:00
void setHtmlRefer(const QString& href);
QString htmlRefer() const;
private:
2024-03-28 16:16:24 +00:00
std::shared_ptr<const ast_gen::ElementAccess> access_handle;
2024-03-28 13:11:12 +00:00
QString refers_store;
};
/*
* @brief <EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD>α<EFBFBD>ƪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class Element : public Access {
public:
2024-03-28 16:16:24 +00:00
Element(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
virtual ~Element() = default;
virtual QString toOutsideHTML() const = 0;
virtual QString toDefinitionHTML() const = 0;
};
/*
* @brief <EFBFBD>ɷ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ϵĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><EFBFBD><EFBFBD>
*/
class Group : public Access {
public:
2024-03-28 16:16:24 +00:00
Group(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
virtual ~Group() = default;
virtual QString toHTML() const = 0;
2024-03-28 16:16:24 +00:00
void append(std::shared_ptr<Element> elm);
QList<std::shared_ptr<Element>> elements() const;
2024-03-28 13:11:12 +00:00
private:
2024-03-28 16:16:24 +00:00
QList<std::shared_ptr<Element>> element_store;
2024-03-28 13:11:12 +00:00
};
class StoryLine : public Group {
public:
2024-03-28 16:16:24 +00:00
StoryLine(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
// ͨ<><CDA8> Group <20>̳<EFBFBD>
QString toHTML() const override;
};
class StoryVolume : public Group {
public:
2024-03-28 16:16:24 +00:00
StoryVolume(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
// ͨ<><CDA8> Group <20>̳<EFBFBD>
QString toHTML() const override;
};
2024-03-28 16:16:24 +00:00
/*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD>
*/
2024-03-28 13:11:12 +00:00
class FragmentRef : public Element {
public:
2024-03-28 16:16:24 +00:00
FragmentRef(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
// ͨ<><CDA8> Element <20>̳<EFBFBD>
QString toOutsideHTML() const override;
QString toDefinitionHTML() const override;
};
/*
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD>α<EFBFBD>ƪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD>
*/
class Fragment : public Element{
private:
QList<std::shared_ptr<FragmentRef>> additionals_store;
public:
2024-03-28 16:16:24 +00:00
Fragment(std::shared_ptr<const ast_gen::ElementAccess> handle);
2024-03-28 13:11:12 +00:00
void appendRefers(std::shared_ptr<FragmentRef> inst);
QList<std::shared_ptr<FragmentRef>> additionals() const;
// ͨ<><CDA8> Element <20>̳<EFBFBD>
QString toOutsideHTML() const override;
QString toDefinitionHTML() const override;
};
2024-03-28 16:16:24 +00:00
class tools_printer {
private:
QHash<QString, std::shared_ptr<Fragment>> fragment_defines;
QHash<QString, std::shared_ptr<StoryLine>> storyline_defines;
QHash<QString, std::shared_ptr<StoryVolume>> volume_defines;
public:
void build_fragments(std::shared_ptr<const ast_gen::ElementAccess> novel_root);
void build_refers_network(std::shared_ptr<const ast_gen::ElementAccess> novel_node);
void build_storyline(std::shared_ptr<StoryLine> line, std::shared_ptr<const ast_gen::ElementAccess> novel_node = nullptr);
void build_volumeline(std::shared_ptr<StoryVolume> line, std::shared_ptr<const ast_gen::ElementAccess> novel_node = nullptr);
};
2024-03-28 13:11:12 +00:00
}