custom-new-page-2
/icons/hr.icon
切り出し元のページに残すテキストと、切り出し後に開くページに流し込むテキストを設定できる
複数のページに切り出すこともできる
設定方法を変更した
複数の設定を簡単に追加できるようにした
libraryのupdate
code:script.d.ts
export 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;
code:script.js
import {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のカスタム函数
code:script.js
function getLeavingText(texts) {
const link = texts0.replace(/[\\]/g, '').trim(); return ${texts[0].match(/^(\s*)/)[1]}[${link}];
}
function getNewPagesData(texts, _, {project, title}) {
const link = texts0.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');
return [{
project,
title: link,
body,
}];
}
インデントを削る函数
code:script.js
export function cutIndent(texts) {
const minIndentNum = Math.min(...texts.map(text => text.match(/^\s*/)0.length)); return texts.map(text => text.slice(minIndentNum));
}