1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-10 20:09:57 +00:00

Add trimSelection parameter to text editor (#7944)

* add trimSelection - both, start, end, no

* add documentation for trimSelection to tm-edit-text-operation tiddler

* add trimSelection both to all buttions where it makes sense

* change "both" to "yes" as a default

* fix trimSelection typo

* fix trimSelection typo

* docs trimSelection add "no" as possible value - it's the default

* remove some redundant variable declarations

* update from-version

* fix comment typos

* fix whitespace

* make local variables more visible
This commit is contained in:
Mario Pietsch 2024-09-10 18:17:28 +02:00 committed by GitHub
parent c64bbd984f
commit d450fce77b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 138 additions and 39 deletions

View File

@ -13,37 +13,125 @@ Text editor operation to wrap the selection with the specified prefix and suffix
"use strict";
exports["wrap-selection"] = function(event,operation) {
if(operation.selStart === operation.selEnd) {
// No selection; check if we're within the prefix/suffix
if(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {
var o = operation,
prefix = event.paramObject.prefix,
suffix = event.paramObject.suffix,
trimSelection = event.paramObject.trimSelection || "no",
selLength = o.selEnd - o.selStart;
// This function detects, if trailing spaces are part of the selection __and__ if the user wants to handle them
// Returns "yes", "start", "end", "no" (default)
// yes .. there are trailing spaces at both ends
// start .. there are trailing spaces at the start
// end .. there are trailing spaces at the end
// no .. no trailing spaces are taken into account
var trailingSpaceAt = function(sel) {
var _start,
_end,
result;
// trimSelection is a user parameter, which this evaluations takes into account
switch(trimSelection) {
case "end":
result = (sel.trimEnd().length !== selLength) ? "end" : "no";
break;
case "yes":
_start = sel.trimStart().length !== selLength;
_end = sel.trimEnd().length !== selLength;
result = (_start && _end) ? "yes" : (_start) ? "start" : (_end) ? "end" : "no";
break;
case "start":
result = (sel.trimStart().length !== selLength) ? "start" : "no";
break;
default:
result = "no";
break;
}
return result;
}
function togglePrefixSuffix() {
if(o.text.substring(o.selStart - prefix.length, o.selStart + suffix.length) === prefix + suffix) {
// Remove the prefix and suffix
operation.cutStart = operation.selStart - event.paramObject.prefix.length;
operation.cutEnd = operation.selEnd + event.paramObject.suffix.length;
operation.replacement = "";
operation.newSelStart = operation.cutStart;
operation.newSelEnd = operation.newSelStart;
o.cutStart = o.selStart - prefix.length;
o.cutEnd = o.selEnd + suffix.length;
o.replacement = "";
o.newSelStart = o.cutStart;
o.newSelEnd = o.newSelStart;
} else {
// Wrap the cursor instead
operation.cutStart = operation.selStart;
operation.cutEnd = operation.selEnd;
operation.replacement = event.paramObject.prefix + event.paramObject.suffix;
operation.newSelStart = operation.selStart + event.paramObject.prefix.length;
operation.newSelEnd = operation.newSelStart;
o.cutStart = o.selStart;
o.cutEnd = o.selEnd;
o.replacement = prefix + suffix;
o.newSelStart = o.selStart + prefix.length;
o.newSelEnd = o.newSelStart;
}
} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {
}
// options: lenPrefix, lenSuffix
function removePrefixSuffix(options) {
options = options || {};
var _lenPrefix = options.lenPrefix || 0;
var _lenSuffix = options.lenSuffix || 0;
o.cutStart = o.selStart - _lenPrefix;
o.cutEnd = o.selEnd + _lenSuffix;
o.replacement = (_lenPrefix || _lenSuffix) ? o.selection : o.selection.substring(prefix.length, o.selection.length - suffix.length);
o.newSelStart = o.cutStart;
o.newSelEnd = o.cutStart + o.replacement.length;
}
function addPrefixSuffix() {
// remove trailing space if requested
switch(trailingSpaceAt(o.selection)) {
case "no":
// has no trailing spaces
o.cutStart = o.selStart;
o.cutEnd = o.selEnd;
o.replacement = prefix + o.selection + suffix;
o.newSelStart = o.selStart;
o.newSelEnd = o.selStart + o.replacement.length;
break;
case "yes":
// handle both ends
o.cutStart = o.selEnd - (o.selection.trimStart().length);
o.cutEnd = o.selection.trimEnd().length + o.selStart;
o.replacement = prefix + o.selection.trim() + suffix;
o.newSelStart = o.cutStart;
o.newSelEnd = o.cutStart + o.replacement.length;
break;
case "start":
// handle leading
o.cutStart = o.selEnd - (o.selection.trimStart().length);
o.cutEnd = o.selEnd;
o.replacement = prefix + o.selection.trimStart() + suffix;
o.newSelStart = o.cutStart;
o.newSelEnd = o.cutStart + o.replacement.length;
break;
case "end":
// handle trailing
o.cutStart = o.selStart;
o.cutEnd = o.selection.trimEnd().length + o.selStart;
o.replacement = prefix + o.selection.trimEnd() + suffix;
o.newSelStart = o.selStart;
o.newSelEnd = o.selStart + o.replacement.length;
break;
}
}
if(o.selStart === o.selEnd) {
// No selection; Create prefix and suffix. Set cursor in between them: ""|""
togglePrefixSuffix();
} else if(o.text.substring(o.selStart, o.selStart + prefix.length) === prefix &&
o.text.substring(o.selEnd - suffix.length,o.selEnd) === suffix) {
// Prefix and suffix are already present, so remove them
operation.cutStart = operation.selStart;
operation.cutEnd = operation.selEnd;
operation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);
operation.newSelStart = operation.selStart;
operation.newSelEnd = operation.selStart + operation.replacement.length;
removePrefixSuffix();
} else if(o.text.substring(o.selStart - prefix.length, o.selStart) === prefix &&
o.text.substring(o.selEnd, o.selEnd + suffix.length) === suffix) {
// Prefix and suffix are present BUT not selected -> remove them
removePrefixSuffix({"lenPrefix": prefix.length, "lenSuffix": suffix.length});
} else {
// Add the prefix and suffix
operation.cutStart = operation.selStart;
operation.cutEnd = operation.selEnd;
operation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;
operation.newSelStart = operation.selStart;
operation.newSelEnd = operation.selStart + operation.replacement.length;
addPrefixSuffix();
}
};

View File

@ -11,4 +11,5 @@ shortcuts: ((bold))
$param="wrap-selection"
prefix="''"
suffix="''"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((italic))
$param="wrap-selection"
prefix="//"
suffix="//"
trimSelection="yes"
/>

View File

@ -12,4 +12,5 @@ tags: $:/tags/EditorToolbar
$param="wrap-selection"
prefix="[["
suffix="]]"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((mono-line))
$param="wrap-selection"
prefix="`"
suffix="`"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((strikethrough))
$param="wrap-selection"
prefix="~~"
suffix="~~"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((subscript))
$param="wrap-selection"
prefix=",,"
suffix=",,"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((superscript))
$param="wrap-selection"
prefix="^^"
suffix="^^"
trimSelection="yes"
/>

View File

@ -12,4 +12,5 @@ tags: $:/tags/EditorToolbar
$param="wrap-selection"
prefix="{{"
suffix="}}"
trimSelection="yes"
/>

View File

@ -11,4 +11,5 @@ shortcuts: ((underline))
$param="wrap-selection"
prefix="__"
suffix="__"
trimSelection="yes"
/>

View File

@ -1,6 +1,6 @@
caption: tm-edit-text-operation
created: 20160424211339792
modified: 20230803045746596
modified: 20240909083525060
tags: Messages
title: WidgetMessage: tm-edit-text-operation
type: text/vnd.tiddlywiki
@ -11,9 +11,9 @@ type: text/vnd.tiddlywiki
Excises the currently selected text into a new tiddler and replaces it with a link, a macro or a transclude of the new tiddler. Parameters include:
|!Name |!Description |
|title |Title of the new tiddler the selected content is excised to|
|type |Type of the replacement to be inserted: Can be one of <<.value "transclude">>, <<.value "link">> or <<.value "macro">>|
|macro |In case //type=<<.value "macro">>//, specifies the name of the macro to be inserted. The title of the new tiddler is provided as the first parameter to the macro. Defaults to the [[translink macro|translink Macro]]|
|title |Title of the new tiddler the selected content is excised to |
|type |Type of the replacement to be inserted: Can be one of <<.value "transclude">>, <<.value "link">> or <<.value "macro">> |
|macro |In case //type=<<.value "macro">>//, specifies the name of the macro to be inserted. The title of the new tiddler is provided as the first parameter to the macro. Defaults to the [[translink macro|translink Macro]] |
|tagnew |If '<<.value "yes">>', will tag the new tiddler with the title of the tiddler currently being edited |
</div>
@ -25,7 +25,7 @@ Excises the currently selected text into a new tiddler and replaces it with a li
Replaces ''all'' contents of the editor with the provided text.
|!Name |!Description |
|text |Text to be inserted|
|text |Text to be inserted |
</div>
\end
@ -36,7 +36,7 @@ Replaces ''all'' contents of the editor with the provided text.
Replaces the current selection with the provided text.
|!Name |!Description |
|text |Text to be inserted|
|text |Text to be inserted |
</div>
\end
@ -47,8 +47,8 @@ Replaces the current selection with the provided text.
Prefixes the currently selected line//(s)// with the provided character. If a line is already prefixed by the provided prefix, the prefix is removed instead.
|!Name |!Description |
|character |Prefix character|
|count |Number of characters that make up the prefix|
|character |Prefix character |
|count |Number of characters that make up the prefix |
''Example'' Setting //character="<<.value "!">>"// and //count="<<.value "3">>"// would insert the prefix "<<.value "!!!" >>", which will resolve to a subheading when parsed as WikiText.
@ -61,8 +61,8 @@ Prefixes the currently selected line//(s)// with the provided character. If a li
Surrounds the selected //lines// with the provided <<.param "prefix">> and <<.param "suffix">>.
|!Name |!Description |
|prefix |String to be prefixed to the selected lines|
|suffix |Suffix to be inserted after the selected lines|
|prefix |String to be prefixed to the selected lines |
|suffix |Suffix to be inserted after the selected lines |
</div>
@ -75,8 +75,9 @@ Surrounds the selected //lines// with the provided <<.param "prefix">> and <<.pa
Surrounds the current //selection// with the provided <<.param "prefix">> and <<.param "suffix">>.
|!Name |!Description |
|prefix |String to be prefixed to the selection|
|suffix |Suffix to be inserted after the selection|
|prefix |String to be prefixed to the selection |
|suffix |Suffix to be inserted after the selection |
|trimSelection |<<.from-version 5.3.6>> Trim leading and trailing white-space from the selection and move it to the surrounding text. Possible values are: `yes`, `no` (default), `start` and `end` |
</div>
\end
@ -138,11 +139,11 @@ At this point the following text operations have been implemented:
|<<.def "wrap-selection">>|<<wrapSelectionDescription>> |
|<<.def "save-selection">>|<<saveSelectionDescription>> |
|<<.def "make-link">>|<<makeLinkDescription>> |
|<<.def "insert-text">>|<<insertTextDescription>>|
|<<.def "insert-text">>|<<insertTextDescription>> |
|<<.def "focus-editor">>|<<.from-version 5.2.0>> <<focusEditorDescription>> |
!Example
! Example
An example can be seen in [[$:/core/ui/EditorToolbar/bold]]:
@ -152,6 +153,7 @@ An example can be seen in [[$:/core/ui/EditorToolbar/bold]]:
$param="wrap-selection"
prefix="''"
suffix="''"
trimSelection="yes"
/>
```