Warning, /system/mycroft-gui/application/HintsPage.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * Copyright 2018 Marco Martin <mart@kde.org>
0003  * Copyright 2018 by Aditya Mehra <aix.m@outlook.com>
0004  *
0005  * Licensed under the Apache License, Version 2.0 (the "License");
0006  * you may not use this file except in compliance with the License.
0007  * You may obtain a copy of the License at
0008  *
0009  *    http://www.apache.org/licenses/LICENSE-2.0
0010  *
0011  * Unless required by applicable law or agreed to in writing, software
0012  * distributed under the License is distributed on an "AS IS" BASIS,
0013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014  * See the License for the specific language governing permissions and
0015  * limitations under the License.
0016  *
0017  */
0018 
0019 import QtQuick 2.15
0020 import QtQuick.Layouts 1.15
0021 import QtQuick.Controls 2.15 as QQC2
0022 import org.kde.kirigami 2.19 as Kirigami
0023 import Mycroft 1.0 as Mycroft
0024 import Qt5Compat.GraphicalEffects
0025 
0026 Kirigami.Page {
0027     title: "Hints"
0028     objectName: "hints"
0029     property var modelCreatedObject
0030     property var filteredModel
0031 
0032     Component.onCompleted: {
0033         createHintModel()
0034     }
0035 
0036     function createHintModel(){
0037         var hintList = []
0038         var defaultFold = '/opt/mycroft/skills'
0039         var fileToFind = "README.md"
0040         var getList = Mycroft.FileReader.checkForMeta(defaultFold, fileToFind)
0041         for(var i=0; i < getList.length; i++){
0042             var fileName = getList[i] + "/" + fileToFind;
0043             var fileParse = Mycroft.FileReader.read(fileName);
0044             console.log("Loading hints from", fileName);
0045             var matchedRegex = getDataFromRegex(fileName, fileParse, /<img[^>]*src='([^']*)'.*\/>\s(.*)/g)
0046             var matchedExamples = getDataFromRegex(fileName, fileParse, /## Examples.*\n.*"(.*)"\n\*\s"(.*)"/g)
0047             var matchedCategory = getDataFromRegex(fileName, fileParse, /## Category.*\n\*\*(.*)\*\*/g)
0048             if(matchedRegex !== null && matchedRegex.length > 0 && matchedExamples !== null && matchedExamples.length > 0 && matchedCategory !== null && matchedCategory.length > 0) {
0049                 console.log("All good. \n");
0050                 var metaFileObject = {
0051                     imgSrc: matchedRegex[1],
0052                     title: matchedRegex[2],
0053                     category: matchedCategory[1],
0054                     examples: matchedExamples
0055                 }
0056                 hintList.push(metaFileObject);
0057             }
0058         }
0059         modelCreatedObject = hintList
0060         filteredModel = modelCreatedObject
0061     }
0062 
0063     function getDataFromRegex(fileName, fileText, matchRegex){
0064         var re = new RegExp(matchRegex);
0065         var match = re.exec(fileText);
0066         if (match === null || match.length == 0) {
0067             console.log("README.md file is not properly defined, it's missing data for the following regex:");
0068             console.log(re);
0069             console.log("Please fix the README.md file of the skill");
0070             console.log("This warning is for skill developers");
0071             console.log("if you are not a developer, fill a bug on the corresponding skill.\n");
0072         }
0073         return match;
0074     }
0075 
0076     function filterModel(text) {
0077         var result = []
0078         for (var i = 0; i < modelCreatedObject.length; i++) {
0079             var obj = modelCreatedObject[i];
0080             if (obj.title.toLowerCase().includes(text)
0081             || obj.category.toLowerCase().includes(text)
0082             || obj.examples[0].toLowerCase().includes(text)
0083             || obj.examples[1].toLowerCase().includes(text)) {
0084                 result.push(obj)
0085             }
0086         }
0087         return result;
0088     }
0089 
0090     ColumnLayout {
0091         anchors.fill: parent
0092 
0093         QQC2.TextField {
0094             id: filterHints
0095             placeholderText: qsTr("Search:")
0096             Layout.fillWidth: true
0097             onTextChanged: {
0098                 filteredModel = filterModel(text.toLowerCase())
0099             }
0100         }
0101 
0102         Kirigami.ScrollablePage {
0103             Layout.fillWidth: true
0104             Layout.fillHeight: true
0105             Kirigami.CardsListView {
0106                 id: skillslistmodelview
0107                 clip: true;
0108                 model: filteredModel
0109                 anchors.fill: parent
0110 
0111                 delegate: HintsDelegate {
0112                     imageSource: modelData.imgSrc
0113                     title: modelData.title
0114                     examples: modelData.examples
0115                     category: modelData.category
0116                 }
0117             }
0118         }
0119     }
0120 }