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 };