refactor: move input formatting code to its own file
This commit is contained in:
parent
6bcdb9ca54
commit
45b0e5e756
|
@ -9,7 +9,7 @@ import ../../status/ens as status_ens
|
||||||
import ../../status/chat/[chat, message]
|
import ../../status/chat/[chat, message]
|
||||||
import ../../status/profile/profile
|
import ../../status/profile/profile
|
||||||
import web3/[conversions, ethtypes]
|
import web3/[conversions, ethtypes]
|
||||||
import views/[channels_list, message_list, chat_item, suggestions_list, reactions, stickers, groups, transactions, communities, community_list, community_item, activity_notification_list]
|
import views/[channels_list, message_list, chat_item, suggestions_list, reactions, stickers, groups, transactions, communities, community_list, community_item, format_input, activity_notification_list]
|
||||||
import ../utils/image_utils
|
import ../utils/image_utils
|
||||||
import ../../status/tasks/[qt, task_runner_impl]
|
import ../../status/tasks/[qt, task_runner_impl]
|
||||||
import ../../status/tasks/marathon/mailserver/worker
|
import ../../status/tasks/marathon/mailserver/worker
|
||||||
|
@ -129,6 +129,7 @@ QtObject:
|
||||||
type
|
type
|
||||||
ChatsView* = ref object of QAbstractListModel
|
ChatsView* = ref object of QAbstractListModel
|
||||||
status: Status
|
status: Status
|
||||||
|
formatInputView: FormatInputView
|
||||||
chats*: ChannelsList
|
chats*: ChannelsList
|
||||||
currentSuggestions*: SuggestionsList
|
currentSuggestions*: SuggestionsList
|
||||||
activityNotificationList*: ActivityNotificationList
|
activityNotificationList*: ActivityNotificationList
|
||||||
|
@ -155,6 +156,7 @@ QtObject:
|
||||||
|
|
||||||
proc delete(self: ChatsView) =
|
proc delete(self: ChatsView) =
|
||||||
self.chats.delete
|
self.chats.delete
|
||||||
|
self.formatInputView.delete
|
||||||
self.activeChannel.delete
|
self.activeChannel.delete
|
||||||
self.contextChannel.delete
|
self.contextChannel.delete
|
||||||
self.currentSuggestions.delete
|
self.currentSuggestions.delete
|
||||||
|
@ -176,6 +178,8 @@ QtObject:
|
||||||
proc newChatsView*(status: Status): ChatsView =
|
proc newChatsView*(status: Status): ChatsView =
|
||||||
new(result, delete)
|
new(result, delete)
|
||||||
result.status = status
|
result.status = status
|
||||||
|
result.formatInputView = newFormatInputView()
|
||||||
|
|
||||||
result.connected = false
|
result.connected = false
|
||||||
result.chats = newChannelsList(status)
|
result.chats = newChannelsList(status)
|
||||||
result.activeChannel = newChatItemView(status)
|
result.activeChannel = newChatItemView(status)
|
||||||
|
@ -196,6 +200,10 @@ QtObject:
|
||||||
|
|
||||||
result.setup()
|
result.setup()
|
||||||
|
|
||||||
|
proc getFormatInput(self: ChatsView): QVariant {.slot.} = newQVariant(self.formatInputView)
|
||||||
|
QtProperty[QVariant] formatInputView:
|
||||||
|
read = getFormatInput
|
||||||
|
|
||||||
proc getMessageListIndexById(self: ChatsView, id: string): int
|
proc getMessageListIndexById(self: ChatsView, id: string): int
|
||||||
|
|
||||||
proc getChannel*(self: ChatsView, index: int): Chat =
|
proc getChannel*(self: ChatsView, index: int): Chat =
|
||||||
|
@ -993,53 +1001,6 @@ QtObject:
|
||||||
proc requestAllHistoricMessagesResult(self: ChatsView, resultEncoded: string) {.slot.} =
|
proc requestAllHistoricMessagesResult(self: ChatsView, resultEncoded: string) {.slot.} =
|
||||||
self.setLoadingMessages(true)
|
self.setLoadingMessages(true)
|
||||||
|
|
||||||
proc formatInputStuff(self: ChatsView, regex: Regex, inputText: string): string =
|
|
||||||
var matches: seq[tuple[first, last: int]] = @[(-1, 0)]
|
|
||||||
|
|
||||||
var resultTuple: tuple[first, last: int]
|
|
||||||
var start = 0
|
|
||||||
var results: seq[tuple[first, last: int]] = @[]
|
|
||||||
|
|
||||||
while true:
|
|
||||||
resultTuple = inputText.findBounds(regex, matches, start)
|
|
||||||
if (resultTuple[0] == -1):
|
|
||||||
break
|
|
||||||
start = resultTuple[1] + 1
|
|
||||||
results.add(matches[0])
|
|
||||||
|
|
||||||
if (results.len == 0):
|
|
||||||
return ""
|
|
||||||
|
|
||||||
var jsonString = "["
|
|
||||||
var first = true
|
|
||||||
|
|
||||||
for result in results:
|
|
||||||
if (not first):
|
|
||||||
jsonString = jsonString & ","
|
|
||||||
first = false
|
|
||||||
jsonString = jsonString & "[" & $result[0] & "," & $result[1] & "]"
|
|
||||||
|
|
||||||
jsonString = jsonString & "]"
|
|
||||||
|
|
||||||
return jsonString
|
|
||||||
|
|
||||||
|
|
||||||
proc formatInputItalic(self: ChatsView, inputText: string): string {.slot.} =
|
|
||||||
let italicRegex = re"""(?<!\>)(?<!\*)\*(?!<span style=" font-style:italic;">)([^*]+)(?!<\/span>)\*"""
|
|
||||||
self.formatInputStuff(italicRegex, inputText)
|
|
||||||
|
|
||||||
proc formatInputBold(self: ChatsView, inputText: string): string {.slot.} =
|
|
||||||
let boldRegex = re"""(?<!\>)\*\*(?!<span style=" font-weight:600;">)([^*]+)(?!<\/span>)\*\*"""
|
|
||||||
self.formatInputStuff(boldRegex, inputText)
|
|
||||||
|
|
||||||
proc formatInputStrikeThrough(self: ChatsView, inputText: string): string {.slot.} =
|
|
||||||
let strikeThroughRegex = re"""(?<!\>)~~(?!<span style=" text-decoration: line-through;">)([^*]+)(?!<\/span>)~~"""
|
|
||||||
self.formatInputStuff(strikeThroughRegex, inputText)
|
|
||||||
|
|
||||||
proc formatInputCode(self: ChatsView, inputText: string): string {.slot.} =
|
|
||||||
let strikeThroughRegex = re"""(?<!\>)`(?!<span style=" font-family:'monospace';">)([^*]+)(?!<\/span>)`"""
|
|
||||||
self.formatInputStuff(strikeThroughRegex, inputText)
|
|
||||||
|
|
||||||
proc createCommunityChannel*(self: ChatsView, communityId: string, name: string, description: string, categoryId: string): string {.slot.} =
|
proc createCommunityChannel*(self: ChatsView, communityId: string, name: string, description: string, categoryId: string): string {.slot.} =
|
||||||
try:
|
try:
|
||||||
let chat = self.status.chat.createCommunityChannel(communityId, name, description)
|
let chat = self.status.chat.createCommunityChannel(communityId, name, description)
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
import NimQml, Tables, json, sequtils, chronicles, times, re, sugar, strutils, os, strformat, algorithm
|
||||||
|
|
||||||
|
logScope:
|
||||||
|
topics = "formatinput-view"
|
||||||
|
|
||||||
|
QtObject:
|
||||||
|
type FormatInputView* = ref object of QObject
|
||||||
|
|
||||||
|
proc setup(self: FormatInputView) = self.QObject.setup
|
||||||
|
proc delete*(self: FormatInputView) = self.QObject.delete
|
||||||
|
|
||||||
|
proc newFormatInputView*(): FormatInputView =
|
||||||
|
new(result, delete)
|
||||||
|
result.setup
|
||||||
|
|
||||||
|
proc formatInputStuff(self: FormatInputView, regex: Regex, inputText: string): string =
|
||||||
|
var matches: seq[tuple[first, last: int]] = @[(-1, 0)]
|
||||||
|
|
||||||
|
var resultTuple: tuple[first, last: int]
|
||||||
|
var start = 0
|
||||||
|
var results: seq[tuple[first, last: int]] = @[]
|
||||||
|
|
||||||
|
while true:
|
||||||
|
resultTuple = inputText.findBounds(regex, matches, start)
|
||||||
|
if (resultTuple[0] == -1):
|
||||||
|
break
|
||||||
|
start = resultTuple[1] + 1
|
||||||
|
results.add(matches[0])
|
||||||
|
|
||||||
|
if (results.len == 0):
|
||||||
|
return ""
|
||||||
|
|
||||||
|
var jsonString = "["
|
||||||
|
var first = true
|
||||||
|
|
||||||
|
for result in results:
|
||||||
|
if (not first):
|
||||||
|
jsonString = jsonString & ","
|
||||||
|
first = false
|
||||||
|
jsonString = jsonString & "[" & $result[0] & "," & $result[1] & "]"
|
||||||
|
|
||||||
|
jsonString = jsonString & "]"
|
||||||
|
|
||||||
|
return jsonString
|
||||||
|
|
||||||
|
proc formatInputItalic(self: FormatInputView, inputText: string): string {.slot.} =
|
||||||
|
let italicRegex = re"""(?<!\>)(?<!\*)\*(?!<span style=" font-style:italic;">)([^*]+)(?!<\/span>)\*"""
|
||||||
|
self.formatInputStuff(italicRegex, inputText)
|
||||||
|
|
||||||
|
proc formatInputBold(self: FormatInputView, inputText: string): string {.slot.} =
|
||||||
|
let boldRegex = re"""(?<!\>)\*\*(?!<span style=" font-weight:600;">)([^*]+)(?!<\/span>)\*\*"""
|
||||||
|
self.formatInputStuff(boldRegex, inputText)
|
||||||
|
|
||||||
|
proc formatInputStrikeThrough(self: FormatInputView, inputText: string): string {.slot.} =
|
||||||
|
let strikeThroughRegex = re"""(?<!\>)~~(?!<span style=" text-decoration: line-through;">)([^*]+)(?!<\/span>)~~"""
|
||||||
|
self.formatInputStuff(strikeThroughRegex, inputText)
|
||||||
|
|
||||||
|
proc formatInputCode(self: FormatInputView, inputText: string): string {.slot.} =
|
||||||
|
let strikeThroughRegex = re"""(?<!\>)`(?!<span style=" font-family:'monospace';">)([^*]+)(?!<\/span>)`"""
|
||||||
|
self.formatInputStuff(strikeThroughRegex, inputText)
|
|
@ -297,13 +297,13 @@ Rectangle {
|
||||||
// TODO fix Those spans are added automatically by QT when you press space after an emoji. They break the code formation process
|
// TODO fix Those spans are added automatically by QT when you press space after an emoji. They break the code formation process
|
||||||
|
|
||||||
// strikethrough
|
// strikethrough
|
||||||
setFormatInInput(chatsModel.formatInputStrikeThrough, '<span style=" text-decoration: line-through;">', '</span>', '~', 2)
|
setFormatInInput(chatsModel.formatInputView.formatInputStrikeThrough, '<span style=" text-decoration: line-through;">', '</span>', '~', 2)
|
||||||
// bold
|
// bold
|
||||||
setFormatInInput(chatsModel.formatInputBold, '<b>', '</b>', '*', 2)
|
setFormatInInput(chatsModel.formatInputView.formatInputBold, '<b>', '</b>', '*', 2)
|
||||||
// code
|
// code
|
||||||
setFormatInInput(chatsModel.formatInputCode, '<code>', '</code>', '`', 1)
|
setFormatInInput(chatsModel.formatInputView.formatInputCode, '<code>', '</code>', '`', 1)
|
||||||
// italic
|
// italic
|
||||||
setFormatInInput(chatsModel.formatInputItalic, '<i>', '</i>', '*', 1)
|
setFormatInInput(chatsModel.formatInputView.formatInputItalic, '<i>', '</i>', '*', 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
function onRelease(event) {
|
function onRelease(event) {
|
||||||
|
|
Loading…
Reference in New Issue