File indexing completed on 2025-03-09 03:57:05

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-09-14
0007  * Description : a parse results map for token management
0008  *
0009  * SPDX-FileCopyrightText: 2009-2012 by Andi Clemens <andi dot clemens at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 #include "parseresults.h"
0016 
0017 // Local includes
0018 
0019 #include "digikam_debug.h"
0020 
0021 namespace
0022 {
0023     static const quint8 INVALID_KEY_ID = -1;
0024 }
0025 
0026 namespace Digikam
0027 {
0028 
0029 void ParseResults::addEntry(const ResultsKey& key, const ResultsValue& value)
0030 {
0031     m_results.insert(key, value);
0032 }
0033 
0034 void ParseResults::deleteEntry(const ResultsKey& key)
0035 {
0036     m_results.remove(key);
0037 }
0038 
0039 QList<ParseResults::ResultsKey> ParseResults::keys() const
0040 {
0041     return m_results.keys();
0042 }
0043 
0044 bool ParseResults::hasKey(const ResultsKey& key)
0045 {
0046     return keys().contains(key);
0047 }
0048 
0049 QList<ParseResults::ResultsValue> ParseResults::values() const
0050 {
0051     return m_results.values();
0052 }
0053 
0054 QString ParseResults::result(const ResultsKey& key) const
0055 {
0056     if (m_results.isEmpty())
0057     {
0058         return QString();
0059     }
0060 
0061     QString result = m_results.value(key).second;
0062 
0063     return result;
0064 }
0065 
0066 QString ParseResults::token(const ResultsKey& key) const
0067 {
0068     if (m_results.isEmpty())
0069     {
0070         return QString();
0071     }
0072 
0073     QString token = m_results.value(key).first;
0074 
0075     return token;
0076 }
0077 
0078 int ParseResults::offset(const ResultsKey& key) const
0079 {
0080     int pos    = key.first;
0081     int length = key.second;
0082 
0083     if      (hasKeyAtPosition(pos))
0084     {
0085         return (pos + length);
0086     }
0087     else if (hasKeyAtApproximatePosition(pos))
0088     {
0089         ResultsKey key2 = keyAtApproximatePosition(pos);
0090 
0091         return ((key2.first + key2.second) - pos);
0092     }
0093 
0094     return INVALID_KEY_ID;
0095 }
0096 
0097 ParseResults::ResultsKey ParseResults::keyAtPosition(int pos) const
0098 {
0099     Q_FOREACH (const ResultsKey& key, m_results.keys())
0100     {
0101         if (pos == key.first)
0102         {
0103             // cppcheck-suppress useStlAlgorithm
0104             return key;
0105         }
0106     }
0107 
0108     return createInvalidKey();
0109 }
0110 
0111 bool ParseResults::hasKeyAtPosition(int pos) const
0112 {
0113     ResultsKey key = keyAtPosition(pos);
0114 
0115     return keyIsValid(key);
0116 }
0117 
0118 ParseResults::ResultsKey ParseResults::keyAtApproximatePosition(int pos) const
0119 {
0120     Q_FOREACH (const ResultsKey& key, m_results.keys())
0121     {
0122         int start  = key.first;
0123         int length = key.second;
0124 
0125         if ((pos >= start) && (pos <= start + length))
0126         {
0127             return key;
0128         }
0129     }
0130 
0131     return createInvalidKey();
0132 }
0133 
0134 bool ParseResults::hasKeyAtApproximatePosition(int pos) const
0135 {
0136     ResultsKey key = keyAtApproximatePosition(pos);
0137 
0138     return keyIsValid(key);
0139 }
0140 
0141 void ParseResults::clear()
0142 {
0143     m_results.clear();
0144 }
0145 
0146 void ParseResults::append(const ParseResults& results)
0147 {
0148     m_results.unite(results.m_results);
0149 }
0150 
0151 bool ParseResults::isEmpty() const
0152 {
0153     return m_results.isEmpty();
0154 }
0155 
0156 ParseResults::ResultsKey ParseResults::createInvalidKey() const
0157 {
0158     return ResultsKey(INVALID_KEY_ID, INVALID_KEY_ID);
0159 }
0160 
0161 bool ParseResults::keyIsValid(const ResultsKey& key) const
0162 {
0163     return ((key.first != INVALID_KEY_ID) && (key.second != INVALID_KEY_ID));
0164 }
0165 
0166 QString ParseResults::replaceTokens(const QString& markedString) const
0167 {
0168     QString result;
0169 
0170     for (int i = 0 ; i < markedString.count() ; )
0171     {
0172         if (hasKeyAtPosition(i))
0173         {
0174             ResultsKey key     = keyAtPosition(i);
0175             ResultsValue value = m_results.value(key);
0176             result.append(value.second);
0177             i                 += key.second;
0178         }
0179         else
0180         {
0181             result.append(markedString.at(i));
0182             ++i;
0183         }
0184     }
0185 
0186     return result;
0187 }
0188 
0189 QString ParseResults::resultValuesAsString() const
0190 {
0191     QString valuesString;
0192 
0193     Q_FOREACH (const ResultsKey& key, m_results.keys())
0194     {
0195         valuesString += result(key);
0196     }
0197 
0198     return valuesString;
0199 }
0200 
0201 void ParseResults::debug() const
0202 {
0203     Q_FOREACH (const ResultsKey& key, m_results.keys())
0204     {
0205         QString _token  = token(key);
0206         QString _result = result(key);
0207 
0208         qCDebug(DIGIKAM_GENERAL_LOG) << "(" << key.first << ":" << key.second << ") => "
0209                                      << "(" << _token    << ":" << _result    << ")";
0210     }
0211 }
0212 
0213 } // namespace Digikam