yuunkjm-base
日付書式
code:script.js
scrapbox.TimeStamp.addFormat('*] [[]YYYY-MM[-DD[]]')
scrapbox.TimeStamp.addFormat('*>] [[]YYYY-MM[-DD[]]')
scrapbox.TimeStamp.addFormat('YYYY-MM-DD')
/icons/hr.icon
見える文字数カウンター
/icons/hr.icon
ボタン
codeボタン
code:script.js
scrapbox.PopupMenu.addButton({
title: 'code',
onClick: text => \`${text}\`
})
/icons/hr.icon
マーカーボタン
code:script.js
scrapbox.PopupMenu.addButton({
title: 'マーカー',
onClick: text => [[${text}]]
})
/icons/hr.icon
選択範囲に引用符をつけるボタン
code:script.js
scrapbox.PopupMenu.addButton({
title: '引用',
onClick: text => text.split(/\n/).map(line => > ${line}).join('\n')
})
/icons/hr.icon
箇条書きナンバリングボタン
code:script.js
scrapbox.PopupMenu.addButton({
title: 'No.',
onClick: text => text.split(/\n/).map((line, index) => ${index+1}. ${line}).join('\n')
})
/icons/hr.icon
選択文字列をプロジェクト内で検索ポップアップボタン
code:script.js
// 選択された文字列をScrapboxプロジェクト内で検索する
scrapbox.PopupMenu.addButton({
title: '検索',
onClick: function (text) {
}
});
/icons/hr.icon
フォーマットボタン
1. 箇条書きの先頭を全てTabに置き換える
3. 文字化けを修正する (今回は での を での に直す)
4. 全角英数字を半角英数字に置き換える
5. 全角括弧を半角括弧に置き換える
6. 括弧で囲まれた前後が空白でなければ空白を1つ入れる
7. コードブロック記法の前後が空白でなければ空白を1つ入れる
code:script.js
scrapbox.PopupMenu.addButton({
title: 'フォーマット',
onClick: text => text.split('\n').map(function(line) {
return line.replace(/^\s*/g, s => s.replace(/\s/g, '\t'))
.replace(/ぁ-ん|ァ-ヴ゙/g, s => String.fromCharCode(s.charCodeAt(0) + 1)) .replace(/A-Za-z0-9/g, s => String.fromCharCode(s.charCodeAt(0) - 0xFEE0)) .replace(/、/g, ',')
.replace(/。/g, '.')
.replace(/(/g, ' (')
.replace(/)/g, ') ')
.replace(///g, '/')
.replace(/\S\(/g, s => s.charAt(0) + ()
.replace(/\)\S/g, s => ') ' + s.charAt(1))
.replace(/\S.*/g, s => s.charAt(0) + ' ' + s.slice(1))
.replace(/.*\S/g, s => s.slice(0, -1) + ' ' + s.slice(-1))
.replace(' ', ' ')
.replace(' ', ' ')
.replace(' ', ' ')
}).join('\n')
})
/icons/hr.icon
ソートボタン
code:script.js
scrapbox.PopupMenu.addButton({
title: 'Sort',
onClick: text => {
const re = /^(\s*)/
const b = re.exec(text)1.length const lines = text.split(/\n/)
let sorting = [], chLines = []
for (var i = 0; i < lines.length; i++) {
if (0 < chLines.length) chLines.unshift('')
sorting.push(line + chLines.join('@n@'))
chLines = []
}
return sorting.sort().join('\n').replace(/@n@/g, '\n')
}
})
/icons/hr.icon
文字カウントポップアップボタン
code:script.jssssss
scrapbox.PopupMenu.addButton({
title: function (text) {
const chars = text.replace(/\r\n/g, '').length const words = text.trim().split(/\r\n\s+/).length return ${chars}c ${words}w
},
onClick: () => null
})
/icons/hr.icon
メニュー
/icons/hr.icon
トップに飛ぶメニュー
code:script.js
scrapbox.PageMenu.addMenu(
{title:"Top",
onClick:function(){location="./"}
})
/icons/hr.icon
Gyazoに飛ぶメニュー
code:script.jssss
scrapbox.PageMenu.addMenu(
{title:"Gyazo",
})
/icons/hr.icon
ピン止めされたページメニュー
code:script.js
const menuTitle = 'Pinned'
scrapbox.PageMenu.addMenu({
title: menuTitle,
onClick: () => {
scrapbox.PageMenu(menuTitle).removeAllItems()
scrapbox.PageMenu(menuTitle).addItem({
title: "top",
onClick: e => { e.currentTarget.setAttribute("href", "./") }
})
fetch(/api/pages/${scrapbox.Project.name}, { credentials: "include" })
.then(res => res.json())
.then(data => {
const pinnedPages = Array.from(data.pages).filter(page => 0 < page.pin)
pinnedPages.forEach(page => {
scrapbox.PageMenu(menuTitle).addItem({
title: page.title,
onClick: e => { e.currentTarget.setAttribute("href", ./${page.title}) }
})
})
})
}
})
/icons/hr.icon
栞ブックマークメニュー
code:script.js
const __bkmClass = '.deco-\\.' /* ここで記法のセレクタを設定してね。デフォルトはドットです */
const __bkmMenuTitle = 'Bookmarks'
scrapbox.PageMenu.addMenu({ title: __bkmMenuTitle, image: 'dummy.png',
onClick: function() {
const __fixedHeaderHeight = ($('.navbar').css('position') == 'fixed' ? $('.navbar').height() : 0) +
($('.navbar-pagemenu').height() || 0)
scrapbox.PageMenu(__bkmMenuTitle).removeAllItems()
$(__bkmClass).closest('.line').each(function(i, e){
scrapbox.PageMenu(__bkmMenuTitle).addItem({
title: $(e).find(__bkmClass).text(),
onClick: function() {
$('html,body').animate({
scrollTop: $(e).offset().top - $('body').offset().top - __fixedHeaderHeight
}, 150)
}
})
})
}
})