File indexing completed on 2024-05-12 04:02:19

0001 /*
0002     SPDX-FileCopyrightText: 2016 Volker Krause <vkrause@kde.org>
0003     SPDX-FileCopyrightText: 2020 Jonathan Poelen <jonathan.poelen@gmail.com>
0004 
0005     SPDX-License-Identifier: MIT
0006 */
0007 
0008 #ifndef KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
0009 #define KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
0010 
0011 #include <QString>
0012 #include <QStringList>
0013 #include <QStringView>
0014 
0015 #include <vector>
0016 
0017 QT_BEGIN_NAMESPACE
0018 class QXmlStreamReader;
0019 QT_END_NAMESPACE
0020 
0021 namespace KSyntaxHighlighting
0022 {
0023 class Repository;
0024 class DefinitionData;
0025 
0026 class KeywordList
0027 {
0028 public:
0029     KeywordList() = default;
0030     ~KeywordList() = default;
0031 
0032     bool isEmpty() const
0033     {
0034         return m_keywords.isEmpty();
0035     }
0036 
0037     const QString &name() const
0038     {
0039         return m_name;
0040     }
0041 
0042     const QStringList &keywords() const
0043     {
0044         return m_keywords;
0045     }
0046 
0047     Qt::CaseSensitivity caseSensitivity() const
0048     {
0049         return m_caseSensitive;
0050     }
0051 
0052     void setKeywordList(const QStringList &keywords)
0053     {
0054         m_keywords = keywords;
0055         m_keywordsSortedCaseSensitive.clear();
0056         m_keywordsSortedCaseInsensitive.clear();
0057         initLookupForCaseSensitivity(m_caseSensitive);
0058     }
0059 
0060     /** Checks if @p str is a keyword in this list. */
0061     bool contains(QStringView str) const
0062     {
0063         return contains(str, m_caseSensitive);
0064     }
0065 
0066     /** Checks if @p str is a keyword in this list, overriding the global case-sensitivity setting. */
0067     bool contains(QStringView str, Qt::CaseSensitivity caseSensitive) const;
0068 
0069     void load(QXmlStreamReader &reader);
0070     void setCaseSensitivity(Qt::CaseSensitivity caseSensitive);
0071     void initLookupForCaseSensitivity(Qt::CaseSensitivity caseSensitive);
0072     void resolveIncludeKeywords(DefinitionData &def);
0073 
0074 private:
0075     /**
0076      * name of keyword list as in XML
0077      */
0078     QString m_name;
0079 
0080     /**
0081      * raw list of keywords, as seen in XML (but trimmed)
0082      */
0083     QStringList m_keywords;
0084 
0085     /**
0086      * raw list of include keywords, as seen in XML (but trimmed)
0087      */
0088     QStringList m_includes;
0089 
0090     /**
0091      * default case-sensitivity setting
0092      */
0093     Qt::CaseSensitivity m_caseSensitive = Qt::CaseSensitive;
0094 
0095     /**
0096      * case-sensitive sorted string references to m_keywords for lookup
0097      */
0098     std::vector<QStringView> m_keywordsSortedCaseSensitive;
0099 
0100     /**
0101      * case-insensitive sorted string references to m_keywords for lookup
0102      */
0103     std::vector<QStringView> m_keywordsSortedCaseInsensitive;
0104 };
0105 }
0106 
0107 #endif // KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H