// ==UserScript==
// @name Transliterate to Inuktitut (with Bug Fixes)
// @namespace http://tampermonkey.net/
// @version 1.3
// @description Converts website text into Inuktitut syllabics, avoiding UI issues
// @author You
// @match *://*/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Elements to ignore (search bars, buttons, UI elements)
const ignoredTags = ["INPUT", "TEXTAREA", "BUTTON", "SELECT", "SCRIPT", "STYLE", "META"];
// English to Inuktitut syllabics substitutions
const letterSubstitutions = {
"ch": "ᑕᔭ", "sh": "ᓴ", "th": "ᓴ", "ng": "ᖕ", "wh": "Ꮩ", "w": "ᐍ",
"y": "ᔨ", "j": "ᔭ", "k": "ᒃ", "d": "ᑕ", "b": "ᐱ", "c": "ᑐ",
"f": "ᓴ", "p": "ᑉ", "g": "ᑕ", "q": "ᖯ", "z": "ᓯ"
};
// Latin to Inuktitut syllabic mapping (lowercase)
const translitMapLower = {
"a": "ᐊ", "b": "ᐱ", "c": "ᑐ", "d": "ᑕ", "e": "ᐁ", "f": "ᓴ",
"g": "ᑕ", "h": "ᐦ", "i": "ᐃ", "j": "ᔭ", "k": "ᒃ", "l": "ᓪ",
"m": "ᒻ", "n": "ᓐ", "o": "ᐅ", "p": "ᑉ", "q": "ᖯ", "r": "ᕆ",
"s": "ᓴ", "t": "ᑎ", "u": "ᐅ", "v": "ᐅ", "w": "ᐍ", "x": "ᕿ",
"y": "ᔨ", "z": "ᓯ"
};
// Latin to Inuktitut syllabic mapping (uppercase)
const translitMapUpper = {
"A": "ᐊ", "B": "ᐱ", "C": "ᑐ", "D": "ᑕ", "E": "ᐁ", "F": "ᓴ",
"G": "ᑕ", "H": "ᐦ", "I": "ᐃ", "J": "ᔭ", "K": "ᒃ", "L": "ᓪ",
"M": "ᒻ", "N": "ᓐ", "O": "ᐅ", "P": "ᑉ", "Q": "ᖯ", "R": "ᕆ",
"S": "ᓴ", "T": "ᑎ", "U": "ᐅ", "V": "ᐅ", "W": "ᐍ", "X": "ᕿ",
"Y": "ᔨ", "Z": "ᓯ"
};
function adjustEnglishLetters(word) {
for (const [key, value] of Object.entries(letterSubstitutions)) {
word = word.replace(new RegExp(key, "gi"), value);
}
return word;
}
function transliterateText(text) {
return text.replace(/\b[a-zA-Z]+\b/g, word => {
word = adjustEnglishLetters(word.toLowerCase()); // Adjust before mapping
let result = '';
for (let char of word) {
// Check for uppercase and apply the corresponding map
if (char === char.toUpperCase()) {
result += translitMapUpper[char] || translitMapLower[char.toLowerCase()] || char;
} else {
result += translitMapLower[char] || char;
}
}
return result;
});
}
function transliterateNode(node) {
if (node.nodeType === Node.TEXT_NODE && node.parentNode && !ignoredTags.includes(node.parentNode.tagName)) {
node.nodeValue = transliterateText(node.nodeValue);
} else if (node.nodeType === Node.ELEMENT_NODE) {
for (let child of node.childNodes) {
transliterateNode(child);
}
}
}
function observeDOMChanges() {
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => transliterateNode(node));
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
}
transliterateNode(document.body);
observeDOMChanges();
})();