2019-07-06 09:54:16 +10:00
|
|
|
function arrayToModelItem(keys_name, array) {
|
|
|
|
// Convert an array to an object suitable to be in a model, example:
|
|
|
|
// [1, 2, 3] → [{keys_name: 1}, {keys_name: 2}, {keys_name: 3}]
|
|
|
|
var items = []
|
|
|
|
|
|
|
|
for (var i = 0; i < array.length; i++) {
|
|
|
|
var obj = {}
|
|
|
|
obj[keys_name] = array[i]
|
|
|
|
items.push(obj)
|
|
|
|
}
|
|
|
|
return items
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-04 12:31:29 +10:00
|
|
|
function hueFrom(string) {
|
|
|
|
// Calculate and return a unique hue between 0 and 1 for the string
|
|
|
|
var hue = 0
|
|
|
|
for (var i = 0; i < string.length; i++) {
|
|
|
|
hue += string.charCodeAt(i) * 99
|
|
|
|
}
|
|
|
|
return hue % 360 / 360
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-05 06:56:34 +10:00
|
|
|
function avatarColor(name) {
|
2019-07-04 12:31:29 +10:00
|
|
|
return Qt.hsla(
|
|
|
|
hueFrom(name),
|
2019-07-07 07:50:55 +10:00
|
|
|
theme.avatar.background.saturation,
|
|
|
|
theme.avatar.background.lightness,
|
|
|
|
theme.avatar.background.alpha
|
2019-07-04 12:31:29 +10:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-05 06:56:34 +10:00
|
|
|
function nameColor(name) {
|
2019-07-04 12:31:29 +10:00
|
|
|
return Qt.hsla(
|
|
|
|
hueFrom(name),
|
2019-07-07 07:50:55 +10:00
|
|
|
theme.displayName.saturation,
|
|
|
|
theme.displayName.lightness,
|
2019-07-04 12:31:29 +10:00
|
|
|
1
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-04 14:24:21 +10:00
|
|
|
function coloredNameHtml(name, alt_id) {
|
2019-07-07 14:24:23 +10:00
|
|
|
// substring: remove leading @
|
|
|
|
return "<font color='" + nameColor(name || alt_id.substring(1)) + "'>" +
|
2019-07-05 06:56:34 +10:00
|
|
|
escapeHtml(name || alt_id) +
|
|
|
|
"</font>"
|
2019-07-04 14:24:21 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-04 12:31:29 +10:00
|
|
|
function escapeHtml(string) {
|
|
|
|
// Replace special HTML characters by encoded alternatives
|
|
|
|
return string.replace("&", "&")
|
|
|
|
.replace("<", "<")
|
|
|
|
.replace(">", ">")
|
|
|
|
.replace('"', """)
|
|
|
|
.replace("'", "'")
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-04 14:24:21 +10:00
|
|
|
function eventIsMessage(ev) {
|
|
|
|
return /^RoomMessage($|[A-Z])/.test(ev.eventType)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-04 12:31:29 +10:00
|
|
|
function translatedEventContent(ev) {
|
2019-07-05 06:01:44 +10:00
|
|
|
// ev: timelines item
|
2019-07-04 12:31:29 +10:00
|
|
|
if (ev.translatable == false) { return ev.content }
|
|
|
|
|
|
|
|
// %S → sender display name
|
2019-07-05 06:01:44 +10:00
|
|
|
var name = users.getUser(ev.senderId).displayName
|
2019-07-04 14:24:21 +10:00
|
|
|
var text = ev.content.replace("%S", coloredNameHtml(name, ev.senderId))
|
2019-07-04 12:31:29 +10:00
|
|
|
|
|
|
|
// %T → target (event state_key) display name
|
|
|
|
if (ev.targetUserId) {
|
2019-07-05 06:01:44 +10:00
|
|
|
var tname = users.getUser(ev.targetUserId).displayName
|
2019-07-04 14:24:21 +10:00
|
|
|
text = text.replace("%T", coloredNameHtml(tname, ev.targetUserId))
|
2019-07-04 12:31:29 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
text = qsTr(text)
|
2019-07-04 14:24:21 +10:00
|
|
|
if (ev.translatable == true) { return text }
|
2019-07-04 12:31:29 +10:00
|
|
|
|
|
|
|
// Else, model.translatable should be an array of args
|
2019-07-04 14:24:21 +10:00
|
|
|
for (var i = 0; ev.translatable.length; i++) {
|
|
|
|
text = text.arg(ev.translatable[i])
|
2019-07-04 12:31:29 +10:00
|
|
|
}
|
|
|
|
return text
|
|
|
|
}
|
2019-07-07 19:49:02 +10:00
|
|
|
|
|
|
|
|
|
|
|
function filterMatches(filter, text) {
|
|
|
|
filter = filter.toLowerCase()
|
|
|
|
text = text.toLowerCase()
|
|
|
|
|
|
|
|
var words = filter.split(" ")
|
|
|
|
|
|
|
|
for (var i = 0; i < words.length; i++) {
|
|
|
|
if (words[i] && text.indexOf(words[i]) == -1) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|