リアルタイム文字カウンター
from /shokai/status barに文字カウントを表示する(event版)
https://gyazo.com/b8ca5110ecba56937691296a3363c10d
status barに単語数と文字数、行数を常に表示するUserScript
status barのpage titleをfixedするUserCSSを併用のこと
code:script.js
(() => {
const counters = document.createElement('div');
counters.setAttribute('class', 'counters');
const counts = counters.appendChild(document.createElement('span'));
counts.setAttribute('class', 'item');
const statusBar = document.getElementsByClassName('status-bar')0;
if (cosense.Layout === 'page') {
statusBar.appendChild(counters);
}
cosense.on('layout:changed', () => {
if (cosense.Layout === 'page') {
statusBar.prepend(counters);
} else {
statusBar.removeChild(counters);
}
});
code:script.js.disabled
const updateCounts = () => {
if (!window.cosense.Page.lines) return;
const words = cosense.Page.lines
.map(line => line.text.split(/\s+/).filter(Boolean).length)
.reduce((a, b) => a + b);
const chars = cosense.Page.lines
.map(line => line.text.length)
.reduce((a, b) => a + b);
const lines = cosense.Page.lines.length;
counts.innerText = ${words} words, ${chars + lines - 1} chars, ${lines} lines;
};
code:script.js
const updateCounts = () => {
if (!window.cosense.Page.lines) return;
const words = cosense.Page.lines
.map(line => line.text.split(/\s+/).filter(Boolean).length)
.reduce((a, b) => a + b);
counts.innerText = ${words} words, ${cosense.Page.metadata.charsCount} chars, ${cosense.Page.metadata.linesCount} lines;
};
code:script.js
updateCounts();
cosense.on('lines:changed', updateCounts);
})();
変更点
modernに書き直した
どうもコピペでは動かなかったので
#2025-03-21 23:32:30 cosense.Page.metadataを使用するように変更
最近追加された(?)
これにより文字数に改行は含まれなっくなった
#2025-01-13 15:54:05 scrapbox.をcosense.に置換した
#2024-05-31 00:52:27
単語数のカウント方法を最適化した
filter(Boolean)で空文字を除去するようにした
文字数に改行を含むようにした