stable-diffusion-webui

Форк
0
148 строк · 5.4 Кб
1
function keyupEditAttention(event) {
2
    let target = event.originalTarget || event.composedPath()[0];
3
    if (!target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea")) return;
4
    if (!(event.metaKey || event.ctrlKey)) return;
5

6
    let isPlus = event.key == "ArrowUp";
7
    let isMinus = event.key == "ArrowDown";
8
    if (!isPlus && !isMinus) return;
9

10
    let selectionStart = target.selectionStart;
11
    let selectionEnd = target.selectionEnd;
12
    let text = target.value;
13

14
    function selectCurrentParenthesisBlock(OPEN, CLOSE) {
15
        if (selectionStart !== selectionEnd) return false;
16

17
        // Find opening parenthesis around current cursor
18
        const before = text.substring(0, selectionStart);
19
        let beforeParen = before.lastIndexOf(OPEN);
20
        if (beforeParen == -1) return false;
21

22
        let beforeClosingParen = before.lastIndexOf(CLOSE);
23
        if (beforeClosingParen != -1 && beforeClosingParen > beforeParen) return false;
24

25
        // Find closing parenthesis around current cursor
26
        const after = text.substring(selectionStart);
27
        let afterParen = after.indexOf(CLOSE);
28
        if (afterParen == -1) return false;
29

30
        let afterOpeningParen = after.indexOf(OPEN);
31
        if (afterOpeningParen != -1 && afterOpeningParen < afterParen) return false;
32

33
        // Set the selection to the text between the parenthesis
34
        const parenContent = text.substring(beforeParen + 1, selectionStart + afterParen);
35
        if (/.*:-?[\d.]+/s.test(parenContent)) {
36
            const lastColon = parenContent.lastIndexOf(":");
37
            selectionStart = beforeParen + 1;
38
            selectionEnd = selectionStart + lastColon;
39
        } else {
40
            selectionStart = beforeParen + 1;
41
            selectionEnd = selectionStart + parenContent.length;
42
        }
43

44
        target.setSelectionRange(selectionStart, selectionEnd);
45
        return true;
46
    }
47

48
    function selectCurrentWord() {
49
        if (selectionStart !== selectionEnd) return false;
50
        const whitespace_delimiters = {"Tab": "\t", "Carriage Return": "\r", "Line Feed": "\n"};
51
        let delimiters = opts.keyedit_delimiters;
52

53
        for (let i of opts.keyedit_delimiters_whitespace) {
54
            delimiters += whitespace_delimiters[i];
55
        }
56

57
        // seek backward to find beginning
58
        while (!delimiters.includes(text[selectionStart - 1]) && selectionStart > 0) {
59
            selectionStart--;
60
        }
61

62
        // seek forward to find end
63
        while (!delimiters.includes(text[selectionEnd]) && selectionEnd < text.length) {
64
            selectionEnd++;
65
        }
66

67
        target.setSelectionRange(selectionStart, selectionEnd);
68
        return true;
69
    }
70

71
    // If the user hasn't selected anything, let's select their current parenthesis block or word
72
    if (!selectCurrentParenthesisBlock('<', '>') && !selectCurrentParenthesisBlock('(', ')') && !selectCurrentParenthesisBlock('[', ']')) {
73
        selectCurrentWord();
74
    }
75

76
    event.preventDefault();
77

78
    var closeCharacter = ')';
79
    var delta = opts.keyedit_precision_attention;
80
    var start = selectionStart > 0 ? text[selectionStart - 1] : "";
81
    var end = text[selectionEnd];
82

83
    if (start == '<') {
84
        closeCharacter = '>';
85
        delta = opts.keyedit_precision_extra;
86
    } else if (start == '(' && end == ')' || start == '[' && end == ']') { // convert old-style (((emphasis)))
87
        let numParen = 0;
88

89
        while (text[selectionStart - numParen - 1] == start && text[selectionEnd + numParen] == end) {
90
            numParen++;
91
        }
92

93
        if (start == "[") {
94
            weight = (1 / 1.1) ** numParen;
95
        } else {
96
            weight = 1.1 ** numParen;
97
        }
98

99
        weight = Math.round(weight / opts.keyedit_precision_attention) * opts.keyedit_precision_attention;
100

101
        text = text.slice(0, selectionStart - numParen) + "(" + text.slice(selectionStart, selectionEnd) + ":" + weight + ")" + text.slice(selectionEnd + numParen);
102
        selectionStart -= numParen - 1;
103
        selectionEnd -= numParen - 1;
104
    } else if (start != '(') {
105
        // do not include spaces at the end
106
        while (selectionEnd > selectionStart && text[selectionEnd - 1] == ' ') {
107
            selectionEnd--;
108
        }
109

110
        if (selectionStart == selectionEnd) {
111
            return;
112
        }
113

114
        text = text.slice(0, selectionStart) + "(" + text.slice(selectionStart, selectionEnd) + ":1.0)" + text.slice(selectionEnd);
115

116
        selectionStart++;
117
        selectionEnd++;
118
    }
119

120
    if (text[selectionEnd] != ':') return;
121
    var weightLength = text.slice(selectionEnd + 1).indexOf(closeCharacter) + 1;
122
    var weight = parseFloat(text.slice(selectionEnd + 1, selectionEnd + weightLength));
123
    if (isNaN(weight)) return;
124

125
    weight += isPlus ? delta : -delta;
126
    weight = parseFloat(weight.toPrecision(12));
127
    if (Number.isInteger(weight)) weight += ".0";
128

129
    if (closeCharacter == ')' && weight == 1) {
130
        var endParenPos = text.substring(selectionEnd).indexOf(')');
131
        text = text.slice(0, selectionStart - 1) + text.slice(selectionStart, selectionEnd) + text.slice(selectionEnd + endParenPos + 1);
132
        selectionStart--;
133
        selectionEnd--;
134
    } else {
135
        text = text.slice(0, selectionEnd + 1) + weight + text.slice(selectionEnd + weightLength);
136
    }
137

138
    target.focus();
139
    target.value = text;
140
    target.selectionStart = selectionStart;
141
    target.selectionEnd = selectionEnd;
142

143
    updateInput(target);
144
}
145

146
addEventListener('keydown', (event) => {
147
    keyupEditAttention(event);
148
});
149

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.