File indexing completed on 2024-12-22 04:48:10

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2023 Louis Schul <schul9louis@gmail.com>
0004 */
0005 
0006 // CREDIT TO ORIGINAL IDEA: https://marked.js.org/
0007 
0008 #pragma once
0009 
0010 #include <QRegularExpression>
0011 
0012 class Parser;
0013 
0014 class InlineLexer
0015 {
0016 public:
0017     explicit InlineLexer(Parser *parser);
0018 
0019     QString output(QString &src, bool useInlineText = false);
0020 
0021 private:
0022     QString mangle(const QString &text) const;
0023     QString escapes(QString &text) const;
0024     QString outputLink(QRegularExpressionMatch &cap, QMap<QString, QString> linkInfo, bool useInlineText);
0025 
0026     inline static const QRegularExpression inline_escape = QRegularExpression(QStringLiteral("^\\\\([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\]\\\\^_`{|}~~|])"));
0027 
0028     inline static const QRegularExpression inline_autolink = QRegularExpression(
0029         QStringLiteral("^<([a-zA-Z][a-zA-Z0-9+.-]{1,31}:[^\\s\\x00-\\x1f<>]*|[a-zA-Z0-9.!#$%&'*+/"
0030                        "=?_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_]))>"));
0031 
0032     inline static const QRegularExpression inline_url = QRegularExpression(
0033         QStringLiteral("^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^[a-zA-Z0-9.!#$%&'*+/"
0034                        "=?_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])"));
0035 
0036     inline static const QRegularExpression inline_tag = QRegularExpression(QStringLiteral(
0037         "^<!--(?!-?>)[\\s\\S]*?-->|^<\\/"
0038         "[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?)*?\\s*\\/"
0039         ">|^<\\?[\\s\\S]*?\\?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"));
0040 
0041     inline static const QRegularExpression inline_link = QRegularExpression(QStringLiteral(
0042         "^!?\\[((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]?|`[^`]*`|[^\\[\\]\\\\])*?)\\]\\(\\s*(<(?:\\\\[<>]?|[^\\s<>\\\\])*>|(?:\\\\[()]?|\\([^\\s\\x00-\\x1f()\\\\]*\\)"
0043         "|[^\\s\\x00-\\x1f()\\\\])*?)(?:\\s+(\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)))?\\s*\\)"));
0044 
0045     inline static const QRegularExpression inline_reflink = QRegularExpression(
0046         QStringLiteral("^!?\\[((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]?|`[^`]*`|[^\\[\\]\\\\])*?)\\]\\[(?!\\s*\\])((?:\\[\\[\\]]?|[^\\[\\]\\\\])+)\\]"));
0047 
0048     inline static const QRegularExpression inline_nolink =
0049         QRegularExpression(QStringLiteral("^!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?"));
0050 
0051     inline static const QRegularExpression inline_strong = QRegularExpression(
0052         QStringLiteral("^__([^\\s][\\s\\S]*?[^\\s])__(?!_)|^\\*\\*([^\\s][\\s\\S]*?[^\\s])\\*\\*(?!\\*)|^__([^\\s])__(?!_)|^\\*\\*([^\\s])\\*\\*(?!\\*)"));
0053 
0054     inline static const QRegularExpression inline_em = QRegularExpression(QStringLiteral(
0055         "^_([^\\s][\\s\\S]*?[^\\s_])_(?!_)|^_([^\\s_][\\s\\S]*?[^\\s])_(?!_)|^\\*([^\\s][\\s\\S]*?[^\\s*])\\*(?!\\*)|^\\*([^\\s*][\\s\\S]*?[^\\s])\\*(?!\\*)|^_"
0056         "([^\\s_])_(?!_)|^\\*([^\\s*])\\*(?!\\*)"));
0057 
0058     inline static const QRegularExpression inline_code = QRegularExpression(QStringLiteral("^(\\`{1,})\\s*([\\s\\S]*?[^`]?)\\s*\\1(?!`)"));
0059 
0060     inline static const QRegularExpression inline_br = QRegularExpression(QStringLiteral("^ {2,}\n(?!\\s*$)"));
0061 
0062     inline static const QRegularExpression inline_del = QRegularExpression(QStringLiteral("^~~(?=\\S)([\\s\\S]*?\\S)~~"));
0063 
0064     inline static const QRegularExpression inline_highlight = QRegularExpression(QStringLiteral("^==(?=\\S)([\\s\\S]*?\\S)=="));
0065 
0066     inline static const QRegularExpression inline_text =
0067         QRegularExpression(QStringLiteral("^[\\s\\S]+?(?=[\\\\<!\\[`*~=:]|https?:\\/\\/|ftp:\\/\\/|www\\.|[a-zA-Z0-9.!#$%&'*+/=?_`{\\|}~-]+@|\b_| {2,}\n|$)"));
0068 
0069     inline static const QRegularExpression inline_backPedal =
0070         QRegularExpression(QStringLiteral("(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+"));
0071 
0072     bool m_inLink = false;
0073     Parser *m_parser;
0074 };