#ifndef CUSTOMDOCUMENT_H
#define CUSTOMDOCUMENT_H

#include <QtGui>
#include <QStringList>
#include <QTextEdit>

class CustomDocument : public QTextEdit
{
    Q_OBJECT

public:
    CustomDocument(QWidget *parent = nullptr);
    //初始化文档边距
    void setDocumentPadding(int left, int top, int right, int bottom);// 设置文档边距
    //主要是处理按键和鼠标同时按下的鼠标的变化
    bool eventFilter(QObject *obj, QEvent *event);
    //分为本地文件、文件夹、网页文件和暂存文件
    bool openLinkAtCursorPosition();
    //该函数的鲁棒性好，处理链接长度时很谨慎，防止C++常见的溢出问题
    QString getMarkdownUrlAtPosition(const QString &text, int position);
    //这个函数没有达到预期的要求，应该对scheme的类型进行一定的描述，提高鲁棒性
    bool isValidUrl(const QString &urlString);// 检查URL是否有效
    //没有进行检查，直接调用函数库
    void openUrl(const QString &urlString);
    //该函数值得学习
    //首先是每个可能链接的正则表达式
    //其次是对于引用链接，如何进行发现、描述和储存
    QMap<QString, QString> parseMarkdownUrlsFromText(const QString &text);// 解析文本中的Markdown链接
    // 这个函数值得学习，按照逻辑处理url和text，安排的很巧妙
    QUrl getUrlUnderMouse(); // 获取鼠标下的URL
    //块的移动，提供了一种思路，即先删除，后添加，最后移动游标到指定位置
    void moveBlockUp(); // 将当前块向上移动
    void moveBlockDown(); // 将当前块向下移动
signals:
    void resized(); // 信号：当控件大小改变时发出
    void mouseMoved(); // 信号：当鼠标移动时发出

    // QWidget interface
protected:
    void resizeEvent(QResizeEvent *event); // 重写QWidget的resizeEvent
    void mouseMoveEvent(QMouseEvent *event); // 重写QWidget的mouseMoveEvent

    QStringList _ignoredClickUrlSchemata; // 忽略点击的URL模式列表
};

#endif // CUSTOMDOCUMENT_H
