ファイルの内容を昇順にソートして重複した行を1行にするTextwellのアクションを書いた。
いわゆる$ sort foobar | uniq
するアクションです。
https://gist.github.com/htakeuchi/fd9e36227ad1688b31e9b84eafbf17a9
const { text, range } = T;
const selectionStart = range.len > 0 ? range.loc : 0;
const selectionEnd = range.len > 0 ? selectionStart + range.len : text.length;
const lines = text.split('\n');
let pointerStart = 0;
let replacingRangeLoc = 0;
const hitLines = [];
for (const line of lines) {
const pointerEnd = pointerStart + line.length;
if (pointerStart > selectionEnd) break;
if (
(pointerStart <= selectionStart && selectionStart <= pointerEnd) ||
(pointerStart <= selectionEnd && selectionEnd <= pointerEnd) ||
(selectionStart < pointerStart && pointerEnd < selectionEnd)
) {
if (hitLines.length === 0) replacingRangeLoc = pointerStart;
hitLines.push(line);
}
pointerStart = pointerEnd + 1; // 1 means a line break.
}
const blankLines = [];
const numLines = [];
const strLines = [];
hitLines.forEach((content) => {
const intContent = parseInt(content);
if (!content.match(/\S/)) {
blankLines.push(content); // Ignore blank line
} else if (isNaN(intContent)) {
strLines.push(content);
} else {
numLines.push({ num: intContent, str: content });
}
});
numLines.sort((a, b) => a.num - b.num);
const sortedNumLines = numLines.map(({ str }) => str);
strLines.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
const sortedLines = [...blankLines, ...sortedNumLines, ...strLines];
// Remove duplicates
const uniqueLines = [...new Set(sortedLines)];
// Join lines into text
const replacingText = uniqueLines.join('\n');
T('replaceRange', {
text: replacingText,
replacingRange: { loc: replacingRangeLoc, len: selectionEnd - replacingRangeLoc },
selectingRange: { loc: replacingRangeLoc + replacingText.length, len: 0 },
});