generated at
Paste from Slack
Slackからコピーしたメッセージの正規表現パーサを利用して,Slackからコピペした文章をSlackの引用記法でページに転写します.

対応範囲
コピペするとどうしても混入する絵文字やリプライ数などの雑音に阻害されず,メッセージを抽出可能
大量のメッセージも一括で処理
共有機能や,引用部分の内側のコンテンツと外側のコンテンツを区別することはできず,単調な記述になる
写真やファイルなども反映されない

利用方法
このページの一番下のスクリプトを読み込むと,slackロゴマークのボタンが設置される
注意点
コピーするとき,ユーザーのアイコン画像まで含むように選択してください


サンプル

今回作成したツールの出力

Yuki 13:27
>#for-debug に参加しました。
Yuki 13:27
>bold italic strike link
>ordered list
>unordered list
>quote
>inline code
>snippet
Yuki 13:27
>share
>
>
>Yuki
>bold italic strike link
>ordered list
>unordered list
>quote
>inline code
>もっと表示する
>for-debug への投稿 | 昨日の13:27 | メッセージを確認する

出力ここまで

そのままの場合
>
> Yuki
> 13:27
> #for-debug に参加しました。
> :スマイル:
> 1
>
>
>
> Yuki
> 13:27
> bold italic strike link
> ordered list
> unordered list
> quote
> inline code
> snippet
> :両目:
> 1
>
>
>
>
>
>
>
>
> Yuki
> 13:27
> share
>
>
> Yuki
> bold italic strike link
> ordered list
> unordered list
> quote
> inline code
> もっと表示する
> for-debug への投稿 | 昨日の13:27 | メッセージを確認する
>
> 3 件の返信
> 最終返信: 12時間前スレッドを表示する



script.js
import {channel, thread} from "https://scrapbox.io/api/code/public-minaph/Slack%E3%81%8B%E3%82%89%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%83%91%E3%83%BC%E3%82%B5/pattern.js" scrapbox.PageMenu.addMenu({ title: 'slack', image: 'https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQDMNu9796JQ4P17Z3ycHI44lqkc3XHs05AvHoCcNq8CDqVEH4SG2WX3eB0' }); scrapbox.PageMenu('slack').addItem({ title: 'from thread', onClick: () => { const data = prompt("thread からドラッグ&コピー").replaceAll("\r", ""); const encoded = encodeURIComponent(replacer(thread, data)); location.search += (location.search ? "&" : "?") + "body=" + encoded; } }); scrapbox.PageMenu("slack").addItem({ title: "from channel", onClick: () => { const data = prompt("channel からドラッグ&コピー").replaceAll("\r", ""); const encoded = encodeURIComponent(replacer(channel, data)); location.href += "?body=" + encoded; } }); function replacer(regex, str) { let m, result = ""; while ((m = regex.exec(str)) !== null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } let name = "", time = "", body = ""; // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { console.log(match); switch (groupIndex) { case 0: break; case 1: name = match || ""; break; case 2: time = match || ""; break; case 3: body = match || ""; break; default: break; } }); result += `${name}${name ? " " : ""}${time}\n>${body.split("\n").join("\n>")}\n`; } return result; }