Transpose two noncontiguous selections

Get help using and writing Nisus Writer Pro macros.
Post Reply
User avatar
Matze
Posts: 170
Joined: 2004-12-14 07:54:49
Location: Düsseldorf Germany
Contact:

Transpose two noncontiguous selections

Post by Matze »

Hi again,

in the old days one could select two noncontiguous textbits and with an easy F/R expression say Find/Replace '\1\2' '\2\1' This doesn't work in NWP. What do I have to do inetead?

Best Matze
User avatar
martin
Official Nisus Person
Posts: 5228
Joined: 2002-07-11 17:14:10
Location: San Diego, CA
Contact:

Re: Transpose two noncontiguous selections

Post by martin »

You're right, that in Classic Nisus Writer one could use "\1" to represent the first selection, and so on. Now that NWP uses standard regular expressions, "\1" (a back reference) represents the first capture.

So for example, you could match all adjacent doubled whitespace characters using "(\s)\1" (eg: that matches two spaces next to each other, or two returns next to each other. But does not match a space followed by a return.)

Transposing two multipart selections in NWP is much more involved, but it can still be done using the TextSelection object. Here's one solution:

Code: Select all

# must have document to work on
$doc = Document.active
If ! $doc
	Exit
End

# must have exactly two selections
$selections = $doc.textSelections
If 2 != $selections.count
	Prompt 'Must have exactly two selections to swap.'
	Exit
End
$selection1 = $selections.firstValue
$selection2 = $selections.lastValue

# gather text contents before doing any replacements
$text1 = $selection1.subtext
$text2 = $selection2.subtext

# replace in reverse order so locations don't shift
$selection2.text.replaceInRange($selection2.range, $text1)
$selection1.text.replaceInRange($selection1.range, $text2)

# construct new selections for just replaced content
$newRange1 = Range.new($selection1.location, $text2.length)
$newRange2 = Range.new($selection2.location, $text1.length)
If $selection1.text == $selection2.text
	$delta = $selection1.length - $newRange1.length
	$newRange2.location -= $delta
End

$newSelection1 = TextSelection.new($selection1.text, $newRange1)
$newSelection2 = TextSelection.new($selection2.text, $newRange2)
$newSelections = Array.new($newSelection1, $newSelection2)
$doc.setSelection($newSelections)
User avatar
Matze
Posts: 170
Joined: 2004-12-14 07:54:49
Location: Düsseldorf Germany
Contact:

Re: Transpose two noncontiguous selections

Post by Matze »

Perfect, Martin, thank you so much! This macro has been a 'daily macro', couldn't live without it, now it's back again.
Best, Matze
Post Reply