custom-new-page-2
切り出し元のページに残すテキストと、切り出し後に開くページに流し込むテキストを設定できる
複数のページに切り出すこともできる
設定方法を変更した
複数の設定を簡単に追加できるようにした
libraryのupdate
script.d.tsexport function isolate(...options: {
judge: (lines: string[]) => boolean;
leftText: (lines: string[], options: {index: number; project: string; title: string;}) => string;
newPages: (lines: string[], options: {index: number; project: string; title: string;}) => {
project: string;
title: string;
body: string;
}[];
}[]): void;
script.jsimport {position} from '../scrapbox-cursor-position-6/script.js';
import {goLine, goHead} from '../scrapbox-motion-emulation/script.js';
import {
getLineNo,
getIndentLineCount,
} from '../scrapbox-access-nodes@0.1.0/script.js';
import {press} from '../scrapbox-keyboard-emulation-2/script.js';
import {insertText} from '../scrapbox-insert-text-2/script.js';
export async function isolate(settings) {
// 現在行番号を取得する
const cline = position().line;
const firstLineNo = getLineNo(cline);
const lastLineNo = firstLineNo + getIndentLineCount(cline);
// テキストを取得する
const lines = scrapbox.Page.lines.slice(firstLineNo, lastLineNo + 1)
.map(line => line.text);
// 使用する設定を決める
const {leftText, newPages} = settings
.find(({judge}) => judge(lines))
// default setting
?? {leftText: getLeavingText, newPages: getNewPagesData};
const option = {index: firstLineNo, project: scrapbox.Project.name, title: scrapbox.Page.title};
// 元のページの文字を置換する
goHead();
press('End', {shiftKey: true});
for(let i = firstLineNo; i < lastLineNo; i++) {
press('ArrowDown', {shiftKey: true});
press('End', {shiftKey: true}); // Endをおして折返し行を確実に全て選択する
}
// textを編集する前にデータを作っておく
const text = leftText(lines, option);
const pages = newPages(lines, option);
await insertText(text);
// 個別のpageに切り出す
for (const {project, title, body} of pages) {
window.open(`https://scrapbox.io/${project}/${encodeURIComponent(title)}?body=${encodeURIComponent(body)}`);
}
}
defaultのカスタム函数
script.jsfunction getLeavingText(texts) {
const link = texts[0].replace(/[\[\]]/g, '').trim();
return `${texts[0].match(/^(\s*)/)[1]}[${link}]`;
}
function getNewPagesData(texts, _, {project, title}) {
const link = texts[0].replace(/[\[\]]/g, ''). trim();
const minIndentNum = Math.min(...texts.map(text => text.match(/^\s*/)[0].length));
const body = [`from [${title}]`,
...texts.map(text => text.slice(
minIndentNum > 1 ? minIndentNum - 1 : minIndentNum
)),
].join('\n');
console.log([project, link, body]);
return [{
project,
title: link,
body,
}];
}
インデントを削る函数
script.jsexport function cutIndent(texts) {
const minIndentNum = Math.min(...texts.map(text => text.match(/^\s*/)[0].length));
return texts.map(text => text.slice(minIndentNum));
}