Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 : #include "searchcommandsparser.h"
23 :
24 : using namespace mu::notation;
25 :
26 : static constexpr QStringView REHEARSAL_MARK_CODE(u"r");
27 : static constexpr QStringView PAGE_CODE(u"p");
28 :
29 0 : SearchCommandsParser::SearchData SearchCommandsParser::parse(const QString& searchCommand)
30 : {
31 0 : SearchData data;
32 0 : if (searchCommand.isEmpty()) {
33 0 : return data;
34 : }
35 :
36 0 : data = parseMeasureCommand(searchCommand);
37 0 : if (data.isValid()) {
38 0 : return data;
39 : }
40 :
41 0 : data = parsePageCommand(searchCommand);
42 0 : if (data.isValid()) {
43 0 : return data;
44 : }
45 :
46 0 : data = parseRehearsalMarkCommand(searchCommand);
47 0 : return data;
48 0 : }
49 :
50 0 : SearchCommandsParser::SearchData SearchCommandsParser::parseMeasureCommand(const QString& searchCommand)
51 : {
52 0 : QStringList parts = searchCommand.split(u'-', Qt::SkipEmptyParts);
53 :
54 0 : if (parts.size() == 2) {
55 0 : bool ok1, ok2 = false;
56 0 : size_t startMeasure = parts[0].toUInt(&ok1);
57 0 : size_t endMeasure = parts[1].toUInt(&ok2);
58 :
59 0 : if (ok1 && ok2 && (startMeasure <= endMeasure)) {
60 0 : return SearchData::makeMeasureRange(startMeasure, endMeasure);
61 : }
62 0 : return SearchData{};
63 : } else {
64 0 : bool ok = false;
65 0 : size_t measureIndex = searchCommand.toUInt(&ok);
66 :
67 0 : if (ok) {
68 0 : return SearchData::makeMeasure(measureIndex);
69 : }
70 : }
71 :
72 0 : return SearchData{};
73 0 : }
74 :
75 0 : SearchCommandsParser::SearchData SearchCommandsParser::parsePageCommand(const QString& searchCommand)
76 : {
77 0 : QString qsearchCommand = searchCommand.toLower();
78 :
79 0 : if (!qsearchCommand.startsWith(PAGE_CODE) || qsearchCommand.size() <= PAGE_CODE.size()) {
80 0 : return SearchData{};
81 : }
82 :
83 0 : if (!qsearchCommand[PAGE_CODE.size()].isNumber()) {
84 0 : return SearchData{};
85 : }
86 :
87 0 : bool ok = false;
88 0 : size_t pageIndex = qsearchCommand.mid(PAGE_CODE.size()).toUInt(&ok);
89 :
90 0 : if (ok) {
91 0 : return SearchData::makePage(pageIndex);
92 : }
93 :
94 0 : return SearchData{};
95 0 : }
96 :
97 0 : SearchCommandsParser::SearchData SearchCommandsParser::parseRehearsalMarkCommand(const QString& searchCommand)
98 : {
99 0 : QString qsearchCommand = searchCommand.toLower();
100 :
101 0 : if (qsearchCommand.startsWith(REHEARSAL_MARK_CODE) && qsearchCommand.size() > REHEARSAL_MARK_CODE.size()) {
102 0 : return SearchData::makeRehearsalMark(qsearchCommand.mid(REHEARSAL_MARK_CODE.size()));
103 : }
104 :
105 0 : return SearchData::makeRehearsalMark(qsearchCommand);
106 0 : }
|