raiseNumbersInEnclosedAlphanumerics.jsee
lowerNumbersInEnclosedAlphanumerics.jsee
Какъ извѣстно, кодировка ASCII и ряд послѣдующихъ кодировок (в частности, Unicode) устроены очень логично по отношению к латинским буквам алфавита английского языка: код каждой слѣдующей буквы на единицу больше кода предыдущей (напримѣръ, код «S» на единицу больше кода «R»), код каждой строчной буквы на 32 больше кода заглавной (напримѣръ, код «w» на 32 больше кода «W»).
Ужé по отношению к русским буквам это не всегда столь же логично работает (не повезло букве «Ё», не говоря уж про «Ѣ» и «Ѳ», а также про «І» и «Ѵ», про «Ѿ» и «Ѽ», и такъ далѣе).
Что же касается тѣхъ натуральных чисел в кружкáх, которыми я пользуюсь (с февраля 2021 года) для нумерации пунктов в списках (с недавних пор это происходит прежде всего в кратцах), то для них в Unicode отводится три интервала:
• во блоке «Enclosed Alphanumerics» послѣдовательно располагаются сѵмволы диапазона ①〜⑳,
• во блоке «Enclosed CJK Letters and Months» послѣдовательно располагаются сѵмволы диапазона ㉑〜㉟ и ㊱〜㊿, но вот между кодами сѵмволовъ «㉟» и «㊱» дистанция не единична.
Поэтому, если кому-нибудь вздумается получать код слѣдующаго кружкá прибавлением единицы, а код предшествующаго кружкá — вычитанием единицы, то тогда поневоле придётся прописывать два исключения на краях послѣдовательностей. Напримѣръ, та версия языка JavaScript, которая используется макросами текстового редактора EmEditor, позволяет достичь наращивания чисел в кружкáх на единицу вот таким кодом:
document.selection.Text = document.selection.Text.replace(
/[㊱-㊾]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
).replace(/㉟/g, '㊱').replace(
/[㉑-㉞]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
).replace(/⑳/g, '㉑').replace(
/[①-⑲]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
);
Уменьшение чисел в кружкáх на единицу, в свою очередь, может быть достигнуто вот как:
document.selection.Text = document.selection.Text.replace(
/[②-⑳]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
).replace(/㉑/g, '⑳').replace(
/[㉒-㉟]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
).replace(/㊱/g, '㉟').replace(
/[㊲-㊿]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
);
Кажется ясно видным, что такой подход вредит обозримости и оттого быстроте понимания смысла исходного кода.
Логичность же и обозримость этому коду могло бы придать использование функции strtr из языка PHP — в JavaScript нѣтъ готового аналога ея, но можно сочинить (на основе совѣтовъ @askplexbot) нѣкій аналогъ трёхаргументнаго варіанта ея:
var strtrAsInPHP = function(input, fromStr, toStr){
var result = '';
var i, nextChar, nextIndex;
for( i = 0; i < input.length; i++) {
nextChar = input.charAt(i);
nextIndex = fromStr.indexOf(nextChar);
if( nextIndex < 0 ){
result += nextChar;
} else result += toStr.charAt(nextIndex);
}
return result;
};
Основная часть кода, наращивающего на единицу числа в кружкáх, приобретает с использованием этой функции простой и краткий (пятистрочный) вид:
document.selection.Text = strtrAsInPHP(
document.selection.Text,
'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾',
'②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿'
);
Также и основная часть кода, убавляющего на единицу числа в кружкáх, приобретает с использованием функции strtr вид, сильно похожий на предыдущий:
document.selection.Text = strtrAsInPHP(
document.selection.Text,
'②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿',
'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾'
);
Полный код того и другого макроса прилагаю к сообщению для наглядности.
Скриптование в используемой мною версии EmEditor полагается на WSH, поэтому код strtr не пользуется ни стрѣлочными функциями, ни вызовом split('') и затѣмъ map(…) для обхода строки.
Ужé по отношению к русским буквам это не всегда столь же логично работает (не повезло букве «Ё», не говоря уж про «Ѣ» и «Ѳ», а также про «І» и «Ѵ», про «Ѿ» и «Ѽ», и такъ далѣе).
Что же касается тѣхъ натуральных чисел в кружкáх, которыми я пользуюсь (с февраля 2021 года) для нумерации пунктов в списках (с недавних пор это происходит прежде всего в кратцах), то для них в Unicode отводится три интервала:
• во блоке «Enclosed Alphanumerics» послѣдовательно располагаются сѵмволы диапазона ①〜⑳,
• во блоке «Enclosed CJK Letters and Months» послѣдовательно располагаются сѵмволы диапазона ㉑〜㉟ и ㊱〜㊿, но вот между кодами сѵмволовъ «㉟» и «㊱» дистанция не единична.
Поэтому, если кому-нибудь вздумается получать код слѣдующаго кружкá прибавлением единицы, а код предшествующаго кружкá — вычитанием единицы, то тогда поневоле придётся прописывать два исключения на краях послѣдовательностей. Напримѣръ, та версия языка JavaScript, которая используется макросами текстового редактора EmEditor, позволяет достичь наращивания чисел в кружкáх на единицу вот таким кодом:
document.selection.Text = document.selection.Text.replace(
/[㊱-㊾]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
).replace(/㉟/g, '㊱').replace(
/[㉑-㉞]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
).replace(/⑳/g, '㉑').replace(
/[①-⑲]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) + 1
);
}
);
Уменьшение чисел в кружкáх на единицу, в свою очередь, может быть достигнуто вот как:
document.selection.Text = document.selection.Text.replace(
/[②-⑳]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
).replace(/㉑/g, '⑳').replace(
/[㉒-㉟]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
).replace(/㊱/g, '㉟').replace(
/[㊲-㊿]/g, function(nextMatch){
return String.fromCharCode(
nextMatch.charCodeAt(0) - 1
);
}
);
Кажется ясно видным, что такой подход вредит обозримости и оттого быстроте понимания смысла исходного кода.
Логичность же и обозримость этому коду могло бы придать использование функции strtr из языка PHP — в JavaScript нѣтъ готового аналога ея, но можно сочинить (на основе совѣтовъ @askplexbot) нѣкій аналогъ трёхаргументнаго варіанта ея:
var strtrAsInPHP = function(input, fromStr, toStr){
var result = '';
var i, nextChar, nextIndex;
for( i = 0; i < input.length; i++) {
nextChar = input.charAt(i);
nextIndex = fromStr.indexOf(nextChar);
if( nextIndex < 0 ){
result += nextChar;
} else result += toStr.charAt(nextIndex);
}
return result;
};
Основная часть кода, наращивающего на единицу числа в кружкáх, приобретает с использованием этой функции простой и краткий (пятистрочный) вид:
document.selection.Text = strtrAsInPHP(
document.selection.Text,
'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾',
'②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿'
);
Также и основная часть кода, убавляющего на единицу числа в кружкáх, приобретает с использованием функции strtr вид, сильно похожий на предыдущий:
document.selection.Text = strtrAsInPHP(
document.selection.Text,
'②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿',
'①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾'
);
Полный код того и другого макроса прилагаю к сообщению для наглядности.
Скриптование в используемой мною версии EmEditor полагается на WSH, поэтому код strtr не пользуется ни стрѣлочными функциями, ни вызовом split('') и затѣмъ map(…) для обхода строки.