ファイルの内容を昇順にソートして重複した行を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 },
});