App icon 1Writer

Cut Current Paragraph

Shared by @jpburt

The current paragraph (closest to the cursor) is cut to the clipboard.

Script

var drafts = {
	getText: function () {
		return editor.getText(); //1W
	},
	setText: function (strText) {
		editor.setText(strText); //1W
		return true;
	},
	getSelectedText: function () {
		return editor.getSelectedText(); //1W
	},
	setSelectedText: function (strText) {
		editor.replaceSelection(strText); //1W
		return true;
	},
	getTextInRange: function (iStart, iLength) {
		return editor.getText().substring(iStart, iStart + iLength);
	},
	setTextInRange: function (iStart, iLength, strText) {
		editor.replaceTextInRange(iStart, iStart + iLength, strText); // 1W
		return true;
	},
	getSelectedLineRange: function () {
		var lstStartEnd = editor.getSelectedLineRange(), // 1W
			iStart = lstStartEnd[0];
		return [iStart, lstStartEnd[1]-iStart];
	},
	getSelectedRange: function () {
		var lstStartEnd = editor.getSelectedRange(), // 1W
			iStart = lstStartEnd[0];
		return [iStart, lstStartEnd[1]-iStart];
	},
	setSelectedRange: function (iStart, iLength) {
		editor.setSelectedRange(iStart, iStart + iLength); // 1W
		return true;
	},
	getClipboard: function () {
		return app.getClipboard(); // 1W
	},
	setClipboard: function (strText) {
		app.setClipboard(strText); // 1w
		return true;
	}
}

function overlap(lstA, lstB) {
	// NOT IF THIS ENDS BEFORE THAT STARTS,
	// OR STARTS AFTER THAT ENDS
	return !(lstA[1] < lstB[0] || lstA[0] > lstB[1]);
}

{

	var rgxGap = /(\n{2,})/,
		lstParts = drafts.getText().split(rgxGap),
		lstSeln = drafts.getSelectedLineRange(),
		iSelnStart = lstSeln[0],
		iSelnEnd = iSelnStart + lstSeln[1],
		lstBlocks = [],
		strBlock, strGap,
		iFrom = 0,
		iTo, lngBlock, lngGap;

	// Find first overlap with a selection edge	
	for (var i = 0, lng = lstParts.length; i < lng; i += 2) {
		strBlock = lstParts[i];
		strGap = lstParts[i + 1] || '';
		lngBlock = strBlock.length;
		lngGap = strGap.length;
		iTo = iFrom + lngBlock;
		if (overlap([iSelnStart, iSelnEnd], [iFrom, iTo]))
			lstBlocks.push({
				txt: strBlock,
				start: iFrom,
				end: iFrom + lngBlock
			});
		iFrom = iTo + lngGap;
		if (iFrom > iSelnEnd) break;
	}

	// extend selection to just after last gap
	// and just before next gap
	// iSelnStart = lstBlocks[0].start;
	// drafts.setSelectedRange(iSelnStart, lstBlocks[lstBlocks.length - 1].end - iSelnStart);
	// return true;
	//return lstParts.toString();
}

drafts.setClipboard(drafts.getTextInRange(iSelnStart, lstBlocks[lstBlocks.length - 1].end - iSelnStart));

drafts.setTextInRange(iSelnStart, lstBlocks[lstBlocks.length - 1].end - iSelnStart, null);