micromark-extension-cjk-friendly-util
Version:
common library for micromark-extension-cjk-friendly and its related packages
119 lines (115 loc) • 10.5 kB
JavaScript
// src/classifyCharacter.ts
import { markdownLineEndingOrSpace } from "micromark-util-character";
import { constants as constants2, codes } from "micromark-util-symbol";
// src/categoryUtil.ts
import { constants } from "micromark-util-symbol";
function isUnicodeWhitespace(category) {
return Boolean(category & constants.characterGroupWhitespace);
}
function isNonEmojiGeneralUseVS(category) {
return category === constantsEx.nonEmojiGeneralUseVS;
}
// src/characterWithNonBmp.ts
import { eastAsianWidthType } from "get-east-asian-width";
var isEmoji = function(uc) {
if (this.fn !== null) {
return this.fn(uc);
}
try {
const regex = new RegExp("^\\p{RGI_Emoji}", "v");
this.fn = (uc_) => regex.test(String.fromCodePoint(uc_));
} catch (e) {
if (!(e instanceof SyntaxError)) {
throw e;
}
this.fn = (cp) => 8986 <= cp && cp <= 8987 || 9193 <= cp && cp <= 9196 || cp === 9200 || cp === 9203 || 9725 <= cp && cp <= 9726 || 9748 <= cp && cp <= 9749 || 9800 <= cp && cp <= 9811 || cp === 9855 || cp === 9875 || cp === 9889 || 9898 <= cp && cp <= 9899 || 9917 <= cp && cp <= 9918 || 9924 <= cp && cp <= 9925 || cp === 9934 || cp === 9940 || cp === 9962 || 9970 <= cp && cp <= 9971 || cp === 9973 || cp === 9978 || cp === 9981 || cp === 9989 || 9994 <= cp && cp <= 9995 || cp === 10024 || cp === 10060 || cp === 10062 || 10067 <= cp && cp <= 10069 || cp === 10071 || 10133 <= cp && cp <= 10135 || cp === 10160 || cp === 10175 || 11035 <= cp && cp <= 11036 || cp === 11088 || cp === 11093 || cp === 126980 || cp === 127183 || cp === 127374 || 127377 <= cp && cp <= 127386 || cp === 127489 || cp === 127514 || cp === 127535 || 127538 <= cp && cp <= 127542 || 127544 <= cp && cp <= 127546 || 127568 <= cp && cp <= 127569 || 127744 <= cp && cp <= 127756 || 127757 <= cp && cp <= 127758 || cp === 127759 || cp === 127760 || cp === 127761 || cp === 127762 || 127763 <= cp && cp <= 127765 || 127766 <= cp && cp <= 127768 || cp === 127769 || cp === 127770 || cp === 127771 || cp === 127772 || 127773 <= cp && cp <= 127774 || 127775 <= cp && cp <= 127776 || 127789 <= cp && cp <= 127791 || 127792 <= cp && cp <= 127793 || 127794 <= cp && cp <= 127795 || 127796 <= cp && cp <= 127797 || 127799 <= cp && cp <= 127818 || cp === 127819 || 127820 <= cp && cp <= 127823 || cp === 127824 || 127825 <= cp && cp <= 127867 || cp === 127868 || 127870 <= cp && cp <= 127871 || 127872 <= cp && cp <= 127891 || 127904 <= cp && cp <= 127940 || cp === 127941 || cp === 127942 || cp === 127943 || cp === 127944 || cp === 127945 || cp === 127946 || 127951 <= cp && cp <= 127955 || 127968 <= cp && cp <= 127971 || cp === 127972 || 127973 <= cp && cp <= 127984 || cp === 127988 || 127992 <= cp && cp <= 128007 || cp === 128008 || 128009 <= cp && cp <= 128011 || 128012 <= cp && cp <= 128014 || 128015 <= cp && cp <= 128016 || 128017 <= cp && cp <= 128018 || cp === 128019 || cp === 128020 || cp === 128021 || cp === 128022 || 128023 <= cp && cp <= 128041 || cp === 128042 || 128043 <= cp && cp <= 128062 || cp === 128064 || 128066 <= cp && cp <= 128100 || cp === 128101 || 128102 <= cp && cp <= 128107 || 128108 <= cp && cp <= 128109 || 128110 <= cp && cp <= 128172 || cp === 128173 || 128174 <= cp && cp <= 128181 || 128182 <= cp && cp <= 128183 || 128184 <= cp && cp <= 128235 || 128236 <= cp && cp <= 128237 || cp === 128238 || cp === 128239 || 128240 <= cp && cp <= 128244 || cp === 128245 || 128246 <= cp && cp <= 128247 || cp === 128248 || 128249 <= cp && cp <= 128252 || 128255 <= cp && cp <= 128258 || cp === 128259 || 128260 <= cp && cp <= 128263 || cp === 128264 || cp === 128265 || 128266 <= cp && cp <= 128276 || cp === 128277 || 128278 <= cp && cp <= 128299 || 128300 <= cp && cp <= 128301 || 128302 <= cp && cp <= 128317 || 128331 <= cp && cp <= 128334 || 128336 <= cp && cp <= 128347 || 128348 <= cp && cp <= 128359 || cp === 128378 || 128405 <= cp && cp <= 128406 || cp === 128420 || 128507 <= cp && cp <= 128511 || cp === 128512 || 128513 <= cp && cp <= 128518 || 128519 <= cp && cp <= 128520 || 128521 <= cp && cp <= 128525 || cp === 128526 || cp === 128527 || cp === 128528 || cp === 128529 || 128530 <= cp && cp <= 128532 || cp === 128533 || cp === 128534 || cp === 128535 || cp === 128536 || cp === 128537 || cp === 128538 || cp === 128539 || 128540 <= cp && cp <= 128542 || cp === 128543 || 128544 <= cp && cp <= 128549 || 128550 <= cp && cp <= 128551 || 128552 <= cp && cp <= 128555 || cp === 128556 || cp === 128557 || 128558 <= cp && cp <= 128559 || 128560 <= cp && cp <= 128563 || cp === 128564 || cp === 128565 || cp === 128566 || 128567 <= cp && cp <= 128576 || 128577 <= cp && cp <= 128580 || 128581 <= cp && cp <= 128591 || cp === 128640 || 128641 <= cp && cp <= 128642 || 128643 <= cp && cp <= 128645 || cp === 128646 || cp === 128647 || cp === 128648 || cp === 128649 || 128650 <= cp && cp <= 128651 || cp === 128652 || cp === 128653 || cp === 128654 || cp === 128655 || cp === 128656 || 128657 <= cp && cp <= 128659 || cp === 128660 || cp === 128661 || cp === 128662 || cp === 128663 || cp === 128664 || 128665 <= cp && cp <= 128666 || 128667 <= cp && cp <= 128673 || cp === 128674 || cp === 128675 || 128676 <= cp && cp <= 128677 || cp === 128678 || 128679 <= cp && cp <= 128685 || 128686 <= cp && cp <= 128689 || cp === 128690 || 128691 <= cp && cp <= 128693 || cp === 128694 || 128695 <= cp && cp <= 128696 || 128697 <= cp && cp <= 128702 || cp === 128703 || cp === 128704 || 128705 <= cp && cp <= 128709 || cp === 128716 || cp === 128720 || 128721 <= cp && cp <= 128722 || cp === 128725 || 128726 <= cp && cp <= 128727 || cp === 128732 || 128733 <= cp && cp <= 128735 || 128747 <= cp && cp <= 128748 || 128756 <= cp && cp <= 128758 || 128759 <= cp && cp <= 128760 || cp === 128761 || cp === 128762 || 128763 <= cp && cp <= 128764 || 128992 <= cp && cp <= 129003 || cp === 129008 || cp === 129292 || 129293 <= cp && cp <= 129295 || 129296 <= cp && cp <= 129304 || 129305 <= cp && cp <= 129310 || cp === 129311 || 129312 <= cp && cp <= 129319 || 129320 <= cp && cp <= 129327 || cp === 129328 || 129329 <= cp && cp <= 129330 || 129331 <= cp && cp <= 129338 || 129340 <= cp && cp <= 129342 || cp === 129343 || 129344 <= cp && cp <= 129349 || 129351 <= cp && cp <= 129355 || cp === 129356 || 129357 <= cp && cp <= 129359 || 129360 <= cp && cp <= 129374 || 129375 <= cp && cp <= 129387 || 129388 <= cp && cp <= 129392 || cp === 129393 || cp === 129394 || 129395 <= cp && cp <= 129398 || 129399 <= cp && cp <= 129400 || cp === 129401 || cp === 129402 || cp === 129403 || 129404 <= cp && cp <= 129407 || 129408 <= cp && cp <= 129412 || 129413 <= cp && cp <= 129425 || 129426 <= cp && cp <= 129431 || 129432 <= cp && cp <= 129442 || 129443 <= cp && cp <= 129444 || 129445 <= cp && cp <= 129450 || 129451 <= cp && cp <= 129453 || 129454 <= cp && cp <= 129455 || 129456 <= cp && cp <= 129465 || 129466 <= cp && cp <= 129471 || cp === 129472 || 129473 <= cp && cp <= 129474 || 129475 <= cp && cp <= 129482 || cp === 129483 || cp === 129484 || 129485 <= cp && cp <= 129487 || 129488 <= cp && cp <= 129510 || 129511 <= cp && cp <= 129535 || 129648 <= cp && cp <= 129651 || cp === 129652 || 129653 <= cp && cp <= 129655 || 129656 <= cp && cp <= 129658 || 129659 <= cp && cp <= 129660 || 129664 <= cp && cp <= 129666 || 129667 <= cp && cp <= 129670 || 129671 <= cp && cp <= 129672 || cp === 129673 || cp === 129679 || 129680 <= cp && cp <= 129685 || 129686 <= cp && cp <= 129704 || 129705 <= cp && cp <= 129708 || 129709 <= cp && cp <= 129711 || 129712 <= cp && cp <= 129718 || 129719 <= cp && cp <= 129722 || 129723 <= cp && cp <= 129725 || cp === 129726 || cp === 129727 || 129728 <= cp && cp <= 129730 || 129731 <= cp && cp <= 129733 || cp === 129734 || 129742 <= cp && cp <= 129743 || 129744 <= cp && cp <= 129750 || 129751 <= cp && cp <= 129753 || 129754 <= cp && cp <= 129755 || cp === 129756 || cp === 129759 || 129760 <= cp && cp <= 129767 || cp === 129768 || cp === 129769 || 129776 <= cp && cp <= 129782 || 129783 <= cp && cp <= 129784;
}
return this.fn(uc);
}.bind({
fn: null
});
function cjkOrIvs(uc) {
if (!uc || uc < 4352) {
return false;
}
const eaw = eastAsianWidthType(uc);
switch (eaw) {
case "fullwidth":
case "halfwidth":
return true;
// never be emoji
case "wide":
return !isEmoji(uc);
case "narrow":
return false;
case "ambiguous":
return 917760 <= uc && uc <= 917999 ? null : false;
case "neutral":
return /^\p{sc=Hangul}/u.test(String.fromCodePoint(uc));
}
}
function isCjkAmbiguousPunctuation(main, vs) {
if (vs !== 65025 || !main || main < 8216) return false;
return main === 8216 || main === 8217 || main === 8220 || main === 8221;
}
function nonEmojiGeneralUseVS(code) {
return code !== null && code >= 65024 && code <= 65038;
}
var unicodePunctuation = regexCheck(/\p{P}|\p{S}/u);
var unicodeWhitespace = regexCheck(/\s/);
function regexCheck(regex) {
return check;
function check(code) {
return code !== null && code > -1 && regex.test(String.fromCodePoint(code));
}
}
// src/classifyCharacter.ts
var constantsEx;
((constantsEx2) => {
constantsEx2.spaceOrPunctuation = 3;
constantsEx2.cjk = 4096;
constantsEx2.cjkPunctuation = 4098;
constantsEx2.ivs = 8192;
constantsEx2.cjkOrIvs = 12288;
constantsEx2.nonEmojiGeneralUseVS = 16384;
constantsEx2.variationSelector = 24576;
constantsEx2.ivsToCjkRightShift = 1;
})(constantsEx || (constantsEx = {}));
function classifyCharacter(code) {
if (code === codes.eof || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {
return constants2.characterGroupWhitespace;
}
let value = 0;
if (code >= 4352) {
if (nonEmojiGeneralUseVS(code)) {
return constantsEx.nonEmojiGeneralUseVS;
}
switch (cjkOrIvs(code)) {
case null:
return constantsEx.ivs;
case true:
value |= constantsEx.cjk;
break;
}
}
if (unicodePunctuation(code)) {
value |= constants2.characterGroupPunctuation;
}
return value;
}
function classifyPrecedingCharacter(before, get2Previous, previous) {
if (!isNonEmojiGeneralUseVS(before)) {
return before;
}
const twoPrevious = get2Previous();
const twoBefore = classifyCharacter(twoPrevious);
return !twoPrevious || isUnicodeWhitespace(twoBefore) ? before : isCjkAmbiguousPunctuation(twoPrevious, previous) ? constantsEx.cjkPunctuation : stripIvs(twoBefore);
}
function stripIvs(twoBefore) {
return twoBefore & ~constantsEx.ivs;
}
export {
classifyCharacter,
classifyPrecedingCharacter,
constantsEx
};