Action Directory / Select Block

Install

Extend selection back to previous gap, and on to next (Drafts & FoldingText compatible)

Shared by @complexpoint

Script

// DRAFTS: functionS (for sharing scripts between FoldingText, iOS Drafts, and iOS 1Writer)
// getText()                               getSelectedLineRange()
// setText(string)                         getSelectedRange()
// getSelectedText()                       setSelectedRange(start, length)
// setSelectedText(string)                 getClipboard()
// getTextInRange(start, length)           setClipboard(string)
// setTextInRange(start, length, string)

// 1Writer versions of the: functions - include as header at the start of 1Writer 
// Javascript actions
// For the FoldingText versions of these: functions, see:

// (http://support.foldingtext.com/t/writing-scripts-which-run-on-both-foldingtext-and-ios-drafts-4/652/2)
// Ver 0.4 fixes
// Ver 0.3 prefixed functions with drafts eg drafts.getText(), to avoid namespace collisions where 1Writer 
// function names coincide
// Ver 0.2 (amended getSelectedLineRange: function () to iStart, iLength format)
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;
	}
};


// iOS FoldingText and 1Writer compatibility header for FT /

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]);
}

// DRAFTS COMPATIBLE CODE VER 2.0 simpler approach to selecting the block:
function selnExtendToBlock() {

	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();
}

selnExtendToBlock();