-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSettingsIO.js
More file actions
126 lines (107 loc) · 3.04 KB
/
SettingsIO.js
File metadata and controls
126 lines (107 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
QML component for reading and writing configuration files.
Copyright (C) 2025 Alessandro Culatti
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
const VERSION = "1.0.0";
/**
* Read the input TSV file, and return its content as a dictionary, where the
* keys are the content of keyColumn, and the values the content of valueColumn.
*/
function readTsvFile(fileIO, keyColumn = 0, valueColumn = 1)
{
let settings = {};
let fileContent = fileIO.read().split("\n");
for (let i = 0; i < fileContent.length; i++)
{
if (fileContent[i])
{
let rowData = parseTsvRow(fileContent[i]);
settings[rowData[keyColumn]] = rowData[valueColumn];
}
}
return settings;
}
/**
* Write the content of the input dictionary to the specified TSV file. The
* keys will be written in column 0, and the values in column 1.
*/
function writeTsvFile(settings, fileIO)
{
let fileContent = "";
for (let key in settings)
{
let value = settings[key];
fileContent += formatForTsv(key.toString()) + "\t" + formatForTsv(value.toString()) + "\n";
}
fileIO.write(fileContent);
}
/**
* Split the input string using the tab character, and replace the escaped
* characters.
*/
function parseTsvRow(s)
{
s = s.split("\t");
// QML does not support lookbehind in regex, which would be necessary to
// properly unescape the characters, so we have to manually loop on the
// strings and check for escape characters.
for (let i = 0; i < s.length; i++)
{
let unescapedString = "";
let escapedString = s[i];
let j = 0;
while (j < escapedString.length)
{
let c = escapedString.charAt(j);
if (c == "\\")
{
let nextCharacter = escapedString.charAt(++j);
switch (nextCharacter)
{
case "\\":
unescapedString += "\\";
break;
case "n":
unescapedString += "\n";
break;
case "r":
unescapedString += "\r";
break;
case "t":
unescapedString += "\t";
break;
default:
throw "Invalid escape sequence: " + c + nextCharacter;
}
}
else
{
unescapedString += c;
}
j++;
}
s[i] = unescapedString;
}
return s;
}
/**
* Escape the necessary characters for a TSV file in the input string.
*/
function formatForTsv(s)
{
s = s.replace(/\t/g, "\\t");
s = s.replace(/\\/g, "\\\\");
s = s.replace(/\n/g, "\\n");
s = s.replace(/\r/g, "\\r");
return s;
}