Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
:don: - スラングにabbrつけるやつ
// ==UserScript==
// @name :don: - スラングにabbrつけるやつ
// @namespace https://github.com/unarist/
// @version 0.14
// @author unarist
// @match https://mstdn.maud.io/web/*
// @grant none
// @downloadURL https://gist.github.com/unarist/ce93c77eee6ff9bf51491ff06a3109d3/raw/mastodon-add-abbr.user.js
// ==/UserScript==
(function() {
'use strict';
if (!document.querySelector('.app-holder[data-react-class="Mastodon"], #mastodon')) return;
const patterns = [
[/[55]|例の七文字/g, 'ほたはろりこん'],
[/[33]/g, 'ほたはろり'],
[/CM3D2/g, 'カスタムメイド3D2'],
[/激30ド/g, '激カワ猫耳ダウナー系フリルふりふりツインテールあざと美少女メイド'],
[/末代/g, '/about/moreを参照。辞書的には死んだ後の世、末の世といった意味。'],
// https://mstdn.maud.io/about/more
[/:don:/g, 'mstdn.maud.io。深く考えずにEmojiっぽく :don: にしてたらみんなそれでいいというので続投した。謎。'],
[/:realtek:/gi, ''],
[/キラキラッター|kirakiratter|kkt/gi, 'アイカツ!に登場するSNS。をモチーフにしたMastodonインスタンス。ついにテーマ機能を実装した。'],
[/i18n/gi, 'Internationalization。国際化。そもそも日本語を扱えるようにとか日本語化できるようにとかそういう。'],
[/l10n/gi, 'Localization。地域化。地域に応じた表示言語とか通貨形式とか追加する感じ。']
];
const combined_regex = new RegExp('(' + patterns.map(pattern => pattern[0].source).join(')|(') + ')', 'gi');
const observe_root = document.querySelector('.columns-area');
const applyAbbr = node => {
for (const elem of document.querySelectorAll('.status__content p:only-child, .status__content p > span')) {
if (elem.querySelector('abbr') !== null) continue;
for (const node of elem.childNodes) {
if (node.nodeType !== Node.TEXT_NODE) continue;
let cur = node, match;
while ((match = combined_regex.exec(cur.textContent)) !== null) {
const pattern_idx = match.findIndex((e,i) => e && i) - 1;
const abbr_elem = Object.assign(document.createElement('abbr'), { title: patterns[pattern_idx][1], textContent: match[0] });
cur = cur.splitText(match.index);
cur.textContent = cur.textContent.slice(match[0].length);
cur.parentNode.insertBefore(abbr_elem, cur);
combined_regex.lastIndex = 0;
}
}
}
};
new MutationObserver(mutations => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (node.className && node.className.match(/^status|^notification|^column$/)) {
applyAbbr(node);
}
}
}
}).observe(observe_root, {childList: true, subtree: true});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment