Action Directory / Select Block
InstallExtend 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();