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