Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
recorddirectory.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5#include <translatormessage.h>
6
7#include <QMap>
8
10
11const char *meta_id_key = "meta-id";
12
13void RecordDirectory::recordMessage(const TranslatorMessage &msg)
14{
15 MessageItem mi{ msg.sourceText(), msg.context(), msg.comment(),
16 QString(), msg.lineNumber(), msg.startOffset(),
17 msg.endOffset(), msg.isPlural(), !msg.extra(meta_id_key).isEmpty() };
18 if (const auto it = m_messages.find(mi); it != m_messages.end())
19 mi.id = it->id;
20 else if (QString id = msg.id(); id.isEmpty()) {
21 mi.id = calculateId(msg);
22 m_messages.emplace(mi);
23 } else // this is only the case in verification
24 mi.id = std::move(id);
25 for (const TranslatorMessage::Reference &ref : msg.allReferences()) {
26 auto ref_mi = std::make_shared<MessageItem>(mi);
27 ref_mi->lineNo = ref.lineNumber();
28 ref_mi->startOffset = ref.startOffset();
29 ref_mi->endOffset = ref.endOffset();
30 m_msgLocations[ref.fileName()].insert(std::move(ref_mi));
31 }
32}
33
34void RecordDirectory::recordExistingId(const QString &id)
35{
36 m_existingIds.emplace(id);
37}
38
39void RecordDirectory::recordError(const QString &file, int line, const QString &error)
40{
41 if (auto &fileErrors = m_errors[file]; !fileErrors.contains(line))
42 fileErrors[line] = "//ltext2id error: "_L1 + error;
43}
44
45void RecordDirectory::recordAddedLines(const QString &file, int fromLine, int addedLines)
46{
47 m_fileAddedLines[file].emplace(fromLine, addedLines);
48}
49
50int RecordDirectory::addedLines(const QString &file, int line) const
51{
52 int addedLines = 0;
53 if (const auto fit = m_fileAddedLines.find(file); fit != m_fileAddedLines.cend()) {
54 const auto &fileAddedLines = fit->second;
55 auto itr = fileAddedLines.upper_bound(line);
56 if (itr != fileAddedLines.cbegin()) {
57 itr--;
58 addedLines = itr->second;
59 }
60 }
61 return addedLines;
62}
63
64bool RecordDirectory::containsFile(const QString &filename) const noexcept
65{
66 return m_msgLocations.contains(filename);
67}
68
69QString RecordDirectory::calculateId(const TranslatorMessage &msg) const
70{
71 QString id = msg.extra(meta_id_key);
72 if (!id.isEmpty())
73 return id;
74
75 const QString &source = msg.sourceText();
76 int words = 0;
77 int index = 0;
78
79 while (index < source.size()) {
80 QChar c = source[index];
81 bool word = false;
82 while (!c.isLetterOrNumber()) {
83 id += QChar('a' + c.unicode() % 32);
84 word = true;
85 if (++index == source.size())
86 break;
87 c = source[index];
88 }
89 if (word)
90 words++;
91
92 if (words == 2)
93 break;
94 id += c;
95 index++;
96 }
97
98 if (!id.isEmpty() && id.front() == '-')
99 id = msg.context() + id;
100 else
101 id = msg.context() + '-' + id;
102
103 if (index < source.size() || !msg.comment().isEmpty())
104 id += '-' + QString::number(qHash(source + msg.comment()) % 100000);
105
106 if (m_existingIds.count(id))
107 id += "_2"_L1;
108 return id;
109}
110
111QString RecordDirectory::id(const TranslatorMessage &msg) const
112{
113 MessageItem mi{ msg.sourceText(), msg.context(), msg.comment(), QString() };
114 if (const auto it = m_messages.find(mi); it != m_messages.end())
115 return it->id;
116 return {};
117}
118
119QT_END_NAMESPACE
Combined button and popup list for selecting options.
const char * meta_id_key