vb
Віталій Бондар
Профіль
Мене звати Віталій Бондар. Я редактор, диктор, продюсер подкастів, родом з України /
My name is Vitali Bondar. I am an editor, voiceover artist, and podcast producer. I am from Ukraine 💙💛
Про цей сайт / About this site → About Чим займаюся зараз / What I'm working on now → Now Чим займався раніше / What I worked on before → Then Контакти та посилання / Contacts and links:
/icons/mail.icon vit<at>duck.com
https://gyazo.com/873860a9d242725261409c30dba85465
Віталій Бондар (Vitali Bondar) ↑
⇄ Не персональні налаштування стилів (CSS) Settings exit Edit mode by pressing Esc
move focus to the Search field by pressing Cmd+k
create new page by pressing Cmd+Shift+k
move focus to editor by pressing Tab vb.icon
code:import.js
import '/api/code/vk-main/VK_Settings/script.js'
? ↑Імпорт чомусь не працює
/vk-scrapbox/VK.icon «Я понял, почему не работало. Мне надо переименовать скрипт, чтобы он подгружался через импорт. Удалил пока строку с импортом со страницы» ⇐ /vk-scrapbox/VK code: script_off.js
// press Cmd+\ to go to the Project root
// press Cmd+K to go to the Search (Bonus: press Enter in an empty Search field to go to the Project root)
// press Cmd+Shift+K to create new page
addEventListener('keydown', e => {
// Esc
if (e.key === 'Escape') {
$('.project-home').focus()
return
}
if (e.key === ('k' || 'л')) {
// Cmd+Shift+k
if (e.shiftKey && e.metaKey) {
$('.new-button')0.click() return
}
// Cmd+Key
if (e.metaKey) {
$('input.form-control').focus()
return
}
// plain k
return
}
if ((e.key === ('\\' || 's')) && e.metaKey) {
// Cmd+\
console.log('\\')
$('.project-home')0.click() return
}
return
})
Фрагмент скрипта, який додає фокус на поле редагування по натисненню i
code:script_off.js
//うまく動かないのでいったん保留
addEventListener('keydown', e => {
if(!$('#text-input').is(":focus") && !$('.search-form input').is(":focus")) {
//focus to editor to insert text
if(e.key === 'i') {
$('#text-input').focus();
e.preventDefault();
}
}
})
Фавікон
Своя «іконка» (favicon) для відображення у переглядачах тощо
code:script.js
$('head > linkrel=icon').attr('href','/api/pages/vtlbn/vb/icon'); Відключено
code:script-off.js
import '/api/code/scrasobox/WebからコピペしたらSB記法に変換する/script.js'
Закладки на сторінках
Додатковий спосіб навігації у великих нотатках
code:style.css
/* しおり記法 -- 栞箇所のマークやハイライトが不要な場合はこのブロックは消してね */
@media screen {
.app:not(.presentation) .line .deco-\. { background-color: #F5FAEA } .app:not(.presentation) .line .deco-\.::after {
position: absolute; top: 3px; left: -1.4em;
content: '\f02e'; font: 900 1.7rem/1 'Font Awesome 5 Free'; color: yellowgreen } }
@media screen and (max-width: 990px) {
.app:not(.presentation) .line .deco-\.::after { position: static; padding-left: .3em } }
/* 栞一覧を出すページメニューボタンのスタイル -- ここは必要 */
button#Bookmarks.tool-btn:hover { text-decoration: none }
button#Bookmarks.tool-btn::before {
position: absolute; content: '\f02e'; font: 400 20px/46px 'Font Awesome 5 Free' }
button#Bookmarks.tool-btn img { opacity: 0 }
code:script.js
const __bkmClass = '.deco-\\.' /* ここで記法のセレクタを設定してね。デフォルトはドットです */
const __bkmMenuTitle = 'Bookmarks'
scrapbox.PageMenu.addMenu({ title: __bkmMenuTitle, image: '/assets/img/logo.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)
}
})
})
}
})
Додаткові формати для вставки дати та часу
⌃ + T циклічно вставляє дату й час різного формату. Рядки 1 та 2 — для генерації посилання на сторінку з поточною датою в назві
code:script.js
scrapbox.TimeStamp.addFormat(']YYYY-MM-DD[ о HH:mm')
scrapbox.TimeStamp.addFormat(']YYYY-MM-DD[')
scrapbox.TimeStamp.addFormat('HH:mm')
code:script.js
scrapbox.PopupMenu.addButton({
title: '🇺🇦',
onClick: text => window.open(https://translate.google.com/#view=home&op=translate&sl=auto&tl=uk&text=${text})
})
code:script.js
scrapbox.PopupMenu.addButton({
title: '🏳️🌈',
onClick: text => window.open(https://www.deepl.com/translator#auto/ru/${text})
})
↑ Пункти до спливного меню з функцією перкладу тексту
«Вбудовування» твіту (вставлення тексту з посиланням після натиснення на shift + cmd + v
code:script.js
scrapbox.PopupMenu.addButton({
title : 'Embed Tweet',
onClick : text => {
const convertContent = (content, indent) => {
const replaced = content
.replace(/<a href="(https?:.*?)">(.*?)<\/a>/g, '$1 $2') .replace(/<br>/g, \n${indent});
const elem = document.createElement('div');
elem.innerHTML = replaced;
return indent + elem.innerText;
}
const tweetRegex = /(?<spaces>\t *)<blockquote\w"\-= *><p\w"\-= *>(?<content>.*)<\/p>—(?<author>.*)(?<link><a.*>)<\/blockquote>\n\t *<script.*?><\/script>/; const match = text.match(tweetRegex);
if(!match) return;
const {spaces, content, author, link} = match.groups;
const ind = ${spaces}>;
return text.replace(tweetRegex, convertContent(content, ind) + '\n' + convertContent(\t—${author} ${link}, ind));
}
})
Публікація з іншого проєкта (приймач)
code: script.js
import {runScrapboxPublishReceiver} from "/api/code/hata6502/scrapbox-publish-receiver/index.js";
runScrapboxPublishReceiver();
Спливне меню внизу
code:script.js
if (/Macintosh/.test(navigator.userAgent) && !/Porter/.test(navigator.userAgent)) {
setTimeout(() => {
const observer = new MutationObserver(records => {
for (const record of records) {
for (const node of record.addedNodes) {
if (node.getAttribute('class') !== 'selections') {
continue;
}
const popup = node.getElementsByClassName('popup-menu')0; if (!popup) return;
popup.style.top = (() => {
const selectionList = document.getElementsByClassName('selection');
let lowestSelection = selectionList0; const length = selectionList.length;
if (length !== 1) {
for (let i = 1; i < length; i++) {
if (parseInt(selectionListi-1.style.top) < parseInt(selectionListi.style.top)) { lowestSelection = selectionListi; }
}
}
return (parseInt(lowestSelection.style.top) + parseInt(lowestSelection.style.height) + popup.clientHeight + 25) + 'px';
})();
const triangleStyle = popup.getElementsByClassName('triangle')0.style; triangleStyle.borderTop = 'none';
triangleStyle.borderBottom = '6px solid #111'; triangleStyle.top = '-6px';
break;
}
}
});
observer.observe(document.getElementById('editor'), { childList: true });
}, 2000);
}
Модифікація спливного меню
code:style.css
/* ポップアップメニューの修飾ボタンをアイコン化 */
.popup-menu .button-container .button.strong-button > strong,
.popup-menu .button-container .button.italic-button > i,
.popup-menu .button-container .button.strike-button > strike {
display: inline-block; width: 0; text-indent: -9999px }
.popup-menu .button-container .button.link-button::after,
.popup-menu .button-container .button.strong-button::after,
.popup-menu .button-container .button.italic-button::after,
.popup-menu .button-container .button.strike-button::after {
font: 900 100%/normal 'Font Awesome 5 Free';
display: inline-block; min-width: 16px; text-align: center }
.popup-menu .button-container .button.strong-button::after { content: '\f032' }
.popup-menu .button-container .button.italic-button::after { content: '\f033' }
.popup-menu .button-container .button.strike-button::after { content: '\f0cc' }
/* ポップアップメニューのボタン周りの線を消す */
.selections .popup-menu .button-container .button:not(:first-of-type) { border: 0 }